Various fixes to the old server to be able to get zabin's puzzle to run (partially). master
authorNot Zed <notzed@gmail.com>
Sun, 19 Mar 2023 06:55:59 +0000 (17:25 +1030)
committerNot Zed <notzed@gmail.com>
Sun, 19 Mar 2023 07:23:51 +0000 (17:53 +1030)
13 files changed:
Makefile
src/duskz.client/classes/duskz/client/Dusk.java
src/duskz.client/classes/duskz/client/Status.java
src/duskz.server/classes/duskz/server/DuskEngine.java
src/duskz.server/classes/duskz/server/Faction.java
src/duskz.server/classes/duskz/server/Script.java
src/duskz.server/classes/duskz/server/entity/Item.java
src/duskz.server/classes/duskz/server/entity/LivingThing.java
src/duskz.server/classes/duskz/server/entity/Merchant.java
src/duskz.server/classes/duskz/server/entity/Mob.java
src/duskz.server/classes/duskz/server/entity/PlayerMerchant.java
src/duskz.server/classes/duskz/server/entity/Prop.java
src/duskz.server/classes/duskz/server/entity/Sign.java

index 4e6e82a..5e68f2b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,7 @@ duskz.server_JDEPMOD = duskz.common
 duskz.editor_JDEPMOD = duskz.common duskz.client
 duskz.viewer_JDEPMOD = duskz.common duskz.client
 
 duskz.editor_JDEPMOD = duskz.common duskz.client
 duskz.viewer_JDEPMOD = duskz.common duskz.client
 
+# auto-generate the <module>_COMMANDS variables
 define install-bin=
 $1_COMMANDS = $(notdir $(wildcard src/$1/$(TARGET)/bin/*))
 bin/$1/$(TARGET)/bin/%: src/$1/$(TARGET)/bin/%
 define install-bin=
 $1_COMMANDS = $(notdir $(wildcard src/$1/$(TARGET)/bin/*))
 bin/$1/$(TARGET)/bin/%: src/$1/$(TARGET)/bin/%
@@ -48,10 +49,13 @@ maven_central_JARS = $(xmlbind) $(rhino)
 
 include maven.make
 
 
 include maven.make
 
+oldgame=game-2.7.3
+oldgame=../../ext/DuskRPG/DuskFiles/Dusk2.7.3
+
 run-server-old: duskz.server
 run-server-old: duskz.server
-       cd game-2.7.3 && \
+       cd $(oldgame) && \
        $(JAVA) \
        $(JAVA) \
-               --module-path ../.lib:../bin/$(TARGET)/lib \
+               --module-path $(realpath .lib):$(realpath bin/$(TARGET)/lib) \
                -m duskz.server/duskz.server.DuskServer
 
 run-server: duskz.server
                -m duskz.server/duskz.server.DuskServer
 
 run-server: duskz.server
index 3f0c303..39ff284 100644 (file)
@@ -222,8 +222,8 @@ public class Dusk implements Runnable, DuskProtocol {
                                DuskMessage dm = DuskMessage.receiveMessage(instream);
 
                                // debug
                                DuskMessage dm = DuskMessage.receiveMessage(instream);
 
                                // debug
-                               System.out.print(state + ": ");
-                               dm.format(System.out);
+                               //System.out.print(state + ": ");
+                               //dm.format(System.out);
 
                                switch (dm.name) {
                                        case MSG_AUTH: {
 
                                switch (dm.name) {
                                        case MSG_AUTH: {
@@ -679,8 +679,8 @@ public class Dusk implements Runnable, DuskProtocol {
        }
 
        private void send(DuskMessage lm) throws IOException {
        }
 
        private void send(DuskMessage lm) throws IOException {
-               System.out.print("sending: ");
-               lm.format(System.out);
+               //System.out.print("sending: ");
+               //lm.format(System.out);
                lm.sendMessage(outstream);
        }
 
                lm.sendMessage(outstream);
        }
 
index c87b162..cdb59f9 100644 (file)
@@ -94,6 +94,8 @@ public class Status implements DuskProtocol {
        public boolean canAttack(Entity e) {
                // Ugh, i'm not sure what the types were, but i think it just meant 'any living thing'.
                // Dunno why the server doesn't send this message to the client anyway
        public boolean canAttack(Entity e) {
                // Ugh, i'm not sure what the types were, but i think it just meant 'any living thing'.
                // Dunno why the server doesn't send this message to the client anyway
+               System.out.printf("can attack test %s type %s distance %d range %d\n",
+                       e.name, e.intType, distance(e), range);
                return e.ID != id
 //                             && ((e.intType == 0 || e.intType == 1 || e.intType == 4)
                                && ((e.intType == 0 || e.intType == 1 || e.intType == 2)
                return e.ID != id
 //                             && ((e.intType == 0 || e.intType == 1 || e.intType == 4)
                                && ((e.intType == 0 || e.intType == 1 || e.intType == 2)
index 561690d..17eff4d 100644 (file)
@@ -44,6 +44,8 @@ import java.io.*;
 import java.io.PrintStream;
 import java.io.FileOutputStream;
 import java.net.Socket;
 import java.io.PrintStream;
 import java.io.FileOutputStream;
 import java.net.Socket;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.StringTokenizer;
 import java.util.Date;
 import java.util.ArrayList;
 import java.util.StringTokenizer;
 import java.util.Date;
@@ -52,6 +54,7 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.Properties;
 
 /**
 import java.util.Properties;
 
 /**
@@ -65,51 +68,51 @@ public class DuskEngine implements Runnable, DuskProtocol {
        public Log log;
        //Prefs:
        public int port = 7400,
        public Log log;
        //Prefs:
        public int port = 7400,
-                       trackerport = 7401,
-                       maxconnections = 0,
-                       petcost = 100,
-                       merchantimage,
-                       signimage,
-                       battlesound = -1,
-                       mobrespawnspeed,
-                       viewrange = 5,
-                       oldviewrange = 0,
-                       mapsize = 11,
-                       titlecap = 0,
-                       noChannelMax = 600, // defalut 600=10 minutes
-                       namecap = 20, //default 20
-                       messagecap = 120, //default 120
-                       changeRaceCpLimit = 100, //default 100cp
-                       logLevel = Log.ERROR,
-                       traincost = 100,
-                       expgainmod = 10;
+               trackerport = 7401,
+               maxconnections = 0,
+               petcost = 100,
+               merchantimage,
+               signimage,
+               battlesound = -1,
+               mobrespawnspeed,
+               viewrange = 5,
+               oldviewrange = 0,
+               mapsize = 11,
+               titlecap = 0,
+               noChannelMax = 600, // defalut 600=10 minutes
+               namecap = 20, //default 20
+               messagecap = 120, //default 120
+               changeRaceCpLimit = 100, //default 100cp
+               logLevel = Log.ERROR,
+               traincost = 100,
+               expgainmod = 10;
        double gplosemod = 1D / 16D, //default 1/16
        double gplosemod = 1D / 16D, //default 1/16
-                       explosemod = 1D / 16D,
-                       gpfleemod = 1D / 64D, //default 1/64
-                       expfleemod = 1D / 64D;
+               explosemod = 1D / 16D,
+               gpfleemod = 1D / 64D, //default 1/64
+               expfleemod = 1D / 64D;
        public long lngMobTicks = 1000, //default 1000 milliseconds(1 second) per tick
        public long lngMobTicks = 1000, //default 1000 milliseconds(1 second) per tick
-                       lngPlayerTicks = 250, //default 250 milliseconds(1/4 second) per tick
-                       floodLimit = 1000;      //default 1000 milliseconds(1 second) btw messages
+               lngPlayerTicks = 250, //default 250 milliseconds(1/4 second) per tick
+               floodLimit = 1000;      //default 1000 milliseconds(1 second) btw messages
        public String trackername = "Just Some World.",
        public String trackername = "Just Some World.",
-                       site = "none",
-                       strRCAddress,
-                       strRCName,
-                       strLogFile = null,
-                       strMusicAddress;
+               site = "none",
+               strRCAddress,
+               strRCName,
+               strLogFile = null,
+               strMusicAddress;
        public boolean blnMusic = false,
        public boolean blnMusic = false,
-                       blnLineOfSight = false,
-                       blnAI = false,
-                       blnIPF = false,
-                       tracker = true,
-                       blnSavingGame = false,
-                       blnShuttingDown = false;
+               blnLineOfSight = false,
+               blnAI = false,
+               blnIPF = false,
+               tracker = true,
+               blnSavingGame = false,
+               blnShuttingDown = false;
        // FIXME: Not public
        public Script scrCanSeeLivingThing = null,
        // FIXME: Not public
        public Script scrCanSeeLivingThing = null,
-                       scrCanMoveThroughLivingThing = null,
-                       scrCanAttack = null,
-                       scrOnStart = null,
-                       scrOnDeath = null,
-                       scrOnLogOut = null;
+               scrCanMoveThroughLivingThing = null,
+               scrCanAttack = null,
+               scrOnStart = null,
+               scrOnDeath = null,
+               scrOnLogOut = null;
        //End Prefs
        public final static String version = "3.0 dev";
        public final Date datStart = new Date(System.currentTimeMillis());
        //End Prefs
        public final static String version = "3.0 dev";
        public final Date datStart = new Date(System.currentTimeMillis());
@@ -156,11 +159,11 @@ public class DuskEngine implements Runnable, DuskProtocol {
        final private HashMap<String, Integer> failureAddress = new HashMap<>();
        private long nextid = 0;
        boolean blnVariableListChanged = false,
        final private HashMap<String, Integer> failureAddress = new HashMap<>();
        private long nextid = 0;
        boolean blnVariableListChanged = false,
-                       blnMapHasChanged = false,
-                       blnMobListChanged = false,
-                       blnSignListChanged = false,
-                       blnMerchantListChanged = false,
-                       blnPropListChanged = false;
+               blnMapHasChanged = false,
+               blnMobListChanged = false,
+               blnSignListChanged = false,
+               blnMerchantListChanged = false,
+               blnPropListChanged = false;
 
        public DuskEngine() {
                RandomAccessFile rafFile = null;
 
        public DuskEngine() {
                RandomAccessFile rafFile = null;
@@ -169,7 +172,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
                try {
                        int x = 0,
 
                try {
                        int x = 0,
-                                       y = 0;
+                               y = 0;
                        String line;
 
                        loadPrefs();
                        String line;
 
                        loadPrefs();
@@ -177,7 +180,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        // Load Map
                        File newmap = new File("defMaps");
                        if (newmap.exists()) {
                        // Load Map
                        File newmap = new File("defMaps");
                        if (newmap.exists()) {
-                               for (File mapfile : newmap.listFiles()) {
+                               for (File mapfile: newmap.listFiles()) {
                                        TileMap map;
                                        log.printMessage(Log.INFO, "Loading Layered Maps...");
                                        map = TileMap.loadLayered(mapfile);
                                        TileMap map;
                                        log.printMessage(Log.INFO, "Loading Layered Maps...");
                                        map = TileMap.loadLayered(mapfile);
@@ -249,29 +252,52 @@ public class DuskEngine implements Runnable, DuskProtocol {
                         }
                         rafFile.close();
                         }*/
                         }
                         rafFile.close();
                         }*/
-
                        // FIXME: use some sort of common file format or at least conventions
                        // between all these state files.
                        // FIXME: use some sort of common file format or at least conventions
                        // between all these state files.
-
                        // Load Merchants
                        // Load Merchants
+                       // FIXME: better version handling
+                       int fmt = 0;
                        try {
                                rafFile = new RandomAccessFile("merchants", "r");
                                Merchant mrcStore;
                                log.printMessage(Log.INFO, "Loading Merchants...");
                                line = rafFile.readLine();
                                while (!(line == null || line.equals(""))) {
                        try {
                                rafFile = new RandomAccessFile("merchants", "r");
                                Merchant mrcStore;
                                log.printMessage(Log.INFO, "Loading Merchants...");
                                line = rafFile.readLine();
                                while (!(line == null || line.equals(""))) {
+                                       log.printMessage(Log.VERBOSE, "merchant: " + fmt + " " + line);
+                                       String mapname;
+                                       int locx, locy;
+                                       if (fmt == 0) {
+                                               mapname = line;
+                                               if (maps.containsKey(mapname)) {
+                                                       locx = Integer.parseInt(rafFile.readLine());
+                                                       fmt = 2;
+                                               } else {
+                                                       locx = Integer.parseInt(mapname);
+                                                       mapname = "main";
+                                                       fmt = 1;
+                                               }
+                                               locy = Integer.parseInt(rafFile.readLine());
+                                       } else if (fmt == 1) {
+                                               mapname = "main";
+                                               locx = Integer.parseInt(line);
+                                               locy = Integer.parseInt(rafFile.readLine());
+                                       } else {
+                                               mapname = line;
+                                               locx = Integer.parseInt(rafFile.readLine());
+                                               locy = Integer.parseInt(rafFile.readLine());
+                                       }
                                        mrcStore = new Merchant(this);
                                        mrcStore = new Merchant(this);
-                                       TileMap map = maps.get(line);
-                                       mrcStore.x = Integer.parseInt(rafFile.readLine());
-                                       mrcStore.y = Integer.parseInt(rafFile.readLine());
-                                       log.printMessage(Log.VERBOSE, "Merchant(" + mrcStore.x + "," + mrcStore.y + ")");
+                                       mrcStore.map = maps.get(mapname);
+                                       mrcStore.x = locx;
+                                       mrcStore.y = locy;
+                                       log.printMessage(Log.VERBOSE, "Merchant(" + mapname + "@" + mrcStore.x + "," + mrcStore.y + ")");
                                        line = rafFile.readLine();
                                        while (line != null && !line.equals("") && !line.equalsIgnoreCase("end")) {
                                                log.printMessage(Log.DEBUG, "\t" + line);
                                                mrcStore.items.add(line);
                                                line = rafFile.readLine();
                                        }
                                        line = rafFile.readLine();
                                        while (line != null && !line.equals("") && !line.equalsIgnoreCase("end")) {
                                                log.printMessage(Log.DEBUG, "\t" + line);
                                                mrcStore.items.add(line);
                                                line = rafFile.readLine();
                                        }
-                                       if (!map.inside(mrcStore.x, mrcStore.y)) {
+                                       if (!mrcStore.map.inside(mrcStore.x, mrcStore.y)) {
                                                log.printMessage(Log.VERBOSE, "Previous merchant is off of the map, ignoring");
                                                blnMerchantListChanged = true;
                                        } else {
                                                log.printMessage(Log.VERBOSE, "Previous merchant is off of the map, ignoring");
                                                blnMerchantListChanged = true;
                                        } else {
@@ -299,18 +325,18 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                // map
                                // x
                                // y
                                // map
                                // x
                                // y
-                               if (line.equals("mob")) {
+                               if (line.equals("mob") || line.equals("mob2.3")) {
                                        try {
                                                String mobtype = rafFile.readLine();
                                        try {
                                                String mobtype = rafFile.readLine();
-                                               String mapname = rafFile.readLine();
+                                               String mapname = line.equals("mob") ? rafFile.readLine() : "main";
                                                int locx = Integer.parseInt(rafFile.readLine());
                                                int locy = Integer.parseInt(rafFile.readLine());
                                                TileMap map = maps.get(mapname);
 
                                                thnStore = new Mob(mobtype,
                                                int locx = Integer.parseInt(rafFile.readLine());
                                                int locy = Integer.parseInt(rafFile.readLine());
                                                TileMap map = maps.get(mapname);
 
                                                thnStore = new Mob(mobtype,
-                                                               locx,
-                                                               locy,
-                                                               this);
+                                                       locx,
+                                                       locy,
+                                                       this);
 
                                                if (!map.inside(thnStore.x, thnStore.y)) {
                                                        log.printMessage(Log.VERBOSE, "Previous mob is off of the map, ignoring");
 
                                                if (!map.inside(thnStore.x, thnStore.y)) {
                                                        log.printMessage(Log.VERBOSE, "Previous mob is off of the map, ignoring");
@@ -330,13 +356,29 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
                        // Load signs
                        Sign sgnStore;
 
                        // Load signs
                        Sign sgnStore;
+                       fmt = 0;
                        rafFile = new RandomAccessFile("signs", "r");
                        log.printMessage(Log.INFO, "Loading Signs...");
                        line = rafFile.readLine();
                        while (!(line == null || line.equals(""))) {
                        rafFile = new RandomAccessFile("signs", "r");
                        log.printMessage(Log.INFO, "Loading Signs...");
                        line = rafFile.readLine();
                        while (!(line == null || line.equals(""))) {
-                               String mapname = rafFile.readLine();
-                               int locx = Integer.parseInt(rafFile.readLine());
-                               int locy = Integer.parseInt(rafFile.readLine());
+                               String mapname;
+                               int locx, locy;
+                               if (fmt == 0) {
+                                       mapname = rafFile.readLine();
+                                       if (maps.containsKey(mapname)) {
+                                               locx = Integer.parseInt(rafFile.readLine());
+                                               fmt = 2;
+                                       } else {
+                                               locx = Integer.parseInt(mapname);
+                                               mapname = "main";
+                                               fmt = 1;
+                                       }
+                                       locy = Integer.parseInt(rafFile.readLine());
+                               } else {
+                                       mapname = fmt == 1 ? "main" : rafFile.readLine();
+                                       locx = Integer.parseInt(rafFile.readLine());
+                                       locy = Integer.parseInt(rafFile.readLine());
+                               }
                                TileMap map = maps.get(mapname);
                                log.printMessage(Log.VERBOSE, line);
                                sgnStore = new Sign(this, "sign", line, locx, locy, getID());
                                TileMap map = maps.get(mapname);
                                log.printMessage(Log.VERBOSE, line);
                                sgnStore = new Sign(this, "sign", line, locx, locy, getID());
@@ -355,10 +397,26 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        rafFile = new RandomAccessFile("props", "r");
                        log.printMessage(Log.INFO, "Loading Props...");
                        line = rafFile.readLine();
                        rafFile = new RandomAccessFile("props", "r");
                        log.printMessage(Log.INFO, "Loading Props...");
                        line = rafFile.readLine();
+                       fmt = 0;
                        while (!(line == null || line.equals(""))) {
                        while (!(line == null || line.equals(""))) {
-                               String mapname = rafFile.readLine();
-                               int locx = Integer.parseInt(rafFile.readLine());
-                               int locy = Integer.parseInt(rafFile.readLine());
+                               String mapname;
+                               int locx, locy;
+                               if (fmt == 0) {
+                                       mapname = rafFile.readLine();
+                                       if (maps.containsKey(mapname)) {
+                                               locx = Integer.parseInt(rafFile.readLine());
+                                               fmt = 2;
+                                       } else {
+                                               locx = Integer.parseInt(mapname);
+                                               mapname = "main";
+                                               fmt = 1;
+                                       }
+                                       locy = Integer.parseInt(rafFile.readLine());
+                               } else {
+                                       mapname = fmt == 1 ? "main" : rafFile.readLine();
+                                       locx = Integer.parseInt(rafFile.readLine());
+                                       locy = Integer.parseInt(rafFile.readLine());
+                               }
                                TileMap map = maps.get(mapname);
 
                                log.printMessage(Log.VERBOSE, line);
                                TileMap map = maps.get(mapname);
 
                                log.printMessage(Log.VERBOSE, line);
@@ -388,18 +446,18 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        while (!(strVarName == null || strVarName.equals(""))) {
                                intType = Integer.parseInt(rafFile.readLine());
                                switch (intType) {
                        while (!(strVarName == null || strVarName.equals(""))) {
                                intType = Integer.parseInt(rafFile.readLine());
                                switch (intType) {
-                                       case 0: {
-                                               dblObject = (double) Double.parseDouble(rafFile.readLine());
-                                               varVariables.addVariable(strVarName, dblObject);
-                                               log.printMessage(Log.VERBOSE, strVarName + " = " + dblObject);
-                                               break;
-                                       }
-                                       case 1: {
-                                               strObject = rafFile.readLine();
-                                               varVariables.addVariable(strVarName, strObject);
-                                               log.printMessage(Log.VERBOSE, strVarName + " = '" + strObject + "'");
-                                               break;
-                                       }
+                               case 0: {
+                                       dblObject = (double)Double.parseDouble(rafFile.readLine());
+                                       varVariables.addVariable(strVarName, dblObject);
+                                       log.printMessage(Log.VERBOSE, strVarName + " = " + dblObject);
+                                       break;
+                               }
+                               case 1: {
+                                       strObject = rafFile.readLine();
+                                       varVariables.addVariable(strVarName, strObject);
+                                       log.printMessage(Log.VERBOSE, strVarName + " = '" + strObject + "'");
+                                       break;
+                               }
                                }
                                strVarName = rafFile.readLine();
                        }
                                }
                                strVarName = rafFile.readLine();
                        }
@@ -449,9 +507,9 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        return false;
                }
                if (strName.equals("")
                        return false;
                }
                if (strName.equals("")
-                               || strName.length() > namecap
-                               || strName.toLowerCase().equals("god")
-                               || strName.toLowerCase().equals("default")) {
+                       || strName.length() > namecap
+                       || strName.toLowerCase().equals("god")
+                       || strName.toLowerCase().equals("default")) {
                        return false;
                }
 
                        return false;
                }
 
@@ -548,7 +606,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                if (viewrange != oldviewrange) {
                        oldviewrange = viewrange;
                        mapsize = 1 + (2 * viewrange);
                if (viewrange != oldviewrange) {
                        oldviewrange = viewrange;
                        mapsize = 1 + (2 * viewrange);
-                       for (LivingThing thnStore : playersByName.values()) {
+                       for (LivingThing thnStore: playersByName.values()) {
                                thnStore.initMap();
                        }
                }
                                thnStore.initMap();
                        }
                }
@@ -556,7 +614,6 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
                // FIXME: all this 'synchronized' stuff is busted to shit, you can't lock on something
                // that might be null or will be replaced by a new object.
 
                // FIXME: all this 'synchronized' stuff is busted to shit, you can't lock on something
                // that might be null or will be replaced by a new object.
-
                try {
                        if (scrCanSeeLivingThing != null) {
                                synchronized (scrCanSeeLivingThing) {
                try {
                        if (scrCanSeeLivingThing != null) {
                                synchronized (scrCanSeeLivingThing) {
@@ -638,9 +695,9 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                try (FileInputStream fis = new FileInputStream(f)) {
                                        props.load(fis);
 
                                try (FileInputStream fis = new FileInputStream(f)) {
                                        props.load(fis);
 
-                                       for (Entry e : props.entrySet()) {
-                                               String key = (String) e.getKey();
-                                               String val = (String) e.getValue();
+                                       for (Entry e: props.entrySet()) {
+                                               String key = (String)e.getKey();
+                                               String val = (String)e.getValue();
 
                                                HashMap<Integer, Script> target = null;
                                                String path = null;
 
                                                HashMap<Integer, Script> target = null;
                                                String path = null;
@@ -679,7 +736,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
        void loadTileScripts(HashMap<Integer, Script> scripts, String path) {
                try {
                        int i;
        void loadTileScripts(HashMap<Integer, Script> scripts, String path) {
                try {
                        int i;
-                       for (Script s : scripts.values()) {
+                       for (Script s: scripts.values()) {
                                s.close();
                        }
                        scripts.clear();
                                s.close();
                        }
                        scripts.clear();
@@ -706,7 +763,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
        public void chatMessage(String msg, String from) {
                from = from.toLowerCase();
                log.printMessage(Log.ALWAYS, msg);
        public void chatMessage(String msg, String from) {
                from = from.toLowerCase();
                log.printMessage(Log.ALWAYS, msg);
-               for (LivingThing lt : playersByName.values()) {
+               for (LivingThing lt: playersByName.values()) {
                        if (!lt.ignoreList.contains(from)) {
                                lt.chatMessage(msg);
                        }
                        if (!lt.ignoreList.contains(from)) {
                                lt.chatMessage(msg);
                        }
@@ -729,12 +786,12 @@ public class DuskEngine implements Runnable, DuskProtocol {
                LivingThing thnStore;
                log.printMessage(Log.ALWAYS, inMessage);
 
                LivingThing thnStore;
                log.printMessage(Log.ALWAYS, inMessage);
 
-               for (TileMap.MapData md : map.range(locx, locy, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: map.range(locx, locy, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       thnStore = (LivingThing) o;
+                                       thnStore = (LivingThing)o;
                                        if (thnStore.isPlayer()
                                        if (thnStore.isPlayer()
-                                                       && !thnStore.ignoreList.contains(strFrom)) {
+                                               && !thnStore.ignoreList.contains(strFrom)) {
                                                thnStore.chatMessage(inMessage);
                                        }
                                }
                                                thnStore.chatMessage(inMessage);
                                        }
                                }
@@ -746,9 +803,9 @@ public class DuskEngine implements Runnable, DuskProtocol {
        public void chatMessage(String msg, String clan, String from) {
                from = from.toLowerCase();
                log.printMessage(Log.ALWAYS, msg);
        public void chatMessage(String msg, String clan, String from) {
                from = from.toLowerCase();
                log.printMessage(Log.ALWAYS, msg);
-               for (LivingThing lt : playersByName.values()) {
+               for (LivingThing lt: playersByName.values()) {
                        if (lt.clan.equals(clan)
                        if (lt.clan.equals(clan)
-                                       && !lt.ignoreList.contains(from)) {
+                               && !lt.ignoreList.contains(from)) {
                                lt.chatMessage(msg);
                        }
                }
                                lt.chatMessage(msg);
                        }
                }
@@ -760,10 +817,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
        public void refreshEntities(LivingThing refresh) {
                LinkedList<DuskObject> newEntities = new LinkedList<>();
 
        public void refreshEntities(LivingThing refresh) {
                LinkedList<DuskObject> newEntities = new LinkedList<>();
 
-               for (TileMap.MapData md : refresh.map.range(refresh.x, refresh.y, viewrange)) {
+               for (TileMap.MapData md: refresh.map.range(refresh.x, refresh.y, viewrange)) {
                        if (!md.entities.isEmpty()
                        if (!md.entities.isEmpty()
-                                       && canSeeTo(refresh, md.x, md.y)) {
-                               for (DuskObject o : md.entities) {
+                               && canSeeTo(refresh, md.x, md.y)) {
+                               for (DuskObject o: md.entities) {
                                        newEntities.add(o);
                                        //old = thnRefresh.removeEntity(objStore.ID);
                                        //for (i4 = 0; i4 < thnRefresh.nearEntities.size(); i4++) {
                                        newEntities.add(o);
                                        //old = thnRefresh.removeEntity(objStore.ID);
                                        //for (i4 = 0; i4 < thnRefresh.nearEntities.size(); i4++) {
@@ -775,13 +832,13 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                        //      }
                                        //}
                                        if (o.isPlayerMerchant()) {
                                        //      }
                                        //}
                                        if (o.isPlayerMerchant()) {
-                                               PlayerMerchant shop = (PlayerMerchant) o;
+                                               PlayerMerchant shop = (PlayerMerchant)o;
                                                if (refresh.x == shop.x && refresh.y == shop.y) {
                                                        TransactionMessage tm = new TransactionMessage(MSG_UPDATE_MERCHANT);
 
                                                if (refresh.x == shop.x && refresh.y == shop.y) {
                                                        TransactionMessage tm = new TransactionMessage(MSG_UPDATE_MERCHANT);
 
-                                                       for (String name : shop.vctItems.keySet()) {
+                                                       for (String name: shop.vctItems.keySet()) {
                                                                LinkedList<Item> vctStore = shop.vctItems.get(name);
                                                                LinkedList<Item> vctStore = shop.vctItems.get(name);
-                                                               Item item = (Item) vctStore.element();
+                                                               Item item = (Item)vctStore.element();
                                                                int intCost = (item.intCost * 3) / 4;
 
                                                                if (refresh.name.equalsIgnoreCase(shop.strOwner)) {
                                                                int intCost = (item.intCost * 3) / 4;
 
                                                                if (refresh.name.equalsIgnoreCase(shop.strOwner)) {
@@ -794,10 +851,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                                }
                                        }
                                        if (o.isMerchant()) {
                                                }
                                        }
                                        if (o.isMerchant()) {
-                                               Merchant merchant = (Merchant) o;
+                                               Merchant merchant = (Merchant)o;
                                                if (refresh.x == merchant.x && refresh.y == merchant.y) {
                                                        HashMap<String, TransactionItem> items = new HashMap<>();
                                                if (refresh.x == merchant.x && refresh.y == merchant.y) {
                                                        HashMap<String, TransactionItem> items = new HashMap<>();
-                                                       for (String itemname : merchant.items) {
+                                                       for (String itemname: merchant.items) {
                                                                TransactionItem titem = items.get(itemname);
                                                                if (titem == null) {
                                                                        Item item = getItem(itemname);
                                                                TransactionItem titem = items.get(itemname);
                                                                if (titem == null) {
                                                                        Item item = getItem(itemname);
@@ -849,16 +906,16 @@ public class DuskEngine implements Runnable, DuskProtocol {
        // FIXME: move to map or livingthing?
        @Deprecated
        public void addEntity(TileMap map, DuskObject add) {
        // FIXME: move to map or livingthing?
        @Deprecated
        public void addEntity(TileMap map, DuskObject add) {
-               for (TileMap.MapData md : map.range(add.x, add.y, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: map.range(add.x, add.y, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       LivingThing lt = (LivingThing) o;
+                                       LivingThing lt = (LivingThing)o;
                                        if (lt.isPlayer()) {
                                                // FIXME: see if this can be merged with updateEntity() above
 
                                                if (canSeeTo(lt, add.x, add.y)) {
                                                        if ((!add.isLivingThing()
                                        if (lt.isPlayer()) {
                                                // FIXME: see if this can be merged with updateEntity() above
 
                                                if (canSeeTo(lt, add.x, add.y)) {
                                                        if ((!add.isLivingThing()
-                                                                       || canSeeLivingThing(lt, (LivingThing) add))) {
+                                                               || canSeeLivingThing(lt, (LivingThing)add))) {
                                                                lt.addEntity(add);
                                                        }
                                                }
                                                                lt.addEntity(add);
                                                        }
                                                }
@@ -870,11 +927,11 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        public void cleanup() {
                log.printMessage(Log.INFO, "Starting cleanup.");
 
        public void cleanup() {
                log.printMessage(Log.INFO, "Starting cleanup.");
-               for (TileMap map : maps.values()) {
-                       for (TileMap.MapData md : map) {
-                               for (DuskObject o : md.entities) {
+               for (TileMap map: maps.values()) {
+                       for (TileMap.MapData md: map) {
+                               for (DuskObject o: md.entities) {
                                        if (o.isLivingThing()) {
                                        if (o.isLivingThing()) {
-                                               LivingThing lt = (LivingThing) o;
+                                               LivingThing lt = (LivingThing)o;
                                                if (lt.isPlayer()) {
                                                        if (!playersByName.containsKey(lt.name)) {
                                                                log.printMessage(Log.INFO, "**found defunct player at " + md.x + "," + md.y + " during cleanup.");
                                                if (lt.isPlayer()) {
                                                        if (!playersByName.containsKey(lt.name)) {
                                                                log.printMessage(Log.INFO, "**found defunct player at " + md.x + "," + md.y + " during cleanup.");
@@ -899,10 +956,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
        // FIXME: Move to map?
        @Deprecated
        void notifyRemoved(DuskObject remove) {
        // FIXME: Move to map?
        @Deprecated
        void notifyRemoved(DuskObject remove) {
-               for (TileMap.MapData md : remove.map.range(remove.x, remove.y, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: remove.map.range(remove.x, remove.y, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       LivingThing lt = (LivingThing) o;
+                                       LivingThing lt = (LivingThing)o;
 
                                        if (lt.isPlayer()) {
                                                if (canSeeTo(lt, remove.x, remove.y)) {
 
                                        if (lt.isPlayer()) {
                                                if (canSeeTo(lt, remove.x, remove.y)) {
@@ -1041,7 +1098,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                int i;
                Sign sgnStore;
                for (i = 0; i < signList.size(); i++) {
                int i;
                Sign sgnStore;
                for (i = 0; i < signList.size(); i++) {
-                       sgnStore = (Sign) signList.get(i);
+                       sgnStore = (Sign)signList.get(i);
                        if (inName.equals(sgnStore.name)) {
                                return sgnStore;
                        }
                        if (inName.equals(sgnStore.name)) {
                                return sgnStore;
                        }
@@ -1051,7 +1108,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        public LivingThing getPet(String name) {
                // FIXME: hash map?
 
        public LivingThing getPet(String name) {
                // FIXME: hash map?
-               for (LivingThing pet : petList) {
+               for (LivingThing pet: petList) {
                        if (name.equalsIgnoreCase(pet.name)) {
                                return pet;
                        }
                        if (name.equalsIgnoreCase(pet.name)) {
                                return pet;
                        }
@@ -1067,11 +1124,11 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        public Faction getFaction(String name) {
                Faction faction;
 
        public Faction getFaction(String name) {
                Faction faction;
-
-               faction = factionMap.get(name);
+               String key = name.toLowerCase();
+               faction = factionMap.get(key);
                if (faction == null) {
                        faction = new Faction(name, this);
                if (faction == null) {
                        faction = new Faction(name, this);
-                       factionMap.put(name, faction);
+                       factionMap.put(key, faction);
                }
                return faction;
        }
                }
                return faction;
        }
@@ -1079,7 +1136,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
        public LivingThing getMobFromVct(String inName) {
                // FIXME: hash map?
                synchronized (mobList) {
        public LivingThing getMobFromVct(String inName) {
                // FIXME: hash map?
                synchronized (mobList) {
-                       for (Mob mob : mobList) {
+                       for (Mob mob: mobList) {
                                if (mob.name.equals(inName)) {
                                        return mob;
                                }
                                if (mob.name.equals(inName)) {
                                        return mob;
                                }
@@ -1092,18 +1149,24 @@ public class DuskEngine implements Runnable, DuskProtocol {
        Prop getProp(String strName) {
                Prop prpStore = null;
                try {
        Prop getProp(String strName) {
                Prop prpStore = null;
                try {
-                       RandomAccessFile rafPropDef = new RandomAccessFile("defProps/" + strName, "r");
-                       prpStore = new Prop(getID(), strName);
-                       String strStore = rafPropDef.readLine();
-                       while (!(strStore == null || strStore.equals("."))) {
-                               if (strStore.equalsIgnoreCase("description")) {
-                                       prpStore.description = rafPropDef.readLine();
-                               } else if (strStore.equalsIgnoreCase("image")) {
-                                       prpStore.intImage = Integer.parseInt(rafPropDef.readLine());
-                               }
-                               strStore = rafPropDef.readLine();
-                       }
-                       rafPropDef.close();
+                       String key = strName.toLowerCase();
+                       Optional<Path> path = Files.find(Path.of("defProps"), 1, (t, a) -> t.getFileName().toString().toLowerCase().equals(key)).findAny();
+                       if (path.isPresent()) {
+                               RandomAccessFile rafPropDef = new RandomAccessFile(path.get().toFile(), "r");
+                               prpStore = new Prop(getID(), strName);
+                               String strStore = rafPropDef.readLine();
+                               while (!(strStore == null || strStore.equals("."))) {
+                                       if (strStore.equalsIgnoreCase("description")) {
+                                               prpStore.description = rafPropDef.readLine();
+                                       } else if (strStore.equalsIgnoreCase("image")) {
+                                               prpStore.intImage = Integer.parseInt(rafPropDef.readLine());
+                                       }
+                                       strStore = rafPropDef.readLine();
+                               }
+                               rafPropDef.close();
+                       } else {
+                               throw new FileNotFoundException("defProps/" + key);
+                       }
                } catch (Exception e) {
                        log.printError("getProp():While trying to get prop \"" + strName + "\"", e);
                }
                } catch (Exception e) {
                        log.printError("getProp():While trying to get prop \"" + strName + "\"", e);
                }
@@ -1117,7 +1180,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        int i = 0;
                        Prop prpStore;
                        while (true) {
                        int i = 0;
                        Prop prpStore;
                        while (true) {
-                               prpStore = (Prop) propList.get(i);
+                               prpStore = (Prop)propList.get(i);
                                if (prpStore.name.equals(inName)) {
                                        return prpStore;
                                }
                                if (prpStore.name.equals(inName)) {
                                        return prpStore;
                                }
@@ -1136,7 +1199,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        int i = 0;
                        Prop prpStore;
                        while (true) {
                        int i = 0;
                        Prop prpStore;
                        while (true) {
-                               prpStore = (Prop) propList.get(i);
+                               prpStore = (Prop)propList.get(i);
                                if (prpStore.name.equals(inName)) {
                                        //vctProps.remove(i);
                                        removeDuskObject(prpStore);
                                if (prpStore.name.equals(inName)) {
                                        //vctProps.remove(i);
                                        removeDuskObject(prpStore);
@@ -1217,7 +1280,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        String strStore = tokName.nextToken();
                        i = Integer.parseInt(strStore);
                        strStore = inName.substring(strStore.length() + 1, inName.length());
                        String strStore = tokName.nextToken();
                        i = Integer.parseInt(strStore);
                        strStore = inName.substring(strStore.length() + 1, inName.length());
-                       itmStore = (Item) itemList.get(i);
+                       itmStore = (Item)itemList.get(i);
                        if (itmStore.name.equals(strStore)) {
                                return itmStore;
                        }
                        if (itmStore.name.equals(strStore)) {
                                return itmStore;
                        }
@@ -1237,7 +1300,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        String strStore = tokName.nextToken();
                        i = Integer.parseInt(strStore);
                        strStore = inName.substring(strStore.length() + 1, inName.length());
                        String strStore = tokName.nextToken();
                        i = Integer.parseInt(strStore);
                        strStore = inName.substring(strStore.length() + 1, inName.length());
-                       itmStore = (Item) itemList.get(i);
+                       itmStore = (Item)itemList.get(i);
                        if (itmStore.name.equals(strStore)) {
                                //vctItems.remove(i);
                                removeDuskObject(itmStore);
                        if (itmStore.name.equals(strStore)) {
                                //vctItems.remove(i);
                                removeDuskObject(itmStore);
@@ -1251,10 +1314,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        // FIXME: move to map or livinghting?
        void playSound(TileMap map, int sfxid, int locx, int locy) {
 
        // FIXME: move to map or livinghting?
        void playSound(TileMap map, int sfxid, int locx, int locy) {
-               for (TileMap.MapData md : map.range(locx, locy, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: map.range(locx, locy, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       LivingThing lt = (LivingThing) o;
+                                       LivingThing lt = (LivingThing)o;
                                        if (lt.isPlayer()) {
                                                lt.playSFX(sfxid);
                                        }
                                        if (lt.isPlayer()) {
                                                lt.playSFX(sfxid);
                                        }
@@ -1270,14 +1333,14 @@ public class DuskEngine implements Runnable, DuskProtocol {
                Script scrStore;
                boolean blnStore;
 
                Script scrStore;
                boolean blnStore;
 
+               System.out.printf("can move %d,%d\n", inLocX, inLocY);
                if (!lt.map.inside(inLocX, inLocY))
                        return false;
 
                //System.out.printf("can move to: %d,%d tid=%3d on map %s\n", inLocX, inLocY, lt.map.getTile(inLocX, inLocY), lt.map.name);
                if (!lt.map.inside(inLocX, inLocY))
                        return false;
 
                //System.out.printf("can move to: %d,%d tid=%3d on map %s\n", inLocX, inLocY, lt.map.getTile(inLocX, inLocY), lt.map.name);
-
-               for (DuskObject o : lt.map.getEntities(inLocX, inLocY, null)) {
+               for (DuskObject o: lt.map.getEntities(inLocX, inLocY, null)) {
                        if (o.isLivingThing()) {
                        if (o.isLivingThing()) {
-                               thnStore2 = (LivingThing) o;
+                               thnStore2 = (LivingThing)o;
                                if (!canMoveThrougLivingThing(lt, thnStore2))
                                        return false;
                        }
                                if (!canMoveThrougLivingThing(lt, thnStore2))
                                        return false;
                        }
@@ -1289,10 +1352,11 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        scrStore.close();
                        return blnStore;
                } catch (Exception e) {
                        scrStore.close();
                        return blnStore;
                } catch (Exception e) {
+                       //e.printStackTrace();
                }
                try {
                        int tid = lt.map.getTile(inLocX, inLocY);
                }
                try {
                        int tid = lt.map.getTile(inLocX, inLocY);
-                       scrStore = (Script) tileCanMove.get(tid);
+                       scrStore = (Script)tileCanMove.get(tid);
                        synchronized (scrStore) {
                                scrStore.varVariables.clearVariables();
                                scrStore.varVariables.addVariable("trigger", lt);
                        synchronized (scrStore) {
                                scrStore.varVariables.clearVariables();
                                scrStore.varVariables.addVariable("trigger", lt);
@@ -1319,7 +1383,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                } catch (Exception e) {
                }
                try {
                } catch (Exception e) {
                }
                try {
-                       script = (Script) tileCanSee.get((int) lt.map.getTile(inLocX, inLocY));
+                       script = (Script)tileCanSee.get((int)lt.map.getTile(inLocX, inLocY));
                        synchronized (script) {
                                script.varVariables.clearVariables();
                                script.varVariables.addVariable("trigger", lt);
                        synchronized (script) {
                                script.varVariables.clearVariables();
                                script.varVariables.addVariable("trigger", lt);
@@ -1344,7 +1408,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        return true;
                }
 
                        return true;
                }
 
-               for (TileMap.MapData md : lt.map.look(lt.x, lt.y, destX, destY)) {
+               for (TileMap.MapData md: lt.map.look(lt.x, lt.y, destX, destY)) {
                        if (!canSee(lt, md.x, md.y))
                                return false;
                }
                        if (!canSee(lt, md.x, md.y))
                                return false;
                }
@@ -1436,10 +1500,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
        }
 
        void updateMap(LivingThing thing, int locx, int locy) {
        }
 
        void updateMap(LivingThing thing, int locx, int locy) {
-               for (TileMap.MapData md : thing.map.range(locx, locy, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: thing.map.range(locx, locy, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       LivingThing lt = (LivingThing) o;
+                                       LivingThing lt = (LivingThing)o;
                                        if (lt.isPlayer()) {
                                                lt.updateMap();
                                        }
                                        if (lt.isPlayer()) {
                                                lt.updateMap();
                                        }
@@ -1452,7 +1516,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
        synchronized void resizeMap(TileMap map, int x, int y) {
                map.resize(x, y);
                // FIXME: only the map that changed
        synchronized void resizeMap(TileMap map, int x, int y) {
                map.resize(x, y);
                // FIXME: only the map that changed
-               for (LivingThing thing : playersByName.values()) {
+               for (LivingThing thing: playersByName.values()) {
                        thing.initMap();
                }
                blnMapHasChanged = true;
                        thing.initMap();
                }
                blnMapHasChanged = true;
@@ -1473,7 +1537,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        File deleteme;
                        RandomAccessFile rafFile;
                        int i,
                        File deleteme;
                        RandomAccessFile rafFile;
                        int i,
-                                       i2;
+                               i2;
                        if (blnMapHasChanged) {
                                System.err.println("save map not implemented");
                                log.printMessage(Log.ALWAYS, "Saving map...");
                        if (blnMapHasChanged) {
                                System.err.println("save map not implemented");
                                log.printMessage(Log.ALWAYS, "Saving map...");
@@ -1491,7 +1555,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                        deleteme = new File("mobs");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("mobs", "rw");
                                        deleteme = new File("mobs");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("mobs", "rw");
-                                       for (Mob mob : mobList) {
+                                       for (Mob mob: mobList) {
                                                if (mob.blnOneUse == false) {
                                                        if (mob.level == -1) {
                                                                rafFile.writeBytes("mob2.3\n" + mob.name + "\n" + mob.originalX + "\n" + mob.originalY + "\n");
                                                if (mob.blnOneUse == false) {
                                                        if (mob.level == -1) {
                                                                rafFile.writeBytes("mob2.3\n" + mob.name + "\n" + mob.originalX + "\n" + mob.originalY + "\n");
@@ -1511,7 +1575,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                        deleteme = new File("signs");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("signs", "rw");
                                        deleteme = new File("signs");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("signs", "rw");
-                                       for (Sign sign : signList) {
+                                       for (Sign sign: signList) {
                                                rafFile.writeBytes(sign.strMessage + "\n" + sign.x + "\n" + sign.y + "\n");
                                        }
                                        rafFile.close();
                                                rafFile.writeBytes(sign.strMessage + "\n" + sign.x + "\n" + sign.y + "\n");
                                        }
                                        rafFile.close();
@@ -1526,10 +1590,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                        deleteme.delete();
                                        try (RandomAccessFile out = new RandomAccessFile("merchants", "rw")) {
                                                // FIXME: i/o on object
                                        deleteme.delete();
                                        try (RandomAccessFile out = new RandomAccessFile("merchants", "rw")) {
                                                // FIXME: i/o on object
-                                               for (Merchant m : merchantList) {
+                                               for (Merchant m: merchantList) {
                                                        out.writeBytes(m.x + "\n" + m.y + "\n");
                                                        for (i2 = 0; i2 < m.items.size(); i2++) {
                                                        out.writeBytes(m.x + "\n" + m.y + "\n");
                                                        for (i2 = 0; i2 < m.items.size(); i2++) {
-                                                               out.writeBytes((String) m.items.get(i2) + "\n");
+                                                               out.writeBytes((String)m.items.get(i2) + "\n");
                                                        }
                                                        out.writeBytes("end\n");
                                                }
                                                        }
                                                        out.writeBytes("end\n");
                                                }
@@ -1544,7 +1608,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                        deleteme = new File("props");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("props", "rw");
                                        deleteme = new File("props");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("props", "rw");
-                                       for (Prop prop : propList) {
+                                       for (Prop prop: propList) {
                                                rafFile.writeBytes(prop.name + "\n" + prop.x + "\n" + prop.y + "\n");
                                        }
                                        rafFile.close();
                                                rafFile.writeBytes(prop.name + "\n" + prop.x + "\n" + prop.y + "\n");
                                        }
                                        rafFile.close();
@@ -1558,7 +1622,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                        deleteme = new File("globals");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("globals", "rw");
                                        deleteme = new File("globals");
                                        deleteme.delete();
                                        rafFile = new RandomAccessFile("globals", "rw");
-                                       for (Variable varStore : varVariables.vctVariables.values()) {
+                                       for (Variable varStore: varVariables.vctVariables.values()) {
                                                if (varStore.isString() || varStore.isNumber()) {
                                                        rafFile.writeBytes(varStore.strName + "\n");
                                                        rafFile.writeBytes(varStore.bytType + "\n");
                                                if (varStore.isString() || varStore.isNumber()) {
                                                        rafFile.writeBytes(varStore.strName + "\n");
                                                        rafFile.writeBytes(varStore.bytType + "\n");
@@ -1593,12 +1657,11 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                int i, i2;
 
                                //      map.saveMap(new File("backup/shortmap.backup"));
                                int i, i2;
 
                                //      map.saveMap(new File("backup/shortmap.backup"));
-
                                deleteme = new File("backup/mobs.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/mobs.backup", "rw");
                                synchronized (mobList) {
                                deleteme = new File("backup/mobs.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/mobs.backup", "rw");
                                synchronized (mobList) {
-                                       for (Mob mob : mobList) {
+                                       for (Mob mob: mobList) {
                                                if (mob.blnOneUse == false) {
                                                        tknStore = new StringTokenizer(mob.name, " ");
                                                        rafFile.writeBytes(tknStore.nextToken() + "\n" + mob.level + "\n" + mob.originalX + "\n" + mob.originalY + "\n");
                                                if (mob.blnOneUse == false) {
                                                        tknStore = new StringTokenizer(mob.name, " ");
                                                        rafFile.writeBytes(tknStore.nextToken() + "\n" + mob.level + "\n" + mob.originalX + "\n" + mob.originalY + "\n");
@@ -1610,7 +1673,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                deleteme = new File("backup/signs.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/signs.backup", "rw");
                                deleteme = new File("backup/signs.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/signs.backup", "rw");
-                               for (Sign sign : signList) {
+                               for (Sign sign: signList) {
                                        rafFile.writeBytes(sign.strMessage + "\n" + sign.x + "\n" + sign.y + "\n");
                                }
                                rafFile.close();
                                        rafFile.writeBytes(sign.strMessage + "\n" + sign.x + "\n" + sign.y + "\n");
                                }
                                rafFile.close();
@@ -1618,10 +1681,10 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                deleteme = new File("backup/merchants.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/merchants.backup", "rw");
                                deleteme = new File("backup/merchants.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/merchants.backup", "rw");
-                               for (Merchant m : merchantList) {
+                               for (Merchant m: merchantList) {
                                        rafFile.writeBytes(m.x + "\n" + m.y + "\n");
                                        for (i2 = 0; i2 < m.items.size(); i2++) {
                                        rafFile.writeBytes(m.x + "\n" + m.y + "\n");
                                        for (i2 = 0; i2 < m.items.size(); i2++) {
-                                               rafFile.writeBytes((String) m.items.get(i2) + "\n");
+                                               rafFile.writeBytes((String)m.items.get(i2) + "\n");
                                        }
                                        rafFile.writeBytes("end\n");
                                }
                                        }
                                        rafFile.writeBytes("end\n");
                                }
@@ -1630,7 +1693,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                deleteme = new File("backup/props.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/props.backup", "rw");
                                deleteme = new File("backup/props.backup");
                                deleteme.delete();
                                rafFile = new RandomAccessFile("backup/props.backup", "rw");
-                               for (Prop prop : propList) {
+                               for (Prop prop: propList) {
                                        rafFile.writeBytes(prop.name + "\n" + prop.x + "\n" + prop.y + "\n");
                                }
                                rafFile.close();
                                        rafFile.writeBytes(prop.name + "\n" + prop.x + "\n" + prop.y + "\n");
                                }
                                rafFile.close();
@@ -1653,29 +1716,30 @@ public class DuskEngine implements Runnable, DuskProtocol {
        }
 
        public void addDuskObject(TileMap map, DuskObject obj) {
        }
 
        public void addDuskObject(TileMap map, DuskObject obj) {
+               System.out.printf("xx add '%s' %d %d\n", obj.name, obj.x, obj.y);
                if (obj.isLivingThing()) {
                if (obj.isLivingThing()) {
-                       LivingThing lt = (LivingThing) obj;
+                       LivingThing lt = (LivingThing)obj;
                        if (!lt.isLoaded) {
                                return;
                        }
                        if (obj instanceof Mob) {
                                synchronized (mobList) {
                        if (!lt.isLoaded) {
                                return;
                        }
                        if (obj instanceof Mob) {
                                synchronized (mobList) {
-                                       mobList.add((Mob) obj);
+                                       mobList.add((Mob)obj);
                                }
                                blnMobListChanged = true;
                        } else if (lt.isPet()) {
                                petList.add(lt);
                        }
                } else if (obj.isItem()) {
                                }
                                blnMobListChanged = true;
                        } else if (lt.isPet()) {
                                petList.add(lt);
                        }
                } else if (obj.isItem()) {
-                       itemList.add((Item) obj);
+                       itemList.add((Item)obj);
                } else if (obj.isSign()) {
                } else if (obj.isSign()) {
-                       signList.add((Sign) obj);
+                       signList.add((Sign)obj);
                        blnSignListChanged = true;
                } else if (obj.isMerchant()) {
                        blnSignListChanged = true;
                } else if (obj.isMerchant()) {
-                       merchantList.add((Merchant) obj);
+                       merchantList.add((Merchant)obj);
                        blnMerchantListChanged = true;
                } else if (obj.isProp()) {
                        blnMerchantListChanged = true;
                } else if (obj.isProp()) {
-                       propList.add((Prop) obj);
+                       propList.add((Prop)obj);
                        blnPropListChanged = true;
                }
 
                        blnPropListChanged = true;
                }
 
@@ -1686,7 +1750,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
        /**
         * When a mob is killed, it isn't really removed, but the player needs
         * to know about it.
        /**
         * When a mob is killed, it isn't really removed, but the player needs
         * to know about it.
-        *
+        * <p>
         * This 'cheats' by removing it from the game but temporarily
         * corrupting the mob index.
         *
         * This 'cheats' by removing it from the game but temporarily
         * corrupting the mob index.
         *
@@ -1698,8 +1762,9 @@ public class DuskEngine implements Runnable, DuskProtocol {
        }
 
        public void removeDuskObject(DuskObject obj) {
        }
 
        public void removeDuskObject(DuskObject obj) {
+               System.out.printf("xx rem '%s' %d %d\n", obj.name, obj.x, obj.y);
                if (obj.isLivingThing()) {
                if (obj.isLivingThing()) {
-                       LivingThing lt = (LivingThing) obj;
+                       LivingThing lt = (LivingThing)obj;
                        if (!lt.isLoaded) {
                                return;
                        }
                        if (!lt.isLoaded) {
                                return;
                        }
@@ -1730,7 +1795,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        /**
         * Move a living thing, updating any other living things within range.
 
        /**
         * Move a living thing, updating any other living things within range.
-        *
+        * <p>
         * Only moves wihin the same map
         *
         * @param thing
         * Only moves wihin the same map
         *
         * @param thing
@@ -1740,14 +1805,14 @@ public class DuskEngine implements Runnable, DuskProtocol {
         */
        // FIXME: after moving here now i think this probably needs to be moved back to livingthing ...
        public void moveDuskObject(LivingThing thing, int inlocx, int inlocy, byte dir) {
         */
        // FIXME: after moving here now i think this probably needs to be moved back to livingthing ...
        public void moveDuskObject(LivingThing thing, int inlocx, int inlocy, byte dir) {
-               for (TileMap.MapData md : thing.map.range(thing.x, thing.y, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: thing.map.range(thing.x, thing.y, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       LivingThing lt = (LivingThing) o;
+                                       LivingThing lt = (LivingThing)o;
                                        if (lt.isPlayer()) {
                                                boolean canSee = canSeeTo(lt, inlocx, inlocy)
                                        if (lt.isPlayer()) {
                                                boolean canSee = canSeeTo(lt, inlocx, inlocy)
-                                                               && (!thing.isLivingThing()
-                                                               || canSeeLivingThing(lt, thing));
+                                                       && (!thing.isLivingThing()
+                                                       || canSeeLivingThing(lt, thing));
 
                                                if (canSee) {
                                                        // Add/update it if now visible
 
                                                if (canSee) {
                                                        // Add/update it if now visible
@@ -1759,7 +1824,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                                }
                                        } else if (lt.isMob()) {
                                                // Is this true?
                                                }
                                        } else if (lt.isMob()) {
                                                // Is this true?
-                                               Mob thnMob = (Mob) lt;
+                                               Mob thnMob = (Mob)lt;
                                                thnMob.blnCanSeePlayer = true;
                                        }
                                }
                                                thnMob.blnCanSeePlayer = true;
                                        }
                                }
@@ -1775,7 +1840,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        /**
         * Find a visible object of the given name.
 
        /**
         * Find a visible object of the given name.
-        *
+        * <p>
         * Name may also be the id.
         *
         * @param thing
         * Name may also be the id.
         *
         * @param thing
@@ -1808,13 +1873,13 @@ public class DuskEngine implements Runnable, DuskProtocol {
                }
                //Search surrounding area
 
                }
                //Search surrounding area
 
-               for (TileMap.MapData md : thing.map.range(thing.x, thing.y, viewrange)) {
-                       for (DuskObject o : md.entities) {
+               for (TileMap.MapData md: thing.map.range(thing.x, thing.y, viewrange)) {
+                       for (DuskObject o: md.entities) {
                                if (byid == o.ID
                                if (byid == o.ID
-                                               || (byid == -1 && o.name.equalsIgnoreCase(name))) {
+                                       || (byid == -1 && o.name.equalsIgnoreCase(name))) {
                                        if ((!o.isLivingThing()
                                        if ((!o.isLivingThing()
-                                                       || canSeeLivingThing(thing, (LivingThing) o))
-                                                       && canSeeTo(thing, o.x, o.y)) {
+                                               || canSeeLivingThing(thing, (LivingThing)o))
+                                               && canSeeTo(thing, o.x, o.y)) {
                                                if (number == 0) {
                                                        return o;
                                                } else {
                                                if (number == 0) {
                                                        return o;
                                                } else {
@@ -1833,12 +1898,12 @@ public class DuskEngine implements Runnable, DuskProtocol {
                log.printMessage(Log.ALWAYS, "Player ticks = " + lngPlayerTicks);
                log.printMessage(Log.ALWAYS, "Starting Ticks");
                int tick = 0,
                log.printMessage(Log.ALWAYS, "Player ticks = " + lngPlayerTicks);
                log.printMessage(Log.ALWAYS, "Starting Ticks");
                int tick = 0,
-                               i;
+                       i;
                LivingThing thnStore,
                LivingThing thnStore,
-                               thnStore2;
+                       thnStore2;
                Battle batStore;
                long lngTime = System.currentTimeMillis(),
                Battle batStore;
                long lngTime = System.currentTimeMillis(),
-                               lngPause = 0;
+                       lngPause = 0;
                while (true) {
                        try {
                                //250 milliseconds per tick
                while (true) {
                        try {
                                //250 milliseconds per tick
@@ -1848,7 +1913,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                }
                                lngTime = System.currentTimeMillis();
                                if (tick % 73 == 0) {
                                }
                                lngTime = System.currentTimeMillis();
                                if (tick % 73 == 0) {
-                                       for (LivingThing pet : petList) {
+                                       for (LivingThing pet: petList) {
                                                if (pet.battle == null) {
                                                        if (pet.isSleeping) {
                                                                pet.hp += 3 + (pet.cons + pet.consbon);
                                                if (pet.battle == null) {
                                                        if (pet.isSleeping) {
                                                                pet.hp += 3 + (pet.cons + pet.consbon);
@@ -1885,11 +1950,11 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                                pet.savePlayer();
                                        }
                                }
                                                pet.savePlayer();
                                        }
                                }
-                               for (LivingThing pet : petList) {
+                               for (LivingThing pet: petList) {
                                        pet.moveTick();
                                }
                                //Following code submitted by Randall Leeds, revised by Tom Weingarten:
                                        pet.moveTick();
                                }
                                //Following code submitted by Randall Leeds, revised by Tom Weingarten:
-                               for (LivingThing lt : playersByName.values()) {
+                               for (LivingThing lt: playersByName.values()) {
                                        if (!lt.isWorking) {
                                                //thnStore.closeNoMsgPlayer();
                                                continue;
                                        if (!lt.isWorking) {
                                                //thnStore.closeNoMsgPlayer();
                                                continue;
@@ -1931,7 +1996,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
                                if (tick % 10 == 0) {
                                        for (i = 0; i < battleList.size(); i++) {
 
                                if (tick % 10 == 0) {
                                        for (i = 0; i < battleList.size(); i++) {
-                                               batStore = (Battle) battleList.get(i);
+                                               batStore = (Battle)battleList.get(i);
                                                if (batStore.blnRunning == false) {
                                                        battleList.remove(i);
                                                        i--;
                                                if (batStore.blnRunning == false) {
                                                        battleList.remove(i);
                                                        i--;
@@ -1943,7 +2008,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                if (tick > 72) {
                                        tick = 0;
                                        synchronized (mobList) {
                                if (tick > 72) {
                                        tick = 0;
                                        synchronized (mobList) {
-                                               for (Mob mob : mobList) {
+                                               for (Mob mob: mobList) {
                                                        if (mob.battle == null) {
                                                                // FIXME: magic number
                                                                if (mob.x != -6) {
                                                        if (mob.battle == null) {
                                                                // FIXME: magic number
                                                                if (mob.x != -6) {
@@ -1967,7 +2032,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                                                        }
                                                }
                                        }
                                                        }
                                                }
                                        }
-                                       for (Faction f : factionMap.values()) {
+                                       for (Faction f: factionMap.values()) {
                                                f.saveFactionData();;
                                        }
                                }
                                                f.saveFactionData();;
                                        }
                                }
@@ -2074,7 +2139,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
 
        /**
         * This registers a new player atomically.
 
        /**
         * This registers a new player atomically.
-        *
+        * <p>
         * Any existing player with the same name is booted
         */
        public void registerPlayer(LivingThing lt, String name) throws BlockedIPException {
         * Any existing player with the same name is booted
         */
        public void registerPlayer(LivingThing lt, String name) throws BlockedIPException {
@@ -2083,7 +2148,7 @@ public class DuskEngine implements Runnable, DuskProtocol {
                        if (blnIPF) {
                                String address = lt.getAddress();
 
                        if (blnIPF) {
                                String address = lt.getAddress();
 
-                               for (LivingThing thing : playersByName.values()) {
+                               for (LivingThing thing: playersByName.values()) {
                                        if (thing.getAddress().equalsIgnoreCase(address)) {
                                                throw new BlockedIPException("Already a player connected from your address");
                                        }
                                        if (thing.getAddress().equalsIgnoreCase(address)) {
                                                throw new BlockedIPException("Already a player connected from your address");
                                        }
index 663b871..ab692fa 100644 (file)
@@ -29,6 +29,9 @@ import duskz.server.entity.DuskObject;
 import java.io.*;
 import java.util.Vector;
 import java.lang.Math;
 import java.io.*;
 import java.util.Vector;
 import java.lang.Math;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Optional;
 
 /**
  * a Faction represents a group of mobs.
 
 /**
  * a Faction represents a group of mobs.
@@ -52,15 +55,22 @@ public class Faction {
        void parseFactionData() {
                RandomAccessFile rafFile = null;
                try {
        void parseFactionData() {
                RandomAccessFile rafFile = null;
                try {
-                       rafFile = new RandomAccessFile("factions/" + strName, "r");
-                       String strStore = rafFile.readLine();
-                       while (!(strStore == null || strStore.equals("."))) {
-                               if (strStore.equalsIgnoreCase("relation")) {
-                                       vctRelations.addElement(new Relation(rafFile.readLine().toLowerCase(), Double.valueOf(rafFile.readLine()).doubleValue()));
+                       // perform case insenitive lookup to match windows filesystem
+                       String key = strName.toLowerCase();
+                       Optional<Path> path = Files.find(Path.of("factions"), 1, (t, a) -> t.getFileName().toString().toLowerCase().equals(key)).findAny();
+                       if (path.isPresent()) {
+                               rafFile = new RandomAccessFile(path.get().toFile(), "r");
+                               String strStore = rafFile.readLine();
+                               while (!(strStore == null || strStore.equals("."))) {
+                                       if (strStore.equalsIgnoreCase("relation")) {
+                                               vctRelations.addElement(new Relation(rafFile.readLine().toLowerCase(), Double.valueOf(rafFile.readLine()).doubleValue()));
+                                       }
+                                       strStore = rafFile.readLine();
                                }
                                }
-                               strStore = rafFile.readLine();
+                               rafFile.close();
+                       } else {
+                               throw new FileNotFoundException("factions/" + key);
                        }
                        }
-                       rafFile.close();
                } catch (Exception e) {
                        game.log.printError("parseFactionData()", e);
                }
                } catch (Exception e) {
                        game.log.printError("parseFactionData()", e);
                }
@@ -79,7 +89,7 @@ public class Faction {
                        rafFile = new RandomAccessFile("factions/" + strName, "rw");
                        Relation relStore;
                        for (i = 0; i < vctRelations.size(); i++) {
                        rafFile = new RandomAccessFile("factions/" + strName, "rw");
                        Relation relStore;
                        for (i = 0; i < vctRelations.size(); i++) {
-                               relStore = (Relation) vctRelations.elementAt(i);
+                               relStore = (Relation)vctRelations.elementAt(i);
                                rafFile.writeBytes("relation\n" + relStore.strName.toLowerCase() + "\n" + relStore.dblLevel + "\n");
                        }
                        rafFile.writeBytes(".\n");
                                rafFile.writeBytes("relation\n" + relStore.strName.toLowerCase() + "\n" + relStore.dblLevel + "\n");
                        }
                        rafFile.writeBytes(".\n");
@@ -93,7 +103,7 @@ public class Faction {
        double getRelationValue(String strName) {
                Relation relStore;
                for (int i = 0; i < vctRelations.size(); i++) {
        double getRelationValue(String strName) {
                Relation relStore;
                for (int i = 0; i < vctRelations.size(); i++) {
-                       relStore = (Relation) vctRelations.elementAt(i);
+                       relStore = (Relation)vctRelations.elementAt(i);
                        if (strName.equalsIgnoreCase(relStore.strName)) {
                                if (i > 100) {
                                        vctRelations.removeElementAt(i);
                        if (strName.equalsIgnoreCase(relStore.strName)) {
                                if (i > 100) {
                                        vctRelations.removeElementAt(i);
@@ -108,7 +118,7 @@ public class Faction {
        Relation getRelation(String strName) {
                Relation relStore;
                for (int i = 0; i < vctRelations.size(); i++) {
        Relation getRelation(String strName) {
                Relation relStore;
                for (int i = 0; i < vctRelations.size(); i++) {
-                       relStore = (Relation) vctRelations.elementAt(i);
+                       relStore = (Relation)vctRelations.elementAt(i);
                        if (strName.equalsIgnoreCase(relStore.strName)) {
                                if (i > 100) {
                                        vctRelations.removeElementAt(i);
                        if (strName.equalsIgnoreCase(relStore.strName)) {
                                if (i > 100) {
                                        vctRelations.removeElementAt(i);
@@ -174,17 +184,16 @@ public class Faction {
                }
 
                // FIXME: can this be moved to DuskEngine somehow?
                }
 
                // FIXME: can this be moved to DuskEngine somehow?
-
                //Default AI
                int intConfidence = 0;
                LivingThing enemy = null;
                Mob mobStore;
                double enemyrelation = 0;
                boolean visiblePlayer = false;
                //Default AI
                int intConfidence = 0;
                LivingThing enemy = null;
                Mob mobStore;
                double enemyrelation = 0;
                boolean visiblePlayer = false;
-               for (MapData md : mob.map.range(mob.x, mob.y, game.viewrange - 1)) {
-                       for (DuskObject o : md.entities) {
+               for (MapData md: mob.map.range(mob.x, mob.y, game.viewrange - 1)) {
+                       for (DuskObject o: md.entities) {
                                if (o.isLivingThing()) {
                                if (o.isLivingThing()) {
-                                       LivingThing lt = (LivingThing) o;
+                                       LivingThing lt = (LivingThing)o;
                                        boolean visible = game.canSeeLivingThing(mob, lt);
 
                                        if (visible && game.canSeeTo(mob, lt.x, lt.y)) {
                                        boolean visible = game.canSeeLivingThing(mob, lt);
 
                                        if (visible && game.canSeeTo(mob, lt.x, lt.y)) {
@@ -212,7 +221,7 @@ public class Faction {
                                                if (lt.isMob()) {
                                                        double relation;
 
                                                if (lt.isMob()) {
                                                        double relation;
 
-                                                       mobStore = (Mob) lt;
+                                                       mobStore = (Mob)lt;
                                                        if (mobStore.name.equals(mob.name)) {
                                                                relation = mobStore.dblGroupRelation;
                                                        } else {
                                                        if (mobStore.name.equals(mob.name)) {
                                                                relation = mobStore.dblGroupRelation;
                                                        } else {
@@ -289,15 +298,15 @@ public class Faction {
                }
 
                //If no enemies
                }
 
                //If no enemies
-               if ((int) (Math.random() * 25) == 1) {
-                       if ((int) (Math.random() * 2) == 1) {
-                               if ((int) (Math.random() * 2) == 1) {
+               if ((int)(Math.random() * 25) == 1) {
+                       if ((int)(Math.random() * 2) == 1) {
+                               if ((int)(Math.random() * 2) == 1) {
                                        mob.moveE();
                                } else {
                                        mob.moveW();
                                }
                        } else {
                                        mob.moveE();
                                } else {
                                        mob.moveW();
                                }
                        } else {
-                               if ((int) (Math.random() * 2) == 1) {
+                               if ((int)(Math.random() * 2) == 1) {
                                        mob.moveS();
                                } else {
                                        mob.moveN();
                                        mob.moveS();
                                } else {
                                        mob.moveN();
index 5281e4d..5c53d3e 100644 (file)
@@ -252,6 +252,7 @@ public class Script {
        }
 
        public void runScript() {
        }
 
        public void runScript() {
+               engGame.log.printMessage(Log.DEBUG, "Executing script " + strName);
                rewindScript();
                vctUpdate = new Vector(0);
                vctVisibleUpdate = new Vector(0);
                rewindScript();
                vctUpdate = new Vector(0);
                vctVisibleUpdate = new Vector(0);
@@ -317,7 +318,9 @@ public class Script {
 
        public boolean rewindAndParseScript() {
                rewindScript();
 
        public boolean rewindAndParseScript() {
                rewindScript();
-               return parseScript();
+               boolean ok = parseScript();
+               engGame.log.printMessage(Log.DEBUG, "Executing boolean script " + strName + "=" + ok);
+               return ok;
        }
 
        String readScriptForCompile()
        }
 
        String readScriptForCompile()
@@ -1184,25 +1187,22 @@ public class Script {
                                        return false;
                                }
                                case 29: {
                                        return false;
                                }
                                case 29: {
-                                       // These all need a map-name as well
-                                       System.err.println("create mob not implemented");
+                                       // Multi map: These all need a map-name as well
                                        Mob mobStore = new Mob(getString(), (int) parseValue(), (int) parseValue(), engGame);
                                        Mob mobStore = new Mob(getString(), (int) parseValue(), (int) parseValue(), engGame);
-                                       //engGame.addDuskObject(mobStore);
+                                       engGame.addDuskObject(((LivingThing)varVariables.getVariable("trigger").objData).map, mobStore);
                                        return true;
                                }
                                case 30: {
                                        return true;
                                }
                                case 30: {
-                                       System.err.println("create mob one use not implemented");
                                        Mob mobStore = new Mob(getString(), (int) parseValue(), (int) parseValue(), engGame);
                                        mobStore.blnOneUse = true;
                                        Mob mobStore = new Mob(getString(), (int) parseValue(), (int) parseValue(), engGame);
                                        mobStore.blnOneUse = true;
-                                       //engGame.addDuskObject(mobStore);
+                                       engGame.addDuskObject(((LivingThing)varVariables.getVariable("trigger").objData).map, mobStore);
                                        return true;
                                }
                                case 31: {
                                        return true;
                                }
                                case 31: {
-                                       System.err.println("create item not implemented");
                                        Item itmStore = engGame.getItem(getString());
                                        itmStore.x = (int) parseValue();
                                        itmStore.y = (int) parseValue();
                                        Item itmStore = engGame.getItem(getString());
                                        itmStore.x = (int) parseValue();
                                        itmStore.y = (int) parseValue();
-                                       //engGame.addDuskObject(itmStore);
+                                       engGame.addDuskObject(((LivingThing)varVariables.getVariable("trigger").objData).map, itmStore);
                                        return true;
                                }
                                case 59: {
                                        return true;
                                }
                                case 59: {
@@ -1699,16 +1699,15 @@ public class Script {
                                case 46: {
                                        int dbgX, dbgY;
                                        short dbgValue;
                                case 46: {
                                        int dbgX, dbgY;
                                        short dbgValue;
+                                       LivingThing thing = (LivingThing)varVariables.getVariable("trigger").objData;
                                        dbgX = (int) parseValue();
                                        dbgY = (int) parseValue();
                                        dbgValue = (short) parseValue();
                                        if (dbgValue == 0) {
                                                engGame.log.printMessage(Log.DEBUG, "Script " + strName + " called changeMap with 0 at " + dbgX + "," + dbgY);
                                        }
                                        dbgX = (int) parseValue();
                                        dbgY = (int) parseValue();
                                        dbgValue = (short) parseValue();
                                        if (dbgValue == 0) {
                                                engGame.log.printMessage(Log.DEBUG, "Script " + strName + " called changeMap with 0 at " + dbgX + "," + dbgY);
                                        }
-//                                     engGame.changeMap((int)parseValue(),(int)parseValue(),(short)parseValue());
-                                       // FIXME: 
-                                       throw new UnsupportedOperationException("script changemap not implemented");
-                                       //engGame.changeMap(dbgX, dbgY, dbgValue);
+                                       engGame.changeMap(thing, (int)parseValue(),(int)parseValue(),(short)parseValue());
+                                       engGame.changeMap(thing, dbgX, dbgY, dbgValue);
                                }
                                case 47: {
                                        String strOne = getString();
                                }
                                case 47: {
                                        String strOne = getString();
@@ -1749,7 +1748,8 @@ public class Script {
                                        //LivingThing thnStore = getLivingThing(getString());
                                        //engGame.notifyRemoved(thnStore);
                                        //engGame.addEntity(thnStore);
                                        //LivingThing thnStore = getLivingThing(getString());
                                        //engGame.notifyRemoved(thnStore);
                                        //engGame.addEntity(thnStore);
-                                       return true;
+                                       throw new UnsupportedOperationException("script token 49 not implemented");
+                                       //return true;
                                }
                                case 50: {
                                        LivingThing thnStore = getLivingThing(getString());
                                }
                                case 50: {
                                        LivingThing thnStore = getLivingThing(getString());
@@ -1774,6 +1774,7 @@ public class Script {
                                        return true;
                                }
                                case 52: {
                                        return true;
                                }
                                case 52: {
+                                       throw new UnsupportedOperationException("view text not implemented");
                                        // FIXME: This is the VIEW_TEXT command
                                        /*
                                         LivingThing thnStore = getLivingThing(getString());
                                        // FIXME: This is the VIEW_TEXT command
                                        /*
                                         LivingThing thnStore = getLivingThing(getString());
@@ -1791,7 +1792,7 @@ public class Script {
                                         thnStore.send(strStore2 + "\n");
                                         thnStore.send("--EOF--\n");
                                         * */
                                         thnStore.send(strStore2 + "\n");
                                         thnStore.send("--EOF--\n");
                                         * */
-                                       return true;
+                                       //return true;
                                }
                                case 53: {
                                        LivingThing thnStore = getLivingThing(getString());
                                }
                                case 53: {
                                        LivingThing thnStore = getLivingThing(getString());
@@ -1885,7 +1886,7 @@ public class Script {
                                        return true;
                                }
                                /*case 127:
                                        return true;
                                }
                                /*case 127:
-                                {      
+                                {
                                 return false;
                                 }*/
                        }
                                 return false;
                                 }*/
                        }
index 7821b36..fc4fd53 100644 (file)
@@ -25,6 +25,7 @@
  */
 package duskz.server.entity;
 
  */
 package duskz.server.entity;
 
+import duskz.protocol.EntityUpdateMessage;
 import duskz.protocol.Wearing;
 import duskz.server.DuskEngine;
 import duskz.server.Script;
 import duskz.protocol.Wearing;
 import duskz.server.DuskEngine;
 import duskz.server.Script;
@@ -35,10 +36,10 @@ import java.io.RandomAccessFile;
 /*
  All code copyright Tom Weingarten (captaint@home.com) 2000
  Tom Weingarten makes no assurances as to the reliability or
 /*
  All code copyright Tom Weingarten (captaint@home.com) 2000
  Tom Weingarten makes no assurances as to the reliability or
- functionality of this code. Use at your own risk. 
+ functionality of this code. Use at your own risk.
 
  You are free to edit or redistribute this code or any portion
 
  You are free to edit or redistribute this code or any portion
- at your wish, under the condition that you do not edit or 
+ at your wish, under the condition that you do not edit or
  remove this license, and accompany it with all redistributions.
  */
 //0-Ordinary Item
  remove this license, and accompany it with all redistributions.
  */
 //0-Ordinary Item
@@ -61,16 +62,16 @@ public class Item extends DuskObject {
        public static final int DRINK = 4;
        public static final int CONTAINER = 5;
        private String strOnGetScript = null,
        public static final int DRINK = 4;
        public static final int CONTAINER = 5;
        private String strOnGetScript = null,
-                       strOnDropScript = null;
+               strOnDropScript = null;
        public String strOnUseScript = null,
        public String strOnUseScript = null,
-                       strOnWearScript = null,
-                       strOnUnWearScript = null;
+               strOnWearScript = null,
+               strOnUnWearScript = null;
        public int intCost,
        public int intCost,
-                       intType = -1,
-                       intKind = -1,
-                       intMod,
-                       intUses = -1,
-                       intRange = 1;
+               intType = -1,
+               intKind = -1,
+               intMod,
+               intUses = -1,
+               intRange = 1;
        int intImage;
        int intWeight;                          // How much this object weighs
        int intSize;                            // Amount of space this object takes up
        int intImage;
        int intWeight;                          // How much this object weighs
        int intSize;                            // Amount of space this object takes up
@@ -141,7 +142,18 @@ public class Item extends DuskObject {
 
        @Override
        public int getEntityType() {
 
        @Override
        public int getEntityType() {
-               return 1;
+               if (isFood())
+                       return EntityUpdateMessage.TYPE_FOOD;
+               if (isDrink())
+                       return EntityUpdateMessage.TYPE_DRINK;
+               if (isWeapon())
+                       return EntityUpdateMessage.TYPE_WEAPON;
+               if (isArmor())
+                       return EntityUpdateMessage.TYPE_ARMOUR;
+               if (isContainer())
+                       return EntityUpdateMessage.TYPE_CONTAINER;
+
+               return EntityUpdateMessage.TYPE_ITEM;
        }
 
        /**
        }
 
        /**
@@ -169,21 +181,21 @@ public class Item extends DuskObject {
         */
        public String toString() {
                return "[strName:" + name
         */
        public String toString() {
                return "[strName:" + name
-                               + "::strDescription:" + description
-                               + "::strOnUseScript:" + strOnUseScript
-                               + "::strOnWearScript:" + strOnWearScript
-                               + "::strOnUnWearScript:" + strOnUnWearScript
-                               + "::strOnGetScript:" + strOnGetScript
-                               + "::strOnDropScript:" + strOnDropScript
-                               + "::intCost:" + intCost
-                               + "::intType:" + intType
-                               + "::intKind:" + intKind
-                               + "::intMod:" + intMod
-                               + "::intImage:" + intImage
-                               + "::intUses:" + intUses
-                               + "::intRange:" + intRange
-                               + "::lngDurability:" + lngDurability
-                               + "]";
+                       + "::strDescription:" + description
+                       + "::strOnUseScript:" + strOnUseScript
+                       + "::strOnWearScript:" + strOnWearScript
+                       + "::strOnUnWearScript:" + strOnUnWearScript
+                       + "::strOnGetScript:" + strOnGetScript
+                       + "::strOnDropScript:" + strOnDropScript
+                       + "::intCost:" + intCost
+                       + "::intType:" + intType
+                       + "::intKind:" + intKind
+                       + "::intMod:" + intMod
+                       + "::intImage:" + intImage
+                       + "::intUses:" + intUses
+                       + "::intRange:" + intRange
+                       + "::lngDurability:" + lngDurability
+                       + "]";
        }
 
        public static Item getItem(long id, String inName) throws IOException {
        }
 
        public static Item getItem(long id, String inName) throws IOException {
index a224964..730e689 100644 (file)
@@ -240,10 +240,11 @@ public class LivingThing extends DuskObject implements Runnable, DuskProtocol {
 
        @Override
        public int getEntityType() {
 
        @Override
        public int getEntityType() {
-               if (isMob() || isPet()) {
-                       return 4;
-               }
-               return 0;
+               if (isMob())
+                       return EntityUpdateMessage.TYPE_MOBILE;
+               if (isPet())
+                       return EntityUpdateMessage.TYPE_PET;
+               return EntityUpdateMessage.TYPE_PLAYER;
        }
 
        /**
        }
 
        /**
@@ -2132,6 +2133,7 @@ public class LivingThing extends DuskObject implements Runnable, DuskProtocol {
        }
 
        public void addCondition(Condition cndStore) {
        }
 
        public void addCondition(Condition cndStore) {
+               System.out.printf("add condition '%s' '%s'\n", name, cndStore.name);
                if (conditions.isEmpty()) {
                        game.checkConditionList.add(this);
                } else {
                if (conditions.isEmpty()) {
                        game.checkConditionList.add(this);
                } else {
@@ -2941,7 +2943,7 @@ public class LivingThing extends DuskObject implements Runnable, DuskProtocol {
                                        msg = messageQueue.take();
 
                                        // low level protocol dump
                                        msg = messageQueue.take();
 
                                        // low level protocol dump
-                                       msg.format(System.out);
+                                       //msg.format(System.out);
 
                                        try {
                                                msg.sendMessage(outstream);
 
                                        try {
                                                msg.sendMessage(outstream);
index 58aec25..e6c1e4f 100644 (file)
@@ -24,6 +24,7 @@
  */
 package duskz.server.entity;
 
  */
 package duskz.server.entity;
 
+import duskz.protocol.EntityUpdateMessage;
 import duskz.server.DuskEngine;
 import java.io.*;
 import java.util.ArrayList;
 import duskz.server.DuskEngine;
 import java.io.*;
 import java.util.ArrayList;
@@ -57,7 +58,7 @@ public class Merchant extends DuskObject {
 
        @Override
        public int getEntityType() {
 
        @Override
        public int getEntityType() {
-               return 2;
+               return EntityUpdateMessage.TYPE_GAME_SHOP;
        }
 
        public boolean contains(String item) {
        }
 
        public boolean contains(String item) {
@@ -83,12 +84,12 @@ public class Merchant extends DuskObject {
                        if (thnMaster.isPet()) {
                                thnMaster.chatMessage("You ARE a pet!");
                                return;
                        if (thnMaster.isPet()) {
                                thnMaster.chatMessage("You ARE a pet!");
                                return;
-                       
+
                        }
                        }
-                       
+
                        thnMaster.chatMessage("The developer hasn't implemented pets yet!, see Merchangt.java line 90");
                        if (true)return;
                        thnMaster.chatMessage("The developer hasn't implemented pets yet!, see Merchangt.java line 90");
                        if (true)return;
-               
+
                        // FIXME: requires query system.  Use callbacks?
                        /*
                        thnMaster.halt();
                        // FIXME: requires query system.  Use callbacks?
                        /*
                        thnMaster.halt();
index 2de820c..97b4ae1 100644 (file)
@@ -34,8 +34,12 @@ import duskz.server.ItemList;
 import duskz.server.Log;
 import duskz.server.Script;
 import java.io.*;
 import duskz.server.Log;
 import duskz.server.Script;
 import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
 
 /**
  * Mob(mobile) is the class of non-player moving entities.
 
 /**
  * Mob(mobile) is the class of non-player moving entities.
@@ -71,7 +75,7 @@ public class Mob extends LivingThing {
                wornItems = new Equipment();
                itemList = new ItemList();
                battle = null;
                wornItems = new Equipment();
                itemList = new ItemList();
                battle = null;
-               loadMobFile(new File("defMobs/" + strType));
+               loadMobFile(strType.toLowerCase());
                hp = maxhp;
                mp = maxmp;
                isSleeping = false;
                hp = maxhp;
                mp = maxmp;
                isSleeping = false;
@@ -94,7 +98,7 @@ public class Mob extends LivingThing {
                itemList = new ItemList();
                battle = null;
                this.level = level;
                itemList = new ItemList();
                battle = null;
                this.level = level;
-               loadMobFile(new File("defMobs/" + strType));
+               loadMobFile(strType.toLowerCase());
                maxhp = maxhp * level;
                maxmp = maxmp * level;
                stre = stre * level;
                maxhp = maxhp * level;
                maxmp = maxmp * level;
                stre = stre * level;
@@ -123,20 +127,30 @@ public class Mob extends LivingThing {
                }
        }
 
                }
        }
 
-       public void loadMobFile(File path) throws FileNotFoundException, IOException {
+       public void loadMobFile(String type) throws FileNotFoundException, IOException {
                String line;
                String line;
-               try (RandomAccessFile file = new RandomAccessFile(path, "r")) {
-                       while (!((line = file.readLine()) == null || line.equals("."))) {
-                               try {
-                                       parseMobFile(file, line);
-                               } catch (NumberFormatException x) {
-                                       throw new IOException("Problem parsing mob " + path + " on field " + line, x);
+               // perform case insenitive lookup to match windows filesystem
+               // TODO: put in util class or fix game files
+               Optional<Path> path = Files.find(Path.of("defMobs"), 1, (t, a)-> t.getFileName().toString().toLowerCase().equals(type)).findAny();
+               if (path.isPresent()) {
+                       try (RandomAccessFile file = new RandomAccessFile(path.get().toFile(), "r")) {
+                               while (!((line = file.readLine()) == null || line.equals("."))) {
+                                       try {
+                                               parseMobFile(file, line);
+                                       } catch (NumberFormatException x) {
+                                               throw new IOException("Problem parsing mob " + path + " on field " + line, x);
+                                       }
+                               }
+                               if (fctFaction == null) {
+                                       game.log.printMessage(Log.DEBUG, "no faction found for mob \"" + name + "\"");
                                }
                        }
                                }
                        }
-                       if (fctFaction == null) {
-                               game.log.printMessage(Log.DEBUG, "no faction found for mob \"" + name + "\"");
-                       }
+               } else {
+                       throw new FileNotFoundException("defMobs/" + type);
                }
                }
+               System.out.println("mob loaded: " + name);
+               System.out.print("onBattle: ");
+               System.out.println(strOnBattle);
        }
 
        private void parseMobFile(RandomAccessFile in, String strStore) throws IOException, NumberFormatException {
        }
 
        private void parseMobFile(RandomAccessFile in, String strStore) throws IOException, NumberFormatException {
@@ -257,7 +271,7 @@ public class Mob extends LivingThing {
                                        game.log.printMessage(Log.DEBUG, "no faction found for \"" + strFaction + "\"");
                                }
                                break;
                                        game.log.printMessage(Log.DEBUG, "no faction found for \"" + strFaction + "\"");
                                }
                                break;
-                       case "onBattle":
+                       case "onbattle":
                                strOnBattle = in.readLine();
                                break;
                        case "nofollow":
                                strOnBattle = in.readLine();
                                break;
                        case "nofollow":
index 3006db6..1c98041 100644 (file)
@@ -22,6 +22,7 @@
  */
 package duskz.server.entity;
 
  */
 package duskz.server.entity;
 
+import duskz.protocol.EntityUpdateMessage;
 import duskz.server.DuskEngine;
 import duskz.server.ItemList;
 
 import duskz.server.DuskEngine;
 import duskz.server.ItemList;
 
@@ -58,7 +59,7 @@ public class PlayerMerchant extends DuskObject {
 
        @Override
        public int getEntityType() {
 
        @Override
        public int getEntityType() {
-               return 2;
+               return EntityUpdateMessage.TYPE_PLAYER_SHOP;
        }
 
        public long contains(String strStore) {
        }
 
        public long contains(String strStore) {
index da5cdb0..736b4ab 100644 (file)
@@ -23,6 +23,8 @@
  */
 package duskz.server.entity;
 
  */
 package duskz.server.entity;
 
+import duskz.protocol.EntityUpdateMessage;
+
 /**
  * A Prop is an entity that cannot move or be used.
  *
 /**
  * A Prop is an entity that cannot move or be used.
  *
@@ -48,6 +50,6 @@ public class Prop extends DuskObject {
 
        @Override
        public int getEntityType() {
 
        @Override
        public int getEntityType() {
-               return 3;
+               return EntityUpdateMessage.TYPE_PROP;
        }
 }
        }
 }
index 8753a99..fd56b88 100644 (file)
@@ -22,6 +22,7 @@
  */
 package duskz.server.entity;
 
  */
 package duskz.server.entity;
 
+import duskz.protocol.EntityUpdateMessage;
 import duskz.server.DuskEngine;
 
 /**
 import duskz.server.DuskEngine;
 
 /**
@@ -55,6 +56,6 @@ public class Sign extends DuskObject {
 
        @Override
        public int getEntityType() {
 
        @Override
        public int getEntityType() {
-               return 3;
+               return EntityUpdateMessage.TYPE_SIGN;
        }
 }
        }
 }