diff --git a/pom.xml b/pom.xml index 68fd002..d731012 100644 --- a/pom.xml +++ b/pom.xml @@ -16,8 +16,8 @@ - 1.8 - 1.8 + 11 + 11 UTF-8 diff --git a/src/main/java/com/alterdekim/game/component/game/BoardField.java b/src/main/java/com/alterdekim/game/component/game/BoardField.java new file mode 100644 index 0000000..fe996ac --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/BoardField.java @@ -0,0 +1,24 @@ +package com.alterdekim.game.component.game; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class BoardField { + private String uid; + private Integer x; + private Integer y; + private Integer cost; + private Integer stars; + private String img; + private String color; + + public BoardTile toBoardTile() { + return new BoardTile(this.uid, 0, this.cost, "★".repeat(stars), this.img, this.color, ""); + } +} diff --git a/src/main/java/com/alterdekim/game/component/game/GamePlayer.java b/src/main/java/com/alterdekim/game/component/game/GamePlayer.java index 9249fc7..3ab3708 100644 --- a/src/main/java/com/alterdekim/game/component/game/GamePlayer.java +++ b/src/main/java/com/alterdekim/game/component/game/GamePlayer.java @@ -13,4 +13,5 @@ public class GamePlayer { private Long userId; private String displayName; private Integer money; -} + private Chip chip; +} \ No newline at end of file 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 9f54606..2f2bfc0 100644 --- a/src/main/java/com/alterdekim/game/component/game/GameRoom.java +++ b/src/main/java/com/alterdekim/game/component/game/GameRoom.java @@ -29,10 +29,15 @@ public class GameRoom { private UserServiceImpl userService; + private List boardFields; + public GameRoom(List players, UserServiceImpl userService) { this.userService = userService; - this.players = players.stream().map(p -> new GamePlayer(p.getUserId(), userService.findById(p.getUserId()).getDisplayName(), 0)).collect(Collectors.toList()); + 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) { @@ -74,6 +79,8 @@ 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")); @@ -90,7 +97,20 @@ public class GameRoom { left.get(2).setOwnerColor("fffbbb"); sendMessage(message.getUid(), WebSocketMessageType.ChangeBoardTileState, om.writeValueAsString(left.get(2))); - sendMessage(message.getUid(), WebSocketMessageType.AssignChip, om.writeValueAsString(new Chip(2L, 10, 15, "#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"); + Chip black = new Chip(6L, 0, 5, "#000000"); + + sendMessage(message.getUid(), WebSocketMessageType.AssignChip, om.writeValueAsString(red)); + sendMessage(message.getUid(), WebSocketMessageType.AssignChip, om.writeValueAsString(green)); + sendMessage(message.getUid(), WebSocketMessageType.AssignChip, om.writeValueAsString(blue)); + sendMessage(message.getUid(), WebSocketMessageType.AssignChip, om.writeValueAsString(white)); + sendMessage(message.getUid(), WebSocketMessageType.AssignChip, om.writeValueAsString(black)); + + red.setY(10); + sendMessage(message.getUid(), WebSocketMessageType.ChipMove, om.writeValueAsString(red)); } catch (JsonProcessingException e) { log.error(e.getMessage(), e); } 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 e74e8fb..3641a41 100644 --- a/src/main/java/com/alterdekim/game/websocket/message/WebSocketMessageType.java +++ b/src/main/java/com/alterdekim/game/websocket/message/WebSocketMessageType.java @@ -5,5 +5,6 @@ public enum WebSocketMessageType { BoardGUI, InfoRequest, ChangeBoardTileState, - AssignChip + AssignChip, + ChipMove } diff --git a/src/main/resources/static/javascript/game.js b/src/main/resources/static/javascript/game.js index 2b2a0a7..81d240a 100644 --- a/src/main/resources/static/javascript/game.js +++ b/src/main/resources/static/javascript/game.js @@ -1,5 +1,4 @@ class Chip { - constructor(obj1) { this.obj = obj1; } @@ -42,7 +41,9 @@ class Chip { } class Board { - constructor() {} + constructor() { + this.board_chips = []; + } get chips() { return this.board_chips; @@ -51,18 +52,6 @@ class Board { set chips(chips) { this.board_chips = chips; } - - get fields() { - return this.board_fields; - } - - set fields(fields) { - this.board_fields = fields; - } -} - -class Field { - } const top_offset = 18; @@ -128,14 +117,116 @@ function showMessage(message) { case 'AssignChip': assignChip(JSON.parse(message.body)); break; + case 'ChipMove': + chipMove(JSON.parse(message.body)); + break; } } +function clamp(number, min, max) { + return Math.max(min, Math.min(number, max)); +} + +function chipMove(body) { + let nc = board.chips.find((c) => c.uid == body.uid); + if( nc == undefined ) return; + nc.x = body.x; + nc.y = body.y; + refreshChips(); +} + +const corners = [ + {x: 0, y: 0}, + {x: 10, y: 0}, + {x: 10, y: 10}, + {x: 0, y: 10} +]; + +const chips_margins = [[], + [{top: 40, left: 20}], + [{top: 25, left: 20}, {top: 50, left: 20}], + [{top: 20, left: 20}, {top: 45, left: 20}, {top: 70, left: 20}], + [{top: 20, left: 20}, {top: 45, left: 28}, {top: 70, left: 20}, {top: 45, left: 8}], + [{top: 20, left: 20}, {top: 45, left: 25}, {top: 70, left: 20}, {top: 70, left: 10}, {top: 45, left: 10}] +]; + +function distinct(arr) { + for(let i = 0; i < arr.length; i++) { + let a = arr[i]; + let cnt = 0; + for(let u = 0; u < arr.length; u++) { + if(a.x == arr[u].x && a.y == arr[u].y) { + cnt++; + } + } + if( cnt > 1 ) { + arr.splice(i, 1); + i = 0; + } + } + return arr; +} + +function includes(pos) { + for(let i = 0; i < corners.length; i++) { + if( pos.x == corners[i].x && pos.y == corners[i].y ) { + return true; + } + } + return false; +} + function refreshChips() { for(let i = 0; i < board.chips.length; i++ ) { let chip = board.chips[i]; if( chip.uid == 0 ) continue; $(chip.dom).css("background-color", chip.color); + let offsetY = (Math.max(chip.y-1, 0) * 55) + (chip.y * 2) + (clamp(chip.y, 0, 1) * 100) + 18; + let offsetX = (Math.max(chip.x-1, 0) * 55) + (chip.x * 2) + (clamp(chip.x, 0, 1) * 100); + $(chip.dom).animate({marginTop: offsetY, marginLeft: offsetX}, 1000); + } + let positions = distinct(board.chips.filter((c) => c.uid != 0).map(({ x, y }) => ({ x, y }))); + for( let i = 0; i < positions.length; i++ ) { + let a = board.chips.filter((c) => c.x == positions[i].x && c.y == positions[i].y && c.uid != 0); + if( includes(positions[i]) ) { + switch(a.length) { + case 1: + $(a[0].dom).animate({marginTop: "+=40", marginLeft: "+=40"}, 500); + break; + case 2: + $(a[0].dom).animate({marginTop: "+=20", marginLeft: "+=40"}, 500); + $(a[1].dom).animate({marginTop: "+=60", marginLeft: "+=40"}, 500); + break; + case 3: + $(a[0].dom).animate({marginTop: "+=40", marginLeft: "+=15"}, 500); + $(a[1].dom).animate({marginTop: "+=40", marginLeft: "+=40"}, 500); + $(a[2].dom).animate({marginTop: "+=40", marginLeft: "+=65"}, 500); + break; + case 4: + $(a[0].dom).animate({marginTop: "+=15", marginLeft: "+=20"}, 500); + $(a[1].dom).animate({marginTop: "+=15", marginLeft: "+=60"}, 500); + $(a[2].dom).animate({marginTop: "+=55", marginLeft: "+=20"}, 500); + $(a[3].dom).animate({marginTop: "+=55", marginLeft: "+=60"}, 500); + break; + case 5: + $(a[0].dom).animate({marginTop: "+=15", marginLeft: "+=20"}, 500); + $(a[1].dom).animate({marginTop: "+=15", marginLeft: "+=60"}, 500); + $(a[2].dom).animate({marginTop: "+=55", marginLeft: "+=20"}, 500); + $(a[3].dom).animate({marginTop: "+=55", marginLeft: "+=60"}, 500); + $(a[4].dom).animate({marginTop: "+=35", marginLeft: "+=40"}, 500); + break; + } + } else { + if( positions[i].x > 0 && positions[i].x < 10 ) { + for(let u = 0; u < a.length; u++) { + $(a[u].dom).animate({marginTop: "+=" + chips_margins[a.length][u].top, marginLeft: "+=" + chips_margins[a.length][u].left}, 500); + } + } else { + for(let u = 0; u < a.length; u++) { + $(a[u].dom).animate({marginTop: "+=" + chips_margins[a.length][u].left, marginLeft: "+=" + chips_margins[a.length][u].top}, 500); + } + } + } } } @@ -146,6 +237,7 @@ function assignChip(body) { nc.color = body.color; nc.x = body.x; nc.y = body.y; + $(nc.obj).css("display", ""); refreshChips(); } diff --git a/src/main/resources/templates/game.html b/src/main/resources/templates/game.html index 1cd6e8b..fa43829 100644 --- a/src/main/resources/templates/game.html +++ b/src/main/resources/templates/game.html @@ -208,11 +208,11 @@ -
-
-
-
-
+ + + + +