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;