Decompile func0f08e2ac and decodeXorAaaaaaaa

This commit is contained in:
Ryan Dwyer
2020-01-23 18:11:42 +10:00
parent 29ecc8321c
commit 6264578e4b
9 changed files with 90 additions and 114 deletions
+2
View File
@@ -19,6 +19,8 @@ SECTIONS
_antipiracyUncloakWriteAddress = 0x7002a324;
osCicId = 0x80000310;
__rompos = 0;
.boot 0x70001000 : AT(__rompos) {
src/boot/boot.o (.text);
+13 -13
View File
@@ -3450,15 +3450,15 @@ bool aiIfDoorState(void)
if (obj && obj->prop && obj->type == OBJTYPE_DOOR) {
struct doorobj *door = (struct doorobj *) obj;
if (door->state == 0) {
if (door->speed <= 0) {
if (door->mode == 0) {
if (door->frac <= 0) {
pass = (cmd[3] & DOORSTATEBIT_CLOSED) != 0;
} else {
pass = (cmd[3] & DOORSTATEBIT_OPEN) != 0;
}
} else if (door->state == 1 || door->state == 3) {
} else if (door->mode == 1 || door->mode == 3) {
pass = (cmd[3] & DOORSTATEBIT_OPENING) != 0;
} else if (door->state == 2) {
} else if (door->mode == 2) {
pass = (cmd[3] & DOORSTATEBIT_CLOSING) != 0;
}
}
@@ -3500,7 +3500,7 @@ bool aiLockDoor(void)
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
struct doorobj *door = (struct doorobj *) obj;
u8 bits = cmd[3];
door->lockbits = door->lockbits | bits;
door->keyflags = door->keyflags | bits;
}
g_Vars.aioffset += 4;
@@ -3519,7 +3519,7 @@ bool aiUnlockDoor(void)
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
struct doorobj *door = (struct doorobj *) obj;
u8 bits = cmd[3];
door->lockbits = door->lockbits & ~bits;
door->keyflags = door->keyflags & ~bits;
}
g_Vars.aioffset += 4;
@@ -3539,9 +3539,9 @@ bool aiIfDoorLocked(void)
if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) {
struct doorobj *door = (struct doorobj *) obj;
u32 bits = cmd[3];
u32 lockbits = door->lockbits;
u32 keyflags = door->keyflags;
if ((lockbits & bits) == bits) {
if ((keyflags & bits) == bits) {
pass = true;
}
}
@@ -7478,17 +7478,17 @@ bool ai00e5(void)
/**
* @cmd 00e8
*/
bool aiSetDoorClosed(void)
bool aiSetDoorOpen(void)
{
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
struct defaultobj *obj = objFindByTagId(cmd[2]);
if (obj && obj->prop) {
struct doorobj *door = (struct doorobj *) obj;
door->speed = door->unk5c;
door->unk80 = 0;
door->unkc0 = g_Vars.lvframe60;
door->state = 0;
door->frac = door->maxfrac;
door->fracspeed = 0;
door->lastopen60 = g_Vars.lvframe60;
door->mode = 0;
func0f08c54c(door);
func0f08d4e8(door);
func0f0926bc(door->base.prop, 1, 0xffff);
+42 -78
View File
@@ -46294,13 +46294,10 @@ glabel func0f08e1a0
/* f08e210: 00000000 */ sll $zero,$zero,0x0
);
GLOBAL_ASM(
glabel func0f08e214
/* f08e214: 3c01aaaa */ lui $at,0xaaaa
/* f08e218: 3421aaaa */ ori $at,$at,0xaaaa
/* f08e21c: 03e00008 */ jr $ra
/* f08e220: 00811026 */ xor $v0,$a0,$at
);
u32 decodeXorAaaaaaaa(u32 value)
{
return value ^ 0xaaaaaaaa;
}
GLOBAL_ASM(
glabel func0f08e224
@@ -46342,77 +46339,44 @@ glabel func0f08e224
/* f08e2a8: 00000000 */ sll $zero,$zero,0x0
);
GLOBAL_ASM(
glabel func0f08e2ac
/* f08e2ac: 27bdffe0 */ addiu $sp,$sp,-32
/* f08e2b0: afbf0014 */ sw $ra,0x14($sp)
/* f08e2b4: 00803025 */ or $a2,$a0,$zero
/* f08e2b8: 24030001 */ addiu $v1,$zero,0x1
/* f08e2bc: 8cc50014 */ lw $a1,0x14($a2)
/* f08e2c0: 808400c6 */ lb $a0,0xc6($a0)
/* f08e2c4: afa60020 */ sw $a2,0x20($sp)
/* f08e2c8: 0fc237c4 */ jal func0f08df10
/* f08e2cc: afa3001c */ sw $v1,0x1c($sp)
/* f08e2d0: 8fa60020 */ lw $a2,0x20($sp)
/* f08e2d4: 8fa3001c */ lw $v1,0x1c($sp)
/* f08e2d8: 10c00012 */ beqz $a2,.L0f08e324
/* f08e2dc: 00c01025 */ or $v0,$a2,$zero
/* f08e2e0: 44800000 */ mtc1 $zero,$f0
/* f08e2e4: 00000000 */ sll $zero,$zero,0x0
/* f08e2e8: c444007c */ lwc1 $f4,0x7c($v0)
.L0f08e2ec:
/* f08e2ec: 4604003c */ c.lt.s $f0,$f4
/* f08e2f0: 00000000 */ sll $zero,$zero,0x0
/* f08e2f4: 45020007 */ bc1fl .L0f08e314
/* f08e2f8: 8c4200bc */ lw $v0,0xbc($v0)
/* f08e2fc: 84ce00c4 */ lh $t6,0xc4($a2)
/* f08e300: 844f00c4 */ lh $t7,0xc4($v0)
/* f08e304: 55cf0003 */ bnel $t6,$t7,.L0f08e314
/* f08e308: 8c4200bc */ lw $v0,0xbc($v0)
/* f08e30c: 00001825 */ or $v1,$zero,$zero
/* f08e310: 8c4200bc */ lw $v0,0xbc($v0)
.L0f08e314:
/* f08e314: 10460003 */ beq $v0,$a2,.L0f08e324
/* f08e318: 00000000 */ sll $zero,$zero,0x0
/* f08e31c: 5440fff3 */ bnezl $v0,.L0f08e2ec
/* f08e320: c444007c */ lwc1 $f4,0x7c($v0)
.L0f08e324:
/* f08e324: 10600004 */ beqz $v1,.L0f08e338
/* f08e328: 00c02025 */ or $a0,$a2,$zero
/* f08e32c: 0fc23545 */ jal func0f08d514
/* f08e330: afa60020 */ sw $a2,0x20($sp)
/* f08e334: 8fa60020 */ lw $a2,0x20($sp)
.L0f08e338:
/* f08e338: 94d80072 */ lhu $t8,0x72($a2)
/* f08e33c: 2401000b */ addiu $at,$zero,0xb
/* f08e340: 3c04aaaa */ lui $a0,0xaaaa
/* f08e344: 17010006 */ bne $t8,$at,.L0f08e360
/* f08e348: 00000000 */ sll $zero,$zero,0x0
/* f08e34c: 80d900c7 */ lb $t9,0xc7($a2)
/* f08e350: 240800ff */ addiu $t0,$zero,0xff
/* f08e354: 17200002 */ bnez $t9,.L0f08e360
/* f08e358: 00000000 */ sll $zero,$zero,0x0
/* f08e35c: a0c800cc */ sb $t0,0xcc($a2)
.L0f08e360:
/* f08e360: 0fc23885 */ jal func0f08e214
/* f08e364: 3484bd73 */ ori $a0,$a0,0xbd73
/* f08e368: 3c098000 */ lui $t1,0x8000
/* f08e36c: 8d290310 */ lw $t1,0x310($t1)
/* f08e370: 3c0b03e0 */ lui $t3,0x3e0
/* f08e374: 240a1025 */ addiu $t2,$zero,0x1025
/* f08e378: 10490006 */ beq $v0,$t1,.L0f08e394
/* f08e37c: 356b0008 */ ori $t3,$t3,0x8
/* f08e380: 3c027f09 */ lui $v0,0x7f09
/* f08e384: 2442f968 */ addiu $v0,$v0,-1688
/* f08e388: ac4a0000 */ sw $t2,0x0($v0)
/* f08e38c: ac4b0004 */ sw $t3,0x4($v0)
/* f08e390: ac400008 */ sw $zero,0x8($v0)
.L0f08e394:
/* f08e394: 8fbf0014 */ lw $ra,0x14($sp)
/* f08e398: 27bd0020 */ addiu $sp,$sp,0x20
/* f08e39c: 03e00008 */ jr $ra
/* f08e3a0: 00000000 */ sll $zero,$zero,0x0
);
void func0f08e2ac(struct doorobj *door)
{
bool pass = true;
struct doorobj *loopdoor;
func0f08df10(door->soundtype, door->base.prop);
loopdoor = door;
while (loopdoor) {
if (loopdoor->frac > 0 && loopdoor->portal == door->portal) {
pass = false;
}
loopdoor = loopdoor->sibling;
if (loopdoor == door) {
break;
}
}
if (pass) {
func0f08d514(door);
}
if (door->doortype == DOORTYPE_LASER && door->fadetime60 == 0) {
door->laserfade = 255;
}
#if PIRACYCHECKS
if (osCicId != decodeXorAaaaaaaa(0xaaaabd73)) {
u32 *ptr = (u32 *)func0f08f968;
ptr[0] = 0x00001025;
ptr[1] = 0x03e00008;
ptr[2] = 0x00000000;
}
#endif
}
GLOBAL_ASM(
glabel func0f08e3a4
+2
View File
@@ -351,6 +351,8 @@
#define DOORSTATEBIT_CLOSING 4
#define DOORSTATEBIT_OPENING 8
#define DOORTYPE_LASER 11
#define DRCAROLLIMAGE_DEAD 4
#define ENTITYTYPE_CHR 0x0004
+1 -1
View File
@@ -232,7 +232,7 @@
/*0x00e3*/ bool ai00e3(void);
/*0x00e4*/ bool ai00e4(void);
/*0x00e5*/ bool ai00e5(void);
/*0x00e8*/ bool aiSetDoorClosed(void);
/*0x00e8*/ bool aiSetDoorOpen(void);
/*0x00e9*/ bool ai00e9(void);
/*0x00ea*/ bool aiIfNumPlayersLessThan(void);
/*0x00eb*/ bool aiIfChrAmmoQuantityLessThan(void);
+4 -4
View File
@@ -295,17 +295,17 @@ u32 func0f08cb20(void);
u32 func0f08d3dc(void);
u32 func0f08d460(void);
u32 func0f08d4e8(struct doorobj *door);
u32 func0f08d514(void);
void func0f08d514(struct doorobj *door);
u32 func0f08d540(void);
u32 func0f08d784(void);
u32 func0f08daa8(void);
u32 func0f08dd44(void);
u32 func0f08df10(void);
void func0f08df10(s8 soundtype, struct prop *prop);
u32 func0f08e0c4(void);
u32 func0f08e1a0(void);
u32 func0f08e214(void);
u32 decodeXorAaaaaaaa(u32 value);
u32 func0f08e224(void);
u32 func0f08e2ac(void);
void func0f08e2ac(struct doorobj *door);
u32 func0f08e3a4(void);
u32 doorActivate(struct defaultobj *obj, u32 arg1);
u32 func0f08e520(void);
+24 -17
View File
@@ -681,21 +681,23 @@ struct defaultobj {
struct doorobj { // objtype 0x01
struct defaultobj base;
/*0x5c*/ f32 unk5c;
/*0x60*/ u32 unk60;
/*0x64*/ u32 unk64;
/*0x68*/ u32 unk68;
/*0x6c*/ u32 unk6c;
/*0x70*/ u32 unk70;
/*0x74*/ u32 lockbits;
/*0x78*/ u32 unk78;
/*0x7c*/ f32 speed;
/*0x80*/ f32 unk80;
/*0x84*/ s8 state;
/*0x88*/ u32 unk88;
/*0x8c*/ u32 unk8c;
/*0x90*/ u32 unk90;
/*0x94*/ u32 unk94;
/*0x5c*/ f32 maxfrac;
/*0x60*/ u32 perimfrac;
/*0x64*/ u32 accel;
/*0x68*/ u32 decel;
/*0x6c*/ u32 maxspeed;
/*0x70*/ u16 doorflags;
/*0x72*/ u16 doortype;
/*0x74*/ u32 keyflags;
/*0x78*/ u32 autoclosetime;
/*0x7c*/ f32 frac;
/*0x80*/ f32 fracspeed;
/*0x84*/ s8 mode;
/*0x85*/ u8 glasshits;
/*0x86*/ u16 fadealpha;
/*0x88*/ u16 xludist;
/*0x8a*/ u16 opadist;
/*0x8c*/ struct coord startpos;
/*0x98*/ u32 unk98;
/*0x9c*/ u32 unk9c;
/*0xa0*/ u32 unka0;
@@ -705,8 +707,13 @@ struct doorobj { // objtype 0x01
/*0xb0*/ u32 unkb0;
/*0xb4*/ u32 unkb4;
/*0xb8*/ u32 unkb8;
/*0xbc*/ u32 unkbc;
/*0xc0*/ u32 unkc0;
/*0xbc*/ struct doorobj *sibling;
/*0xc0*/ u32 lastopen60;
/*0xc4*/ s16 portal;
/*0xc6*/ s8 soundtype;
/*0xc7*/ s8 fadetime60;
/*0xc8*/ s32 lastcalc60;
/*0xcc*/ u8 laserfade;
};
struct image {
+1
View File
@@ -12,6 +12,7 @@
extern u32 osTvType;
extern u32 osRomBase;
extern u32 osResetType;
extern u32 osCicId;
extern u8 osAppNmiBuffer[64];
#endif /* _LIBULTRA_H */
+1 -1
View File
@@ -14366,7 +14366,7 @@ bool (*g_CommandPointers[])(void) = {
/*0x00e5*/ ai00e5,
/*0x00e6*/ NULL,
/*0x00e7*/ NULL,
/*0x00e8*/ aiSetDoorClosed,
/*0x00e8*/ aiSetDoorOpen,
/*0x00e9*/ ai00e9,
/*0x00ea*/ aiIfNumPlayersLessThan,
/*0x00eb*/ aiIfChrAmmoQuantityLessThan,