Files
ac-decomp/src/m_titledemo.c
T
2024-01-17 13:18:25 -05:00

188 lines
4.5 KiB
C

#include "m_titledemo.h"
#include "m_player.h"
#include "m_player_lib.h"
#include "m_event.h"
#include "m_name_table.h"
#include "m_bgm.h"
#include "m_common_data.h"
#define mTD_HEADER_POSX 0
#define mTD_HEADER_POSY 1
#define mTD_HEADER_POSZ 2
#define mTD_HEADER_ROTATION 3
#define mTD_HEADER_TOOL 4
#define mTD_HEADER_SIZE 5
static int S_now_demono = -1;
static int S_tdemo_frame;
static u16 S_titledemo_to_play;
static u16 get_demo_header(int titledemo_no, int key) {
static u16* pact_data_header_pt[mTD_TITLE_DEMO_NUM] = {
pact0_head_table, pact1_head_table, pact2_head_table, pact3_head_table, pact4_head_table
};
return pact_data_header_pt[titledemo_no][key];
}
extern int mTD_demono_get() {
if (S_now_demono == -1) {
S_now_demono = 1;
}
else {
S_now_demono++;
if (S_now_demono > mTD_TITLE_DEMO_NUM) {
S_now_demono = 1;
}
}
return S_now_demono;
}
extern void mTD_player_keydata_init(GAME_PLAY* play) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
if (mEv_CheckTitleDemo() > 0) {
u16 angle;
mActor_name_t tool = get_demo_header(mEv_CheckTitleDemo() - 1, mTD_HEADER_TOOL);
if (tool == ITM_AXE) {
tool = ITM_AXE;
}
else if (tool == ITM_ROD) {
tool = ITM_ROD;
}
else if (tool == ITM_UMBRELLA00) {
tool = ITM_UMBRELLA00;
}
mPlib_SetData2_controller_data_for_title_demo(tool);
angle = get_demo_header(mEv_CheckTitleDemo() - 1, mTD_HEADER_ROTATION);
player->actor_class.shape_info.rotation.y = angle;
player->actor_class.world.angle.y = angle;
}
S_tdemo_frame = 0;
}
static u16 get_tdemo_keydata(int frame) {
/* BUG: this was probably meant to be marked as static */
u16* pact_data_keydata_pt[mTD_TITLE_DEMO_NUM] = { pact0_key_data, pact1_key_data, pact2_key_data, pact3_key_data, pact4_key_data };
return pact_data_keydata_pt[mEv_CheckTitleDemo() - 1][frame];
}
#define mTD_KEYDATA_A(d) ((d) & 1)
#define mTD_KEYDATA_B(d) (((d) >> 8) & 1)
#define mTD_KEYDATA_STICKX(d) (((s16)(d) & 0xFE00) / 512)
#define mTD_KEYDATA_STICKY(d) (((s16)((d) << 8) & 0xFE00) / 512)
/* @nonmatching */
static void set_player_demo_keydata(int frame) {
u16 keydata0;
u16 keydata1;
int k0_sx;
int k0_sy;
int k1_sx;
int k1_sy;
f32 stick_x;
f32 stick_y;
int btn_a;
int btn_b;
int f0;
int f1;
/* convert 60fps framerate to 30fps input */
f0 = frame / 2;
f1 = f0 + (frame % 2);
if (f0 != f1 && f1 < 1800) {
keydata0 = get_tdemo_keydata(f0);
keydata1 = get_tdemo_keydata(f1);
k0_sx = (s16)(keydata0 & 0xFE00) / 512;
k0_sy = (s16)((keydata0 & 0x00FE) << 8) / 512;
k1_sx = (s16)(keydata1 & 0xFE00) / 512;
k1_sy = (s16)((keydata1 & 0x00FE) << 8) / 512;
/* blend stick inputs between the current frame & next frame */
stick_x = ((f32)(s8)k0_sx + (f32)(s8)k1_sx) / 2.0f;
stick_y = ((f32)(s8)k0_sy + (f32)(s8)k1_sy) / 2.0f;
btn_a = mTD_KEYDATA_A(keydata0);
btn_b = mTD_KEYDATA_B(keydata0);
}
else {
keydata0 = get_tdemo_keydata(f0);
k0_sx = (s16)(keydata0 & 0xFE00) / 512;
k0_sy = (s16)((keydata0 & 0x00FE) << 8) / 512;
// single line does not make it any better
stick_x = (f32)(s8)k0_sx;
stick_y = (f32)(s8)k0_sy;
btn_a = keydata0 & 1;
btn_b = (keydata0 >> 8) & 1;
}
mPlib_SetData1_controller_data_for_title_demo(stick_x, stick_y, btn_a, btn_b);
}
static void mTD_game_end_init(GAME_PLAY* play) {
play->fb_fade_type = 10; // TODO: enum/define
play->fb_wipe_type = 3; // TODO: enum/define
mPlib_request_main_invade_type1(play);
mBGMPsComp_make_ps_wipe(0x521C); // TODO: enum/define
}
extern void title_demo_move(GAME_PLAY* play) {
if (mEv_CheckTitleDemo() > 0) {
set_player_demo_keydata(S_tdemo_frame);
S_tdemo_frame++;
if (S_tdemo_frame >= 3600) {
mTD_game_end_init(play);
}
}
}
extern void mTD_rtc_set() {
if (S_titledemo_to_play == TRUE) {
S_titledemo_to_play = FALSE;
if (Common_Get(time.rtc_crashed) == TRUE) {
lbRTC_TimeCopy(Common_GetPointer(time.rtc_time), Common_GetPointer(newly_set_time));
}
else {
lbRTC_GetTime(Common_GetPointer(time.rtc_time));
}
Common_Set(time.rtc_enabled, TRUE);
mTM_set_season();
}
}
extern void mTD_rtc_reserve() {
S_titledemo_to_play = TRUE;
}
extern int mTD_get_titledemo_no() {
int titledemo_no = S_now_demono;
if (titledemo_no <= 0) {
titledemo_no = 1;
}
return titledemo_no - 1;
}
extern int mTD_tdemo_button_ok_check() {
int res = TRUE;
if (S_tdemo_frame >= 3530) {
res = FALSE;
}
return res;
}