From 85f74a30a155f89eb243c6ea3097af255a2ac64b Mon Sep 17 00:00:00 2001 From: alterdekim Date: Sat, 13 Jul 2024 17:31:28 +0300 Subject: [PATCH] basic moves added --- .../game/component/game/DialogButton.java | 2 +- .../game/component/game/GameMsgType.java | 6 + .../game/component/game/GamePlayerColor.java | 20 +++ .../game/component/game/GameRoom.java | 136 ++++++++++++------ .../game/component/game/GameState.java | 22 +++ .../game/statemanager/MoveManager.java | 29 ++++ .../game/statemanager/StateManager.java | 16 +++ .../message/WebSocketMessageType.java | 1 - 8 files changed, 186 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/alterdekim/game/component/game/GameMsgType.java create mode 100644 src/main/java/com/alterdekim/game/component/game/GamePlayerColor.java create mode 100644 src/main/java/com/alterdekim/game/component/game/GameState.java create mode 100644 src/main/java/com/alterdekim/game/component/game/statemanager/MoveManager.java create mode 100644 src/main/java/com/alterdekim/game/component/game/statemanager/StateManager.java diff --git a/src/main/java/com/alterdekim/game/component/game/DialogButton.java b/src/main/java/com/alterdekim/game/component/game/DialogButton.java index f41bc18..c83d10e 100644 --- a/src/main/java/com/alterdekim/game/component/game/DialogButton.java +++ b/src/main/java/com/alterdekim/game/component/game/DialogButton.java @@ -11,5 +11,5 @@ import java.util.List; public class DialogButton { private String buttonText; private DialogButtonColor buttonColor; - private List onclickAction; + private List onclickAction; } diff --git a/src/main/java/com/alterdekim/game/component/game/GameMsgType.java b/src/main/java/com/alterdekim/game/component/game/GameMsgType.java new file mode 100644 index 0000000..4dc86bb --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/GameMsgType.java @@ -0,0 +1,6 @@ +package com.alterdekim.game.component.game; + +public enum GameMsgType { + DialogCancelAnswer, + DialogConfirmAnswer +} diff --git a/src/main/java/com/alterdekim/game/component/game/GamePlayerColor.java b/src/main/java/com/alterdekim/game/component/game/GamePlayerColor.java new file mode 100644 index 0000000..a917434 --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/GamePlayerColor.java @@ -0,0 +1,20 @@ +package com.alterdekim.game.component.game; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum GamePlayerColor { + RED("#ff0000"), + GREEN("#00ff00"), + BLUE("#0000ff"), + WHITE("#ffffff"), + BLACK("#000000"); + + private final String hex; + + public GamePlayerColor next() { + return GamePlayerColor.values()[(this.ordinal() + 1) % GamePlayerColor.values().length]; + } +} diff --git a/src/main/java/com/alterdekim/game/component/game/GameRoom.java b/src/main/java/com/alterdekim/game/component/game/GameRoom.java index b6766f3..6627b30 100644 --- a/src/main/java/com/alterdekim/game/component/game/GameRoom.java +++ b/src/main/java/com/alterdekim/game/component/game/GameRoom.java @@ -1,16 +1,16 @@ package com.alterdekim.game.component.game; +import com.alterdekim.game.component.game.statemanager.StateManager; import com.alterdekim.game.entities.RoomPlayer; import com.alterdekim.game.service.UserServiceImpl; import com.alterdekim.game.websocket.message.BasicMessage; import com.alterdekim.game.websocket.message.ResponseMessage; import com.alterdekim.game.websocket.message.WebSocketMessageType; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; @@ -18,24 +18,33 @@ import org.springframework.web.socket.WebSocketSession; import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; +import java.util.stream.IntStream; @Slf4j -public class GameRoom { +public class GameRoom extends Thread { @Getter - private List players; + private final List players; - private ConcurrentHashMap socks; + private final ConcurrentMap socks; - private UserServiceImpl userService; - - private List boardFields; + private final UserServiceImpl userService; + @Getter + private BoardGUI board; + private GameState state; private final ObjectMapper om; + @Getter + @Setter + private boolean isGameLoopFrozen = false; + + private final ConcurrentMap manager; + public GameRoom(List players, UserServiceImpl userService) { PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder() .allowIfBaseType(ActionDialogBody.class) @@ -47,33 +56,26 @@ public class GameRoom { this.players = players.stream() .map(p -> new GamePlayer(p.getUserId(), userService.findById(p.getUserId()).getDisplayName(), 0, new Chip(p.getUserId(), 0, 0, "#000000"))) .collect(Collectors.toList()); - this.socks = new ConcurrentHashMap<>(); - this.boardFields = new ArrayList<>(); - } - - public void receiveMessage(BasicMessage message, WebSocketSession session) { - if(players.stream().noneMatch(p -> p.getUserId().longValue() == message.getUid().longValue())) return; - socks.put(message.getUid(), session); - log.info("receiveMessage " + message.getType()); - parseMessage(message); - } - - private void parseMessage(BasicMessage message) { - switch (message.getType()) { - case InfoRequest: - sendAllInfoRequest(message); - break; - case ShowFieldInfo: - sendFieldInfo(message); - break; + GamePlayerColor c = GamePlayerColor.RED; + for( int i = 0; i < this.players.size(); i++ ) { + this.players.get(i).getChip().setColor(c.getHex()); + c = c.next(); } + this.socks = new ConcurrentHashMap<>(); + this.state = GameState.MOVE; + this.manager = new ConcurrentHashMap<>(); + Arrays.stream(GameState.values()).forEach(s -> { + try { + this.manager.put(s, s.getManagerClass().getDeclaredConstructor().newInstance(this)); + } catch (Exception e) { + log.error(e.getMessage()); + } + }); + this.initBoard(); + this.start(); } - private void sendFieldInfo(BasicMessage message) { - //sendMessage(message.getUid(), WebSocketMessageType.ShowFieldInfo, ); - } - - private void sendAllInfoRequest(BasicMessage message) { + private void initBoard() { List top = new ArrayList<>(); List right = new ArrayList<>(); List bottom = new ArrayList<>(); @@ -95,25 +97,22 @@ public class GameRoom { left.add(new BoardTile(UUID.randomUUID().toString(), i, 2200, "", "/static/images/beeline.png", "000000", "f5f5f5")); } - - List corners = new ArrayList<>(); corners.add(new CornerTile("/static/images/start.png")); corners.add(new CornerTile("/static/images/injail.png")); corners.add(new CornerTile("/static/images/parking.png")); corners.add(new CornerTile("/static/images/gotojail.png")); - BoardGUI boardGUI = new BoardGUI(top, right, bottom, left, corners); - sendMessage(message.getUid(), WebSocketMessageType.PlayersList, players); - sendMessage(message.getUid(), WebSocketMessageType.BoardGUI, boardGUI); - left.get(2).setCost(12345); + this.board = new BoardGUI(top, right, bottom, left, corners); + + /*left.get(2).setCost(12345); left.get(2).setImg("/static/images/fanta.png"); left.get(2).setColor("bcbcbc"); left.get(2).setStars("★★★"); left.get(2).setOwnerColor("fffbbb"); - sendMessage(message.getUid(), WebSocketMessageType.ChangeBoardTileState, left.get(2)); + sendMessage(message.getUid(), WebSocketMessageType.ChangeBoardTileState, left.get(2));*/ - Chip red = new Chip(2L, 10, 9, "#ff0000"); + /* Chip red = new Chip(2L, 10, 9, "#ff0000"); Chip green = new Chip(3L, 10, 10, "#00ff00"); Chip blue = new Chip(4L, 0, 5, "#0000ff"); Chip white = new Chip(5L, 0, 5, "#ffffff"); @@ -123,20 +122,61 @@ public class GameRoom { sendMessage(message.getUid(), WebSocketMessageType.AssignChip, green); sendMessage(message.getUid(), WebSocketMessageType.AssignChip, blue); sendMessage(message.getUid(), WebSocketMessageType.AssignChip, white); - sendMessage(message.getUid(), WebSocketMessageType.AssignChip, black); - + sendMessage(message.getUid(), WebSocketMessageType.AssignChip, black);*/ + /* red.setY(10); sendMessage(message.getUid(), WebSocketMessageType.ChipMove, red); sendMessage(message.getUid(), WebSocketMessageType.PlayerColor, new PlayerColor(2L, "#ff0000")); List buttons = new ArrayList<>(); - buttons.add(new DialogButton("Button1", DialogButtonColor.GREEN, Collections.singletonList(WebSocketMessageType.HideDialog))); + buttons.add(new DialogButton("Button1", DialogButtonColor.GREEN, Collections.singletonList(GameMsgType.DialogConfirmAnswer))); DialogButtonsList b = new DialogButtonsList(buttons); sendMessage(message.getUid(), WebSocketMessageType.ShowDialog, new ActionDialog("Title!", "Description!", ActionDialogType.Buttons, b)); + */} + + public void receiveMessage(BasicMessage message, WebSocketSession session) { + if(players.stream().noneMatch(p -> p.getUserId().longValue() == message.getUid().longValue())) return; + socks.put(message.getUid(), session); + log.info("receiveMessage " + message.getType()); + parseMessage(message); } - private void sendMessage(Long userId, WebSocketMessageType type, Object o) { + private void parseMessage(BasicMessage message) { + switch (message.getType()) { + case InfoRequest: + sendAllInfoRequest(message); + break; + case ShowFieldInfo: + sendFieldInfo(message); + break; + case PerformDialogActions: + processDialogActions(message); + break; + } + } + + private void processDialogActions(BasicMessage message) { + log.info("processDialogAction: {}", message.getBody() ); + this.manager.get(this.state).performDialogAction(message); + } + + private void sendFieldInfo(BasicMessage message) { + log.info("Requested: ShowFieldInfo; {}", message.getBody()); + //sendMessage(message.getUid(), WebSocketMessageType.ShowFieldInfo, ); + } + + private void sendAllInfoRequest(BasicMessage message) { + sendMessage(message.getUid(), WebSocketMessageType.PlayersList, players); + sendMessage(message.getUid(), WebSocketMessageType.BoardGUI, this.board); + + this.players.forEach(p -> sendMessage(message.getUid(), WebSocketMessageType.AssignChip, p.getChip())); + this.players.forEach(p -> sendMessage(message.getUid(), WebSocketMessageType.PlayerColor, new PlayerColor(p.getUserId(), p.getChip().getColor()))); + + //sendMessage(message.getUid(), WebSocketMessageType.ChipMove, red); + } + + public void sendMessage(Long userId, WebSocketMessageType type, Object o) { try { if (socks.get(userId).isOpen()) socks.get(userId).sendMessage( @@ -150,4 +190,12 @@ public class GameRoom { log.error(e.getMessage(), e); } } + + @Override + public void run() { + while(true) { + if (isGameLoopFrozen) continue; + this.manager.get(this.state).performState(); + } + } } diff --git a/src/main/java/com/alterdekim/game/component/game/GameState.java b/src/main/java/com/alterdekim/game/component/game/GameState.java new file mode 100644 index 0000000..a810de1 --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/GameState.java @@ -0,0 +1,22 @@ +package com.alterdekim.game.component.game; + +import com.alterdekim.game.component.game.statemanager.MoveManager; +import com.alterdekim.game.component.game.statemanager.StateManager; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@AllArgsConstructor +@Getter +public enum GameState { + MOVE(Arrays.asList(GameMsgType.DialogConfirmAnswer, GameMsgType.DialogCancelAnswer), true, MoveManager.class), + TRADES(Collections.emptyList(), false, null), + AUCTION(Collections.emptyList(), false, null); + + private final List allowedRequests; + private final boolean allowedDialog; + private final Class managerClass; +} diff --git a/src/main/java/com/alterdekim/game/component/game/statemanager/MoveManager.java b/src/main/java/com/alterdekim/game/component/game/statemanager/MoveManager.java new file mode 100644 index 0000000..8a78ef5 --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/statemanager/MoveManager.java @@ -0,0 +1,29 @@ +package com.alterdekim.game.component.game.statemanager; + +import com.alterdekim.game.component.game.*; +import com.alterdekim.game.websocket.message.BasicMessage; +import com.alterdekim.game.websocket.message.WebSocketMessageType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class MoveManager extends StateManager { + public MoveManager(GameRoom parent) { + super(parent); + } + + @Override + public void performState() { + List buttons = new ArrayList<>(); + buttons.add(new DialogButton("Button1", DialogButtonColor.GREEN, Collections.singletonList(GameMsgType.DialogConfirmAnswer))); + DialogButtonsList b = new DialogButtonsList(buttons); + this.getParent().getPlayers().forEach(p -> this.getParent().sendMessage(p.getUserId(), WebSocketMessageType.ShowDialog, new ActionDialog("Title yup!", "Description yay!", ActionDialogType.Buttons, b))); + this.getParent().setGameLoopFrozen(true); + } + + @Override + public void performDialogAction(BasicMessage message) { + + } +} diff --git a/src/main/java/com/alterdekim/game/component/game/statemanager/StateManager.java b/src/main/java/com/alterdekim/game/component/game/statemanager/StateManager.java new file mode 100644 index 0000000..7339bf9 --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/statemanager/StateManager.java @@ -0,0 +1,16 @@ +package com.alterdekim.game.component.game.statemanager; + +import com.alterdekim.game.component.game.GameRoom; +import com.alterdekim.game.websocket.message.BasicMessage; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public abstract class StateManager { + + private final GameRoom parent; + + public abstract void performState(); + public abstract void performDialogAction(BasicMessage message); +} diff --git a/src/main/java/com/alterdekim/game/websocket/message/WebSocketMessageType.java b/src/main/java/com/alterdekim/game/websocket/message/WebSocketMessageType.java index 9685a12..bb28e64 100644 --- a/src/main/java/com/alterdekim/game/websocket/message/WebSocketMessageType.java +++ b/src/main/java/com/alterdekim/game/websocket/message/WebSocketMessageType.java @@ -9,7 +9,6 @@ public enum WebSocketMessageType { ChipMove, PlayerColor, ShowDialog, - HideDialog, ShowFieldInfo, PerformDialogActions }