Skip to content

Commit

Permalink
Merge branch 'develop' into Fix/#315-chatroom-info-modal-error
Browse files Browse the repository at this point in the history
  • Loading branch information
nayonnii committed Sep 13, 2023
2 parents 1a9c9bd + 5505c0d commit ef3e19c
Show file tree
Hide file tree
Showing 11 changed files with 199 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ public class MessageController {
public void sendMessage(SimpMessageHeaderAccessor accessor, String message,
@DestinationVariable Long roomId) {


GameSession gameSession = gameSessionManager.findGameByRoomId(roomId);
Player player = gameSessionManager.findPlayerByMemberName(getMemberName(accessor));

Expand Down Expand Up @@ -154,36 +153,32 @@ public void sendMessage_GameStart(SimpMessageHeaderAccessor accessor,
"게임이 시작되었습니다.",
roomId, "admin");

// 게임 시작 -> 직업 랜덤 부여, 게임 페이즈 변경, 직업 설명
List<Player> mafiaList = new ArrayList<>();
gameSessionManager.startGame(roomId, getMemberName(accessor)).forEach(p -> {
messageManager.sendMessage(
"/sub/chat/" + roomId + "/gameRole/" + p.getMemberName(),
new RoleExplainMessage(p.getRole(), getTimeString())
);
if (p.getRole().equals(GameRole.MAFIA)) {
mafiaList.add(p);
}
});

// 마피아들에게 마피아가 누구인지 알려주기
String mafiaListString = mafiaList.stream()
.map(Player::getNickName)
.collect(Collectors.joining(", "));
mafiaList.forEach(m -> {
messageManager.sendMessage(
"/sub/chat/" + roomId + "/" + m.getMemberName(),
"마피아 플레이어는" + " [" + mafiaListString + "] " + "입니다.",
roomId, "admin"
);
});

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

Runnable task = () -> {
messageManager.sendMessage("/sub/chat/" + roomId,
"자기소개를 시작해 주세요. 시간은 60 초입니다.",
roomId, "admin");
// 게임 시작 -> 직업 랜덤 부여, 게임 페이즈 변경, 직업 설명
List<Player> mafiaList = new ArrayList<>();
gameSessionManager.startGame(roomId, getMemberName(accessor)).forEach(p -> {
messageManager.sendMessage(
"/sub/chat/" + roomId + "/gameRole/" + p.getMemberName(),
new RoleExplainMessage(p.getRole(), getTimeString())
);
if (p.getRole().equals(GameRole.MAFIA)) {
mafiaList.add(p);
}
});

// 마피아들에게 마피아가 누구인지 알려주기
String mafiaListString = mafiaList.stream()
.map(Player::getNickName)
.collect(Collectors.joining(", "));
mafiaList.forEach(m -> {
messageManager.sendMessage(
"/sub/chat/" + roomId + "/" + m.getMemberName(),
"마피아 플레이어는" + " [" + mafiaListString + "] " + "입니다.",
roomId, "admin"
);
});
};
executor.schedule(task, 1, TimeUnit.SECONDS);
}
Expand Down
52 changes: 40 additions & 12 deletions src/main/java/com/springles/controller/message/VoteController.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private void voteStart (SimpMessageHeaderAccessor accessor,
// 투표 시작 메시지 전송
messageManager.sendMessage(
"/sub/chat/" + roomId,
day + "번째 날 아침이 밝았습니다. 투표를 시작합니다.",
day + "번째 날 아침이 밝았습니다. 아침 대화 시간은 60 초 입니다.",
roomId, "admin"
);

Expand All @@ -89,19 +89,19 @@ private void voteStart (SimpMessageHeaderAccessor accessor,
log.info("마피아로 의심되는 사람을 지목한 뒤 투표해 주십시오.");
messageManager.sendMessage(
"/sub/chat/" + roomId,
"마피아로 의심되는 사람을 지목한 뒤 투표해 주십시오. 투표 시간은 30 초입니다.",
" 투표를 시작합니다. 마피아로 의심되는 사람을 지목한 뒤 투표해 주십시오. 투표 시간은 20 초 입니다.",
roomId, "admin"
);
};
executor.schedule(task, 1, TimeUnit.SECONDS);
executor.schedule(task, 60, TimeUnit.SECONDS);


Runnable endVoteTask = () -> {
Map<Long, Long> vote = gameSessionVoteService.endVote(roomId, gameSession.getPhaseCount(), gameSession.getGamePhase());
publishMessage(roomId, vote);
};

executor.schedule(endVoteTask, 30, TimeUnit.SECONDS);
executor.schedule(endVoteTask, 80, TimeUnit.SECONDS);
}


Expand All @@ -111,6 +111,19 @@ private void dayVote(SimpMessageHeaderAccessor accessor,
@Payload GameSessionVoteRequestDto request) {
String playerName = getMemberName(accessor);
Long playerId = gameSessionManager.findMemberByMemberName(playerName).getId();

Map<Long, Long> votePossible = gameSessionVoteService.getVotePossible(roomId);
log.info(votePossible.toString());

if (votePossible.get(playerId) != null) {
log.info("걸렸다");
messageManager.sendMessage(
"/sub/chat/" + roomId,
"이미 투표했습니다.",
roomId, "admin"
);
return;
}
log.info("Player {} vote {}", playerName, request.getVote());
GameSession gameSession = gameSessionManager.findGameByRoomId(roomId);

Expand All @@ -125,7 +138,7 @@ private void dayVote(SimpMessageHeaderAccessor accessor,
log.info("{}가 투표되었습니다.", votedPlayerName);
messageManager.sendMessage(
"/sub/chat/" + roomId,
votedPlayerName + "가 투표되었습니다.",
votedPlayerName + "가 투표 되었습니다.",
roomId, "admin"
);
}
Expand Down Expand Up @@ -167,33 +180,48 @@ private void nightVoteStart (SimpMessageHeaderAccessor accessor,
Map<Long, Long> vote = gameSessionVoteService.endVote(roomId, gameSession.getPhaseCount(), gameSession.getGamePhase());
publishMessage(roomId, vote);
};
executor.schedule(task, 30, TimeUnit.SECONDS);
executor.schedule(task, 20, TimeUnit.SECONDS);
}

@MessageMapping("/chat/{roomId}/vote/night")
private void nightVote(SimpMessageHeaderAccessor accessor,
@DestinationVariable Long roomId,
@Payload GameSessionVoteRequestDto request) {
String playerName = getMemberName(accessor);
Long playerId = gameSessionManager.findMemberByMemberName(playerName).getId();
Player player = gameSessionManager.findPlayerByMemberName(playerName);
Long playerId = player.getMemberId();
GameRole role = player.getRole();

Map<Long, Long> votePossible = gameSessionVoteService.getVotePossible(roomId);
if (votePossible.get(playerId) != null) {
messageManager.sendMessage(
"/sub/chat/" + roomId,
"이미 투표했습니다.",
roomId, "admin"
);
return;
}
log.info("Player {} vote {}", playerName, request.getVote());
log.info("밤 투표 메시지 받기 완료");
log.info("PlayerName: {}", playerName);
Player player = gameSessionManager.findPlayerByMemberName(playerName);
Long playerID = player.getMemberId();
GameRole role = player.getRole();

log.info("Player {} GameRole: {}", playerName, role);

if(role == GameRole.CIVILIAN || role == GameRole.OBSERVER || role == GameRole.NONE) {
throw new CustomException(ErrorCode.VOTE_NOT_VALID);
messageManager.sendMessage(
"/sub/chat/" + roomId,
"투표 권한이 없습니다.",
roomId, "admin"
);
return;
}

if (request.getPhase() != GamePhase.NIGHT_VOTE) {
throw new CustomException(ErrorCode.GAME_PHASE_NOT_NIGHT_VOTE);
}

// 해당 롤의 투표
Map<Long, Long> voteResult = gameSessionVoteService.nightVote(roomId, playerID, request, role);
Map<Long, Long> voteResult = gameSessionVoteService.nightVote(roomId, playerId, request, role);
// 관찰자들을 위한 투표 결과 반환
Map<Long, Long> forObserver = gameSessionVoteService.getVoteResult(roomId, request);

Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/springles/game/DayDiscussionManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public void sendMessage(DayDiscussionMessage message) {
log.info("Room {} suspicious List is Empty", roomId);
messageManager.sendMessage(
"/sub/chat/" + roomId,
"동점 투표자가 발생하여 아무도 지목되지 않았습니다.",
"가장 많은 투표를 받은 플레이어가 존재하지 않습니다.",
roomId, "admin"
);

Expand All @@ -59,7 +59,7 @@ public void sendMessage(DayDiscussionMessage message) {
log.info("{}가 마피아로 지목되었습니다.", deadPlayer.getNickName());
messageManager.sendMessage(
"/sub/chat/" + roomId,
deadPlayer.getNickName() + "님이 마피아로 지목되셨습니다.",
deadPlayer.getNickName() + "님이 가장 많은 투표를 받으셨습니다.",
roomId, "admin"
);
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Expand All @@ -68,7 +68,7 @@ public void sendMessage(DayDiscussionMessage message) {
// 실행하고자 하는 코드를 여기에 작성합니다.
messageManager.sendMessage(
"/sub/chat/" + roomId,
"60초 동안 최후 변론을 시작합니다.",
"투표 대상의 변론을 진행합니다. 변론 시간은 30초 입니다.",
roomId, "admin"
);
};
Expand Down Expand Up @@ -107,12 +107,12 @@ public void sendMessage(DayDiscussionMessage message) {
log.info("변론 후 최종 투표를 시작합니다.");
messageManager.sendMessage(
"/sub/chat/" + roomId,
"변론 최종 투표를 시작합니다.",
"변론 시간이 종료되었습니다. 최종 투표를 진행합니다. 투표 시간은 30초 입니다.",
roomId, "admin"
);
};

executor.schedule(eliminationTask, 60, TimeUnit.SECONDS);
executor.schedule(eliminationTask, 30, TimeUnit.SECONDS);
}
}

Expand Down
7 changes: 5 additions & 2 deletions src/main/java/com/springles/game/DayEliminationManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,10 @@ private void setDayToNight(GameSession gameSession, Long deadPlayerId) {
deadPlayer.getMemberName() + "님이 마피아로 지목되어 사망하셨습니다.",
gameSession.getRoomId(), "admin"
);
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
deadPlayer.setAlive(false);
deadPlayer.setRole(GameRole.OBSERVER);
playerRedisRepository.save(deadPlayer);
/*ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Runnable task = () -> {
messageManager.sendMessage(
"/sub/chat/" + gameSession.getRoomId(),
Expand All @@ -109,7 +112,7 @@ private void setDayToNight(GameSession gameSession, Long deadPlayerId) {
deadPlayer.setRole(GameRole.OBSERVER);
playerRedisRepository.save(deadPlayer);
};
executor.schedule(task, 1, TimeUnit.SECONDS);
executor.schedule(task, 1, TimeUnit.SECONDS);*/

}
}
Expand Down
69 changes: 44 additions & 25 deletions src/main/java/com/springles/game/DayToNightManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,21 +51,6 @@ public void sendMessage(Long roomId) {
playerRedisRepository.save(player);
}

// 살아 있는 인원 업데이트
// gameSession.setAliveCivilian((int) players.stream()
// .filter(e -> e.getRole() == GameRole.CIVILIAN)
// .filter(Player::isAlive).count());
// gameSession.setAliveDoctor((int) players.stream()
// .filter(e -> e.getRole() == GameRole.DOCTOR)
// .filter(Player::isAlive).count());
// gameSession.setAliveMafia((int) players.stream()
// .filter(e -> e.getRole() == GameRole.MAFIA)
// .filter(Player::isAlive).count());
// gameSession.setAlivePolice((int) players.stream()
// .filter(e -> e.getRole() == GameRole.POLICE)
// .filter(Player::isAlive).count());
//
// gameSessionManager.saveSession(gameSession);
log.info("Room {} CIVILIAN: {}, POLICE: {}, MAFIA: {}, DOCTOR: {}",
roomId,
gameSession.getAliveCivilian(),
Expand All @@ -74,8 +59,36 @@ public void sendMessage(Long roomId) {
gameSession.getAliveDoctor());

if (gameSessionManager.isEnd(gameSession)) {
if (gameSessionManager.mafiaWin(gameSession) == 1) {
messageManager.sendMessage(
"/sub/chat/" + roomId,
"마피아팀이 승리하였습니다",
gameSession.getRoomId(), "admin"
);
}
else if (gameSessionManager.mafiaWin(gameSession) == 0) {
messageManager.sendMessage(
"/sub/chat/" + roomId,
"시민팀이 승리하였습니다",
gameSession.getRoomId(), "admin"
);
}
else {
messageManager.sendMessage(
"/sub/chat/" + roomId,
"무승부입니다",
gameSession.getRoomId(), "admin"
);
}


log.info("game end");
gameSessionManager.endGame(gameSession.getRoomId());
messageManager.sendMessage(
"/sub/chat/" + roomId + "/timer",
"end",
gameSession.getRoomId(), "admin"
);
return;
}

Expand Down Expand Up @@ -108,22 +121,28 @@ public void sendMessage(Long roomId) {

Runnable taskOne = () -> {
messageManager.sendMessage(
"/sub/chat/" + gameSession.getRoomId(),
"마피아는 죽일 사람을, 의사는 살릴 사람을, 경찰은 조사할 사람을 선택해 주세요.",
"/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.MAFIA,
"회의를 통해 제거하고 싶은 플레이어에게 투표해 주십시오. 투표 시간은 30초 입니다.",
gameSession.getRoomId(), "admin"
);
};

Runnable taskTwo = () -> {
messageManager.sendMessage(
"/sub/chat/" + roomId,
"투표는 30 초입니다.",
roomId, "admin"
"/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.POLICE,
"직업을 알아내고 싶은 플레이어에게 투표해 주십시오. 투표 시간은 30초 입니다.",
gameSession.getRoomId(), "admin"
);
messageManager.sendMessage(
"/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.DOCTOR,
"밤 사이 살려내고 싶은 플레이어에게 투표해 주십시오. 투표 시간은 30초 입니다.",
gameSession.getRoomId(), "admin"
);
messageManager.sendMessage(
"/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.CIVILIAN,
"시민은 밤에 역할이 제한 됩니다. 30초 간 대기합니다.",
gameSession.getRoomId(), "admin"
);
};
executor.schedule(taskOne, 1, TimeUnit.SECONDS);
executor.schedule(taskTwo, 1, TimeUnit.SECONDS);

executor.schedule(taskOne, 1, TimeUnit.SECONDS);

messageManager.sendMessage(
"/sub/chat/" + roomId + "/voteInfo",
Expand Down
12 changes: 10 additions & 2 deletions src/main/java/com/springles/game/GameSessionManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,6 @@ public void endGame(Long roomId) {

// MemberGameInfo 반영



gameSession.end();
gameSessionRedisRepository.save(gameSession);
List<Player> players = findPlayersByRoomId(roomId);
Expand Down Expand Up @@ -207,4 +205,14 @@ else if (gameSession.getAliveMafia() >= gameSession.getAlivePolice() + gameSessi
}
return false;
}

public int mafiaWin(GameSession gameSession) {
if (gameSession.getAliveMafia() >= gameSession.getAlivePolice() + gameSession.getAliveDoctor() + gameSession.getAliveCivilian()) {
return 1;
}
else if (gameSession.getAliveMafia() == 0) {
return 0;
}
else return 2;
}
}
Loading

0 comments on commit ef3e19c

Please sign in to comment.