From 678c60dd1429541a920a09fd4f9df5790abb29b7 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 15 Nov 2025 22:36:18 -0800 Subject: [PATCH] update some notes; fix quest assembler bugs --- src/CommandFormats.hh | 19 +++++++++++++------ src/QuestScript.cc | 9 +++++++-- src/ReceiveSubcommands.cc | 4 +--- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index 61392642..4cab9fbb 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -6201,7 +6201,7 @@ struct G_GiveExperience_Extension_BB_6xBF { le_uint16_t unused = 0; } __packed_ws__(G_GiveExperience_Extension_BB_6xBF, 0x0C); -// 6xC0: Sell item at shop (BB) (protected on V3/V4) +// 6xC0: Sell item at shop (BB) (protected) struct G_SellItemAtShop_BB_6xC0 { G_UnusedHeader header; @@ -6281,10 +6281,10 @@ struct G_AdjustPlayerMeseta_BB_6xC9 { // 6xCA: Request item reward from quest (BB; handled by server) -struct G_ItemRewardRequest_BB_6xCA { +struct G_QuestCreateItem_BB_6xCA { G_UnusedHeader header; ItemData item_data; -} __packed_ws__(G_ItemRewardRequest_BB_6xCA, 0x18); +} __packed_ws__(G_QuestCreateItem_BB_6xCA, 0x18); // 6xCB: Transfer item via mail message (BB) @@ -6330,7 +6330,14 @@ struct G_ChallengeModeGraveRecoveryItemRequest_BB_6xD1 { le_uint16_t floor = 0; le_uint16_t room_id = 0; VectorXZF pos; - le_uint32_t item_type = 0; // Should be < 6 + // Values for item_type: + // 0 = Monomate x1 + // 1 = Dimate x1 + // 2 = Trimate x1 + // 3 = Monofluid x1 + // 4 = Difluid x1 + // 5 = Trifluid x1 + le_uint32_t item_type = 0; } __packed_ws__(G_ChallengeModeGraveRecoveryItemRequest_BB_6xD1, 0x14); // 6xD2: Set quest counter (BB) @@ -6359,13 +6366,13 @@ struct G_Unknown_BB_6xD4 { // 6xD5: Exchange item in quest (BB; handled by server) // The client sends this when it executes an F953 quest opcode. -struct G_ExchangeItemInQuest_BB_6xD5 { +struct G_QuestExchangeItem_BB_6xD5 { G_ClientIDHeader header; ItemData find_item; // Only data1[0]-[2] are used ItemData replace_item; // Only data1[0]-[2] are used le_uint16_t success_label = 0; le_uint16_t failure_label = 0; -} __packed_ws__(G_ExchangeItemInQuest_BB_6xD5, 0x30); +} __packed_ws__(G_QuestExchangeItem_BB_6xD5, 0x30); // 6xD6: Wrap item (BB; handled by server) diff --git a/src/QuestScript.cc b/src/QuestScript.cc index ce434d40..9bedca32 100644 --- a/src/QuestScript.cc +++ b/src/QuestScript.cc @@ -3351,10 +3351,15 @@ std::string disassemble_quest_script( } else { dasm_line += "... "; - if (def->args.size() != arg_stack_values.size()) { + if (def->args.size() > arg_stack_values.size()) { dasm_line += std::format("/* matching error: expected {} arguments, received {} arguments */", def->args.size(), arg_stack_values.size()); } else { + if (def->args.size() < arg_stack_values.size()) { + dasm_line += std::format("/* warning: expected {} arguments, received {} arguments */", + def->args.size(), arg_stack_values.size()); + } + bool is_first_arg = true; for (size_t z = 0; z < def->args.size(); z++) { const auto& arg_def = def->args[z]; @@ -3679,7 +3684,7 @@ std::string disassemble_quest_script( phosg::StringReader r = cmd_r.sub(l->offset, size); lines.emplace_back(" // As VectorXYZTF"); while (r.remaining() >= sizeof(VectorXYZTF)) { - size_t offset = l->offset + cmd_r.where(); + size_t offset = l->offset + r.where(); const auto& e = r.get(); lines.emplace_back(std::format(" {:04X} vector x={:g}, y={:g}, z={:g}, t={:g}", offset, e.x, e.y, e.z, e.t)); } diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index be556012..037bb26b 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -5683,6 +5683,4 @@ asio::awaitable on_subcommand_multi(shared_ptr c, Channel::Message } } -// TODO; // Dark Falz EXP doesn't work -// TODO; // Guild Card Search doesn't work -// TODO; // Team Search doesn't work +// NOCOMMIT: Make BB item creation opcodes use the quests' create masks