diff --git a/ld/stage1.ld b/ld/stage1.ld index b512f7424..eec9e0ee2 100644 --- a/ld/stage1.ld +++ b/ld/stage1.ld @@ -19,6 +19,8 @@ SECTIONS _antipiracyUncloakWriteAddress = 0x7002a324; + osCicId = 0x80000310; + __rompos = 0; .boot 0x70001000 : AT(__rompos) { src/boot/boot.o (.text); diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 05dd0b8de..a1c091ba7 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -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); diff --git a/src/game/game_066310.c b/src/game/game_066310.c index 8779adeda..3715abbf5 100644 --- a/src/game/game_066310.c +++ b/src/game/game_066310.c @@ -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 diff --git a/src/include/constants.h b/src/include/constants.h index ba22b7362..2af4ab6b3 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -351,6 +351,8 @@ #define DOORSTATEBIT_CLOSING 4 #define DOORSTATEBIT_OPENING 8 +#define DOORTYPE_LASER 11 + #define DRCAROLLIMAGE_DEAD 4 #define ENTITYTYPE_CHR 0x0004 diff --git a/src/include/game/chr/chraicommands.h b/src/include/game/chr/chraicommands.h index b0b65c884..34f7cd6ae 100644 --- a/src/include/game/chr/chraicommands.h +++ b/src/include/game/chr/chraicommands.h @@ -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); diff --git a/src/include/game/game_066310.h b/src/include/game/game_066310.h index b617b85fa..add7511a1 100644 --- a/src/include/game/game_066310.h +++ b/src/include/game/game_066310.h @@ -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); diff --git a/src/include/types.h b/src/include/types.h index d9c62d30a..877d583f6 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -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 { diff --git a/src/include/ultra64/libultra.h b/src/include/ultra64/libultra.h index 02543925b..e71cb904a 100644 --- a/src/include/ultra64/libultra.h +++ b/src/include/ultra64/libultra.h @@ -12,6 +12,7 @@ extern u32 osTvType; extern u32 osRomBase; extern u32 osResetType; +extern u32 osCicId; extern u8 osAppNmiBuffer[64]; #endif /* _LIBULTRA_H */ diff --git a/src/setup/setup_000000.c b/src/setup/setup_000000.c index feb419afc..bd157f821 100644 --- a/src/setup/setup_000000.c +++ b/src/setup/setup_000000.c @@ -14366,7 +14366,7 @@ bool (*g_CommandPointers[])(void) = { /*0x00e5*/ ai00e5, /*0x00e6*/ NULL, /*0x00e7*/ NULL, - /*0x00e8*/ aiSetDoorClosed, + /*0x00e8*/ aiSetDoorOpen, /*0x00e9*/ ai00e9, /*0x00ea*/ aiIfNumPlayersLessThan, /*0x00eb*/ aiIfChrAmmoQuantityLessThan,