fix DC prototypes level up command

This commit is contained in:
Martin Michelsen
2023-12-27 09:33:12 -08:00
parent d7e390e494
commit 2dd7601dbd
2 changed files with 28 additions and 9 deletions
+4
View File
@@ -4122,6 +4122,10 @@ struct G_HitByEnemy_6x2F {
// 6x30: Level up // 6x30: Level up
struct G_LevelUp_DCNTE_6x30 {
G_ClientIDHeader header;
} __packed__;
struct G_LevelUp_6x30 { struct G_LevelUp_6x30 {
G_ClientIDHeader header; G_ClientIDHeader header;
le_uint16_t atp = 0; le_uint16_t atp = 0;
+24 -9
View File
@@ -2126,21 +2126,36 @@ static void on_charge_attack_bb(shared_ptr<Client> c, uint8_t command, uint8_t f
} }
static void on_level_up(shared_ptr<Client> c, uint8_t command, uint8_t flag, void* data, size_t size) { static void on_level_up(shared_ptr<Client> c, uint8_t command, uint8_t flag, void* data, size_t size) {
const auto& cmd = check_size_t<G_LevelUp_6x30>(data, size);
auto l = c->require_lobby(); auto l = c->require_lobby();
if (!l->is_game()) { if (!l->is_game()) {
return; return;
} }
// On the DC prototypes, this command doesn't include any stats - it just
// increments the player's level by 1.
auto p = c->character(); auto p = c->character();
p->disp.stats.char_stats.atp = cmd.atp; if (is_pre_v1(c->version())) {
p->disp.stats.char_stats.mst = cmd.mst; check_size_t<G_LevelUp_DCNTE_6x30>(data, size);
p->disp.stats.char_stats.evp = cmd.evp; auto s = c->require_server_state();
p->disp.stats.char_stats.hp = cmd.hp; const auto& level_incrs = s->level_table->stats_delta_for_level(p->disp.visual.char_class, p->disp.stats.level + 1);
p->disp.stats.char_stats.dfp = cmd.dfp; p->disp.stats.char_stats.atp += level_incrs.atp;
p->disp.stats.char_stats.ata = cmd.ata; p->disp.stats.char_stats.mst += level_incrs.mst;
p->disp.stats.level = cmd.level.load(); p->disp.stats.char_stats.evp += level_incrs.evp;
p->disp.stats.char_stats.hp += level_incrs.hp;
p->disp.stats.char_stats.dfp += level_incrs.dfp;
p->disp.stats.char_stats.ata += level_incrs.ata;
p->disp.stats.char_stats.lck += level_incrs.lck;
p->disp.stats.level++;
} else {
const auto& cmd = check_size_t<G_LevelUp_6x30>(data, size);
p->disp.stats.char_stats.atp = cmd.atp;
p->disp.stats.char_stats.mst = cmd.mst;
p->disp.stats.char_stats.evp = cmd.evp;
p->disp.stats.char_stats.hp = cmd.hp;
p->disp.stats.char_stats.dfp = cmd.dfp;
p->disp.stats.char_stats.ata = cmd.ata;
p->disp.stats.level = cmd.level.load();
}
forward_subcommand(c, command, flag, data, size); forward_subcommand(c, command, flag, data, size);
} }