Merge remote-tracking branch 'origin/UI' into UI

This commit is contained in:
ramollia
2025-10-05 18:24:25 +02:00
3 changed files with 146 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
package org.toop.app;
public enum GameType {
TICTACTOE, OTHELLO;
public static String toName(GameType type) {
return switch (type) {
case TICTACTOE -> "tic-tac-toe";
case OTHELLO -> "Othello";
};
}
public static GameType toType(String name) {
return switch (name) {
case "tic-tac-toe" -> TICTACTOE;
case "Reversi" -> OTHELLO;
default -> TICTACTOE;
};
}
}

View File

@@ -0,0 +1,92 @@
package org.toop.app;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.toop.framework.asset.ResourceLoader;
import org.toop.framework.eventbus.EventFlow;
import org.toop.framework.networking.NetworkingClientManager;
import org.toop.framework.networking.events.NetworkEvents;
import static java.lang.Thread.sleep;
public class Match {
private String player1,player2;
private boolean player1AI,player2AI;
private String ip;
private int port;
private boolean isLocal;
private GameType type;
private long clientId;
private static final Logger logger = LogManager.getLogger(Match.class);
public Match(String player1, String player2, boolean player1AI, boolean player2AI, GameType type) {
this.player1 = player1;
this.player2 = player2;
this.player1AI = player1AI;
this.player2AI = player2AI;
this.type = type;
this.isLocal = true;
startGameLoop();
}
public Match(String player1, boolean player1AI, String ip, int port, GameType type) {
this.player1 = player1;
this.player1AI = player1AI;
this.ip = ip;
this.port = port;
this.type = type;
this.isLocal = false;
new EventFlow()
.listen(this::handleStartClientResponse)
.listen(this::handleYourTurn);
startServerConnection();
//startGameLoop();
}
private void handleYourTurn(NetworkEvents.YourTurnResponse response) {
//System.out.println(response.toString());
//new EventFlow().addPostEvent(NetworkEvents.SendMove.class, clientId,(short)1).asyncPostEvent();
try{
sleep(2000);
}
catch (InterruptedException e){}
new EventFlow().addPostEvent(NetworkEvents.SendCommand.class, clientId,"MOVE 2").asyncPostEvent();
}
private void loginAndSubscribe(GameType type) {
if(clientId > 0){
new EventFlow().addPostEvent(NetworkEvents.SendLogin.class,clientId,player1).asyncPostEvent();
new EventFlow().addPostEvent(NetworkEvents.SendSubscribe.class,clientId,GameType.toName(type)).asyncPostEvent();
startGameLoop();
}
else {
logger.warn("Internal client ID is invalid. Failed to log in.");
}
}
void handleStartClientResponse(NetworkEvents.StartClientResponse response) {
this.clientId = response.clientId();
loginAndSubscribe(type);
}
private boolean startServerConnection() {
if(!isLocal){
if(ip == null || port <= 0){
logger.warn("IP address or port is invalid");
return false;
}
else{
new EventFlow().addPostEvent(NetworkEvents.StartClient.class,ip,port).asyncPostEvent();
return true;
}
}
return false;
}
private void startGameLoop() {
if(!isLocal){
//new EventFlow().addPostEvent(NetworkEvents.SendMove.class,clientId,2).asyncPostEvent();
}
}
}

View File

@@ -0,0 +1,33 @@
package org.toop.app.layer.layers;
import javafx.geometry.Pos;
import org.toop.app.App;
import org.toop.app.GameType;
import org.toop.app.Match;
import org.toop.app.canvas.TicTacToeCanvas;
import org.toop.app.layer.Container;
import org.toop.app.layer.Layer;
import org.toop.app.layer.containers.VerticalContainer;
import java.time.LocalDateTime;
public class GameLayer extends Layer {
Match match;
public GameLayer() {
super("game.css");
//temp
match = new Match("name"+LocalDateTime.now().getSecond(),false,"127.0.0.1",7789, GameType.TICTACTOE);
reload();
}
@Override
public void reload() {
App.popAll();
final Container controlContainer = new VerticalContainer(5);
controlContainer.addButton("Back", () -> { App.activate(new MainLayer()); });
addCanvas(new TicTacToeCanvas(), Pos.CENTER, 0, 0, 100, 100);
addContainer(controlContainer, Pos.BOTTOM_LEFT, 2, -2, 0, 0);
}
}