Files
ac-decomp/src/game.c
T
2024-03-16 11:54:26 -04:00

253 lines
6.1 KiB
C

#include "game.h"
#include "m_debug.h"
#include "zurumode.h"
#include "libforest/gbi_extensions.h"
#include "famicom_emu.h"
#include "m_play.h"
#include "gfxalloc.h"
#include "gamealloc.h"
#include "THA_GA.h"
#include "jsyswrap.h"
#include "m_debug_mode.h"
#include "padmgr.h"
#include "m_bgm.h"
#include "libu64/debug.h"
#include "libc64/malloc.h"
#include "GBA/gba.h"
#include "m_vibctl.h"
GAME* gamePT = NULL;
static u16 last_button[MAXCONTROLLERS];
static u16 last_now_button[MAXCONTROLLERS];
static u16 last_on_trigger[MAXCONTROLLERS];
u8 game_GameFrame;
f32 game_GameFrameF;
f32 game_GameFrame_2F;
f32 game_GameFrame__1F;
GAME* game_class_p;
static void game_move_first(GAME* this) {
if (zurumode_flag) {
Debug_mode_input(&this->pads[1]);
}
JC_JUTProcBar_setVisible(JC_JUTProcBar_getManager(), GETREG(SREG, 0) != 0);
JC_JUTProcBar_setVisibleHeapBar(JC_JUTProcBar_getManager(), GETREG(SREG, 0) != 0);
}
extern void game_debug_draw_last(GAME* this, GRAPH* graph) {
int i;
Gfx* gfx;
Gfx* close;
if (zurumode_flag) {
OPEN_DISP(graph);
gfx = NOW_POLY_OPA_DISP;
close = gfxopen(gfx);
gSPDisplayList(NOW_OVERLAY_DISP++, close);
for (i = 0; i < MAXCONTROLLERS; i++) {
pad_t* pad = &this->pads[i];
if (pad->now.errno == 0) {
last_now_button[i] = pad->now.button;
last_on_trigger[i] = pad->on.button;
last_button[i] = last_now_button[i] | last_on_trigger[i];
} else {
last_now_button[i] = 0;
last_on_trigger[i] = 0;
last_button[i] = i == 0 ? 0xffff : 0;
}
SETREG(HREG, 40 + i, last_button[i]);
}
gSPEndDisplayList(close++);
gfxclose(gfx, close);
SET_POLY_OPA_DISP(close);
CLOSE_DISP(graph);
}
if (zurumode_flag) {
Debug_mode_output(graph);
}
}
static void game_draw_first(GRAPH* graph) {
OPEN_DISP(graph);
gSPSegment(NOW_BG_OPA_DISP++, G_MWO_NUMLIGHT, 0x80000000);
CLOSE_DISP(graph);
}
extern void game_draw_last(GRAPH* graph) {
Gfx* close;
Gfx* poly_gfx;
OPEN_DISP(graph);
poly_gfx = NOW_POLY_OPA_DISP;
close = gfxopen(poly_gfx);
gSPDisplayList(NOW_OVERLAY_DISP++, close);
gSPEndDisplayList(close++);
gfxclose(poly_gfx, close);
SET_POLY_OPA_DISP(close);
CLOSE_DISP(graph);
}
extern void game_get_controller(GAME* this) {
if (this->pad_initialized == TRUE) {
padmgr_RequestPadData(this->pads, 1);
} else {
padmgr_ClearPadData(this->pads);
}
}
extern void SetGameFrame(int frame) {
if (game_GameFrame != frame) {
game_GameFrame = frame;
game_GameFrameF = (int)(u8)frame;
game_GameFrame_2F = game_GameFrameF * 0.5f;
game_GameFrame__1F = 1.0f / game_GameFrameF;
SETREG(SREG, 30, (u16)frame);
if (GETREG(SREG, 29) > 0) {
frame = GETREG(SREG, 29);
}
JC_JFWDisplay_setFrameRate(JC_JFWDisplay_getManager(), frame);
}
}
extern void game_main(GAME* this) {
GRAPH* graph = this->graph;
if (GETREG(SREG, 30) != game_GameFrame || GETREG(SREG, 29)) {
SetGameFrame(GETREG(SREG, 30));
}
game_draw_first(graph);
GRAPH_SET_DOING_POINT(graph, GAME_TIME);
mTM_time();
GRAPH_SET_DOING_POINT(graph, GAME_TIME_FINISHED);
GRAPH_SET_DOING_POINT(graph, GAME_EXEC);
this->exec(this);
GRAPH_SET_DOING_POINT(graph, GAME_EXEC_FINISHED);
GRAPH_SET_DOING_POINT(graph, GAME_BGM);
mBGM_main(this);
GRAPH_SET_DOING_POINT(graph, GAME_BGM_FINISHED);
game_move_first(this);
this->frame_counter++;
}
static void game_init_hyral(GAME* this, size_t size) {
u8* hyral = (u8*)gamealloc_malloc(&this->gamealloc, size);
if (hyral != NULL) {
THA_ct(&this->tha, (char*)hyral, size);
} else {
THA_ct(&this->tha, NULL, 0);
_dbg_hungup(__FILE__, 559);
}
}
extern void game_resize_hyral(GAME* this, int size) {
size_t max_size, free_size, alloc_size;
u8* old_hyral;
u8* hyral;
old_hyral = (u8*)this->tha.buf_p;
THA_dt(&this->tha);
gamealloc_free(&this->gamealloc, old_hyral);
GetFreeArena(&max_size, &free_size, &alloc_size);
max_size -= 0x50;
if (size <= 0) {
size = max_size + size;
if (size < 0) {
size = 0;
}
} else {
if (size > max_size) {
size = max_size;
}
}
hyral = (u8*)gamealloc_malloc(&this->gamealloc, (u32)size);
if (hyral != NULL) {
THA_ct(&this->tha, (char*)hyral, (u32)size);
} else {
THA_ct(&this->tha, NULL, 0);
_dbg_hungup(__FILE__, 633);
}
}
extern void game_ct(GAME* this, void (*init)(GAME*), GRAPH* graph) {
gamePT = this;
graph->need_viupdate = TRUE;
mCon_ct();
this->graph = graph;
this->frame_counter = 0;
this->exec = NULL;
this->cleanup = NULL;
this->doing = TRUE;
this->pad_initialized = TRUE;
GAME_NEXT_GAME_NULL(this);
gamealloc_init(&this->gamealloc);
game_init_hyral(this, GAME_HYRAL_SIZE);
SetGameFrame(GAME_FRAME);
__gfxprint_default_flags |= GFXPRINT_FLAG_HIGHRES;
init(this);
mBGM_init();
GBAInit();
mVibctl_init();
}
extern void game_dt(GAME* this) {
mCon_dt();
mBGM_cleanup();
if (this->cleanup != NULL) {
this->cleanup(this);
}
mVibctl_cleanup();
THA_dt(&this->tha);
gamealloc_cleanup(&this->gamealloc);
gamePT = NULL;
}
extern void (*game_get_next_game_init(GAME* this))(GAME*) {
return this->next_game_init;
}
/* @fabricated */
MATCH_FORCESTRIP extern size_t game_get_next_game_class_size(GAME* this) {
return this->next_game_class_size;
}
extern int game_is_doing(GAME* this) {
return this->doing;
}
extern int game_getFreeBytes(GAME* this) {
return THA_getFreeBytes16(&this->tha);
}
extern void game_goto_next_game_play(GAME* this) {
GAME_GOTO_NEXT(this, play, PLAY);
}
/* @fabricated */
MATCH_FORCESTRIP extern void game_goto_next_game_famicom_emu(GAME* this) {
GAME_GOTO_NEXT(this, famicom_emu, FAMICOM_EMU);
}