From 707b021c887f92e62993e50a5258a344d94778a7 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Fri, 3 Mar 2023 19:34:53 -0800 Subject: [PATCH] fix enemy_id usage in 6xC8 --- src/CommandFormats.hh | 4 ++-- src/ReceiveCommands.cc | 2 ++ src/ReceiveSubcommands.cc | 20 ++++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index f07a40e7..63fcd36d 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -3291,7 +3291,7 @@ struct G_Unknown_6x09 { struct G_EnemyHitByPlayer_6x0A { G_EnemyIDHeader header; // Note: enemy_id (in header) is in the range [0x1000, 0x4000) - le_uint16_t enemy_id2; + le_uint16_t enemy_id; le_uint16_t damage; be_uint32_t flags; } __packed__; @@ -4929,7 +4929,7 @@ struct G_SortInventory_6xC4 { struct G_EnemyKilled_6xC8 { G_EnemyIDHeader header; - le_uint16_t enemy_id2; + le_uint16_t enemy_id; le_uint16_t killer_client_id; le_uint32_t unused; } __packed__; diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index b6d17cb0..83341ce8 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -3207,6 +3207,8 @@ shared_ptr create_game_generic( game->next_game_item_id = 0x00810000; for (size_t area = 0; area < 0x10; area++) { + c->log.info("[Map/%zu] Using variations %" PRIX32 ", %" PRIX32, + area, game->variations[area * 2].load(), game->variations[area * 2 + 1].load()); auto filenames = map_filenames_for_variation( game->episode, is_solo, diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 9f7553a2..d0ecdaad 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -1037,15 +1037,15 @@ static void on_enemy_hit(shared_ptr, if (!l->is_game()) { return; } - if (cmd.header.enemy_id >= l->enemies.size()) { + if (cmd.enemy_id >= l->enemies.size()) { return; } - if (l->enemies[cmd.header.enemy_id].hit_flags & 0x80) { + if (l->enemies[cmd.enemy_id].hit_flags & 0x80) { return; } - l->enemies[cmd.header.enemy_id].hit_flags |= (1 << c->lobby_client_id); - l->enemies[cmd.header.enemy_id].last_hit = c->lobby_client_id; + l->enemies[cmd.enemy_id].hit_flags |= (1 << c->lobby_client_id); + l->enemies[cmd.enemy_id].last_hit = c->lobby_client_id; } forward_subcommand(l, c, command, flag, data); @@ -1062,21 +1062,21 @@ static void on_enemy_killed(shared_ptr s, if (!l->is_game()) { throw runtime_error("client should not kill enemies outside of games"); } - if (cmd.header.enemy_id >= l->enemies.size()) { + if (cmd.enemy_id >= l->enemies.size()) { send_text_message(c, u"$C6Missing enemy killed"); return; } - string e_str = l->enemies[cmd.header.enemy_id].str(); - c->log.info("Enemy killed: entry %hu => %s", cmd.header.enemy_id.load(), e_str.c_str()); - if (l->enemies[cmd.header.enemy_id].hit_flags & 0x80) { + string e_str = l->enemies[cmd.enemy_id].str(); + c->log.info("Enemy killed: entry %hu => %s", cmd.enemy_id.load(), e_str.c_str()); + if (l->enemies[cmd.enemy_id].hit_flags & 0x80) { return; // Enemy is already dead } - if (l->enemies[cmd.header.enemy_id].experience == 0xFFFFFFFF) { + if (l->enemies[cmd.enemy_id].experience == 0xFFFFFFFF) { send_text_message(c, u"$C6Unknown enemy type killed"); return; } - auto& enemy = l->enemies[cmd.header.enemy_id]; + auto& enemy = l->enemies[cmd.enemy_id]; enemy.hit_flags |= 0x80; for (size_t x = 0; x < l->max_clients; x++) { if (!((enemy.hit_flags >> x) & 1)) {