@@ -39,6 +39,72 @@ export default function onRoom(room: Room) {
3939
4040 const vote : RoomPlayer [ ] = [ ] ;
4141 const votePlayers : RoomPlayer [ ] = [ ] ;
42+ const TURN_TIMEOUT = 5 * 60 * 1000 ; // 5 minutes
43+
44+ function startTurn ( player : RoomPlayer ) {
45+ currentTalkPlayer = player ;
46+ room . emit ( 'command' , { type : 'talk' , data : { player } } ) ;
47+ room . emit ( 'command' , { type : 'talk-countdown' , data : { seconds : TURN_TIMEOUT / 1000 } } ) ;
48+
49+ if ( talkTimeout ) clearTimeout ( talkTimeout ) ;
50+ talkTimeout = setTimeout ( ( ) => {
51+ room . emit ( 'message' , `[系统消息]: 玩家 ${ player . name } 发言超时,判定死亡。` ) ;
52+ handlePlayerDeath ( player ) ;
53+ } , TURN_TIMEOUT ) ;
54+ }
55+
56+ function handlePlayerDeath ( deadPlayer : RoomPlayer ) {
57+ if ( talkTimeout ) {
58+ clearTimeout ( talkTimeout ) ;
59+ talkTimeout = null ;
60+ }
61+
62+ room . emit ( 'command' , { type : 'dead' , data : { player : deadPlayer } } ) ;
63+ const deadIndex = alivePlayers . findIndex ( ( p ) => p . id == deadPlayer . id ) ;
64+ if ( deadIndex > - 1 ) alivePlayers . splice ( deadIndex , 1 ) ;
65+
66+ if ( deadPlayer . name == spyPlayer . name ) {
67+ room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。间谍死亡。玩家胜利。` ) ;
68+ room . validPlayers . forEach ( ( player ) => {
69+ if ( ! alivePlayers . some ( p => p . id === player . id ) ) alivePlayers . push ( player ) ;
70+ } ) ;
71+ room . end ( ) ;
72+ } else if ( alivePlayers . length == 2 ) {
73+ room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。间谍 ${ spyPlayer . name } 胜利。` ) ;
74+ room . validPlayers . forEach ( ( player ) => {
75+ if ( ! alivePlayers . some ( p => p . id === player . id ) ) alivePlayers . push ( player ) ;
76+ } ) ;
77+ room . end ( ) ;
78+ } else {
79+ // If game continues
80+ if ( gameStatus === 'voting' ) {
81+ // If death happened during voting (e.g. voted out), we need to start next round
82+ gameStatus = 'talking' ;
83+ startTurn ( alivePlayers [ 0 ] ) ;
84+ room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。游戏继续。玩家 ${ alivePlayers [ 0 ] . name } 发言。` ) ;
85+ } else {
86+ // If death happened during talking (timeout), move to next player
87+ // We need to find who is next. Since deadPlayer is removed, we need to be careful.
88+ // If deadPlayer was currentTalkPlayer, we need the next one in list.
89+ // But alivePlayers is already updated.
90+ // If deadPlayer was at index i, the new player at index i is the next one.
91+ // Unless deadPlayer was last, then index i is out of bounds?
92+ // Actually, handleTalkEnd logic was: find index, take index+1.
93+ // Here we removed the player. So the player at `deadIndex` is the next player.
94+
95+ let nextPlayer = alivePlayers [ deadIndex ] ;
96+ if ( ! nextPlayer ) {
97+ // If we reached end of list, start voting
98+ room . emit ( 'message' , `[系统消息]: 所有玩家都已发言,投票开始。` ) ;
99+ room . emit ( 'command' , { type : 'vote' } ) ;
100+ gameStatus = 'voting' ;
101+ } else {
102+ startTurn ( nextPlayer ) ;
103+ room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。游戏继续。玩家 ${ nextPlayer . name } 发言。` ) ;
104+ }
105+ }
106+ }
107+ }
42108
43109 function handleTalkEnd ( sender : RoomPlayer ) {
44110 if ( talkTimeout ) {
@@ -56,9 +122,9 @@ export default function onRoom(room: Room) {
56122 gameStatus = 'voting' ;
57123 return ;
58124 }
59- currentTalkPlayer = nextPlayer ;
125+
60126 room . emit ( 'message' , `[系统消息]: 玩家 ${ sender . name } 发言结束。玩家 ${ nextPlayer . name } 开始发言。` ) ;
61- room . emit ( 'command' , { type : 'talk' , data : { player : nextPlayer } } ) ;
127+ startTurn ( nextPlayer ) ;
62128 }
63129
64130 room . on ( 'player-command' , ( message : MessagePackage ) => {
@@ -150,14 +216,9 @@ export default function onRoom(room: Room) {
150216 room . emit ( 'message' , `[系统消息]: 玩家 ${ maxVotePlayer . map ( p => p ! . name ) . join ( ',' ) } 投票相同。无人死亡。` ) ;
151217 vote . splice ( 0 , vote . length ) ;
152218 votePlayers . splice ( 0 , votePlayers . length ) ;
153- currentTalkPlayer = alivePlayers [ 0 ] ;
154- room . emit ( 'command' , { type : 'talk' , data : { player : currentTalkPlayer } } ) ;
155219 gameStatus = 'talking' ;
156- room . emit ( 'message' , `[系统消息]: 游戏继续。玩家 ${ currentTalkPlayer . name } 发言。` ) ;
157- if ( talkTimeout ) {
158- clearTimeout ( talkTimeout ) ;
159- talkTimeout = null ;
160- }
220+ room . emit ( 'message' , `[系统消息]: 游戏继续。玩家 ${ alivePlayers [ 0 ] . name } 发言。` ) ;
221+ startTurn ( alivePlayers [ 0 ] ) ;
161222 return ;
162223 }
163224
@@ -166,27 +227,7 @@ export default function onRoom(room: Room) {
166227 gameStatus = 'waiting' ;
167228
168229 const deadPlayer = maxVotePlayer [ 0 ] ! ;
169- room . emit ( 'command' , { type : 'dead' , data : { player : deadPlayer } } ) ;
170- alivePlayers . splice ( alivePlayers . findIndex ( ( p ) => p . id == deadPlayer . id ) , 1 ) ;
171-
172- if ( deadPlayer . name == spyPlayer . name ) {
173- room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。间谍死亡。玩家胜利。` ) ;
174- } else if ( alivePlayers . length == 2 ) {
175- room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。间谍 ${ spyPlayer . name } 胜利。` ) ;
176- } else {
177- gameStatus = 'talking' ;
178- currentTalkPlayer = alivePlayers [ 0 ] ;
179- room . emit ( 'command' , { type : 'talk' , data : { player : currentTalkPlayer } } ) ;
180- if ( talkTimeout ) {
181- clearTimeout ( talkTimeout ) ;
182- talkTimeout = null ;
183- }
184- return room . emit ( 'message' , `[系统消息]: 玩家 ${ deadPlayer . name } 死亡。游戏继续。` ) ;
185- }
186- room . validPlayers . forEach ( ( player , index ) => {
187- alivePlayers . push ( player ) ;
188- } )
189- room . end ( ) ;
230+ handlePlayerDeath ( deadPlayer ) ;
190231 break ;
191232 case 'status' : {
192233 const playerIndex = room . validPlayers . findIndex ( ( p ) => p . id == message . data . id ) ;
@@ -240,8 +281,8 @@ export default function onRoom(room: Room) {
240281 alivePlayers . push ( player ) ;
241282 } )
242283 room . emit ( 'message' , `[系统消息]: 游戏开始。玩家 ${ room . validPlayers [ 0 ] . name } 首先发言。` ) ;
243- room . emit ( 'command' , { type : 'talk' , data : { player : currentTalkPlayer = room . validPlayers [ 0 ] } } ) ;
244284 gameStatus = 'talking' ;
285+ startTurn ( room . validPlayers [ 0 ] ) ;
245286 } ) . on ( 'end' , ( ) => {
246287 console . log ( "room end" ) ;
247288 if ( talkTimeout ) {
0 commit comments