marioparty4/src/game/board/tutorial.c

138 lines
3.6 KiB
C
Executable file

#include "game/board/tutorial.h"
#include "game/flag.h"
#include "game/gamework_data.h"
#include "game/process.h"
#include "game/board/main.h"
#include "game/board/model.h"
s32 boardTutorialData[4]; // maybe a single s32 + padding?
static void (*tutorialHook)(s16, s32);
s8 boardTutorialDirInputX;
s8 boardTutorialDirInputY;
s16 boardTutorialDirInputTime;
s32 boardTutorialBlockPos;
s8 boardTutorialBlockItem;
s8 boardTutorialBlockF;
s8 boardTutorialUseItem;
static s16 hostMdl;
s8 boardTutorialF;
static Process *tutorialProcess;
static void *playerCfgCopy;
static void *playerCopy;
static void *systemCopy;
static void *gameStatCopy;
static void TutorialProcFunc(void) {
while (1) {
if (_CheckFlag(FLAG_ID_MAKE(1, 16))) {
BoardTutorialHookExec(0x1E, 0);
}
HuPrcVSleep();
}
}
void BoardTutorialInit(void) {
boardTutorialDirInputTime = -1;
boardTutorialBlockF = 0;
boardTutorialUseItem = -1;
tutorialHook = NULL;
tutorialProcess = NULL;
boardTutorialF = 0;
if (_CheckFlag(FLAG_ID_MAKE(1, 11))) {
tutorialProcess = HuPrcChildCreate(TutorialProcFunc, 0x2002, 0x2000, 0, boardMainProc);
}
}
void BoardTutorialKill(void) {
if (_CheckFlag(FLAG_ID_MAKE(1, 11))) {
if (tutorialProcess) {
HuPrcKill(tutorialProcess);
}
boardTutorialF = 0;
}
}
void BoardTutorialHookSet(void *arg0) {
tutorialHook = arg0;
}
void BoardTutorialHookExec(s16 arg0, s32 arg1) {
if (tutorialHook) {
tutorialHook(arg0, arg1);
}
}
void BoardTutorialPlayerInit(void) {
s32 i;
for (i = 0; i < 4; i++) {
GWPlayer[i].com = 1;
GWPlayerCfg[i].iscom = 1;
}
GWSystem.board = BOARD_ID_TUTORIAL;
}
void BoardTutorialWorkSave(void) {
OSReport("-O-O-O-O-O-O-O Tutorial Save Work\n");
if (gameStatCopy) {
HuMemDirectFree(gameStatCopy);
}
if (systemCopy) {
HuMemDirectFree(systemCopy);
}
if (playerCopy) {
HuMemDirectFree(playerCopy);
}
if (playerCfgCopy) {
HuMemDirectFree(playerCfgCopy);
}
gameStatCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWGameStat));
systemCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWSystem));
playerCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWPlayer));
playerCfgCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWPlayerCfg));
memcpy(gameStatCopy, &GWGameStat, sizeof(GWGameStat));
memcpy(systemCopy, &GWSystem, sizeof(GWSystem));
memcpy(playerCopy, GWPlayer, sizeof(GWPlayer));
memcpy(playerCfgCopy, GWPlayerCfg, sizeof(GWPlayerCfg));
}
void BoardTutorialWorkRestore(void) {
OSReport("-O-O-O-O-O-O-O Tutorial Load Work\n");
memcpy(&GWGameStat, gameStatCopy, sizeof(GWGameStat));
memcpy(&GWSystem, systemCopy, sizeof(GWSystem));
memcpy(GWPlayer, playerCopy, sizeof(GWPlayer));
memcpy(GWPlayerCfg, playerCfgCopy, sizeof(GWPlayerCfg));
HuMemDirectFree(gameStatCopy);
HuMemDirectFree(systemCopy);
HuMemDirectFree(playerCopy);
HuMemDirectFree(playerCfgCopy);
gameStatCopy = NULL;
systemCopy = NULL;
playerCopy = NULL;
playerCfgCopy = NULL;
}
void BoardTutorialDirInputSet(s8 arg0, s8 arg1, s16 arg2) {
boardTutorialDirInputX = arg0;
boardTutorialDirInputY = arg1;
boardTutorialDirInputTime = arg2;
}
void BoardTutorialBlockSetPos(s32 arg0, s8 arg1) {
boardTutorialBlockF = 1;
boardTutorialBlockPos = arg0;
boardTutorialBlockItem = arg1;
BoardSpaceBlockPosSet();
}
void BoardTutorialItemSet(s8 arg0) {
boardTutorialUseItem = arg0;
}
void BoardTutorialHostSet(s16 arg0) {
hostMdl = arg0;
}
void BoardTutorialHostHide(s8 arg0) {
BoardModelVisibilitySet(hostMdl, arg0);
}