mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-25 15:05:09 -04:00
188 lines
4.5 KiB
C
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;
|
|
}
|