marioparty4/src/REL/present/init.c
2024-11-03 23:53:45 +01:00

187 lines
4.5 KiB
C

#include "game/audio.h"
#include "game/esprite.h"
#include "game/hsfman.h"
#include "game/objsub.h"
#include "game/pad.h"
#include "game/process.h"
#include "game/wipe.h"
#include "rel_sqrt_consts.h"
#include "REL/present.h"
typedef struct FaderWork {
/* 0x00 */ s16 id;
/* 0x04 */ float tplvl;
/* 0x08 */ float speed;
} FaderWork; /* size 0x0C */ // same as in option/scene.c
typedef struct FaderWork2 {
/* 0x00 */ s16 id;
/* 0x04 */ float tpMultiplier;
/* 0x08 */ float tplvl;
/* 0x0C */ float speed;
} FaderWork2; /* size = 0x10 */
omObjData *presentState;
omObjData *lbl_1_bss_14;
omObjData *present;
omObjData *lbl_1_bss_C;
omObjData *presentCamera;
Process *presentObjMan;
static omObjData *scene;
static void FadeSprite(void);
static void FadeModel(void);
static void SceneMain(omObjData *object);
void ObjectSetup(void)
{
presentObjMan = omInitObjMan(150, 8192);
omGameSysInit(presentObjMan);
HuWinInit(1);
scene = omAddObjEx(presentObjMan, 1000, 0, 0, 0, SceneMain);
scene->unk10 = 0;
presentState = PresentStateCreate();
}
void PresentFadeSprite(s16 sprite, BOOL inF, s32 duration)
{
Process *process;
FaderWork *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(FaderWork), MEMORY_DEFAULT_NUM);
work->id = sprite;
work->speed = 1.0f / duration;
if (inF) {
work->speed = work->speed;
work->tplvl = 0.0f;
}
else {
work->speed = -work->speed;
work->tplvl = 1.0f;
}
espDispOn(work->id);
espTPLvlSet(work->id, work->tplvl);
process = HuPrcChildCreate(FadeSprite, 100, 5376, 0, HuPrcCurrentGet());
process->user_data = work;
}
static void FadeSprite(void)
{
FaderWork *work = HuPrcCurrentGet()->user_data;
while (TRUE) {
work->tplvl = work->tplvl + work->speed;
if (work->tplvl > 1.0f) {
work->tplvl = 1.0f;
break;
}
else if (work->tplvl < 0.0f) {
work->tplvl = 0.0f;
break;
}
else {
espTPLvlSet(work->id, work->tplvl);
HuPrcVSleep();
}
}
espTPLvlSet(work->id, work->tplvl);
if (work->speed < 0.0f) {
espDispOff(work->id);
}
HuMemDirectFree(work);
HuPrcEnd();
}
void FadeSpriteWithMultiplier(s16 model, BOOL inF, float tpMultiplier, s32 duration)
{
Process *process;
// bug: wrong struct in sizeof
FaderWork2 *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(FaderWork), MEMORY_DEFAULT_NUM);
work->id = model;
work->speed = 1.0f / duration;
work->tpMultiplier = tpMultiplier;
if (inF) {
work->speed = work->speed;
work->tplvl = 0.0f;
}
else {
work->speed = -work->speed;
work->tplvl = 1.0f;
}
Hu3DModelTPLvlSet(work->id, work->tplvl * work->tpMultiplier);
Hu3DModelAttrReset(work->id, HU3D_ATTR_DISPOFF);
process = HuPrcChildCreate(FadeModel, 100, 5376, 0, HuPrcCurrentGet());
process->user_data = work;
}
static void FadeModel(void)
{
FaderWork2 *var_r31 = HuPrcCurrentGet()->user_data;
while (TRUE) {
var_r31->tplvl += var_r31->speed;
if (var_r31->tplvl > 1.0f) {
var_r31->tplvl = 1.0f;
break;
}
else if (var_r31->tplvl < 0.0f) {
var_r31->tplvl = 0.0f;
break;
}
else {
Hu3DModelTPLvlSet(var_r31->id, var_r31->tplvl * var_r31->tpMultiplier);
HuPrcVSleep();
}
}
Hu3DModelTPLvlSet(var_r31->id, var_r31->tplvl * var_r31->tpMultiplier);
if (var_r31->speed < 0.0f) {
Hu3DModelAttrSet(var_r31->id, HU3D_ATTR_DISPOFF);
}
HuMemDirectFree(var_r31);
HuPrcEnd();
}
BOOL PresentPadCheck(u16 btn)
{
u32 var_r31 = HuPadBtnDown[0] & btn;
return var_r31 != 0;
}
BOOL PresentPadDStkRepCheck(u16 dir)
{
u32 var_r31 = HuPadDStkRep[0] & dir;
return var_r31 != 0;
}
BOOL PresentPadDStkCheck(u16 dir)
{
u32 var_r31 = HuPadDStk[0] & dir;
return var_r31 != 0;
}
static void SceneMain(omObjData *object)
{
switch (object->unk10) {
case 0:
object->unk10 = 1;
case 1:
if (!omSysExitReq) {
break;
}
object->unk10 = 2;
case 2:
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60);
HuAudFadeOut(1000);
object->unk10 = 3;
break;
case 3:
if (!WipeStatGet()) {
PresentStateKill(presentState);
omOvlReturnEx(1, 1);
}
break;
default:
break;
}
}