diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index 491de075..5bdd7287 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -17,7 +17,7 @@ core2 - 82.1806% - 82.1806% + 82.2258% + 82.2258% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index edfb6ccc..a1da3625 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 84.7583% - 84.7583% + 84.7842% + 84.7842% \ No newline at end of file diff --git a/src/core2/code_9E370.c b/src/core2/code_9E370.c index 6ee360f3..76084e58 100644 --- a/src/core2/code_9E370.c +++ b/src/core2/code_9E370.c @@ -1165,31 +1165,32 @@ void func_80328478(f32 arg0[3], f32 arg1, f32 arg2){ #ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_9E370/func_80328508.s") #else -int func_80328508(Actor * arg0, u32 arg1){ +bool func_80328508(Actor * arg0, u32 arg1){ ActorAnimationInfo *animInfo; arg0->state = arg1; - if(!arg0->unk18) + if(arg0->unk18 == NULL) return 0; - else{ - animInfo = &arg0->unk18[arg1]; - if(animInfo->index){ - if(!arg0->animctrl){ - arg0->animctrl = animctrl_new(0); - animctrl_reset(arg0->animctrl); - } - animctrl_setIndex(arg0->animctrl, animInfo->index); - animctrl_setDuration(arg0->animctrl, animInfo->duration); - animctrl_setDirection(arg0->animctrl, mvmt_dir_forwards); + + animInfo = &arg0->unk18[arg1]; + + if(animInfo->index != NULL){ + if(arg0->animctrl == NULL){ + arg0->animctrl = animctrl_new(0); + animctrl_reset(arg0->animctrl); } - else { - if(arg0->animctrl){ + animctrl_setIndex(arg0->animctrl, animInfo->index); + animctrl_setDuration(arg0->animctrl, animInfo->duration); + animctrl_setDirection(arg0->animctrl, mvmt_dir_forwards); + } + else { + if(arg0->animctrl){ animctrl_setPlaybackType(arg0->animctrl, ANIMCTRL_STOPPED); animctrl_setDirection(arg0->animctrl, mvmt_dir_forwards); - } } - return 1; } + return 1; + } #endif diff --git a/src/core2/levelspecificflags.c b/src/core2/levelspecificflags.c index f487ee57..08861c7b 100644 --- a/src/core2/levelspecificflags.c +++ b/src/core2/levelspecificflags.c @@ -4,33 +4,68 @@ void levelSpecificFlags_set(arg0, arg1); - //levelSpecificFlags -u32 D_80383320; -u32 D_80383324; -u8 D_80383328[8]; +/* .bss */ +struct{ + u32 unk0; + u32 unk4; + u8 unk8[8]; +}D_80383320; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/levelspecificflags/_levelSpecificFlags_calcCRC1.s") +/* .code */ +u32 _levelSpecificFlags_calcCRC1(void) { + s32 scrambled_ptr; + u8 *ptr; + u32 var_a3; + u32 var_v1; + u32 var_v0; + + var_v1 = 0x05C9EC23; + scrambled_ptr = (((s32) &D_80383320.unk8 & 0x55555555) * 2) + ((u32) ((s32) &D_80383320.unk8 & 0xAAAAAAAA) >> 1); + ptr = (((scrambled_ptr & 0x55555555) * 2) | ((u32) (scrambled_ptr & 0xAAAAAAAA) >> 1)); + var_v0 = 8; + for(var_a3 = 0; var_a3 < var_v0; var_a3++){ + var_v1 = ((((var_v1 + ptr[var_a3]) & 0x7F) << 0x14) ^ (var_v1 >> 7)) ^ (ptr[var_a3] * 0xD); + } + return var_v1; +} void _levelSpecificFlags_updateCRC1(void) { s32 temp_a0; - temp_a0 = (s32) &D_80383320 ^ ((((s32) &D_80383320 >> 8) & 0xFF0000) + (((s32) &D_80383320 & 0xFF) << 8)); + temp_a0 = (s32) &D_80383320.unk0 ^ ((((s32) &D_80383320.unk0 >> 8) & 0xFF0000) + (((s32) &D_80383320.unk0 & 0xFF) << 8)); *(u32 *)((((u32) (temp_a0 & 0xFF000000) >> 8) + ((temp_a0 << 8) & 0xFF00)) ^ temp_a0) = _levelSpecificFlags_calcCRC1(); } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/levelspecificflags/_levelSpecificFlags_calcCRC2.s") +s32 _levelSpecificFlags_calcCRC2(void) { + s32 temp_t7; + s32 var_v1; + u32 var_a2; + u8 *scrambled_ptr; + u8 temp_t9; + u32 var_v0; + + var_v1 = 0x03F2F59A; + var_v0 = 8; + scrambled_ptr = ((((((((s32) &D_80383320.unk8 >> 0x10) & 0xFFFF) ^ 0x195D) * 0x2F) / 0x2F) << 0x10) + + (((((s32) &D_80383320.unk8 & 0xFFFF) ^ 0xA832) << 0xD) / 0x2000)) + ^ 0x195DA832; + for(var_a2 = 0; var_a2 < var_v0; var_a2++){ + var_v1 += (var_a2 + 7) * scrambled_ptr[var_a2]; + }; + return var_v1; +} void _levelSpecificFlags_updateCRC2(void) { - *(u32 *)(((((s32) (((((s32) &D_80383324 >> 0x10) & 0xFFFF) ^ 0x195D) * 0x2F) / 0x2F) << 0x10) + ((s32) ((((s32) &D_80383324 & 0xFFFF) ^ 0xA832) << 0xD) / 0x2000)) ^ 0x195DA832) = _levelSpecificFlags_calcCRC2(); + *(u32 *)(((((s32) (((((s32) &D_80383320.unk4 >> 0x10) & 0xFFFF) ^ 0x195D) * 0x2F) / 0x2F) << 0x10) + ((s32) ((((s32) &D_80383320.unk4 & 0xFFFF) ^ 0xA832) << 0xD) / 0x2000)) ^ 0x195DA832) = _levelSpecificFlags_calcCRC2(); } s32 levelSpecificFlags_get(s32 i){ - return func_803200A4(D_80383328, i); + return func_803200A4(D_80383320.unk8, i); } s32 levelSpecificFlags_getN(s32 i, s32 n){ - return func_803200E4(D_80383328, i, n); + return func_803200E4(D_80383320.unk8, i, n); } s32 levelSpecificFlags_getSet(s32 arg0, s32 arg1){ @@ -39,16 +74,23 @@ s32 levelSpecificFlags_getSet(s32 arg0, s32 arg1){ return retVal; } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/levelspecificflags/levelSpecificFlags_clear.s") +void levelSpecificFlags_clear(void){ + s32 i; + for(i = 0; i < 8; i++){ + D_80383320.unk8[i] = 0; + } + _levelSpecificFlags_updateCRC1(); + _levelSpecificFlags_updateCRC2(); +} void levelSpecificFlags_set(s32 index, s32 val){ - func_8032015C(&D_80383328, index, val); + func_8032015C(&D_80383320.unk8, index, val); _levelSpecificFlags_updateCRC1(); _levelSpecificFlags_updateCRC2(); } void levelSpecificFlags_setN(s32 index, s32 val, s32 n){ - func_803201C8(&D_80383328, index, val, n); + func_803201C8(&D_80383320.unk8, index, val, n); _levelSpecificFlags_updateCRC1(); _levelSpecificFlags_updateCRC2(); } @@ -56,10 +98,10 @@ void levelSpecificFlags_setN(s32 index, s32 val, s32 n){ s32 levelSpecificFlags_validateCRC1(void) { s32 temp_a0; - temp_a0 = (((s32) &D_80383320 & 0x55555555) * 2) + ((u32) ((s32) &D_80383320 & 0xAAAAAAAA) >> 1); + temp_a0 = (((s32) &D_80383320.unk0 & 0x55555555) * 2) + ((u32) ((s32) &D_80383320.unk0 & 0xAAAAAAAA) >> 1); return _levelSpecificFlags_calcCRC1() == *(u32*)(((temp_a0 & 0x55555555) * 2) | ((u32) (temp_a0 & 0xAAAAAAAA) >> 1)); } s32 levelSpecificFlags_validateCRC2(void){ - return _levelSpecificFlags_calcCRC2() == *(u32 *)((s32)&D_80383324 ^ 0x7EDDF5F4 ^ 0x7BEF9D80 ^ 0x5326874); -} \ No newline at end of file + return _levelSpecificFlags_calcCRC2() == *(u32 *)((s32)&D_80383320.unk4 ^ 0x7EDDF5F4 ^ 0x7BEF9D80 ^ 0x5326874); +} diff --git a/subyaml/core2.us.v10.yaml b/subyaml/core2.us.v10.yaml index edff7084..b1a86ac6 100644 --- a/subyaml/core2.us.v10.yaml +++ b/subyaml/core2.us.v10.yaml @@ -312,7 +312,7 @@ segments: - [0x9A580, c, code_9A580] #DONE - [0x9A740, c, code_9A740] #DONE - [0x9A9D0, c, code_9A9D0] #DONE - - [0x9AD00, c, levelspecificflags] + - [0x9AD00, c, levelspecificflags] #DONE - [0x9B180, c, code_9B180] #DONE - [0x9B650, c, code_9B650] #DONE - [0x9B990, c, code_9B990] #DONE