Files
perfect_dark/src/lib/lib_17ce0.c
T
2022-06-04 12:47:56 +10:00

322 lines
8.9 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "game/atan2f.h"
#include "game/padhalllv.h"
#include "bss.h"
#include "lib/mtx.h"
#include "data.h"
#include "types.h"
u8 var8005ef20 = 254;
u8 var8009a4e0[456][2];
GLOBAL_ASM(
glabel func00017ce0
/* 17ce0: 3c03800a */ lui $v1,%hi(g_BgPortals)
/* 17ce4: 8c634cc8 */ lw $v1,%lo(g_BgPortals)($v1)
/* 17ce8: 000470c0 */ sll $t6,$a0,0x3
/* 17cec: 3c013f80 */ lui $at,0x3f80
/* 17cf0: 006e7821 */ addu $t7,$v1,$t6
/* 17cf4: 95f80000 */ lhu $t8,0x0($t7)
/* 17cf8: 44815000 */ mtc1 $at,$f10
/* 17cfc: 3c014f80 */ lui $at,0x4f80
/* 17d00: 03031021 */ addu $v0,$t8,$v1
/* 17d04: c4440004 */ lwc1 $f4,0x4($v0)
/* 17d08: 2443000c */ addiu $v1,$v0,0xc
/* 17d0c: 24070001 */ addiu $a3,$zero,0x1
/* 17d10: e4a40000 */ swc1 $f4,0x0($a1)
/* 17d14: c4460008 */ lwc1 $f6,0x8($v0)
/* 17d18: e4a60004 */ swc1 $f6,0x4($a1)
/* 17d1c: c448000c */ lwc1 $f8,0xc($v0)
/* 17d20: e4a80008 */ swc1 $f8,0x8($a1)
/* 17d24: 90460000 */ lbu $a2,0x0($v0)
/* 17d28: 44868000 */ mtc1 $a2,$f16
/* 17d2c: 04c10004 */ bgez $a2,.L00017d40
/* 17d30: 468084a0 */ cvt.s.w $f18,$f16
/* 17d34: 44812000 */ mtc1 $at,$f4
/* 17d38: 00000000 */ nop
/* 17d3c: 46049480 */ add.s $f18,$f18,$f4
.L00017d40:
/* 17d40: 28c10002 */ slti $at,$a2,0x2
/* 17d44: 14200013 */ bnez $at,.L00017d94
/* 17d48: 46125003 */ div.s $f0,$f10,$f18
/* 17d4c: c4a60000 */ lwc1 $f6,0x0($a1)
.L00017d50:
/* 17d50: c4680004 */ lwc1 $f8,0x4($v1)
/* 17d54: c4a40004 */ lwc1 $f4,0x4($a1)
/* 17d58: 24e70001 */ addiu $a3,$a3,0x1
/* 17d5c: 46083400 */ add.s $f16,$f6,$f8
/* 17d60: c4a60008 */ lwc1 $f6,0x8($a1)
/* 17d64: 2463000c */ addiu $v1,$v1,12
/* 17d68: e4b00000 */ swc1 $f16,0x0($a1)
/* 17d6c: c46afffc */ lwc1 $f10,-0x4($v1)
/* 17d70: 460a2480 */ add.s $f18,$f4,$f10
/* 17d74: e4b20004 */ swc1 $f18,0x4($a1)
/* 17d78: c4680000 */ lwc1 $f8,0x0($v1)
/* 17d7c: 46083400 */ add.s $f16,$f6,$f8
/* 17d80: e4b00008 */ swc1 $f16,0x8($a1)
/* 17d84: 90590000 */ lbu $t9,0x0($v0)
/* 17d88: 00f9082a */ slt $at,$a3,$t9
/* 17d8c: 5420fff0 */ bnezl $at,.L00017d50
/* 17d90: c4a60000 */ lwc1 $f6,0x0($a1)
.L00017d94:
/* 17d94: c4a40000 */ lwc1 $f4,0x0($a1)
/* 17d98: c4b20004 */ lwc1 $f18,0x4($a1)
/* 17d9c: c4a80008 */ lwc1 $f8,0x8($a1)
/* 17da0: 46002282 */ mul.s $f10,$f4,$f0
/* 17da4: 00000000 */ nop
/* 17da8: 46009182 */ mul.s $f6,$f18,$f0
/* 17dac: 00000000 */ nop
/* 17db0: 46004402 */ mul.s $f16,$f8,$f0
/* 17db4: e4aa0000 */ swc1 $f10,0x0($a1)
/* 17db8: e4a60004 */ swc1 $f6,0x4($a1)
/* 17dbc: 03e00008 */ jr $ra
/* 17dc0: e4b00008 */ swc1 $f16,0x8($a1)
);
#if VERSION < VERSION_NTSC_1_0
GLOBAL_ASM(
glabel func00018e34nb
/* 18e34: 3c0e800b */ lui $t6,0x800b
/* 18e38: 8dce9448 */ lw $t6,-0x6bb8($t6)
/* 18e3c: 000478c0 */ sll $t7,$a0,0x3
/* 18e40: 01cfc021 */ addu $t8,$t6,$t7
/* 18e44: 93020006 */ lbu $v0,0x6($t8)
/* 18e48: 30590002 */ andi $t9,$v0,0x2
/* 18e4c: 03e00008 */ jr $ra
/* 18e50: 03201025 */ or $v0,$t9,$zero
/* 18e54: 3c0e800b */ lui $t6,0x800b
/* 18e58: 8dce9448 */ lw $t6,-0x6bb8($t6)
/* 18e5c: 000478c0 */ sll $t7,$a0,0x3
/* 18e60: 01cf1021 */ addu $v0,$t6,$t7
/* 18e64: 90580006 */ lbu $t8,0x6($v0)
/* 18e68: 37190002 */ ori $t9,$t8,0x2
/* 18e6c: 03e00008 */ jr $ra
/* 18e70: a0590006 */ sb $t9,0x6($v0)
/* 18e74: 3c0e800b */ lui $t6,0x800b
/* 18e78: 8dce9448 */ lw $t6,-0x6bb8($t6)
/* 18e7c: 000478c0 */ sll $t7,$a0,0x3
/* 18e80: 01cf1021 */ addu $v0,$t6,$t7
/* 18e84: 90580006 */ lbu $t8,0x6($v0)
/* 18e88: 331900fd */ andi $t9,$t8,0xfd
/* 18e8c: 03e00008 */ jr $ra
/* 18e90: a0590006 */ sb $t9,0x6($v0)
);
#endif
GLOBAL_ASM(
glabel func00017dc4
/* 17dc4: afa50004 */ sw $a1,0x4($sp)
/* 17dc8: 848f0000 */ lh $t7,0x0($a0)
/* 17dcc: 00053400 */ sll $a2,$a1,0x10
/* 17dd0: 00067403 */ sra $t6,$a2,0x10
/* 17dd4: 2407ffff */ addiu $a3,$zero,-1
/* 17dd8: 01c03025 */ or $a2,$t6,$zero
/* 17ddc: 10ef000c */ beq $a3,$t7,.L00017e10
/* 17de0: 00001025 */ or $v0,$zero,$zero
/* 17de4: 0000c040 */ sll $t8,$zero,0x1
/* 17de8: 00981821 */ addu $v1,$a0,$t8
/* 17dec: 84650000 */ lh $a1,0x0($v1)
.L00017df0:
/* 17df0: 10c5000d */ beq $a2,$a1,.L00017e28
/* 17df4: 24420001 */ addiu $v0,$v0,0x1
/* 17df8: 28410010 */ slti $at,$v0,0x10
/* 17dfc: 10200004 */ beqz $at,.L00017e10
/* 17e00: 24630002 */ addiu $v1,$v1,0x2
/* 17e04: 84650000 */ lh $a1,0x0($v1)
/* 17e08: 14e5fff9 */ bne $a3,$a1,.L00017df0
/* 17e0c: 00000000 */ nop
.L00017e10:
/* 17e10: 2841000f */ slti $at,$v0,0xf
/* 17e14: 10200004 */ beqz $at,.L00017e28
/* 17e18: 0002c840 */ sll $t9,$v0,0x1
/* 17e1c: 00991821 */ addu $v1,$a0,$t9
/* 17e20: a4660000 */ sh $a2,0x0($v1)
/* 17e24: a4670002 */ sh $a3,0x2($v1)
.L00017e28:
/* 17e28: 03e00008 */ jr $ra
/* 17e2c: 00000000 */ nop
);
s32 portal00017e30(s32 portalnum, struct coord *arg1, struct coord *arg2)
{
s32 i;
struct coord sp60;
struct portalvertices *pvertices;
struct coord *curr;
struct coord *next;
struct coord sp48;
u8 lastside;
f32 sp40[1];
struct coord sp34;
f32 value1;
f32 value2;
f32 tmp;
u32 stack;
lastside = 0;
pvertices = (struct portalvertices *)((u32)g_BgPortals + g_BgPortals[portalnum].verticesoffset);
value1 = arg1->f[0] * (var800a4ccc + portalnum)->coord.f[0] + arg1->f[1] * (var800a4ccc + portalnum)->coord.f[1] + arg1->f[2] * (var800a4ccc + portalnum)->coord.f[2];
value2 = arg2->f[0] * (var800a4ccc + portalnum)->coord.f[0] + arg2->f[1] * (var800a4ccc + portalnum)->coord.f[1] + arg2->f[2] * (var800a4ccc + portalnum)->coord.f[2];
if (value1 < (var800a4ccc + portalnum)->unk0c) {
if (value2 < (var800a4ccc + portalnum)->unk0c) {
return 0;
}
} else if ((var800a4ccc + portalnum)->unk10 < value1 && (var800a4ccc + portalnum)->unk10 < value2) {
return 0;
}
sp60.f[0] = arg2->f[0] - arg1->f[0];
sp60.f[1] = arg2->f[1] - arg1->f[1];
sp60.f[2] = arg2->f[2] - arg1->f[2];
var8007fcb4 = (value1 + value2) * 0.5f - (var800a4ccc + portalnum)->unk0c;
curr = &pvertices->vertices[0];
next = &pvertices->vertices[1];
for (i = 0; i < pvertices->count; i++) {
if (i + 1 == pvertices->count) {
next = &pvertices->vertices[0];
}
sp48.f[0] = next->f[0] - curr->f[0];
sp48.f[1] = next->f[1] - curr->f[1];
sp48.f[2] = next->f[2] - curr->f[2];
sp34.f[0] = sp48.f[1] * sp60.f[2] - sp48.f[2] * sp60.f[1];
sp34.f[1] = sp48.f[2] * sp60.f[0] - sp48.f[0] * sp60.f[2];
sp34.f[2] = sp48.f[0] * sp60.f[1] - sp48.f[1] * sp60.f[0];
tmp = sp34.f[0] * sp34.f[0] + sp34.f[1] * sp34.f[1] + sp34.f[2] * sp34.f[2];
if (tmp == 0.0f) {
return 0;
}
sp40[0] = sp34.f[0] * curr->f[0] + sp34.f[1] * curr->f[1] + sp34.f[2] * curr->f[2];
tmp = sp34.f[0] * arg1->f[0] + sp34.f[1] * arg1->f[1] + sp34.f[2] * arg1->f[2];
if (tmp < sp40[0]) {
if (lastside == 2) {
return 0;
}
lastside = 1;
} else {
if (lastside == 1) {
return 0;
}
lastside = 2;
}
curr++;
next++;
}
return (value1 < (var800a4ccc + portalnum)->unk0c) ? 1 : 2;
}
void portal00018148(struct coord *pos1, struct coord *pos2, s16 *rooms1, s16 *rooms2, s16 *rooms3, s32 arg5)
{
s32 i;
s32 j;
s32 roomnum;
s32 numportals;
s16 *portalnums;
s16 rooms9c[16];
s16 rooms7c[16];
s16 rooms5c[16];
for (i = 0; i < 8; i++) {
rooms9c[i] = rooms1[i];
rooms5c[i] = rooms1[i];
if (rooms1[i] == -1) {
break;
}
}
var8005ef20++;
if (var8005ef20 == 255) {
for (i = 0; i < g_NumPortalThings; i++) {
var8009a4e0[i][0] = 0xff;
}
var8005ef20 = 0;
}
do {
rooms7c[0] = -1;
for (j = 0; (roomnum = rooms9c[j]) != -1 && j < 16; j++) {
numportals = g_Rooms[roomnum].numportals;
portalnums = &g_RoomPortals[g_Rooms[roomnum].roomportallistoffset];
for (i = 0; i < numportals; i++) {
s32 portalnum = *portalnums;
u8 *s1 = var8009a4e0[portalnum];
if (s1[0] != var8005ef20) {
s1[0] = var8005ef20;
s1[1] = portal00017e30(portalnum, pos1, pos2);
}
if (s1[1] != 0) {
if (s1[1] == 1) {
if (roomnum == g_BgPortals[portalnum].roomnum1) {
func00017dc4(rooms7c, g_BgPortals[portalnum].roomnum2);
func00017dc4(rooms5c, g_BgPortals[portalnum].roomnum2);
s1[1] = 0;
}
}
if (s1[1] == 2) {
if (roomnum == g_BgPortals[portalnum].roomnum2) {
func00017dc4(rooms7c, g_BgPortals[portalnum].roomnum1);
func00017dc4(rooms5c, g_BgPortals[portalnum].roomnum1);
s1[1] = 0;
}
}
}
portalnums++;
}
}
if (rooms7c[0] == -1) {
break;
}
for (i = 0; i < 16; i++) {
rooms9c[i] = rooms7c[i];
if (rooms7c[i] == -1) {
break;
}
}
} while (rooms7c[0] != -1);
for (i = 0; i < 7 && rooms9c[i] != -1; i++) {
rooms2[i] = rooms9c[i];
}
rooms2[i] = -1;
if (rooms3 != NULL) {
for (i = 0; i < arg5; i++) {
rooms3[i] = rooms5c[i];
if (rooms5c[i] == -1) {
break;
}
}
rooms3[i] = -1;
}
}