basic moves added
This commit is contained in:
parent
a37ca65d00
commit
85f74a30a1
@ -11,5 +11,5 @@ import java.util.List;
|
|||||||
public class DialogButton {
|
public class DialogButton {
|
||||||
private String buttonText;
|
private String buttonText;
|
||||||
private DialogButtonColor buttonColor;
|
private DialogButtonColor buttonColor;
|
||||||
private List<WebSocketMessageType> onclickAction;
|
private List<GameMsgType> onclickAction;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.alterdekim.game.component.game;
|
||||||
|
|
||||||
|
public enum GameMsgType {
|
||||||
|
DialogCancelAnswer,
|
||||||
|
DialogConfirmAnswer
|
||||||
|
}
|
@ -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];
|
||||||
|
}
|
||||||
|
}
|
@ -1,16 +1,16 @@
|
|||||||
package com.alterdekim.game.component.game;
|
package com.alterdekim.game.component.game;
|
||||||
|
|
||||||
|
import com.alterdekim.game.component.game.statemanager.StateManager;
|
||||||
import com.alterdekim.game.entities.RoomPlayer;
|
import com.alterdekim.game.entities.RoomPlayer;
|
||||||
import com.alterdekim.game.service.UserServiceImpl;
|
import com.alterdekim.game.service.UserServiceImpl;
|
||||||
import com.alterdekim.game.websocket.message.BasicMessage;
|
import com.alterdekim.game.websocket.message.BasicMessage;
|
||||||
import com.alterdekim.game.websocket.message.ResponseMessage;
|
import com.alterdekim.game.websocket.message.ResponseMessage;
|
||||||
import com.alterdekim.game.websocket.message.WebSocketMessageType;
|
import com.alterdekim.game.websocket.message.WebSocketMessageType;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
|
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
|
||||||
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
|
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
|
||||||
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.socket.TextMessage;
|
import org.springframework.web.socket.TextMessage;
|
||||||
import org.springframework.web.socket.WebSocketSession;
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
@ -18,24 +18,33 @@ import org.springframework.web.socket.WebSocketSession;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class GameRoom {
|
public class GameRoom extends Thread {
|
||||||
|
|
||||||
@Getter
|
@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 final UserServiceImpl userService;
|
||||||
|
|
||||||
private List<BoardField> boardFields;
|
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private BoardGUI board;
|
||||||
|
|
||||||
|
private GameState state;
|
||||||
|
|
||||||
private final ObjectMapper om;
|
private final ObjectMapper om;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean isGameLoopFrozen = false;
|
||||||
|
|
||||||
|
private final ConcurrentMap<GameState, StateManager> manager;
|
||||||
|
|
||||||
public GameRoom(List<RoomPlayer> players, UserServiceImpl userService) {
|
public GameRoom(List<RoomPlayer> players, UserServiceImpl userService) {
|
||||||
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
|
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
|
||||||
.allowIfBaseType(ActionDialogBody.class)
|
.allowIfBaseType(ActionDialogBody.class)
|
||||||
@ -47,33 +56,26 @@ public class GameRoom {
|
|||||||
this.players = players.stream()
|
this.players = players.stream()
|
||||||
.map(p -> new GamePlayer(p.getUserId(), userService.findById(p.getUserId()).getDisplayName(), 0, new Chip(p.getUserId(), 0, 0, "#000000")))
|
.map(p -> new GamePlayer(p.getUserId(), userService.findById(p.getUserId()).getDisplayName(), 0, new Chip(p.getUserId(), 0, 0, "#000000")))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
this.socks = new ConcurrentHashMap<>();
|
GamePlayerColor c = GamePlayerColor.RED;
|
||||||
this.boardFields = new ArrayList<>();
|
for( int i = 0; i < this.players.size(); i++ ) {
|
||||||
}
|
this.players.get(i).getChip().setColor(c.getHex());
|
||||||
|
c = c.next();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
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) {
|
private void initBoard() {
|
||||||
//sendMessage(message.getUid(), WebSocketMessageType.ShowFieldInfo, );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendAllInfoRequest(BasicMessage message) {
|
|
||||||
List<BoardTile> top = new ArrayList<>();
|
List<BoardTile> top = new ArrayList<>();
|
||||||
List<BoardTile> right = new ArrayList<>();
|
List<BoardTile> right = new ArrayList<>();
|
||||||
List<BoardTile> bottom = 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"));
|
left.add(new BoardTile(UUID.randomUUID().toString(), i, 2200, "", "/static/images/beeline.png", "000000", "f5f5f5"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<CornerTile> corners = new ArrayList<>();
|
List<CornerTile> corners = new ArrayList<>();
|
||||||
corners.add(new CornerTile("/static/images/start.png"));
|
corners.add(new CornerTile("/static/images/start.png"));
|
||||||
corners.add(new CornerTile("/static/images/injail.png"));
|
corners.add(new CornerTile("/static/images/injail.png"));
|
||||||
corners.add(new CornerTile("/static/images/parking.png"));
|
corners.add(new CornerTile("/static/images/parking.png"));
|
||||||
corners.add(new CornerTile("/static/images/gotojail.png"));
|
corners.add(new CornerTile("/static/images/gotojail.png"));
|
||||||
|
|
||||||
BoardGUI boardGUI = new BoardGUI(top, right, bottom, left, corners);
|
this.board = new BoardGUI(top, right, bottom, left, corners);
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.PlayersList, players);
|
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.BoardGUI, boardGUI);
|
/*left.get(2).setCost(12345);
|
||||||
left.get(2).setCost(12345);
|
|
||||||
left.get(2).setImg("/static/images/fanta.png");
|
left.get(2).setImg("/static/images/fanta.png");
|
||||||
left.get(2).setColor("bcbcbc");
|
left.get(2).setColor("bcbcbc");
|
||||||
left.get(2).setStars("★★★");
|
left.get(2).setStars("★★★");
|
||||||
left.get(2).setOwnerColor("fffbbb");
|
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 green = new Chip(3L, 10, 10, "#00ff00");
|
||||||
Chip blue = new Chip(4L, 0, 5, "#0000ff");
|
Chip blue = new Chip(4L, 0, 5, "#0000ff");
|
||||||
Chip white = new Chip(5L, 0, 5, "#ffffff");
|
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, green);
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.AssignChip, blue);
|
sendMessage(message.getUid(), WebSocketMessageType.AssignChip, blue);
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.AssignChip, white);
|
sendMessage(message.getUid(), WebSocketMessageType.AssignChip, white);
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.AssignChip, black);
|
sendMessage(message.getUid(), WebSocketMessageType.AssignChip, black);*/
|
||||||
|
/*
|
||||||
red.setY(10);
|
red.setY(10);
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.ChipMove, red);
|
sendMessage(message.getUid(), WebSocketMessageType.ChipMove, red);
|
||||||
|
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.PlayerColor, new PlayerColor(2L, "#ff0000"));
|
sendMessage(message.getUid(), WebSocketMessageType.PlayerColor, new PlayerColor(2L, "#ff0000"));
|
||||||
|
|
||||||
List<DialogButton> buttons = new ArrayList<>();
|
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);
|
DialogButtonsList b = new DialogButtonsList(buttons);
|
||||||
sendMessage(message.getUid(), WebSocketMessageType.ShowDialog, new ActionDialog("Title!", "Description!", ActionDialogType.Buttons, b));
|
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 {
|
try {
|
||||||
if (socks.get(userId).isOpen())
|
if (socks.get(userId).isOpen())
|
||||||
socks.get(userId).sendMessage(
|
socks.get(userId).sendMessage(
|
||||||
@ -150,4 +190,12 @@ public class GameRoom {
|
|||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while(true) {
|
||||||
|
if (isGameLoopFrozen) continue;
|
||||||
|
this.manager.get(this.state).performState();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
@ -9,7 +9,6 @@ public enum WebSocketMessageType {
|
|||||||
ChipMove,
|
ChipMove,
|
||||||
PlayerColor,
|
PlayerColor,
|
||||||
ShowDialog,
|
ShowDialog,
|
||||||
HideDialog,
|
|
||||||
ShowFieldInfo,
|
ShowFieldInfo,
|
||||||
PerformDialogActions
|
PerformDialogActions
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user