Files
banjo-kazooie/src/core2/code_5BEB0.c
2024-09-19 12:31:53 +02:00

116 lines
2.7 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
typedef struct map_savestate_s{
u32 flags;
}MapSavestate;
/* .bss */
s32 D_8037E650[0x9A];
/* public functions */
void func_802E3BD0(s32 frame_buffer_indx);
int game_is_frozen(void);
/* .code */
void mapSavestate_init(void){
int i;
for(i = 0; i < 0x9A; i++){
D_8037E650[i] = 0;
}
}
void mapSavestate_free_all(void){
int i;
for(i = 0; i < 0x9A; i++){
if((u32*)D_8037E650[i] != NULL){
free((void *)D_8037E650[i]);
D_8037E650[i] = NULL;
}
}
}
void mapSavestate_defrag_all(void){
int i;
for(i = 0; i < 0x9A; i++){
if(D_8037E650[i]){
D_8037E650[i] = defrag(D_8037E650[i]);
}
}
}
void mapSavestate_save(enum map_e map)
{
u32 wSize;
s32 iBit;
s32 reg_s4;
u32 *valPtr;
int new_var;
wSize = 4;
if (D_8037E650[map] != 0)
{
free(D_8037E650[map]);
}
D_8037E650[map] = (MapSavestate *) malloc(4 * (sizeof(u32)));
valPtr = (u32 *) D_8037E650[map];
*valPtr = mapSpecificFlags_getAll();
iBit = 0x20;
func_80308230(1);
func_803083B0(-1);
for (reg_s4 = func_803083B0(-2); reg_s4 != (-1); reg_s4 = func_803083B0(-2))
{
new_var = sizeof(u32);
if (!(iBit < ((wSize * (sizeof(u32))) * 8)))
{
wSize += 4;
D_8037E650[map] = (MapSavestate *) realloc(D_8037E650[map], wSize * new_var);
valPtr = ((s32) D_8037E650[map]) + (wSize * new_var);
valPtr[-1] = 0;
new_var = 1;
valPtr[-2] = 0;
valPtr[-3] = 0;
if (1) if (1) if (1) if (1) if (1) if (1) if (1) ;
valPtr[-4] = 0;
}
valPtr = D_8037E650[map];
valPtr[iBit >> 5] = (reg_s4) ? (valPtr[iBit >> 5] | (1 << (iBit & 0x1f))) : (valPtr[iBit >> 5] & (~((1 ^ 0) << (iBit & 0x1f))));
iBit++;
wSize = wSize;
}
D_8037E650[map] = actors_appendToSavestate(D_8037E650[map], ((u32 *) D_8037E650[map]) + (4 * ((iBit + 0x7F) >> 7)));
}
void mapSavestate_apply(enum map_e map_id) {
s32 iBit = 0;
u32* flag_ptr;
u32* word_ptr;
ActorListSaveState *actor_list_ptr;
u32 bit_value;
if(D_8037E650[map_id] == NULL)
return;
flag_ptr = reinterpret_cast(u32*, D_8037E650[map_id]);
mapSpecificFlags_setAll(*flag_ptr);
iBit += 8 * sizeof(u32);
func_80308230(1);
func_803083B0(-1);
while (
bit_value = BOOL(((u32*)D_8037E650[map_id])[iBit >> 5] & (1 << (iBit & 0x1f))),
func_803083B0(bit_value) != -1
) {
iBit++;
}
func_80308230(0);
actor_list_ptr = (ActorListSaveState *)D_8037E650[map_id] + (((iBit + (0x80 - 1)) >> 7) * 4);
func_8032A09C(D_8037E650[map_id], actor_list_ptr);
free((void*)D_8037E650[map_id] );
D_8037E650[map_id] = NULL;
}