basic moves added
This commit is contained in:
parent
a37ca65d00
commit
85f74a30a1
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
PlayerColor,
|
||||
ShowDialog,
|
||||
HideDialog,
|
||||
ShowFieldInfo,
|
||||
PerformDialogActions
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user