diff --git a/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/BuildCard.java b/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/BuildCard.java new file mode 100644 index 00000000..7e14a71e --- /dev/null +++ b/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/BuildCard.java @@ -0,0 +1,27 @@ +package tw.waterballsa.gaas.citadels.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class BuildCard { + private String name; + private int coins; + private Color color; + + public enum Color { + PURPLE("特別地區"), + YELLOW("貴族地區"), + RED("軍事地區"), + BLUE("商業地區"), + GREEN("宗教地區"); + private final String area; + + Color(String area) { + this.area = area; + } + } + +} + diff --git a/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/CharacterCard.java b/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/CharacterCard.java new file mode 100644 index 00000000..0fa9d974 --- /dev/null +++ b/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/CharacterCard.java @@ -0,0 +1,11 @@ +package tw.waterballsa.gaas.citadels.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CharacterCard { + private int sequence; + private String name; +} diff --git a/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/Game.java b/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/Game.java new file mode 100644 index 00000000..9123f4c1 --- /dev/null +++ b/packages/backend/domain/src/main/java/tw/waterballsa/gaas/citadels/domain/Game.java @@ -0,0 +1,119 @@ +package tw.waterballsa.gaas.citadels.domain; + +import lombok.Getter; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static java.util.UUID.randomUUID; +import static tw.waterballsa.gaas.citadels.domain.Game.Status.PLAYING; + + +@Getter +public class Game { + private final String id; + private final String roomId; + private final String name; + private final Status status; + private final LocalDateTime createTime; + private final List players; + private final List characterCards; + private final List buildCards; + public static final Integer DEFAULT_COINS = 2; + public static final Integer DEFAULT_CARD_QUANTITY = 2; + + public Game(String roomId, String name, List players, List characterCards, List buildCards) { + this.id = randomUUID().toString(); + this.roomId = roomId; + this.name = name; + this.createTime = LocalDateTime.now(); + this.players = players; + this.status = PLAYING; + this.characterCards = characterCards; + this.buildCards = buildCards; + } + + public Game(String id, String roomId, String name, Status status, + LocalDateTime createTime, List players, List characterCards, + List buildCards) { + this.id = id; + this.roomId = roomId; + this.name = name; + this.status = status; + this.createTime = createTime; + this.players = players; + this.characterCards = characterCards; + this.buildCards = buildCards; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getRoomId() { + return roomId; + } + + public Status getStatus() { + return status; + } + + public List getPlayers() { + return players; + } + + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void randomlyAwardCrownToOnePlayer() { + Collections.shuffle(players); + Player kingPlayer = players.get(0); + kingPlayer.acquireCrown(); + } + + public void start() { + randomlyAwardCrownToOnePlayer(); + distributingCardsAndCoinsToEachPlayer(); + } + + private void distributingCardsAndCoinsToEachPlayer() { + players.forEach(player -> { + player.plusCards(getTwoCards()); + player.plusCoins(2); + }); + + } + + public List getTwoCards(){ + return Arrays.asList(new BuildCard("test",3, BuildCard.Color.BLUE) + ,new BuildCard("test",2, BuildCard.Color.BLUE)); + } + + public enum Status { + PLAYING, + CLOSE + } + + @Override + public String toString() { + return "Game{" + + "id='" + id + '\'' + + ", roomId='" + roomId + '\'' + + ", name='" + name + '\'' + + ", status=" + status + + ", createTime=" + createTime + + ", players=" + players + + ", districtCards=" + buildCards + + '}'; + } +} + + diff --git a/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/controllers/viewmodel/BuildCardView.java b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/controllers/viewmodel/BuildCardView.java new file mode 100644 index 00000000..8ee10753 --- /dev/null +++ b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/controllers/viewmodel/BuildCardView.java @@ -0,0 +1,25 @@ +package tw.waterballsa.gaas.citadels.spring.controllers.viewmodel; + +import lombok.AllArgsConstructor; +import lombok.Data; +import tw.waterballsa.gaas.citadels.domain.BuildCard; + +import java.util.List; +import java.util.stream.Collectors; + +@Data +@AllArgsConstructor +public class BuildCardView { + private String name; + private int coins; + private BuildCard.Color color; + + public static List toViewModels(List buildCards) { + return buildCards.stream().map(BuildCardView::toViewModel).collect(Collectors.toList()); + } + + public static BuildCardView toViewModel(BuildCard buildCard) { + return new BuildCardView(buildCard.getName(), buildCard.getCoins(), buildCard.getColor()); + } + +} diff --git a/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/controllers/viewmodel/CharacterCardView.java b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/controllers/viewmodel/CharacterCardView.java new file mode 100644 index 00000000..2d1a5d00 --- /dev/null +++ b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/controllers/viewmodel/CharacterCardView.java @@ -0,0 +1,23 @@ +package tw.waterballsa.gaas.citadels.spring.controllers.viewmodel; + +import lombok.AllArgsConstructor; +import lombok.Data; +import tw.waterballsa.gaas.citadels.domain.CharacterCard; + +import java.util.List; +import java.util.stream.Collectors; + +@Data +@AllArgsConstructor +public class CharacterCardView { + private int sequence; + private String name; + + public static CharacterCardView toViewModel(CharacterCard characterCard) { + return (characterCard != null) ? new CharacterCardView(characterCard.getSequence(), characterCard.getName()) : null; + } + + public static List toViewModels(List characterCards) { + return characterCards.stream().map(CharacterCardView::toViewModel).collect(Collectors.toList()); + } +} diff --git a/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/repositories/data/BuildCardData.java b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/repositories/data/BuildCardData.java new file mode 100644 index 00000000..df384644 --- /dev/null +++ b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/repositories/data/BuildCardData.java @@ -0,0 +1,36 @@ +package tw.waterballsa.gaas.citadels.spring.repositories.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import tw.waterballsa.gaas.citadels.domain.BuildCard; + +import java.util.List; +import java.util.stream.Collectors; + +@Data +@Document +@AllArgsConstructor +public class BuildCardData { + @Id + private String name; + private int coins; + private BuildCard.Color color; + + public static BuildCardData toData(BuildCard buildCard) { + return new BuildCardData(buildCard.getName(), buildCard.getCoins(), buildCard.getColor()); + } + + public static List toData(List buildCards) { + return buildCards.stream().map(BuildCardData::toData).collect(Collectors.toList()); + } + + public static BuildCard toDomain(BuildCardData buildCardData) { + return new BuildCard(buildCardData.getName(), buildCardData.getCoins(), buildCardData.getColor()); + } + + public static List toDomains(List buildCardDataList) { + return buildCardDataList.stream().map(BuildCardData::toDomain).collect(Collectors.toList()); + } +} diff --git a/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/repositories/data/CharacterCardData.java b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/repositories/data/CharacterCardData.java new file mode 100644 index 00000000..827bcc24 --- /dev/null +++ b/packages/backend/spring/src/main/java/tw/waterballsa/gaas/citadels/spring/repositories/data/CharacterCardData.java @@ -0,0 +1,43 @@ +package tw.waterballsa.gaas.citadels.spring.repositories.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import tw.waterballsa.gaas.citadels.domain.CharacterCard; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Data +@Document +@AllArgsConstructor +public class CharacterCardData { + @Id + private int sequence; + private String name; + + public static CharacterCardData toData(CharacterCard characterCard) { + return (characterCard != null) ? new CharacterCardData(characterCard.getSequence(), characterCard.getName()) : null; + } + + public static List toData(List characterCards) { + return characterCards.stream().map(CharacterCardData::toData).collect(Collectors.toList()); + } + + public static CharacterCard toDomain(CharacterCardData characterCardData) { + return characterCardData != null ? new CharacterCard(characterCardData.getSequence(), characterCardData.getName()) : null; + } + + public static Map toDomains(List characterCardDataList) { + Map cards = new LinkedHashMap<>(); + characterCardDataList.forEach(characterCardData -> cards.put(characterCardData.getSequence(), toDomain(characterCardData))); + return cards; + } + + public static List toDomainList(List characterCardDataList) { + return characterCardDataList.stream().map(CharacterCardData::toDomain).collect(Collectors.toList()); + } +}