mirror of https://github.com/pmret/papermario.git
356 lines
9.5 KiB
C
356 lines
9.5 KiB
C
#include "common.h"
|
|
#include "nu/nusys.h"
|
|
|
|
// TODO: replace nustuff with defines
|
|
|
|
u16 D_80074260 = 0;
|
|
s32 D_80074264 = 0;
|
|
|
|
// probably padding
|
|
s32 D_80074268[2] = {0, 0};
|
|
|
|
s32 D_80074270 = 0;
|
|
|
|
f32 D_80074274[] = {
|
|
0.0f, 0.017452f, 0.034899f, 0.052336f, 0.069756f, 0.087156f, 0.104528f, 0.121869f, 0.139173f,
|
|
0.156434f, 0.173648f, 0.190809f, 0.207912f, 0.224951f, 0.241922f, 0.258819f, 0.275637f, 0.292372f, 0.309017f,
|
|
0.325568f, 0.34202f, 0.358368f, 0.374607f, 0.390731f, 0.406737f, 0.422618f, 0.438371f, 0.45399f, 0.469472f,
|
|
0.48481f, 0.5f, 0.515038f, 0.529919f, 0.544639f, 0.559193f, 0.573576f, 0.587785f, 0.601815f, 0.615661f, 0.62932f,
|
|
0.642788f, 0.656059f, 0.669131f, 0.681998f, 0.694658f, 0.707107f, 0.71934f, 0.731354f, 0.743145f, 0.75471f,
|
|
0.766044f, 0.777146f, 0.788011f, 0.798636f, 0.809017f, 0.819152f, 0.829038f, 0.838671f, 0.848048f, 0.857167f,
|
|
0.866025f, 0.87462f, 0.882948f, 0.891007f, 0.898794f, 0.906308f, 0.913545f, 0.920505f, 0.927184f, 0.93358f,
|
|
0.939693f, 0.945519f, 0.951057f, 0.956305f, 0.961262f, 0.965926f, 0.970296f, 0.97437f, 0.978148f, 0.981627f,
|
|
0.984808f, 0.987688f, 0.990268f, 0.992546f, 0.994522f, 0.996195f, 0.997564f, 0.99863f, 0.999391f, 0.999848f, 1.0f
|
|
};
|
|
|
|
s8 D_800743E0[] = {
|
|
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
|
|
0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
};
|
|
|
|
s32 gRandSeed = 1;
|
|
|
|
f32 D_80074414[] = {
|
|
1.0f, 1.273187f, 1.27303f, 1.272768f, 1.272402f, 1.271932f, 1.271358f, 1.270681f, 1.269902f, 1.269021f, 1.268038f,
|
|
1.266956f, 1.265774f, 1.264494f, 1.263116f, 1.261643f, 1.260075f, 1.258413f, 1.256659f, 1.254815f, 1.252881f,
|
|
1.250859f, 1.248752f, 1.24656f, 1.244285f, 1.241929f, 1.239494f, 1.236981f, 1.234393f, 1.231731f, 1.228997f,
|
|
1.226192f, 1.22332f, 1.220382f, 1.217379f, 1.214315f, 1.211189f, 1.208006f, 1.204766f, 1.201471f, 1.198124f,
|
|
1.194727f, 1.191281f, 1.187787f, 1.18425f, 1.180669f, 1.177047f, 1.173386f, 1.169687f, 1.165952f, 1.162184f,
|
|
1.158384f, 1.154553f, 1.150693f, 1.146806f, 1.142893f, 1.138957f, 1.134998f, 1.131018f, 1.127019f, 1.123002f,
|
|
1.118969f, 1.11492f, 1.110858f, 1.106783f, 1.102697f, 1.098601f, 1.094496f, 1.090384f, 1.086266f, 1.082142f,
|
|
1.078014f, 1.073883f, 1.06975f, 1.065616f, 1.061482f, 1.057348f, 1.053216f, 1.049087f, 1.04496f, 1.040838f,
|
|
1.036721f, 1.03261f, 1.028504f, 1.024406f, 1.020316f, 1.016234f, 1.01216f, 1.008097f, 1.004043f, 1.0f
|
|
};
|
|
|
|
Gfx D_80074580[] = {
|
|
gsDPPipeSync(),
|
|
gsSPTexture(-1, -1, 0, G_TX_RENDERTILE, G_OFF),
|
|
gsDPSetCycleType(G_CYC_1CYCLE),
|
|
gsDPSetTexturePersp(G_TP_NONE),
|
|
gsDPSetTextureDetail(G_TD_CLAMP),
|
|
gsDPSetTextureLOD(G_TL_TILE),
|
|
gsDPSetTextureFilter(G_TF_POINT),
|
|
gsDPSetTextureLUT(G_TT_NONE),
|
|
gsDPSetTextureConvert(G_TC_FILT),
|
|
gsSPEndDisplayList(),
|
|
};
|
|
|
|
void sin_cos_rad(f32 rad, f32* outSinTheta, f32* outCosTheta);
|
|
void func_80029860(s32 romStart, s32 vramDest, s32 length);
|
|
|
|
#define ROM_CHUNK_SIZE 0x2000
|
|
|
|
void poll_rumble(void) {
|
|
nuContRmbCheck(0);
|
|
nuContRmbModeSet(0, 2);
|
|
}
|
|
|
|
void start_rumble(s32 freq, s32 frame) {
|
|
if (GAME_STATUS->demoState == 0) {
|
|
u16* sym = &D_80074260;
|
|
|
|
if (*sym != 0) {
|
|
s32 symx2 = *sym * 2;
|
|
|
|
if (frame > symx2) {
|
|
frame = symx2;
|
|
}
|
|
|
|
if (nuContRmbCheck(0) == 0) {
|
|
nuContRmbModeSet(0, 2);
|
|
nuContRmbStart(0, freq, frame);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_80028F8C(void) {
|
|
s32* sym = &D_80074264;
|
|
u16* sym2;
|
|
|
|
if (*sym != GAME_STATUS->currentButtons) {
|
|
*sym = GAME_STATUS->currentButtons;
|
|
func_80028FE0();
|
|
}
|
|
|
|
sym2 = &D_80074260;
|
|
if (*sym2 != 0) {
|
|
(*sym2)--;
|
|
}
|
|
}
|
|
|
|
void func_80028FE0(void) {
|
|
D_80074260 = 300;
|
|
}
|
|
|
|
f32 length2D(f32 x, f32 y) {
|
|
return sqrtf(SQ(x) + SQ(y));
|
|
}
|
|
|
|
HeapNode* _heap_create(s32* addr, u32 size) {
|
|
if (size < 32) {
|
|
return (HeapNode*) - 1;
|
|
} else {
|
|
HeapNode* heapNode = ALIGN16((s32)addr);
|
|
|
|
size -= ((s8*)heapNode - (s8*)addr);
|
|
heapNode->next = NULL;
|
|
heapNode->length = size - sizeof(HeapNode);
|
|
heapNode->allocated = 0;
|
|
heapNode->capacity = size;
|
|
return heapNode;
|
|
}
|
|
}
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", _heap_malloc);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", _heap_malloc_tail);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", _heap_free);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", _heap_realloc);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", cosine);
|
|
|
|
s32 sign(s32 val) {
|
|
s32 sign = -1;
|
|
|
|
if (val >= 0) {
|
|
sign = val > 0;
|
|
}
|
|
return sign;
|
|
}
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", int_to_string);
|
|
|
|
// should maybe be called bzero
|
|
void mem_clear(s8* data, s32 numBytes) {
|
|
while (numBytes > 0) {
|
|
*data = 0;
|
|
data++;
|
|
numBytes--;
|
|
}
|
|
}
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", transform_point);
|
|
|
|
void copy_matrix(Matrix4f* src, Matrix4f* dest) {
|
|
bcopy(src, dest, sizeof(Matrix4f));
|
|
}
|
|
|
|
s32 dma_copy(s32 romStart, s32 romEnd, void* vramDest) {
|
|
u32 length = romEnd - romStart;
|
|
s32 i;
|
|
|
|
osInvalICache(vramDest, length);
|
|
|
|
for (i = 0; i + ROM_CHUNK_SIZE < length; i += ROM_CHUNK_SIZE) {
|
|
nuPiReadRom(romStart + i, vramDest + i, ROM_CHUNK_SIZE);
|
|
}
|
|
|
|
if (i != length) {
|
|
nuPiReadRom(romStart + i, vramDest + i, length - i);
|
|
}
|
|
|
|
return length;
|
|
}
|
|
|
|
s32 func_800297D4(s32 romStart, s32 romEnd, void* vramDest) {
|
|
u32 length = romEnd - romStart;
|
|
s32 i;
|
|
|
|
for (i = 0; i + ROM_CHUNK_SIZE < length; i += ROM_CHUNK_SIZE) {
|
|
func_80029860(romStart + i, vramDest + i, ROM_CHUNK_SIZE);
|
|
}
|
|
|
|
if (i != length) {
|
|
func_80029860(romStart + i, vramDest + i, length - i);
|
|
}
|
|
|
|
return length;
|
|
}
|
|
|
|
INCLUDE_ASM(void, "code_42e0_len_1f60", func_80029860, s32 romStart, s32 vramDest, s32 length);
|
|
|
|
s32 _advance_rng(void) {
|
|
s32* rngVal = &gRandSeed;
|
|
|
|
GAME_STATUS->nextRNG = *rngVal = (*rngVal * 0x5D588B65) + 1;
|
|
|
|
return *rngVal;
|
|
}
|
|
|
|
f32 func_80029934(void) {
|
|
s32 temp_v0 = _advance_rng() & 0x7FFF;
|
|
f64 temp_f2 = temp_v0;
|
|
|
|
if (temp_v0 < 0) {
|
|
temp_f2 += 4294967296.0;
|
|
}
|
|
|
|
return temp_f2 * 3.0517578125e-05;
|
|
}
|
|
|
|
s32 func_80029994(s32 arg0) {
|
|
u32 div = -1;
|
|
s32 plusOne = arg0 + 1;
|
|
u32 result;
|
|
|
|
div /= plusOne;
|
|
if (div == 0) {
|
|
div = 1;
|
|
}
|
|
|
|
do {
|
|
result = _advance_rng() / div;
|
|
} while (result >= plusOne);
|
|
|
|
return result;
|
|
}
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", rand_int, s32 arg0);
|
|
|
|
f32 signF(f32 val) {
|
|
f32 sign;
|
|
|
|
if (!(val > 0.0f)) {
|
|
sign = -1.0f;
|
|
if (!(val < 0.0f)) {
|
|
sign = 0.0f;
|
|
}
|
|
} else {
|
|
sign = 1.0f;
|
|
}
|
|
|
|
return sign;
|
|
}
|
|
|
|
s32 round(f32 arg0) {
|
|
if (!(arg0 >= 0.0f)) {
|
|
return -(s32)(0.5 - arg0);
|
|
} else {
|
|
return (s32)(0.5 + arg0);
|
|
}
|
|
}
|
|
|
|
INCLUDE_ASM(f32, "code_42e0_len_1f60", clamp_angle, f32 theta);
|
|
|
|
f32 get_clamped_angle_diff(f32 a, f32 b) {
|
|
if (fabsf(b - a) >= 180.0f) {
|
|
if (b < a) {
|
|
b += 360.0f;
|
|
} else {
|
|
b -= 360.0f;
|
|
}
|
|
}
|
|
return b - a;
|
|
}
|
|
|
|
INCLUDE_ASM(f32, "code_42e0_len_1f60", atan2, f32 startX, f32 startZ, f32 endX, f32 endZ);
|
|
|
|
f32 get_player_normal_yaw(void) {
|
|
return atan2(0, 0, GAME_STATUS->playerTraceNormal.x, GAME_STATUS->playerTraceNormal.z);
|
|
}
|
|
|
|
f32 get_player_normal_pitch(void) {
|
|
f32 traceNormalX = GAME_STATUS->playerTraceNormal.x;
|
|
f32 traceNormalZ = GAME_STATUS->playerTraceNormal.z;
|
|
f32 sqrt = sqrtf(SQ(traceNormalX) + SQ(traceNormalZ));
|
|
|
|
return atan2(0.0f, 0.0f, sqrt, -GAME_STATUS->playerTraceNormal.y);
|
|
}
|
|
|
|
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by) {
|
|
f32 xDiff = bx - ax;
|
|
f32 yDiff = by - ay;
|
|
|
|
return sqrtf(SQ(xDiff) + SQ(yDiff));
|
|
}
|
|
|
|
f32 dist3D(f32 ax, f32 ay, f32 az, f32 bx, f32 by, f32 bz) {
|
|
f32 xDiff = bx - ax;
|
|
f32 yDiff = by - ay;
|
|
f32 zDiff = bz - az;
|
|
|
|
return sqrtf(SQ(xDiff) + SQ(yDiff) + SQ(zDiff));
|
|
}
|
|
|
|
void add_vec2D_polar(f32* x, f32* y, f32 r, f32 theta) {
|
|
f32 sinTheta;
|
|
f32 cosTheta;
|
|
|
|
sin_cos_rad((theta * 6.28318f) / 360.0f, &sinTheta, &cosTheta);
|
|
*x += r * sinTheta;
|
|
*y -= r * cosTheta;
|
|
}
|
|
|
|
u16 _wrap_trig_lookup_value(f32 theta) {
|
|
f32 ret = theta;
|
|
|
|
if (theta >= 1048576.0f || theta <= -1048576.0f) {
|
|
ret = theta * 0.0000009536743f;
|
|
ret = theta - ((s32) ret) * 1048576.0f;
|
|
}
|
|
|
|
return (s32) ret;
|
|
}
|
|
|
|
void sin_cos_rad(f32 rad, f32* outSinTheta, f32* outCosTheta) {
|
|
u16 theta = _wrap_trig_lookup_value(rad * 10430.378f);
|
|
|
|
*outSinTheta = sins(theta) * 3.051851e-05;
|
|
*outCosTheta = coss(theta) * 3.051851e-05;
|
|
}
|
|
|
|
f32 sin_rad(f32 angle) {
|
|
return sins(_wrap_trig_lookup_value(angle * 10430.378f)) * 3.051851e-05;
|
|
}
|
|
|
|
f32 cos_rad(f32 angle) {
|
|
return coss(_wrap_trig_lookup_value(angle * 10430.378f)) * 3.051851e-05;
|
|
}
|
|
|
|
void sin_cos_deg(f32 rad, f32* outSinTheta, f32* outCosTheta) {
|
|
u16 theta = _wrap_trig_lookup_value(rad * 182.04445f);
|
|
|
|
*outSinTheta = sins(theta) * 3.051851e-05;
|
|
*outCosTheta = coss(theta) * 3.051851e-05;
|
|
}
|
|
|
|
f32 sin_deg(f32 angle) {
|
|
return sins(_wrap_trig_lookup_value(angle * 182.04445f)) * 3.051851e-05;
|
|
}
|
|
|
|
f32 cos_deg(f32 angle) {
|
|
return coss(_wrap_trig_lookup_value(angle * 182.04445f)) * 3.051851e-05;
|
|
}
|
|
|
|
INCLUDE_ASM(f32, "code_42e0_len_1f60", update_lerp, Easing easing, f32 start, f32 end, s32 elapsed, s32 duration);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", func_8002A904);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", func_8002AAC4);
|
|
|
|
INCLUDE_ASM(s32, "code_42e0_len_1f60", func_8002AB5C);
|