world-object-unification-project
Ivory 2023-01-06 12:14:13 -05:00
parent 393c11780b
commit 6912b4acef
29 changed files with 807 additions and 216 deletions

BIN
.mvn/wrapper/maven-wrapper.jar vendored 100644

Binary file not shown.

View File

@ -0,0 +1,18 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar

19
idea.md
View File

@ -51,3 +51,22 @@ consequence is that without proper care a single
event could immediately open & close the panel in event could immediately open & close the panel in
the same frame. so, the event should be able to the same frame. so, the event should be able to
be captured and cease propogation. be captured and cease propogation.
# ready()
call order goes from top to bottom \/\/\/
ready is called before scene linkage, and
serves to initialize values that may be
needed before incoming requests.
# connect()
connect is solely for ensuring links to
other objects. get() and getAll()
# create()
create is guaranteed to only run once for
an object, even after save/load
# start()
start is called any time the object is added
to a scene

287
mvnw vendored 100755
View File

@ -0,0 +1,287 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.1.1
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`\\unset -f command; \\command -v java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
printf '%s' "$(cd "$basedir"; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname $0)")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $wrapperUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
QUIET="--quiet"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
QUIET=""
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath"
fi
[ $? -eq 0 ] || rm -f "$wrapperJarPath"
elif command -v curl > /dev/null; then
QUIET="--silent"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
QUIET=""
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L
fi
[ $? -eq 0 ] || rm -f "$wrapperJarPath"
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=`cygpath --path --windows "$javaSource"`
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

187
mvnw.cmd vendored 100644
View File

@ -0,0 +1,187 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.1.1
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%

View File

@ -6,7 +6,7 @@
<groupId>xyz.valnet.hadean</groupId> <groupId>xyz.valnet.hadean</groupId>
<artifactId>hadean</artifactId> <artifactId>hadean</artifactId>
<version>1.0-SNAPSHOT</version> <version>0.1-SNAPSHOT</version>
<name>hadean</name> <name>hadean</name>
<!-- FIXME change it to the project's website --> <!-- FIXME change it to the project's website -->

View File

@ -20,4 +20,8 @@ public class Vector4i implements Serializable {
this.w = w; this.w = w;
} }
public Vector2i xy() {
return new Vector2i(x, y);
}
} }

View File

@ -36,7 +36,7 @@ public class Job extends GameObject {
@Override @Override
public Vector2i[] getLocations() { public Vector2i[] getLocations() {
return new Vector2i[] { item.getWorldPosition().asInt() }; return new Vector2i[] { item.getWorldPosition().xy() };
} }
@Override @Override
@ -78,7 +78,7 @@ public class Job extends GameObject {
Set<Vector2i> positionSet = new HashSet<Vector2i>(); Set<Vector2i> positionSet = new HashSet<Vector2i>();
for(Item item : that.getAll(Item.class)) { for(Item item : that.getAll(Item.class)) {
if(!item.matches(predicate)) continue; if(!item.matches(predicate)) continue;
positionSet.add(item.getWorldPosition().asInt()); positionSet.add(item.getWorldPosition().xy());
} }
Vector2i[] positions = new Vector2i[positionSet.size()]; Vector2i[] positions = new Vector2i[positionSet.size()];
positionSet.toArray(positions); positionSet.toArray(positions);

View File

@ -9,7 +9,7 @@ import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.hadean.gameobjects.worldobjects.pawn.Pawn; import xyz.valnet.hadean.gameobjects.worldobjects.pawn.Pawn;
import xyz.valnet.hadean.interfaces.IWorkable; import xyz.valnet.hadean.interfaces.IWorkable;
@ -59,7 +59,7 @@ public class JobBoard extends GameObject {
} }
private List<Job> getJobsForWorker(Pawn worker) { private List<Job> getJobsForWorker(Pawn worker) {
Vector2f workerLocation = worker.getWorldPosition(); Vector2i workerLocation = worker.getWorldPosition().xy();
List<Job> workables = availableJobs List<Job> workables = availableJobs
.stream() .stream()

View File

@ -3,9 +3,9 @@ package xyz.valnet.hadean.gameobjects;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import xyz.valnet.engine.math.Vector2f;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.hadean.gameobjects.worldobjects.FarmPlot; import xyz.valnet.hadean.gameobjects.worldobjects.FarmPlot;
import xyz.valnet.hadean.gameobjects.worldobjects.Tree; import xyz.valnet.hadean.gameobjects.worldobjects.Tree;
@ -35,40 +35,37 @@ public class Tile extends WorldObject implements IWorkable {
private List<ITileThing> toRemove = new ArrayList<ITileThing>(); private List<ITileThing> toRemove = new ArrayList<ITileThing>();
public Tile(int x, int y) { public Tile(int x, int y) {
this.x = x; setPosition(x, y);
this.y = y;
} }
public Vector2i getCoords() { public Vector2i getCoords() {
return new Vector2f(x, y).asInt(); return getWorldPosition().xy();
} }
public void start() { public void start() {
super.start(); super.start();
Vector4i pos = getWorldPosition();
float scale = 1; float scale = 1;
float red = (float) terrain.getNoise(redSeed, x * scale, y * scale); float red = (float) terrain.getNoise(redSeed, pos.x * scale, pos.y * scale);
float green = (float) terrain.getNoise(greenSeed, x * scale, y * scale); float green = (float) terrain.getNoise(greenSeed, pos.x * scale, pos.y * scale);
float blue = (float) terrain.getNoise(blueSeed, x * scale, y * scale); float blue = (float) terrain.getNoise(blueSeed, pos.x * scale, pos.y * scale);
if(color == null) color = new Vector4f(red * 0.1f, 0.4f + green * 0.15f, blue * 0.05f, 1f); if(color == null) color = new Vector4f(red * 0.1f, 0.4f + green * 0.15f, blue * 0.05f, 1f);
} }
@Override @Override
protected void create() { protected void create() {
Vector4i pos = getWorldPosition();
if(Math.random() > 0.95) { if(Math.random() > 0.95) {
rocks = true; rocks = true;
} }
if(Math.random() > 0.97) { if(Math.random() > 0.97) {
Tree tree = new Tree((int)x, (int)y); add(new Tree(pos.x, pos.y));
stuff.add(tree);
add(tree);
} else if(Math.random() > 0.98) { } else if(Math.random() > 0.98) {
rocks = false; rocks = false;
Boulder tree = new Boulder((int)x, (int)y); add(new Boulder(pos.x, pos.y));
stuff.add(tree);
add(tree);
} }
} }
@ -130,15 +127,16 @@ public class Tile extends WorldObject implements IWorkable {
@Override @Override
public void render() { public void render() {
Vector4i pos = getWorldPosition();
if(tillLevel < 1f) { if(tillLevel < 1f) {
Assets.flat.pushColor(color); Assets.flat.pushColor(color);
camera.draw(Layers.TILES, Assets.defaultTerrain[tileSelector], x, y); camera.draw(Layers.TILES, Assets.defaultTerrain[tileSelector], pos.x, pos.y);
Assets.flat.popColor(); Assets.flat.popColor();
if(rocks) camera.draw(Layers.TILES, Assets.rocks, x, y); if(rocks) camera.draw(Layers.TILES, Assets.rocks, pos.x, pos.y);
} }
if(tillLevel > 0f) { if(tillLevel > 0f) {
Assets.flat.pushColor(Vector4f.opacity(tillLevel)); Assets.flat.pushColor(Vector4f.opacity(tillLevel));
camera.draw(Layers.TILES, Assets.farmPlot[tileSelector], x, y); camera.draw(Layers.TILES, Assets.farmPlot[tileSelector], pos.x, pos.y);
Assets.flat.popColor(); Assets.flat.popColor();
} }
} }
@ -154,16 +152,17 @@ public class Tile extends WorldObject implements IWorkable {
@Override @Override
public Vector2i[] getWorkablePositions() { public Vector2i[] getWorkablePositions() {
Vector4i pos = getWorldPosition();
return new Vector2i[] { return new Vector2i[] {
new Vector2i((int)x - 1, (int)y - 1), new Vector2i(pos.x - 1, pos.y - 1),
new Vector2i((int)x, (int)y - 1), new Vector2i(pos.x, pos.y - 1),
new Vector2i((int)x + 1, (int)y - 1), new Vector2i(pos.x + 1, pos.y - 1),
new Vector2i((int)x - 1, (int)y + 0), new Vector2i(pos.x - 1, pos.y + 0),
new Vector2i((int)x, (int)y + 0), new Vector2i(pos.x, pos.y + 0),
new Vector2i((int)x + 1, (int)y + 0), new Vector2i(pos.x + 1, pos.y + 0),
new Vector2i((int)x - 1, (int)y + 1), new Vector2i(pos.x - 1, pos.y + 1),
new Vector2i((int)x, (int)y + 1), new Vector2i(pos.x, pos.y + 1),
new Vector2i((int)x + 1, (int)y + 1), new Vector2i(pos.x + 1, pos.y + 1),
}; };
} }
@ -188,11 +187,6 @@ public class Tile extends WorldObject implements IWorkable {
} else return "Tilled Soil"; } else return "Tilled Soil";
} }
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x+1, y+1);
}
public String toThingsString() { public String toThingsString() {
if(stuff.size() == 0) return " - Nothing"; if(stuff.size() == 0) return " - Nothing";
String str = ""; String str = "";

View File

@ -7,6 +7,7 @@ import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
import xyz.valnet.engine.scenegraph.ITransient; import xyz.valnet.engine.scenegraph.ITransient;
import xyz.valnet.hadean.gameobjects.Camera; import xyz.valnet.hadean.gameobjects.Camera;
import xyz.valnet.hadean.interfaces.BuildableMetadata;
import xyz.valnet.hadean.interfaces.IBuildLayerListener; import xyz.valnet.hadean.interfaces.IBuildLayerListener;
import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.Layers;
@ -20,6 +21,12 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi
private IBuildLayerListener listener = null; private IBuildLayerListener listener = null;
private BuildableMetadata.Type type = BuildableMetadata.Type.AREA;
public void setBuildType(BuildableMetadata.Type type) {
this.type = type;
}
@Override @Override
protected void connect() { protected void connect() {
camera = get(Camera.class); camera = get(Camera.class);
@ -28,6 +35,8 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi
@Override @Override
public void update(float dTime) { public void update(float dTime) {
if(listener == null) return; if(listener == null) return;
if(type == BuildableMetadata.Type.SINGLE && mouseDown) return;
broadcastWorldCoords(); broadcastWorldCoords();
} }
@ -77,18 +86,23 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi
if(button == 1 && active && hovered) { if(button == 1 && active && hovered) {
listener.cancel(); listener.cancel();
} else if(button == 0 && active && hovered) { } else if(button == 0 && active && hovered) {
// TODO this conversion in negative numbers definitely works wrong.
Vector2i worldcoords = camera.screen2world(App.mouseX, App.mouseY).asInt(); Vector2i worldcoords = camera.screen2world(App.mouseX, App.mouseY).asInt();
mouseDown = true; mouseDown = true;
x = worldcoords.x; x = worldcoords.x;
y = worldcoords.y; y = worldcoords.y;
if(type == BuildableMetadata.Type.SINGLE) {
listener.build(x, y);
}
} }
} }
@Override @Override
public void mouseUp(int button) { public void mouseUp(int button) {
if(button == 0 && active && mouseDown) { if(button == 0 && active && mouseDown) {
Vector2i worldcoords = camera.screen2world(App.mouseX, App.mouseY).asInt();
mouseDown = false; mouseDown = false;
if(type == BuildableMetadata.Type.AREA) {
Vector2i worldcoords = camera.screen2world(App.mouseX, App.mouseY).asInt();
int x1 = x; int x1 = x;
int y1 = y; int y1 = y;
int x2 = worldcoords.x; int x2 = worldcoords.x;
@ -100,6 +114,7 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi
listener.build(minX, minY, maxX, maxY); listener.build(minX, minY, maxX, maxY);
} }
} }
}

View File

@ -57,7 +57,7 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
private record BuildableRecord( private record BuildableRecord(
String name, String name,
Constructor<? extends IBuildable> constructor, Constructor<? extends IBuildable> constructor,
int type BuildableMetadata.Type type
) { ) {
} }
@ -85,7 +85,7 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
} }
String category = annotation.category(); String category = annotation.category();
String name = annotation.name(); String name = annotation.name();
int type = annotation.type(); BuildableMetadata.Type type = annotation.type();
if(!buildables.containsKey(category)) if(!buildables.containsKey(category))
buildables.put(category, new ArrayList<BuildableRecord>()); buildables.put(category, new ArrayList<BuildableRecord>());
@ -163,6 +163,11 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
if(buildableRecord == null) deselectBuilding(); if(buildableRecord == null) deselectBuilding();
if (selectedBuildable == null) activateBuildLayer(); if (selectedBuildable == null) activateBuildLayer();
selectedBuildable = buildableRecord; selectedBuildable = buildableRecord;
swapBuildLayerType(selectedBuildable.type);
}
private void swapBuildLayerType(BuildableMetadata.Type type) {
buildLayer.setBuildType(type);
} }
private void activateBuildLayer() { private void activateBuildLayer() {
@ -191,6 +196,22 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
// opened.set(false); // opened.set(false);
} }
@Override
public void build(int x1, int y1) {
if(selectedBuildable == null) return;
try {
IBuildable building = selectedBuildable.constructor.newInstance();
if(building instanceof GameObject) {
add((GameObject) building);
}
building.buildAt(x1, y1);
} catch (Exception e) {
System.out.println(e);
}
// opened.set(false);
}
@Override @Override
public void cancel() { public void cancel() {
if(selectedBuildable == null) { if(selectedBuildable == null) {

View File

@ -4,10 +4,10 @@ import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.Job; import xyz.valnet.hadean.gameobjects.Job;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
import xyz.valnet.hadean.gameobjects.Tile;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Log; import xyz.valnet.hadean.gameobjects.worldobjects.items.Log;
import xyz.valnet.hadean.interfaces.BuildableMetadata; import xyz.valnet.hadean.interfaces.BuildableMetadata;
import xyz.valnet.hadean.interfaces.IBuildable;
import xyz.valnet.hadean.interfaces.IItemReceiver; import xyz.valnet.hadean.interfaces.IItemReceiver;
import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectable;
import xyz.valnet.hadean.interfaces.IWorkable; import xyz.valnet.hadean.interfaces.IWorkable;
@ -19,8 +19,8 @@ import xyz.valnet.hadean.util.detail.Detail;
import xyz.valnet.hadean.util.detail.ObjectDetail; import xyz.valnet.hadean.util.detail.ObjectDetail;
import xyz.valnet.hadean.util.detail.PercentDetail; import xyz.valnet.hadean.util.detail.PercentDetail;
@BuildableMetadata(category = "Furniture", name = "Bed", type = BuildableMetadata.SINGLE) @BuildableMetadata(category = "Furniture", name = "Bed", type = BuildableMetadata.Type.SINGLE)
public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWorkable, ISelectable { public class Bed extends Buildable implements IItemReceiver, IWorkable, ISelectable {
private int logs = 0; private int logs = 0;
private float work = 0; private float work = 0;
@ -28,11 +28,15 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork
private Job job = null; private Job job = null;
@Override
protected Vector2i getDefaultDimensions() {
return new Vector2i(1, 2);
}
@Override @Override
protected void create() { protected void create() {
super.create(); super.create();
job = add(new Job("Build Bed")); job = add(new Job("Build Bed"));
Log log = get(Log.class);
job.addStep(job.new PickupItemByPredicate(Log.LOG_PREDICATE)); job.addStep(job.new PickupItemByPredicate(Log.LOG_PREDICATE));
job.addStep(job.new DropoffPredicateAtItemReceiver(this, Log.LOG_PREDICATE)); job.addStep(job.new DropoffPredicateAtItemReceiver(this, Log.LOG_PREDICATE));
job.addStep(job.new Work(this)); job.addStep(job.new Work(this));
@ -42,15 +46,16 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork
@Override @Override
public void render() { public void render() {
super.render(); super.render();
Vector2i pos = getWorldPosition().xy();
if(isBuilt()) { if(isBuilt()) {
camera.draw(Layers.GROUND, Assets.bed, (int)x, (int)y, 1, 2); camera.draw(Layers.GROUND, Assets.bed, pos.x, pos.y, 1, 2);
} else { } else {
float p = work / maxWork; float p = work / maxWork;
float b = 4; float b = 4;
Assets.flat.pushColor(new Vector4f(b, b, b, 0.5f)); Assets.flat.pushColor(new Vector4f(b, b, b, 0.5f));
camera.draw(Layers.GROUND, Assets.bed, (int)x, (int)y, 1, 2); camera.draw(Layers.GROUND, Assets.bed, pos.x, pos.y, 1, 2);
Assets.flat.popColor(); Assets.flat.popColor();
if(logs > 0) { if(logs > 0) {
@ -61,24 +66,11 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork
} }
} }
@Override
public void buildAt(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = 1;
this.h = 2;
}
@Override @Override
public String getName() { public String getName() {
return "Bed"; return "Bed";
} }
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x+w, y+h);
}
@Override @Override
public boolean receive(Item item) { public boolean receive(Item item) {
if(item == null) return false; if(item == null) return false;
@ -99,16 +91,17 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork
} }
private Vector2i[] getBorders() { private Vector2i[] getBorders() {
Vector2i pos = getWorldPosition().xy();
return new Vector2i[] { return new Vector2i[] {
new Vector2i((int) x, (int) y - 1), new Vector2i(pos.x, pos.y - 1),
new Vector2i((int) x - 1, (int) y), new Vector2i(pos.x - 1, pos.y),
new Vector2i((int) x + 1, (int) y), new Vector2i(pos.x + 1, pos.y),
new Vector2i((int) x - 1, (int) y + 1), new Vector2i(pos.x - 1, pos.y + 1),
new Vector2i((int) x + 1, (int) y + 1), new Vector2i(pos.x + 1, pos.y + 1),
new Vector2i((int) x, (int) y + 2), new Vector2i(pos.x, pos.y + 2),
}; };
} }
@ -146,4 +139,18 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork
}; };
} }
@Override
public boolean isWalkable() {
return false;
}
@Override
public boolean shouldRemove() {
return false;
}
@Override
public void onRemove() {
}
} }

View File

@ -0,0 +1,27 @@
package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.hadean.gameobjects.Tile;
import xyz.valnet.hadean.interfaces.IBuildable;
import xyz.valnet.hadean.interfaces.ITileThing;
public abstract class Buildable extends WorldObject implements IBuildable, ITileThing {
protected Vector2i getDefaultDimensions() {
return new Vector2i(1, 1);
}
@Override
public void buildAt(int x, int y, int w, int h) {
setPosition(x, y, w, h);
}
@Override
public void buildAt(int x, int y) {
Vector2i dim = getDefaultDimensions();
setPosition(x, y, dim.x, dim.y);
}
@Override
public void onPlaced(Tile tile) {}
}

View File

@ -1,34 +1,27 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.gameobjects.Tile;
import xyz.valnet.hadean.interfaces.BuildableMetadata; import xyz.valnet.hadean.interfaces.BuildableMetadata;
import xyz.valnet.hadean.interfaces.IBuildable;
import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectable;
import xyz.valnet.hadean.interfaces.ITileThing;
import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Action;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.Layers;
import xyz.valnet.hadean.util.detail.Detail; import xyz.valnet.hadean.util.detail.Detail;
@BuildableMetadata(category = "Zones", name = "Farm Plot") @BuildableMetadata(category = "Zones", name = "Farm Plot")
public class FarmPlot extends WorldObject implements ISelectable, ITileThing, IBuildable { public class FarmPlot extends Buildable implements ISelectable {
private int w, h;
@Override @Override
public void renderAlpha() { public void renderAlpha() {
if(!visible) return; if(!visible) return;
Vector4i pos = getWorldPosition();
Assets.flat.pushColor(new Vector4f(0.4f, 1f, 0.3f, 0.2f)); Assets.flat.pushColor(new Vector4f(0.4f, 1f, 0.3f, 0.2f));
camera.draw(Layers.GROUND, Assets.whiteBox, x, y, w, h); camera.draw(Layers.GROUND, Assets.whiteBox, pos.x, pos.y, pos.z, pos.w);
Assets.flat.popColor(); Assets.flat.popColor();
} }
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x + w, y + h);
}
private static Action TOGGLE_VISIBILITY = new Action("Hide\n----\nShow"); private static Action TOGGLE_VISIBILITY = new Action("Hide\n----\nShow");
@Override @Override
@ -65,20 +58,6 @@ public class FarmPlot extends WorldObject implements ISelectable, ITileThing, IB
} }
@Override
public void buildAt(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
for(int i = x; i < x + w; i ++) {
for(int j = y; j < y + h; j ++) {
terrain.getTile(i, j).placeThing(this);
}
}
}
@Override @Override
public String getName() { public String getName() {
return "Farm Plot"; return "Farm Plot";

View File

@ -1,6 +1,7 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2f;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Action;
@ -12,16 +13,16 @@ public class Rice extends Item {
public Rice(int x, int y) { public Rice(int x, int y) {
this.x = x; setPosition(x, y);
this.y = y;
} }
@Override @Override
public void render() { public void render() {
camera.draw(Layers.AIR, Assets.riceBag, x, y); Vector2i pos = getWorldPosition().xy();
camera.draw(Layers.AIR, Assets.riceBag, pos.x, pos.y);
Assets.flat.pushColor(Vector4f.black); Assets.flat.pushColor(Vector4f.black);
Vector2f screeCoords = camera.world2screen(x, y); Vector2f screeCoords = camera.world2screen(pos.x, pos.y);
Assets.miniFont.drawString("123", (int)screeCoords.x, (int)screeCoords.y); Assets.miniFont.drawString("123", (int)screeCoords.x, (int)screeCoords.y);
Assets.flat.popColor(); Assets.flat.popColor();
} }
@ -39,11 +40,6 @@ public class Rice extends Item {
@Override @Override
public void onRemove() {} public void onRemove() {}
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x + 1, y + 1);
}
@Override @Override
public Action[] getActions() { public Action[] getActions() {
return new Action[] {}; return new Action[] {};

View File

@ -1,21 +1,20 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import java.util.Set;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.gameobjects.Tile;
import xyz.valnet.hadean.interfaces.BuildableMetadata; import xyz.valnet.hadean.interfaces.BuildableMetadata;
import xyz.valnet.hadean.interfaces.IBuildable;
import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectable;
import xyz.valnet.hadean.interfaces.ITileThing;
import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Action;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.Layers;
import xyz.valnet.hadean.util.detail.Detail; import xyz.valnet.hadean.util.detail.Detail;
@BuildableMetadata(category = "Zones", name = "Stockpile") @BuildableMetadata(category = "Zones", name = "Stockpile")
public class Stockpile extends WorldObject implements ISelectable, ITileThing, IBuildable { public class Stockpile extends Buildable implements ISelectable {
private int w, h;
@Override @Override
public void render() { public void render() {
@ -24,43 +23,20 @@ public class Stockpile extends WorldObject implements ISelectable, ITileThing, I
@Override @Override
public void renderAlpha() { public void renderAlpha() {
if(!visible) return; if(!visible) return;
Vector4i pos = getWorldPosition();
Assets.flat.pushColor(new Vector4f(1f, 0.2f, 0.1f, 0.3f)); Assets.flat.pushColor(new Vector4f(1f, 0.2f, 0.1f, 0.3f));
camera.draw(Layers.TILES, Assets.whiteBox, x, y, w, h); camera.draw(Layers.TILES, Assets.whiteBox, pos.x, pos.y, pos.z, pos.w);
Assets.flat.popColor(); Assets.flat.popColor();
} }
@Override
public void update(float dTime) {
super.update(dTime);
}
private Tile[] getTiles() {
Vector4f box = getWorldBox();
int count = 0;
Tile[] tiles = new Tile[(int)box.z * (int)box.w];
for(float x = box.x; x < box.z; x ++) {
for(float y = box.y; y < box.w; y ++) {
tiles[count] = terrain.getTile((int)x, (int)y);
count ++;
}
}
return tiles;
}
public Vector2i getFreeTile() { public Vector2i getFreeTile() {
Tile[] tiles = getTiles(); Set<Tile> tiles = getTiles();
for(Tile tile : tiles) { for(Tile tile : tiles) {
if(tile.isTileFree()) return tile.getCoords(); if(tile.isTileFree()) return tile.getCoords();
} }
return null; return null;
} }
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x + w, y + h);
}
private static Action TOGGLE_VISIBILITY = new Action("Hide / Show"); private static Action TOGGLE_VISIBILITY = new Action("Hide / Show");
@Override @Override
@ -97,20 +73,6 @@ public class Stockpile extends WorldObject implements ISelectable, ITileThing, I
} }
@Override
public void buildAt(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
for(int i = x; i < x + w; i ++) {
for(int j = y; j < y + h; j ++) {
terrain.getTile(i, j).placeThing(this);
}
}
}
@Override @Override
public String getName() { public String getName() {
return "Stockpile"; return "Stockpile";

View File

@ -24,20 +24,20 @@ public class Tree extends WorldObject implements ITileThing, ISelectable, IWorka
private Job chopJob = null; private Job chopJob = null;
public Tree(int x, int y) { public Tree(int x, int y) {
this.x = x; setPosition(x, y);
this.y = y;
} }
@Override @Override
public void render() { public void render() {
Vector2i pos = getWorldPosition().xy();
// Assets.flat.pushColor(new Vector4f(1 - getProgress(), 1 - getProgress(), 1 - getProgress(), 1.0f)); // Assets.flat.pushColor(new Vector4f(1 - getProgress(), 1 - getProgress(), 1 - getProgress(), 1.0f));
camera.draw(Layers.AIR, Assets.tree, x - 1, y - 2, 3, 3); camera.draw(Layers.AIR, Assets.tree, pos.x - 1, pos.y - 2, 3, 3);
// Assets.flat.popColor(); // Assets.flat.popColor();
if(chopJob != null) { if(chopJob != null) {
if(getProgress() > 0) { if(getProgress() > 0) {
camera.drawProgressBar(getProgress(), new Vector4f(x - 1, y - 2, x + 2, y + 1)); camera.drawProgressBar(getProgress(), new Vector4f(pos.x - 1, pos.y - 2, pos.x + 2, pos.y + 1));
} }
camera.draw(Layers.MARKERS, Assets.lilAxe, x, y); camera.draw(Layers.MARKERS, Assets.lilAxe, pos.x, pos.y);
} }
} }
@ -46,11 +46,6 @@ public class Tree extends WorldObject implements ITileThing, ISelectable, IWorka
return false; return false;
} }
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x + 1, y + 1);
}
public static final Action ACTION_CHOP = new Action("Chop"); public static final Action ACTION_CHOP = new Action("Chop");
@Override @Override
@ -74,11 +69,12 @@ public class Tree extends WorldObject implements ITileThing, ISelectable, IWorka
@Override @Override
public Vector2i[] getWorkablePositions() { public Vector2i[] getWorkablePositions() {
Vector2i pos = getWorldPosition().xy();
return new Vector2i[] { return new Vector2i[] {
new Vector2i((int)x, (int)y - 1), new Vector2i(pos.x, pos.y - 1),
new Vector2i((int)x, (int)y + 1), new Vector2i(pos.x, pos.y + 1),
new Vector2i((int)x - 1, (int)y), new Vector2i(pos.x - 1, pos.y),
new Vector2i((int)x + 1, (int)y) new Vector2i(pos.x + 1, pos.y)
}; };
} }
@ -123,7 +119,8 @@ public class Tree extends WorldObject implements ITileThing, ISelectable, IWorka
@Override @Override
public void onRemove() { public void onRemove() {
Log log = new Log((int)x, (int)y); Vector2i pos = getWorldPosition().xy();
Log log = new Log(pos.x, pos.y);
getTile().placeThing(log); getTile().placeThing(log);
} }

View File

@ -1,37 +1,114 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.math.Vector2f; import java.util.HashSet;
import java.util.Set;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.hadean.gameobjects.Camera; import xyz.valnet.hadean.gameobjects.Camera;
import xyz.valnet.hadean.gameobjects.Terrain; import xyz.valnet.hadean.gameobjects.Terrain;
import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.gameobjects.Tile;
import xyz.valnet.hadean.interfaces.ITileThing;
public abstract class WorldObject extends GameObject { public abstract class WorldObject extends GameObject {
protected float x; private int x;
protected float y; private int y;
protected float w; private int w;
protected float h; private int h;
protected Camera camera; protected Camera camera;
protected Terrain terrain; protected Terrain terrain;
private Set<Tile> linkedTiles;
@Override
protected void ready() {
if(linkedTiles == null) linkedTiles = new HashSet<Tile>();
}
@Override @Override
protected void connect() { protected void connect() {
camera = get(Camera.class); camera = get(Camera.class);
terrain = get(Terrain.class); terrain = get(Terrain.class);
} }
public Tile getTile() { @Override
return terrain.getTile((int)x, (int)y); protected void start() {
setPosition(x, y, w, h);
} }
public Vector2f getWorldPosition() { private void updateTileLinks(Set<Tile> tiles) {
return new Vector2f(x, y); if(tiles == null || tiles.size() == 0) return;
if(!(this instanceof ITileThing)) return;
Set<Tile> removeTiles = new HashSet<Tile>();
Set<Tile> addTiles = new HashSet<Tile>();
for(Tile tile : tiles) {
if(linkedTiles.contains(tile)) continue;
addTiles.add(tile);
}
for(Tile tile : linkedTiles) {
if(tiles.contains(tile)) continue;
removeTiles.add(tile);
}
for(Tile tile : removeTiles) {
linkedTiles.remove(tile);
tile.remove(this);
}
for(Tile tile : addTiles) {
linkedTiles.add(tile);
tile.placeThing((ITileThing) this);
}
}
public void setPosition(Vector4i vector) {
setPosition(vector.x, vector.y, vector.z, vector.w);
}
public void setPosition(int x, int y) {
setPosition(x, y, 1, 1);
}
public void setPosition(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
if(terrain == null) return;
Set<Tile> tiles = new HashSet<Tile>();
for(int i = 0; i < w; i ++) {
for(int j = 0; j < h; j ++) {
tiles.add(terrain.getTile(x + i, y + j));
}
}
updateTileLinks(tiles);
}
public Tile getTile() {
return terrain.getTile(x, y);
}
public Set<Tile> getTiles() {
return linkedTiles;
}
public Vector4i getWorldPosition() {
return new Vector4i(x, y, w, h);
} }
public abstract String getName(); public abstract String getName();
public abstract Vector4f getWorldBox();
public Vector4f getWorldBox() {
return new Vector4f(x, y, x + w, y + h);
}
} }

View File

@ -40,11 +40,12 @@ public abstract class Agent extends WorldObject implements ISelectable {
} }
public Vector2f getCalculatedPosition() { public Vector2f getCalculatedPosition() {
if(path == null || path.isComplete()) return getWorldPosition(); if(path == null || path.isComplete()) return getWorldPosition().xy().asFloat();
Vector2i pos = getWorldPosition().xy();
Vector2f nextPos = path.peek().getPosition().asFloat(); Vector2f nextPos = path.peek().getPosition().asFloat();
return new Vector2f( return new Vector2f(
lerp(x, nextPos.x, frameCounter / (float)speed), lerp(pos.x, nextPos.x, frameCounter / (float)speed),
lerp(y, nextPos.y, frameCounter / (float)speed) lerp(pos.y, nextPos.y, frameCounter / (float)speed)
); );
} }
@ -68,8 +69,7 @@ public abstract class Agent extends WorldObject implements ISelectable {
frameCounter += dTime; frameCounter += dTime;
if(frameCounter >= speed) { if(frameCounter >= speed) {
Vector2i nextPos = path.pop().getPosition(); Vector2i nextPos = path.pop().getPosition();
this.x = nextPos.x; setPosition(nextPos.x, nextPos.y);
this.y = nextPos.y;
if(nextPath != null) { if(nextPath != null) {
path = nextPath; path = nextPath;
nextPath = null; nextPath = null;
@ -92,16 +92,17 @@ public abstract class Agent extends WorldObject implements ISelectable {
private void correctPath() { private void correctPath() {
if(path != null && path.isComplete()) path = null; if(path != null && path.isComplete()) path = null;
if(path == null) return; if(path == null) return;
if(path.peek().getPosition().equals(this.getWorldPosition().asInt())) { if(path.peek().getPosition().equals(this.getWorldPosition().xy())) {
path.pop(); path.pop();
} }
if(path != null && path.isComplete()) path = null; if(path != null && path.isComplete()) path = null;
if(path == null) return; if(path == null) return;
Tile nextTile = terrain.getTile(path.peek().getPosition()); Tile nextTile = terrain.getTile(path.peek().getPosition());
if(!nextTile.isWalkable()) { if(!nextTile.isWalkable()) {
Vector2i pos = getWorldPosition().xy();
path = pathfinder.getPath( path = pathfinder.getPath(
(int)Math.floor(x), pos.x,
(int)Math.floor(y), pos.y,
path.dst.x, path.dst.x,
path.dst.y path.dst.y
); );
@ -124,7 +125,8 @@ public abstract class Agent extends WorldObject implements ISelectable {
private Path nextPath = null; private Path nextPath = null;
public void goTo(int x, int y) { public void goTo(int x, int y) {
Path newPath = pathfinder.getPath((int)this.x, (int)this.y, x, y); Vector2i pos = getWorldPosition().xy();
Path newPath = pathfinder.getPath(pos.x, pos.y, x, y);
if(path == null) { if(path == null) {
path = newPath; path = newPath;
frameCounter -= 0; frameCounter -= 0;
@ -134,7 +136,7 @@ public abstract class Agent extends WorldObject implements ISelectable {
} }
public void goToClosest(Vector2i[] destinations) { public void goToClosest(Vector2i[] destinations) {
Path newPath = pathfinder.getBestPath(this.getWorldPosition().asInt(), destinations); Path newPath = pathfinder.getBestPath(getWorldPosition().xy(), destinations);
if(path == null) { if(path == null) {
path = newPath; path = newPath;
frameCounter = 0; frameCounter = 0;
@ -148,9 +150,10 @@ public abstract class Agent extends WorldObject implements ISelectable {
} }
public void wander() { public void wander() {
Vector2i pos = getWorldPosition().xy();
int randomX = (int)Math.floor(Math.random() * Terrain.WORLD_SIZE); int randomX = (int)Math.floor(Math.random() * Terrain.WORLD_SIZE);
int randomY = (int)Math.floor(Math.random() * Terrain.WORLD_SIZE); int randomY = (int)Math.floor(Math.random() * Terrain.WORLD_SIZE);
path = pathfinder.getPath((int)x, (int)y, randomX, randomY); path = pathfinder.getPath(pos.x, pos.y, randomX, randomY);
} }
@Override @Override
@ -164,7 +167,8 @@ public abstract class Agent extends WorldObject implements ISelectable {
glBegin(GL_LINES); glBegin(GL_LINES);
Vector2f u, v; Vector2f u, v;
if(node.from == null) u = camera.world2screen(x, y); Vector2i pos = getWorldPosition().xy();
if(node.from == null) u = camera.world2screen(pos.x, pos.y);
else u = camera.world2screen(node.from.x + 0.5f, node.from.y + 0.5f); else u = camera.world2screen(node.from.x + 0.5f, node.from.y + 0.5f);
v = camera.world2screen(node.x + 0.5f, node.y + 0.5f); v = camera.world2screen(node.x + 0.5f, node.y + 0.5f);

View File

@ -1,5 +1,6 @@
package xyz.valnet.hadean.gameobjects.worldobjects.items; package xyz.valnet.hadean.gameobjects.worldobjects.items;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.Layers;
import xyz.valnet.hadean.util.detail.Detail; import xyz.valnet.hadean.util.detail.Detail;
@ -7,8 +8,7 @@ import xyz.valnet.hadean.util.detail.Detail;
public class Boulder extends Item { public class Boulder extends Item {
public Boulder(int x, int y) { public Boulder(int x, int y) {
this.x = x; setPosition(x, y);
this.y = y;
} }
@Override @Override
@ -18,7 +18,8 @@ public class Boulder extends Item {
@Override @Override
public void render() { public void render() {
camera.draw(Layers.GROUND, Assets.bigRock, x, y); Vector2i pos = getWorldPosition().xy();
camera.draw(Layers.GROUND, Assets.bigRock, pos.x, pos.y);
} }
@Override @Override

View File

@ -37,11 +37,6 @@ public abstract class Item extends WorldObject implements ISelectable, ITileThin
return null; return null;
} }
@Override
public Vector4f getWorldBox() {
return new Vector4f(x, y, x + 1, y + 1);
}
public static final Action HAUL = new Action("Haul"); public static final Action HAUL = new Action("Haul");
public static final Action CANCEL_HAUL = new Action("Cancel\n Haul"); public static final Action CANCEL_HAUL = new Action("Cancel\n Haul");
@ -57,7 +52,7 @@ public abstract class Item extends WorldObject implements ISelectable, ITileThin
public void renderAlpha() { public void renderAlpha() {
if(haulJob != null) { if(haulJob != null) {
// Assets.flat.pushColor(Vector4f.opacity(1f)); // Assets.flat.pushColor(Vector4f.opacity(1f));
camera.draw(Layers.MARKERS, Assets.haulArrow, getWorldPosition()); camera.draw(Layers.MARKERS, Assets.haulArrow, getWorldPosition().xy().asFloat());
// Assets.flat.popColor(); // Assets.flat.popColor();
} }
} }
@ -90,8 +85,7 @@ public abstract class Item extends WorldObject implements ISelectable, ITileThin
@Override @Override
public void onPlaced(Tile tile) { public void onPlaced(Tile tile) {
this.x = tile.getCoords().x; setPosition(tile.getWorldPosition());
this.y = tile.getCoords().y;
} }
public boolean matches(IItemPredicate itemPredicate) { public boolean matches(IItemPredicate itemPredicate) {

View File

@ -1,5 +1,6 @@
package xyz.valnet.hadean.gameobjects.worldobjects.items; package xyz.valnet.hadean.gameobjects.worldobjects.items;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.hadean.interfaces.IItemPredicate; import xyz.valnet.hadean.interfaces.IItemPredicate;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.Layers;
@ -15,13 +16,13 @@ public class Log extends Item {
public static IItemPredicate LOG_PREDICATE = (item) -> (item instanceof Log); public static IItemPredicate LOG_PREDICATE = (item) -> (item instanceof Log);
public Log(int x, int y) { public Log(int x, int y) {
this.x = x; setPosition(x, y);
this.y = y;
} }
@Override @Override
public void render() { public void render() {
camera.draw(Layers.GROUND, Assets.log, x, y); Vector2i pos = getWorldPosition().xy();
camera.draw(Layers.GROUND, Assets.log, pos.x, pos.y);
} }
@Override @Override

View File

@ -43,7 +43,7 @@ public class JobActivity extends Activity {
} }
private boolean isAtJobStepLocation() { private boolean isAtJobStepLocation() {
return worker.getWorldPosition().asInt().isOneOf(job.getCurrentStep().getLocations()); return worker.getWorldPosition().xy().isOneOf(job.getCurrentStep().getLocations());
} }
private void goToJobStepLocation() { private void goToJobStepLocation() {

View File

@ -103,8 +103,10 @@ public class Pawn extends Agent {
} }
protected void create() { protected void create() {
x = (int) (Math.random() * Terrain.WORLD_SIZE); setPosition(
y = (int) (Math.random() * Terrain.WORLD_SIZE); (int) (Math.random() * Terrain.WORLD_SIZE),
(int) (Math.random() * Terrain.WORLD_SIZE)
);
} }
@Override @Override
@ -133,11 +135,6 @@ public class Pawn extends Agent {
}); });
} }
@Override
public Vector2f getWorldPosition() {
return new Vector2f(x, y);
}
@Override @Override
public String getName() { public String getName() {
return name; return name;

View File

@ -6,10 +6,12 @@ import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface BuildableMetadata { public @interface BuildableMetadata {
public static int AREA = 0; public enum Type {
public static int SINGLE = 1; AREA,
SINGLE
}
public String name(); public String name();
public String category(); public String category();
public int type() default AREA; public Type type() default Type.AREA;
} }

View File

@ -3,5 +3,6 @@ package xyz.valnet.hadean.interfaces;
public interface IBuildLayerListener { public interface IBuildLayerListener {
public void update(int x, int y, int w, int h); public void update(int x, int y, int w, int h);
public void build(int x, int y, int w, int h); public void build(int x, int y, int w, int h);
public void build(int x, int y);
public void cancel(); public void cancel();
} }

View File

@ -3,5 +3,6 @@ package xyz.valnet.hadean.interfaces;
public interface IBuildable { public interface IBuildable {
public void buildAt(int x, int y, int w, int h); public void buildAt(int x, int y, int w, int h);
public void buildAt(int x, int y);
} }