summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/67E840.h6
-rw-r--r--include/683030.h22
-rw-r--r--include/69E2C0.h73
-rw-r--r--include/m_common_data.h7
-rw-r--r--include/m_demo.h230
-rw-r--r--include/m_msg_main.h6
-rw-r--r--include/m_player_lib.h26
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt180
-rw-r--r--src/code/m_demo.c928
-rw-r--r--src/code/m_kankyo.c4
-rw-r--r--src/code/m_roll_lib.c2
-rw-r--r--src/overlays/actors/ovl_Dump/ac_dump.c2
-rw-r--r--src/overlays/actors/ovl_Kago/ac_kago.c2
-rw-r--r--src/overlays/actors/ovl_Koinobori/ac_koinobori.c2
-rw-r--r--src/overlays/actors/ovl_Mikuji/ac_mikuji.c2
-rw-r--r--src/overlays/actors/ovl_Nameplate/ac_nameplate.c2
-rw-r--r--src/overlays/actors/ovl_Sample/ac_sample.c2
-rw-r--r--src/overlays/actors/ovl_Tama/ac_tama.c2
-rw-r--r--src/overlays/actors/player_actor/m_player.c2
-rw-r--r--src/overlays/actors/player_actor/m_player.h4
-rw-r--r--src/overlays/gamestates/ovl_play/m_play.c4
-rw-r--r--yamls/jp/code.yaml9
22 files changed, 1309 insertions, 208 deletions
diff --git a/include/67E840.h b/include/67E840.h
index 9d52f95..7c38846 100644
--- a/include/67E840.h
+++ b/include/67E840.h
@@ -154,8 +154,8 @@ void mBGMPsComp_make_ps_wipe(s32 arg0);
// void func_8005E8F4_jp();
// void func_8005E9B4_jp();
// void func_8005E9C8_jp();
-// void func_8005E9DC_jp();
-// void func_8005E9F0_jp();
+void mBGMPsComp_volume_talk_start(void);
+void mBGMPsComp_volume_talk_end(void);
// void func_8005EA14_jp();
// void func_8005EA24_jp();
// void func_8005EA38_jp();
@@ -174,7 +174,7 @@ void mBGMPsComp_scene_mode(s32 arg0);
// void func_8005ED78_jp();
// void func_8005ED98_jp();
// void func_8005EDC4_jp();
-// void func_8005EDD8_jp();
+void mBGMForce_inform_end(void);
// void func_8005EDEC_jp();
void mBGMForce_room_nonstop_start(void);
// void func_8005EE20_jp();
diff --git a/include/683030.h b/include/683030.h
index 8e0cf17..be53653 100644
--- a/include/683030.h
+++ b/include/683030.h
@@ -6,11 +6,14 @@
#include "z64math.h"
struct Game_Play;
+struct Actor;
typedef struct Camera2{
/* 0x000 */ xyz_t unk0;
/* 0x00C */ xyz_t unk4;
- /* 0x018 */ UNK_TYPE1 unk18[0x120];
+ /* 0x018 */ UNK_TYPE1 unk18[0x48];
+ /* 0x060 */ s32 unk60;
+ /* 0x0D4 */ UNK_TYPE1 unk64[0xD4];
} Camera2; //size = 0x138
// void func_8005F390_jp();
@@ -66,7 +69,7 @@ xyz_t* Camera2_getMicPos_p(struct Game_Play* game_play);
// void func_80061104_jp();
// void func_80061134_jp();
// void func_80061188_jp();
-// void func_800611D4_jp();
+s32 Camera2_request_main_talk(struct Game_Play* play, struct Actor* speaker, struct Actor* listener, s32 priority);
// void func_80061280_jp();
// void func_8006136C_jp();
// void func_800613DC_jp();
@@ -91,7 +94,7 @@ xyz_t* Camera2_getMicPos_p(struct Game_Play* game_play);
// void func_80062510_jp();
// void func_80062644_jp();
// void func_80062668_jp();
-// void Camera2_request_main_normal();
+s32 Camera2_request_main_normal(struct Game_Play* play, s32 flags, s32 priority);
// void func_800626E4_jp();
// void func_80062760_jp();
// void func_800627A0_jp();
@@ -101,7 +104,7 @@ xyz_t* Camera2_getMicPos_p(struct Game_Play* game_play);
// void func_80062B24_jp();
// void func_80062B74_jp();
// void func_80062BA0_jp();
-// void func_80062C84_jp();
+s32 Camera2_request_main_item(struct Game_Play* play, s32 type, s32 priority);
// void func_80062CD8_jp();
// void func_80062DD8_jp();
// void func_80062E00_jp();
@@ -117,7 +120,7 @@ xyz_t* Camera2_getMicPos_p(struct Game_Play* game_play);
// void func_800631C0_jp();
// void func_800631EC_jp();
// void func_8006328C_jp();
-// void func_800632C8_jp();
+s32 Camera2_request_main_door(struct Game_Play* play, struct Actor* doorActor, u32 flags, s32 priority);
// void func_8006333C_jp();
// void func_8006339C_jp();
// void func_80063468_jp();
@@ -126,18 +129,19 @@ xyz_t* Camera2_getMicPos_p(struct Game_Play* game_play);
// void func_80063608_jp();
// void func_80063628_jp();
// void func_80063674_jp();
-// void func_8006370C_jp();
+s32 Camera2_request_main_simple_kirin(struct Game_Play* play, xyz_t* center, s32 priority);
// void func_800637C8_jp();
// void func_8006393C_jp();
-// void func_800639A0_jp();
+s32 Camera2_request_main_simple(struct Game_Play* play, xyz_t* pos, s_xyz* dir, f32 dist, s32 morphCounter,
+ s32 priority);
// void func_80063A34_jp();
-// void func_80063AA0_jp();
+void Camera2_main_Simple_AngleDistStd(struct Game_Play* play, s_xyz* angle, f32* dist);
// void func_80063B1C_jp();
// void func_80063B8C_jp();
// void func_80063CA0_jp();
// void func_80063D10_jp();
// void func_80063D38_jp();
-// void func_80063D9C_jp();
+s32 Camera2_request_main_listen_front_low_talk(struct Game_Play* play, struct Actor* speaker, struct Actor* listener, s32 priority);
// void func_80063E14_jp();
// void func_80063E94_jp();
// void func_80063EF0_jp();
diff --git a/include/69E2C0.h b/include/69E2C0.h
index 5ce8734..bfa2b16 100644
--- a/include/69E2C0.h
+++ b/include/69E2C0.h
@@ -18,78 +18,5 @@ void Debug_mode_input(struct Input *input);
// void Debug_mode_output_sub();
// void Debug_mode_zelda_malloc_info_output();
void Debug_mode_output(struct GraphicsContext* gfxCtx);
-struct Actor* mDemo_Get_talk_actor(void);
-// void func_8007B44C_jp();
-// void func_8007B49C_jp();
-// void func_8007B4EC_jp();
-void mDemo_Set_msg_num(s32 arg0);
-// void func_8007B5F4_jp();
-// void func_8007B650_jp();
-// void func_8007B670_jp();
-// void func_8007B684_jp();
-// void func_8007B6A4_jp();
-// void func_8007B724_jp();
-// void func_8007B760_jp();
-void mDemo_Set_talk_display_name(s8 arg0);
-// void func_8007B7DC_jp();
-// void func_8007B818_jp();
-// void func_8007B854_jp();
-// void func_8007B890_jp();
-// void func_8007B8CC_jp();
-// void func_8007B908_jp();
-// void func_8007B944_jp();
-void mDemo_Set_talk_window_color(Color_RGBA8* color);
-// void func_8007B9E0_jp();
-void mDemo_Set_camera(s32 arg0);
-// void func_8007BA38_jp();
-// void func_8007BA4C_jp();
-// void func_8007BA84_jp();
-// void func_8007BC28_jp();
-// void func_8007BCE4_jp();
-// void func_8007BD9C_jp();
-// void func_8007BE58_jp();
-// void func_8007C00C_jp();
-// void func_8007C0B4_jp();
-// void func_8007C0C0_jp();
-// void func_8007C104_jp();
-// void func_8007C24C_jp();
-// void func_8007C290_jp();
-// void func_8007C3D8_jp();
-// void func_8007C484_jp();
-// void func_8007C570_jp();
-// void func_8007C5EC_jp();
-// void weight_of_talk_position();
-// void func_8007C808_jp();
-// void func_8007C814_jp();
-// void func_8007C820_jp();
-// void func_8007C844_jp();
-// void func_8007C868_jp();
-// void func_8007C88C_jp();
-// void func_8007C8B0_jp();
-// void func_8007C8D4_jp();
-// void func_8007C8FC_jp();
-// void func_8007C924_jp();
-// void func_8007CB28_jp();
-// void func_8007CB50_jp();
-// void func_8007CBEC_jp();
-// void func_8007CC9C_jp();
-void mDemo_stock_clear(void);
-void mDemo_Request(s32 arg0, struct Actor* actor, void* arg2);
-s32 mDemo_Check(s32 arg0, struct Actor* actor);
-// void func_8007CF34_jp();
-// void func_8007CF44_jp();
-void mDemo_End(struct Actor*);
-void mDemo_Main(struct Game_Play* game_play);
-void func_8007CFD8_jp(struct Game_Play* game_play);
-// void func_8007D030_jp();
-// void func_8007D048_jp();
-// void func_8007D080_jp();
-void mDemo_Set_ListenAble(void);
-// void func_8007D0B0_jp();
-// void func_8007D0C4_jp();
-// void func_8007D0D8_jp();
-s32 mDemo_Check_ListenAble(void);
-s32 mDemo_Check_DiffAngle_forTalk(s16 angle);
-// void func_8007D128_jp();
#endif
diff --git a/include/m_common_data.h b/include/m_common_data.h
index a1527fa..3201dc2 100644
--- a/include/m_common_data.h
+++ b/include/m_common_data.h
@@ -17,6 +17,7 @@
#include "m_snowman.h"
#include "m_clip.h"
#include "m_scene.h"
+#include "m_demo.h"
typedef enum Season {
/* 0 */ SPRING,
@@ -158,7 +159,8 @@ typedef struct CommonData {
/* 0x10752 */ s16 goodsPower;
/* 0x10754 */ DoorData doorData;
/* 0x10764 */ DoorData structureExitDoorData;
- /* 0x1077C */ UNK_TYPE1 unk_1077C[0x24];
+ /* 0x1077C */ DemoRequest startDemoRequest;
+ /* 0x1078C */ DoorData eventDoorData;
/* 0x107A0 */ DoorData famicomEmuDoorData;
/* 0x107B4 */ s8 unk_107B4;
/* 0x107B5 */ s8 floorIdx;
@@ -166,7 +168,8 @@ typedef struct CommonData {
/* 0x107B8 */ UNK_TYPE1 unk_107B8[0x27];
/* 0x107FF*/ s8 paymentType;
/* 0x107E0 */ s8 playerDecoyFlag;
- /* 0x107E1 */ UNK_TYPE1 unk_107E1[0x3];
+ /* 0x107E1 */ s8 unk_107E1;
+ /* 0x107E2 */ s16 unk_107E2;
/* 0x107E4 */ s16 unk_107E4;
/* 0x107E6 */ UNK_TYPE1 unk107E6[0x212];
/* 0x109F8 */ u8 unk109F8;
diff --git a/include/m_demo.h b/include/m_demo.h
new file mode 100644
index 0000000..9f5f7c2
--- /dev/null
+++ b/include/m_demo.h
@@ -0,0 +1,230 @@
+#ifndef M_DEMO_H
+#define M_DEMO_H
+
+#include "ultra64.h"
+#include "color.h"
+#include "m_scene.h"
+
+struct Actor;
+struct Game_Play;
+
+#define DEMO_ORDER_VALUE_MAX 10
+#define DEMO_REQUEST_MAX 32
+
+#define DEMO_MSG_PRIORITY 5
+#define DEMO_CAMERA_PRIORITY 6
+
+#define DEMO_WINDOW_COLOR_R 235
+#define DEMO_WINDOW_COLOR_G 255
+#define DEMO_WINDOW_COLOR_B 235
+#define DEMO_WINDOW_COLOR_A 255
+
+typedef enum DemoState {
+ DEMO_STATE_WAIT,
+ DEMO_STATE_READY,
+ DEMO_STATE_RUN,
+ DEMO_STATE_STOP = 9,
+
+ DEMO_STATE_MAX
+} DemoState;
+
+typedef enum DemoDirection {
+ DEMO_DIRECT_N,
+ DEMO_DIRECT_NE,
+ DEMO_DIRECT_E,
+ DEMO_DIRECT_SE,
+ DEMO_DIRECT_S,
+ DEMO_DIRECT_SW,
+ DEMO_DIRECT_W,
+ DEMO_DIRECT_NW,
+
+ DEMO_DIRECT_MAX
+} DemoDirection;
+
+typedef enum DemoType {
+ DEMO_TYPE_NONE,
+ DEMO_TYPE_SCROLL,
+ DEMO_TYPE_EXITSCENE,
+ DEMO_TYPE_DOOR,
+ DEMO_TYPE_4,
+ DEMO_TYPE_SCROLL2,
+ DEMO_TYPE_DOOR2,
+ DEMO_TYPE_TALK,
+ DEMO_TYPE_SPEAK,
+ DEMO_TYPE_REPORT,
+ DEMO_TYPE_OUTDOOR,
+ DEMO_TYPE_B,
+ DEMO_TYPE_EVENTMSG,
+ DEMO_TYPE_D,
+ DEMO_TYPE_MAX
+} DemoType;
+
+typedef enum DemoOrderType {
+ DEMO_ORDER_PLAYER,
+ DEMO_ORDER_1,
+ DEMO_ORDER_2,
+ DEMO_ORDER_3,
+ DEMO_ORDER_NPC0,
+ DEMO_ORDER_NPC1,
+ DEMO_ORDER_NPC2,
+ DEMO_ORDER_7,
+ DEMO_ORDER_8,
+ DEMO_ORDER_QUEST,
+
+ DEMO_ORDER_MAX
+} DemoOrderType;
+
+typedef void (*DemoRequestFunc)(struct Actor*);
+
+typedef struct DemoClip {
+ void* demoActor;
+ s32 type;
+} DemoClip;
+
+typedef enum DemoClipType {
+ DEMO_CLIP_TYPE_NONE,
+ DEMO_CLIP_TYPE_INTRO_DEMO,
+ DEMO_CLIP_TYPE_RIDE_OFF_DEMO,
+ DEMO_CLIP_TYPE_PRESENT_DEMO,
+ DEMO_CLIP_TYPE_BOAT_DEMO,
+ DEMO_CLIP_TYPE_RESET_DEMO,
+
+ DEMO_CLIP_TYPE_MAX
+} DemoClipType;
+
+typedef struct DemoRequest {
+ struct Actor* actor;
+ s32 type;
+ DemoRequestFunc proc;
+ f32 talkWeight;
+} DemoRequest;
+
+typedef struct DemoDoorData {
+ s32 type;
+ struct houseInfo{
+ f32 size;
+ s32 direct;
+ } houseInfo;
+} DemoDoorData;
+
+typedef struct DemoEMsgData {
+ s32 msgNo;
+ Color_RGBA8 windowColor;
+ s32 msgDelayTimer;
+ s32 sceneDelayTimer;
+ DoorData doorData;
+ UNK_TYPE1 unk_24[0x4];
+} DemoEMsgData;
+
+typedef struct DemoTalkData {
+ s32 msgNo;
+ s32 turn;
+ s32 useZoomSound;
+ s32 displayName;
+ s32 changePlayer;
+ s32 returnDemoWait;
+ Color_RGBA8 windowColor;
+ u8 actorSavedMass;
+} DemoTalkData;
+
+typedef struct DemoData {
+ struct Actor* speaker;
+ struct Actor* listener;
+ s32 isAbleSpeaker;
+ s32 isAbleListener;
+ u16 orderData[DEMO_ORDER_MAX][DEMO_ORDER_VALUE_MAX];
+ s8 changePlayerDestiny;
+ s32 state;
+ DemoRequest current;
+ DemoRequest request[DEMO_REQUEST_MAX];
+ s32 requestId;
+ s32 priorityType;
+ s32 cameraType;
+ s32 keepCameraType;
+
+ union {
+ DemoDoorData door;
+ DemoEMsgData emsg;
+ DemoTalkData talk;
+ } data;
+} DemoData;
+
+extern DemoData* demo;
+
+struct Actor* mDemo_Get_talk_actor(void);
+void mDemo_Set_OrderValue(s32 type, s32 idx, u16 value);
+u16 mDemo_Get_OrderValue(s32 type, s32 idx);
+void mDemo_Init_OrderValue(void);
+void mDemo_Set_msg_num(s32 msgNo);
+s32 mDemo_Get_Talk_Actors(struct Actor** speaker, struct Actor** listener);
+void mDemo_Set_change_player_destiny(s8 destiny);
+s32 mDemo_Get_change_player_destiny(void);
+void mDemo_Clear_change_player_destiny(void);
+void mDemo_Copy_change_player_destiny(void);
+void mDemo_Set_use_zoom_sound(u8 useZoomSound);
+s32 mDemo_Get_use_zoom_sound(void);
+void mDemo_Set_talk_display_name(s8 displayName);
+s32 mDemo_Get_talk_display_name(void);
+void mDemo_Set_talk_change_player(u8 changePlayer);
+s32 mDemo_Get_talk_change_player(void);
+void mDemo_Set_talk_return_demo_wait(u8 returnDemoWait);
+s32 mDemo_Get_talk_return_demo_wait(void);
+void mDemo_Set_talk_turn(u8 turn);
+s32 mDemo_Get_talk_turn(void);
+void mDemo_Set_talk_window_color(Color_RGBA8* windowColor);
+Color_RGBA8* mDemo_Get_talk_window_color_p(void);
+void mDemo_Set_camera(u8 cameraType);
+s32 mDemo_Get_camera(void);
+s32 mDemo_CheckDemoType(void);
+s32 change_camera(s32 cameraType);
+s32 set_speak_default(void);
+s32 set_report_default(void);
+s32 set_talk_default(void);
+s32 wait_talk_start(void);
+s32 wait_talk_end(void);
+s32 wait_scroll_start(void);
+s32 set_door_default(void);
+s32 wait_door_start(void);
+s32 mDemo_Set_house_info(f32 size, s32 direct);
+s32 wait_door2_start(void);
+s16 get_title_no_for_event(s16 event);
+s32 set_emsg_default(void);
+s32 wait_emsg_start(void);
+s32 wait_emsg_end(void);
+f32 weight_of_talk_position(struct Actor* actor);
+s32 allways_true(void);
+s32 allways_false(void);
+s32 scroll_check(void);
+s32 scroll2_check(void);
+s32 scroll3_check(void);
+s32 door_check(void);
+s32 outdoor_check(void);
+s32 talk_check(void);
+s32 speak_check(void);
+s32 choice_demo(void);
+void emsg_set(struct Actor* actor);
+void init_demo(void);
+void run_demo(void);
+void main_proc(void);
+void mDemo_stock_clear(void);
+s32 mDemo_Request(s32 type, struct Actor* actor, DemoRequestFunc request);
+s32 mDemo_Check(s32 type, struct Actor* actor);
+s32 mDemo_Start(struct Actor* actor);
+s32 mDemo_Check_and_Go(s32 type, struct Actor* actor);
+s32 mDemo_End(struct Actor* actor);
+void mDemo_Main(struct Game_Play* play);
+void mDemo_Init(struct Game_Play* play);
+s32 mDemo_CheckDemo(void);
+s32 mDemo_CheckDemo4Event(void);
+void mDemo_Set_SpeakerAble(void);
+void mDemo_Set_ListenAble(void);
+void mDemo_Unset_SpeakerAble(void);
+void mDemo_Unset_ListenAble(void);
+s32 mDemo_Check_SpeakerAble(void);
+s32 mDemo_Check_ListenAble(void);
+int mDemo_Check_DiffAngle_forTalk(s16 diffAngle);
+void mDemo_KeepCamera(s32 cameraType);
+
+
+
+#endif
diff --git a/include/m_msg_main.h b/include/m_msg_main.h
index cbe841d..c06adbb 100644
--- a/include/m_msg_main.h
+++ b/include/m_msg_main.h
@@ -7,6 +7,7 @@
struct Game_Play;
struct Actor;
+struct Color_RGBA8;
typedef struct MessageWindow {
/* 0x000 */ UNK_TYPE1 unk_000[0x1B0];
@@ -16,13 +17,14 @@ typedef struct MessageWindow {
MessageWindow* mMsg_Get_base_window_p(void);
// void func_8009D200_jp();
// void func_8009D210_jp();
-// void func_8009D260_jp();
+s32 mMsg_Check_main_index(MessageWindow*, s32);
// void func_8009D274_jp();
UNK_RET mMsg_Check_not_series_main_wait(UNK_PTR arg0);
UNK_RET mMsg_Check_main_hide(UNK_PTR arg0);
// void func_8009D308_jp();
// void func_8009D3B4_jp();
-// void func_8009D3E4_jp();
+s32 mMsg_request_main_appear(MessageWindow*, struct Actor*, s32 , struct Color_RGBA8*,
+ s32, s32);
// void func_8009D458_jp();
// void func_8009D4A0_jp();
// void func_8009D4F0_jp();
diff --git a/include/m_player_lib.h b/include/m_player_lib.h
index 456041e..ce6430e 100644
--- a/include/m_player_lib.h
+++ b/include/m_player_lib.h
@@ -63,7 +63,7 @@ void mPlib_Load_PlayerTexAndPallet(u8*, u8*, s32);
// void func_800B21A0_jp();
// void func_800B21D0_jp();
// void func_800B21E0_jp();
-// void func_800B21F0_jp();
+s32 mPlib_Check_able_force_speak_label(struct Game_Play*, struct Actor*);
// void func_800B2244_jp();
// void func_800B2284_jp();
// void func_800B22A4_jp();
@@ -73,8 +73,8 @@ void mPlib_Load_PlayerTexAndPallet(u8*, u8*, s32);
void mPlib_request_main_invade_type1(struct Game_Play*);
void mPlib_request_main_refuse_type1(struct Game_Play*);
void mPlib_request_main_wait_type3(struct Game_Play*);
-// void func_800B2450_jp();
-// void func_800B24A0_jp();
+s32 mPlib_request_main_talk_end_type1(struct Game_Play*, s32);
+s32 mPlib_request_main_talk_type1(struct Game_Play*, struct Actor*, s32, s32);
// void func_800B24F8_jp();
// void func_800B255C_jp();
// void func_800B25F4_jp();
@@ -82,8 +82,8 @@ void mPlib_request_main_wait_type3(struct Game_Play*);
// void func_800B26E8_jp();
// void func_800B2720_jp();
// void func_800B2778_jp();
-// void func_800B27B0_jp();
-// void func_800B2814_jp();
+void mPlib_request_main_door_type1(struct Game_Play*, xyz_t*, s16, s32, struct Actor*);
+void mPlib_request_main_door_type2(struct Game_Play*, xyz_t*, s16, s32, struct Actor*);
// void func_800B286C_jp();
// void func_800B28B0_jp();
// void func_800B2908_jp();
@@ -100,18 +100,18 @@ void func_800B2AD0_jp(struct Game_Play*);
// void func_800B2CD8_jp();
// void func_800B2D18_jp();
// void func_800B2D74_jp();
-// void func_800B2DAC_jp();
-// void func_800B2EBC_jp();
-// void func_800B2F1C_jp();
-// void func_800B2F7C_jp();
-// void func_800B2FDC_jp();
-// void func_800B30A4_jp();
+s32 mPlib_check_request_main_talk_type1_priority(struct Game_Play*);
+s32 mPlib_check_request_main_speak_type1_priority(struct Game_Play*);
+s32 mPlib_check_request_main_demo_geton_boat_wade_priority(struct Game_Play*);
+s32 mPlib_check_request_main_door_type1_priority(struct Game_Play*);
+s32 mPlib_check_request_main_wade_priority(struct Game_Play*);
+s32 mPlib_check_request_main_demo_wade_priority(struct Game_Play*);
// void func_800B3104_jp();
// void func_800B314C_jp();
// void func_800B31B4_jp();
// void func_800B321C_jp();
-// void func_800B3284_jp();
-// void func_800B32EC_jp();
+void mPlib_strength_request_main_door_priority(struct Game_Play*);
+s32 mPlib_check_request_main_outdoor_priority(struct Game_Play*);
// void func_800B32FC_jp();
// void func_800B3330_jp();
// void func_800B33AC_jp();
diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt
index c7b45d0..a416f05 100644
--- a/linker_scripts/jp/symbol_addrs_code.txt
+++ b/linker_scripts/jp/symbol_addrs_code.txt
@@ -317,8 +317,8 @@ func_8005E83C_jp = 0x8005E83C; // type:func
func_8005E8F4_jp = 0x8005E8F4; // type:func
func_8005E9B4_jp = 0x8005E9B4; // type:func
func_8005E9C8_jp = 0x8005E9C8; // type:func
-func_8005E9DC_jp = 0x8005E9DC; // type:func
-func_8005E9F0_jp = 0x8005E9F0; // type:func
+mBGMPsComp_volume_talk_start = 0x8005E9DC; // type:func
+mBGMPsComp_volume_talk_end = 0x8005E9F0; // type:func
func_8005EA14_jp = 0x8005EA14; // type:func
func_8005EA24_jp = 0x8005EA24; // type:func
func_8005EA38_jp = 0x8005EA38; // type:func
@@ -337,7 +337,7 @@ func_8005ED44_jp = 0x8005ED44; // type:func
func_8005ED78_jp = 0x8005ED78; // type:func
func_8005ED98_jp = 0x8005ED98; // type:func
func_8005EDC4_jp = 0x8005EDC4; // type:func
-func_8005EDD8_jp = 0x8005EDD8; // type:func
+mBGMForce_inform_end = 0x8005EDD8; // type:func
func_8005EDEC_jp = 0x8005EDEC; // type:func
mBGMForce_room_nonstop_start = 0x8005EE00; // type:func
func_8005EE20_jp = 0x8005EE20; // type:func
@@ -400,7 +400,7 @@ func_8006109C_jp = 0x8006109C; // type:func
func_80061104_jp = 0x80061104; // type:func
func_80061134_jp = 0x80061134; // type:func
func_80061188_jp = 0x80061188; // type:func
-func_800611D4_jp = 0x800611D4; // type:func
+Camera2_request_main_talk = 0x800611D4; // type:func
func_80061280_jp = 0x80061280; // type:func
func_8006136C_jp = 0x8006136C; // type:func
func_800613DC_jp = 0x800613DC; // type:func
@@ -435,7 +435,7 @@ func_8006295C_jp = 0x8006295C; // type:func
func_80062B24_jp = 0x80062B24; // type:func
func_80062B74_jp = 0x80062B74; // type:func
func_80062BA0_jp = 0x80062BA0; // type:func
-func_80062C84_jp = 0x80062C84; // type:func
+Camera2_request_main_item = 0x80062C84; // type:func
func_80062CD8_jp = 0x80062CD8; // type:func
func_80062DD8_jp = 0x80062DD8; // type:func
func_80062E00_jp = 0x80062E00; // type:func
@@ -451,7 +451,7 @@ func_80063170_jp = 0x80063170; // type:func
func_800631C0_jp = 0x800631C0; // type:func
func_800631EC_jp = 0x800631EC; // type:func
func_8006328C_jp = 0x8006328C; // type:func
-func_800632C8_jp = 0x800632C8; // type:func
+Camera2_request_main_door = 0x800632C8; // type:func
func_8006333C_jp = 0x8006333C; // type:func
func_8006339C_jp = 0x8006339C; // type:func
func_80063468_jp = 0x80063468; // type:func
@@ -460,18 +460,18 @@ func_800635B8_jp = 0x800635B8; // type:func
func_80063608_jp = 0x80063608; // type:func
func_80063628_jp = 0x80063628; // type:func
func_80063674_jp = 0x80063674; // type:func
-func_8006370C_jp = 0x8006370C; // type:func
+Camera2_request_main_simple_kirin = 0x8006370C; // type:func
func_800637C8_jp = 0x800637C8; // type:func
func_8006393C_jp = 0x8006393C; // type:func
-func_800639A0_jp = 0x800639A0; // type:func
+Camera2_request_main_simple = 0x800639A0; // type:func
func_80063A34_jp = 0x80063A34; // type:func
-func_80063AA0_jp = 0x80063AA0; // type:func
+Camera2_main_Simple_AngleDistStd = 0x80063AA0; // type:func
func_80063B1C_jp = 0x80063B1C; // type:func
func_80063B8C_jp = 0x80063B8C; // type:func
func_80063CA0_jp = 0x80063CA0; // type:func
func_80063D10_jp = 0x80063D10; // type:func
func_80063D38_jp = 0x80063D38; // type:func
-func_80063D9C_jp = 0x80063D9C; // type:func
+Camera2_request_main_listen_front_low_talk = 0x80063D9C; // type:func
func_80063E14_jp = 0x80063E14; // type:func
func_80063E94_jp = 0x80063E94; // type:func
func_80063EF0_jp = 0x80063EF0; // type:func
@@ -983,78 +983,78 @@ Debug_mode_output_sub = 0x8007AC1C; // type:func
Debug_mode_zelda_malloc_info_output = 0x8007ADF8; // type:func
Debug_mode_output = 0x8007AED8; // type:func
mDemo_Get_talk_actor = 0x8007B410; // type:func
-func_8007B44C_jp = 0x8007B44C; // type:func
-func_8007B49C_jp = 0x8007B49C; // type:func
-func_8007B4EC_jp = 0x8007B4EC; // type:func
+mDemo_Set_OrderValue = 0x8007B44C; // type:func
+mDemo_Get_OrderValue = 0x8007B49C; // type:func
+mDemo_Init_OrderValue = 0x8007B4EC; // type:func
mDemo_Set_msg_num = 0x8007B5C0; // type:func
-func_8007B5F4_jp = 0x8007B5F4; // type:func
-func_8007B650_jp = 0x8007B650; // type:func
-func_8007B670_jp = 0x8007B670; // type:func
-func_8007B684_jp = 0x8007B684; // type:func
-func_8007B6A4_jp = 0x8007B6A4; // type:func
-func_8007B724_jp = 0x8007B724; // type:func
-func_8007B760_jp = 0x8007B760; // type:func
+mDemo_Get_Talk_Actors = 0x8007B5F4; // type:func
+mDemo_Set_change_player_destiny = 0x8007B650; // type:func
+mDemo_Get_change_player_destiny = 0x8007B670; // type:func
+mDemo_Clear_change_player_destiny = 0x8007B684; // type:func
+mDemo_Copy_change_player_destiny = 0x8007B6A4; // type:func
+mDemo_Set_use_zoom_sound = 0x8007B724; // type:func
+mDemo_Get_use_zoom_sound = 0x8007B760; // type:func
mDemo_Set_talk_display_name = 0x8007B79C; // type:func
-func_8007B7DC_jp = 0x8007B7DC; // type:func
-func_8007B818_jp = 0x8007B818; // type:func
-func_8007B854_jp = 0x8007B854; // type:func
-func_8007B890_jp = 0x8007B890; // type:func
-func_8007B8CC_jp = 0x8007B8CC; // type:func
-func_8007B908_jp = 0x8007B908; // type:func
-func_8007B944_jp = 0x8007B944; // type:func
+mDemo_Get_talk_display_name = 0x8007B7DC; // type:func
+mDemo_Set_talk_change_player = 0x8007B818; // type:func
+mDemo_Get_talk_change_player = 0x8007B854; // type:func
+mDemo_Set_talk_return_demo_wait = 0x8007B890; // type:func
+mDemo_Get_talk_return_demo_wait = 0x8007B8CC; // type:func
+mDemo_Set_talk_turn = 0x8007B908; // type:func
+mDemo_Get_talk_turn = 0x8007B944; // type:func
mDemo_Set_talk_window_color = 0x8007B980; // type:func
-func_8007B9E0_jp = 0x8007B9E0; // type:func
+mDemo_Get_talk_window_color_p = 0x8007B9E0; // type:func
mDemo_Set_camera = 0x8007BA1C; // type:func
-func_8007BA38_jp = 0x8007BA38; // type:func
-func_8007BA4C_jp = 0x8007BA4C; // type:func
-func_8007BA84_jp = 0x8007BA84; // type:func
-func_8007BC28_jp = 0x8007BC28; // type:func
-func_8007BCE4_jp = 0x8007BCE4; // type:func
-func_8007BD9C_jp = 0x8007BD9C; // type:func
-func_8007BE58_jp = 0x8007BE58; // type:func
-func_8007C00C_jp = 0x8007C00C; // type:func
-func_8007C0B4_jp = 0x8007C0B4; // type:func
-func_8007C0C0_jp = 0x8007C0C0; // type:func
-func_8007C104_jp = 0x8007C104; // type:func
-func_8007C24C_jp = 0x8007C24C; // type:func
-func_8007C290_jp = 0x8007C290; // type:func
-func_8007C3D8_jp = 0x8007C3D8; // type:func
-func_8007C484_jp = 0x8007C484; // type:func
-func_8007C570_jp = 0x8007C570; // type:func
-func_8007C5EC_jp = 0x8007C5EC; // type:func
+mDemo_Get_camera = 0x8007BA38; // type:func
+mDemo_CheckDemoType = 0x8007BA4C; // type:func
+change_camera = 0x8007BA84; // type:func
+set_speak_default = 0x8007BC28; // type:func
+set_report_default = 0x8007BCE4; // type:func
+set_talk_default = 0x8007BD9C; // type:func
+wait_talk_start = 0x8007BE58; // type:func
+wait_talk_end = 0x8007C00C; // type:func
+wait_scroll_start = 0x8007C0B4; // type:func
+set_door_default = 0x8007C0C0; // type:func
+wait_door_start = 0x8007C104; // type:func
+mDemo_Set_house_info = 0x8007C24C; // type:func
+wait_door2_start = 0x8007C290; // type:func
+get_title_no_for_event = 0x8007C3D8; // type:func
+set_emsg_default = 0x8007C484; // type:func
+wait_emsg_start = 0x8007C570; // type:func
+wait_emsg_end = 0x8007C5EC; // type:func
weight_of_talk_position = 0x8007C6C0; // type:func
-func_8007C808_jp = 0x8007C808; // type:func
-func_8007C814_jp = 0x8007C814; // type:func
-func_8007C820_jp = 0x8007C820; // type:func
-func_8007C844_jp = 0x8007C844; // type:func
-func_8007C868_jp = 0x8007C868; // type:func
-func_8007C88C_jp = 0x8007C88C; // type:func
-func_8007C8B0_jp = 0x8007C8B0; // type:func
-func_8007C8D4_jp = 0x8007C8D4; // type:func
-func_8007C8FC_jp = 0x8007C8FC; // type:func
-func_8007C924_jp = 0x8007C924; // type:func
-func_8007CB28_jp = 0x8007CB28; // type:func
-func_8007CB50_jp = 0x8007CB50; // type:func
-func_8007CBEC_jp = 0x8007CBEC; // type:func
-func_8007CC9C_jp = 0x8007CC9C; // type:func
+allways_true = 0x8007C808; // type:func
+allways_false = 0x8007C814; // type:func
+scroll_check = 0x8007C820; // type:func
+scroll2_check = 0x8007C844; // type:func
+scroll3_check = 0x8007C868; // type:func
+door_check = 0x8007C88C; // type:func
+outdoor_check = 0x8007C8B0; // type:func
+talk_check = 0x8007C8D4; // type:func
+speak_check = 0x8007C8FC; // type:func
+choice_demo = 0x8007C924; // type:func
+emsg_set = 0x8007CB28; // type:func
+init_demo = 0x8007CB50; // type:func
+run_demo = 0x8007CBEC; // type:func
+main_proc = 0x8007CC9C; // type:func
mDemo_stock_clear = 0x8007CDB8; // type:func
mDemo_Request = 0x8007CDD8; // type:func
mDemo_Check = 0x8007CF00; // type:func
-func_8007CF34_jp = 0x8007CF34; // type:func
-func_8007CF44_jp = 0x8007CF44; // type:func
+mDemo_Start = 0x8007CF34; // type:func
+mDemo_Check_and_Go = 0x8007CF44; // type:func
mDemo_End = 0x8007CF84; // type:func
mDemo_Main = 0x8007CFB4; // type:func
-func_8007CFD8_jp = 0x8007CFD8; // type:func
-func_8007D030_jp = 0x8007D030; // type:func
-func_8007D048_jp = 0x8007D048; // type:func
-func_8007D080_jp = 0x8007D080; // type:func
+mDemo_Init = 0x8007CFD8; // type:func
+mDemo_CheckDemo = 0x8007D030; // type:func
+mDemo_CheckDemo4Event = 0x8007D048; // type:func
+mDemo_Set_SpeakerAble = 0x8007D080; // type:func
mDemo_Set_ListenAble = 0x8007D098; // type:func
-func_8007D0B0_jp = 0x8007D0B0; // type:func
-func_8007D0C4_jp = 0x8007D0C4; // type:func
-func_8007D0D8_jp = 0x8007D0D8; // type:func
+mDemo_Unset_SpeakerAble = 0x8007D0B0; // type:func
+mDemo_Unset_ListenAble = 0x8007D0C4; // type:func
+mDemo_Check_SpeakerAble = 0x8007D0D8; // type:func
mDemo_Check_ListenAble = 0x8007D0EC; // type:func
mDemo_Check_DiffAngle_forTalk = 0x8007D100; // type:func
-func_8007D128_jp = 0x8007D128; // type:func
+mDemo_KeepCamera = 0x8007D128; // type:func
func_8007D140_jp = 0x8007D140; // type:func
func_8007D180_jp = 0x8007D180; // type:func
mEv_ClearEventSaveInfo = 0x8007D1A8; // type:func
@@ -1904,13 +1904,13 @@ func_8009D1A8_jp = 0x8009D1A8; // type:func
mMsg_Get_base_window_p = 0x8009D1F0; // type:func
func_8009D200_jp = 0x8009D200; // type:func
func_8009D210_jp = 0x8009D210; // type:func
-func_8009D260_jp = 0x8009D260; // type:func
+mMsg_Check_main_index = 0x8009D260; // type:func
func_8009D274_jp = 0x8009D274; // type:func
mMsg_Check_not_series_main_wait = 0x8009D294; // type:func
mMsg_Check_main_hide = 0x8009D2E8; // type:func
func_8009D308_jp = 0x8009D308; // type:func
func_8009D3B4_jp = 0x8009D3B4; // type:func
-func_8009D3E4_jp = 0x8009D3E4; // type:func
+mMsg_request_main_appear = 0x8009D3E4; // type:func
func_8009D458_jp = 0x8009D458; // type:func
func_8009D4A0_jp = 0x8009D4A0; // type:func
func_8009D4F0_jp = 0x8009D4F0; // type:func
@@ -2557,7 +2557,7 @@ func_800B2170_jp = 0x800B2170; // type:func
func_800B21A0_jp = 0x800B21A0; // type:func
func_800B21D0_jp = 0x800B21D0; // type:func
func_800B21E0_jp = 0x800B21E0; // type:func
-func_800B21F0_jp = 0x800B21F0; // type:func
+mPlib_Check_able_force_speak_label = 0x800B21F0; // type:func
func_800B2244_jp = 0x800B2244; // type:func
func_800B2284_jp = 0x800B2284; // type:func
func_800B22A4_jp = 0x800B22A4; // type:func
@@ -2567,8 +2567,8 @@ func_800B2350_jp = 0x800B2350; // type:func
mPlib_request_main_invade_type1 = 0x800B23A4; // type:func
mPlib_request_main_refuse_type1 = 0x800B23DC; // type:func
mPlib_request_main_wait_type3 = 0x800B2414; // type:func
-func_800B2450_jp = 0x800B2450; // type:func
-func_800B24A0_jp = 0x800B24A0; // type:func
+mPlib_request_main_talk_end_type1 = 0x800B2450; // type:func
+mPlib_request_main_talk_type1 = 0x800B24A0; // type:func
func_800B24F8_jp = 0x800B24F8; // type:func
func_800B255C_jp = 0x800B255C; // type:func
func_800B25F4_jp = 0x800B25F4; // type:func
@@ -2576,8 +2576,8 @@ func_800B2698_jp = 0x800B2698; // type:func
func_800B26E8_jp = 0x800B26E8; // type:func
func_800B2720_jp = 0x800B2720; // type:func
func_800B2778_jp = 0x800B2778; // type:func
-func_800B27B0_jp = 0x800B27B0; // type:func
-func_800B2814_jp = 0x800B2814; // type:func
+mPlib_request_main_door_type1 = 0x800B27B0; // type:func
+mPlib_request_main_door_type2 = 0x800B2814; // type:func
func_800B286C_jp = 0x800B286C; // type:func
func_800B28B0_jp = 0x800B28B0; // type:func
func_800B2908_jp = 0x800B2908; // type:func
@@ -2594,18 +2594,18 @@ func_800B2C80_jp = 0x800B2C80; // type:func
func_800B2CD8_jp = 0x800B2CD8; // type:func
func_800B2D18_jp = 0x800B2D18; // type:func
func_800B2D74_jp = 0x800B2D74; // type:func
-func_800B2DAC_jp = 0x800B2DAC; // type:func
-func_800B2EBC_jp = 0x800B2EBC; // type:func
-func_800B2F1C_jp = 0x800B2F1C; // type:func
-func_800B2F7C_jp = 0x800B2F7C; // type:func
-func_800B2FDC_jp = 0x800B2FDC; // type:func
-func_800B30A4_jp = 0x800B30A4; // type:func
+mPlib_check_request_main_talk_type1_priority = 0x800B2DAC; // type:func
+mPlib_check_request_main_speak_type1_priority = 0x800B2EBC; // type:func
+mPlib_check_request_main_demo_geton_boat_wade_priority = 0x800B2F1C; // type:func
+mPlib_check_request_main_door_type1_priority = 0x800B2F7C; // type:func
+mPlib_check_request_main_wade_priority = 0x800B2FDC; // type:func
+mPlib_check_request_main_demo_wade_priority = 0x800B30A4; // type:func
func_800B3104_jp = 0x800B3104; // type:func
func_800B314C_jp = 0x800B314C; // type:func
func_800B31B4_jp = 0x800B31B4; // type:func
func_800B321C_jp = 0x800B321C; // type:func
-func_800B3284_jp = 0x800B3284; // type:func
-func_800B32EC_jp = 0x800B32EC; // type:func
+mPlib_strength_request_main_door_priority = 0x800B3284; // type:func
+mPlib_check_request_main_outdoor_priority = 0x800B32EC; // type:func
func_800B32FC_jp = 0x800B32FC; // type:func
func_800B3330_jp = 0x800B3330; // type:func
func_800B33AC_jp = 0x800B33AC; // type:func
@@ -4391,15 +4391,15 @@ D_80104A0C_jp = 0x80104A0C; //
D_80104A10_jp = 0x80104A10; //
D_80104A14_jp = 0x80104A14; //
D_80104A18_jp = 0x80104A18; //
-D_FLT_80104A20_jp = 0x80104A20; // type:f32
-D_80104A60_jp = 0x80104A60; // type:s16
-D_80104A70_jp = 0x80104A70; //
+direct_vector = 0x80104A20; // type:f32
+direct_back_angle = 0x80104A60; // type:s16
+demo = 0x80104A70; //
D_80104A74_jp = 0x80104A74; //
D_80104A90_jp = 0x80104A90; //
D_80104AAC_jp = 0x80104AAC; //
D_80104AE4_jp = 0x80104AE4; //
-D_80104AE8_jp = 0x80104AE8; //
-D_80104B20_jp = 0x80104B20; //
+wait_start = 0x80104AE8; //
+wait_end = 0x80104B20; //
D_80104B60_jp = 0x80104B60; //
D_80104F2C_jp = 0x80104F2C; //
D_80104F90_jp = 0x80104F90; //
@@ -6009,7 +6009,7 @@ debug_display = 0x80138E60; //
B_80138E70_jp = 0x80138E70; // type:s8
B_80138E73_jp = 0x80138E73; //
B_80139C30_jp = 0x80139C30; //
-B_80139C40_jp = 0x80139C40; //
+demo_data = 0x80139C40; //
B_80139F70_jp = 0x80139F70; //
B_80139F98_jp = 0x80139F98; //
B_8013A098_jp = 0x8013A098; // type:u8
diff --git a/src/code/m_demo.c b/src/code/m_demo.c
new file mode 100644
index 0000000..b6562e7
--- /dev/null
+++ b/src/code/m_demo.c
@@ -0,0 +1,928 @@
+#include "m_demo.h"
+#include "overlays/gamestates/ovl_play/m_play.h"
+#include "overlays/actors/player_actor/m_player.h"
+#include "m_msg_main.h"
+#include "m_player_lib.h"
+#include "lib/ultralib/include/ido/memory.h"
+#include "libc/math.h"
+#include "m_field_info.h"
+#include "audio.h"
+#include "67E840.h"
+
+f32 direct_vector[DEMO_DIRECT_MAX][2] = { { -1.0f, 0.0f }, { -M_SQRT2, M_SQRT2 }, { 0.0f, 1.0f },
+ { M_SQRT2, M_SQRT2 }, { 1.0f, 0.0f }, { M_SQRT2, -M_SQRT2 },
+ { 0.0f, -1.0f }, { -M_SQRT2, -M_SQRT2 } };
+
+s16 direct_back_angle[DEMO_DIRECT_MAX] = { 0x0000, 0xE000, 0xC000, 0xA000, 0x8000, 0x6000, 0x4000, 0x2000 };
+
+DemoData demo_data;
+
+DemoData* demo = &demo_data;
+
+Actor* mDemo_Get_talk_actor() {
+ s32 type = demo->current.type;
+
+ if (type == DEMO_TYPE_TALK || type == DEMO_TYPE_SPEAK || type == DEMO_TYPE_REPORT) {
+ return demo->current.actor;
+ }
+
+ return NULL;
+}
+
+void mDemo_Set_OrderValue(s32 type, s32 idx, u16 value) {
+ if (type >= DEMO_TYPE_NONE && type < DEMO_TYPE_OUTDOOR && idx >= 0 && idx < DEMO_ORDER_VALUE_MAX) {
+ demo->orderData[type][idx] = value;
+ }
+}
+
+u16 mDemo_Get_OrderValue(s32 type, s32 idx) {
+ if (type >= DEMO_TYPE_NONE && type < DEMO_TYPE_OUTDOOR && idx >= 0 && idx < DEMO_ORDER_VALUE_MAX) {
+ return demo->orderData[type][idx];
+ } else {
+ return 0;
+ }
+}
+
+void mDemo_Init_OrderValue() {
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < DEMO_ORDER_MAX; i++) {
+ for (j = 0; j < DEMO_ORDER_VALUE_MAX; j++) {
+ demo->orderData[i][j] = 0;
+ }
+ }
+}
+
+void mDemo_Set_msg_num(s32 msgNo) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ demo->data.talk.msgNo = msgNo;
+ }
+}
+
+s32 mDemo_Get_Talk_Actors(Actor** speaker, Actor** listener) {
+ s32 type = demo->current.type;
+
+ if (type == DEMO_TYPE_TALK || type == DEMO_TYPE_SPEAK || type == DEMO_TYPE_REPORT) {
+ speaker[0] = demo->speaker;
+ listener[0] = demo->listener;
+ return TRUE;
+
+ } else {
+ speaker[0] = NULL;
+ listener[0] = NULL;
+
+ return FALSE;
+ }
+}
+
+void mDemo_Set_change_player_destiny(s8 destiny) {
+ demo->changePlayerDestiny = destiny;
+}
+
+s32 mDemo_Get_change_player_destiny() {
+ return demo->changePlayerDestiny;
+}
+
+void mDemo_Clear_change_player_destiny() {
+ mDemo_Set_change_player_destiny(-1);
+}
+
+void mDemo_Copy_change_player_destiny() {
+ if (mDemo_Get_change_player_destiny() >= 0) {
+ PrivateDestiny* destiny = &common_data.privateInfo->destiny;
+ lbRTC_time_c* rtcTime = &common_data.time.rtcTime;
+
+ destiny->receivedTime.sec = rtcTime->sec;
+ destiny->receivedTime.min = rtcTime->min;
+ destiny->receivedTime.hour = rtcTime->hour;
+ destiny->receivedTime.day = rtcTime->day;
+ destiny->receivedTime.weekday = rtcTime->weekday;
+ destiny->receivedTime.month = rtcTime->month;
+ destiny->receivedTime.year = rtcTime->year;
+ destiny->type = mDemo_Get_change_player_destiny();
+ mDemo_Clear_change_player_destiny();
+ }
+}
+
+void mDemo_Set_use_zoom_sound(u8 useZoomSound) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ demo->data.talk.useZoomSound = useZoomSound;
+ }
+}
+
+s32 mDemo_Get_use_zoom_sound() {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ return demo->data.talk.useZoomSound;
+ } else {
+ return 0;
+ }
+}
+
+void mDemo_Set_talk_display_name(s8 displayName) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ demo->data.talk.displayName = displayName;
+ }
+}
+
+s32 mDemo_Get_talk_display_name() {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ return demo->data.talk.displayName;
+ } else {
+ return 0;
+ }
+}
+
+void mDemo_Set_talk_change_player(u8 changePlayer) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ demo->data.talk.changePlayer = changePlayer;
+ }
+}
+
+s32 mDemo_Get_talk_change_player() {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ return demo->data.talk.changePlayer;
+ } else {
+ return 0;
+ }
+}
+
+void mDemo_Set_talk_return_demo_wait(u8 returnDemoWait) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ demo->data.talk.returnDemoWait = returnDemoWait;
+ }
+}
+
+s32 mDemo_Get_talk_return_demo_wait() {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ return demo->data.talk.returnDemoWait;
+ } else {
+ return 0;
+ }
+}
+
+void mDemo_Set_talk_turn(u8 turn) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ demo->data.talk.turn = turn;
+ }
+}
+
+s32 mDemo_Get_talk_turn() {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ return demo->data.talk.turn;
+ } else {
+ return 0;
+ }
+}
+
+void mDemo_Set_talk_window_color(Color_RGBA8* windowColor) {
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+
+ demo->data.talk.windowColor = *windowColor;
+ } else if (demo->current.type == DEMO_TYPE_EVENTMSG) {
+
+ demo->data.emsg.windowColor = *windowColor;
+ }
+}
+
+Color_RGBA8* mDemo_Get_talk_window_color_p() {
+
+ if (demo->current.type == DEMO_TYPE_TALK || demo->current.type == DEMO_TYPE_SPEAK ||
+ demo->current.type == DEMO_TYPE_REPORT) {
+ return &demo->data.talk.windowColor;
+ } else {
+ return NULL;
+ }
+}
+
+void mDemo_Set_camera(u8 cameraType) {
+ demo->cameraType = cameraType;
+}
+
+s32 mDemo_Get_camera() {
+ return demo->cameraType;
+}
+
+s32 mDemo_CheckDemoType() {
+ s32 demoType;
+
+ if (mDemo_CheckDemo()) {
+ demoType = demo->current.type;
+ } else {
+ demoType = DEMO_TYPE_NONE;
+ }
+
+ return demoType;
+}
+
+s32 change_camera(s32 cameraType) {
+ Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ Camera2* camera = &((Game_Play*)gamePT)->camera;
+
+ if (cameraType == camera->unk60) {
+ return FALSE;
+ }
+
+ switch (cameraType) {
+ case 3:
+ Camera2_request_main_talk(((Game_Play*)gamePT), &player->actor, demo->current.actor, DEMO_CAMERA_PRIORITY);
+ break;
+ case 5:
+ Camera2_request_main_item(((Game_Play*)gamePT), 0, DEMO_CAMERA_PRIORITY);
+ break;
+ case 7: {
+ Camera2_request_main_door(((Game_Play*)gamePT), &player->actor,
+ demo->current.type == DEMO_TYPE_OUTDOOR ? 0 : 1, DEMO_CAMERA_PRIORITY);
+ } break;
+ case 6: {
+ s_xyz angle;
+ f32 dist;
+ if (demo->current.type == DEMO_TYPE_EVENTMSG) {
+
+ Camera2_main_Simple_AngleDistStd(((Game_Play*)gamePT), &angle, &dist);
+ Camera2_request_main_simple(((Game_Play*)gamePT), &player->actor.world.pos, &angle, dist, 0,
+ DEMO_CAMERA_PRIORITY);
+ }
+ break;
+ }
+ case 9:
+ if (demo->current.actor->name == 0x79) {
+ Camera2_request_main_listen_front_low_talk(((Game_Play*)gamePT), &player->actor, demo->current.actor,
+ DEMO_CAMERA_PRIORITY);
+ }
+ break;
+ case 8:
+ if (demo->current.actor->name == 0x2E) {
+ Camera2_request_main_simple_kirin(((Game_Play*)gamePT), &demo->current.actor->world.pos,
+ DEMO_CAMERA_PRIORITY - 1);
+ }
+ break;
+ case 1:
+ Camera2_request_main_normal((Game_Play*)gamePT, 0, DEMO_CAMERA_PRIORITY - 1);
+ break;
+ case 12:
+ break;
+ }
+
+ return TRUE;
+}
+
+s32 set_speak_default() {
+ Player* player;
+
+ demo->data.talk.msgNo = 0;
+ demo->data.talk.turn = FALSE;
+ demo->data.talk.displayName = TRUE;
+ demo->data.talk.changePlayer = TRUE;
+ demo->data.talk.returnDemoWait = FALSE;
+ demo->data.talk.useZoomSound = TRUE;
+ demo->data.talk.windowColor.r = DEMO_WINDOW_COLOR_R;
+ demo->data.talk.windowColor.g = DEMO_WINDOW_COLOR_G;
+ demo->data.talk.windowColor.b = DEMO_WINDOW_COLOR_B;
+ demo->data.talk.windowColor.a = DEMO_WINDOW_COLOR_A;
+ demo->cameraType = 3;
+ mDemo_Unset_SpeakerAble();
+ mDemo_Unset_ListenAble();
+
+ player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ demo->speaker = &player->actor;
+ demo->listener = demo->current.actor;
+ return TRUE;
+}
+
+s32 set_report_default() {
+ Player* player;
+
+ demo->data.talk.msgNo = 0;
+ demo->data.talk.turn = FALSE;
+ demo->data.talk.displayName = FALSE;
+ demo->data.talk.changePlayer = FALSE;
+ demo->data.talk.returnDemoWait = FALSE;
+ demo->data.talk.useZoomSound = TRUE;
+ demo->data.talk.windowColor.r = DEMO_WINDOW_COLOR_R;
+ demo->data.talk.windowColor.g = DEMO_WINDOW_COLOR_G;
+ demo->data.talk.windowColor.b = DEMO_WINDOW_COLOR_B;
+ demo->data.talk.windowColor.a = DEMO_WINDOW_COLOR_A;
+ demo->cameraType = 1;
+ mDemo_Set_SpeakerAble();
+ mDemo_Unset_ListenAble();
+
+ player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ demo->speaker = &player->actor;
+ demo->listener = demo->current.actor;
+ return TRUE;
+}
+
+s32 set_talk_default() {
+ Player* player;
+
+ demo->data.talk.msgNo = 0;
+ demo->data.talk.turn = TRUE;
+ demo->data.talk.displayName = TRUE;
+ demo->data.talk.changePlayer = TRUE;
+ demo->data.talk.returnDemoWait = FALSE;
+ demo->data.talk.useZoomSound = TRUE;
+ demo->data.talk.windowColor.r = DEMO_WINDOW_COLOR_R;
+ demo->data.talk.windowColor.g = DEMO_WINDOW_COLOR_G;
+ demo->data.talk.windowColor.b = DEMO_WINDOW_COLOR_B;
+ demo->data.talk.windowColor.a = DEMO_WINDOW_COLOR_A;
+ demo->cameraType = 3;
+ mDemo_Unset_SpeakerAble();
+ mDemo_Unset_ListenAble();
+
+ player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ demo->speaker = &player->actor;
+ demo->listener = demo->current.actor;
+ return TRUE;
+}
+
+s32 wait_talk_start() {
+ Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+
+ if (demo->data.talk.changePlayer) {
+ if (mPlib_request_main_talk_type1((Game_Play*)gamePT, demo->current.actor, demo->data.talk.turn, FALSE) ==
+ FALSE) {
+ return FALSE;
+ }
+ } else {
+ mDemo_Set_SpeakerAble();
+ }
+
+ if (mDemo_Check_SpeakerAble() && mDemo_Check_ListenAble()) {
+ MessageWindow* window = mMsg_Get_base_window_p();
+
+ mDemo_Init_OrderValue();
+
+ if (mMsg_Check_main_index(window, 1) == FALSE) {
+ player->actor.flags |= ACTOR_FLAG_40000000;
+ demo->current.actor->flags |= ACTOR_FLAG_40000000;
+ demo->data.talk.actorSavedMass = demo->current.actor->colStatus.mass;
+ demo->current.actor->colStatus.mass = MASS_IMMOVABLE;
+ mMsg_request_main_appear(window, demo->current.actor, demo->data.talk.displayName,
+ &demo->data.talk.windowColor, demo->data.talk.msgNo, DEMO_MSG_PRIORITY);
+
+ if (demo->data.talk.useZoomSound) {
+ u16 arg0;
+
+ if (demo->cameraType == 3) {
+ arg0 = 0x14;
+ } else {
+ arg0 = 4;
+ }
+
+ sAdo_SysTrgStart(arg0);
+ }
+
+ if (FI_GET_TYPE(mFI_GetFieldId()) != 0x5000 && demo->data.talk.msgNo != 0x07DD &&
+ demo->data.talk.msgNo != 0x0949 && demo->data.talk.msgNo != 0x0965 && demo->data.talk.msgNo != 0x07DE) {
+ mBGMPsComp_volume_talk_start();
+ }
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+s32 wait_talk_end() {
+ if (mMsg_Check_main_hide(mMsg_Get_base_window_p()) || demo->state == DEMO_STATE_STOP) {
+ if (demo->data.talk.changePlayer) {
+ mPlib_request_main_talk_end_type1((Game_Play*)gamePT, demo->data.talk.returnDemoWait);
+ }
+
+ demo->current.actor->colStatus.mass = demo->data.talk.actorSavedMass;
+ mDemo_Copy_change_player_destiny();
+
+ if (FI_GET_TYPE(mFI_GetFieldId()) != 0x5000) {
+ mBGMPsComp_volume_talk_end();
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+s32 wait_scroll_start() {
+ return TRUE;
+}
+
+s32 set_door_default() {
+ demo->data.door.type = DEMO_TYPE_NONE;
+ demo->data.door.houseInfo.size = 80.0f;
+ demo->data.door.houseInfo.direct = DEMO_DIRECT_S;
+ demo->cameraType = 1;
+ return TRUE;
+}
+
+s32 wait_door_start() {
+ Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ xyz_t pos;
+ Actor* actor = (Actor*)(get_player_actor_withoutCheck((Game_Play*)gamePT)->unk_122C((Game_Play*)gamePT));
+ s16 backAngle;
+ f32 sizeAdjust;
+
+ if (demo->current.actor == actor) {
+ return TRUE;
+ } else {
+ sizeAdjust = demo->data.door.houseInfo.size / 2.0f + 20.0f;
+
+ pos.x = demo->current.actor->world.pos.x + sizeAdjust * direct_vector[demo->data.door.houseInfo.direct][1];
+ pos.y = demo->current.actor->world.pos.y;
+ pos.z = demo->current.actor->world.pos.z + sizeAdjust * direct_vector[demo->data.door.houseInfo.direct][0];
+
+ backAngle = direct_back_angle[demo->data.door.houseInfo.direct];
+ player->actor.flags |= ACTOR_FLAG_40000000;
+ demo->current.actor->flags |= ACTOR_FLAG_40000000;
+
+ mPlib_request_main_door_type1((Game_Play*)gamePT, &pos, backAngle, demo->data.door.type, demo->current.actor);
+ mPlib_strength_request_main_door_priority((Game_Play*)gamePT);
+ }
+
+ return FALSE;
+}
+
+s32 mDemo_Set_house_info(f32 size, s32 direct) {
+ if (demo->current.type == DEMO_TYPE_DOOR || demo->current.type == DEMO_TYPE_DOOR2) {
+ demo->data.door.houseInfo.size = size;
+ demo->data.door.houseInfo.direct = direct;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+s32 wait_door2_start() {
+ Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ xyz_t pos;
+ Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)gamePT)->unk_122C((Game_Play*)gamePT);
+ s16 backAngle;
+ f32 sizeAdjust;
+
+ if (demo->current.actor == actor) {
+ return TRUE;
+ } else {
+ sizeAdjust = demo->data.door.houseInfo.size / 2.0f + 20.0f;
+
+ pos.x = demo->current.actor->world.pos.x + sizeAdjust * direct_vector[demo->data.door.houseInfo.direct][1];
+ pos.y = demo->current.actor->world.pos.y;
+ pos.z = demo->current.actor->world.pos.z + sizeAdjust * direct_vector[demo->data.door.houseInfo.direct][0];
+
+ backAngle = direct_back_angle[demo->data.door.houseInfo.direct];
+ player->actor.flags |= ACTOR_FLAG_40000000;
+ demo->current.actor->flags |= ACTOR_FLAG_40000000;
+
+ mPlib_request_main_door_type2((Game_Play*)gamePT, &pos, backAngle, demo->data.door.type, demo->current.actor);
+ mPlib_strength_request_main_door_priority((Game_Play*)gamePT);
+ }
+
+ return FALSE;
+}
+
+s16 get_title_no_for_event(s16 event) {
+ switch (event) {
+ case 11:
+ return 0;
+ case 12:
+ return 1;
+ case 8:
+ return 2;
+ case 10:
+ return 3;
+ case 7:
+ return 4;
+ case 9:
+ return 5;
+ case 16:
+ return 6;
+ case 22:
+ return 7;
+ case 21:
+ return 8;
+ case 6:
+ return 9;
+ case 3:
+ return 0xA;
+ case 2:
+ case 20:
+ return 0xB;
+ case 13:
+ return 0xC;
+ case 5:
+ return 0xD;
+ default:
+ return -1;
+ }
+}
+
+s32 set_emsg_default() {
+ s16 id = common_data.unk_107E2;
+ s16 flags = common_data.unk_107E4;
+ s16 titleNo;
+
+ memcpy(&demo->data.emsg.doorData, &common_data.eventDoorData, sizeof(DoorData));
+
+ if (flags == 1) {
+ demo->data.emsg.msgNo = 0x1743;
+ } else {
+ demo->data.emsg.msgNo = 0x1799;
+ }
+
+ titleNo = get_title_no_for_event(id);
+
+ if (titleNo >= 0) {
+ demo->data.emsg.msgNo += titleNo;
+ }
+ demo->data.emsg.windowColor.r = DEMO_WINDOW_COLOR_R;
+ demo->data.emsg.windowColor.g = DEMO_WINDOW_COLOR_G;
+ demo->data.emsg.windowColor.b = DEMO_WINDOW_COLOR_B;
+ demo->data.emsg.windowColor.a = DEMO_WINDOW_COLOR_A;
+ demo->cameraType = 6;
+ demo->data.emsg.msgDelayTimer = 0;
+ demo->data.emsg.sceneDelayTimer = 30;
+
+ return TRUE;
+}
+
+s32 wait_emsg_start() {
+ MessageWindow* window = mMsg_Get_base_window_p();
+
+ if (demo->data.emsg.msgDelayTimer <= 0) {
+ if (demo->data.emsg.msgNo != 0) {
+ mMsg_request_main_appear(window, NULL, FALSE, &demo->data.emsg.windowColor, demo->data.emsg.msgNo,
+ DEMO_MSG_PRIORITY);
+ }
+
+ common_data.unk_107E4 = 2;
+ return TRUE;
+ } else {
+ demo->data.emsg.msgDelayTimer--;
+ }
+
+ return FALSE;
+}
+
+s32 wait_emsg_end() {
+ Game_Play* play = (Game_Play*)gamePT;
+ MessageWindow* window = mMsg_Get_base_window_p();
+
+ if (mMsg_Check_main_hide(window)) {
+ demo->data.emsg.sceneDelayTimer--;
+ }
+
+ if (demo->data.emsg.sceneDelayTimer <= 0 || demo->state == DEMO_STATE_STOP) {
+ if (goto_other_scene(play, &demo->data.emsg.doorData, FALSE)) {
+ play->unk_1EE1 = demo->data.emsg.doorData.wipeType;
+ play->unk_1EE0 = 11;
+ common_data.unk_1014B = demo->data.emsg.doorData.wipeType;
+ mBGMForce_inform_end();
+
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+f32 weight_of_talk_position(Actor* actor) {
+ f32 distY;
+ f32 distFact;
+ Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+ s16 diffY = (player->actor.shape.rot.y - actor->yawTowardsPlayer);
+ f32 angleFactor;
+
+ distY = player->actor.world.pos.y - actor->world.pos.y;
+ if (distY < 0.0f) {
+ distY = -distY;
+ }
+
+ if (diffY < 0) {
+ diffY = diffY - 0x8000;
+ } else {
+ diffY = -diffY - 0x8000;
+ }
+
+ if (actor->xzDistToPlayer <= actor->unk_144 && distY <= 33.0f && diffY <= 12530) {
+ angleFactor = (1.0f - (actor->xzDistToPlayer / 55.0f));
+
+ distFact = angleFactor;
+
+ if (distFact < 0.0f) {
+ distFact = 0.0f;
+ }
+
+ angleFactor = 1.0f - ((f32)diffY / 12530.0f);
+ return SQ(angleFactor) * 0.6f + SQ(distFact) * 0.4f;
+ } else {
+ return -99.0f;
+ }
+}
+
+s32 allways_true() {
+ return TRUE;
+}
+
+s32 allways_false() {
+ return FALSE;
+}
+
+s32 scroll_check() {
+ return mPlib_check_request_main_wade_priority((Game_Play*)gamePT);
+}
+
+s32 scroll2_check() {
+ return mPlib_check_request_main_demo_wade_priority((Game_Play*)gamePT);
+}
+
+s32 scroll3_check() {
+ return mPlib_check_request_main_demo_geton_boat_wade_priority((Game_Play*)gamePT);
+}
+
+s32 door_check() {
+ return mPlib_check_request_main_door_type1_priority((Game_Play*)gamePT);
+}
+
+s32 outdoor_check() {
+ return mPlib_check_request_main_outdoor_priority((Game_Play*)gamePT);
+}
+
+s32 talk_check() {
+ return mPlib_check_request_main_talk_type1_priority((Game_Play*)gamePT) != FALSE;
+}
+
+s32 speak_check() {
+ return mPlib_check_request_main_speak_type1_priority((Game_Play*)gamePT) != FALSE;
+}
+
+typedef s32 (*DemoFunc)(void);
+
+s32 choice_demo() {
+ static DemoFunc check_func[] = { allways_true, scroll_check, allways_true, scroll3_check, allways_true,
+ scroll2_check, door_check, talk_check, speak_check, allways_true,
+ outdoor_check, allways_true, allways_true, allways_true };
+ static DemoFunc default_set_func[] = { allways_true, allways_true, allways_true, set_door_default,
+ allways_true, allways_true, set_door_default, set_talk_default,
+ set_speak_default, set_report_default, allways_true, allways_true,
+ set_emsg_default, allways_true };
+ f32 maxTalkWeight = 0.0f;
+ DemoRequest* req;
+ s32 idx = -1;
+ s32 i = 0;
+
+ for (; i < demo->requestId; i++) {
+ s32 type;
+
+ req = &demo->request[i];
+ type = req->type;
+
+ if (mEv_CheckTitleDemo() != 0 && type != DEMO_TYPE_SCROLL &&
+ ((mEv_CheckTitleDemo() != -9 || type != DEMO_TYPE_SPEAK || req->actor == NULL ||
+ req->actor->name != 0x99))) {
+ continue;
+ }
+
+ if (type >= demo->priorityType && (*check_func[type])() != FALSE) {
+ if (type == DEMO_TYPE_TALK) {
+ if (chkTrigger(A_BUTTON) && req->talkWeight > maxTalkWeight) {
+ maxTalkWeight = req->talkWeight;
+ idx = i;
+ }
+ } else {
+ idx = i;
+ break;
+ }
+ }
+ }
+
+ if (idx != -1) {
+ memcpy(&demo->current, &demo->request[idx], sizeof(DemoRequest));
+ default_set_func[demo->current.type]();
+
+ if (demo->current.proc != NULL) {
+ demo->current.proc(demo->current.actor);
+ }
+
+ demo->state = 1;
+ }
+
+ return idx;
+}
+
+void emsg_set(UNUSED Actor* actor) {
+ static Color_RGBA8 win_color = { 175, 255, 255, 255 };
+
+ mDemo_Set_talk_window_color(&win_color);
+}
+
+void init_demo() {
+ s32 initialType = common_data.startDemoRequest.type;
+
+ memset(&demo->current, 0, sizeof(DemoRequest));
+ demo->state = DEMO_STATE_WAIT;
+ demo->requestId = 0;
+ demo->priorityType = 0;
+ demo->cameraType = 1;
+ demo->keepCameraType = 0;
+
+ switch (initialType) {
+ case DEMO_TYPE_EVENTMSG:
+ mDemo_Request(initialType, NULL, &emsg_set);
+ common_data.startDemoRequest.type = DEMO_TYPE_NONE;
+ break;
+ }
+}
+
+DemoFunc wait_start[] = { allways_true, wait_scroll_start, allways_true, wait_door_start, allways_true,
+ wait_scroll_start, wait_door2_start, wait_talk_start, wait_talk_start, wait_talk_start,
+ allways_true, allways_true, wait_emsg_start, allways_true };
+
+DemoFunc wait_end[] = { allways_false, allways_false, allways_false, allways_false, allways_false,
+ allways_false, allways_false, wait_talk_end, wait_talk_end, wait_talk_end,
+ allways_false, allways_false, wait_emsg_end, allways_false };
+
+void run_demo() {
+ if (demo->state == DEMO_STATE_READY) {
+ if (wait_start[demo->current.type]()) {
+ change_camera(demo->cameraType);
+ demo->state = DEMO_STATE_RUN;
+ }
+ } else if (demo->state == DEMO_STATE_RUN && wait_end[demo->current.type]()) {
+ demo->state = DEMO_STATE_STOP;
+ }
+}
+
+void main_proc() {
+ Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT);
+
+ if (demo->state == DEMO_STATE_STOP) {
+ player->actor.flags &= ~ACTOR_FLAG_40000000;
+
+ if (demo->current.actor != NULL) {
+ demo->current.actor->flags &= ~ACTOR_FLAG_40000000;
+ }
+
+ demo->cameraType = 1;
+ if (demo->keepCameraType != 0 && demo->current.actor != NULL) {
+ change_camera(demo->keepCameraType);
+ } else {
+ change_camera(demo->cameraType);
+ }
+
+ demo->keepCameraType = 0;
+ memset(&demo->current, 0, sizeof(DemoRequest));
+ demo->state = DEMO_STATE_WAIT;
+ }
+
+ if (demo->state == DEMO_STATE_WAIT) {
+ choice_demo();
+ }
+
+ if (demo->state != DEMO_STATE_WAIT) {
+ run_demo();
+ }
+}
+
+void mDemo_stock_clear() {
+ demo->requestId = 0;
+ demo->priorityType = DEMO_TYPE_NONE;
+}
+
+s32 mDemo_Request(s32 type, Actor* actor, DemoRequestFunc request) {
+ f32 weight = 1.0f;
+ DemoRequest* req;
+ s32 requestId = demo->requestId;
+
+ if (requestId < DEMO_REQUEST_MAX) {
+ if (type >= demo->priorityType) {
+ req = &demo->request[requestId];
+
+ if (type == DEMO_TYPE_TALK) {
+ weight = weight_of_talk_position(actor);
+
+ if (weight < 0.0f) {
+ return FALSE;
+ }
+ } else if (type == DEMO_TYPE_SPEAK &&
+ mPlib_Check_able_force_speak_label((Game_Play*)gamePT, actor) == FALSE) {
+ return FALSE;
+ }
+
+ demo->priorityType = type;
+
+ req->type = demo->priorityType;
+ req->actor = actor;
+ req->proc = request;
+ req->talkWeight = weight;
+
+ demo->requestId++;
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+s32 mDemo_Check(s32 type, Actor* actor) {
+ if (type == demo->current.type && actor == demo->current.actor) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+s32 mDemo_Start(UNUSED Actor* actor) {
+ return FALSE;
+}
+
+s32 mDemo_Check_and_Go(s32 type, Actor* actor) {
+ if (mDemo_Check(type, actor) != FALSE) {
+ return mDemo_Start(actor);
+ }
+
+ return FALSE;
+}
+
+s32 mDemo_End(Actor* actor) {
+ if (actor == demo->current.actor) {
+ demo->state = DEMO_STATE_STOP;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void mDemo_Main(UNUSED Game_Play* play) {
+ main_proc();
+}
+
+void mDemo_Init(UNUSED Game_Play* play) {
+ demo->speaker = NULL;
+ demo->listener = NULL;
+ mDemo_Unset_SpeakerAble();
+ mDemo_Unset_ListenAble();
+ mDemo_Init_OrderValue();
+ mDemo_Clear_change_player_destiny();
+ init_demo();
+}
+
+s32 mDemo_CheckDemo() {
+ return demo->state != DEMO_STATE_WAIT;
+}
+
+s32 mDemo_CheckDemo4Event() {
+ switch (mDemo_CheckDemoType()) {
+ case DEMO_TYPE_NONE:
+ case DEMO_TYPE_EVENTMSG:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void mDemo_Set_SpeakerAble() {
+ demo->isAbleSpeaker = TRUE;
+}
+
+void mDemo_Set_ListenAble() {
+ demo->isAbleListener = TRUE;
+}
+
+void mDemo_Unset_SpeakerAble() {
+ demo->isAbleSpeaker = FALSE;
+}
+
+void mDemo_Unset_ListenAble() {
+ demo->isAbleListener = FALSE;
+}
+
+s32 mDemo_Check_SpeakerAble() {
+ return demo->isAbleSpeaker;
+}
+
+s32 mDemo_Check_ListenAble() {
+ return demo->isAbleListener;
+}
+
+int mDemo_Check_DiffAngle_forTalk(s16 diffAngle) {
+ return diffAngle > -5000 && diffAngle < 5000;
+}
+
+void mDemo_KeepCamera(s32 cameraType) {
+ demo->keepCameraType = cameraType;
+}
diff --git a/src/code/m_kankyo.c b/src/code/m_kankyo.c
index 4291b7d..a9b9de7 100644
--- a/src/code/m_kankyo.c
+++ b/src/code/m_kankyo.c
@@ -8,8 +8,6 @@
#include "m_event.h"
#include "audio.h"
#include "m_all_grow.h"
-#include "prevent_bss_reordering.h"
-#include "prevent_bss_reordering2.h"
#include "overlays/actors/player_actor/m_player.h"
#include "m_player_lib.h"
@@ -1469,6 +1467,8 @@ s32 mEnv_CheckNpcRoomPointLightNiceStatus() {
return ret;
}
+#include "prevent_bss_reordering2.h"
+
void mEnv_TaimatuPointLightWaveMoveProc(Game_Play* play) {
static s16 point_light_wave_counter;
diff --git a/src/code/m_roll_lib.c b/src/code/m_roll_lib.c
index 775f1fc..063c30d 100644
--- a/src/code/m_roll_lib.c
+++ b/src/code/m_roll_lib.c
@@ -7,7 +7,7 @@
#include "m_player_lib.h"
#include "sys_math_atan.h"
#include "m_collision_bg.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "macros.h"
void mRlib_spdXZ_to_spdF_Angle(xyz_t* speed, f32* speedf, s16* angle) {
diff --git a/src/overlays/actors/ovl_Dump/ac_dump.c b/src/overlays/actors/ovl_Dump/ac_dump.c
index b93651b..9897276 100644
--- a/src/overlays/actors/ovl_Dump/ac_dump.c
+++ b/src/overlays/actors/ovl_Dump/ac_dump.c
@@ -2,7 +2,7 @@
#include "m_actor_dlftbls.h"
#include "m_object.h"
#include "overlays/gamestates/ovl_play/m_play.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "m_player_lib.h"
#include "overlays/actors/player_actor/m_player.h"
#include "m_field_info.h"
diff --git a/src/overlays/actors/ovl_Kago/ac_kago.c b/src/overlays/actors/ovl_Kago/ac_kago.c
index 5cb3bc7..60867fb 100644
--- a/src/overlays/actors/ovl_Kago/ac_kago.c
+++ b/src/overlays/actors/ovl_Kago/ac_kago.c
@@ -3,7 +3,7 @@
#include "m_object.h"
#include "overlays/gamestates/ovl_play/m_play.h"
#include "overlays/actors/player_actor/m_player.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "m_field_info.h"
#include "m_player_lib.h"
#include "m_rcp.h"
diff --git a/src/overlays/actors/ovl_Koinobori/ac_koinobori.c b/src/overlays/actors/ovl_Koinobori/ac_koinobori.c
index f63c756..c92b162 100644
--- a/src/overlays/actors/ovl_Koinobori/ac_koinobori.c
+++ b/src/overlays/actors/ovl_Koinobori/ac_koinobori.c
@@ -5,7 +5,7 @@
#include "overlays/gamestates/ovl_play/m_play.h"
#include "c_keyframe.h"
#include "m_player_lib.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "m_field_info.h"
#include "audio.h"
#include "overlays/actors/player_actor/m_player.h"
diff --git a/src/overlays/actors/ovl_Mikuji/ac_mikuji.c b/src/overlays/actors/ovl_Mikuji/ac_mikuji.c
index 2504af7..bf34f3c 100644
--- a/src/overlays/actors/ovl_Mikuji/ac_mikuji.c
+++ b/src/overlays/actors/ovl_Mikuji/ac_mikuji.c
@@ -4,7 +4,7 @@
#include "m_player_lib.h"
#include "overlays/actors/player_actor/m_player.h"
#include "overlays/gamestates/ovl_play/m_play.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "gfx.h"
#include "m_field_info.h"
#include "m_rcp.h"
diff --git a/src/overlays/actors/ovl_Nameplate/ac_nameplate.c b/src/overlays/actors/ovl_Nameplate/ac_nameplate.c
index c74f8bb..36add1b 100644
--- a/src/overlays/actors/ovl_Nameplate/ac_nameplate.c
+++ b/src/overlays/actors/ovl_Nameplate/ac_nameplate.c
@@ -6,7 +6,7 @@
#include "m_player_lib.h"
#include "m_npc.h"
#include "m_msg_main.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "overlays/actors/player_actor/m_player.h"
#include "color.h"
diff --git a/src/overlays/actors/ovl_Sample/ac_sample.c b/src/overlays/actors/ovl_Sample/ac_sample.c
index f95d071..55f6db8 100644
--- a/src/overlays/actors/ovl_Sample/ac_sample.c
+++ b/src/overlays/actors/ovl_Sample/ac_sample.c
@@ -2,7 +2,7 @@
#include "m_actor_dlftbls.h"
#include "m_object.h"
#include "m_rcp.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "m_msg_main.h"
#include "overlays/gamestates/ovl_play/m_play.h"
diff --git a/src/overlays/actors/ovl_Tama/ac_tama.c b/src/overlays/actors/ovl_Tama/ac_tama.c
index afbfcfc..bb1b2ec 100644
--- a/src/overlays/actors/ovl_Tama/ac_tama.c
+++ b/src/overlays/actors/ovl_Tama/ac_tama.c
@@ -6,7 +6,7 @@
#include "overlays/actors/player_actor/m_player.h"
#include "m_player_lib.h"
#include "libc/math.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "m_field_info.h"
#include "code_variables.h"
#include "m_rcp.h"
diff --git a/src/overlays/actors/player_actor/m_player.c b/src/overlays/actors/player_actor/m_player.c
index 29cda2c..f187543 100644
--- a/src/overlays/actors/player_actor/m_player.c
+++ b/src/overlays/actors/player_actor/m_player.c
@@ -9,7 +9,7 @@
#include "m_name_table.h"
#include "m_scene_table.h"
#include "m_debug.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "67E840.h"
extern ClObjPipe_Init Player_actor_OcInfoData_forStand;
diff --git a/src/overlays/actors/player_actor/m_player.h b/src/overlays/actors/player_actor/m_player.h
index 1ce84a7..c1e350e 100644
--- a/src/overlays/actors/player_actor/m_player.h
+++ b/src/overlays/actors/player_actor/m_player.h
@@ -123,6 +123,7 @@ typedef union Player_MainIndexData {
u8 forceAlignment[72];
} Player_MainIndexData;
+typedef void* (*PlayerUnk122CFunc)(struct Game_Play*);
typedef void (*PlayerUnk1230Func)(struct Player*, struct Game_Play*, Actor*, s32, xyz_t*, f32);
typedef f32 (*PlayerUnk1234Func)(struct Player*, struct Game_Play*);
typedef void (*PlayerUnk1238Func)(struct Player*, struct Game_Play*, Actor*, s32);
@@ -158,7 +159,8 @@ typedef struct Player {
/* 0x0FA4 */ ClObjTris colliderTris2;
/* 0x0FB8 */ UNK_TYPE1 unk_0FB8[0x50];
/* 0x1008 */ ClObjPipe colliderPipe;
- /* 0x1024 */ UNK_TYPE1 unk_1024[0x20C];
+ /* 0x1024 */ UNK_TYPE1 unk_1024[0x208];
+ /* 0x122C */ PlayerUnk122CFunc unk_122C;
/* 0x1230 */ PlayerUnk1230Func unk_1230;
/* 0x1234 */ PlayerUnk1234Func unk_1234;
/* 0x1238 */ PlayerUnk1238Func unk_1238;
diff --git a/src/overlays/gamestates/ovl_play/m_play.c b/src/overlays/gamestates/ovl_play/m_play.c
index 864f414..64b6ec9 100644
--- a/src/overlays/gamestates/ovl_play/m_play.c
+++ b/src/overlays/gamestates/ovl_play/m_play.c
@@ -11,7 +11,7 @@
#include "audio.h"
#include "6EC9E0.h"
#include "m_time.h"
-#include "69E2C0.h"
+#include "m_demo.h"
#include "683030.h"
#include "6E3240.h"
#include "6C97F0.h"
@@ -387,7 +387,7 @@ void play_init(Game* game) {
mTM_set_season();
func_800B594C_jp();
mSM_submenu_ovlptr_init(game_play);
- func_8007CFD8_jp(game_play);
+ mDemo_Init(game_play);
mEv_init(&game_play->event);
initView(&game_play->view, gfxCtx);
func_80064F48_jp(game_play);
diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml
index 2ff8de6..7164735 100644
--- a/yamls/jp/code.yaml
+++ b/yamls/jp/code.yaml
@@ -27,6 +27,7 @@
- [0x69DD60, c, code/m_debug]
- [0x69DDF0, c, code/m_debug_display]
- [0x69E2C0, asm, code/69E2C0]
+ - [0x69F0B0, c, code/m_demo]
- [0x6A0DE0, asm, code/6A0DE0]
- [0x6A5B00, asm, code/6A5B00]
- [0x6A6C40, asm, code/6A6C40]
@@ -158,6 +159,8 @@
- [0x728430, data, code/69CB30]
- [0x728460, .data, code/m_debug_display]
- [0x7284B0, data, code/69E2C0]
+ - [0x7286C0, .data, code/m_demo]
+ - [0x728800, data, code/728800]
- [0x72AAC0, .data, code/m_game_dlftbls]
- [0x72ACB0, data, code/72ACB0]
- [0x72B400, .data, code/m_kankyo]
@@ -216,7 +219,7 @@
- [0x73A490, .rodata, code/m_controller]
- [0x73A4A0, rodata, code/73A4A0]
- [0x73A4D0, rodata, code/73A4D0]
- - [0x73A6A0, rodata, code/73A6A0]
+ - [0x73A6A0, .rodata, code/m_demo]
- [0x73A730, rodata, code/73A730]
- [0x73A9B0, rodata, code/73A9B0]
- [0x73A9C0, rodata, code/73A9C0]
@@ -294,7 +297,9 @@
- { start: 0x75B600, type: bss, vram: 0x80137960, name: code/80137960 }
- { start: 0x73F4D0, type: .bss, vram: 0x80138E50, name: code/m_debug}
- { start: 0x73F4D0, type: .bss, vram: 0x80138E60, name: code/m_debug_display}
- - { start: 0x73F4E0, type: bss, vram: 0x80138E70, name: code/80138E70 }
+ - { start: 0x73F4D0, type: bss, vram: 0x80138E70, name: code/80138E70 }
+ - { start: 0x73F4D0, type: .bss, vram: 0x80139C40, name: code/m_demo}
+ - { start: 0x73F4E0, type: bss, vram: 0x80139F70, name: code/80139F70}
- { start: 0x73F4D0, type: .bss, vram: 0x80141DE0, name: code/m_kankyo }
- { start: 0x73F4D0, type: .bss, vram: 0x80141E10, name: code/m_lights }
- { start: 0x75B600, type: .bss, vram: 0x80141FA0, name: code/m_malloc }