basic moves added

This commit is contained in:
Michael Wain 2024-07-13 17:31:28 +03:00
parent a37ca65d00
commit 85f74a30a1
8 changed files with 186 additions and 46 deletions

View File

@ -11,5 +11,5 @@ import java.util.List;
public class DialogButton {
private String buttonText;
private DialogButtonColor buttonColor;
private List<WebSocketMessageType> onclickAction;
private List<GameMsgType> onclickAction;
}

View File

@ -0,0 +1,6 @@
package com.alterdekim.game.component.game;
public enum GameMsgType {
DialogCancelAnswer,
DialogConfirmAnswer
}

View File

@ -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];
}
}

View File

@ -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<GamePlayer> players;
private final List<GamePlayer> players;
private ConcurrentHashMap<Long, WebSocketSession> socks;
private final ConcurrentMap<Long, WebSocketSession> socks;
private UserServiceImpl userService;
private List<BoardField> 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<GameState, StateManager> manager;
public GameRoom(List<RoomPlayer> 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<BoardTile> top = new ArrayList<>();
List<BoardTile> right = new ArrayList<>();
List<BoardTile> 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<CornerTile> 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<DialogButton> 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();
}
}
}

View File

@ -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<GameMsgType> allowedRequests;
private final boolean allowedDialog;
private final Class<? extends StateManager> managerClass;
}

View File

@ -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<DialogButton> 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) {
}
}

View File

@ -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);
}

View File

@ -9,7 +9,6 @@ public enum WebSocketMessageType {
ChipMove,
PlayerColor,
ShowDialog,
HideDialog,
ShowFieldInfo,
PerformDialogActions
}