diff --git a/asm/non_matchings/code/z_collision_check/func_8005DD5C.s b/asm/non_matchings/code/z_collision_check/func_8005DD5C.s index bf75dee3cf..ea71ff2eda 100644 --- a/asm/non_matchings/code/z_collision_check/func_8005DD5C.s +++ b/asm/non_matchings/code/z_collision_check/func_8005DD5C.s @@ -17,11 +17,6 @@ glabel D_8013ABDC # EUC-JP: インデックスがオーバして追加不能 | Index exceeded and cannot be added .balign 4 -glabel D_8013AC18 - .asciz "CollisionCheck_setOCLine():インデックスがオーバして追加不能\n" - # EUC-JP: インデックスがオーバして追加不能 | Index exceeded and cannot be added - .balign 4 - .text glabel func_8005DD5C /* AD4EFC 8005DD5C 27BDFFE0 */ addiu $sp, $sp, -0x20 @@ -112,44 +107,3 @@ glabel func_8005DD5C /* AD5030 8005DE90 8FB10018 */ lw $s1, 0x18($sp) /* AD5034 8005DE94 03E00008 */ jr $ra /* AD5038 8005DE98 27BD0020 */ addiu $sp, $sp, 0x20 - -/* AD503C 8005DE9C 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* AD5040 8005DEA0 AFBF0014 */ sw $ra, 0x14($sp) -/* AD5044 8005DEA4 AFA40018 */ sw $a0, 0x18($sp) -/* AD5048 8005DEA8 AFA60020 */ sw $a2, 0x20($sp) -/* AD504C 8005DEAC 0C03034A */ jal func_800C0D28 -/* AD5050 8005DEB0 AFA5001C */ sw $a1, 0x1c($sp) -/* AD5054 8005DEB4 24010001 */ li $at, 1 -/* AD5058 8005DEB8 14410003 */ bne $v0, $at, .L8005DEC8 -/* AD505C 8005DEBC 8FA7001C */ lw $a3, 0x1c($sp) -/* AD5060 8005DEC0 10000016 */ b .L8005DF1C -/* AD5064 8005DEC4 2402FFFF */ li $v0, -1 -.L8005DEC8: -/* AD5068 8005DEC8 8FA40018 */ lw $a0, 0x18($sp) -/* AD506C 8005DECC 8FA50020 */ lw $a1, 0x20($sp) -/* AD5070 8005DED0 0C0174E9 */ jal func_8005D3A4 -/* AD5074 8005DED4 AFA7001C */ sw $a3, 0x1c($sp) -/* AD5078 8005DED8 8FA7001C */ lw $a3, 0x1c($sp) -/* AD507C 8005DEDC 3C048014 */ lui $a0, %hi(D_8013AC18) # $a0, 0x8014 -/* AD5080 8005DEE0 8FAE0020 */ lw $t6, 0x20($sp) -/* AD5084 8005DEE4 8CE3028C */ lw $v1, 0x28c($a3) -/* AD5088 8005DEE8 28610003 */ slti $at, $v1, 3 -/* AD508C 8005DEEC 14200005 */ bnez $at, .L8005DF04 -/* AD5090 8005DEF0 00037880 */ sll $t7, $v1, 2 -/* AD5094 8005DEF4 0C00084C */ jal osSyncPrintf -/* AD5098 8005DEF8 2484AC18 */ addiu $a0, %lo(D_8013AC18) # addiu $a0, $a0, -0x53e8 -/* AD509C 8005DEFC 10000007 */ b .L8005DF1C -/* AD50A0 8005DF00 2402FFFF */ li $v0, -1 -.L8005DF04: -/* AD50A4 8005DF04 00EFC021 */ addu $t8, $a3, $t7 -/* AD50A8 8005DF08 AF0E0290 */ sw $t6, 0x290($t8) -/* AD50AC 8005DF0C 8CF9028C */ lw $t9, 0x28c($a3) -/* AD50B0 8005DF10 00601025 */ move $v0, $v1 -/* AD50B4 8005DF14 27280001 */ addiu $t0, $t9, 1 -/* AD50B8 8005DF18 ACE8028C */ sw $t0, 0x28c($a3) -.L8005DF1C: -/* AD50BC 8005DF1C 8FBF0014 */ lw $ra, 0x14($sp) -/* AD50C0 8005DF20 27BD0018 */ addiu $sp, $sp, 0x18 -/* AD50C4 8005DF24 03E00008 */ jr $ra -/* AD50C8 8005DF28 00000000 */ nop - diff --git a/include/z64.h b/include/z64.h index 5c17f63e91..47bb6fa5cd 100644 --- a/include/z64.h +++ b/include/z64.h @@ -784,8 +784,8 @@ typedef struct /* 0x0D0 */ Collider* colAc[60]; /* 0x1C0 */ s32 colOcCount; /* 0x1C4 */ Collider* colOc[50]; - /* 0x28C */ s32 unkCount; - /* 0x290 */ Collider* unk290[3]; + /* 0x28C */ s32 colOcLineCount; + /* 0x290 */ Collider* colOcLine[3]; } CollisionCheckContext; // size = 0x29C SubGlobalContext11E60 diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c index b504297b1f..bb2b8cb0c4 100644 --- a/src/code/z_collision_check.c +++ b/src/code/z_collision_check.c @@ -923,7 +923,12 @@ s32 func_8005D1E0(GlobalContext* globalCtx, Collider* collision) #pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/func_8005D334.s") +s32 func_8005D3A4(GlobalContext* globalContext, UNK_PTR line); #pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/func_8005D3A4.s") +//s32 func_8005D3A4(s32 arg0, void* arg1) { +// arg1->unk18 = (u16)(arg1->unk18 & 0xFFFE); +// return 1; +//} void func_8005D40C(GlobalContext* globalCtx, CollisionCheckContext* check); void func_8005D3BC(GlobalContext* globalCtx, CollisionCheckContext* check) { @@ -947,7 +952,7 @@ void func_8005D40C(GlobalContext* globalCtx, CollisionCheckContext* check) { check->colAtCount = 0; check->colAcCount = 0; check->colOcCount = 0; - check->unkCount = 0; + check->colOcLineCount = 0; for (c = check->colAt; c < check->colAt + 50; c++) { *c = NULL; } @@ -960,7 +965,7 @@ void func_8005D40C(GlobalContext* globalCtx, CollisionCheckContext* check) { *c = NULL; } - for (c = check->unk290; c < check->unk290 + 3; c++) { + for (c = check->colOcLine; c < check->colOcLine + 3; c++) { *c = NULL; } } @@ -1026,8 +1031,49 @@ s32 Actor_CollisionCheck_SetAT(GlobalContext* globalCtx, CollisionCheckContext* return index; } +#ifdef NON_MATCHING +//CollisionCheck_setAT_SAC() +s32 func_8005D8AC(GlobalContext* globalCtx, CollisionCheckContext* check, Collider* collider, s32 index) { + s32 result; + if (collider->type >= 4) { + __assert("pcl_obj->data_type <= CL_DATA_LBL_SWRD", "../z_collision_check.c", 3037); + } + //index = (s32)index; + result = index; + if (func_800C0D28(globalCtx) == 1) { + return -1; + } + //index = temp_a3; + (*&D_8011DEF8[collider->type])(globalCtx, collider); + if (collider->actor != NULL) { + if (collider->actor->update == NULL) { + return -1; + } + } + if (check->unk2 & 1) { + if (index >= check->colAtCount) { + osSyncPrintf("CollisionCheck_setAT_SAC():全データ数より大きいところに登録しようとしている。\n"); + //EUC-JP: 全データ数より大きいところに登録しようとしている。 | You are trying to register a location that is larger than the total number of data. + return -1; + } + result = index; + check->colAt[index] = collider; + } + else { + if (check->colAtCount >= 50) { + osSyncPrintf("CollisionCheck_setAT():インデックスがオーバーして追加不能\n"); + return -1; + } + result = check->colAtCount; + check->colAt[check->colAtCount++] = collider; + } + return result; +} + +#else #pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/func_8005D8AC.s") +#endif // DEBUG s32 Actor_CollisionCheck_SetAC(GlobalContext* globalCtx, CollisionCheckContext* check, Collider* collider) { s32 index; @@ -1092,6 +1138,23 @@ s32 Actor_CollisionCheck_SetOT(GlobalContext* globalCtx, CollisionCheckContext* #pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/func_8005DD5C.s") +s32 func_8005DE9C(GlobalContext* globalCtx, CollisionCheckContext* check, UNK_PTR collider) { + s32 index; + + if (func_800C0D28(globalCtx) == 1) { + return -1; + } + func_8005D3A4(globalCtx, collider); + if (check->colOcLineCount >= 3) { + osSyncPrintf("CollisionCheck_setOCLine():インデックスがオーバして追加不能\n"); + return -1; + } + index = check->colOcLineCount; + check->colOcLine[check->colOcLineCount++] = collider; + return index; +} + + s32 func_8005DF2C(ColliderBody* body) { if ((body->toucherFlags & 1) == 0) { return 1;