@@ -65,7 +65,7 @@ uint32_t BMRoom::getPlayerCount() const {
6565
6666void BMRoom::sendRosterList (Packet& packet)
6767{
68- BMCmd cmd { BMCmd::ROSTER_LIST , 0 };
68+ BMCmd cmd { BMCmd::ROSTER_LIST , ( uint16_t )( 4 + 8 * players. size () + 4 * getPlayerCount ()) };
6969 packet.init (Packet::REQ_CHAT );
7070 packet.flags |= Packet::FLAG_RUDP ;
7171 packet.writeData (cmd.full );
@@ -86,8 +86,8 @@ void BMRoom::sendRosterList(Packet& packet)
8686
8787void BMRoom::makeRoomJoin (Packet& packet, const Player *player)
8888{
89- BMCmd cmd{} ;
90- cmd. command = BMCmd::ROOM_JOIN ;
89+ const uint32_t slots = getSlotCount (player) ;
90+ BMCmd cmd { BMCmd::ROOM_JOIN , ( uint16_t )( 24 + 4 * slots) } ;
9191 packet.init (Packet::REQ_CHAT );
9292 packet.flags |= Packet::FLAG_RUDP ;
9393 packet.writeData (cmd.full );
@@ -96,7 +96,6 @@ void BMRoom::makeRoomJoin(Packet& packet, const Player *player)
9696 packet.writeData ((uint32_t )getPlayerIndex (player)); // FIXME [915] [0-F]? client id?
9797 uint32_t pos = (uint32_t )getPlayerPosition (player);
9898 packet.writeData (pos); // player pos [916]
99- uint32_t slots = getSlotCount (player);
10099 packet.writeData (slots - 1 ); // guest count [911]
101100 packet.writeData (owner->getId ()); // room owner kage id [912]
102101 packet.writeData ((uint32_t )getPlayerPosition (owner)); // room owner player pos [913]
@@ -148,8 +147,7 @@ void BMRoom::broadcastKeyholder() const
148147{
149148
150149 Packet packet;
151- BMCmd cmd{};
152- cmd.command = BMCmd::NEW_MASTER ;
150+ BMCmd cmd { BMCmd::NEW_MASTER , 8 };
153151 packet.init (Packet::REQ_CHAT );
154152 packet.flags |= Packet::FLAG_RUDP ;
155153 packet.writeData (cmd.full );
@@ -187,9 +185,7 @@ uint8_t BMRoom::getSlotMask(const Player *player) const
187185void BMRoom::broadcastReadySlotMask () const
188186{
189187 Packet packet;
190- BMCmd cmd{};
191- cmd.command = BMCmd::READY_MASK ;
192- cmd.size = 4 ;
188+ BMCmd cmd { BMCmd::READY_MASK , 4 };
193189 packet.init (Packet::REQ_CHAT );
194190 packet.flags |= Packet::FLAG_RUDP ;
195191 packet.writeData (cmd.full );
@@ -204,9 +200,7 @@ void BMRoom::sendGameStarting(Packet& packet, uint16_t clientId, uint32_t random
204200{
205201 gameStarting = true ;
206202 this ->random = random;
207- BMCmd cmd {};
208- cmd.command = BMCmd::GAME_STARTING ;
209- cmd.size = 4 ;
203+ BMCmd cmd { BMCmd::GAME_STARTING , 4 };
210204 packet.init (Packet::REQ_CHAT );
211205 packet.flags |= Packet::FLAG_RUDP ;
212206 packet.writeData (cmd.full );
@@ -229,6 +223,10 @@ void BMRoom::rudpAcked(Player *player)
229223 if (!packet.empty ())
230224 player->send (packet);
231225 }
226+ else {
227+ // end of battle
228+ broadcastReadySlotMask ();
229+ }
232230}
233231
234232int BMRoom::getSlotCount (const Player *player) const
@@ -281,8 +279,7 @@ void BMRoom::sendRules(Packet& packet)
281279 if (rules[8 ] == 0 )
282280 // rules not set
283281 return ;
284- BMCmd cmd {};
285- cmd.command = BMCmd::ACCEPT_RULES ; // means "new rules" when sent to game
282+ BMCmd cmd { BMCmd::ACCEPT_RULES , (uint16_t )rules.size () }; // means "new rules" when sent to game
286283 packet.init (Packet::REQ_CHAT );
287284 packet.flags |= Packet::FLAG_RUDP ;
288285 packet.writeData (cmd.full );
@@ -379,7 +376,7 @@ void BMRoom::savePowerUps(Player *player, const uint8_t *data)
379376 // Successful pick up
380377 // claimed -> (granted) -> owned
381378 // Hyper bomber death sequence:
382- // owned -> released (with coords, unk1=1 ) -> (lost) -> appearing -> visible
379+ // owned -> released (with coords) -> (lost) -> appearing -> visible
383380 for (unsigned i = 0 ; i < powerUps.size (); i++)
384381 {
385382 PowerUp pup (data + i * sizeof (pup));
@@ -426,13 +423,13 @@ void BMRoom::savePowerUps(Player *player, const uint8_t *data)
426423 // Item has been lost. Happens when a player dies and releases his items
427424 pup.state = PowerUp::Lost;
428425 powerUps[i] = pup;
429- DEBUG_LOG (game, " PowerUp Owned -> Released (Lost). Slot %d coords %d %d" , pup.slot , pup.pos .x , pup.pos .y );
430- if (pup.unk1 != 0 )
426+ DEBUG_LOG (game, " PowerUp[%d] Owned -> Released (Lost). Slot %d coords %d %d" , i , pup.slot , pup.pos .x , pup.pos .y );
427+ if (pup.bombUp == 1 )
431428 releaseBombSlot (pup.slot , i);
432429 }
433430 else if (pup.state != PowerUp::Owned) {
434- DEBUG_LOG (game, " PowerUp transitioning from owned to %x? slot %d" ,
435- pup.state , pup.slot );
431+ DEBUG_LOG (game, " PowerUp[%d] transitioning from owned to %x? slot %d" ,
432+ i, pup.state , pup.slot );
436433 // end of game?
437434 powerUps[i] = pup;
438435 }
@@ -448,12 +445,12 @@ void BMRoom::savePowerUps(Player *player, const uint8_t *data)
448445 {
449446 DEBUG_LOG (game, " PowerUp[%d] Judge -> Granted. pos %d %d slot %d unk %02x" , i, pup.pos .x , pup.pos .y , pup.slot , pup.param & 0xff );
450447 pup.state = PowerUp::Granted;
451- if (pup.unk1 == 1 )
448+ if (pup.bombUp == 1 )
452449 {
453450 // Bomb-up item -> assign bomb slot for new bomb
454451 int idx = assignBombSlot (pup.slot , i);
455- pup.unk1 = (pup. unk1 & 9 ) | (( idx & 3 ) << 1 ) ;
456- pup.unk2 = idx >> 2 ;
452+ pup.bombSlotLow = idx & 3 ;
453+ pup.bombSlotHigh = idx >> 2 ;
457454 }
458455 powerUpClaims[i] = 0 ;
459456 powerUps[i] = pup;
@@ -469,7 +466,7 @@ void BMRoom::savePowerUps(Player *player, const uint8_t *data)
469466 && pup.state != PowerUp::Claimed
470467 && pup.state != 9 // TODO what is this?
471468 && pup.slot == powerUps[i].slot )
472- WARN_LOG (game, " PowerUp current state not handled: Granted -> %x" , pup.state );
469+ WARN_LOG (game, " PowerUp[%d] current state not handled: Granted -> %x" , i , pup.state );
473470 break ;
474471
475472 case PowerUp::Lost:
@@ -1092,29 +1089,12 @@ bool BombermanServer::handlePacket(Player *player, const uint8_t *data, size_t l
10921089 // a8 14 00 11 00 00 10 02 00 00 00 10 00 00 00 00 ................
10931090 // 26 00 80 00 &...
10941091 INFO_LOG (game, " %s: END BATTLE" , player->getName ().c_str ());
1095- if (player == room->getOwner ())
1096- {
1097- // Hack to avoid disconnection error by the room owner
1098- replyPacket.init (Packet::REQ_QRY_USERS );
1099- replyPacket.writeData (0u );
1100- replyPacket.writeData (0u );
1101- const std::vector<Player *>& players = room->getPlayers ();
1102- replyPacket.writeData ((uint32_t )players.size ());
1103- for (Player *pl : players)
1104- {
1105- replyPacket.writeData (pl->getName ().c_str (), 0x10 );
1106- replyPacket.writeData (pl->getId ());
1107- const auto & extra = pl->getExtraData ();
1108- replyPacket.writeData ((uint32_t )extra.size ());
1109- replyPacket.writeData (extra.data (), extra.size ());
1110- }
1111- player->send (replyPacket);
1112- replyPacket.reset ();
1113- }
11141092 room->endBattle (player);
11151093
11161094 replyPacket.init (Packet::REQ_NOP );
1095+ replyPacket.flags |= Packet::FLAG_RUDP ;
11171096 player->ackPacket (replyPacket, data);
1097+ player->notifyRoomOnAck ();
11181098 break ;
11191099 }
11201100
@@ -1169,7 +1149,7 @@ bool BombermanServer::handlePacket(Player *player, const uint8_t *data, size_t l
11691149 DEBUG_LOG (game, " %s: ping" , player->getName ().c_str ());
11701150 replyPacket.init (Packet::REQ_CHAT );
11711151 replyPacket.writeData (cmd.full );
1172- replyPacket.writeData (( uint16_t ) data[ 0x12 ] ); // Client ID
1152+ replyPacket.writeData (read16 ( data, 0x12 ) ); // Client ID
11731153 replyPacket.writeData (data + 0x14 , 5 );
11741154 break ;
11751155
0 commit comments