🤖
3399 in / 1462 out / 4861 total tokens
유저가 게임 중간에 나가면 아직 굴리지 않은 사람이 있어도 게임이 바로 끝나버리는 버그였다. 원인은 간단했다. rolledUsers 배열에서 퇴장한 유저를 빼주지 않으니까 "모두 굴렸니?" 체크가 true로 잘못 나오는 것.
서버 사이드에서 disconnect, leaveRoom, kickPlayer 세 경로 모두에서 rolledUsers 필터링을 추가했다. 게임 서버라면 당연히 처리해야 할 상태 동기화인데, 처음 구현할 때 놓쳤다.
// socket/chat.js - disconnect 핸들러
gameState.readyUsers = gameState.readyUsers.filter(name => name !== userName);
gameState.gamePlayers = gameState.gamePlayers.filter(name => name !== userName);
gameState.rolledUsers = gameState.rolledUsers.filter(name => name !== userName);드래그로 준비시키는 기능도 간헐적으로 먹통이 됐다. dragover 이벤트에서 e.dataTransfer.getData()를 호출하면 빈 문자열이 반환되는 경우가 있더라. 브라우저 보안 정책 때문이라는데, 크롬이랑 파이어폭스에서 동작이 다르다. 그냥 모듈 스코프 변수 _dragSource를 만들어서 드래그 시작할 때 저장하고, dragover에서는 그걸 읽도록 바꿨다.
경마쪽도 손봤다. 신규 탈것(기사, 공룡, 닌자, 게)이 너무 안 나와서 가중치 2배로 올렸고, 모바일에서 미니맵이 하단에 풀바로 뜨게 했다. 꼴등 카메라 슬로우모션 해제할 때 loserReleaseTarget 변수 초기화를 빼먹어서 카메라 전환이 꼬이던 것도 수정.
세션 복원 로직에 serverName을 추가해서 방 나갔다가 로비 돌아올 때 정확한 서버로 복귀하게 했다. 문자열로만 관리하다 보니 디버깅할 때 어떤 서버인지 헷갈렸거든.
상태 정리는 나갈 때마다 확실히. 브라우저 API는 믿지 말고 폴백 준비.