diff --git a/.gitignore b/.gitignore index 77d854c..000bbb3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ target/ *.o DroidQuest +.idea/ +*.iml diff --git a/Makefile b/Makefile index ae15aa2..ef2bda2 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ MV = mvn CFLAGS=-Wall -Werror -ggdb BIN=DroidQuest -JAR=dq-2.7.jar +JAR=dq-2.8.jar all: $(CC) $(CFLAGS) dq.c -o dq.o diff --git a/README b/README index c5539bf..c8e962d 100644 --- a/README +++ b/README @@ -3,11 +3,50 @@ Droid Quest A Java recreation of the classic game Robot Odyssey I +======= +Build with: + + mvn install + +Run the game: + + MacOSX / Linux: ./start.sh + Windows: start.bat (IN PROGRESS) +OR + java -jar target/dq-2.8.jar + +Controls: + + / - contextual help + arrows - normal movement + control + arrows - fine-grained movement [OS X: command + arrows] + space - pickup/drop + C - game cursor + H - hot cursor + S - solder pen + R - toggle radio + P - paintbrush + T - toolbox + [, ] - rotate device + F - flip + L - load small chip + E - enter robot + X - exit robot + + Cheat/debug: + + shift + arrows - move rooms + M - dump memory usage + +Note: On OS X, control + arrow-keys are bound to Apple's "Mission Control". I switched to the 'shortcut' modifier which is control on windows and command on OS X. Alternatively, you can disable +built in OS X shortcuts via System Preferences -> Keyboard -> Shorcuts. + + Copyright (c) 2000 Thomas Foote Optimization to compile, install, and run under linux: -Copyright (c) 2015 Chris Cromer +Copyright (c) 2015-2016 Chris Cromer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/dq.c b/dq.c index 0ae2766..ece0abf 100644 --- a/dq.c +++ b/dq.c @@ -1,6 +1,6 @@ #include int main() { - system("java -jar /usr/share/DroidQuest/dq-2.7.jar"); + system("java -jar /usr/share/DroidQuest/dq-2.8.jar"); return 0; } diff --git a/pom.xml b/pom.xml index cec3205..2d19b11 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.droidquest dq - 2.7 + 2.8 jar DroidQuest @@ -14,39 +14,34 @@ UTF-8 - - src - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - - true - lib/ - com.droidquest.DQ - - - - - - + + src + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.6 + 1.6 + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + lib/ + com.droidquest.DQ + + + + + + - - - diff --git a/src/com/droidquest/avatars/Player.java b/src/com/droidquest/avatars/Player.java index a7f20ac..c6f15d4 100644 --- a/src/com/droidquest/avatars/Player.java +++ b/src/com/droidquest/avatars/Player.java @@ -15,7 +15,7 @@ import java.awt.event.KeyEvent; public class Player extends Item implements Avatar { private int keyRepeatRate = 5; - + private int shortcut_modifier = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask(); protected boolean handleSaveSmallChip() { return false; @@ -363,16 +363,16 @@ public class Player extends Item implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_SLASH && handleHelp()) { return false; } - else if (e.getKeyCode() == KeyEvent.VK_RIGHT && handleMoveRight(e.isShiftDown(), e.isControlDown())) { + else if (e.getKeyCode() == KeyEvent.VK_RIGHT && handleMoveRight(e.isShiftDown(), (e.getModifiers() & shortcut_modifier) > 0)) { return true; } - else if (e.getKeyCode() == KeyEvent.VK_LEFT && handleMoveLeft(e.isShiftDown(), e.isControlDown())) { + else if (e.getKeyCode() == KeyEvent.VK_LEFT && handleMoveLeft(e.isShiftDown(), (e.getModifiers() & shortcut_modifier) > 0)) { return true; } - else if (e.getKeyCode() == KeyEvent.VK_UP && handleMoveUp(e.isShiftDown(), e.isControlDown())) { + else if (e.getKeyCode() == KeyEvent.VK_UP && handleMoveUp(e.isShiftDown(), (e.getModifiers() & shortcut_modifier) > 0)) { return true; } - else if (e.getKeyCode() == KeyEvent.VK_DOWN && handleMoveDown(e.isShiftDown(), e.isControlDown())) { + else if (e.getKeyCode() == KeyEvent.VK_DOWN && handleMoveDown(e.isShiftDown(), (e.getModifiers() & shortcut_modifier) > 0)) { return true; } else if (e.getKeyCode() == KeyEvent.VK_SPACE && handlePickupDrop()) { @@ -456,22 +456,22 @@ public class Player extends Item implements Avatar { public boolean KeyDown(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - if (handleRepeatRight(e.isControlDown())) { + if (handleRepeatRight((e.getModifiers() & shortcut_modifier) > 0)) { return true; } } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - if (handleRepeatLeft(e.isControlDown())) { + if (handleRepeatLeft((e.getModifiers() & shortcut_modifier) > 0)) { return true; } } else if (e.getKeyCode() == KeyEvent.VK_UP) { - if (handleRepeatUp(e.isControlDown())) { + if (handleRepeatUp((e.getModifiers() & shortcut_modifier) > 0)) { return true; } } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { - if (handleRepeatDown(e.isControlDown())) { + if (handleRepeatDown((e.getModifiers() & shortcut_modifier) > 0)) { return true; } } diff --git a/src/com/droidquest/avatars/Remote.java b/src/com/droidquest/avatars/Remote.java index 564b18b..e9aa1e7 100644 --- a/src/com/droidquest/avatars/Remote.java +++ b/src/com/droidquest/avatars/Remote.java @@ -8,6 +8,8 @@ import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; public class Remote extends Item implements Avatar { + private int shortcut_modifier = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask(); + public Remote() { width = 4; height = 20; @@ -98,28 +100,28 @@ public class Remote extends Item implements Avatar { } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (carriedBy == null) { - moveRight(e.isControlDown()); + moveRight((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { if (carriedBy == null) { - moveLeft(e.isControlDown()); + moveLeft((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; } else if (e.getKeyCode() == KeyEvent.VK_UP) { if (carriedBy == null) { - moveUp(e.isControlDown()); + moveUp((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { if (carriedBy == null) { - moveDown(e.isControlDown()); + moveDown((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; @@ -134,7 +136,7 @@ public class Remote extends Item implements Avatar { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { repeating++; if (repeating > 10) { - moveRight(e.isControlDown()); + moveRight((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -142,7 +144,7 @@ public class Remote extends Item implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_LEFT) { repeating++; if (repeating > 10) { - moveLeft(e.isControlDown()); + moveLeft((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -150,7 +152,7 @@ public class Remote extends Item implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_UP) { repeating++; if (repeating > 10) { - moveUp(e.isControlDown()); + moveUp((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -158,7 +160,7 @@ public class Remote extends Item implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_DOWN) { repeating++; if (repeating > 10) { - moveDown(e.isControlDown()); + moveDown((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; diff --git a/src/com/droidquest/avatars/SolderingPen.java b/src/com/droidquest/avatars/SolderingPen.java index 6d9b286..e7b80e7 100644 --- a/src/com/droidquest/avatars/SolderingPen.java +++ b/src/com/droidquest/avatars/SolderingPen.java @@ -18,6 +18,7 @@ import java.util.ArrayList; public class SolderingPen extends Device implements Avatar { private boolean hot; private Port currentPort = null; // Port that Soldering pen is currently over + private int shortcut_modifier = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask(); public SolderingPen() { width = 22; @@ -313,28 +314,28 @@ public class SolderingPen extends Device implements Avatar { } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (carriedBy == null) { - moveRight(e.isControlDown()); + moveRight((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { if (carriedBy == null) { - moveLeft(e.isControlDown()); + moveLeft((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; } else if (e.getKeyCode() == KeyEvent.VK_UP) { if (carriedBy == null) { - moveUp(e.isControlDown()); + moveUp((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { if (carriedBy == null) { - moveDown(e.isControlDown()); + moveDown((e.getModifiers() & shortcut_modifier) > 0); } repeating = 0; return true; @@ -358,7 +359,7 @@ public class SolderingPen extends Device implements Avatar { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { repeating++; if (repeating > 10) { - moveRight(e.isControlDown()); + moveRight((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -366,7 +367,7 @@ public class SolderingPen extends Device implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_LEFT) { repeating++; if (repeating > 10) { - moveLeft(e.isControlDown()); + moveLeft((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -374,7 +375,7 @@ public class SolderingPen extends Device implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_UP) { repeating++; if (repeating > 10) { - moveUp(e.isControlDown()); + moveUp((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -382,7 +383,7 @@ public class SolderingPen extends Device implements Avatar { else if (e.getKeyCode() == KeyEvent.VK_DOWN) { repeating++; if (repeating > 10) { - moveDown(e.isControlDown()); + moveDown((e.getModifiers() & shortcut_modifier) > 0); return true; } return false; @@ -428,6 +429,8 @@ public class SolderingPen extends Device implements Avatar { } } + CheckPort(); + level.roomdisplay.dq.selectCursor(); return true; } @@ -505,6 +508,8 @@ public class SolderingPen extends Device implements Avatar { handleRemote(); + CheckPort(); + return true; } diff --git a/src/com/droidquest/items/AutoWire.java b/src/com/droidquest/items/AutoWire.java index 402b16a..e375616 100644 --- a/src/com/droidquest/items/AutoWire.java +++ b/src/com/droidquest/items/AutoWire.java @@ -113,7 +113,7 @@ public class AutoWire extends Item { if (animation == 1) { if (portdevices[0].ports[0].myWire == null) { // Wiring - portdevices[0].ports[0].myWire = new Wire(chip.ports[0], portdevices[0].ports[0]); + portdevices[0].ports[0].myWire = new Wire(chip.ports[0], portdevices[0].ports[0]); } else { // Unwiring portdevices[0].ports[0].myWire.Remove(); diff --git a/src/com/droidquest/items/GateKeeper.java b/src/com/droidquest/items/GateKeeper.java index 7ef1b6e..91b5cce 100644 --- a/src/com/droidquest/items/GateKeeper.java +++ b/src/com/droidquest/items/GateKeeper.java @@ -64,7 +64,7 @@ public class GateKeeper extends Item { public void Animate() { if (behavior == 1) { - if (x != goToX && y != goToY) { + if (x != goToX || y != goToY) { if (x != goToX) { int diff = Math.abs(goToX - x); int dir = diff / (goToX - x); diff --git a/src/com/droidquest/items/Sentry.java b/src/com/droidquest/items/Sentry.java index 5e08dc3..a0e7356 100644 --- a/src/com/droidquest/items/Sentry.java +++ b/src/com/droidquest/items/Sentry.java @@ -240,9 +240,11 @@ public class Sentry extends Item { if (behavior == -1) { if (carrying == null) { - x = robot.x + robot.width / 2 - width / 2; - y = robot.y + robot.height / 2 - height / 2; - PicksUp(robot); + if(robot != null) { + x = robot.x + robot.width / 2 - width / 2; + y = robot.y + robot.height / 2 - height / 2; + PicksUp(robot); + } } } diff --git a/src/com/droidquest/levels/MainMenu.java b/src/com/droidquest/levels/MainMenu.java index 10874ae..1d41957 100644 --- a/src/com/droidquest/levels/MainMenu.java +++ b/src/com/droidquest/levels/MainMenu.java @@ -144,7 +144,7 @@ public class MainMenu extends Level { room.AddTextBox("Saved Games", 9 * 28, 10 * 32, 80); room.AddTextBox("Games", 450, 6 * 32 + 8, 500); room.AddArrow(559, 6 * 32, Arrow.DIR_RIGHT, 28, Color.white); - room.AddTextBox("{000,000,000} Version 2.7", 0, 16, 500); + room.AddTextBox("{000,000,000} Version 2.8", 0, 16, 500); if (cheatmode) { room.AddTextBox("{BIG} CHEAT ENABLED!", 91, 8 * 32, 500); } diff --git a/src/com/droidquest/materials/BatteryIn.java b/src/com/droidquest/materials/BatteryIn.java index d7fb360..184660d 100644 --- a/src/com/droidquest/materials/BatteryIn.java +++ b/src/com/droidquest/materials/BatteryIn.java @@ -13,7 +13,7 @@ import com.droidquest.levels.Level; public class BatteryIn extends Material { // Charges the Battery when an Energy Crystal is passed over it. - public void BatteryIn() { + public BatteryIn() { passable = true; GenerateIcons(); } diff --git a/start.bat b/start.bat new file mode 100755 index 0000000..6820166 --- /dev/null +++ b/start.bat @@ -0,0 +1 @@ +java -jar "target\dq-2.8.jar" diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..333243f --- /dev/null +++ b/start.sh @@ -0,0 +1,45 @@ +#/bin/sh + +RUNPRG="java" +if ! type -p "${RUNPRG}" > /dev/null; +then + if [ -n "${JAVA_HOME}" ]; + then + RUNPRG="${JAVA_HOME}/bin/java" + if [ ! -x "${RUNPRG}" ]; + then + echo "JAVA_HOME set, but unable to find java. Please check your java installation." + exit 1 + fi + else + echo "Java 1.6 or newer needed for DQ. Must be in PATH or JAVA_HOME set." + exit 1 + fi +fi + + +if [ -f "target/dq-2.8.jar" ]; +then + echo "Starting DQ." + ${RUNPRG} -jar "target/dq-2.8.jar" +else + echo "No jar found, building DQ before running." + MVNPRG="mvn" + if ! type -p "${MVNPRG}" > /dev/null; + then + if [ -n "${MAVEN_HOME}" ]; + then + MVNPRG="${MAVEN_HOME}/bin/mvn" + if [ ! -x "${MVNPRG}" ]; + then + echo "MAVEN_HOME set, but unable to find mvn executable. Please check your maven installation." + exit 1 + fi + else + echo "Maven required to build DQ. See maven.apache.org to download." + exit 1 + fi + fi + ${MVNPRG} package + ${MVNPRG} exec:java -Dexec.mainClass=com.droidquest.DQ +fi