From 5842d70094dbbc345ccc634fa47191f967156f5c Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Mon, 19 Jun 2023 19:20:11 -0700 Subject: [PATCH] implement meseta/item reward commands on BB --- src/CommandFormats.hh | 13 ++++++++++++- src/ReceiveSubcommands.cc | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index e458a819..b5ab0b43 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -5247,9 +5247,20 @@ struct G_EnemyKilled_BB_6xC8 { le_uint32_t unused; } __packed__; -// 6xC9: Meseta reward from quest (BB; handled by server) +// 6xC9: Request meseta reward from quest (BB; handled by server) + +struct G_MesetaRewardRequest_BB_6xC9 { + G_UnusedHeader header; + le_uint32_t amount; +} __packed__; + // 6xCA: Item reward from quest (BB; handled by server) +struct G_ItemRewardRequest_BB_6xCA { + G_UnusedHeader header; + ItemData item_data; +} __packed__; + // 6xCB: Request to transfer item (BB) struct G_ItemTransferRequest_BB_6xCB { diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index b0897f72..4db01182 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -1502,6 +1502,40 @@ static void on_enemy_killed_bb(shared_ptr s, } } +void on_meseta_reward_request_bb(shared_ptr, + shared_ptr l, shared_ptr c, uint8_t, uint8_t, + const void* data, size_t size) { + const auto& cmd = check_size_t(data, size); + + auto p = c->game_data.player(); + if (cmd.amount < 0) { + if (-cmd.amount > p->disp.meseta) { + p->disp.meseta = 0; + } else { + p->disp.meseta += cmd.amount; + } + } else { + PlayerInventoryItem item; + item.data.data1[0] = 0x04; + item.data.data2d = cmd.amount; + item.data.id = l->generate_item_id(0xFF); + c->game_data.player()->add_item(item); + send_create_inventory_item(l, c, item.data); + } +} + +void on_item_reward_request_bb(shared_ptr, + shared_ptr l, shared_ptr c, uint8_t, uint8_t, + const void* data, size_t size) { + const auto& cmd = check_size_t(data, size); + + PlayerInventoryItem item; + item.data = cmd.item_data; + item.data.id = l->generate_item_id(0xFF); + c->game_data.player()->add_item(item); + send_create_inventory_item(l, c, item.data); +} + static void on_destroy_inventory_item(shared_ptr, shared_ptr l, shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { @@ -1900,8 +1934,8 @@ subcommand_handler_t subcommand_handlers[0x100] = { /* 6xC6 */ nullptr, /* 6xC7 */ on_charge_attack_bb, /* 6xC8 */ on_enemy_killed_bb, - /* 6xC9 */ nullptr, - /* 6xCA */ nullptr, + /* 6xC9 */ on_meseta_reward_request_bb, + /* 6xCA */ on_item_reward_request_bb, /* 6xCB */ nullptr, /* 6xCC */ nullptr, /* 6xCD */ nullptr,