210 lines
6.3 KiB
Java
210 lines
6.3 KiB
Java
package inf101.v18.rogue101;
|
||
|
||
import java.io.PrintWriter;
|
||
import java.io.StringWriter;
|
||
|
||
import inf101.v18.gfx.Screen;
|
||
import inf101.v18.gfx.gfxmode.ITurtle;
|
||
import inf101.v18.gfx.textmode.Printer;
|
||
import inf101.v18.gfx.textmode.TextMode;
|
||
import inf101.v18.rogue101.game.Game;
|
||
import javafx.animation.KeyFrame;
|
||
import javafx.animation.Timeline;
|
||
import javafx.application.Application;
|
||
import javafx.event.ActionEvent;
|
||
import javafx.scene.input.KeyCode;
|
||
import javafx.scene.input.KeyEvent;
|
||
import javafx.scene.paint.Color;
|
||
import javafx.stage.Stage;
|
||
import javafx.util.Duration;
|
||
|
||
public class Main extends Application {
|
||
// you might want to tune these options
|
||
public static final boolean MAIN_USE_BACKGROUND_GRID = true;
|
||
public static final boolean MAP_AUTO_SCALE_ITEM_DRAW = true;
|
||
public static final boolean MAP_DRAW_ONLY_DIRTY_CELLS = false;
|
||
public static final TextMode MAIN_TEXT_MODE = TextMode.MODE_80X25;
|
||
|
||
public static final boolean DEBUG_TIME = false;
|
||
|
||
public static final int LINE_MAP_BOTTOM = 20;
|
||
public static final int LINE_STATUS = 21;
|
||
public static final int LINE_MSG1 = 22;
|
||
public static final int LINE_MSG2 = 23;
|
||
public static final int LINE_MSG3 = 24;
|
||
public static final int LINE_DEBUG = 25;
|
||
public static final int COLUMN_MAP_END = 40;
|
||
public static final int COLUMN_RIGHTSIDE_START = 41;
|
||
|
||
public static void main(String[] args) {
|
||
launch(args);
|
||
}
|
||
|
||
private Screen screen;
|
||
private ITurtle painter;
|
||
private Printer printer;
|
||
|
||
private Game game;
|
||
|
||
private boolean grid = MAIN_USE_BACKGROUND_GRID;
|
||
private boolean autoNextTurn = false;
|
||
private Timeline bigStepTimeline;
|
||
private Timeline smallStepTimeline;
|
||
|
||
private void setup() {
|
||
//
|
||
game = new Game(screen, painter, printer);
|
||
game.draw();
|
||
|
||
//
|
||
bigStepTimeline = new Timeline();
|
||
bigStepTimeline.setCycleCount(Timeline.INDEFINITE);
|
||
KeyFrame kf = new KeyFrame(Duration.millis(1000), (ActionEvent event) -> {
|
||
if (autoNextTurn) {
|
||
doTurn();
|
||
}
|
||
});
|
||
bigStepTimeline.getKeyFrames().add(kf);
|
||
// bigStepTimeline.playFromStart();
|
||
|
||
//
|
||
smallStepTimeline = new Timeline();
|
||
smallStepTimeline.setCycleCount(1);
|
||
kf = new KeyFrame(Duration.millis(1), (ActionEvent event) -> {
|
||
doTurn();
|
||
});
|
||
smallStepTimeline.getKeyFrames().add(kf);
|
||
|
||
// finally, start game
|
||
doTurn();
|
||
}
|
||
|
||
@Override
|
||
public void start(Stage primaryStage) throws Exception {
|
||
screen = Screen.startPaintScene(primaryStage, Screen.CONFIG_PIXELS_STEP_SCALED); // Screen.CONFIG_SCREEN_FULLSCREEN_NO_HINT);
|
||
|
||
printer = screen.createPrinter();
|
||
painter = screen.createPainter();
|
||
printer.setTextMode(MAIN_TEXT_MODE, true);
|
||
|
||
// Font with emojis – need separate download
|
||
// printer.setFont(Printer.FONT_SYMBOLA);
|
||
|
||
if (grid)
|
||
printer.drawCharCells();
|
||
printer.setAutoScroll(false);
|
||
screen.setKeyPressedHandler((KeyEvent event) -> {
|
||
KeyCode code = event.getCode();
|
||
if (event.isShortcutDown()) {
|
||
if (code == KeyCode.Q) {
|
||
System.exit(0);
|
||
} else if (code == KeyCode.R) {
|
||
printer.cycleMode(true);
|
||
if (grid)
|
||
printer.drawCharCells();
|
||
game.draw();
|
||
printer.redrawDirty();
|
||
return true;
|
||
} else if (code == KeyCode.A) {
|
||
screen.cycleAspect();
|
||
if (grid)
|
||
printer.drawCharCells();
|
||
return true;
|
||
} else if (code == KeyCode.G) {
|
||
grid = !grid;
|
||
if (grid)
|
||
printer.drawCharCells();
|
||
else
|
||
screen.clearBackground();
|
||
return true;
|
||
} else if (code == KeyCode.F) {
|
||
screen.setFullScreen(!screen.isFullScreen());
|
||
return true;
|
||
} else if (code == KeyCode.L) {
|
||
printer.redrawTextPage();
|
||
return true;
|
||
}
|
||
} else if (code == KeyCode.ENTER) {
|
||
try {
|
||
doTurn();
|
||
} catch (Exception e) {
|
||
printer.printAt(1, 25, "Exception: " + e.getMessage(), Color.RED);
|
||
e.printStackTrace();
|
||
}
|
||
return true;
|
||
} else {
|
||
try {
|
||
game.keyPressed(code);
|
||
doTurn();
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
try {
|
||
StringWriter sw = new StringWriter();
|
||
PrintWriter writer = new PrintWriter(sw);
|
||
e.printStackTrace(writer);
|
||
writer.close();
|
||
String trace = sw.toString().split("\n")[0];
|
||
game.displayDebug("Exception: " + trace);
|
||
} catch (Exception e2) {
|
||
System.err.println("Also got this exception trying to display the previous one");
|
||
e2.printStackTrace();
|
||
game.displayDebug("Exception: " + e.getMessage());
|
||
}
|
||
}
|
||
printer.redrawDirty();
|
||
return true;
|
||
}
|
||
return false;
|
||
});
|
||
/*
|
||
* screen.setKeyTypedHandler((KeyEvent event) -> { if (event.getCharacter() !=
|
||
* KeyEvent.CHAR_UNDEFINED) { printer.print(event.getCharacter()); return true;
|
||
* } return false; });
|
||
*/
|
||
setup();
|
||
|
||
primaryStage.show();
|
||
|
||
}
|
||
|
||
public void doTurn() {
|
||
long t = System.currentTimeMillis();
|
||
boolean waitForPlayer = game.doTurn();
|
||
if (DEBUG_TIME)
|
||
System.out.println("doTurn() took " + (System.currentTimeMillis() - t) + "ms");
|
||
long t2 = System.currentTimeMillis();
|
||
game.draw();
|
||
printer.redrawDirty();
|
||
if (DEBUG_TIME) {
|
||
System.out.println("draw() took " + (System.currentTimeMillis() - t2) + "ms");
|
||
System.out.println("doTurn()+draw() took " + (System.currentTimeMillis() - t) + "ms");
|
||
System.out.println("waiting for player? " + waitForPlayer);
|
||
}
|
||
if (!waitForPlayer)
|
||
smallStepTimeline.playFromStart(); // this will kickstart a new turn in a few milliseconds
|
||
}
|
||
|
||
public static String BUILTIN_MAP = "40 20\n" //
|
||
+ "########################################\n" //
|
||
+ "#...... ..C.R ......R.R......... ..R...#\n" //
|
||
+ "#.R@R...... ..........RC..R...... ... .#\n" //
|
||
+ "#.......... ..R......R.R..R........R...#\n" //
|
||
+ "#R. R......... R..R.........R......R.RR#\n" //
|
||
+ "#... ..R........R......R. R........R.RR#\n" //
|
||
+ "###############################....R..R#\n" //
|
||
+ "#. ...R..C. ..R.R..........C.RC....... #\n" //
|
||
+ "#..C.....R..... ........RR R..R.....R..#\n" //
|
||
+ "#...R..R.R..............R .R..R........#\n" //
|
||
+ "#.R.....R........RRR.......R.. .C....R.#\n" //
|
||
+ "#.C.. ..R. .....R.RC..C....R...R..C. .#\n" //
|
||
+ "#. R..............R R..R........C.....R#\n" //
|
||
+ "#........###############################\n" //
|
||
+ "# R.........R...C....R.....R...R.......#\n" //
|
||
+ "# R......... R..R........R......R.RR..##\n" //
|
||
+ "#. ..R........R.....R. ....C...R.RR...#\n" //
|
||
+ "#....RC..R........R......R.RC......R...#\n" //
|
||
+ "#.C.... ..... ......... .R..R....R...R.#\n" //
|
||
+ "########################################\n" //
|
||
;
|
||
}
|