Skip to content

Commit 40ead38

Browse files
committed
bm: broadcast ready mask at end of battle. Fix packet sizes
Owner now sees the room unlocked. Get rid of player list hack. Broadcast ready mask when game ack the end battle response. Fix all packet sizes.
1 parent c9ccaa6 commit 40ead38

3 files changed

Lines changed: 29 additions & 50 deletions

File tree

bm_dissect.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,8 @@ int main(int argc, char *argv[])
291291
bomb.readFrom(p);
292292
if (bomb.type != 0 && bomb.type != 1 && bomb.type != 4)
293293
printf(" [%d] Unknown type %d\n", i, bomb.type);
294-
if (bomb.slot > 7)
295-
printf(" [%d] INVALID SLOT %d\n", i, bomb.slot);
296294
if (bomb.pos.x == 0 && bomb.pos.y == 0)
297295
continue;
298-
if (bomb.type == 4 && bomb.slot != i)
299-
printf(" SLOT HIJACK!\n");
300296
printf(" BOMB[%d]: %d %d type %d slot %d size %d unknown %d %04x\n",
301297
i, bomb.pos.x, bomb.pos.y, bomb.type, bomb.slot,
302298
bomb.size, bomb.unk2, bomb.param2);
@@ -327,7 +323,8 @@ int main(int argc, char *argv[])
327323
// 00 00 30 00
328324
// 00 00 b1 01
329325
// 00 00 31 01
330-
printf(" POWER-UP[%d]: %d %d state %X slot %d unk %x %x\n", i, pup.pos.x, pup.pos.y, pup.state, pup.slot, pup.unk1, pup.unk2);
326+
printf(" POWER-UP[%d]: %d %d state %X slot %d bombUp %d bombSlot %d\n", i, pup.pos.x, pup.pos.y, pup.state,
327+
pup.slot, pup.bombUp, (pup.bombSlotHigh << 2) | pup.bombSlotLow);
331328
//dumpData(data + 0x10, size - 0x10, " ");
332329
//break;
333330
}

bomberman.cpp

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ uint32_t BMRoom::getPlayerCount() const {
6565

6666
void 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

8787
void 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
187185
void 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

234232
int 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

bomberman.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,10 @@ struct PowerUp
164164
union {
165165
uint16_t param;
166166
struct {
167-
uint16_t unk1:4; // set to 1 for bomb-up items
168-
uint16_t unk2:4;
167+
uint16_t bombUp:1;
168+
uint16_t bombSlotLow:2;
169+
uint16_t unk:1;
170+
uint16_t bombSlotHigh:4;
169171
uint16_t slot:4;
170172
uint16_t state:4;
171173
};

0 commit comments

Comments
 (0)