update quest opcode table

This commit is contained in:
Martin Michelsen
2023-07-01 18:23:43 -07:00
parent 4442ca0250
commit 9916fb946d
2 changed files with 268 additions and 262 deletions
+260 -254
View File
@@ -35,6 +35,8 @@ struct QuestScriptOpcodeDefinition {
REG,
REG_SET,
REG_SET_FIXED, // Sequence of N consecutive regs
REG32,
REG32_SET_FIXED, // Sequence of N consecutive regs
INT8,
INT16,
INT32,
@@ -101,6 +103,8 @@ static constexpr auto DATA_LABEL = QuestScriptOpcodeDefinition::Argument::Type::
static constexpr auto REG = QuestScriptOpcodeDefinition::Argument::Type::REG;
static constexpr auto REG_SET = QuestScriptOpcodeDefinition::Argument::Type::REG_SET;
static constexpr auto REG_SET_FIXED = QuestScriptOpcodeDefinition::Argument::Type::REG_SET_FIXED;
static constexpr auto REG32 = QuestScriptOpcodeDefinition::Argument::Type::REG32;
static constexpr auto REG32_SET_FIXED = QuestScriptOpcodeDefinition::Argument::Type::REG32_SET_FIXED;
static constexpr auto INT8 = QuestScriptOpcodeDefinition::Argument::Type::INT8;
static constexpr auto INT16 = QuestScriptOpcodeDefinition::Argument::Type::INT16;
static constexpr auto INT32 = QuestScriptOpcodeDefinition::Argument::Type::INT32;
@@ -113,134 +117,134 @@ static const QuestScriptOpcodeDefinition::Argument ITEM_ID(INT32, 0, "item_id");
static const QuestScriptOpcodeDefinition::Argument AREA(INT32, 0, "area");
static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0x0000, "nop", {}, {}, V1, V4},
{0x0001, "ret", {}, {}, V1, V4},
{0x0002, "sync", {}, {}, V1, V4},
{0x0003, "exit", {INT32}, {}, V1, V4},
{0x0004, "thread", {FUNCTION16}, {}, V1, V4},
{0x0005, "va_start", {}, {}, V3, V4},
{0x0006, "va_end", {}, {}, V3, V4},
{0x0007, "va_call", {FUNCTION16}, {}, V3, V4},
{0x0008, "let", {REG, REG}, {}, V1, V4},
{0x0009, "leti", {REG, INT32}, {}, V1, V4},
{0x000A, "letb", {REG, INT16}, {}, V1, V2},
{0x000A, "letb", {REG, INT8}, {}, V3, V4},
{0x000B, "letw", {REG, INT16}, {}, V3, V4},
{0x000C, "leta", {REG, REG}, {}, V3, V4},
{0x000D, "leto", {REG, FUNCTION16}, {}, V3, V4},
{0x0010, "set", {REG}, {}, V1, V4},
{0x0011, "clear", {REG}, {}, V1, V4},
{0x0012, "rev", {REG}, {}, V1, V4},
{0x0013, "gset", {INT16}, {}, V1, V4},
{0x0014, "gclear", {INT16}, {}, V1, V4},
{0x0015, "grev", {INT16}, {}, V1, V4},
{0x0016, "glet", {INT16, REG}, {}, V1, V4},
{0x0017, "gget", {INT16, REG}, {}, V1, V4},
{0x0018, "add", {REG, REG}, {}, V1, V4},
{0x0019, "addi", {REG, INT32}, {}, V1, V4},
{0x001A, "sub", {REG, REG}, {}, V1, V4},
{0x001B, "subi", {REG, INT32}, {}, V1, V4},
{0x001C, "mul", {REG, REG}, {}, V1, V4},
{0x001D, "muli", {REG, INT32}, {}, V1, V4},
{0x001E, "div", {REG, REG}, {}, V1, V4},
{0x001F, "divi", {REG, INT32}, {}, V1, V4},
{0x0020, "and", {REG, REG}, {}, V1, V4},
{0x0021, "andi", {REG, INT32}, {}, V1, V4},
{0x0022, "or", {REG, REG}, {}, V1, V4},
{0x0023, "ori", {REG, INT32}, {}, V1, V4},
{0x0024, "xor", {REG, REG}, {}, V1, V4},
{0x0025, "xori", {REG, INT32}, {}, V1, V4},
{0x0026, "mod", {REG, REG}, {}, V3, V4},
{0x0027, "modi", {REG, INT32}, {}, V3, V4},
{0x0028, "jmp", {FUNCTION16}, {}, V1, V4},
{0x0029, "call", {FUNCTION16}, {}, V1, V4},
{0x002A, "jmp_on", {FUNCTION16, REG_SET}, {}, V1, V4},
{0x002B, "jmp_off", {FUNCTION16, REG_SET}, {}, V1, V4},
{0x002C, "jmp_=", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x002D, "jmpi_=", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x002E, "jmp_!=", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x002F, "jmpi_!=", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x0030, "ujmp_>", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x0031, "ujmpi_>", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x0032, "jmp_>", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x0033, "jmpi_>", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x0034, "ujmp_<", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x0035, "ujmpi_<", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x0036, "jmp_<", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x0037, "jmpi_<", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x0038, "ujmp_>=", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x0039, "ujmpi_>=", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x003A, "jmp_>=", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x003B, "jmpi_>=", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x003C, "ujmp_<=", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x003D, "ujmpi_<=", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x003E, "jmp_<=", {REG, REG, FUNCTION16}, {}, V1, V4},
{0x003F, "jmpi_<=", {REG, INT32, FUNCTION16}, {}, V1, V4},
{0x0040, "switch_jmp", {REG, FUNCTION16_SET}, {}, V1, V4},
{0x0041, "switch_call", {REG, FUNCTION16_SET}, {}, V1, V4},
{0x0042, "stack_push", {INT32}, {}, V1, V2},
{0x0042, "stack_push", {REG}, {}, V3, V4},
{0x0043, "stack_pop", {REG}, {}, V3, V4},
{0x0044, "stack_pushm", {REG, INT32}, {}, V3, V4},
{0x0045, "stack_popm", {REG, INT32}, {}, V3, V4},
{0x0048, "arg_pushr", {REG}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x0049, "arg_pushl", {INT32}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x004A, "arg_pushb", {INT8}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x004B, "arg_pushw", {INT16}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x004C, "arg_pusha", {REG}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x004D, "arg_pusho", {FUNCTION16}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x004E, "arg_pushs", {CSTRING}, {}, V3, V4, PRESERVE_ARG_STACK},
{0x0050, "message", {INT32, CSTRING}, {}, V1, V2},
{0x0050, "message", {}, {INT32, CSTRING}, V3, V4},
{0x0051, "list", {REG, CSTRING}, {}, V1, V2},
{0x0051, "list", {}, {REG, CSTRING}, V3, V4},
{0x0052, "fadein", {}, {}, V1, V4},
{0x0053, "fadeout", {}, {}, V1, V4},
{0x0054, "se", {INT32}, {}, V1, V2},
{0x0054, "se", {}, {INT32}, V3, V4},
{0x0055, "bgm", {INT32}, {}, V1, V2},
{0x0055, "bgm", {}, {INT32}, V3, V4},
{0x0056, nullptr, {}, {}, V1, V2},
{0x0057, nullptr, {}, {}, V1, V2},
{0x0058, "enable", {INT32}, {}, V1, V2},
{0x0059, "disable", {INT32}, {}, V1, V2},
{0x005A, "window_msg", {CSTRING}, {}, V1, V2},
{0x005A, "window_msg", {}, {CSTRING}, V3, V4},
{0x005B, "add_msg", {CSTRING}, {}, V1, V2},
{0x005B, "add_msg", {}, {CSTRING}, V3, V4},
{0x005C, "mesend", {}, {}, V1, V4},
{0x005D, "gettime", {REG}, {}, V1, V4},
{0x005E, "winend", {}, {}, V1, V4},
{0x0060, "npc_crt", {INT32, INT32}, {}, V1, V2},
{0x0060, "npc_crt", {}, {INT32, INT32}, V3, V4},
{0x0061, "npc_stop", {INT32}, {}, V1, V2},
{0x0061, "npc_stop", {}, {INT32}, V3, V4},
{0x0062, "npc_play", {INT32}, {}, V1, V2},
{0x0062, "npc_play", {}, {INT32}, V3, V4},
{0x0063, "npc_kill", {INT32}, {}, V1, V2},
{0x0063, "npc_kill", {}, {INT32}, V3, V4},
{0x0000, "nop", {}, {}, V1, V4}, // Does nothing
{0x0001, "ret", {}, {}, V1, V4}, // Pops new PC off stack
{0x0002, "sync", {}, {}, V1, V4}, // Stops execution for the current frame
{0x0003, "exit", {INT32}, {}, V1, V4}, // Exits entirely
{0x0004, "thread", {FUNCTION16}, {}, V1, V4}, // Starts a new thread
{0x0005, "va_start", {}, {}, V3, V4}, // Pushes r1-r7 to the stack
{0x0006, "va_end", {}, {}, V3, V4}, // Pops r7-r1 from the stack
{0x0007, "va_call", {FUNCTION16}, {}, V3, V4}, // Replaces r1-r7 with the args stack, then calls the function
{0x0008, "let", {REG, REG}, {}, V1, V4}, // Copies a value from regB to regA
{0x0009, "leti", {REG, INT32}, {}, V1, V4}, // Sets register to a fixed value (int32)
{0x000A, "leta", {REG, REG}, {}, V1, V2}, // Sets regA to the memory address of regB
{0x000A, "letb", {REG, INT8}, {}, V3, V4}, // Sets register to a fixed value (int8)
{0x000B, "letw", {REG, INT16}, {}, V3, V4}, // Sets register to a fixed value (int16)
{0x000C, "leta", {REG, REG}, {}, V3, V4}, // Sets regA to the memory address of regB
{0x000D, "leto", {REG, FUNCTION16}, {}, V3, V4}, // Sets register to the offset (NOT memory address) of a function
{0x0010, "set", {REG}, {}, V1, V4}, // Sets a register to 1
{0x0011, "clear", {REG}, {}, V1, V4}, // Sets a register to 0
{0x0012, "rev", {REG}, {}, V1, V4}, // Sets a register to 0 if it's nonzero and vice versa
{0x0013, "gset", {INT16}, {}, V1, V4}, // Sets a global flag
{0x0014, "gclear", {INT16}, {}, V1, V4}, // Clears a global flag
{0x0015, "grev", {INT16}, {}, V1, V4}, // Flips a global flag
{0x0016, "glet", {INT16, REG}, {}, V1, V4}, // Sets a global flag to a specific value
{0x0017, "gget", {INT16, REG}, {}, V1, V4}, // Gets a global flag
{0x0018, "add", {REG, REG}, {}, V1, V4}, // regA += regB
{0x0019, "addi", {REG, INT32}, {}, V1, V4}, // regA += imm
{0x001A, "sub", {REG, REG}, {}, V1, V4}, // regA -= regB
{0x001B, "subi", {REG, INT32}, {}, V1, V4}, // regA -= imm
{0x001C, "mul", {REG, REG}, {}, V1, V4}, // regA *= regB
{0x001D, "muli", {REG, INT32}, {}, V1, V4}, // regA *= imm
{0x001E, "div", {REG, REG}, {}, V1, V4}, // regA /= regB
{0x001F, "divi", {REG, INT32}, {}, V1, V4}, // regA /= imm
{0x0020, "and", {REG, REG}, {}, V1, V4}, // regA &= regB
{0x0021, "andi", {REG, INT32}, {}, V1, V4}, // regA &= imm
{0x0022, "or", {REG, REG}, {}, V1, V4}, // regA |= regB
{0x0023, "ori", {REG, INT32}, {}, V1, V4}, // regA |= imm
{0x0024, "xor", {REG, REG}, {}, V1, V4}, // regA ^= regB
{0x0025, "xori", {REG, INT32}, {}, V1, V4}, // regA ^= imm
{0x0026, "mod", {REG, REG}, {}, V3, V4}, // regA %= regB
{0x0027, "modi", {REG, INT32}, {}, V3, V4}, // regA %= imm
{0x0028, "jmp", {FUNCTION16}, {}, V1, V4}, // Jumps to function_table[fn_id]
{0x0029, "call", {FUNCTION16}, {}, V1, V4}, // Pushes the offset after this opcode and jumps to function_table[fn_id]
{0x002A, "jmp_on", {FUNCTION16, REG_SET}, {}, V1, V4}, // If all given registers are nonzero, jumps to function_table[fn_id]
{0x002B, "jmp_off", {FUNCTION16, REG_SET}, {}, V1, V4}, // If all given registers are zero, jumps to function_table[fn_id]
{0x002C, "jmp_eq", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA == regB, jumps to function_table[fn_id]
{0x002D, "jmpi_eq", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA == regB, jumps to function_table[fn_id]
{0x002E, "jmp_ne", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA != regB, jumps to function_table[fn_id]
{0x002F, "jmpi_ne", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA != regB, jumps to function_table[fn_id]
{0x0030, "ujmp_gt", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA > regB, jumps to function_table[fn_id]
{0x0031, "ujmpi_gt", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA > regB, jumps to function_table[fn_id]
{0x0032, "jmp_gt", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA > regB, jumps to function_table[fn_id]
{0x0033, "jmpi_gt", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA > regB, jumps to function_table[fn_id]
{0x0034, "ujmp_lt", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA < regB, jumps to function_table[fn_id]
{0x0035, "ujmpi_lt", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA < regB, jumps to function_table[fn_id]
{0x0036, "jmp_lt", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA < regB, jumps to function_table[fn_id]
{0x0037, "jmpi_lt", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA < regB, jumps to function_table[fn_id]
{0x0038, "ujmp_ge", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA >= regB, jumps to function_table[fn_id]
{0x0039, "ujmpi_ge", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA >= regB, jumps to function_table[fn_id]
{0x003A, "jmp_ge", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA >= regB, jumps to function_table[fn_id]
{0x003B, "jmpi_ge", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA >= regB, jumps to function_table[fn_id]
{0x003C, "ujmp_le", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA <= regB, jumps to function_table[fn_id]
{0x003D, "ujmpi_le", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA <= regB, jumps to function_table[fn_id]
{0x003E, "jmp_le", {REG, REG, FUNCTION16}, {}, V1, V4}, // If regA <= regB, jumps to function_table[fn_id]
{0x003F, "jmpi_le", {REG, INT32, FUNCTION16}, {}, V1, V4}, // If regA <= regB, jumps to function_table[fn_id]
{0x0040, "switch_jmp", {REG, FUNCTION16_SET}, {}, V1, V4}, // Jumps to function_table[fn_ids[regA]]
{0x0041, "switch_call", {REG, FUNCTION16_SET}, {}, V1, V4}, // Calls function_table[fn_ids[regA]]
{0x0042, "nop_42", {INT32}, {}, V1, V2}, // Does nothing
{0x0042, "stack_push", {REG}, {}, V3, V4}, // Pushes regA
{0x0043, "stack_pop", {REG}, {}, V3, V4}, // Pops regA
{0x0044, "stack_pushm", {REG, INT32}, {}, V3, V4}, // Pushes N regs in increasing order starting at regA
{0x0045, "stack_popm", {REG, INT32}, {}, V3, V4}, // Pops N regs in decreasing order ending at regA
{0x0048, "arg_pushr", {REG}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes regA to the args list
{0x0049, "arg_pushl", {INT32}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes imm to the args list
{0x004A, "arg_pushb", {INT8}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes imm to the args list
{0x004B, "arg_pushw", {INT16}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes imm to the args list
{0x004C, "arg_pusha", {REG}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes memory address of regA to the args list
{0x004D, "arg_pusho", {FUNCTION16}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes function_table[fn_id] to the args list
{0x004E, "arg_pushs", {CSTRING}, {}, V3, V4, PRESERVE_ARG_STACK}, // Pushes memory address of str to the args list
{0x0050, "message", {INT32, CSTRING}, {}, V1, V2}, // Creates a dialogue with object/NPC N starting with message str
{0x0050, "message", {}, {INT32, CSTRING}, V3, V4}, // Creates a dialogue with object/NPC N starting with message str
{0x0051, "list", {REG, CSTRING}, {}, V1, V2}, // Prompts the player with a list of choices, returning the index of their choice in regA
{0x0051, "list", {}, {REG, CSTRING}, V3, V4}, // Prompts the player with a list of choices, returning the index of their choice in regA
{0x0052, "fadein", {}, {}, V1, V4}, // Fades from black
{0x0053, "fadeout", {}, {}, V1, V4}, // Fades to black
{0x0054, "se", {INT32}, {}, V1, V2}, // Plays a sound effect
{0x0054, "se", {}, {INT32}, V3, V4}, // Plays a sound effect
{0x0055, "bgm", {INT32}, {}, V1, V2}, // Plays a fanfare (clear.adx or miniclear.adx)
{0x0055, "bgm", {}, {INT32}, V3, V4}, // Plays a fanfare (clear.adx or miniclear.adx)
{0x0056, "nop_56", {}, {}, V1, V2}, // Does nothing
{0x0057, "nop_57", {}, {}, V1, V2}, // Does nothing
{0x0058, "nop_58", {INT32}, {}, V1, V2}, // Does nothing
{0x0059, "nop_59", {INT32}, {}, V1, V2}, // Does nothing
{0x005A, "window_msg", {CSTRING}, {}, V1, V2}, // Displays a message
{0x005A, "window_msg", {}, {CSTRING}, V3, V4}, // Displays a message
{0x005B, "add_msg", {CSTRING}, {}, V1, V2}, // Adds a message to an existing window
{0x005B, "add_msg", {}, {CSTRING}, V3, V4}, // Adds a message to an existing window
{0x005C, "mesend", {}, {}, V1, V4}, // Closes a message box
{0x005D, "gettime", {REG}, {}, V1, V4}, // Gets the current time
{0x005E, "winend", {}, {}, V1, V4}, // Closes a window_msg
{0x0060, "npc_crt", {INT32, INT32}, {}, V1, V2}, // Creates an NPC
{0x0060, "npc_crt", {}, {INT32, INT32}, V3, V4}, // Creates an NPC
{0x0061, "npc_stop", {INT32}, {}, V1, V2}, // Tells an NPC to stop following
{0x0061, "npc_stop", {}, {INT32}, V3, V4}, // Tells an NPC to stop following
{0x0062, "npc_play", {INT32}, {}, V1, V2}, // Tells an NPC to follow the player
{0x0062, "npc_play", {}, {INT32}, V3, V4}, // Tells an NPC to follow the player
{0x0063, "npc_kill", {INT32}, {}, V1, V2}, // Destroys an NPC
{0x0063, "npc_kill", {}, {INT32}, V3, V4}, // Destroys an NPC
{0x0064, "npc_nont", {}, {}, V1, V4},
{0x0065, "npc_talk", {}, {}, V1, V4},
{0x0066, "npc_crp", {INT32, INT32}, {}, V1, V2}, // REG?
{0x0066, "npc_crp", {{REG_SET_FIXED, 6}}, {}, V3, V4},
{0x0068, "create_pipe", {INT32}, {}, V1, V2},
{0x0068, "create_pipe", {}, {INT32}, V3, V4},
{0x0069, "p_hpstat", {REG, CLIENT_ID}, {}, V1, V2},
{0x0069, "p_hpstat", {}, {REG, CLIENT_ID}, V3, V4},
{0x006A, "p_dead", {REG, CLIENT_ID}, {}, V1, V2},
{0x006A, "p_dead", {}, {REG, CLIENT_ID}, V3, V4},
{0x006B, "p_disablewarp", {}, {}, V1, V4},
{0x006C, "p_enablewarp", {}, {}, V1, V4},
{0x006D, "p_move", {REG, INT32}, {}, V1, V2},
{0x006D, "p_move", {{REG_SET_FIXED, 5}}, {}, V3, V4},
{0x0066, "npc_crp", {{REG_SET_FIXED, 6}, INT32}, {}, V1, V2}, // Creates an NPC. Second argument is ignored
{0x0066, "npc_crp", {{REG_SET_FIXED, 6}}, {}, V3, V4}, // Creates an NPC
{0x0068, "create_pipe", {INT32}, {}, V1, V2}, // Creates a pipe
{0x0068, "create_pipe", {}, {INT32}, V3, V4}, // Creates a pipe
{0x0069, "p_hpstat", {REG, CLIENT_ID}, {}, V1, V2}, // Compares player HP with a given value
{0x0069, "p_hpstat", {}, {REG, CLIENT_ID}, V3, V4}, // Compares player HP with a given value
{0x006A, "p_dead", {REG, CLIENT_ID}, {}, V1, V2}, // Checks if player is dead
{0x006A, "p_dead", {}, {REG, CLIENT_ID}, V3, V4}, // Checks if player is dead
{0x006B, "p_disablewarp", {}, {}, V1, V4}, // Disables telepipes/Ryuker
{0x006C, "p_enablewarp", {}, {}, V1, V4}, // Enables telepipes/Ryuker
{0x006D, "p_move", {{REG_SET_FIXED, 5}, INT32}, {}, V1, V2}, // Moves player. Second argument is ignored
{0x006D, "p_move", {{REG_SET_FIXED, 5}}, {}, V3, V4}, // Moves player
{0x006E, "p_look", {CLIENT_ID}, {}, V1, V2},
{0x006E, "p_look", {}, {CLIENT_ID}, V3, V4},
{0x0070, "p_action_disable", {}, {}, V1, V4},
{0x0071, "p_action_enable", {}, {}, V1, V4},
{0x0072, "disable_movement1", {CLIENT_ID}, {}, V1, V2},
{0x0072, "disable_movement1", {}, {CLIENT_ID}, V3, V4},
{0x0073, "enable_movement1", {CLIENT_ID}, {}, V1, V2},
{0x0073, "enable_movement1", {}, {CLIENT_ID}, V3, V4},
{0x0070, "p_action_disable", {}, {}, V1, V4}, // Disables attacks for all players
{0x0071, "p_action_enable", {}, {}, V1, V4}, // Enables attacks for all players
{0x0072, "disable_movement1", {CLIENT_ID}, {}, V1, V2}, // Disables movement for the given player
{0x0072, "disable_movement1", {}, {CLIENT_ID}, V3, V4}, // Disables movement for the given player
{0x0073, "enable_movement1", {CLIENT_ID}, {}, V1, V2}, // Enables movement for the given player
{0x0073, "enable_movement1", {}, {CLIENT_ID}, V3, V4}, // Enables movement for the given player
{0x0074, "p_noncol", {}, {}, V1, V4},
{0x0075, "p_col", {}, {}, V1, V4},
{0x0076, "p_setpos", {CLIENT_ID, {REG_SET_FIXED, 4}}, {}, V1, V2},
@@ -248,38 +252,40 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0x0077, "p_return_guild", {}, {}, V1, V4},
{0x0078, "p_talk_guild", {CLIENT_ID}, {}, V1, V2},
{0x0078, "p_talk_guild", {}, {CLIENT_ID}, V3, V4},
{0x0079, "npc_talk_pl", {INT32}, {}, V1, V2}, // REG?
{0x0079, "npc_talk_pl", {REG}, {}, V3, V4},
{0x0079, "npc_talk_pl", {{REG32_SET_FIXED, 8}}, {}, V1, V2},
{0x0079, "npc_talk_pl", {{REG_SET_FIXED, 8}}, {}, V3, V4},
{0x007A, "npc_talk_kill", {INT32}, {}, V1, V2},
{0x007A, "npc_talk_kill", {}, {INT32}, V3, V4},
{0x007B, "npc_crtpk", {INT32, INT32}, {}, V1, V2}, // REG?
{0x007B, "npc_crtpk", {}, {INT32, INT32}, V3, V4},
{0x007C, "npc_crppk", {INT32, INT32}, {}, V1, V2}, // REG?
{0x007C, "npc_crppk", {{REG_SET_FIXED, 7}}, {}, V3, V4},
{0x007D, "npc_crptalk", {INT32, INT32}, {}, V1, V2}, // REG?
{0x007B, "npc_crtpk", {INT32, INT32}, {}, V1, V2}, // Creates attacker NPC
{0x007B, "npc_crtpk", {}, {INT32, INT32}, V3, V4}, // Creates attacker NPC
{0x007C, "npc_crppk", {{REG32_SET_FIXED, 7}, INT32}, {}, V1, V2}, // Creates attacker NPC
{0x007C, "npc_crppk", {{REG_SET_FIXED, 7}}, {}, V3, V4}, // Creates attacker NPC
{0x007D, "npc_crptalk", {{REG32_SET_FIXED, 6}, INT32}, {}, V1, V2},
{0x007D, "npc_crptalk", {{REG_SET_FIXED, 6}}, {}, V3, V4},
{0x007E, "p_look_at", {CLIENT_ID, CLIENT_ID}, {}, V1, V2},
{0x007E, "p_look_at", {}, {CLIENT_ID, CLIENT_ID}, V3, V4},
{0x007F, "npc_crp_id", {INT32, INT32}, {}, V1, V2}, // REG?
{0x007F, "npc_crp_id", {{REG32_SET_FIXED, 7}, INT32}, {}, V1, V2},
{0x007F, "npc_crp_id", {{REG_SET_FIXED, 7}}, {}, V3, V4},
{0x0080, "cam_quake", {}, {}, V1, V4},
{0x0081, "cam_adj", {}, {}, V1, V4},
{0x0082, "cam_zmin", {}, {}, V1, V4},
{0x0083, "cam_zmout", {}, {}, V1, V4},
{0x0084, "cam_pan", {INT32, INT32}, {}, V1, V2}, // REG_SET_FIXED?
{0x0084, "cam_pan", {{REG32_SET_FIXED, 5}, INT32}, {}, V1, V2},
{0x0084, "cam_pan", {{REG_SET_FIXED, 5}}, {}, V3, V4},
{0x0085, "game_lev_super", {}, {}, V1, V4},
{0x0086, "game_lev_reset", {}, {}, V1, V4},
{0x0087, "pos_pipe", {INT32, INT32}, {}, V1, V2}, // REG_SET_FIXED?
{0x0085, "game_lev_super", {}, {}, V1, V2},
{0x0085, "nop_85", {}, {}, V3, V4},
{0x0086, "game_lev_reset", {}, {}, V1, V2},
{0x0086, "nop_86", {}, {}, V3, V4},
{0x0087, "pos_pipe", {{REG32_SET_FIXED, 4}, INT32}, {}, V1, V2},
{0x0087, "pos_pipe", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0x0088, "if_zone_clear", {REG, {REG_SET_FIXED, 2}}, {}, V1, V4},
{0x0089, "chk_ene_num", {REG}, {}, V1, V4},
{0x008A, "unhide_obj", {{REG_SET_FIXED, 3}}, {}, V1, V4},
{0x008B, "unhide_ene", {{REG_SET_FIXED, 4}}, {}, V1, V4},
{0x008B, "unhide_ene", {{REG_SET_FIXED, 3}}, {}, V1, V4},
{0x008C, "at_coords_call", {{REG_SET_FIXED, 5}}, {}, V1, V4},
{0x008D, "at_coords_talk", {{REG_SET_FIXED, 5}}, {}, V1, V4},
{0x008E, "col_npcin", {{REG_SET_FIXED, 5}}, {}, V1, V4},
{0x008F, "col_npcinr", {REG}, {}, V1, V4},
{0x008F, "col_npcinr", {{REG_SET_FIXED, 6}}, {}, V1, V4},
{0x0090, "switch_on", {INT32}, {}, V1, V2},
{0x0090, "switch_on", {}, {INT32}, V3, V4},
{0x0091, "switch_off", {INT32}, {}, V1, V2},
@@ -293,41 +299,41 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0x0095, "set_floor_handler", {}, {AREA, FUNCTION16}, V3, V4},
{0x0096, "clr_floor_handler", {AREA}, {}, V1, V2},
{0x0096, "clr_floor_handler", {}, {AREA}, V3, V4},
{0x0097, "col_plinaw", {REG}, {}, V1, V4},
{0x0097, "col_plinaw", {{REG_SET_FIXED, 9}}, {}, V1, V4},
{0x0098, "hud_hide", {}, {}, V1, V4},
{0x0099, "hud_show", {}, {}, V1, V4},
{0x009A, "cine_enable", {}, {}, V1, V4},
{0x009B, "cine_disable", {}, {}, V1, V4},
{0x00A0, nullptr, {INT32, CSTRING}, {}, V1, V2},
{0x00A0, nullptr, {}, {INT32, CSTRING}, V3, V4},
{0x00A1, "set_qt_failure", {INT32}, {}, V1, V2}, // FUNCTION16?
{0x00A0, nullptr, {INT32, CSTRING}, {}, V1, V2}, // First argument appears unused
{0x00A0, nullptr, {}, {INT32, CSTRING}, V3, V4}, // First argument appears unused
{0x00A1, "set_qt_failure", {FUNCTION32}, {}, V1, V2},
{0x00A1, "set_qt_failure", {FUNCTION16}, {}, V3, V4},
{0x00A2, "set_qt_success", {INT32}, {}, V1, V2}, // FUNCTION16?
{0x00A2, "set_qt_success", {FUNCTION32}, {}, V1, V2},
{0x00A2, "set_qt_success", {FUNCTION16}, {}, V3, V4},
{0x00A3, "clr_qt_failure", {}, {}, V1, V4},
{0x00A4, "clr_qt_success", {}, {}, V1, V4},
{0x00A5, "set_qt_cancel", {INT32}, {}, V1, V2}, // FUNCTION16?
{0x00A5, "set_qt_cancel", {FUNCTION32}, {}, V1, V2},
{0x00A5, "set_qt_cancel", {FUNCTION16}, {}, V3, V4},
{0x00A6, "clr_qt_cancel", {}, {}, V1, V4},
{0x00A8, "pl_walk", {INT32, INT32}, {}, V1, V2}, // REG?
{0x00A8, "pl_walk", {REG}, {}, V3, V4},
{0x00A8, "pl_walk", {{REG32_SET_FIXED, 4}, INT32}, {}, V1, V2},
{0x00A8, "pl_walk", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0x00B0, "pl_add_meseta", {CLIENT_ID, INT32}, {}, V1, V2},
{0x00B0, "pl_add_meseta", {}, {CLIENT_ID, INT32}, V3, V4},
{0x00B1, "thread_stg", {FUNCTION16}, {}, V1, V4},
{0x00B2, "del_obj_param", {REG}, {}, V1, V4},
{0x00B3, "item_create", {REG, REG}, {}, V1, V4},
{0x00B4, "item_create2", {REG, REG}, {}, V1, V4},
{0x00B5, "item_delete", {REG, REG}, {}, V1, V4},
{0x00B6, "item_delete2", {{REG_SET_FIXED, 3}, REG}, {}, V1, V4},
{0x00B7, "item_check", {REG, REG}, {}, V1, V4},
{0x00B3, "item_create", {{REG_SET_FIXED, 3}, REG}, {}, V1, V4}, // Creates an item; regsA holds item data1, regB receives item ID
{0x00B4, "item_create2", {{REG_SET_FIXED, 12}, REG}, {}, V1, V4}, // Like item_create but input regs each specify 1 byte
{0x00B5, "item_delete", {REG, {REG_SET_FIXED, 12}}, {}, V1, V4},
{0x00B6, "item_delete2", {{REG_SET_FIXED, 3}, {REG_SET_FIXED, 12}}, {}, V1, V4},
{0x00B7, "item_check", {{REG_SET_FIXED, 3}, REG}, {}, V1, V4},
{0x00B8, "setevt", {INT32}, {}, V1, V2},
{0x00B8, "setevt", {}, {INT32}, V3, V4},
{0x00B9, "get_difflvl", {REG}, {}, V1, V4},
{0x00BA, "set_qt_exit", {INT32}, {}, V1, V2}, // FUNCTION16?
{0x00B9, "get_difficulty_level_v1", {REG}, {}, V1, V4}, // Only returns 0-2, even in Ultimate
{0x00BA, "set_qt_exit", {FUNCTION32}, {}, V1, V2},
{0x00BA, "set_qt_exit", {FUNCTION16}, {}, V3, V4},
{0x00BB, "clr_qt_exit", {}, {}, V1, V4},
{0x00BC, nullptr, {CSTRING}, {}, V1, V4},
{0x00C0, "particle", {INT32, INT32}, {}, V1, V2}, // REG?
{0x00BC, "nop_BC", {CSTRING}, {}, V1, V4}, // Does nothing
{0x00C0, "particle", {{REG32_SET_FIXED, 5}, INT32}, {}, V1, V2},
{0x00C0, "particle", {{REG_SET_FIXED, 5}}, {}, V3, V4},
{0x00C1, "npc_text", {INT32, CSTRING}, {}, V1, V2},
{0x00C1, "npc_text", {}, {INT32, CSTRING}, V3, V4},
@@ -344,13 +350,13 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0x00CB, "set_quest_board_handler", {}, {INT32, FUNCTION16, CSTRING}, V3, V4},
{0x00CC, "clear_quest_board_handler", {INT32}, {}, V1, V2},
{0x00CC, "clear_quest_board_handler", {}, {INT32}, V3, V4},
{0x00CD, "particle_id", {INT32, INT32}, {}, V1, V2}, // REG_SET_FIXED?
{0x00CD, "particle_id", {{REG32_SET_FIXED, 4}, INT32}, {}, V1, V2},
{0x00CD, "particle_id", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0x00CE, "npc_crptalk_id", {INT32, INT32}, {}, V1, V2}, // REG?
{0x00CE, "npc_crptalk_id", {{REG32_SET_FIXED, 7}, INT32}, {}, V1, V2},
{0x00CE, "npc_crptalk_id", {{REG_SET_FIXED, 7}}, {}, V3, V4},
{0x00CF, "npc_lang_clean", {}, {}, V1, V4},
{0x00D0, "pl_pkon", {}, {}, V1, V4},
{0x00D1, "pl_chk_item2", {REG, REG}, {}, V1, V4},
{0x00D1, "pl_chk_item2", {{REG_SET_FIXED, 4}, REG}, {}, V1, V4}, // Presumably like item_check but also checks data2
{0x00D2, "enable_mainmenu", {}, {}, V1, V4},
{0x00D3, "disable_mainmenu", {}, {}, V1, V4},
{0x00D4, "start_battlebgm", {}, {}, V1, V4},
@@ -358,49 +364,49 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0x00D6, "disp_msg_qb", {CSTRING}, {}, V1, V2},
{0x00D6, "disp_msg_qb", {}, {CSTRING}, V3, V4},
{0x00D7, "close_msg_qb", {}, {}, V1, V4},
{0x00D8, "set_eventflag", {INT32, INT32}, {}, V1, V2}, // REG?
{0x00D8, "set_eventflag", {INT32, INT32}, {}, V1, V2},
{0x00D8, "set_eventflag", {}, {INT32, INT32}, V3, V4},
{0x00D9, "sync_register", {INT32, INT32}, {}, V1, V2}, // REG?
{0x00D9, "sync_register", {INT32, INT32}, {}, V1, V2},
{0x00D9, "sync_register", {}, {INT32, INT32}, V3, V4},
{0x00DA, "set_returnhunter", {}, {}, V1, V4},
{0x00DB, "set_returncity", {}, {}, V1, V4},
{0x00DC, "load_pvr", {}, {}, V1, V4},
{0x00DD, "load_midi", {}, {}, V1, V4},
{0x00DE, nullptr, {{REG_SET_FIXED, 6}, REG}, {}, V1, V4},
{0x00DF, "npc_param", {INT32, INT32}, {}, V1, V2}, // REG?
{0x00DD, "load_midi", {}, {}, V1, V4}, // Seems incomplete on V3 - has some similar codepaths as load_pvr, but the main function seems to do nothing
{0x00DE, nullptr, {{REG_SET_FIXED, 6}, REG}, {}, V1, V4}, // regsA specifies the first 6 bytes of an ItemData
{0x00DF, "npc_param", {{REG32_SET_FIXED, 14}, INT32}, {}, V1, V2},
{0x00DF, "npc_param", {{REG_SET_FIXED, 14}, INT32}, {}, V3, V4},
{0x00E0, "pad_dragon", {}, {}, V1, V4},
{0x00E1, "clear_mainwarp", {INT32}, {}, V1, V2},
{0x00E1, "clear_mainwarp", {}, {INT32}, V3, V4},
{0x00E2, "pcam_param", {INT32}, {}, V1, V2}, // REG?
{0x00E2, "pcam_param", {{REG32_SET_FIXED, 6}}, {}, V1, V2},
{0x00E2, "pcam_param", {{REG_SET_FIXED, 6}}, {}, V3, V4},
{0x00E3, "start_setevt", {INT32, INT32}, {}, V1, V2},
{0x00E3, "start_setevt", {}, {INT32, INT32}, V3, V4},
{0x00E4, "warp_on", {}, {}, V1, V4},
{0x00E5, "warp_off", {}, {}, V1, V4},
{0x00E6, "get_slotnumber", {REG}, {}, V1, V4},
{0x00E7, "get_servernumber", {REG}, {}, V1, V4},
{0x00E6, "get_client_id", {REG}, {}, V1, V4},
{0x00E7, "get_leader_id", {REG}, {}, V1, V4},
{0x00E8, "set_eventflag2", {INT32, REG}, {}, V1, V2},
{0x00E8, "set_eventflag2", {}, {INT32, REG}, V3, V4},
{0x00E9, "res", {REG, REG}, {}, V1, V4},
{0x00EA, nullptr, {REG, INT32}, {}, V1, V4}, // INT8?
{0x00E9, "mod2", {REG, REG}, {}, V1, V4},
{0x00EA, "modi2", {REG, INT32}, {}, V1, V4},
{0x00EB, "enable_bgmctrl", {INT32}, {}, V1, V2},
{0x00EB, "enable_bgmctrl", {}, {INT32}, V3, V4},
{0x00EC, "sw_send", {{REG_SET_FIXED, 3}}, {}, V1, V4},
{0x00ED, "create_bgmctrl", {}, {}, V1, V4},
{0x00EE, "pl_add_meseta2", {INT32}, {}, V1, V2},
{0x00EE, "pl_add_meseta2", {}, {INT32}, V3, V4},
{0x00EF, "sync_to_server", {INT32, INT32}, {}, V1, V2},
{0x00EF, "sync_to_server", {}, {INT32, INT32}, V3, V4},
{0x00F0, "send_regwork", {}, {}, V1, V2},
{0x00F1, "leti_fixed_camera", {INT32}, {}, V2, V2}, // REG_SET_FIXED?
{0x00EF, "sync_register2", {INT32, REG32}, {}, V1, V2},
{0x00EF, "sync_register2", {}, {INT32, INT32}, V3, V4},
{0x00F0, "send_regwork", {INT32, REG32}, {}, V1, V2},
{0x00F1, "leti_fixed_camera", {{REG32_SET_FIXED, 6}}, {}, V2, V2},
{0x00F1, "leti_fixed_camera", {{REG_SET_FIXED, 6}}, {}, V3, V4},
{0x00F2, "default_camera_pos1", {}, {}, V2, V4},
{0xF800, nullptr, {}, {}, V2, V2},
{0xF801, "set_chat_callback", {REG, CSTRING}, {}, V2, V2},
{0xF801, "set_chat_callback", {}, {REG, CSTRING}, V3, V4},
{0xF800, nullptr, {}, {}, V2, V2}, // Same as 50, but uses fixed arguments - possibly a Japanese debug string?
{0xF801, "set_chat_callback", {{REG32_SET_FIXED, 5}, CSTRING}, {}, V2, V2},
{0xF801, "set_chat_callback", {}, {{REG_SET_FIXED, 5}, CSTRING}, V3, V4},
{0xF808, "get_difficulty_level2", {REG}, {}, V2, V4},
{0xF809, "get_number_of_player1", {REG}, {}, V2, V4},
{0xF809, "get_number_of_players", {REG}, {}, V2, V4},
{0xF80A, "get_coord_of_player", {{REG_SET_FIXED, 3}, REG}, {}, V2, V4},
{0xF80B, "enable_map", {}, {}, V2, V4},
{0xF80C, "disable_map", {}, {}, V2, V4},
@@ -440,37 +446,37 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF81E, "ba_set_meseta", {}, {INT32}, V3, V4},
{0xF820, "cmode_stage", {INT32}, {}, V2, V2},
{0xF820, "cmode_stage", {}, {INT32}, V3, V4},
{0xF821, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF822, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF821, nullptr, {{REG_SET_FIXED, 9}}, {}, V2, V4}, // regsA[3-8] specify first 6 bytes of an ItemData
{0xF822, nullptr, {REG}, {}, V2, V4},
{0xF823, "set_cmode_char_template", {INT32}, {}, V2, V2},
{0xF823, "set_cmode_char_template", {}, {INT32}, V3, V4},
{0xF824, "set_cmode_diff", {INT32}, {}, V2, V2},
{0xF824, "set_cmode_diff", {}, {INT32}, V3, V4},
{0xF825, "exp_multiplication", {REG}, {}, V2, V4},
{0xF826, "exp_division", {REG}, {}, V2, V4},
{0xF825, "exp_multiplication", {{REG_SET_FIXED, 3}}, {}, V2, V4},
{0xF826, nullptr, {REG}, {}, V2, V4},
{0xF827, "get_user_is_dead", {REG}, {}, V2, V4},
{0xF828, "go_floor", {REG, REG}, {}, V2, V4},
{0xF829, "get_num_kills", {REG, REG}, {}, V2, V4},
{0xF82A, "reset_kills", {REG}, {}, V2, V4},
{0xF82B, "unlock_door2", {INT32, INT32}, {}, V2, V2},
{0xF82B, "unlock_door2", {}, {INT32, INT32}, V3, V4},
{0xF82C, "lock_door2", {INT32, INT32}, {}, V3, V4},
{0xF82C, "lock_door2", {}, {INT32, INT32}, V2, V2},
{0xF82C, "lock_door2", {INT32, INT32}, {}, V2, V2},
{0xF82C, "lock_door2", {}, {INT32, INT32}, V3, V4},
{0xF82D, "if_switch_not_pressed", {{REG_SET_FIXED, 2}}, {}, V2, V4},
{0xF82E, "if_switch_pressed", {{REG_SET_FIXED, 3}}, {}, V2, V4},
{0xF830, "control_dragon", {REG}, {}, V2, V4},
{0xF831, "release_dragon", {}, {}, V2, V4},
{0xF838, "shrink", {REG}, {}, V2, V4},
{0xF839, "unshrink", {REG}, {}, V2, V4},
{0xF83A, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF83B, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF83A, nullptr, {{REG_SET_FIXED, 4}}, {}, V2, V4},
{0xF83B, nullptr, {{REG_SET_FIXED, 4}}, {}, V2, V4},
{0xF83C, "display_clock2", {REG}, {}, V2, V4},
{0xF83D, nullptr, {INT32}, {}, V2, V2},
{0xF83D, nullptr, {}, {INT32}, V3, V4},
{0xF83E, "delete_area_title", {INT32}, {}, V2, V2},
{0xF83E, "delete_area_title", {}, {INT32}, V3, V4},
{0xF840, "load_npc_data", {}, {}, V2, V4},
{0xF841, "get_npc_data", {DATA_LABEL}, {}, V2, V4},
{0xF841, "get_npc_data", {DATA_LABEL}, {}, V2, V4}, // TODO: Data type is PlayerVisualConfig
{0xF848, "give_damage_score", {{REG_SET_FIXED, 3}}, {}, V2, V4},
{0xF849, "take_damage_score", {{REG_SET_FIXED, 3}}, {}, V2, V4},
{0xF84A, nullptr, {{REG_SET_FIXED, 3}}, {}, V2, V4},
@@ -491,9 +497,9 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF857, "set_area_title", {}, {CSTRING}, V3, V4},
{0xF858, "ba_show_self_traps", {}, {}, V2, V4},
{0xF859, "ba_hide_self_traps", {}, {}, V2, V4},
{0xF85A, "equip_item", {INT32}, {}, V2, V2}, // REG?
{0xF85A, "equip_item", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF85B, "unequip_item", {CLIENT_ID, INT32}, {}, V2, V2}, // REG?
{0xF85A, "equip_item", {{REG32_SET_FIXED, 4}}, {}, V2, V2}, // regsA are {client_id, item.data1[0-2]}
{0xF85A, "equip_item", {{REG_SET_FIXED, 4}}, {}, V3, V4}, // regsA are {client_id, item.data1[0-2]}
{0xF85B, "unequip_item", {CLIENT_ID, INT32}, {}, V2, V2},
{0xF85B, "unequip_item", {}, {CLIENT_ID, INT32}, V3, V4},
{0xF85C, "qexit2", {INT32}, {}, V2, V4},
{0xF85D, nullptr, {INT32}, {}, V2, V2},
@@ -505,10 +511,10 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF860, nullptr, {}, {}, V2, V4},
{0xF861, nullptr, {INT32}, {}, V2, V2},
{0xF861, nullptr, {}, {INT32}, V3, V4},
{0xF862, "give_s_rank_weapon", {INT32, INT32, CSTRING}, {}, V2, V2}, // [1] is REG?
{0xF862, "give_s_rank_weapon", {REG32, REG32, CSTRING}, {}, V2, V2},
{0xF862, "give_s_rank_weapon", {}, {INT32, REG, CSTRING}, V3, V4},
{0xF863, nullptr, {INT32}, {}, V2, V2}, // REG?
{0xF863, nullptr, {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF863, "get_mag_levels", {{REG32_SET_FIXED, 4}}, {}, V2, V2},
{0xF863, "get_mag_levels", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF864, "cmode_rank", {INT32, CSTRING}, {}, V2, V2},
{0xF864, "cmode_rank", {}, {INT32, CSTRING}, V3, V4},
{0xF865, "award_item_name", {}, {}, V2, V4},
@@ -516,11 +522,11 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF867, "award_item_give_to", {REG}, {}, V2, V4},
{0xF868, "set_cmode_rank", {REG, REG}, {}, V2, V4},
{0xF869, "check_rank_time", {REG, REG}, {}, V2, V4},
{0xF86A, "item_create_cmode", {REG, REG}, {}, V2, V4},
{0xF86B, "ba_box_drops", {REG}, {}, V2, V4},
{0xF86A, "item_create_cmode", {{REG_SET_FIXED, 6}, REG}, {}, V2, V4}, // regsA specifies item.data1[0-5]
{0xF86B, "ba_box_drops", {REG}, {}, V2, V4}, // TODO: This sets override_area in TItemDropSub; use this in ItemCreator
{0xF86C, "award_item_ok", {REG}, {}, V2, V4},
{0xF86D, "ba_set_trapself", {}, {}, V2, V4},
{0xF86E, nullptr, {}, {}, V2, V4},
{0xF86E, "ba_clear_trapself", {}, {}, V2, V4},
{0xF86F, "ba_set_lives", {INT32}, {}, V2, V2},
{0xF86F, "ba_set_lives", {}, {INT32}, V3, V4},
{0xF870, "ba_set_tech_lvl", {INT32}, {}, V2, V2},
@@ -539,39 +545,39 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF879, "get_gender", {REG, REG}, {}, V2, V4},
{0xF87A, "get_chara_class", {REG, {REG_SET_FIXED, 2}}, {}, V2, V4},
{0xF87B, "take_slot_meseta", {{REG_SET_FIXED, 2}, REG}, {}, V2, V4},
{0xF87C, nullptr, {REG}, {}, V2, V4},
{0xF87C, "get_guild_card_file_creation_time", {REG}, {}, V2, V4},
{0xF87D, nullptr, {REG}, {}, V2, V4},
{0xF87E, nullptr, {REG}, {}, V2, V4},
{0xF87F, "read_guildcard_flag", {REG, REG}, {}, V2, V4},
{0xF87E, "get_serial_number", {REG}, {}, V2, V4}, // Returns 0 on BB
{0xF87F, "get_eventflag", {REG, REG}, {}, V2, V4},
{0xF880, nullptr, {{REG_SET_FIXED, 3}}, {}, V2, V4},
{0xF881, "get_pl_name", {REG}, {}, V2, V4},
{0xF882, "get_pl_job", {REG}, {}, V2, V4},
{0xF883, nullptr, {REG, REG}, {}, V2, V4},
{0xF884, "set_eventflag16", {INT32, INT8}, {}, V2, V2}, // 16? (Doesn't match what we see in V3)
{0xF883, nullptr, {{REG_SET_FIXED, 2}, REG}, {}, V2, V4},
{0xF884, "set_eventflag16", {INT32, REG}, {}, V2, V2},
{0xF884, "set_eventflag16", {}, {INT32, INT32}, V3, V4},
{0xF885, "set_eventflag32", {INT32, INT8}, {}, V2, V2}, // 32?
{0xF885, "set_eventflag32", {}, {INT32, INT8}, V3, V4},
{0xF886, nullptr, {REG, REG}, {}, V2, V4}, // INT8?
{0xF887, nullptr, {REG, REG}, {}, V2, V4}, // INT8?
{0xF885, "set_eventflag32", {INT32, REG}, {}, V2, V2},
{0xF885, "set_eventflag32", {}, {INT32, INT32}, V3, V4},
{0xF886, nullptr, {REG, REG}, {}, V2, V4},
{0xF887, nullptr, {REG, REG}, {}, V2, V4},
{0xF888, "ba_close_msg", {}, {}, V2, V4},
{0xF889, nullptr, {}, {}, V2, V4},
{0xF889, nullptr, {}, {}, V2, V4}, // TODO: Seems related to ba_close_msg (it sets the same global)
{0xF88A, "get_player_status", {REG, REG}, {}, V2, V4},
{0xF88B, "send_mail", {REG, CSTRING}, {}, V2, V2},
{0xF88B, "send_mail", {}, {REG, CSTRING}, V3, V4},
{0xF88C, "get_game_version", {REG}, {}, V2, V4}, // TODO: or is this online_check?
{0xF88C, "get_game_version", {REG}, {}, V2, V4}, // Returns 2 on DCv2/PC, 3 on GC, 4 on BB
{0xF88D, "chl_set_timerecord", {REG}, {}, V2, V3},
{0xF88D, "chl_set_timerecord", {REG, REG}, {}, V4, V4},
{0xF88D, "chl_set_timerecord", {REG, REG}, {}, V4, V4}, // TODO: regB might actually be INT8
{0xF88E, "chl_get_timerecord", {REG}, {}, V2, V4},
{0xF88F, "set_cmode_grave_rates", {REG}, {}, V2, V4},
{0xF88F, "set_cmode_grave_rates", {{REG_SET_FIXED, 20}}, {}, V2, V4},
{0xF890, nullptr, {}, {}, V2, V4},
{0xF891, "load_enemy_data", {INT32}, {}, V2, V2},
{0xF891, "load_enemy_data", {}, {INT32}, V3, V4},
{0xF892, "get_physical_data", {INT16}, {}, V2, V4},
{0xF893, "get_attack_data", {INT16}, {}, V2, V4},
{0xF894, "get_resist_data", {INT16}, {}, V2, V4},
{0xF895, "get_movement_data", {INT16}, {}, V2, V4},
{0xF896, nullptr, {REG, REG}, {}, V2, V4}, // INT8?
{0xF897, nullptr, {REG, REG}, {}, V2, V4}, // INT8?
{0xF892, "get_physical_data", {DATA_LABEL}, {}, V2, V4},
{0xF893, "get_attack_data", {DATA_LABEL}, {}, V2, V4},
{0xF894, "get_resist_data", {DATA_LABEL}, {}, V2, V4},
{0xF895, "get_movement_data", {DATA_LABEL}, {}, V2, V4},
{0xF896, nullptr, {REG, REG}, {}, V2, V4},
{0xF897, nullptr, {REG, REG}, {}, V2, V4},
{0xF898, "shift_left", {REG, REG}, {}, V2, V4},
{0xF899, "shift_right", {REG, REG}, {}, V2, V4},
{0xF89A, "get_random", {{REG_SET_FIXED, 2}, REG}, {}, V2, V4},
@@ -580,22 +586,22 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF89D, "chl_reverser", {}, {}, V2, V4},
{0xF89E, nullptr, {INT32}, {}, V2, V2},
{0xF89E, nullptr, {}, {INT32}, V3, V4},
{0xF89F, nullptr, {REG}, {}, V2, V4},
{0xF89F, nullptr, {REG}, {}, V2, V4}, // regA = client ID
{0xF8A0, nullptr, {}, {}, V2, V4},
{0xF8A1, nullptr, {}, {}, V2, V4},
{0xF8A2, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF8A3, "init_online_key", {}, {}, V2, V4},
{0xF8A4, "encrypt_gc_entry_auto", {REG}, {}, V2, V4},
{0xF8A5, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF8A6, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF8A7, "set_shrink_size", {REG, REG}, {}, V2, V4},
{0xF8A2, nullptr, {REG}, {}, V2, V4},
{0xF8A3, "load_serial_number_to_flag_buf", {}, {}, V2, V4}, // Loads 0 on BB
{0xF8A4, "write_flag_buf_to_event_flags", {REG}, {}, V2, V4},
{0xF8A5, nullptr, {{REG_SET_FIXED, 5}}, {}, V2, V4},
{0xF8A6, nullptr, {{REG_SET_FIXED, 10}}, {}, V2, V4},
{0xF8A7, "set_shrink_size", {REG, {REG_SET_FIXED, 3}}, {}, V2, V4},
{0xF8A8, "death_tech_lvl_up2", {INT32}, {}, V2, V2},
{0xF8A8, "death_tech_lvl_up2", {}, {INT32}, V3, V4},
{0xF8A9, nullptr, {REG}, {}, V2, V4},
{0xF8AA, "is_there_grave_message", {REG}, {}, V2, V4},
{0xF8AB, "get_ba_record", {REG}, {}, V2, V4},
{0xF8AB, "get_ba_record", {{REG_SET_FIXED, 7}}, {}, V2, V4},
{0xF8AC, "get_cmode_prize_rank", {REG}, {}, V2, V4},
{0xF8AD, "get_number_of_player2", {REG}, {}, V2, V4},
{0xF8AD, "get_number_of_players2", {REG}, {}, V2, V4},
{0xF8AE, "party_has_name", {REG}, {}, V2, V4},
{0xF8AF, "someone_has_spoken", {REG}, {}, V2, V4},
{0xF8B0, "read1", {REG, REG}, {}, V2, V2},
@@ -604,18 +610,18 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF8B1, "read2", {}, {REG, INT32}, V3, V4},
{0xF8B2, "read4", {REG, REG}, {}, V2, V2},
{0xF8B2, "read4", {}, {REG, INT32}, V3, V4},
{0xF8B3, "write1", {INT32, REG}, {}, V2, V2},
{0xF8B3, "write1", {REG, REG}, {}, V2, V2},
{0xF8B3, "write1", {}, {INT32, REG}, V3, V4},
{0xF8B4, "write2", {INT32, REG}, {}, V2, V2},
{0xF8B4, "write2", {REG, REG}, {}, V2, V2},
{0xF8B4, "write2", {}, {INT32, REG}, V3, V4},
{0xF8B5, "write4", {INT32, REG}, {}, V2, V2},
{0xF8B5, "write4", {REG, REG}, {}, V2, V2},
{0xF8B5, "write4", {}, {INT32, REG}, V3, V4},
{0xF8B6, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF8B7, nullptr, {REG}, {}, V2, V4}, // INT8?
{0xF8B6, nullptr, {REG}, {}, V2, V4},
{0xF8B7, nullptr, {REG}, {}, V2, V4},
{0xF8B8, nullptr, {}, {}, V2, V4},
{0xF8B9, "chl_recovery", {}, {}, V2, V4},
{0xF8BA, nullptr, {}, {}, V2, V4},
{0xF8BB, nullptr, {REG}, {}, V2, V4},
{0xF8BA, "load_guild_card_file_creation_time_to_flag_buf", {}, {}, V2, V4},
{0xF8BB, "write_flag_buf_to_event_flags2", {REG}, {}, V2, V4},
{0xF8BC, "set_episode", {INT32}, {}, V3, V4},
{0xF8C0, "file_dl_req", {}, {INT32, CSTRING}, V3, V4},
{0xF8C1, "get_dl_status", {REG}, {}, V3, V4},
@@ -624,9 +630,9 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF8C4, nullptr, {REG}, {}, V3, V4},
{0xF8C5, nullptr, {REG}, {}, V3, V4},
{0xF8C6, "qexit", {}, {}, V3, V4},
{0xF8C7, "use_animation", {REG, {REG_SET_FIXED, 2}}, {}, V3, V4},
{0xF8C7, "use_animation", {REG, REG}, {}, V3, V4},
{0xF8C8, "stop_animation", {REG}, {}, V3, V4},
{0xF8C9, "run_to_coord", {REG, REG}, {}, V3, V4},
{0xF8C9, "run_to_coord", {{REG_SET_FIXED, 4}, REG}, {}, V3, V4},
{0xF8CA, "set_slot_invincible", {REG, REG}, {}, V3, V4},
{0xF8CB, nullptr, {REG}, {}, V3, V4},
{0xF8CC, "set_slot_poison", {REG}, {}, V3, V4},
@@ -655,16 +661,16 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF8E3, "restore_hp", {REG}, {}, V3, V4},
{0xF8E4, "restore_tp", {REG}, {}, V3, V4},
{0xF8E5, "close_chat_bubble", {REG}, {}, V3, V4},
{0xF8E6, "move_coords_object", {REG, REG}, {}, V3, V4},
{0xF8E7, "at_coords_call_ex", {REG, REG}, {}, V3, V4},
{0xF8E8, nullptr, {REG, REG}, {}, V3, V4},
{0xF8E9, nullptr, {REG, REG}, {}, V3, V4},
{0xF8EA, nullptr, {REG, REG}, {}, V3, V4},
{0xF8EB, nullptr, {REG, REG}, {}, V3, V4},
{0xF8EC, nullptr, {REG, REG}, {}, V3, V4},
{0xF8E6, "move_coords_object", {REG, {REG_SET_FIXED, 3}}, {}, V3, V4},
{0xF8E7, "at_coords_call_ex", {{REG_SET_FIXED, 5}, REG}, {}, V3, V4},
{0xF8E8, nullptr, {{REG_SET_FIXED, 5}, REG}, {}, V3, V4},
{0xF8E9, nullptr, {{REG_SET_FIXED, 5}, REG}, {}, V3, V4},
{0xF8EA, nullptr, {{REG_SET_FIXED, 6}, REG}, {}, V3, V4},
{0xF8EB, nullptr, {{REG_SET_FIXED, 6}, REG}, {}, V3, V4},
{0xF8EC, nullptr, {{REG_SET_FIXED, 9}, REG}, {}, V3, V4},
{0xF8ED, "animation_check", {REG, REG}, {}, V3, V4},
{0xF8EE, "call_image_data", {}, {INT32, DATA_LABEL}, V3, V4},
{0xF8EF, nullptr, {}, {}, V3, V4},
{0xF8EF, "nop_F8EF", {}, {}, V3, V4},
{0xF8F0, "turn_off_bgm_p2", {}, {}, V3, V4},
{0xF8F1, "turn_on_bgm_p2", {}, {}, V3, V4},
{0xF8F2, nullptr, {}, {INT32, FLOAT32, FLOAT32, INT32, {REG_SET_FIXED, 4}, DATA_LABEL}, V3, V4},
@@ -682,7 +688,7 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF90E, "fdiv", {REG, REG}, {}, V3, V4},
{0xF90F, "fdivi", {REG, FLOAT32}, {}, V3, V4},
{0xF910, "get_unknown_count", {}, {CLIENT_ID, REG}, V3, V4},
{0xF911, "get_stackable_item_count", {{REG_SET_FIXED, 4}, REG}, {}, V3, V4},
{0xF911, "get_stackable_item_count", {{REG_SET_FIXED, 4}, REG}, {}, V3, V4}, // regsA[0] is client ID
{0xF912, "freeze_and_hide_equip", {}, {}, V3, V4},
{0xF913, "thaw_and_show_equip", {}, {}, V3, V4},
{0xF914, "set_palettex_callback", {}, {CLIENT_ID, FUNCTION16}, V3, V4},
@@ -691,7 +697,7 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF917, "restore_palettex", {}, {CLIENT_ID}, V3, V4},
{0xF918, "disable_palettex", {}, {CLIENT_ID}, V3, V4},
{0xF919, "get_palettex_activated", {}, {CLIENT_ID, REG}, V3, V4},
{0xF91A, "get_unknown_palettex_status", {}, {CLIENT_ID, INT32, REG}, V3, V4},
{0xF91A, "get_unknown_palettex_status", {}, {CLIENT_ID, INT32, REG}, V3, V4}, // Middle arg is unused
{0xF91B, "disable_movement2", {}, {CLIENT_ID}, V3, V4},
{0xF91C, "enable_movement2", {}, {CLIENT_ID}, V3, V4},
{0xF91D, "get_time_played", {REG}, {}, V3, V4},
@@ -701,10 +707,10 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF921, "get_section_id", {}, {CLIENT_ID, REG}, V3, V4},
{0xF922, "get_player_hp", {}, {CLIENT_ID, {REG_SET_FIXED, 4}}, V3, V4},
{0xF923, "get_floor_number", {}, {CLIENT_ID, {REG_SET_FIXED, 2}}, V3, V4},
{0xF924, "get_coord_player_detect", {REG, REG}, {}, V3, V4},
{0xF924, "get_coord_player_detect", {{REG_SET_FIXED, 3}, {REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF925, "read_global_flag", {}, {INT32, REG}, V3, V4},
{0xF926, "write_global_flag", {}, {INT32, INT32}, V3, V4},
{0xF927, nullptr, {REG, REG}, {}, V3, V4},
{0xF927, nullptr, {{REG_SET_FIXED, 4}, REG}, {}, V3, V4},
{0xF928, "floor_player_detect", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF929, "read_disk_file", {}, {CSTRING}, V3, V4},
{0xF92A, "open_pack_select", {}, {}, V3, V4},
@@ -713,17 +719,17 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF92D, "color_change", {}, {INT32, INT32, INT32, INT32, INT32}, V3, V4},
{0xF92E, "send_statistic", {}, {INT32, INT32, INT32, INT32, INT32, INT32, INT32, INT32}, V3, V4},
{0xF92F, nullptr, {}, {INT32, INT32}, V3, V4},
{0xF930, "chat_box", {}, {INT32, INT32, INT32, INT32, INT32, CSTRING}, V3, V4},
{0xF930, "chat_box", {}, {FLOAT32, FLOAT32, FLOAT32, FLOAT32, INT32, CSTRING}, V3, V4},
{0xF931, "chat_bubble", {}, {INT32, CSTRING}, V3, V4},
{0xF932, nullptr, {REG}, {}, V3, V4},
{0xF933, nullptr, {REG}, {}, V3, V4},
{0xF934, "scroll_text", {}, {INT32, INT32, INT32, INT32, INT32, FLOAT32, REG, CSTRING}, V3, V4},
{0xF933, nullptr, {{REG_SET_FIXED, 7}}, {}, V3, V4}, // regsA[1-6] form an ItemData's data1[0-5]
{0xF934, "scroll_text", {}, {FLOAT32, FLOAT32, FLOAT32, FLOAT32, INT32, FLOAT32, REG, CSTRING}, V3, V4},
{0xF935, "gba_create_dl_graph", {}, {}, V3, V4},
{0xF936, "gba_destroy_dl_graph", {}, {}, V3, V4},
{0xF937, "gba_update_dl_graph", {}, {}, V3, V4},
{0xF938, "add_damage_to", {}, {INT32, INT32}, V3, V4},
{0xF938, "add_damage_to", {}, {INT32, FLOAT32}, V3, V4},
{0xF939, "item_delete3", {}, {INT32}, V3, V4},
{0xF93A, "get_item_info", {}, {ITEM_ID, {REG_SET_FIXED, 12}}, V3, V4},
{0xF93A, "get_item_info", {}, {ITEM_ID, {REG_SET_FIXED, 12}}, V3, V4}, // regsB are item.data1
{0xF93B, "item_packing1", {}, {ITEM_ID}, V3, V4},
{0xF93C, "item_packing2", {}, {ITEM_ID, INT32}, V3, V4},
{0xF93D, "get_lang_setting", {}, {REG}, V3, V4},
@@ -740,12 +746,12 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF948, "tan", {}, {REG, INT32}, V3, V4},
{0xF949, nullptr, {}, {REG, FLOAT32, FLOAT32}, V3, V4},
{0xF94A, "boss_is_dead2", {REG}, {}, V3, V4},
{0xF94B, "particle3", {REG}, {}, V3, V4},
{0xF94C, nullptr, {REG}, {}, V3, V4},
{0xF94D, "give_or_take_card", {{REG_SET_FIXED, 2}}, {}, V3, V3},
{0xF94D, "nop2", {}, {}, V4, V4},
{0xF94E, "nop3", {}, {}, V4, V4},
{0xF94F, "nop4", {}, {}, V4, V4},
{0xF94B, "particle3", {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF94C, nullptr, {{REG_SET_FIXED, 4}}, {}, V3, V4},
{0xF94D, "give_or_take_card", {{REG_SET_FIXED, 2}}, {}, V3, V3}, // regsA[0] is card_id; card is added if regsA[1] >= 0, otherwise it's removed
{0xF94D, "nop_F94D", {}, {}, V4, V4},
{0xF94E, "nop_F94E", {}, {}, V4, V4},
{0xF94F, "nop_F94F", {}, {}, V4, V4},
{0xF950, "bb_p2_menu", {}, {INT32}, V4, V4},
{0xF951, "bb_map_designate", {INT8, INT8, INT8, INT8, INT8}, {}, V4, V4},
{0xF952, "bb_get_number_in_pack", {REG}, {}, V4, V4},