diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index 412c2e80..60eb47f7 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -4821,7 +4821,7 @@ struct G_SetTelepipeState_6x68 { struct G_NPCControl_6x69 { G_UnusedHeader header; - le_uint16_t param1; // Commands 0/3: state; command 1: npc_entity_id; command 2: unknown + le_uint16_t param1; // Commands 0/3: state; command 1: npc_entity_id; command 2: player to follow le_uint16_t param2; // Commands 0/3: npc_entity_id; commands 1/2: unused le_uint16_t command = 0; // 0 = create follower NPC, 1 = stop acting, 2 = start acting, 3 = create attacker NPC le_uint16_t param3; // Commands 0/3: npc_template_index; commands 1/2: unused diff --git a/src/Main.cc b/src/Main.cc index 66e82c65..26e48ba7 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -2069,11 +2069,13 @@ Action a_describe_item( Action a_name_all_items( "name-all-items", nullptr, +[](phosg::Arguments& args) { auto s = make_shared(get_config_filename(args)); + s->clear_file_caches(false); s->load_config_early(); s->load_patch_indexes(false); s->load_text_index(false); s->load_item_definitions(false); s->load_item_name_indexes(false); + s->load_ep3_cards(false); s->load_config_late(); set all_primary_identifiers; diff --git a/src/QuestScript.cc b/src/QuestScript.cc index 61bb46b8..516e09c6 100644 --- a/src/QuestScript.cc +++ b/src/QuestScript.cc @@ -1030,7 +1030,7 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = { // npc_text_id (on v3 and later). // valueA = situation number: // 00: NPC engaging in combat - // 01: NPC in danger + // 01: NPC in danger (HP <= 75% if near player, <= 25% if far away?) // 02: NPC casting any technique except those in cases 16 and 17 below // 03: NPC has 20% or less TP // 04: NPC died @@ -1041,14 +1041,14 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = { // 09: Player received a status effect // 0A: Unknown (possibly unused) // 0B: NPC standing still for 3 minutes - // 0C: NPC received a status effect (TODO: verify this) + // 0C: Player in danger? (Like 01 but players reversed?) // 0D: NPC completed 3-hit combo - // 0E: NPC knocked down - // 0F: NPC was hit - // 10: NPC is walking - // 11: NPC was healed + // 0E: NPC hit for > 30% of max HP + // 0F: NPC hit for > 20% of max HP (and <= 30%) + // 10: NPC hit for > 1% of max HP (and <= 20%) + // 11: NPC healed by another player // 12: Room cleared (set event cleared which did not trigger another set) - // 13: NPC used an item + // 13: NPC used a recovery item // 14: NPC cannot heal / recover // 15: Wave but not room cleared (set event triggered by another set) // 16: NPC casting Resta or Anti @@ -1137,7 +1137,11 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = { {0xD2, "enable_mainmenu", nullptr, {}, F_V1_V4}, {0xD3, "disable_mainmenu", nullptr, {}, F_V1_V4}, - // TODO: Document these + // Enables or disables battle music override. When enabled, the battle + // segments of the BGM will play regardless of whether there are enemies + // nearby. Changing this value only takes effect after any currently-queued + // music segments are done playing. The override is cleared upon changing + // areas. {0xD4, "start_battlebgm", nullptr, {}, F_V1_V4}, {0xD5, "end_battlebgm", nullptr, {}, F_V1_V4}, @@ -1159,9 +1163,11 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = { // TODO: Document these {0xDA, "set_returnhunter", nullptr, {}, F_V1_V4}, {0xDB, "set_returncity", nullptr, {}, F_V1_V4}, + + // TODO: Document this {0xDC, "load_pvr", nullptr, {}, F_V1_V4}, - // Seems incomplete on V3 and BB - has some similar codepaths as load_pvr, - // but the function that actually process the data seems to do nothing + // TODO: Document this + // Does nothing on all non-DC versions. {0xDD, "load_midi", nullptr, {}, F_V1_V4}, // Finds an item in the player's bank, and clears its entry in the bank. @@ -1170,7 +1176,30 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = { {0xDE, "item_detect_bank", "unknownDE", {{REG_SET_FIXED, 6}, REG}, F_V1_V4}, // Sets NPC AI behaviors. - // TODO(DX): Describe what goes in regsA and regB. + // regsA[0] = unknown (TODO) + // regsA[1] = base level. NPC's actual level depends on difficulty: + // Normal: min(base level + 1, 199) + // Hard: min(base level + 26, 199) + // Very Hard: min(base level + 51, 199) + // Ultimate: min(base level + 151, 199) + // regsA[2] = technique flags; bit field: + // 04 = has Foie and Gifoie (overrides 08 and 10) + // 08 = has Barta and Gibarta (overrides 10) + // 10 = has Zonde and Razonde + // 40 = unknown (TODO) + // 80 = unknown (TODO) + // regsA[3] = enemy lock-on range + // regsA[4] = unknown (TODO) + // regsA[5] = max distance from player + // regsA[6] = enemy unlock range + // regsA[7] = block range + // regsA[8] = attack range (not necessarily equal to weapon range) + // regsA[9] = attack technique level (specified by technique flags) + // regsA[10] = support technique level (Resta/Anti) + // regsA[11] = attack probability (in range [0, 100]) + // regsA[12] = attack technique probability (in range [0, 100]) + // regsA[13] = unknown (TODO); appears to be a distance range + // valueB = NPC template to modify (00-3F) {0xDF, "npc_param", "npc_param_V1", {{REG32_SET_FIXED, 14}, INT32}, F_V1_V2}, {0xDF, "npc_param", "npc_param_V3", {{REG_SET_FIXED, 14}, INT32}, F_V3_V4 | F_ARGS},