describe quest opcode F8F2

This commit is contained in:
Martin Michelsen
2024-10-04 23:24:46 -07:00
parent 23e37b8eb7
commit a734bcf483
+21 -13
View File
@@ -125,9 +125,12 @@ static string format_and_indent_data(const void* data, size_t size, uint64_t sta
return ret; return ret;
} }
struct UnknownF8F2Entry { struct BezierCurveControlPoint {
parray<le_float, 4> unknown_a1; le_float x;
} __packed_ws__(UnknownF8F2Entry, 0x10); le_float y;
le_float z;
le_float t;
} __packed_ws__(BezierCurveControlPoint, 0x10);
struct QuestScriptOpcodeDefinition { struct QuestScriptOpcodeDefinition {
struct Argument { struct Argument {
@@ -158,7 +161,7 @@ struct QuestScriptOpcodeDefinition {
ATTACK_DATA, ATTACK_DATA,
MOVEMENT_DATA, MOVEMENT_DATA,
IMAGE_DATA, IMAGE_DATA,
UNKNOWN_F8F2_DATA, BEZIER_CONTROL_POINT_DATA,
}; };
Type type; Type type;
@@ -761,16 +764,21 @@ static const QuestScriptOpcodeDefinition opcode_defs[] = {
{0xF8E6, "move_coords_object", "unknownF8E6", {REG, {REG_SET_FIXED, 3}}, F_V3_V4}, {0xF8E6, "move_coords_object", "unknownF8E6", {REG, {REG_SET_FIXED, 3}}, F_V3_V4},
{0xF8E7, "at_coords_call_ex", "unknownF8E7", {{REG_SET_FIXED, 5}, REG}, F_V3_V4}, {0xF8E7, "at_coords_call_ex", "unknownF8E7", {{REG_SET_FIXED, 5}, REG}, F_V3_V4},
{0xF8E8, "at_coords_talk_ex", "unknownF8E8", {{REG_SET_FIXED, 5}, REG}, F_V3_V4}, {0xF8E8, "at_coords_talk_ex", "unknownF8E8", {{REG_SET_FIXED, 5}, REG}, F_V3_V4},
{0xF8E9, "walk_to_coord_call_ex", "unknownF8E9", {{REG_SET_FIXED, 5}, REG}, F_V3_V4}, {0xF8E9, "npc_coords_call_ex", "unknownF8E9", {{REG_SET_FIXED, 5}, REG}, F_V3_V4},
{0xF8EA, "col_npcinr_ex", "unknownF8EA", {{REG_SET_FIXED, 6}, REG}, F_V3_V4}, {0xF8EA, "party_coords_call_ex", "unknownF8EA", {{REG_SET_FIXED, 6}, REG}, F_V3_V4},
{0xF8EB, "set_obj_param_ex", "unknownF8EB", {{REG_SET_FIXED, 6}, REG}, F_V3_V4}, {0xF8EB, "set_obj_param_ex", "unknownF8EB", {{REG_SET_FIXED, 6}, REG}, F_V3_V4},
{0xF8EC, "col_plinaw_ex", "unknownF8EC", {{REG_SET_FIXED, 9}, REG}, F_V3_V4}, {0xF8EC, "npc_check_straggle_ex", "unknownF8EC", {{REG_SET_FIXED, 9}, REG}, F_V3_V4},
{0xF8ED, "animation_check", nullptr, {REG, REG}, F_V3_V4}, {0xF8ED, "animation_check", nullptr, {REG, REG}, F_V3_V4},
{0xF8EE, "call_image_data", nullptr, {INT32, {LABEL16, Arg::DataType::IMAGE_DATA}}, F_V3_V4 | F_ARGS}, {0xF8EE, "call_image_data", nullptr, {INT32, {LABEL16, Arg::DataType::IMAGE_DATA}}, F_V3_V4 | F_ARGS},
{0xF8EF, "nop_F8EF", "unknownF8EF", {}, F_V3_V4}, {0xF8EF, "nop_F8EF", "unknownF8EF", {}, F_V3_V4},
{0xF8F0, "turn_off_bgm_p2", nullptr, {}, F_V3_V4}, {0xF8F0, "turn_off_bgm_p2", nullptr, {}, F_V3_V4},
{0xF8F1, "turn_on_bgm_p2", nullptr, {}, F_V3_V4}, {0xF8F1, "turn_on_bgm_p2", nullptr, {}, F_V3_V4},
{0xF8F2, "unknown_F8F2", "load_unk_data", {INT32, FLOAT32, FLOAT32, INT32, {REG_SET_FIXED, 4}, {LABEL16, Arg::DataType::UNKNOWN_F8F2_DATA}}, F_V3_V4 | F_ARGS}, // TODO (DX) // argsA[0] is control point count
// argsA[1] and argsA[2] scale the control value sum
// argsA[3] determines whether the last point is included or not (0=excluded, 1=included)
// argsA[4] is the register set to return the result into (4 consecutive registers; x, y, z, success (0 or 1))
// argsA[5] points to the control point entries
{0xF8F2, "compute_bezier_curve_point", "load_unk_data", {INT32, FLOAT32, FLOAT32, INT32, {REG_SET_FIXED, 4}, {LABEL16, Arg::DataType::BEZIER_CONTROL_POINT_DATA}}, F_V3_V4 | F_ARGS},
{0xF8F3, "particle2", nullptr, {{REG_SET_FIXED, 3}, INT32, FLOAT32}, F_V3_V4 | F_ARGS}, {0xF8F3, "particle2", nullptr, {{REG_SET_FIXED, 3}, INT32, FLOAT32}, F_V3_V4 | F_ARGS},
{0xF901, "dec2float", nullptr, {REG, REG}, F_V3_V4}, {0xF901, "dec2float", nullptr, {REG, REG}, F_V3_V4},
{0xF902, "float2dec", nullptr, {REG, REG}, F_V3_V4}, {0xF902, "float2dec", nullptr, {REG, REG}, F_V3_V4},
@@ -1657,13 +1665,13 @@ std::string disassemble_quest_script(
lines.emplace_back(format_and_indent_data(cmd_r.pgetv(compressed_end_offset, remaining_size), remaining_size, compressed_end_offset)); lines.emplace_back(format_and_indent_data(cmd_r.pgetv(compressed_end_offset, remaining_size), remaining_size, compressed_end_offset));
} }
} }
if (l->has_data_type(Arg::DataType::UNKNOWN_F8F2_DATA)) { if (l->has_data_type(Arg::DataType::BEZIER_CONTROL_POINT_DATA)) {
phosg::StringReader r = cmd_r.sub(l->offset, size); phosg::StringReader r = cmd_r.sub(l->offset, size);
lines.emplace_back(" // As F8F2 entries"); lines.emplace_back(" // As Bezier curve control points");
while (r.remaining() >= sizeof(UnknownF8F2Entry)) { while (r.remaining() >= sizeof(BezierCurveControlPoint)) {
size_t offset = l->offset + cmd_r.where(); size_t offset = l->offset + cmd_r.where();
const auto& e = r.get<UnknownF8F2Entry>(); const auto& e = r.get<BezierCurveControlPoint>();
lines.emplace_back(phosg::string_printf(" %04zX entry %g, %g, %g, %g", offset, e.unknown_a1[0].load(), e.unknown_a1[1].load(), e.unknown_a1[2].load(), e.unknown_a1[3].load())); lines.emplace_back(phosg::string_printf(" %04zX point x=%g, y=%g, z=%g, t=%g", offset, e.x.load(), e.y.load(), e.z.load(), e.t.load()));
} }
if (r.remaining() > 0) { if (r.remaining() > 0) {
size_t struct_end_offset = l->offset + r.where(); size_t struct_end_offset = l->offset + r.where();