match GetAngleBetweenNPCs

This commit is contained in:
Alex Bates 2020-08-15 05:27:01 +01:00
parent a25b53a8a1
commit 0f34468a77
7 changed files with 68 additions and 97 deletions

View File

@ -1,49 +0,0 @@
.set noat # allow manual use of $at
.set noreorder # don't insert nops after branches
glabel GetAngleBetweenNPCs
/* 0F90B8 802D4708 27BDFFD8 */ addiu $sp, $sp, -0x28
/* 0F90BC 802D470C AFB20018 */ sw $s2, 0x18($sp)
/* 0F90C0 802D4710 0080902D */ daddu $s2, $a0, $zero
/* 0F90C4 802D4714 AFBF0020 */ sw $ra, 0x20($sp)
/* 0F90C8 802D4718 AFB3001C */ sw $s3, 0x1c($sp)
/* 0F90CC 802D471C AFB10014 */ sw $s1, 0x14($sp)
/* 0F90D0 802D4720 AFB00010 */ sw $s0, 0x10($sp)
/* 0F90D4 802D4724 8E50000C */ lw $s0, 0xc($s2)
/* 0F90D8 802D4728 8E050000 */ lw $a1, ($s0)
/* 0F90DC 802D472C 0C0B1EAF */ jal get_variable
/* 0F90E0 802D4730 26100004 */ addiu $s0, $s0, 4
/* 0F90E4 802D4734 8E050000 */ lw $a1, ($s0)
/* 0F90E8 802D4738 26100004 */ addiu $s0, $s0, 4
/* 0F90EC 802D473C 0240202D */ daddu $a0, $s2, $zero
/* 0F90F0 802D4740 0C0B1EAF */ jal get_variable
/* 0F90F4 802D4744 0040882D */ daddu $s1, $v0, $zero
/* 0F90F8 802D4748 0240202D */ daddu $a0, $s2, $zero
/* 0F90FC 802D474C 0220282D */ daddu $a1, $s1, $zero
/* 0F9100 802D4750 8E130000 */ lw $s3, ($s0)
/* 0F9104 802D4754 0C0B36B0 */ jal resolve_npc
/* 0F9108 802D4758 0040882D */ daddu $s1, $v0, $zero
/* 0F910C 802D475C 0240202D */ daddu $a0, $s2, $zero
/* 0F9110 802D4760 0220282D */ daddu $a1, $s1, $zero
/* 0F9114 802D4764 0C0B36B0 */ jal resolve_npc
/* 0F9118 802D4768 0040802D */ daddu $s0, $v0, $zero
/* 0F911C 802D476C 8C460038 */ lw $a2, 0x38($v0)
/* 0F9120 802D4770 C60C0038 */ lwc1 $f12, 0x38($s0)
/* 0F9124 802D4774 C60E0040 */ lwc1 $f14, 0x40($s0)
/* 0F9128 802D4778 0C00A720 */ jal atan2
/* 0F912C 802D477C 8C470040 */ lw $a3, 0x40($v0)
/* 0F9130 802D4780 0240202D */ daddu $a0, $s2, $zero
/* 0F9134 802D4784 4600008D */ trunc.w.s $f2, $f0
/* 0F9138 802D4788 44061000 */ mfc1 $a2, $f2
/* 0F913C 802D478C 0C0B2026 */ jal set_variable
/* 0F9140 802D4790 0260282D */ daddu $a1, $s3, $zero
/* 0F9144 802D4794 8FBF0020 */ lw $ra, 0x20($sp)
/* 0F9148 802D4798 8FB3001C */ lw $s3, 0x1c($sp)
/* 0F914C 802D479C 8FB20018 */ lw $s2, 0x18($sp)
/* 0F9150 802D47A0 8FB10014 */ lw $s1, 0x14($sp)
/* 0F9154 802D47A4 8FB00010 */ lw $s0, 0x10($sp)
/* 0F9158 802D47A8 24020002 */ addiu $v0, $zero, 2
/* 0F915C 802D47AC 03E00008 */ jr $ra
/* 0F9160 802D47B0 27BD0028 */ addiu $sp, $sp, 0x28

View File

@ -4,6 +4,12 @@
#include "ultra64.h"
#include "types.h"
typedef struct vec3f {
/* 0x00 */ f32 x;
/* 0x04 */ f32 y;
/* 0x08 */ f32 z;
} vec3f; // size = 0x0C
typedef struct matrix4f {
/* 0x00 */ f32 mtx[4][4];
} matrix4f; // size = 0x40
@ -18,7 +24,7 @@ typedef struct cam_pos_settings {
/* 0x04 */ f32 boomLength;
/* 0x08 */ f32 boomPitch;
/* 0x0C */ f32 viewPitch;
/* 0x10 */ f32 position[3];
/* 0x10 */ struct vec3f position;
} cam_pos_settings; // size = 0x1C
typedef struct partner_data {
@ -55,12 +61,12 @@ typedef struct npc {
/* 0x024 */ char unk_24[4];
/* 0x028 */ u32 currentAnim;
/* 0x02C */ char unk_2C[12];
/* 0x038 */ f32 pos[3];
/* 0x044 */ f32 rotation[3];
/* 0x038 */ struct vec3f pos;
/* 0x044 */ struct vec3f rotation;
/* 0x050 */ char unk_50[4];
/* 0x054 */ f32 scale[3];
/* 0x060 */ f32 moveToPos[3];
/* 0x06C */ f32 colliderPos[3]; /* used during collision with player */
/* 0x054 */ struct vec3f scale;
/* 0x060 */ struct vec3f moveToPos;
/* 0x06C */ struct vec3f colliderPos; /* used during collision with player */
/* 0x078 */ s32 shadowIndex;
/* 0x07C */ f32 shadowScale;
/* 0x080 */ char unk_80[8];
@ -427,7 +433,7 @@ typedef struct camera {
/* 0x03C */ f32 lookAt_eye[3];
/* 0x048 */ f32 lookAt_obj[3];
/* 0x054 */ char unk_54[12];
/* 0x060 */ f32 targetPos[3];
/* 0x060 */ struct vec3f targetPos;
/* 0x06C */ f32 currentYaw;
/* 0x070 */ char unk_70[4];
/* 0x074 */ f32 currentBoomYaw;
@ -454,13 +460,13 @@ typedef struct camera {
/* 0x48C */ f32 linearInterpScale; /* 3.0? */
/* 0x490 */ f32 moveSpeed;
/* 0x494 */ char unk_494[28];
/* 0x4B0 */ f32 movePos[3];
/* 0x4B0 */ struct vec3f movePos;
/* 0x4BC */ char unk_4BC[28];
/* 0x4D8 */ s32 controllerType;
/* 0x4DC */ f32 controllerBoomLen;
/* 0x4E0 */ f32 controllerBoomPitch;
/* 0x4E4 */ f32 posA[3];
/* 0x4F0 */ f32 posB[3];
/* 0x4E4 */ struct vec3f posA;
/* 0x4F0 */ struct vec3f posB;
/* 0x4FC */ f32 controllerViewPitch;
/* 0x500 */ char unk_500[4];
/* 0x504 */ s16 boolTargetPlayer;
@ -737,7 +743,7 @@ typedef struct item_entity {
/* 0x00 */ s32 flags;
/* 0x04 */ s16 boundVar; /* see make_item_entity */
/* 0x06 */ char unk_06[2];
/* 0x08 */ f32 position[3];
/* 0x08 */ struct vec3f position;
/* 0x14 */ struct item_entity_physics_data* physicsData;
/* 0x18 */ s16 itemID; /* into item table, also worldIconID */
/* 0x1A */ u8 state;
@ -776,10 +782,10 @@ typedef struct sprite_component {
/* 0x10 */ s32 loopCounter;
/* 0x14 */ s32 currentRaster;
/* 0x18 */ s32 currentPalette;
/* 0x1C */ f32 posOffset[3];
/* 0x28 */ f32 compPos[3];
/* 0x34 */ f32 rotation[3];
/* 0x40 */ f32 scale[3];
/* 0x1C */ struct vec3f posOffset;
/* 0x28 */ struct vec3f compPos;
/* 0x34 */ struct vec3f rotation;
/* 0x40 */ struct vec3f scale;
/* 0x4C */ char unk_4C[4];
} sprite_component; // size = 0x50
@ -856,7 +862,7 @@ typedef struct game_status {
/* 0x08E */ s16 entryID;
/* 0x090 */ char unk_90[4];
/* 0x094 */ f32 exitAngle;
/* 0x098 */ f32 playerPos[3];
/* 0x098 */ struct vec3f playerPos;
/* 0x0A4 */ f32 playerYaw;
/* 0x0A8 */ char unk_A8[4];
/* 0x0AC */ s8 loadMenuState;
@ -898,8 +904,8 @@ typedef struct partner_anim_set {
typedef struct shadow {
/* 0x00 */ s32 flags;
/* 0x04 */ char unk_04[12];
/* 0x10 */ f32 position[3];
/* 0x1C */ f32 scale[3];
/* 0x10 */ struct vec3f position;
/* 0x1C */ struct vec3f scale;
/* 0x28 */ char unk_28[80];
} shadow; // size = 0x78
@ -959,13 +965,13 @@ typedef struct ActorPart {
/* 0x10 */ struct actor_part_movement* movement;
/* 0x14 */ s16 partOffset[3];
/* 0x1A */ s16 visualOffset[3];
/* 0x20 */ f32 partOffsetFloat[3];
/* 0x2C */ f32 absolutePosition[3];
/* 0x38 */ f32 rotation[3];
/* 0x20 */ struct vec3f partOffsetFloat;
/* 0x2C */ struct vec3f absolutePosition;
/* 0x38 */ struct vec3f rotation;
/* 0x44 */ s16 rotationPivotOffset[3];
/* 0x4A */ char unk_4A[2];
/* 0x4C */ f32 scale[3];
/* 0x58 */ f32 currentPos[3];
/* 0x58 */ struct vec3f currentPos;
/* 0x64 */ f32 yaw;
/* 0x68 */ s16 unkOffset[2];
/* 0x6C */ s16 targetOffset[2];
@ -1094,14 +1100,14 @@ typedef struct encounter {
typedef struct player_path_element {
/* 0x00 */ char unk_00[4];
/* 0x04 */ f32 pos[3];
/* 0x04 */ struct vec3f pos;
} player_path_element; // size = 0x10
typedef struct animated_model {
/* 0x00 */ s32 animModelID;
/* 0x04 */ f32 pos[3]; /* Created by retype action */
/* 0x10 */ f32 rot[3];
/* 0x1C */ f32 scale[3];
/* 0x04 */ struct vec3f pos; /* Created by retype action */
/* 0x10 */ struct vec3f rot;
/* 0x1C */ struct vec3f scale;
/* 0x28 */ struct matrix4s* mtx;
/* 0x2C */ char unk_2C[60];
/* 0x68 */ u32 currentAnimData;
@ -1134,9 +1140,9 @@ typedef struct Actor {
/* 0x000 */ s32 flags;
/* 0x004 */ char unk_04[4];
/* 0x008 */ struct StaticActorData* staticActorData;
/* 0x00C */ f32 moveCurrentPos[3];
/* 0x018 */ f32 moveGoalPos[3];
/* 0x024 */ f32 moveEndPos[3]; /* where other actors should target this one at. saved before partner switching */
/* 0x00C */ struct vec3f moveCurrentPos;
/* 0x018 */ struct vec3f moveGoalPos;
/* 0x024 */ struct vec3f moveEndPos; /* where other actors should target this one at. saved before partner switching */
/* 0x030 */ char unk_30[24];
/* 0x048 */ f32 jumpAccel;
/* 0x04C */ f32 moveSpeed;
@ -1154,9 +1160,9 @@ typedef struct Actor {
/* 0x077 */ u8 jumpPartIndex;
/* 0x078 */ char unk_78[16];
/* 0x088 */ s32 varTable[16];
/* 0x0C8 */ f32 flyCurrentPos[3];
/* 0x0D4 */ f32 flyGoalPos[3];
/* 0x0E0 */ f32 flyTempPos[3]; /* used for start in fly functions, end in flyrun functions */
/* 0x0C8 */ struct vec3f flyCurrentPos;
/* 0x0D4 */ struct vec3f flyGoalPos;
/* 0x0E0 */ struct vec3f flyTempPos; /* used for start in fly functions, end in flyrun functions */
/* 0x0EC */ char unk_EC[24];
/* 0x104 */ f32 flyJumpAccel;
/* 0x108 */ f32 flySpeed;
@ -1171,8 +1177,8 @@ typedef struct Actor {
/* 0x135 */ u8 footStepCounter;
/* 0x136 */ u8 actorType;
/* 0x137 */ char unk_137;
/* 0x138 */ f32 homePos[3];
/* 0x144 */ f32 currentPos[3];
/* 0x138 */ struct vec3f homePos;
/* 0x144 */ struct vec3f currentPos;
/* 0x150 */ s16 otherPosheadOffset[3];
/* 0x156 */ s16 healthBarPosition[3];
/* 0x15C */ f32 rotation[3];
@ -1333,8 +1339,8 @@ typedef struct player_status {
/* 0x014 */ u8 enableCollisionOverlapsCheck;
/* 0x015 */ u8 statusMenuCounterinputEnabledCounter; /* whether the C-up menu can appear */
/* 0x016 */ s16 lastGoodPosition[3];
/* 0x01C */ f32 extraVelocity[3];
/* 0x028 */ f32 position[3];
/* 0x01C */ struct vec3f extraVelocity;
/* 0x028 */ struct vec3f position;
/* 0x034 */ char unk_34[16];
/* 0x044 */ f32 decorationPos[2];
/* 0x04C */ char unk_4C[4];

View File

@ -9,12 +9,14 @@ void osCleanupThread(void);
void clone_model(u16 srcModelID, u16 newModelID);
void update_collider_transform(s16 colliderID);
s32 get_variable(script_context* script, s32 pos);
f32 get_float_variable(script_context* script, s32 pos);
f32 set_float_variable(script_context* script, s32 dest, f32 value);
s32 get_variable(script_context* script, bytecode var);
void set_variable(script_context* script, bytecode var, s32 value);
f32 get_float_variable(script_context* script, bytecode var);
f32 set_float_variable(script_context* script, bytecode var, f32 value);
void set_script_timescale(script_context* script, f32 timescale);
f32 sin_deg(f32 x);
f32 cos_deg(f32 x);
f32 atan2(f32 startX, f32 startZ, f32 endX, f32 endZ);
s32 func_80055448(s32);
s32 func_80055464(s32, s32);
s32 func_800554A4(s32, s32);

View File

@ -52,7 +52,7 @@ INCLUDE_ASM(code_42e0_len_1f60, clamp_angle);
INCLUDE_ASM(code_42e0_len_1f60, get_clamped_angle_diff);
INCLUDE_ASM(code_42e0_len_1f60, atan2);
f32 INCLUDE_ASM(code_42e0_len_1f60, atan2, f32 startX, f32 startZ, f32 endX, f32 endZ);
INCLUDE_ASM(code_42e0_len_1f60, get_player_normal_yaw);

View File

@ -407,17 +407,17 @@ INCLUDE_ASM(code_e92d0_len_5da0, si_execute_next_command);
INCLUDE_ASM(code_e92d0_len_5da0, si_handle_end);
s32 INCLUDE_ASM(code_e92d0_len_5da0, get_variable, script_context* script, s32 pos);
s32 INCLUDE_ASM(code_e92d0_len_5da0, get_variable, script_context* script, s32 var);
INCLUDE_ASM(code_e92d0_len_5da0, get_variable_index);
INCLUDE_ASM(code_e92d0_len_5da0, get_variable_index_alt);
INCLUDE_ASM(code_e92d0_len_5da0, set_variable);
s32 INCLUDE_ASM(code_e92d0_len_5da0, set_variable, script_context* script, s32 var, s32 value);
f32 INCLUDE_ASM(code_e92d0_len_5da0, get_float_variable, script_context* script, s32 pos);
f32 INCLUDE_ASM(code_e92d0_len_5da0, get_float_variable, script_context* script, s32 var);
f32 INCLUDE_ASM(code_e92d0_len_5da0, set_float_variable, script_context* script, s32 dest, f32 value);
f32 INCLUDE_ASM(code_e92d0_len_5da0, set_float_variable, script_context* script, s32 var, f32 value);
INCLUDE_ASM(code_e92d0_len_5da0, si_goto_label);

View File

@ -42,7 +42,19 @@ s32 RandInt(script_context* script, s32 initialCall) {
return 2;
}
INCLUDE_ASM(code_f8f60_len_1560, GetAngleBetweenNPCs);
s32 GetAngleBetweenNPCs(script_context* script, s32 initialCall) {
bytecode* ptrReadPos = script->ptrReadPos;
NPC aID = get_variable(script, *ptrReadPos++);
NPC bID = get_variable(script, *ptrReadPos++);
bytecode outVar = *ptrReadPos++;
npc* a = resolve_npc(script, aID);
npc* b = resolve_npc(script, bID);
set_variable(script, outVar, atan2(a->pos.x, a->pos.z, b->pos.x, b->pos.z));
return 2;
}
INCLUDE_ASM(code_f8f60_len_1560, GetAngleToNPC);

View File

@ -312,9 +312,9 @@ s32 SetItemPos(script_context* script, s32 initialCall) {
z = get_variable(script, *ptrReadPos++);
ptrItemEntity = (item_entity *) get_item_entity(itemEntityIndex);
ptrItemEntity->position[0] = x;
ptrItemEntity->position[1] = y;
ptrItemEntity->position[2] = z;
ptrItemEntity->position.x = x;
ptrItemEntity->position.y = y;
ptrItemEntity->position.z = z;
return 2;
}