diff --git a/README.md b/README.md index 5385913f..89f0487b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# banjo (98.9505%) +# banjo (98.9690%) diff --git a/include/prop.h b/include/prop.h index f285d328..8759f920 100644 --- a/include/prop.h +++ b/include/prop.h @@ -393,4 +393,9 @@ typedef struct actor_array{ Actor data[]; //variable size array }ActorArray; +typedef struct { + u32 cnt; + Actor *actor_save_state[]; +}ActorListSaveState; + #endif diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index 1947f404..4b9e4c90 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -17,7 +17,7 @@ core2 - 98.3883% - 98.3883% + 98.4207% + 98.4207% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 6fe81ce3..a4567662 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 98.9505% - 98.9505% + 98.9690% + 98.9690% \ No newline at end of file diff --git a/src/core2/code_5BEB0.c b/src/core2/code_5BEB0.c index a1159ed9..6909f77d 100644 --- a/src/core2/code_5BEB0.c +++ b/src/core2/code_5BEB0.c @@ -8,7 +8,7 @@ typedef struct map_savestate_s{ }MapSavestate; /* .bss */ -MapSavestate *D_8037E650[0x9A]; +s32 D_8037E650[0x9A]; u8 pad_8037E8A8[0x18]; /* public functions */ @@ -26,8 +26,8 @@ void mapSavestate_init(void){ void mapSavestate_free_all(void){ int i; for(i = 0; i < 0x9A; i++){ - if(D_8037E650[i]){ - free(D_8037E650[i]); + if((u32*)D_8037E650[i] != NULL){ + free((void *)D_8037E650[i]); D_8037E650[i] = NULL; } } @@ -37,7 +37,7 @@ void mapSavestate_defrag_all(void){ int i; for(i = 0; i < 0x9A; i++){ if(D_8037E650[i]){ - D_8037E650[i] = (MapSavestate *)defrag(D_8037E650[i]); + D_8037E650[i] = defrag(D_8037E650[i]); } } } @@ -91,22 +91,30 @@ void mapSavestate_save(enum map_e map){ } #endif -//mapSavestate_apply -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5BEB0/mapSavestate_apply.s") -// void mapSavestate_apply(enum map_e map){ -// u32 **mssp = D_8037E650 + map; -// int s0; -// int val; -// u8 *tmp; -// if(*mssp){ -// mapSpecificFlags_setAll(**mssp); -// func_80308230(1); -// func_803083B0(-1); -// for(s0 = 0x20; func_803083B0((((*mssp)[s0 >> 5]) & (1 << (s0 & 0x1f)))? 1 : 0) != -1; s0++); -// func_80308230(0); -// tmp = *mssp; -// func_8032A09C(tmp, (tmp + 0x10*((s0 + 0x7f) >> 7))); -// free(*mssp); -// *mssp = NULL; -// } -// } +#define AS_BOOL(expr) ((expr)? TRUE : FALSE) + +void mapSavestate_apply(enum map_e map_id) { + s32 var_s0 = 0x1F; + u32* t; + u32 aligned_index; + + if(D_8037E650[map_id] == NULL) + return; + + t = reinterpret_cast(u32*, D_8037E650[map_id]); + mapSpecificFlags_setAll(*t); + var_s0++; + func_80308230(1); + func_803083B0(-1); + + while (func_803083B0( AS_BOOL(((u32*)D_8037E650[map_id])[var_s0 >> 5] & (1 << (var_s0 & 0x1f)))) != -1) { + var_s0++; + } + func_80308230(0); + + aligned_index = ((var_s0 + ((1 << 7) - 1)) >> 7); + func_8032A09C(D_8037E650[map_id], (ActorListSaveState *)D_8037E650[map_id] + (aligned_index << 2)); + free((void *)D_8037E650[map_id] ); + D_8037E650[map_id] = NULL; +} + diff --git a/src/core2/code_9E370.c b/src/core2/code_9E370.c index cc17b814..e800f420 100644 --- a/src/core2/code_9E370.c +++ b/src/core2/code_9E370.c @@ -1769,10 +1769,7 @@ void *actors_appendToSavestate(void * begin, u32 end){ return sp3C; } -typedef struct { - u32 cnt; - Actor *actor_save_state[]; -}ActorListSaveState; + void func_8032A09C(s32 arg0, ActorListSaveState *arg1) { Actor **temp_v1;