diff --git a/config/GMPE01_00/rels/E3setupDLL/symbols.txt b/config/GMPE01_00/rels/E3setupDLL/symbols.txt index 3618f15f..2fe290d7 100644 --- a/config/GMPE01_00/rels/E3setupDLL/symbols.txt +++ b/config/GMPE01_00/rels/E3setupDLL/symbols.txt @@ -17,9 +17,9 @@ GetStickY = .text:0x00001C20; // type:function size:0x84 scope:local GetBtn = .text:0x00001CA4; // type:function size:0x90 scope:local GetBtnDown = .text:0x00001D34; // type:function size:0x24 scope:local E3PadUpdate = .text:0x00001D58; // type:function size:0xFC -E3PadInit = .text:0x00001E54; // type:function size:0x1C0 -MotionGetMaxTime = .text:0x00002014; // type:function size:0x78 -MotionGetShiftTime = .text:0x0000208C; // type:function size:0x2C +E3PadRead = .text:0x00001E54; // type:function size:0x1C0 +MotionMaxTimeGet = .text:0x00002014; // type:function size:0x78 +MotionShiftTimeGet = .text:0x0000208C; // type:function size:0x2C InitMenuControl = .text:0x000020B8; // type:function size:0xA4 scope:local UpdateMenuControl = .text:0x0000215C; // type:function size:0x400 scope:local UpdateOvlWatch = .text:0x0000255C; // type:function size:0x124 scope:local @@ -29,13 +29,13 @@ InitPlayerCnt = .text:0x00002A38; // type:function size:0x59C scope:local UpdateCharSelCursor = .text:0x00002FD4; // type:function size:0x208 scope:local UpdateCharSelPlayerCursor = .text:0x000031DC; // type:function size:0x37C scope:local UpdateCharSelComCursor = .text:0x00003558; // type:function size:0x3B4 scope:local -IsCharSelDone = .text:0x0000390C; // type:function size:0xAC scope:local +CheckCharSel = .text:0x0000390C; // type:function size:0xAC scope:local UpdateCharSel = .text:0x000039B8; // type:function size:0x2B8 scope:local InitCharSel = .text:0x00003C70; // type:function size:0x534 scope:local -UpdateVibrateCfg = .text:0x000041A4; // type:function size:0x2DC scope:local -InitVibrateCfg = .text:0x00004480; // type:function size:0x520 scope:local -UpdateGameModeSel = .text:0x000049A0; // type:function size:0x59C scope:local -InitGameModeSel = .text:0x00004F3C; // type:function size:0x4E8 scope:local +UpdateRumbleCfg = .text:0x000041A4; // type:function size:0x2DC scope:local +InitRumbleCfg = .text:0x00004480; // type:function size:0x520 scope:local +UpdateModeSel = .text:0x000049A0; // type:function size:0x59C scope:local +InitModeSel = .text:0x00004F3C; // type:function size:0x4E8 scope:local E3BGUpdate = .text:0x00005424; // type:function size:0x100 scope:local E3BGCreate = .text:0x00005524; // type:function size:0x184 InitCamera = .text:0x000056A8; // type:function size:0x7C scope:local @@ -71,47 +71,47 @@ lbl_2_rodata_74 = .rodata:0x00000074; // type:object size:0x4 data:float lbl_2_rodata_78 = .rodata:0x00000078; // type:object size:0x4 data:float lbl_2_rodata_7C = .rodata:0x0000007C; // type:object size:0x4 data:float lbl_2_rodata_80 = .rodata:0x00000080; // type:object size:0x8 data:float -lbl_2_rodata_88 = .rodata:0x00000088; // type:object size:0x4 data:float -lbl_2_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 data:float -lbl_2_rodata_90 = .rodata:0x00000090; // type:object size:0x4 data:float -lbl_2_rodata_94 = .rodata:0x00000094; // type:object size:0x4 data:float -lbl_2_rodata_98 = .rodata:0x00000098; // type:object size:0x4 data:float -lbl_2_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 data:float -lbl_2_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 data:float -lbl_2_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 data:float -lbl_2_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 data:float -lbl_2_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 data:float -lbl_2_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 data:float -lbl_2_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 data:float -lbl_2_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 data:float -lbl_2_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 data:float -lbl_2_rodata_C0 = .rodata:0x000000C0; // type:object size:0x8 data:double -lbl_2_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 data:float -lbl_2_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 data:float -lbl_2_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 data:float -lbl_2_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 data:float -lbl_2_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 data:float -lbl_2_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 data:float -lbl_2_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 data:float -lbl_2_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 data:float -lbl_2_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 data:float -lbl_2_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 data:float -lbl_2_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 data:float -lbl_2_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 data:float -lbl_2_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 data:float -lbl_2_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 data:float -lbl_2_rodata_100 = .rodata:0x00000100; // type:object size:0x4 data:float -lbl_2_rodata_104 = .rodata:0x00000104; // type:object size:0x4 data:float -lbl_2_rodata_108 = .rodata:0x00000108; // type:object size:0x4 data:float -lbl_2_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 data:float -lbl_2_rodata_110 = .rodata:0x00000110; // type:object size:0x4 data:float -lbl_2_rodata_114 = .rodata:0x00000114; // type:object size:0x4 data:float -lbl_2_rodata_118 = .rodata:0x00000118; // type:object size:0x4 data:float -lbl_2_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 data:float -lbl_2_rodata_120 = .rodata:0x00000120; // type:object size:0x4 data:float -lbl_2_rodata_124 = .rodata:0x00000124; // type:object size:0x4 data:float -lbl_2_rodata_128 = .rodata:0x00000128; // type:object size:0x4 data:float -lbl_2_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 data:float +lbl_2_rodata_88 = .rodata:0x00000088; // type:object size:0x4 scope:local data:float +lbl_2_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 scope:local data:float +lbl_2_rodata_90 = .rodata:0x00000090; // type:object size:0x4 scope:local data:float +lbl_2_rodata_94 = .rodata:0x00000094; // type:object size:0x4 scope:local data:float +lbl_2_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float +lbl_2_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local data:float +lbl_2_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local data:float +lbl_2_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 scope:local data:float +lbl_2_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 scope:local data:float +lbl_2_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 scope:local data:float +lbl_2_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 scope:local data:float +lbl_2_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 scope:local data:float +lbl_2_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 scope:local data:float +lbl_2_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 scope:local data:float +lbl_2_rodata_C0 = .rodata:0x000000C0; // type:object size:0x8 scope:local data:double +lbl_2_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 scope:local data:float +lbl_2_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 scope:local data:float +lbl_2_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 scope:local data:float +lbl_2_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 scope:local data:float +lbl_2_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 scope:local data:float +lbl_2_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 scope:local data:float +lbl_2_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 scope:local data:float +lbl_2_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 scope:local data:float +lbl_2_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 scope:local data:float +lbl_2_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 scope:local data:float +lbl_2_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 scope:local data:float +lbl_2_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 scope:local data:float +lbl_2_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 scope:local data:float +lbl_2_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 scope:local data:float +lbl_2_rodata_100 = .rodata:0x00000100; // type:object size:0x4 scope:local data:float +lbl_2_rodata_104 = .rodata:0x00000104; // type:object size:0x4 scope:local data:float +lbl_2_rodata_108 = .rodata:0x00000108; // type:object size:0x4 scope:local data:float +lbl_2_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 scope:local data:float +lbl_2_rodata_110 = .rodata:0x00000110; // type:object size:0x4 scope:local data:float +lbl_2_rodata_114 = .rodata:0x00000114; // type:object size:0x4 scope:local data:float +lbl_2_rodata_118 = .rodata:0x00000118; // type:object size:0x4 scope:local data:float +lbl_2_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 scope:local data:float +lbl_2_rodata_120 = .rodata:0x00000120; // type:object size:0x4 scope:local data:float +lbl_2_rodata_124 = .rodata:0x00000124; // type:object size:0x4 scope:local data:float +lbl_2_rodata_128 = .rodata:0x00000128; // type:object size:0x4 scope:local data:float +lbl_2_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 scope:local data:float lbl_2_data_0 = .data:0x00000000; // type:object size:0x24 lbl_2_data_24 = .data:0x00000024; // type:object size:0x11 data:string lbl_2_data_36 = .data:0x00000036; // type:object size:0x8 @@ -136,27 +136,27 @@ cursorYOfsTbl = .data:0x000001F4; // type:object size:0x14 scope:local mgPicTbl = .data:0x00000208; // type:object size:0x34 scope:local startText = .data:0x0000023C; // type:object size:0x14 scope:local shadowPos = .data:0x00000250; // type:object size:0xC scope:local -shadowUp = .data:0x0000025C; // type:object size:0xC scope:local -shadowTarget = .data:0x00000268; // type:object size:0xC scope:local -lbl_2_data_274 = .data:0x00000274; // type:object size:0x60 +shadowTarget = .data:0x0000025C; // type:object size:0xC scope:local +shadowUp = .data:0x00000268; // type:object size:0xC scope:local +lbl_2_data_274 = .data:0x00000274; // type:object size:0x60 data:float playerCntTbl = .data:0x000002D4; // type:object size:0x8 scope:local charTbl = .data:0x000002DC; // type:object size:0x10 scope:local charSfxTbl = .data:0x000002EC; // type:object size:0x20 scope:local -lbl_2_data_30C = .data:0x0000030C; // type:object size:0x12 +lbl_2_data_30C = .data:0x0000030C; // type:object size:0x12 scope:local lbl_2_data_31E = .data:0x0000031E; // type:object size:0x8 playerCntMessTbl = .data:0x00000328; // type:object size:0x10 scope:local -charPosTbl = .data:0x00000338; // type:object size:0x40 scope:local -charComSfxTbl = .data:0x00000378; // type:object size:0x20 -lbl_2_data_398 = .data:0x00000398; // type:object size:0xE data:string +charPosTbl = .data:0x00000338; // type:object size:0x40 scope:local data:float +charComSfxTbl = .data:0x00000378; // type:object size:0x20 scope:local +lbl_2_data_398 = .data:0x00000398; // type:object size:0xE scope:local data:string charSpriteTbl = .data:0x000003A8; // type:object size:0x20 scope:local cursorSpriteTbl = .data:0x000003C8; // type:object size:0x14 scope:local -highlightSpriteTbl = .data:0x000003DC; // type:object size:0x14 scope:local -vibrateSettingMess = .data:0x000003F0; // type:object size:0x8 scope:local +hiliteSprTbl = .data:0x000003DC; // type:object size:0x14 scope:local +rumbleMess = .data:0x000003F0; // type:object size:0x8 scope:local modeSelCursorPosTbl = .data:0x000003F8; // type:object size:0x10 scope:local boardSelCursorPosTbl = .data:0x00000408; // type:object size:0x10 scope:local -camRotTbl = .data:0x00000418; // type:object size:0x60 scope:local -lbl_2_data_478 = .data:0x00000478; // type:object size:0x24 -lbl_2_data_49C = .data:0x0000049C; // type:object size:0x24 +camViewTbl = .data:0x00000418; // type:object size:0x60 scope:local data:float +lbl_2_data_478 = .data:0x00000478; // type:object size:0x24 data:float +lbl_2_data_49C = .data:0x0000049C; // type:object size:0x24 data:float lbl_2_data_4C0 = .data:0x000004C0; // type:object size:0x10 lbl_2_bss_A = .bss:0x0000000A; // type:object size:0x2 data:2byte lbl_2_bss_C = .bss:0x0000000C; // type:object size:0x2 data:2byte @@ -166,8 +166,9 @@ mgPicObj = .bss:0x00000018; // type:object size:0x4 scope:local data:4byte mgSelectObj = .bss:0x0000001C; // type:object size:0x4 scope:local data:4byte mgInterface = .bss:0x00000020; // type:object size:0x4 scope:local data:4byte mgDefault = .bss:0x00000024; // type:object size:0x2 scope:local data:2byte -lbl_2_bss_28 = .bss:0x00000028; // type:object size:0xC data:2byte -lbl_2_bss_34 = .bss:0x00000034; // type:object size:0x2 scope:local data:2byte +repBtn = .bss:0x00000028; // type:object size:0x2 scope:local data:2byte +lbl_2_bss_2A = .bss:0x0000002A; // type:object size:0xA data:2byte +lbl_2_bss_34 = .bss:0x00000034; // type:object size:0x2 data:2byte lbl_2_bss_36 = .bss:0x00000036; // type:object size:0x2 data:2byte lbl_2_bss_38 = .bss:0x00000038; // type:object size:0x2 data:2byte lbl_2_bss_3A = .bss:0x0000003A; // type:object size:0x2 data:2byte @@ -184,7 +185,7 @@ e3BGObj = .bss:0x00000070; // type:object size:0x4 data:4byte configModeObj = .bss:0x00000074; // type:object size:0x10 scope:local data:4byte lbl_2_bss_84 = .bss:0x00000084; // type:object size:0x8 data:4byte cameraObj = .bss:0x0000008C; // type:object size:0x4 scope:local data:4byte -lbl_2_bss_90 = .bss:0x00000090; // type:object size:0x4 data:4byte +e3OvlWatchObj = .bss:0x00000090; // type:object size:0x4 data:4byte e3ViewObj = .bss:0x00000094; // type:object size:0x4 data:4byte e3MenuMainObj = .bss:0x00000098; // type:object size:0x4 data:4byte e3CameraFov = .bss:0x0000009C; // type:object size:0x4 data:float @@ -195,7 +196,7 @@ e3NextOvl = .bss:0x000000AC; // type:object size:0x4 data:4byte lbl_2_bss_B0 = .bss:0x000000B0; // type:object size:0x4 data:4byte e3ExitEnableF = .bss:0x000000B4; // type:object size:0x4 data:4byte e3EvtNo = .bss:0x000000B8; // type:object size:0x4 scope:local data:4byte -e3ConfigPlayerF = .bss:0x000000BC; // type:object size:0x2 data:2byte +e3ConfigPlayerCnt = .bss:0x000000BC; // type:object size:0x2 data:2byte e3PadCtrl = .bss:0x000000BE; // type:object size:0x2 data:2byte e3PadData = .bss:0x000000C0; // type:object size:0x20 configE3 = .bss:0x000000E0; // type:object size:0x18 scope:local data:2byte diff --git a/configure.py b/configure.py index a090ce37..c4996de3 100644 --- a/configure.py +++ b/configure.py @@ -783,7 +783,7 @@ config.libs = [ objects = { Object(NonMatching, "REL/E3setupDLL/mgselect.c"), Object(Matching, "REL/executor.c"), - Object(NonMatching, "REL/E3setupDLL/main.c"), + Object(Matching, "REL/E3setupDLL/main.c"), } ), Rel('instDll', diff --git a/include/REL/E3SetupDLL.h b/include/REL/E3SetupDLL.h new file mode 100644 index 00000000..ef58102c --- /dev/null +++ b/include/REL/E3SetupDLL.h @@ -0,0 +1,30 @@ +#ifndef E3SETUPDLL_H +#define E3SETUPDLL_H + +#include "game/object.h" +#include "game/pad.h" + +typedef struct e3pad { + u16 btn; + u16 btnDown; + u16 enable; + u16 unk6; +} E3Pad; + +extern E3Pad e3PadData[4]; +extern s16 e3PadCtrl; +extern s16 e3ConfigPlayerF; +extern s32 e3ExitEnableF; +extern OverlayID e3NextOvl; +extern s32 e3NextEvent; +extern u32 e3ExitMode; + +void E3MainInit(void); +void E3MGSelectInit(void); +s16 E3PadRead(void); +u16 E3PadUpdate(s16 player, E3Pad *pad); +void E3OvlWatchInit(omObjData *object); +void E3BGCreate(omObjData *object); +void E3LightInit(void); + +#endif \ No newline at end of file diff --git a/include/REL/modeltestDll.h b/include/REL/modeltestDll.h index 0715ad9b..d0b4ccc3 100644 --- a/include/REL/modeltestDll.h +++ b/include/REL/modeltestDll.h @@ -35,13 +35,10 @@ extern Point3d Center; extern f32 CZoom; void fn_1_29C(); void fn_1_28F8(Point3d * arg0, Point3d * arg1); -extern void omOutView(); void fn_1_37DC(omObjData*); void fn_1_439C(omObjData*); void fn_1_46F0(); -s16 MGSeqCreate(s16, ...); -void MGSeqParamSet(s16, s16, s16); typedef void (omObjFunc2)(struct om_obj_data *); omObjFunc2 fn_1_F9C; diff --git a/include/ext_math.h b/include/ext_math.h new file mode 100644 index 00000000..2c709a82 --- /dev/null +++ b/include/ext_math.h @@ -0,0 +1,21 @@ +#ifndef _EXT_MATH_H +#define _EXT_MATH_H + +#include "math.h" +#include "dolphin/mtx.h" + +typedef struct vec2f { + float x; + float y; +} Vec2f; + +#define ABS(x) (((x) < 0) ? -(x) : (x)) + +#define VECDistanceXZ(a, b) sqrtf((((a)->x-(b)->x)*((a)->x-(b)->x))+(((a)->z-(b)->z)*((a)->z-(b)->z))) +#define VECMagXZ(a) sqrtf(((a)->x*(a)->x)+((a)->z*(a)->z)) + +#define sind(x) sin(M_PI*(x)/180.0) +#define cosd(x) cos(M_PI*(x)/180.0) +#define atan2d(y, x) (180.0*(atan2((y), (x)) / M_PI)) + +#endif diff --git a/include/game/gamework_data.h b/include/game/gamework_data.h index 35303b96..5b3d2a26 100644 --- a/include/game/gamework_data.h +++ b/include/game/gamework_data.h @@ -310,4 +310,7 @@ static inline void GWPlayerCoinWinSet(s32 player, s16 value) } } +#define GWPlayerCoinWinAdd(player, value) GWPlayerCoinWinSet((player), GWPlayerCoinWinGet((player))+(value)) +#define GWPlayerCoinCollectAdd(player, value) GWPlayerCoinCollectSet((player), GWPlayerCoinCollectGet((player))+(value)) + #endif diff --git a/include/game/minigame_seq.h b/include/game/minigame_seq.h index ba4a2322..4bfd3107 100644 --- a/include/game/minigame_seq.h +++ b/include/game/minigame_seq.h @@ -4,6 +4,43 @@ #include "game/object.h" #include "stdarg.h" +#define MG_SEQ_TYPE_TIMER 1 +#define MG_SEQ_TYPE_AUTO 3 +#define MG_SEQ_TYPE_1VS3 4 +#define MG_SEQ_TYPE_WIN 5 +#define MG_SEQ_TYPE_BATTLE 6 +#define MG_SEQ_TYPE_STORY 7 +#define MG_SEQ_TYPE_4P 8 +#define MG_SEQ_TYPE_2VS2 9 +#define MG_SEQ_TYPE_PINBALL 10 +#define MG_SEQ_TYPE_BOWSER 11 +#define MG_SEQ_TYPE_ALTWIN 12 +#define MG_SEQ_TYPE_DRAW 13 +#define MG_SEQ_TYPE_RECORD 14 + +#define MG_SEQ_WIN_TYPE_WIN 3 +#define MG_SEQ_WIN_TYPE_LOSE 4 +#define MG_SEQ_WIN_TYPE_CHAMPION 5 + +#define MG_SEQ_WORD_START 0 +#define MG_SEQ_WORD_FINISH 1 +#define MG_SEQ_WORD_DRAW 2 + +#define MGSeqTimerCreate(value) MGSeqCreate(MG_SEQ_TYPE_TIMER, (value), -1, -1) +#define MGSeqTimerCreateXY(value, x, y) MGSeqCreate(MG_SEQ_TYPE_TIMER, (value), (int)(x), (int)(y)) +#define MGSeqStartCreate() MGSeqCreate(MG_SEQ_TYPE_AUTO, MG_SEQ_WORD_START) +#define MGSeqFinishCreate() MGSeqCreate(MG_SEQ_TYPE_AUTO, MG_SEQ_WORD_FINISH) +#define MGSeqDrawCreate() MGSeqCreate(MG_SEQ_TYPE_AUTO, MG_SEQ_WORD_DRAW) +#define MGSeqStartCreateType(type) MGSeqCreate((type), MG_SEQ_WORD_START) +#define MGSeqFinishCreateType(type) MGSeqCreate((type), MG_SEQ_WORD_FINISH) +#define MGSeqDrawCreateType(type) MGSeqCreate((type), MG_SEQ_WORD_DRAW) +#define MGSeqWinCreate(player_1, player_2, player_3, player_4) MGSeqCreate(MG_SEQ_TYPE_WIN, MG_SEQ_WIN_TYPE_WIN, (player_1), (player_2), (player_3), (player_4)) +#define MGSeqLoseCreate(player_1, player_2, player_3, player_4) MGSeqCreate(MG_SEQ_TYPE_WIN, MG_SEQ_WIN_TYPE_LOSE, (player_1), (player_2), (player_3), (player_4)) +#define MGSeqChampionCreate(player_1, player_2, player_3, player_4) MGSeqCreate(MG_SEQ_TYPE_ALTWIN, MG_SEQ_WIN_TYPE_CHAMPION, (player_1), (player_2), (player_3), (player_4)) +#define MGSeqRecordCreate(value) MGSeqCreate(MG_SEQ_TYPE_RECORD, (value)) + + + typedef struct seq_work SeqWork; typedef int (*SeqUpdateFunc)(SeqWork *work); diff --git a/src/REL/E3setupDLL/main.c b/src/REL/E3setupDLL/main.c new file mode 100644 index 00000000..fc5b2372 --- /dev/null +++ b/src/REL/E3setupDLL/main.c @@ -0,0 +1,1702 @@ +#include "game/object.h" +#include "game/audio.h" +#include "game/gamework_data.h" +#include "game/hsfman.h" +#include "game/wipe.h" +#include "game/pad.h" +#include "game/hsfmotion.h" +#include "game/init.h" +#include "game/minigame_seq.h" +#include "game/chrman.h" +#include "game/sprite.h" +#include "game/window.h" +#include "ext_math.h" + +#include "REL/E3SetupDLL.h" + +static struct { + s16 playerCnt; + s16 rumble; + s16 mode; + s16 board; + s16 port[4]; + s16 character[4]; +} configE3; + +E3Pad e3PadData[4]; +s16 e3PadCtrl; +s16 e3ConfigPlayerCnt; +static s32 e3EvtNo; +s32 e3ExitEnableF; +s32 lbl_2_bss_B0; +OverlayID e3NextOvl; +s32 e3NextEvent; +u32 e3ExitMode; +static s32 needCharKill; +float e3CameraFov; +omObjData *e3MenuMainObj; +omObjData *e3ViewObj; +omObjData *e3OvlWatchObj; +static omObjData *cameraObj; +static omObjData *lbl_2_bss_84[2]; +static omObjData *configModeObj[4]; +omObjData *e3BGObj; +omObjData *lbl_2_bss_6C; +static s16 lightE3; +s16 lbl_2_bss_62[4]; +s16 lbl_2_bss_60; +Vec lbl_2_bss_54; +Vec lbl_2_bss_48; +float lbl_2_bss_44; +s16 lbl_2_bss_40; +s32 lbl_2_bss_3C; +s16 lbl_2_bss_3A; +s16 lbl_2_bss_38; +s16 lbl_2_bss_36; +s16 lbl_2_bss_34; +s16 lbl_2_bss_2A[5]; +static s16 repBtn; + +static Vec shadowPos = { + 0, 12000, 0 +}; + +static Vec shadowTarget = { + 0, 0, 0 +}; + +static Vec shadowUp = { + 0, 0, -1 +}; + +Vec lbl_2_data_274[] = { + 477.5, 500, -425, + -477.5, 500, -425, + 477.5, 500, 425, + -477.5, 500, 425, + 0.11, -1, -0.22, + -0.11, -1, -0.22, + 0.11, -1, 0.22, + -0.11, -1, 0.22, +}; + +static s16 playerCntTbl[] = { + 1, 2, 3, 4 +}; + +static s16 charTbl[] = { + 0, 1, 2, 3, + -1, -1, 6, 7 +}; + +static s32 charSfxTbl[] = { + 295, + 359, + 423, + 487, + 551, + 615, + 679, + 743 +}; + +void ModuleProlog(void) +{ + e3EvtNo = omovlevtno; + HuAudSndGrpSetSet(0); + e3ExitEnableF = 0; + lbl_2_bss_B0 = 0; + e3PadCtrl = 0; + e3NextOvl = 0; + e3NextEvent = 0; + e3ExitMode = 0; + switch(e3EvtNo) { + default: + case 0: + repBtn = 0; + needCharKill = 1; + E3MainInit(); + break; + + case 1: + repBtn = 1; + needCharKill = 0; + E3MGSelectInit(); + break; + } +} + +static void InitCamera(omObjData *object); +static void InitMenuControl(omObjData *object); +static void InitPlayerCnt(omObjData *object); +static void InitCharSel(omObjData *object); +static void InitRumbleCfg(omObjData *object); +static void InitModeSel(omObjData *object); + +void E3MainInit(void) +{ + s32 idx = E3PadRead(); + s32 port; + Process *objman; + if(idx == 0) { + OSReport("No pad detected\n"); + idx++; + } + e3ConfigPlayerCnt = idx; + configE3.playerCnt = idx-1; + port = (GWRumbleGet()) ? 1 : 0; + configE3.rumble = port; + configE3.mode = 0; + configE3.board = 0; + for(port=0,idx=0; port<4; idx++, port++) { + while(idx < 8) { + if(charTbl[idx] >= 0) { + break; + } + idx++; + } + configE3.character[port] = idx; + } + for(port=0,idx=0; port<4; port++) { + if(!e3PadData[port].enable) { + configE3.port[idx] = port; + if(idx == 0) { + e3PadCtrl = port; + } + idx++; + } + } + for(port=0; port<4; port++) { + if(e3PadData[port].enable) { + configE3.port[idx] = port; + idx++; + } + } + HuSysVWaitSet(1); + objman = omInitObjMan(80, 8192); + + HuWinInit(1); + CRot.x = -4; + CRot.y = 0; + CRot.z = 0; + Center.x = 0; + Center.y = 160; + Center.z = 0; + CZoom = 1960; + e3CameraFov = 40; + Hu3DCameraCreate(1); + Hu3DCameraPerspectiveSet(1, e3CameraFov, 100, 25000, 4.0f/3.0f); + Hu3DShadowCreate(e3CameraFov*0.3f, 100, 25000); + Hu3DShadowTPLvlSet(0.6f); + Hu3DShadowPosSet(&shadowPos, &shadowUp, &shadowTarget); + e3ViewObj = omAddObjEx(objman, 32730, 0, 0, -1, omOutView); + cameraObj = omAddObjEx(objman, 199, 0, 0, -1, InitCamera); + e3OvlWatchObj = omAddObjEx(objman, 200, 0, 0, -1, E3OvlWatchInit); + e3MenuMainObj = omAddObjEx(objman, 10, 0, 0, -1, InitMenuControl); + e3BGObj = omAddObjEx(objman, 20, 0, 0, -1, E3BGCreate); + configModeObj[0] = omAddObjEx(objman, 30, 0, 0, -1, InitPlayerCnt); + configModeObj[0]->work[0] = 1; + configModeObj[1] = omAddObjEx(objman, 30, 0, 0, -1, InitCharSel); + configModeObj[2] = omAddObjEx(objman, 30, 0, 0, -1, InitRumbleCfg); + configModeObj[3] = omAddObjEx(objman, 30, 0, 0, -1, InitModeSel); + E3LightInit(); + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, -1); +} + +void E3LightInit(void) +{ + s32 i; + lightE3 = lbl_2_bss_60 = -1; + for(i=0; i<4; i++) { + lbl_2_bss_62[i] = -1; + } + lbl_2_bss_54.x = 0; + lbl_2_bss_54.y = 1500; + lbl_2_bss_54.z = 0; + lbl_2_bss_48.x = 0; + lbl_2_bss_48.y = -1; + lbl_2_bss_48.z = 0; + lbl_2_bss_44 = 26; + lbl_2_bss_40 = 4; + lightE3 = Hu3DGLightCreate(0, 1500, 0, 0, -1, 0, 255, 255, 255); + Hu3DGLightStaticSet(lightE3, 1); + Hu3DGLightInfinitytSet(lightE3); +} + +static float GetStickX(s8 value) +{ + float new_value; + if(value > 69) { + value = 69; + } else if(value < -69) { + value = -69; + } + new_value = value; + new_value /= 69; + return new_value; +} + +static s16 GetStickY(s8 value) +{ + float new_value; + if(value > 69) { + value = 69; + } else if(value < -69) { + value = -69; + } + new_value = value; + new_value *= 255.0f/69; + return new_value; +} + +static u16 GetBtn(s16 player) +{ + u16 value; + if(repBtn) { + value = HuPadDStkRep[player]; + value |= HuPadBtnRep[player]; + } else { + value = HuPadDStk[player]; + value |= HuPadBtn[player]; + } + return value; +} + +static u16 GetBtnDown(u16 button, u16 buttonLast) +{ + u16 down = PADButtonUp(button, buttonLast); + return down; +} + +u16 E3PadUpdate(s16 player, E3Pad *pad) +{ + pad->enable = HuPadStatGet(player); + if(!pad->enable) { + u16 btn = GetBtn(player); + pad->btnDown = PADButtonUp(btn, pad->btn); + pad->btn = btn; + } else { + pad->btnDown = pad->btn = 0; + } + return pad->btnDown; +} + +s16 E3PadRead(void) +{ + s16 i; + s16 players; + for(i=0, players=0; i<4; i++) { + E3PadUpdate(i, &e3PadData[i]); + if(!e3PadData[i].enable) { + players++; + } + } + return players; +} + +float MotionMaxTimeGet(s16 arg0) +{ + MotionData *temp_r31 = &Hu3DMotion[arg0]; + HsfMotion *temp_r30; + s16 temp_r29; + + temp_r30 = temp_r31->unk_04->motion; + temp_r29 = temp_r30->len; + return temp_r29; +} + + +float MotionShiftTimeGet(s16 arg0) +{ + ModelData *temp_r31 = &Hu3DData[arg0]; + + return temp_r31->unk_84; +} + +static void UpdateMenuControl(omObjData *object); + +static void InitMenuControl(omObjData *object) +{ + HuAudSeqPlay(43); + lbl_2_bss_3C = 0; + lbl_2_bss_3A = -1; + lbl_2_bss_36 = 30; + lbl_2_bss_34 = 0; + object->func = UpdateMenuControl; + worstVcount = 0; + object->work[0] = 0; + object->work[1] = 0; + object->work[3] = 0; +} + +static void UpdateMenuControl(omObjData *object) +{ + s32 pos; + + if(e3ExitEnableF) { + return; + } + E3PadRead(); + pos = object->work[1]; + if(pos < 4) { + omObjData *config = configModeObj[pos]; + if(config->work[0] == 0) { + if(config->work[3]) { + pos++; + } else { + pos--; + if(pos < 0) { + omOvlHisData *his; + pos=0; + his = omOvlHisGet(1); + omOvlHisChg(1, his->overlay, 1, his->stat); + e3ExitMode = 0; + e3NextOvl = 0; + e3NextEvent = 0; + e3ExitEnableF = 1; + } + } + + if(pos < 4) { + configModeObj[pos]->work[0] = 1; + } + } + object->work[1] = pos; + } + if(pos >= 4) { + s32 playerCnt; + e3ExitMode = 2; + if(configE3.mode != 0) { + e3NextOvl = OVL_E3SETUP; + e3NextEvent = 1; + } else { + if(configE3.board != 0) { + e3NextOvl = OVL_W02; + } else { + e3NextOvl = OVL_W01; + } + } + GWRumbleSet(configE3.rumble); + playerCnt = playerCntTbl[configE3.playerCnt]; + for(pos=0; pos<4; pos++) { + s16 character; + GWPlayerCfg[pos].pad_idx = configE3.port[pos]; + character = configE3.character[pos]; + GWPlayerCfg[pos].character = character; + if(configE3.mode == 0) { + HuAudFXPlay(charSfxTbl[character]); + } + GWPlayerCfg[pos].group = pos; + if(pos < playerCnt) { + GWPlayerCfg[pos].iscom = 0; + } else { + GWPlayerCfg[pos].iscom = 1; + } + } + e3ExitEnableF = 1; + } +} + +static void UpdateOvlWatch(omObjData *object) +{ + s32 i; + if(WipeStatGet()) { + return; + } + if(!MGSeqDoneCheck()) { + return; + } + HuSysVWaitSet(1); + if(needCharKill) { + CharKill(-1); + for(i=0; i<4; i++) { + CharARAMOpen(GWPlayerCfg[i].character); + } + } + if(e3ExitMode == 1) { + omOvlGotoEx(e3NextOvl, 1, e3NextEvent, 0); + } else if(e3ExitMode == 2) { + omOvlCallEx(e3NextOvl, 1, e3NextEvent, 0); + } else { + omOvlReturnEx(e3NextOvl+1, 1); + } +} + +void E3OvlWatchInit(omObjData *object) +{ + if(e3ExitEnableF) { + HuAudSeqAllFadeOut(2500); + WipeColorSet(0, 0, 0); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1); + MGSeqKillAll(); + object->func = UpdateOvlWatch; + } +} + +typedef struct e3_player_cnt_work { + AnimData *frame[3]; + AnimData *arrow; + AnimData *arrowHilite; + Vec2f winSize; + s16 frameGroup; + s16 arrowGroupL; + s16 arrowGroupR; + s16 unk22[6]; + s16 winHeader; + s16 winPlayer; + s16 playerCnt; + s16 playerCntOld; +} E3PlayerCntWork; + +static s16 lbl_2_data_31E[] = { + 35, 38, 41, 44 +}; + +static u32 playerCntMessTbl[] = { + 0x00220002, + 0x00220003, + 0x00220004, + 0x00220001 +}; + +static void UpdatePlayerCnt(omObjData *object) +{ + E3PlayerCntWork *work = object->data; + s32 i; + u16 btnDown; + u32 mess; + if(object->work[1] != object->work[0]) { + if(object->work[0] == 0) { + object->work[2] = 4; + } else { + object->work[2] = 3; + } + object->work[1] = object->work[0]; + } + btnDown = e3PadData[e3PadCtrl].btnDown; + switch(object->work[2]) { + case 0: + break; + case 1: + if(btnDown & PAD_BUTTON_A) { + HuAudFXPlay(1); + configE3.playerCnt = work->playerCnt; + object->work[0] = 0; + object->work[3] = 1; + } else if(btnDown & PAD_BUTTON_B) { + HuAudFXPlay(3); + work->playerCnt = configE3.playerCnt; + object->work[0] = 0; + object->work[3] = 0; + } else { + if(e3ConfigPlayerCnt) { + if(btnDown & PAD_BUTTON_LEFT) { + HuAudFXPlay(0); + work->playerCnt--; + if(work->playerCnt < 0) { + work->playerCnt = e3ConfigPlayerCnt-1; + if(work->playerCnt < 0) { + work->playerCnt = 0; + } + } + } else if(btnDown & PAD_BUTTON_RIGHT) { + HuAudFXPlay(0); + work->playerCnt++; + if(work->playerCnt >= e3ConfigPlayerCnt) { + work->playerCnt = 0; + } + } + } else { + work->playerCnt = 0; + } + } + break; + + case 3: + HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + if(e3ConfigPlayerCnt > 1) { + for(i=0; i<2; i++) { + HuSprAttrReset(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF); + HuSprAttrReset(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF); + } + } + object->work[2] = 1; + break; + + case 4: + HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + for(i=0; i<2; i++) { + HuSprAttrSet(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF); + } + object->work[2] = 0; + break; + } + if(work->playerCntOld != work->playerCnt) { + float size[2]; + mess = playerCntMessTbl[work->playerCnt]; + HuWinMesMaxSizeGet(1, size, mess); + HuWinCenterPosSet(work->winPlayer, (work->winSize.x-size[0])/-2.0f, (work->winSize.y-size[1])/-2.0f); + HuWinMesSet(work->winPlayer, mess); + work->playerCntOld = work->playerCnt; + } +} + +static void InitPlayerCnt(omObjData *object) +{ + E3PlayerCntWork *work; + s16 index2; + s32 index; + s16 group; + AnimData *anim; + u32 mess; + float sizeMax[2]; //FIXME: Change to Vec2f + float size[2]; //FIXME: Change to Vec2f + + omSetStatBit(object, 0x100); + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3PlayerCntWork), MEMORY_DEFAULT_NUM); + work = object->data; + index = 0; + group = HuSprGrpCreate(3); + work->frameGroup = group; + HuSprGrpPosSet(group, 288, 80); + anim = HuSprAnimRead(HuDataReadNum(2, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 30008, 0); + HuSprGrpMemberSet(group, index, index2); + HuSprTPLvlSet(group, index, 0.5f); + index++; + anim = HuSprAnimRead(HuDataReadNum(1, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 30000, 0); + HuSprGrpMemberSet(group, index, index2); + index++; + anim = HuSprAnimRead(HuDataReadNum(3, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 1, 0); + HuSprGrpMemberSet(group, index, index2); + HuSprTPLvlSet(group, index, 0.4f); + anim = HuSprAnimRead(HuDataReadNum(12, MEMORY_DEFAULT_NUM)); + work->arrow = anim; + work->arrowHilite = HuSprAnimRead(HuDataReadNum(13, MEMORY_DEFAULT_NUM)); + group = HuSprGrpCreate(2); + work->arrowGroupL = group; + HuSprGrpPosSet(group, 140, 96); + index2 = HuSprCreate(anim, 4, 0); + HuSprGrpMemberSet(group, 0, index2); + index2 = HuSprCreate(work->arrowHilite, 6, 0); + HuSprGrpMemberSet(group, 1, index2); + HuSprTPLvlSet(group, 1, 0.5f); + HuSprPosSet(group, 1, 0, -4); + group = HuSprGrpCreate(2); + work->arrowGroupR = group; + HuSprGrpPosSet(group, 436, 96); + index2 = HuSprCreate(anim, 4, 1); + HuSprGrpMemberSet(group, 0, index2); + index2 = HuSprCreate(work->arrowHilite, 6, 1); + HuSprGrpMemberSet(group, 1, index2); + HuSprTPLvlSet(group, 1, 0.5f); + HuSprPosSet(group, 1, 0, -4); + index2 = work->arrowGroupL; + for(index=0; index<2; index++) { + HuSprAttrSet(group, index, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(index2, index, HUSPR_ATTR_DISPOFF); + } + HuWinMesMaxSizeGet(1, sizeMax, 0x220000); + index2 = HuWinCreate(-10000, 26, sizeMax[0], sizeMax[1], 0); + work->winHeader = index2; + HuWinMesColSet(index2, 4); + HuWinBGTPLvlSet(index2, 0); + HuWinMesSpeedSet(index2, 0); + HuWinMesSet(index2, 0x220000); + work->playerCntOld = work->playerCnt = configE3.playerCnt; + mess = playerCntMessTbl[work->playerCnt]; + HuWinMesMaxSizeGet(4, sizeMax, 0x220001, 0x220002, 0x220003, 0x220004); + index2 = HuWinCreate(-10000, 58, sizeMax[0], sizeMax[1], 0); + work->winPlayer = index2; + work->winSize = *(Vec2f *)(sizeMax); //FIXME: Remove Cast + HuWinBGTPLvlSet(index2, 0); + HuWinMesSpeedSet(index2, 0); + HuWinMesMaxSizeGet(1, size, mess); + HuWinCenterPosSet(index2, (sizeMax[0]-size[0])/-2.0f, (sizeMax[1]-size[1])/-2.0f); + HuWinMesSet(index2, mess); + if(object->work[0] == 1) { + HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + if(e3ConfigPlayerCnt > 1) { + group = work->arrowGroupR; + index2 = work->arrowGroupL; + for(index=0; index<2; index++) { + HuSprAttrReset(group, index, HUSPR_ATTR_DISPOFF); + HuSprAttrReset(index2, index, HUSPR_ATTR_DISPOFF); + } + } + object->work[1] = 1; + object->work[2] = 1; + } + object->func = UpdatePlayerCnt; + (void)object; +} + +typedef struct e3_char_sel_work { + AnimData *anims[24]; + s16 frameGroup; + s16 charGroup; + s16 cursorGroup; + s16 hiliteGroup; + s16 unk68[6]; + s16 cursorPos[4]; + s16 cursorStat[4]; + s16 currPlayer; +} E3CharSelWork; + +static Vec2f charPosTbl[] = { + 85, 248, + 143, 248, + 201, 248, + 259, 248, + 317, 248, + 375, 248, + 433, 248, + 491, 248 +}; + +static s32 charComSfxTbl[] = { + 294, + 358, + 422, + 486, + 550, + 614, + 678, + 742 +}; + +static void UpdateCharSelCursor(omObjData *object, s32 backF) +{ + s32 i; + E3CharSelWork *work; + s16 cursorPos; + s16 cursorGroup; + s16 playerSpr; + s16 playerCnt; + s16 hiliteGroup; + work = object->data; + cursorGroup = work->cursorGroup; + hiliteGroup = work->hiliteGroup; + if(!backF) { + for(i=0; i<7; i++) { + HuSprAttrSet(cursorGroup, i, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(hiliteGroup, i, HUSPR_ATTR_DISPOFF); + } + return; + } + playerCnt = playerCntTbl[configE3.playerCnt]; + for(i=0; icursorStat[i]) { + cursorPos = 1; + } + HuSprBankSet(cursorGroup, i, cursorPos); + cursorPos = work->cursorPos[i]; + HuSprPosSet(cursorGroup, i, charPosTbl[cursorPos].x, charPosTbl[cursorPos].y); + HuSprAttrReset(cursorGroup, i, HUSPR_ATTR_DISPOFF); + } + for(; i<4; i++) { + cursorPos = 0; + playerSpr = (4+i)-(s32)playerCnt; + if(work->cursorStat[i] != 0) { + if(work->cursorStat[i] == 3) { + cursorPos = 1; + } + HuSprBankSet(cursorGroup, playerSpr, cursorPos); + cursorPos = work->cursorPos[i]; + HuSprPosSet(cursorGroup, playerSpr, charPosTbl[cursorPos].x, charPosTbl[cursorPos].y); + HuSprAttrReset(cursorGroup, playerSpr, HUSPR_ATTR_DISPOFF); + } else { + HuSprAttrSet(cursorGroup, playerSpr, HUSPR_ATTR_DISPOFF); + } + } +} + +static s32 UpdateCharSelPlayerCursor(omObjData *object) +{ + E3CharSelWork *temp_r31; + s32 temp_r30; + s16 temp_r29; + s32 temp_r28; + s16 temp_r27; + s32 temp_r26; + s16 temp_r25; + s16 temp_r24; + s16 temp_r23; + s32 temp_r22; + s16 temp_r21; + s16 temp_r20; + s16 temp_r19; + s16 temp_r18; + s16 sp8[8]; + temp_r31 = object->data; + temp_r22 = 0; + temp_r23 = playerCntTbl[configE3.playerCnt]; + temp_r24 = 0; + temp_r20 = 0; + for(temp_r30=0; temp_r30 < temp_r23; temp_r30++) { + temp_r19 = configE3.port[temp_r30]; + if(e3PadData[temp_r19].enable) { + if(temp_r31->cursorStat[temp_r30] == 0) { + temp_r31->cursorStat[temp_r30] = 1; + } + temp_r24++; + continue; + } + temp_r25 = e3PadData[temp_r19].btnDown; + if(temp_r25 & PAD_BUTTON_A) { + HuAudFXPlay(1); + temp_r28 = charTbl[temp_r31->cursorPos[temp_r30]]; + HuAudFXPlay(charComSfxTbl[temp_r28]); + temp_r31->cursorStat[temp_r30] = 1; + } else if(temp_r25 & PAD_BUTTON_B) { + HuAudFXPlay(3); + if(temp_r30 == e3PadCtrl && temp_r31->cursorStat[temp_r30] == 0) { + temp_r20 = 1; + } + temp_r31->cursorStat[temp_r30] = 0; + } + if(temp_r31->cursorStat[temp_r30] != 0) { + temp_r24++; + continue; + } + if(temp_r25 & (PAD_BUTTON_LEFT|PAD_BUTTON_RIGHT)) { + temp_r27 = 0; + for(temp_r28=0; temp_r28<8; temp_r28++) { + if(charTbl[temp_r28] >= 0) { + if(temp_r28 == temp_r31->cursorPos[temp_r30]) { + temp_r29 = temp_r27; + sp8[temp_r27++] = temp_r28; + } else { + for(temp_r26=0; temp_r26cursorPos[temp_r26] == temp_r28) { + break; + } + } + if(temp_r26 >= temp_r23) { + sp8[temp_r27++] = temp_r28; + } + } + } + } + sp8[temp_r27] = -1; + temp_r21 = temp_r27; + temp_r18 = temp_r29; + if(temp_r21 > 1) { + if(temp_r25 & PAD_BUTTON_LEFT) { + HuAudFXPlay(26); + temp_r29--; + if(temp_r29 < 0) { + temp_r29 = temp_r21-1; + } + } else if(temp_r25 & PAD_BUTTON_RIGHT) { + HuAudFXPlay(26); + temp_r29++; + if(temp_r29 >= temp_r21) { + temp_r29 = 0; + } + } + if(temp_r18 != temp_r29) { + temp_r31->cursorPos[temp_r30] = sp8[temp_r29]; + } + } + } + } + if(temp_r24 >= temp_r23) { + temp_r22 = 1; + } + if(temp_r20) { + temp_r22 = -1; + } + return temp_r22; +} + +static s32 UpdateCharSelComCursor(omObjData *object) +{ + E3CharSelWork *temp_r31; + s16 temp_r30; + s16 temp_r29; + s32 temp_r28; + s32 temp_r27; + s16 temp_r26; + s16 temp_r25; + s32 temp_r24; + s16 temp_r23; + s16 temp_r22; + s32 temp_r21; + s16 temp_r20; + s16 temp_r19; + s16 sp8[8]; + temp_r31 = object->data; + temp_r21 = 0; + temp_r20 = playerCntTbl[configE3.playerCnt]; + temp_r19 = 4-temp_r20; + temp_r30 = temp_r20+temp_r31->currPlayer-1; + temp_r31->cursorStat[temp_r30] = 1; + temp_r26 = temp_r31->cursorPos[temp_r30]; + for(temp_r28=0; temp_r28cursorPos[temp_r28] == temp_r26) { + break; + } + } + if(temp_r28= 0) { + if(temp_r27 == temp_r26) { + temp_r29 = temp_r25; + sp8[temp_r25++] = temp_r27; + } else { + for(temp_r24=0; temp_r24cursorPos[temp_r24] == temp_r27) { + break; + } + } + if(temp_r24 >= temp_r30) { + sp8[temp_r25++] = temp_r27; + } + } + } + } + temp_r22 = temp_r25; + if(temp_r26 < 0) { + temp_r29 = 0; + temp_r31->cursorPos[temp_r30] = sp8[temp_r29]; + } + temp_r23 = e3PadData[e3PadCtrl].btnDown; + if(temp_r23 & PAD_BUTTON_A) { + HuAudFXPlay(1); + HuAudFXPlay(charComSfxTbl[charTbl[temp_r31->cursorPos[temp_r30]]]); + temp_r31->cursorStat[temp_r30] = 3; + if(temp_r31->currPlayer >= temp_r19) { + temp_r21 = 1; + } else { + temp_r31->currPlayer++; + } + } else if(temp_r23 & PAD_BUTTON_B) { + HuAudFXPlay(3); + temp_r31->cursorStat[temp_r30] = 0; + temp_r31->currPlayer--; + if(temp_r31->currPlayer != 0) { + temp_r30--; + temp_r31->cursorStat[temp_r30] = 1; + } else { + for(temp_r28=0; temp_r28<4; temp_r28++) { + temp_r31->cursorStat[temp_r28] = 0; + } + } + } else if(temp_r23 & (PAD_BUTTON_LEFT|PAD_BUTTON_RIGHT)) { + temp_r26 = temp_r29; + if(temp_r22 > 1) { + if(temp_r23 & PAD_BUTTON_LEFT) { + HuAudFXPlay(26); + temp_r29--; + if(temp_r29 < 0) { + temp_r29 = temp_r22-1; + } + } else if(temp_r23 & PAD_BUTTON_RIGHT) { + HuAudFXPlay(26); + temp_r29++; + if(temp_r29 >= temp_r22) { + temp_r29 = 0; + } + } + if(temp_r26 != temp_r29) { + temp_r31->cursorPos[temp_r28] = sp8[temp_r29]; + } + } + } + return temp_r21; +} + +static s32 CheckCharSel(omObjData *object) +{ + E3CharSelWork *work; + s32 result; + work = object->data; + result = 0; + if(work->currPlayer == 0) { + result = UpdateCharSelPlayerCursor(object); + if(result == 1) { + if(playerCntTbl[configE3.playerCnt] < 4) { + result = 0; + work->currPlayer++; + } + } + } else { + result = UpdateCharSelComCursor(object); + } + return result; +} + +static void UpdateCharSel(omObjData *object) +{ + s32 i; + E3CharSelWork *work; + u16 btnDown; + work = object->data; + if(object->work[1] != object->work[0]) { + if(object->work[0] == 0) { + object->work[2] = 4; + } else { + object->work[2] = 3; + } + object->work[1] = object->work[0]; + } + btnDown = e3PadData[e3PadCtrl].btnDown; + switch(object->work[2]) { + case 0: + break; + + case 1: + i = CheckCharSel(object); + if(i == 1) { + for(i=0; i<4; i++) { + configE3.character[i] = work->cursorPos[i]; + } + object->work[0] = 0; + object->work[3] = 1; + } else { + if(i < 0) { + for(i=0; i<4; i++) { + work->cursorPos[i] = configE3.character[i]; + } + object->work[0] = 0; + object->work[3] = 0; + } + } + UpdateCharSelCursor(object, 1); + break; + + case 3: + HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + object->work[2] = 1; + if(work->currPlayer != 0) { + i = work->currPlayer+(i = playerCntTbl[configE3.playerCnt]-1); + OSReport("selmode %d %d\n", work->currPlayer, i); + work->cursorStat[i] = 0; + } else { + for(i=0; i<4; i++) { + work->cursorStat[i] = 0; + } + } + UpdateCharSelCursor(object, 1); + break; + + case 4: + HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + object->work[2] = 0; + UpdateCharSelCursor(object, object->work[3]); + break; + } +} + +static s32 charSpriteTbl[] = { + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32 +}; + +static s32 cursorSpriteTbl[] = { + 14, + 15, + 16, + 17, + 18 +}; + +static s32 hiliteSprTbl[] = { + 19, + 20, + 21, + 22, + 23 +}; + +static void InitCharSel(omObjData *object) +{ + E3CharSelWork *work; + s32 i; + s16 member; + s16 group; + AnimData *anim; + s16 sprite; + s16 j; + s16 x; + omSetStatBit(object, 0x100); + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3CharSelWork), MEMORY_DEFAULT_NUM); + work = object->data; + i=0; + member=0; + group = HuSprGrpCreate(3); + work->frameGroup = group; + HuSprGrpPosSet(group, 288, 200); + anim = HuSprAnimRead(HuDataReadNum(2, MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + sprite = HuSprCreate(anim, 30008, 0); + HuSprGrpMemberSet(group, member, sprite); + HuSprTPLvlSet(group, member, 0.5f); + member++; + anim = HuSprAnimRead(HuDataReadNum(1, MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + sprite = HuSprCreate(anim, 30000, 0); + HuSprGrpMemberSet(group, member, sprite); + member++; + anim = HuSprAnimRead(HuDataReadNum(3, MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + sprite = HuSprCreate(anim, 1, 0); + HuSprGrpMemberSet(group, member, sprite); + HuSprTPLvlSet(group, member, 0.4f); + member++; + group = HuSprGrpCreate(16); + work->charGroup = group; + HuSprGrpPosSet(group, 288, 200); + x = -203; + for(j=0; j<8; j++, member++) { + anim = HuSprAnimRead(HuDataReadNum(charSpriteTbl[j], MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + sprite = HuSprCreate(anim, 28010, 0); + HuSprGrpMemberSet(group, j, sprite); + HuSprPosSet(group, j, x, 0); + x += 58; + } + anim = HuSprAnimRead(HuDataReadNum(24, MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + member++; + x = -203; + for(i=0; i<8; i++) { + if(charTbl[i] < 0){ + sprite = HuSprCreate(anim, 28000, 0); + HuSprGrpMemberSet(group, j, sprite); + HuSprPosSet(group, j, x, 0); + HuSprTPLvlSet(group, j, 0.5f); + j++; + } + x += 58; + } + group = HuSprGrpCreate(7); + work->cursorGroup = group; + HuSprGrpPosSet(group, 0, 0); + for(i=0; i<7; i++) { + if(i < 5) { + anim = HuSprAnimRead(HuDataReadNum(cursorSpriteTbl[i], MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + member++; + } + sprite = HuSprCreate(anim, 10010, 0); + HuSprGrpMemberSet(group, i, sprite); + HuSprAttrSet(group, i, HUSPR_ATTR_DISPOFF); + } + group = HuSprGrpCreate(7); + work->hiliteGroup = group; + HuSprGrpPosSet(group, 0, 0); + for(i=0; i<7; i++) { + if(i < 5) { + anim = HuSprAnimRead(HuDataReadNum(hiliteSprTbl[i], MEMORY_DEFAULT_NUM)); + work->anims[member] = anim; + member++; + } + sprite = HuSprCreate(anim, 10000, 0); + HuSprGrpMemberSet(group, i, sprite); + HuSprAttrSet(group, i, HUSPR_ATTR_DISPOFF); + } + for(i=0; i<4; i++) { + work->cursorPos[i] = configE3.character[i]; + work->cursorStat[i] = 0; + } + work->currPlayer = 0; + object->work[1] = 0; + object->work[2] = 0; + object->work[3] = 0; + object->func = UpdateCharSel; +} + +typedef struct e3_rumble_cfg_work { + AnimData *frame[3]; + AnimData *arrow; + AnimData *arrowHilite; + Vec2f winSize; + s16 frameGroup; + s16 arrowGroupL; + s16 arrowGroupR; + s16 unk22[6]; + s16 winHeader; + s16 winValue; + s16 rumbleVal; + s16 rumbleValOld; +} E3RumbleCfgWork; + +static u32 rumbleMess[] = { + 0x220008, + 0x220007 +}; + +static void UpdateRumbleCfg(omObjData *object) +{ + E3RumbleCfgWork *work; + s32 i; + u16 btnDown; + + work = object->data; + if(object->work[1] != object->work[0]) { + if(object->work[0] == 0) { + object->work[2] = 4; + } else { + object->work[2] = 3; + } + object->work[1] = object->work[0]; + } + btnDown = e3PadData[e3PadCtrl].btnDown; + switch(object->work[2]) { + + case 0: + break; + + case 1: + if(btnDown & PAD_BUTTON_A) { + HuAudFXPlay(1); + configE3.rumble = work->rumbleVal; + object->work[0] = 0; + object->work[3] = 1; + } else if(btnDown & PAD_BUTTON_B) { + HuAudFXPlay(3); + work->rumbleVal = configE3.rumble; + object->work[0] = 0; + object->work[3] = 0; + } else if(btnDown & PAD_BUTTON_LEFT) { + HuAudFXPlay(0); + work->rumbleVal--; + if(work->rumbleVal < 0) { + work->rumbleVal = 1; + } + } else if(btnDown & PAD_BUTTON_RIGHT) { + HuAudFXPlay(0); + work->rumbleVal++; + if(work->rumbleVal > 1) { + work->rumbleVal = 0; + } + } + break; + + case 3: + HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + for(i=0; i<2; i++) { + HuSprAttrReset(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF); + HuSprAttrReset(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF); + } + object->work[2] = 1; + break; + + case 4: + HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + for(i=0; i<2; i++) { + HuSprAttrSet(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF); + } + object->work[2] = 0; + break; + } + if(work->rumbleValOld != work->rumbleVal) { + u32 mess; + float size[2]; + mess = rumbleMess[work->rumbleVal]; + HuWinMesMaxSizeGet(1, size, mess); + HuWinCenterPosSet(work->winValue, (work->winSize.x-size[0])/-2.0f, (work->winSize.y-size[1])/-2.0f); + HuWinMesSet(work->winValue, mess); + work->rumbleValOld = work->rumbleVal; + } +} + +static void InitRumbleCfg(omObjData *object) +{ + E3RumbleCfgWork *work; + s16 index2; + s16 group; + s32 index; + AnimData *anim; + u32 mess; + float sizeMax[2]; //FIXME: Change to Vec2f + float size[2]; //FIXME: Change to Vec2f + + omSetStatBit(object, 0x100); + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3RumbleCfgWork), MEMORY_DEFAULT_NUM); + work = object->data; + index = 0; + group = HuSprGrpCreate(3); + work->frameGroup = group; + HuSprGrpPosSet(group, 288, 303); + anim = HuSprAnimRead(HuDataReadNum(8, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 30008, 0); + HuSprGrpMemberSet(group, index, index2); + HuSprTPLvlSet(group, index, 0.5f); + index++; + anim = HuSprAnimRead(HuDataReadNum(7, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 30000, 0); + HuSprGrpMemberSet(group, index, index2); + index++; + anim = HuSprAnimRead(HuDataReadNum(9, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 1, 0); + HuSprGrpMemberSet(group, index, index2); + HuSprTPLvlSet(group, index, 0.4f); + anim = HuSprAnimRead(HuDataReadNum(12, MEMORY_DEFAULT_NUM)); + work->arrow = anim; + work->arrowHilite = HuSprAnimRead(HuDataReadNum(13, MEMORY_DEFAULT_NUM)); + group = HuSprGrpCreate(2); + work->arrowGroupL = group; + HuSprGrpPosSet(group, 240, 319); + index2 = HuSprCreate(anim, 4, 0); + HuSprGrpMemberSet(group, 0, index2); + index2 = HuSprCreate(work->arrowHilite, 6, 0); + HuSprGrpMemberSet(group, 1, index2); + HuSprTPLvlSet(group, 1, 0.5f); + HuSprPosSet(group, 1, 0, -4); + group = HuSprGrpCreate(2); + work->arrowGroupR = group; + HuSprGrpPosSet(group, 336, 319); + index2 = HuSprCreate(anim, 4, 1); + HuSprGrpMemberSet(group, 0, index2); + index2 = HuSprCreate(work->arrowHilite, 6, 1); + HuSprGrpMemberSet(group, 1, index2); + HuSprTPLvlSet(group, 1, 0.5f); + HuSprPosSet(group, 1, 0, -4); + index2 = work->arrowGroupL; + for(index=0; index<2; index++) { + HuSprAttrSet(group, index, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(index2, index, HUSPR_ATTR_DISPOFF); + } + HuWinMesMaxSizeGet(1, sizeMax, 0x220006); + index2 = HuWinCreate(-10000, 267, sizeMax[0], sizeMax[1], 0); + work->winHeader = index2; + HuWinMesColSet(index2, 4); + HuWinBGTPLvlSet(index2, 0); + HuWinMesSpeedSet(index2, 0); + HuWinMesSet(index2, 0x220006); + work->rumbleValOld = work->rumbleVal = configE3.rumble; + mess = rumbleMess[work->rumbleVal]; + HuWinMesMaxSizeGet(2, sizeMax, 0x220007, 0x220008); + index2 = HuWinCreate(-10000, 299, sizeMax[0], sizeMax[1], 0); + work->winValue = index2; + work->winSize = *(Vec2f *)(sizeMax); //FIXME: Remove Cast + HuWinBGTPLvlSet(index2, 0); + HuWinMesSpeedSet(index2, 0); + HuWinMesMaxSizeGet(1, size, mess); + HuWinCenterPosSet(index2, (sizeMax[0]-size[0])/-2.0f, 0); + HuWinMesSet(index2, mess); + object->work[1] = 0; + object->work[2] = 0; + object->work[3] = 0; + object->func = UpdateRumbleCfg; + (void)object; +} + +typedef struct e3_mode_sel_work { + AnimData *frame[7]; + Vec2f winSizeMode; + Vec2f winSizeBoard; + s16 frameGroup; + s16 arrowGroupL; + s16 arrowGroupR; + s16 cursorGroup; + s16 unk34[6]; + s16 winMode; + s16 winBoard; + s16 mode; + s16 modeOld; + s16 board; + s16 boardOld; +} E3ModeSelWork; + +static Vec2f modeSelCursorPosTbl[] = { + 144, 418, + 288, 418 +}; + +static Vec2f boardSelCursorPosTbl[] = { + 94, 418, + 284, 418 +}; + +static void UpdateModeSel(omObjData *object) +{ + E3ModeSelWork *work; + u16 btnDown; + float winSize[2]; + + work = object->data; + if(object->work[1] != object->work[0]) { + if(object->work[0] == 0) { + object->work[2] = 4; + } else { + object->work[2] = 3; + } + object->work[1] = object->work[0]; + } + btnDown = e3PadData[e3PadCtrl].btnDown; + switch(object->work[2]) { + case 0: + break; + + case 1: + if(btnDown & PAD_BUTTON_A) { + HuAudFXPlay(1); + configE3.mode = work->mode; + if(work->mode != 0) { + object->work[0] = 0; + object->work[3] = 1; + } else { + object->work[2] = 2; + work->boardOld = -1; + HuWinMesColSet(work->winMode, 4); + HuWinMesMaxSizeGet(1, winSize, 0x22000F); + HuWinCenterPosSet(work->winMode, (work->winSizeMode.x-winSize[0])/-2.0f, (work->winSizeMode.y-winSize[1])/-2.0f); + HuWinMesSet(work->winMode, 0x22000F); + HuWinMesMaxSizeGet(1, winSize, 0x220010); + HuWinCenterPosSet(work->winBoard, (work->winSizeBoard.x-winSize[0])/-2.0f, (work->winSizeBoard.y-winSize[1])/-2.0f); + HuWinMesSet(work->winBoard, 0x220010); + } + } else if(btnDown & PAD_BUTTON_B) { + HuAudFXPlay(3); + work->mode = configE3.mode; + object->work[0] = 0; + object->work[3] = 0; + } else if(btnDown & PAD_BUTTON_LEFT) { + HuAudFXPlay(0); + work->mode--; + if(work->mode < 0) { + work->mode = 1; + } + } else if(btnDown & PAD_BUTTON_RIGHT) { + HuAudFXPlay(0); + work->mode++; + if(work->mode > 1) { + work->mode = 0; + } + } + break; + + case 2: + if(btnDown & PAD_BUTTON_A) { + HuAudFXPlay(1); + configE3.board = work->board; + object->work[0] = 0; + object->work[3] = 1; + } else if(btnDown & PAD_BUTTON_B) { + HuAudFXPlay(3); + work->boardOld = work->board; + work->modeOld = -1; + object->work[2] = 1; + HuWinMesColSet(work->winMode, 4); + HuWinMesMaxSizeGet(1, winSize, 0x220009); + HuWinCenterPosSet(work->winMode, (work->winSizeMode.x-winSize[0])/-2.0f, (work->winSizeMode.y-winSize[1])/-2.0f); + HuWinMesSet(work->winMode, 0x220009); + HuWinMesMaxSizeGet(1, winSize, 0x22000A); + HuWinCenterPosSet(work->winBoard, (work->winSizeBoard.x-winSize[0])/-2.0f, (work->winSizeBoard.y-winSize[1])/-2.0f); + HuWinMesSet(work->winBoard, 0x22000A); + } else if(btnDown & PAD_BUTTON_LEFT) { + HuAudFXPlay(0); + work->board--; + if(work->board < 0) { + work->board = 1; + } + } else if(btnDown & PAD_BUTTON_RIGHT) { + HuAudFXPlay(0); + work->board++; + if(work->board > 1) { + work->board = 0; + } + } + break; + + case 3: + HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + HuSprAttrReset(work->cursorGroup, 0, HUSPR_ATTR_DISPOFF); + HuSprAttrReset(work->cursorGroup, 1, HUSPR_ATTR_DISPOFF); + object->work[2] = 1; + break; + + case 4: + HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(work->cursorGroup, 0, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(work->cursorGroup, 1, HUSPR_ATTR_DISPOFF); + object->work[2] = 0; + break; + } + if(object->work[0]) { + if(work->modeOld != work->mode) { + HuSprGrpPosSet(work->cursorGroup, modeSelCursorPosTbl[work->mode].x, modeSelCursorPosTbl[work->mode].y); + work->modeOld = work->mode; + } + if(work->boardOld != work->board) { + HuSprGrpPosSet(work->cursorGroup, boardSelCursorPosTbl[work->board].x, boardSelCursorPosTbl[work->board].y); + work->boardOld = work->board; + } + } +} + +static void InitModeSel(omObjData *object) +{ + E3ModeSelWork *work; + s16 index2; + s32 index; + s16 group; + AnimData *anim; + float size[2]; //FIXME: Change to Vec2f + + omSetStatBit(object, 0x100); + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3ModeSelWork), MEMORY_DEFAULT_NUM); + work = object->data; + index = 0; + group = HuSprGrpCreate(3); + work->frameGroup = group; + HuSprGrpPosSet(group, 288, 398); + anim = HuSprAnimRead(HuDataReadNum(5, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 30008, 0); + HuSprGrpMemberSet(group, index, index2); + HuSprTPLvlSet(group, index, 0.5f); + index++; + anim = HuSprAnimRead(HuDataReadNum(4, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 30000, 0); + HuSprGrpMemberSet(group, index, index2); + index++; + anim = HuSprAnimRead(HuDataReadNum(6, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 1, 0); + HuSprGrpMemberSet(group, index, index2); + HuSprTPLvlSet(group, index, 0.4f); + index++; + work->modeOld = work->mode = configE3.mode; + work->board = work->boardOld = 0; + group = HuSprGrpCreate(2); + work->cursorGroup = group; + HuSprGrpPosSet(group, modeSelCursorPosTbl[work->mode].x, modeSelCursorPosTbl[work->mode].y); + anim = HuSprAnimRead(HuDataReadNum(10, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 10000, 0); + HuSprGrpMemberSet(group, 0, index2); + index++; + anim = HuSprAnimRead(HuDataReadNum(11, MEMORY_DEFAULT_NUM)); + work->frame[index] = anim; + index2 = HuSprCreate(anim, 10008, 0); + HuSprGrpMemberSet(group, 1, index2); + HuSprTPLvlSet(group, 1, 0.5f); + HuSprPosSet(group, 1, 0, -4); + index++; + HuSprAttrSet(group, 0, HUSPR_ATTR_DISPOFF); + HuSprAttrSet(group, 1, HUSPR_ATTR_DISPOFF); + HuWinMesMaxSizeGet(2, &work->winSizeMode.x, 0x220009, 0x22000F); + index2 = HuWinCreate(-10000, 350, work->winSizeMode.x, work->winSizeMode.y, 0); + work->winMode = index2; + HuWinMesColSet(index2, 4); + HuWinBGTPLvlSet(index2, 0); + HuWinMesSpeedSet(index2, 0); + HuWinMesMaxSizeGet(1, size, 0x220009); + HuWinCenterPosSet(index2, (work->winSizeMode.x-size[0])/-2.0f, (work->winSizeMode.y-size[1])/-2.0f); + HuWinMesSet(index2, 0x220009); + HuWinMesMaxSizeGet(2, &work->winSizeBoard.x, 0x22000A, 0x220010); + index2 = HuWinCreate(-10000, 390, work->winSizeBoard.x, work->winSizeBoard.y, 0); + work->winBoard = index2; + HuWinBGTPLvlSet(index2, 0); + HuWinMesSpeedSet(index2, 0); + HuWinMesMaxSizeGet(1, size, 0x22000A); + HuWinCenterPosSet(index2, (work->winSizeBoard.x-size[0])/-2.0f, (work->winSizeBoard.y-size[1])/-2.0f); + HuWinMesSet(index2, 0x22000A); + object->work[0] = 0; + object->work[1] = 0; + object->work[2] = 0; + object->work[3] = 0; + object->func = UpdateModeSel; +} + +#define E3_BG_SPEED 0.5f +#define E3_BG_TILE_W 128 +#define E3_BG_TILE_H 128 +#define E3_BG_TILE_COL 6 +#define E3_BG_TILE_ROW 5 +#define E3_BG_MAX_TILE (E3_BG_TILE_COL*E3_BG_TILE_ROW) + +typedef struct e3_bg_tile { + Vec2f pos; + s16 sprite; +} E3BGTile; + +typedef struct e3_bg_work { + AnimData *anim; + s16 group; + E3BGTile tiles[E3_BG_MAX_TILE]; +} E3BGWork; + +static void E3BGUpdate(omObjData *object) +{ + E3BGTile *tile; + s32 i; + E3BGWork *work; + s16 group; + work = object->data; + tile = &work->tiles[0]; + group = work->group; + for(i=0; ipos.x -= E3_BG_SPEED; + if(tile->pos.x <= -(E3_BG_TILE_W/2)) { + tile->pos.x += E3_BG_TILE_W*E3_BG_TILE_COL; + } + tile->pos.y -= E3_BG_SPEED; + if(tile->pos.y <= -(E3_BG_TILE_H/2)) { + tile->pos.y += E3_BG_TILE_H*E3_BG_TILE_ROW; + } + HuSprPosSet(group, i, tile->pos.x, tile->pos.y); + } +} + +void E3BGCreate(omObjData *object) +{ + E3BGTile *tile; + E3BGWork *work; + s32 tile_idx; + s16 group; + s16 col; + s16 row; + AnimData *anim; + s16 sprite; + float x; + float y; + + omSetStatBit(object, 0x100); + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3BGWork), MEMORY_DEFAULT_NUM); + work = object->data; + group = HuSprGrpCreate(E3_BG_MAX_TILE); + work->group = group; + anim = HuSprAnimRead(HuDataReadNum(0, MEMORY_DEFAULT_NUM)); + work->anim =anim; + tile = &work->tiles[0]; + tile_idx = 0; + y = E3_BG_TILE_H/2; + for(row=0; rowsprite = sprite; + tile->pos.x = x; + tile->pos.y = y; + tile++; + tile_idx++; + x += E3_BG_TILE_W; + } + y += E3_BG_TILE_H; + } + object->work[0] = 0; + object->work[1] = 0; + object->work[2] = 0; + object->work[3] = 0; + object->func = E3BGUpdate; +} + +typedef struct camera_view_params { + Vec rot; + Vec pos; + float zoom; + float fov; +} CameraViewParams; + +static CameraViewParams camViewTbl[] = { + { + -42, 0, 0, + 0, 50, -57, + 2488, + 30 + }, + { + -90, 0, 0, + 0, 50, 0, + 2990, + 30 + }, + { + -13, 0, 0, + 0, 50, -1025, + 2488, + 30 + } +}; + +static void UpdateCamera(omObjData *object); + +static void InitCamera(omObjData *object) +{ + u32 *work; + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, 3*sizeof(u32), MEMORY_DEFAULT_NUM); + work = object->data; + work[0] = 0; + object->work[0] = 0; + object->work[1] = 0; + object->work[2] = 0; + object->work[3] = 0; + object->func = UpdateCamera; +} + +static void UpdateCamera(omObjData *object) +{ + u32 *work = object->data; + if(object->work[0]) { + if((s32)object->work[0] != 1) { + (void)object; + } else { + CameraViewParams *view = &camViewTbl[object->work[1]]; + CRot = view->rot; + Center = view->pos; + CZoom = view->zoom; + if(e3CameraFov != view->fov) { + e3CameraFov = view->fov; + Hu3DCameraPerspectiveSet(1, e3CameraFov, 100, 25000, 4.0f/3.0f); + } + } + object->work[0] = 0; + } + if(object->work[2]) { + (void)object; + } +} + +Vec lbl_2_data_478[] = { + -90, 0, 2990, + -42, -57, 2488, + 9999, 9999, 9999 +}; + +Vec lbl_2_data_49C[] = { + -42, -57, 2488, + -13, -1025, 2350, + 9999, 9999, 9999 +}; + +struct unkstruct_4C0 { + Vec *unk0; + float unk4; +}; + +struct unkstruct_4C0 lbl_2_data_4C0[] = { + lbl_2_data_478, 60, + lbl_2_data_49C, 60 +}; \ No newline at end of file diff --git a/src/REL/E3setupDLL/mgselect.c b/src/REL/E3setupDLL/mgselect.c new file mode 100644 index 00000000..e69de29b diff --git a/src/REL/m407dll/main.c b/src/REL/m407dll/main.c index 0336a620..7be29e78 100644 --- a/src/REL/m407dll/main.c +++ b/src/REL/m407dll/main.c @@ -211,7 +211,7 @@ void fn_1_4E8C(void) { temp_r31 = lbl_1_bss_397C->data; if (temp_r31->unk_06 == -1) { - temp_r31->unk_06 = MGSeqCreate(3, 0); + temp_r31->unk_06 = MGSeqStartCreate(); temp_r31->unk_44 = HuAudSeqPlay(0x46); fn_1_2564(); for (i = 0; i < 4; i++) { @@ -222,7 +222,7 @@ void fn_1_4E8C(void) { MGSeqKill(temp_r31->unk_06); temp_r31->unk_06 = -1; temp_r31->unk_10 = 0x258; - temp_r31->unk_08 = MGSeqCreate(1, temp_r31->unk_10 / 60, -1, -1); + temp_r31->unk_08 = MGSeqTimerCreate(temp_r31->unk_10 / 60); fn_1_1E4(); fn_1_4C3C(3); } @@ -299,7 +299,7 @@ void fn_1_52AC(void) { temp_r31 = lbl_1_bss_397C->data; if (temp_r31->unk_04 == 0) { - temp_r31->unk_06 = MGSeqCreate(3, 1); + temp_r31->unk_06 = MGSeqFinishCreate(); temp_r31->unk_04++; HuAudSeqFadeOut(temp_r31->unk_44, 100); } @@ -362,7 +362,7 @@ void fn_1_5574(void) { temp_r31 = lbl_1_bss_397C->data; if (temp_r31->unk_04 == 0) { GWMGRecordSet(1, fn_1_28D4()); - temp_r31->unk_06 = MGSeqCreate(14, fn_1_28D4()); + temp_r31->unk_06 = MGSeqRecordCreate(fn_1_28D4()); fn_1_5F40(1); temp_r31->unk_04++; return; @@ -384,15 +384,15 @@ void fn_1_5630(void) { } } if (temp_r31->unk_24 == 0) { - temp_r31->unk_06 = MGSeqCreate(3, 2); + temp_r31->unk_06 = MGSeqDrawCreate(); HuAudSStreamPlay(4); } else { - temp_r31->unk_06 = MGSeqCreate(5, 3, fn_1_4C0(temp_r31->unk_1C[0]), fn_1_4C0(temp_r31->unk_1C[1]), fn_1_4C0(temp_r31->unk_1C[2]), fn_1_4C0(temp_r31->unk_1C[3])); + temp_r31->unk_06 = MGSeqWinCreate(fn_1_4C0(temp_r31->unk_1C[0]), fn_1_4C0(temp_r31->unk_1C[1]), fn_1_4C0(temp_r31->unk_1C[2]), fn_1_4C0(temp_r31->unk_1C[3])); for (i = 0; i < ARRAY_COUNT(temp_r31->unk_1C); i++) { if (temp_r31->unk_1C[i] != -1) { fn_1_3C4(temp_r31->unk_1C[i]); - GWPlayerCoinWinSet(temp_r31->unk_1C[i], GWPlayerCoinWinGet(temp_r31->unk_1C[i])+10); - } + GWPlayerCoinWinAdd(temp_r31->unk_1C[i], 10); + } } HuAudSStreamPlay(1); } @@ -500,7 +500,7 @@ void fn_1_5BB0(void) { temp_r31 = lbl_1_bss_397C->data; if (temp_r31->unk_04 == 0) { - temp_r31->unk_06 = MGSeqCreate(3, 2); + temp_r31->unk_06 = MGSeqDrawCreate(); temp_r31->unk_04++; } if (MGSeqStatGet(temp_r31->unk_06) == 0) { diff --git a/src/REL/modeltestDll/main.c b/src/REL/modeltestDll/main.c index e877c495..c2609edb 100644 --- a/src/REL/modeltestDll/main.c +++ b/src/REL/modeltestDll/main.c @@ -11,6 +11,7 @@ #include "game/window.h" #include "game/gamework_data.h" #include "game/sprite.h" +#include "game/minigame_seq.h" #include "REL/modeltestDll.h" @@ -287,7 +288,7 @@ void fn_1_29C(omObjData * arg0) HuSprExecLayerSet(0x40, 1); HuSprGrpDrawNoSet(lbl_1_bss_99C, 0x40); lbl_1_bss_458 = 0x293; - lbl_1_bss_45A[0] = MGSeqCreate(1, lbl_1_bss_458 / 60, -1, -1); + lbl_1_bss_45A[0] = MGSeqTimerCreate(lbl_1_bss_458 / 60); temp_r29 = HuDataSelHeapReadNum(0x120001, 0x10000000, 2); temp_r28 = HuSprAnimRead(temp_r29); lbl_1_bss_888 = Hu3DParManCreate(temp_r28, 0x3E8, &lbl_1_data_208); @@ -505,27 +506,27 @@ void fn_1_F9C(struct om_obj_data * omData) } if ((HuPadBtnDown[0] & PAD_BUTTON_B) != 0) { - var_r30 = MGSeqCreate(teropPatterns.unk0[lbl_1_bss_24], 0); + var_r30 = MGSeqStartCreateType(teropPatterns.unk0[lbl_1_bss_24]); } if ((HuPadBtnDown[0] & PAD_BUTTON_A) != 0) { - var_r30 = MGSeqCreate(teropPatterns.unk0[lbl_1_bss_24], 2); + var_r30 = MGSeqDrawCreateType(teropPatterns.unk0[lbl_1_bss_24]); } if ((HuPadBtnDown[0] & PAD_BUTTON_Y) != 0) { - var_r30 = MGSeqCreate(0xE, 0x3B); + var_r30 = MGSeqRecordCreate(59); } if ((HuPadBtnDown[0] & (PAD_BUTTON_LEFT | PAD_BUTTON_RIGHT | PAD_BUTTON_UP | PAD_BUTTON_DOWN)) != 0) { if ((HuPadBtnDown[0] & PAD_BUTTON_UP) != 0) { - MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, -1, -1, -1); + MGSeqChampionCreate(GWPlayerCfg[0].character, -1, -1, -1); } if ((HuPadBtnDown[0] & PAD_BUTTON_LEFT) != 0) { - MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, GWPlayerCfg[1].character, -1, -1); + MGSeqChampionCreate(GWPlayerCfg[0].character, GWPlayerCfg[1].character, -1, -1); } if ((HuPadBtnDown[0] & PAD_BUTTON_DOWN) != 0) { - MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, GWPlayerCfg[1].character, GWPlayerCfg[2].character, -1); + MGSeqChampionCreate(GWPlayerCfg[0].character, GWPlayerCfg[1].character, GWPlayerCfg[2].character, -1); } if ((HuPadBtnDown[0] & PAD_BUTTON_RIGHT) != 0) { - MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, GWPlayerCfg[1].character, GWPlayerCfg[2].character, GWPlayerCfg[3].character); + MGSeqChampionCreate(GWPlayerCfg[0].character, GWPlayerCfg[1].character, GWPlayerCfg[2].character, GWPlayerCfg[3].character); } } fontcolor = 5; diff --git a/src/REL/w01Dll/mg_item.c b/src/REL/w01Dll/mg_item.c index 5a1b133a..79acc244 100755 --- a/src/REL/w01Dll/mg_item.c +++ b/src/REL/w01Dll/mg_item.c @@ -337,7 +337,7 @@ static void fn_1_E914(omObjData *arg0) { lbl_1_bss_7FC[i]->func = fn_1_FED0; } BoardPlayerMotionShiftSet(lbl_1_bss_7E4, lbl_1_bss_7B8, 0.0f, 5.0f, 0x40000001); - lbl_1_bss_7D6 = MGSeqCreate(3, 0); + lbl_1_bss_7D6 = MGSeqStartCreate(); BoardMusStart(1, 0xE, 0x7F, 0); arg0->func = fn_1_ECD4; } @@ -359,7 +359,7 @@ static void fn_1_ECD4(omObjData *arg0) { arg0->func = fn_1_EED8; lbl_1_bss_7D2 = 5; lbl_1_bss_7D0 = 60; - lbl_1_bss_7D4 = MGSeqCreate(1, lbl_1_bss_7D2, 0x120, 0x40); + lbl_1_bss_7D4 = MGSeqTimerCreateXY(lbl_1_bss_7D2, 288, 64); } BoardModelMotionSpeedSet(lbl_1_bss_6C4[17], lbl_1_bss_7EC); BoardModelMotionSpeedSet(lbl_1_bss_6C4[18], lbl_1_bss_7E8); diff --git a/src/REL/w03Dll/mg_coin.c b/src/REL/w03Dll/mg_coin.c index e9238dc7..a52e5570 100644 --- a/src/REL/w03Dll/mg_coin.c +++ b/src/REL/w03Dll/mg_coin.c @@ -209,7 +209,7 @@ void fn_1_8140(s32 arg0) { fn_1_81E0(arg0); BoardMusStart(1, 0x16, 0x7F, 0); - temp_r31 = MGSeqCreate(3, 0); + temp_r31 = MGSeqStartCreate(); while (MGSeqStatGet(temp_r31)) { HuPrcVSleep(); @@ -305,7 +305,7 @@ void fn_1_84A8(s32 arg0) { temp_r31 = OM_GET_WORK_PTR(lbl_1_bss_144, someBits3); temp_r31->unk00_bit1 = arg0; if (arg0 == 0) { - temp_r31->unk_04 = MGSeqCreate(1, temp_r31->unk2, 0x120, 0x40); + temp_r31->unk_04 = MGSeqTimerCreateXY(temp_r31->unk2, 288, 64); } } } diff --git a/src/REL/w03Dll/mg_item.c b/src/REL/w03Dll/mg_item.c index ea7c19b3..4a4ab195 100644 --- a/src/REL/w03Dll/mg_item.c +++ b/src/REL/w03Dll/mg_item.c @@ -345,7 +345,7 @@ void fn_1_A44C(s32 arg0) { s32 temp_r28; BoardMusStart(1, 0x17, 0x7F, 0); - temp_r30 = MGSeqCreate(3, 0); + temp_r30 = MGSeqStartCreate(); while (MGSeqStatGet(temp_r30) != 0) { HuPrcVSleep(); @@ -434,7 +434,7 @@ void fn_1_A7A0(s32 arg0) { temp_r31->unk00_bit1 = 0; temp_r31->unk1 = 5U; temp_r31->unk2 = 0x3C; - temp_r31->unk4 = MGSeqCreate(1, temp_r31->unk1, 0x120, 0x40); + temp_r31->unk4 = MGSeqTimerCreateXY(temp_r31->unk1, 288, 64); fn_1_BB74(lbl_1_bss_194); lbl_1_bss_18C = fn_1_AE4C(arg0, lbl_1_bss_194); } diff --git a/src/REL/w06Dll/mg_item.c b/src/REL/w06Dll/mg_item.c index cf6d9691..a0e93a6d 100755 --- a/src/REL/w06Dll/mg_item.c +++ b/src/REL/w06Dll/mg_item.c @@ -295,7 +295,7 @@ static void fn_1_15CC(s32 arg0) { s32 var_r31; BoardMusStart(1, 0x26, 0x7F, 0); - temp_r26 = MGSeqCreate(3, 0); + temp_r26 = MGSeqStartCreate(); while (MGSeqStatGet(temp_r26) != 0) { HuPrcVSleep(); } @@ -1072,7 +1072,7 @@ static void fn_1_4070(void) { temp_r31->unk00_field0 = 0; temp_r31->unk01 = 5; temp_r31->unk02 = 60; - temp_r31->unk04 = MGSeqCreate(1, temp_r31->unk01, 0x120, 0x40); + temp_r31->unk04 = MGSeqTimerCreateXY(temp_r31->unk01, 288, 64); } static void fn_1_4124(void) { diff --git a/src/game/minigame_seq.c b/src/game/minigame_seq.c index dceadba4..6834f870 100644 --- a/src/game/minigame_seq.c +++ b/src/game/minigame_seq.c @@ -83,15 +83,15 @@ static s32 seqType2SprTbl[6] = { }; static s16 mgSeqTypeTbl[9] = { - 8, - 4, - 9, - 11, - 6, - 10, - 7, - 11, - 7 + MG_SEQ_TYPE_4P, + MG_SEQ_TYPE_1VS3, + MG_SEQ_TYPE_2VS2, + MG_SEQ_TYPE_BOWSER, + MG_SEQ_TYPE_BATTLE, + MG_SEQ_TYPE_PINBALL, + MG_SEQ_TYPE_STORY, + MG_SEQ_TYPE_BOWSER, + MG_SEQ_TYPE_STORY }; static char lbl_8012F336[] = { @@ -252,9 +252,9 @@ s16 MGSeqCreate(s16 type, ...) s16 ret; va_list params; va_start(params, type); - if(type == 3) { + if(type == MG_SEQ_TYPE_AUTO) { if(GWSystem.mg_next == 0xFFFF) { - type = 8; + type = MG_SEQ_TYPE_4P; } else { type = mgSeqTypeTbl[mgInfoTbl[GWSystem.mg_next].type]; }