Implement & link ac_my_house

This commit is contained in:
Cuyler36
2024-02-27 14:44:08 -05:00
parent 0565854a62
commit 1b1e06c2cf
15 changed files with 3046 additions and 2269 deletions
+5
View File
@@ -716,6 +716,11 @@ ac_lotus.c:
ac_mikuji.c:
.text: [0x805B414C, 0x805B44C4]
.data: [0x806C5C10, 0x806C5CA0]
ac_my_house.c:
.text: [0x805B4CF4, 0x805B63FC]
.rodata: [0x8064AA50, 0x8064AAA0]
.data: [0x806C5DC0, 0x806C6110]
.bss: [0x813280B0, 0x813280C0]
ac_nameplate.c:
.text: [0x805B63FC, 0x805B65C4]
.data: [0x806C6110, 0x806C6138]
+24 -16
View File
@@ -8,24 +8,33 @@
extern "C" {
#endif
enum {
aID_STATE_0,
aID_STATE_TAKEN_HOUSE,
aID_STATE_FREE_HOUSE,
// more?
aID_STATE_NUM
};
typedef struct actor_intor_demo_s INTRO_DEMO_ACTOR;
struct actor_intor_demo_s {
ACTOR actor_class;
int action;
int rcn_action;
void (*action_proc)(ACTOR*, GAME*);
void* train1_actor_p; // TODO: correct type
void* station_master_actor_p; // TODO: correct type
void* rcn_guide_actor_p; // TODO: correct type
int player_in_intro_demo;
int player_intro_demo_state;
int selected_house;
int _198;
u8 first_field_bgm_state;
int _1A0;
int _1A4;
int _1A8;
ACTOR actor_class;
int action;
int rcn_action;
void (*action_proc)(ACTOR*, GAME*);
void* train1_actor_p; // TODO: correct type
void* station_master_actor_p; // TODO: correct type
void* rcn_guide_actor_p; // TODO: correct type
int player_in_intro_demo;
int player_intro_demo_state;
int selected_house;
int _198;
u8 first_field_bgm_state;
int _1A0;
int _1A4;
int _1A8;
};
extern ACTOR_PROFILE Intro_Demo_Profile;
@@ -35,4 +44,3 @@ extern ACTOR_PROFILE Intro_Demo_Profile;
#endif
#endif
+4 -21
View File
@@ -3,32 +3,16 @@
#include "types.h"
#include "m_actor.h"
#include "ac_structure.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct actor_my_house_s MY_HOUSE_ACTOR;
typedef struct my_house_actor_s MY_HOUSE_ACTOR;
struct actor_my_house_s {
ACTOR actor_class;
int _174;
cKF_SkeletonInfo_R_c keyframe;
int _1E8;
s_xyz work_area[15];
s_xyz morph_area[15];
u8 _2A0[0x2B0 - 0x2A0];
int door_rotation_speed_idx;
int house_no;
int house_shape;
int _2BC;
int _2C0;
int intro_flag;
f32 door_pos_x;
f32 door_poz_z;
f32 door_rotation_speed;
f32 _2D4;
int season;
struct my_house_actor_s {
STRUCTURE_ACTOR structure_class;
};
extern ACTOR_PROFILE MyHouse_Profile;
@@ -38,4 +22,3 @@ extern ACTOR_PROFILE MyHouse_Profile;
#endif
#endif
+157 -153
View File
@@ -11,218 +11,220 @@ extern "C" {
#define mCoBG_HEIGHT_MAX 31
enum field_layer {
mCoBG_LAYER0,
mCoBG_LAYER1,
mCoBG_LAYER2,
mCoBG_LAYER3,
mCoBG_LAYER0,
mCoBG_LAYER1,
mCoBG_LAYER2,
mCoBG_LAYER3,
mCoBG_LAYER_NUM
mCoBG_LAYER_NUM
};
enum {
mCoBG_FTR_TYPEA,
mCoBG_FTR_TYPEB_0,
mCoBG_FTR_TYPEB_180,
mCoBG_FTR_TYPEB_270,
mCoBG_FTR_TYPEB_90,
mCoBG_FTR_TYPEC,
mCoBG_FTR_TYPEA,
mCoBG_FTR_TYPEB_0,
mCoBG_FTR_TYPEB_180,
mCoBG_FTR_TYPEB_270,
mCoBG_FTR_TYPEB_90,
mCoBG_FTR_TYPEC,
mCoBG_FTR_TYPE_NUM
mCoBG_FTR_TYPE_NUM
};
enum background_attribute {
/* TODO: finish */
mCoBG_ATTRIBUTE_GRASS0,
mCoBG_ATTRIBUTE_GRASS1,
mCoBG_ATTRIBUTE_GRASS2,
mCoBG_ATTRIBUTE_GRASS3,
mCoBG_ATTRIBUTE_SOIL0,
mCoBG_ATTRIBUTE_SOIL1,
mCoBG_ATTRIBUTE_SOIL2,
mCoBG_ATTRIBUTE_STONE,
mCoBG_ATTRIBUTE_FLOOR,
mCoBG_ATTRIBUTE_BUSH,
mCoBG_ATTRIBUTE_HOLE,
mCoBG_ATTRIBUTE_WAVE,
mCoBG_ATTRIBUTE_WATER,
mCoBG_ATTRIBUTE_WATERFALL,
mCoBG_ATTRIBUTE_RIVER_N,
mCoBG_ATTRIBUTE_RIVER_NW,
mCoBG_ATTRIBUTE_RIVER_W,
mCoBG_ATTRIBUTE_RIVER_SW,
mCoBG_ATTRIBUTE_RIVER_S,
mCoBG_ATTRIBUTE_RIVER_SE,
mCoBG_ATTRIBUTE_RIVER_E,
mCoBG_ATTRIBUTE_RIVER_NE,
mCoBG_ATTRIBUTE_SAND,
mCoBG_ATTRIBUTE_WOOD,
mCoBG_ATTRIBUTE_SEA,
// ...
/* TODO: finish */
mCoBG_ATTRIBUTE_GRASS0,
mCoBG_ATTRIBUTE_GRASS1,
mCoBG_ATTRIBUTE_GRASS2,
mCoBG_ATTRIBUTE_GRASS3,
mCoBG_ATTRIBUTE_SOIL0,
mCoBG_ATTRIBUTE_SOIL1,
mCoBG_ATTRIBUTE_SOIL2,
mCoBG_ATTRIBUTE_STONE,
mCoBG_ATTRIBUTE_FLOOR,
mCoBG_ATTRIBUTE_BUSH,
mCoBG_ATTRIBUTE_HOLE,
mCoBG_ATTRIBUTE_WAVE,
mCoBG_ATTRIBUTE_WATER,
mCoBG_ATTRIBUTE_WATERFALL,
mCoBG_ATTRIBUTE_RIVER_N,
mCoBG_ATTRIBUTE_RIVER_NW,
mCoBG_ATTRIBUTE_RIVER_W,
mCoBG_ATTRIBUTE_RIVER_SW,
mCoBG_ATTRIBUTE_RIVER_S,
mCoBG_ATTRIBUTE_RIVER_SE,
mCoBG_ATTRIBUTE_RIVER_E,
mCoBG_ATTRIBUTE_RIVER_NE,
mCoBG_ATTRIBUTE_SAND,
mCoBG_ATTRIBUTE_WOOD,
mCoBG_ATTRIBUTE_SEA,
// ...
mCoBG_ATTRIBUTE_NONE = 100
};
enum {
mCoBG_PLANT0 = 0, /* Stay a sapling */
mCoBG_PLANT1 = 1, /* Grow until the first stage of growth */
mCoBG_PLANT2 = 2, /* Grow until the second stage of growth */
mCoBG_PLANT3 = 3, /* Grow until the third stage of growth */
mCoBG_PLANT4 = 4, /* Fully grow */
mCoBG_PLANT0 = 0, /* Stay a sapling */
mCoBG_PLANT1 = 1, /* Grow until the first stage of growth */
mCoBG_PLANT2 = 2, /* Grow until the second stage of growth */
mCoBG_PLANT3 = 3, /* Grow until the third stage of growth */
mCoBG_PLANT4 = 4, /* Fully grow */
mCoBG_KILL_PLANT = 7 /* No growth, all plants die on this unit */
mCoBG_KILL_PLANT = 7 /* No growth, all plants die on this unit */
};
enum {
mCoBG_DIRECT_N,
mCoBG_DIRECT_W,
mCoBG_DIRECT_S,
mCoBG_DIRECT_E,
mCoBG_DIRECT_NW,
mCoBG_DIRECT_NE,
mCoBG_DIRECT_SE,
mCoBG_DIRECT_SW,
mCoBG_DIRECT_N,
mCoBG_DIRECT_W,
mCoBG_DIRECT_S,
mCoBG_DIRECT_E,
mCoBG_DIRECT_NW,
mCoBG_DIRECT_NE,
mCoBG_DIRECT_SE,
mCoBG_DIRECT_SW,
mCoBG_DIRECT_NUM
mCoBG_DIRECT_NUM
};
enum {
mCoBG_AREA_N,
mCoBG_AREA_W,
mCoBG_AREA_S,
mCoBG_AREA_E,
mCoBG_AREA_N,
mCoBG_AREA_W,
mCoBG_AREA_S,
mCoBG_AREA_E,
mCoBG_AREA_NUM
mCoBG_AREA_NUM
};
/* sizeof(mCoBG_CollisionData_c) == 4*/
typedef struct collision_bg_data_s {
/* 1------- -------- -------- -------- */ u32 shape:1; /* collision shape */
/* -11111-- -------- -------- -------- */ u32 center:5;
/* ------11 111----- -------- -------- */ u32 top_left:5;
/* -------- ---11111 -------- -------- */ u32 bot_left:5;
/* -------- -------- 11111--- -------- */ u32 top_right:5;
/* -------- -------- -----111 11------ */ u32 bot_right:5;
/* -------- -------- -------- --111111 */ u32 unit_attribute:6; /* background_attribute type */
/* 1------- -------- -------- -------- */ u32 shape : 1; /* collision shape */
/* -11111-- -------- -------- -------- */ u32 center : 5;
/* ------11 111----- -------- -------- */ u32 top_left : 5;
/* -------- ---11111 -------- -------- */ u32 bot_left : 5;
/* -------- -------- 11111--- -------- */ u32 top_right : 5;
/* -------- -------- -----111 11------ */ u32 bot_right : 5;
/* -------- -------- -------- --111111 */ u32 unit_attribute : 6; /* background_attribute type */
} mCoBG_CollisionData_c;
/* sizeof (mCoBG_Collision_u) == 4 */
typedef union collision_bg_u {
mCoBG_CollisionData_c data;
u32 raw;
mCoBG_CollisionData_c data;
u32 raw;
} mCoBG_Collision_u;
typedef struct collision_unit_info_s {
mCoBG_Collision_u* collision;
f32 leftUp_offset;
f32 leftDown_offset;
f32 rightDown_offset;
f32 rightUp_offset;
f32 base_height;
f32 pos_x;
f32 pos_z;
int ut_x;
int ut_z;
int shape;
u8 attribute;
mActor_name_t item;
mCoBG_Collision_u* collision;
f32 leftUp_offset;
f32 leftDown_offset;
f32 rightDown_offset;
f32 rightUp_offset;
f32 base_height;
f32 pos_x;
f32 pos_z;
int ut_x;
int ut_z;
int shape;
u8 attribute;
mActor_name_t item;
} mCoBG_UnitInfo_c;
#define mCoBG_HIT_WALL (1 << 0) /* in contact with *any* wall */
#define mCoBG_HIT_WALL (1 << 0) /* in contact with *any* wall */
#define mCoBG_HIT_WALL_FRONT (1 << 1) /* in contact with wall to the front */
#define mCoBG_HIT_WALL_RIGHT (1 << 2) /* in contact with wall to the right */
#define mCoBG_HIT_WALL_LEFT (1 << 3) /* in contact with wall to the left */
#define mCoBG_HIT_WALL_BACK (1 << 4) /* in contact with wall to the back */
#define mCoBG_HIT_WALL_LEFT (1 << 3) /* in contact with wall to the left */
#define mCoBG_HIT_WALL_BACK (1 << 4) /* in contact with wall to the back */
typedef struct collision_bg_check_result_s {
u32 on_ground:1;
u32 hit_attribute_wall:5;
u32 hit_wall:5;
u32 hit_wall_count:3;
u32 unk_flag0:1;
u32 unit_attribute:6;
u32 is_on_move_bg_obj:1;
u32 is_in_water:1;
u32 unk_flag1:1;
u32 unk_flag2:1;
u32 unk_flag3:1;
u32 unk_flag4:1;
u32 unk_flag5:1;
u32 unk_flag6:4;
u32 on_ground : 1;
u32 hit_attribute_wall : 5;
u32 hit_wall : 5;
u32 hit_wall_count : 3;
u32 unk_flag0 : 1;
u32 unit_attribute : 6;
u32 is_on_move_bg_obj : 1;
u32 is_in_water : 1;
u32 unk_flag1 : 1;
u32 unk_flag2 : 1;
u32 unk_flag3 : 1;
u32 unk_flag4 : 1;
u32 unk_flag5 : 1;
u32 unk_flag6 : 4;
} mCoBG_CheckResult_c;
typedef struct wall_info_s {
s16 angleY;
s16 type;
s16 angleY;
s16 type;
} mCoBG_WallInfo_c;
typedef struct collision_bg_check_s {
mCoBG_Collision_u collision_units[5];
mCoBG_CheckResult_c result;
f32 wall_top_y;
f32 wall_bottom_y;
f32 ground_y;
mCoBG_WallInfo_c wall_info[2];
s16 in_front_wall_angle_y;
mCoBG_Collision_u collision_units[5];
mCoBG_CheckResult_c result;
f32 wall_top_y;
f32 wall_bottom_y;
f32 ground_y;
mCoBG_WallInfo_c wall_info[2];
s16 in_front_wall_angle_y;
} mCoBG_Check_c;
typedef struct bg_side_contact_s {
s16 name;
s16 angle;
s16 name;
s16 angle;
} mCoBG_side_contact_c;
typedef struct bg_contact_s {
mCoBG_side_contact_c side_contact[5];
int side_count;
s16 on_contact_names[5];
int on_count;
mCoBG_side_contact_c side_contact[5];
int side_count;
s16 on_contact_names[5];
int on_count;
} mCoBG_bg_contact_c;
typedef struct bg_size_s {
f32 right_size; // x | *->
f32 left_size; // x | <-*
f32 up_size; // z | ^
f32 down_size; // z | v
f32 right_size; // x | *->
f32 left_size; // x | <-*
f32 up_size; // z | ^
f32 down_size; // z | v
} mCoBG_bg_size_c;
typedef struct bg_register_s {
xyz_t* wpos;
xyz_t* last_wpos;
s16* angle_y;
mCoBG_bg_contact_c* contact;
mCoBG_bg_size_c* bg_size;
xyz_t* base_ofs;
f32 height;
u32 attribute;
f32 active_dist;
f32* scale_percent;
xyz_t* wpos;
xyz_t* last_wpos;
s16* angle_y;
mCoBG_bg_contact_c* contact;
mCoBG_bg_size_c* bg_size;
xyz_t* base_ofs;
f32 height;
u32 attribute;
f32 active_dist;
f32* scale_percent;
} mCoBG_bg_regist_c;
typedef struct collision_offset_table_s {
u8 unit_attribute;
s8 centerRight_offset;
s8 leftUp_offset;
s8 leftDown_offset;
s8 rightDown_offset;
s8 rightUp_offset;
s8 shape;
u8 unit_attribute;
s8 centerRight_offset;
s8 leftUp_offset;
s8 leftDown_offset;
s8 rightDown_offset;
s8 rightUp_offset;
s8 shape;
} mCoBG_OffsetTable_c;
typedef struct collision_actor_info_s {
mActor_name_t name_id;
u8 _02;
u8 on_ground;
u8 _04;
u8 in_water;
u8 _06[2]; // alignment?
mCoBG_CheckResult_c* check_res_p;
xz_t speed_xz0;
xz_t speed_xz1;
xyz_t center_pos;
xyz_t old_center_pos;
xyz_t rev_pos;
u8 _40[4];
f32 _44;
f32 _48;
f32 _4C;
u8 _50[0x20];
mActor_name_t name_id;
u8 _02;
u8 on_ground;
u8 _04;
u8 in_water;
u8 _06[2]; // alignment?
mCoBG_CheckResult_c* check_res_p;
xz_t speed_xz0;
xz_t speed_xz1;
xyz_t center_pos;
xyz_t old_center_pos;
xyz_t rev_pos;
u8 _40[4];
f32 _44;
f32 _48;
f32 _4C;
u8 _50[0x20];
} mCoBG_ActorInf_c;
extern u32 mCoBG_Wpos2BgAttribute_Original(xyz_t wpos);
@@ -235,15 +237,17 @@ extern int mCoBG_CheckHole_OrgAttr(u32 attribute);
extern f32 mCoBG_GetBgY_OnlyCenter_FromWpos(xyz_t wpos, f32 dist);
extern f32 mCoBG_GetBgY_OnlyCenter_FromWpos2(xyz_t wpos, f32 foot_dist);
extern int mCoBG_Attribute2CheckPlant(u32 attribute, const xyz_t* wpos);
extern void mCoBG_BgCheckControll(xyz_t* reverse_pos, ACTOR* actor, f32 check_range, f32 offset_y, s16 wall_attr_check, s16 no_reverse, s16 check_type);
extern void mCoBG_BgCheckControll(xyz_t* reverse_pos, ACTOR* actor, f32 check_range, f32 offset_y, s16 wall_attr_check,
s16 no_reverse, s16 check_type);
extern int mCoBG_Height2GetLayer(f32 height);
extern void mCoBG_SetPlussOffset(xyz_t wpos, s16 offset, s16 new_attrib);
extern int mCoBG_GetLayer(const xyz_t* wpos);
extern int mCoBG_GetLayer(const xyz_t* wpos);
extern int mCoBG_BnumUnum2HoleNumber(int block_x, int block_z, int ut_x, int ut_z);
extern u32 mCoBG_UtNum2BgAttr(int ut_x, int ut_z);
extern f32 mCoBG_UtNum2UtCenterY(int ut_x, int ut_z);
extern int mCoBG_CheckCliffAttr(u32 attribute);
extern void mCoBG_SetPluss5PointOffset_file(xyz_t pos, mCoBG_OffsetTable_c offsetptr, const char* file, int line);
#define mCoBG_SetPluss5PointOffset(pos, offsetptr) mCoBG_SetPluss5PointOffset_file(pos, offsetptr, __FILE__, __LINE__);
extern int mCoBG_Change2PoorAttr(mCoBG_Collision_u* col);
extern int mCoBG_CheckHole(xyz_t wpos);
extern int mCoBG_CheckSkySwing(xyz_t wpos);
+1 -2
View File
@@ -209,8 +209,7 @@ typedef struct common_data_s {
/* 0x0264E4 */ mNpc_NpcList_c island_npclist[1]; // TODO: define for island npc count
/* 0x02651C */ mActor_name_t house_owner_name;
/* 0x02651E */ mActor_name_t last_field_id;
/* 0x026520 */ u8
in_initial_block; /* when TRUE, the player is in the acre which they exited a building. FALSE otherwise. */
/* 0x026520 */ u8 in_initial_block; /* when TRUE, the player is in acre they exited a building. FALSE otherwise. */
/* 0x026521 */ u8 submenu_disabled; /* when set, submenus cannot be accessed from start button */
/* 0x026522 */ u8 sunlight_flag;
/* 0x026523 */ u8 train_flag;
+4
View File
@@ -2699,6 +2699,10 @@ extern int mNT_check_unknown(mActor_name_t item_no);
#define NPC_END (NPC_START + 236)
#define DUMMY_START 0xF000
#define DUMMY_HOUSE0 0xF0F3
#define DUMMY_HOUSE1 0xF0F4
#define DUMMY_HOUSE2 0xF0F5
#define DUMMY_HOUSE3 0xF0F6
#define DUMMY_HANIWA0 0xF0FB
#define DUMMY_HANIWA1 (DUMMY_HANIWA0 + 1)
#define DUMMY_HANIWA2 (DUMMY_HANIWA1 + 1)
+5 -2
View File
@@ -27,7 +27,7 @@ extern void mPlib_change_player_cloth_info_lv2(Private_c* priv, mActor_name_t cl
extern int mPlib_Get_address_able_display();
extern int mPlib_get_player_actor_main_index(GAME* game);
extern int mPlib_check_player_actor_main_index_AllWade(GAME_PLAY* play);
extern int mPlib_request_main_demo_wait_type1(GAME_PLAY* play, int param_2, void* param_3);
extern int mPlib_request_main_demo_wait_type1(GAME* game, int param_2, void* param_3);
extern int mPlib_request_main_talk_type1(GAME_PLAY* play, ACTOR* other_actor, int turn, int flag);
extern int mPlib_request_main_talk_end_type1(GAME_PLAY* play, int return_demo_wait, int return_get_golden_axe_demo);
extern int mPlib_request_main_door_type1(GAME* game, const xyz_t* pos, s16 angle_y, int door_type, void* door_label);
@@ -45,7 +45,8 @@ extern int mPlib_Check_able_force_speak_label(GAME* game, ACTOR* label);
extern int mPlib_able_submenu_type1(GAME* game);
extern void mPlib_request_main_demo_wait_from_submenu(ACTOR* force_speak_label);
extern void mPlib_Load_PlayerTexAndPallet(void* tex_p, void* pal_p, int idx);
extern void mPlib_request_main_give_from_submenu(mActor_name_t disp_item, int submenu_ovl, int present_flag, int counter_flag);
extern void mPlib_request_main_give_from_submenu(mActor_name_t disp_item, int submenu_ovl, int present_flag,
int counter_flag);
extern int mPlib_Check_tree_shaken_big(const xyz_t* pos);
extern int mPlib_Check_tree_shaken_little(const xyz_t* pos);
extern int mPlib_request_main_recieve_wait_type1(GAME* game, mActor_name_t item, int counter_flag);
@@ -56,6 +57,8 @@ extern int mPlib_Get_end_player_demo_walk();
extern int mPlib_request_main_demo_geton_boat_type1(f32 goal_x, f32 goal_z, s16 angleY);
extern int mPlib_request_main_demo_getoff_boat_standup_type1(const xyz_t* pos, s16 angleY);
extern int mPlib_check_player_actor_main_index_RecieveMove(GAME* game);
extern int mPlib_check_label_player_demo_wait(GAME* game, void* label);
extern int mPlib_check_player_outdoor_start(GAME* game);
extern mPlayer_change_data_from_submenu_c* mPlib_Get_change_data_from_submenu_p();
+92 -80
View File
@@ -13,125 +13,138 @@ extern "C" {
#define mSc_ARENA_SIZE 0xA000
enum {
mSc_DIRECT_SOUTH,
mSc_DIRECT_SOUTH_EAST,
mSc_DIRECT_EAST,
mSc_DIRECT_NORTH_EAST,
mSc_DIRECT_NORTH,
mSc_DIRECT_NORTH_WEST,
mSc_DIRECT_WEST,
mSc_DIRECT_SOUTH_WEST,
mSc_DIRECT_NUM
};
typedef struct door_data_s {
int next_scene_id;
u8 exit_orientation;
u8 exit_type; // 0 = normal, 1 = restart game?
u16 extra_data;
s_xyz exit_position;
mActor_name_t door_actor_name;
u8 wipe_type;
u8 pad[3]; // possibly necessary due to struct copy
int next_scene_id;
u8 exit_orientation;
u8 exit_type; // 0 = normal, 1 = restart game?
u16 extra_data;
s_xyz exit_position;
mActor_name_t door_actor_name;
u8 wipe_type;
u8 pad[3]; // possibly necessary due to struct copy
} Door_data_c;
#define mSc_OBJECT_BANK_NUM 70
typedef struct object_bank_s {
s16 bank_id;
char* ram_start;
char* dma_start;
u32 rom_addr;
size_t size;
u32 _14;
int _18;
int _1C;
int _20;
int _24;
int _28;
OSMessageQueue* msg_queue_p;
OSMessage _30_msg;
OSMessageQueue dma_controller_msg_queue;
OSMessage dma_controller_msg;
s16 num_exist;
u8 part_id;
u8 state;
s16 bank_id;
char* ram_start;
char* dma_start;
u32 rom_addr;
size_t size;
u32 _14;
int _18;
int _1C;
int _20;
int _24;
int _28;
OSMessageQueue* msg_queue_p;
OSMessage _30_msg;
OSMessageQueue dma_controller_msg_queue;
OSMessage dma_controller_msg;
s16 num_exist;
u8 part_id;
u8 state;
} Object_Bank_c;
typedef struct object_exchange_s {
Object_Bank_c banks[mSc_OBJECT_BANK_NUM];
int bank_idx;
int keep_id;
int exchange_id;
char* next_bank_ram_address;
char* max_ram_address;
char* start_address_save[2];
char* end_address_save[2];
char* _194C;
int selected_partition;
int _1954;
Object_Bank_c banks[mSc_OBJECT_BANK_NUM];
int bank_idx;
int keep_id;
int exchange_id;
char* next_bank_ram_address;
char* max_ram_address;
char* start_address_save[2];
char* end_address_save[2];
char* _194C;
int selected_partition;
int _1954;
} Object_Exchange_c;
enum {
mSc_SCENE_DATA_TYPE_PLAYER_PTR,
mSc_SCENE_DATA_TYPE_CTRL_ACTOR_PTR,
mSc_SCENE_DATA_TYPE_ACTOR_PTR,
mSc_SCENE_DATA_TYPE_OBJECT_EXCHANGE_BANK_PTR,
mSc_SCENE_DATA_TYPE_DOOR_DATA_PTR,
mSc_SCENE_DATA_TYPE_FIELD_CT,
mSc_SCENE_DATA_TYPE_MY_ROOM_CT,
mSc_SCENE_DATA_TYPE_ARRANGE_ROOM_CT,
mSc_SCENE_DATA_TYPE_ARRANGE_FURNITURE_CT,
mSc_SCENE_DATA_TYPE_SOUND,
mSc_SCENE_DATA_TYPE_END,
mSc_SCENE_DATA_TYPE_PLAYER_PTR,
mSc_SCENE_DATA_TYPE_CTRL_ACTOR_PTR,
mSc_SCENE_DATA_TYPE_ACTOR_PTR,
mSc_SCENE_DATA_TYPE_OBJECT_EXCHANGE_BANK_PTR,
mSc_SCENE_DATA_TYPE_DOOR_DATA_PTR,
mSc_SCENE_DATA_TYPE_FIELD_CT,
mSc_SCENE_DATA_TYPE_MY_ROOM_CT,
mSc_SCENE_DATA_TYPE_ARRANGE_ROOM_CT,
mSc_SCENE_DATA_TYPE_ARRANGE_FURNITURE_CT,
mSc_SCENE_DATA_TYPE_SOUND,
mSc_SCENE_DATA_TYPE_END,
mSc_SCENE_DATA_TYPE_NUM
mSc_SCENE_DATA_TYPE_NUM
};
typedef struct {
u8 type;
u8 num_actors;
Actor_data* data_p;
u8 type;
u8 num_actors;
Actor_data* data_p;
} Scene_Word_Data_Actor_c;
typedef struct {
u8 type;
u8 num_ctrl_actors;
s16* ctrl_actor_profile_p;
u8 type;
u8 num_ctrl_actors;
s16* ctrl_actor_profile_p;
} Scene_Word_Data_Ctrl_Actor_c;
typedef struct {
u8 type;
u8 num_banks;
s16* banks_p;
u8 type;
u8 num_banks;
s16* banks_p;
} Scene_Word_Data_Object_Bank_c;
typedef struct {
u8 type;
u8 num_doors;
Door_data_c* door_data_p;
u8 type;
u8 num_doors;
Door_data_c* door_data_p;
} Scene_Word_Data_Door_Data_c;
typedef struct {
u8 type;
u8 item_type;
u8 bg_num;
u16 bg_disp_size;
u8 room_type;
u8 draw_type;
u8 type;
u8 item_type;
u8 bg_num;
u16 bg_disp_size;
u8 room_type;
u8 draw_type;
} Scene_Word_Data_FieldCt_c;
typedef struct {
u8 type;
u8 arrange_ftr_num;
u8 type;
u8 arrange_ftr_num;
} Scene_Word_Data_ArrangeFurniture_ct_c;
typedef struct {
u8 type;
u8 type;
} Scene_Word_Data_Misc_c;
typedef union scene_word_u {
Scene_Word_Data_Misc_c misc; /* MY_ROOM_CT, ARRANGE_ROOM_CT, ARRANGE_FURNITURE_CT, SOUND */
Scene_Word_Data_Actor_c actor; /* PLAYER_PTR, ACTOR_PTR */
Scene_Word_Data_Ctrl_Actor_c control_actor;
Scene_Word_Data_Object_Bank_c object_bank;
Scene_Word_Data_Door_Data_c door_data;
Scene_Word_Data_FieldCt_c field_ct;
Scene_Word_Data_ArrangeFurniture_ct_c arrange_ftr_ct;
Scene_Word_Data_Misc_c misc; /* MY_ROOM_CT, ARRANGE_ROOM_CT, ARRANGE_FURNITURE_CT, SOUND */
Scene_Word_Data_Actor_c actor; /* PLAYER_PTR, ACTOR_PTR */
Scene_Word_Data_Ctrl_Actor_c control_actor;
Scene_Word_Data_Object_Bank_c object_bank;
Scene_Word_Data_Door_Data_c door_data;
Scene_Word_Data_FieldCt_c field_ct;
Scene_Word_Data_ArrangeFurniture_ct_c arrange_ftr_ct;
} Scene_Word_u;
typedef struct door_info_s {
u8 num_doors;
Door_data_c* door_data_p;
u8 num_doors;
Door_data_c* door_data_p;
} Door_info_c;
extern Scene_Word_u test01_info[];
@@ -202,7 +215,6 @@ extern int goto_next_scene(GAME_PLAY* play, int next_idx, int update_player_mode
extern int goto_emu_game(GAME_PLAY* play, u8 famicom_rom_id);
extern void return_emu_game(GAME* game);
#ifdef __cplusplus
}
#endif
+548 -621
View File
File diff suppressed because it is too large Load Diff
+212
View File
@@ -0,0 +1,212 @@
#include "ac_my_house.h"
#include "m_name_table.h"
#include "bg_item_h.h"
#include "m_common_data.h"
#include "m_house.h"
#include "m_player_lib.h"
#include "m_demo.h"
#include "ac_intro_demo.h"
#include "m_bgm.h"
#include "sys_matrix.h"
#include "m_rcp.h"
#include "libforest/gbi_extensions.h"
enum {
aMHS_ACTION_WAIT,
aMHS_ACTION_OPEN_DOOR_WAIT,
aMHS_ACTION_OPEN_DOOR,
aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT,
aMHS_ACTION_NUM
};
static void aMHS_actor_ct(ACTOR*, GAME*);
static void aMHS_actor_dt(ACTOR*, GAME*);
static void aMHS_actor_init(ACTOR*, GAME*);
static void aMHS_actor_draw(ACTOR*, GAME*);
static int aMHS_light_ctrl(STRUCTURE_ACTOR* my_house);
static void aMHS_setup_action(STRUCTURE_ACTOR* my_house, int action);
static void aMHS_setup_animation(STRUCTURE_ACTOR* my_house, f32 speed);
static void aMHS_set_bgOffset(ACTOR* actorx, int flag);
ACTOR_PROFILE MyHouse_Profile = {
mAc_PROFILE_MYHOUSE,
ACTOR_PART_ITEM,
ACTOR_STATE_NONE,
HOUSE0,
ACTOR_OBJ_BANK_KEEP,
sizeof(MY_HOUSE_ACTOR),
&aMHS_actor_ct,
&aMHS_actor_dt,
&aMHS_actor_init,
&aMHS_actor_draw,
NULL,
};
static u8 aMHS_lv1_shadowE_vtx_fix_flg_table[] = {
FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE,
};
static u8 aMHS_lv1_shadowW_vtx_fix_flg_table[] = {
TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE,
};
extern Vtx obj_myhome1_shadowE_v[];
extern Gfx obj_myhome1_shadowET_model[];
static bIT_ShadowData_c aMHS_lv1_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome1_shadowE_v, obj_myhome1_shadowET_model,
};
extern Vtx obj_myhome1_shadowW_v[];
extern Gfx obj_myhome1_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv1_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome1_shadowW_v, obj_myhome1_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv1_shadow_data[2] = { &aMHS_lv1_shadowW_data, &aMHS_lv1_shadowE_data };
extern Vtx obj_myhome2_shadowE_v[];
extern Gfx obj_myhome2_shadowET_model[];
static bIT_ShadowData_c aMHS_lv2_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome2_shadowE_v, obj_myhome2_shadowET_model,
};
extern Vtx obj_myhome2_shadowW_v[];
extern Gfx obj_myhome2_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv2_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome2_shadowW_v, obj_myhome2_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv2_shadow_data[2] = { &aMHS_lv2_shadowW_data, &aMHS_lv2_shadowE_data };
extern Vtx obj_myhome3_shadowE_v[];
extern Gfx obj_myhome3_shadowET_model[];
static bIT_ShadowData_c aMHS_lv3_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome3_shadowE_v, obj_myhome3_shadowET_model,
};
extern Vtx obj_myhome3_shadowW_v[];
extern Gfx obj_myhome3_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv3_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome3_shadowW_v, obj_myhome3_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv3_shadow_data[2] = { &aMHS_lv3_shadowW_data, &aMHS_lv3_shadowE_data };
extern Vtx obj_myhome4_shadowE_v[];
extern Gfx obj_myhome4_shadowET_model[];
static bIT_ShadowData_c aMHS_lv4_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome4_shadowE_v, obj_myhome4_shadowET_model,
};
extern Vtx obj_myhome4_shadowW_v[];
extern Gfx obj_myhome4_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv4_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome4_shadowW_v, obj_myhome4_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv4_shadow_data[2] = { &aMHS_lv4_shadowW_data, &aMHS_lv4_shadowE_data };
static f32 aMHS_posX_table[2] = { 20.0f, -20.0f };
static int aMHS_door_closed_flag[mHm_HOMESIZE_NUM - 1];
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome1;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome1;
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome2;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome2;
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome3;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome3;
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome4;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome4;
static void aMHS_actor_ct(ACTOR* actorx, GAME* game) {
static cKF_Skeleton_R_c* skl[mHm_HOMESIZE_NUM - 1][2] = {
{ &cKF_bs_r_obj_s_myhome1, &cKF_bs_r_obj_w_myhome1 },
{ &cKF_bs_r_obj_s_myhome2, &cKF_bs_r_obj_w_myhome2 },
{ &cKF_bs_r_obj_s_myhome3, &cKF_bs_r_obj_w_myhome3 },
{ &cKF_bs_r_obj_s_myhome4, &cKF_bs_r_obj_w_myhome4 },
};
static s16 angle_table[2] = { DEG2SHORT_ANGLE(90.0f), DEG2SHORT_ANGLE(0.0f) };
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
int house_idx = actorx->npc_id - HOUSE0;
int side_idx = house_idx & 1;
int size = Save_Get(homes[house_idx]).size_info.size;
int season;
s16 param_2 = 50;
my_house->season = Common_Get(time.season);
season = my_house->season == mTM_SEASON_WINTER;
if (size != mHm_HOMESIZE_UPPER) {
param_2 = 5 + size;
}
cKF_SkeletonInfo_R_ct(&my_house->keyframe, skl[size][season], NULL, my_house->work_area, my_house->morph_area);
my_house->action = house_idx;
my_house->arg0 = size;
my_house->arg2 = param_2;
my_house->arg1 = Save_Get(homes[house_idx]).outlook_pal;
my_house->arg1 += aSTR_PAL_MYHOME_A;
actorx->world.position.x += aMHS_posX_table[side_idx];
actorx->world.position.z += 20.0f;
// arg0_f = x pos + 2 * posX_table, arg1_f = z pos + 40.0f
my_house->arg0_f = actorx->world.position.x;
my_house->arg0_f += aMHS_posX_table[side_idx];
my_house->arg1_f = actorx->world.position.z + 20.0f;
my_house->arg3 = mEv_CheckFirstIntro() != FALSE;
if (aMHS_light_ctrl(my_house) != FALSE) {
actorx->world.angle.x = DEG2SHORT_ANGLE(90.0f) - 1; // 0x3FFF
} else {
actorx->world.angle.x = DEG2SHORT_ANGLE(0.0f);
}
actorx->shape_info.rotation.y = angle_table[side_idx];
actorx->world.angle.z = DEG2SHORT_ANGLE(0.0f);
actorx->cull_width = 450.0f;
actorx->cull_radius = 450.0f;
if (mPr_CheckFishCompleteTalk(mHS_get_pl_no(house_idx))) {
actorx->speed = TRUE; // Store fish weathervane bool as... speed?
}
if (mPr_CheckInsectCompleteTalk(mHS_get_pl_no(house_idx))) {
actorx->gravity = TRUE; // Store insect plaque bool as... gravity?
}
aMHS_setup_action(my_house, aMHS_ACTION_WAIT);
aMHS_setup_animation(my_house, 0.0f);
cKF_SkeletonInfo_R_play(&my_house->keyframe);
aMHS_set_bgOffset(actorx, 1);
aMHS_door_closed_flag[my_house->arg0] = TRUE;
}
static void aMHS_actor_dt(ACTOR* actorx, GAME* game) {
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
int house_idx = actorx->npc_id - HOUSE0;
cKF_SkeletonInfo_R_dt(&my_house->keyframe);
actorx->world.position.x -= aMHS_posX_table[house_idx & 1];
actorx->world.position.z -= 20.0f;
}
#include "../src/ac_my_house_move.c_inc"
#include "../src/ac_my_house_draw.c_inc"
+260
View File
@@ -0,0 +1,260 @@
static int aMHS_actor_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) {
static s16 angle_table[2] = { DEG2SHORT_ANGLE(0.0f), DEG2SHORT_ANGLE(90.0f) };
GRAPH* graph = game->graph;
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)arg;
int l;
int r;
int g;
int b;
int a;
Gfx* gfx;
OPEN_DISP(graph);
gfx = NOW_POLY_OPA_DISP;
if (joint_idx == 8) {
int angle = my_house->actor_class.world.angle.x;
if (angle == (DEG2SHORT_ANGLE(90.0f) - 1)) {
l = 120;
r = 255;
g = 255;
b = 150;
a = 255;
} else if (angle == DEG2SHORT_ANGLE(0.0f)) {
l = 0;
r = 0;
g = 0;
b = 0;
a = 255;
} else {
f32 inter = (f32)angle * (1.0f / 16383.0f); // approx (1.0f / (f32)DEG2SHORT_ANGLE(90.0f)
l = inter * 120.0f;
r = inter * 255.0f;
g = inter * 255.0f;
b = inter * 150.0f;
a = 255;
}
gDPSetPrimColor(gfx++, 0, l, r, g, b, a);
} else if (joint_idx == 12) {
*joint_shape = NULL; // Don't draw window frame shadow yet
} else if (joint_idx == 3 || joint_idx == 5) {
int draw_comp_fish = my_house->actor_class.speed;
if (draw_comp_fish) {
s16 angle = (s16)(joint_idx == 3 ? mEnv_GetWindAngleS() : my_house->actor_class.actor_specific);
if (joint_idx == 3) {
angle += angle_table[my_house->action & 1]; // rotate based on side house is on
}
if (my_house->arg0 == 0) {
Matrix_RotateY(angle, 1);
} else {
Matrix_RotateX(angle, 1);
}
if (my_house->arg0 == 1) {
Matrix_RotateZ(DEG2SHORT_ANGLE(-90.0f), 1);
}
} else {
*joint_shape = NULL; // do not draw fish decoration joints
}
} else if (joint_idx == 1) {
int draw_comp_insect = my_house->actor_class.gravity;
if (draw_comp_insect == FALSE) {
*joint_shape = NULL; // do not draw insect decoration joint
}
} else if (joint_idx == 6 && aMHS_door_closed_flag[my_house->arg0]) {
joint_rot->y = DEG2SHORT_ANGLE(-89.895630f); // draw door shut
}
SET_POLY_OPA_DISP(gfx);
CLOSE_DISP(graph);
return TRUE;
}
extern Gfx obj_s_myhome1_window_model[];
extern Gfx obj_w_myhome1_window_model[];
extern Gfx obj_s_myhome2_window_model[];
extern Gfx obj_w_myhome2_window_model[];
extern Gfx obj_s_myhome3_window_model[];
extern Gfx obj_w_myhome3_window_model[];
extern Gfx obj_s_myhome4_window_model[];
extern Gfx obj_w_myhome4_window_model[];
static int aMHS_actor_draw_after(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) {
static Gfx* mdl[mHm_HOMESIZE_NUM - 1][2] = {
{ obj_s_myhome1_window_model, obj_w_myhome1_window_model },
{ obj_s_myhome2_window_model, obj_w_myhome2_window_model },
{ obj_s_myhome3_window_model, obj_w_myhome3_window_model },
{ obj_s_myhome4_window_model, obj_w_myhome4_window_model },
};
GRAPH* graph = game->graph;
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)arg;
u32 season;
int l;
int r;
int g;
int b;
int a;
Mtx* mtx;
Gfx* gfx;
// Draw window frame shadow last
if (joint_idx == 12) {
mtx = _Matrix_to_Mtx_new(graph);
if (mtx != NULL) {
int angle = my_house->actor_class.world.angle.x;
if (angle == (DEG2SHORT_ANGLE(90.0f) - 1)) {
l = 120;
r = 255;
g = 255;
b = 150;
a = 255;
} else if (angle == DEG2SHORT_ANGLE(0.0f)) {
l = 0;
r = 0;
g = 0;
b = 0;
a = 255;
} else {
f32 inter = (f32)angle * (1.0f / 16383.0f); // approx (1.0f / (f32)DEG2SHORT_ANGLE(90.0f)
l = inter * 120.0f;
r = 255;
g = 255;
b = 150;
a = 255;
}
season = my_house->season == mTM_SEASON_WINTER;
_texture_z_light_fog_prim_shadow(graph);
OPEN_DISP(graph);
gfx = NOW_SHADOW_DISP;
gDPSetPrimColor(gfx++, 0, l, r, g, b, a);
gSPMatrix(gfx++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gfx++, mdl[my_house->arg0][season]);
SET_SHADOW_DISP(gfx);
CLOSE_DISP(graph);
}
}
return TRUE;
}
static void aMHS_actor_draw_ta_set(STRUCTURE_ACTOR* my_house, GAME* game) {
static u8 edge_alpha[mHm_HOMESIZE_NUM - 1] = { 96, 64, 112, 96 };
GRAPH* graph = game->graph;
OPEN_DISP(graph);
gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_DOLPHIN);
gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, G_TA_DOLPHIN);
gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, edge_alpha[my_house->arg0]);
gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, edge_alpha[my_house->arg0]);
CLOSE_DISP(graph);
}
static void aMHS_actor_draw_ta_clr(STRUCTURE_ACTOR* my_house, GAME* game) {
GRAPH* graph = game->graph;
OPEN_DISP(graph);
gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_N64);
gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, G_TA_N64);
gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, 144);
gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, 144);
CLOSE_DISP(graph);
}
extern u8 obj_myhome_mark_tex_txt[];
extern u16 obj_myhome_mark_pal[];
static int aMHS_actor_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos);
static int aMHS_actor_draw_after(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos);
static void aMHS_actor_draw_ta_set(STRUCTURE_ACTOR* my_house, GAME* game);
static void aMHS_actor_draw_ta_clr(STRUCTURE_ACTOR* my_house, GAME* game);
extern u8 obj_myhome_mark_tex_txt[];
extern u16 obj_myhome_mark_pal[];
static void aMHS_actor_draw(ACTOR* actorx, GAME* game) {
static bIT_ShadowData_c** shadow_data[mHm_HOMESIZE_NUM - 1] = {
aMHS_lv1_shadow_data,
aMHS_lv2_shadow_data,
aMHS_lv3_shadow_data,
aMHS_lv4_shadow_data,
};
GRAPH* graph;
cKF_SkeletonInfo_R_c* keyframe;
Mtx* mtx;
int door_original;
int pl_no;
bIT_ShadowData_c** shadow_data_pp;
Gfx* gfx;
GAME_PLAY* play;
STRUCTURE_ACTOR* my_house;
play = (GAME_PLAY*)game;
graph = play->game.graph;
my_house = (STRUCTURE_ACTOR*)actorx;
keyframe = &my_house->keyframe;
door_original = Save_Get(homes[my_house->action]).door_original;
pl_no = mHS_get_pl_no_detail(my_house->action);
mtx = GRAPH_ALLOC_TYPE(graph, Mtx, keyframe->skeleton->num_shown_joints);
if (mtx != NULL) {
aMHS_actor_draw_ta_set(my_house, (GAME*)play);
_texture_z_light_fog_prim(graph);
OPEN_DISP(graph);
gfx = NOW_POLY_OPA_DISP;
gSPSegment(gfx++, G_MWO_SEGMENT_8, (*Common_Get(clip).structure_clip->get_pal_segment_proc)(my_house->arg1));
if (door_original == 0xFF || pl_no == -1) {
gSPSegment(gfx++, G_MWO_SEGMENT_9, obj_myhome_mark_tex_txt);
gSPSegment(gfx++, G_MWO_SEGMENT_A, obj_myhome_mark_pal);
} else {
int org_idx = door_original & 7;
u16* pal = mNW_PaletteIdx2Palette(Save_Get(private[pl_no]).my_org[org_idx].palette);
u8* tex = Save_Get(private[pl_no]).my_org[org_idx].design.data;
gSPSegment(gfx++, G_MWO_SEGMENT_9, tex);
gSPSegment(gfx++, G_MWO_SEGMENT_A, pal);
}
SET_POLY_OPA_DISP(gfx);
CLOSE_DISP(graph);
cKF_Si3_draw_R_SV((GAME*)play, keyframe, mtx, &aMHS_actor_draw_before, &aMHS_actor_draw_after, my_house);
shadow_data_pp = shadow_data[my_house->arg0];
Matrix_translate(my_house->actor_class.world.position.x, my_house->actor_class.world.position.y,
my_house->actor_class.world.position.z, 0);
Matrix_scale(0.01f, 0.01f, 0.01f, 1);
(*Common_Get(clip).bg_item_clip->draw_shadow_proc)((GAME*)play, shadow_data_pp[my_house->action & 1], 0);
aMHS_actor_draw_ta_clr(my_house, (GAME*)play);
}
}
+483
View File
@@ -0,0 +1,483 @@
static void aMHS_set_door_SE_sub(STRUCTURE_ACTOR* my_house, u16 se_idx) {
sAdo_OngenTrgStart(se_idx, &my_house->actor_class.world.position);
}
static void aMHS_set_door_SE(STRUCTURE_ACTOR* my_house) {
static f32 chk_pat_in[4] = { 10.0f, 14.0f, 35.0f, 50.0f };
static f32 chk_pat_out[4] = { 2.0f, 8.0f, 33.0f, 40.0f };
static u16 se_no[4] = { 6, 7, 8, 9 };
f32* chk_pat_p;
int i;
switch ((int)my_house->arg2_f) {
case 0:
case 3:
chk_pat_p = chk_pat_in;
break;
default:
chk_pat_p = chk_pat_out;
break;
}
for (i = 0; i < 4; i++, chk_pat_p++) {
if (cKF_FrameControl_passCheck_now(&my_house->keyframe.frame_control, *chk_pat_p)) {
aMHS_set_door_SE_sub(my_house, se_no[i]);
break;
}
}
}
static void aMHS_goto_next_pl_scene(GAME_PLAY* play, STRUCTURE_ACTOR* my_house) {
static int next_scene_no[mHm_HOMESIZE_NUM - 1] = {
SCENE_MY_ROOM_S,
SCENE_MY_ROOM_M,
SCENE_MY_ROOM_L,
SCENE_MY_ROOM_LL1,
};
static s16 startX[mHm_HOMESIZE_NUM - 1] = {
120,
160,
200,
200,
};
static s16 startZ[mHm_HOMESIZE_NUM - 1] = {
220,
300,
380,
380,
};
Door_data_c door_data;
door_data.next_scene_id = next_scene_no[my_house->arg0];
door_data.exit_orientation = mSc_DIRECT_NORTH;
door_data.exit_type = 0;
door_data.extra_data = 0;
door_data.exit_position.x = startX[my_house->arg0];
door_data.exit_position.y = 0;
door_data.exit_position.z = startZ[my_house->arg0];
door_data.door_actor_name = EMPTY_NO;
door_data.wipe_type = 1;
goto_other_scene(play, &door_data, 0);
play->fb_fade_type = 9;
}
// In
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome1;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome1;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome2;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome2;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome3;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome3;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome4;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome4;
// Out
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome1_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome1_out;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome2_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome2_out;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome3_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome3_out;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome4_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome4_out;
static void aMHS_setup_animation(STRUCTURE_ACTOR* my_house, f32 speed) {
static cKF_Animation_R_c* ani[2][mHm_HOMESIZE_NUM - 1][2] = {
{
{ &cKF_ba_r_obj_s_myhome1, &cKF_ba_r_obj_w_myhome1 },
{ &cKF_ba_r_obj_s_myhome2, &cKF_ba_r_obj_w_myhome2 },
{ &cKF_ba_r_obj_s_myhome3, &cKF_ba_r_obj_w_myhome3 },
{ &cKF_ba_r_obj_s_myhome4, &cKF_ba_r_obj_w_myhome4 },
},
{
{ &cKF_ba_r_obj_s_myhome1_out, &cKF_ba_r_obj_w_myhome1_out },
{ &cKF_ba_r_obj_s_myhome2_out, &cKF_ba_r_obj_w_myhome2_out },
{ &cKF_ba_r_obj_s_myhome3_out, &cKF_ba_r_obj_w_myhome3_out },
{ &cKF_ba_r_obj_s_myhome4_out, &cKF_ba_r_obj_w_myhome4_out },
}
};
static f32 start_idx[mHm_HOMESIZE_NUM - 1] = { 1.0f, 25.0f, 1.0f, 1.0f };
static f32 end_idx[mHm_HOMESIZE_NUM - 1] = { 51.0f, 51.0f, 51.0f, 51.0f };
int type = (int)my_house->arg2_f;
int size = my_house->arg0;
int season = my_house->season == mTM_SEASON_WINTER;
int dir = 0;
if (type != 0 && type != 3) {
dir = 1;
}
cKF_SkeletonInfo_R_init(&my_house->keyframe, my_house->keyframe.skeleton, ani[dir][size][season], start_idx[type],
end_idx[type], start_idx[type], speed, 0.0f, cKF_FRAMECONTROL_STOP, NULL);
}
static void aMHS_rewrite_pl_out_data(GAME_PLAY* play, STRUCTURE_ACTOR* my_house) {
static u8 out_drt[2] = { mSc_DIRECT_SOUTH_EAST, mSc_DIRECT_SOUTH_WEST };
static f32 restartX[2] = { 48.29f, -48.29f };
Door_data_c* exit_data = Common_GetPointer(structure_exit_door_data);
int direct = my_house->action & 1;
if (play->fb_wipe_mode == 0) {
xyz_t exit_pos;
s_xyz* exit_pos_p = &exit_data->exit_position;
exit_data->next_scene_id = Save_Get(scene_no);
exit_data->exit_orientation = out_drt[direct];
exit_data->exit_type = 0;
exit_data->extra_data = 2;
exit_pos.x = my_house->actor_class.world.position.x + restartX[direct];
exit_pos.z = my_house->actor_class.world.position.z + 48.29f;
exit_pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(exit_pos, 0.0f);
exit_pos_p->x = exit_pos.x;
exit_pos_p->y = exit_pos.y;
exit_pos_p->z = exit_pos.z;
exit_data->door_actor_name = my_house->actor_class.npc_id;
exit_data->wipe_type = 1;
Common_Set(house_owner_name, my_house->action);
}
}
static f32 aMHS_player_chk_f[2] = { 1.0f, -1.0f };
static u16 aMHS_player_chk_angl0[2] = { DEG2SHORT_ANGLE(-180.0f), DEG2SHORT_ANGLE(90.0f) };
static u16 aMHS_player_chk_angl1[2] = { DEG2SHORT_ANGLE(-90.0f), DEG2SHORT_ANGLE(-180.0f) };
static int aMHS_check_player_sub(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play);
int direct = my_house->action & 1;
f32 dist_x;
f32 dist_z;
int res = FALSE;
if (player == NULL) {
return FALSE;
}
dist_x = player->actor_class.world.position.x - my_house->arg0_f;
dist_z = player->actor_class.world.position.z - my_house->arg1_f;
if ((dist_x * dist_x) + (dist_z * dist_z) < (40.0f * 40.0f) &&
dist_z + dist_x * aMHS_player_chk_f[direct] < 40.0f) {
u16 angle_y = player->actor_class.shape_info.rotation.y;
if (angle_y > aMHS_player_chk_angl0[direct] && angle_y < aMHS_player_chk_angl1[direct]) {
if (chkTrigger(BUTTON_A) == FALSE) {
return FALSE;
}
if (Common_Get(reset_flag)) {
Common_Set(reset_type, 1);
} else {
res = TRUE;
}
}
}
return res;
}
static int aMHS_check_player_in_intro_demo(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
mDemo_Clip_c* clip = Common_Get(clip).demo_clip;
INTRO_DEMO_ACTOR* intro_demo;
if (clip == NULL) {
return 0;
}
intro_demo = (INTRO_DEMO_ACTOR*)clip->class;
if (intro_demo == NULL || clip->type != mDemo_CLIP_TYPE_INTRO_DEMO || mEv_CheckFirstIntro() == FALSE) {
return 0;
}
if (my_house->arg3_f == TRUE && intro_demo->player_in_intro_demo == TRUE) {
return 1;
}
if (mPlib_check_label_player_demo_wait((GAME*)play, my_house)) {
int action;
my_house->arg3_f = TRUE;
action = my_house->action;
intro_demo->selected_house = action;
intro_demo->player_intro_demo_state =
mPr_NullCheckPersonalID(&Save_Get(homes[action]).ownerID) ? aID_STATE_TAKEN_HOUSE : aID_STATE_FREE_HOUSE;
return 2;
} else {
if (aMHS_check_player_sub(my_house, play) == TRUE) {
mPlib_request_main_demo_wait_type1((GAME*)play, 0, my_house);
}
return 0;
}
}
static void aMHS_set_demo_info(ACTOR* actorx) {
static int direct[2] = { mSc_DIRECT_NORTH_EAST, mSc_DIRECT_NORTH_WEST };
mDemo_Set_house_info(0.0f, direct[((STRUCTURE_ACTOR*)actorx)->action & 1]);
mDemo_Set_camera(CAMERA2_PROCESS_DOOR);
}
static void aMHS_set_demo_info_save(ACTOR* actorx) {
aMHS_set_demo_info(actorx);
mBGMPsComp_make_ps_wipe(0x249);
}
static int aMHS_check_player(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
int intro_demo_state;
if (my_house->arg2_f != 0) {
if (my_house->arg2_f == 3) {
if (mDemo_Check(mDemo_TYPE_DOOR2, (ACTOR*)my_house)) {
return 1;
}
mDemo_Request(mDemo_TYPE_DOOR2, (ACTOR*)my_house, &aMHS_set_demo_info_save);
return 0;
} else {
return 4;
}
}
intro_demo_state = aMHS_check_player_in_intro_demo(my_house, play);
if (intro_demo_state != 2) {
if (intro_demo_state == 1) {
if (mDemo_Check(mDemo_TYPE_DOOR2, (ACTOR*)my_house)) {
return 1;
} else {
mDemo_Request(mDemo_TYPE_DOOR2, (ACTOR*)my_house, &aMHS_set_demo_info);
return 0;
}
} else {
if (mDemo_Check(mDemo_TYPE_DOOR, (ACTOR*)my_house)) {
return 1;
} else if (aMHS_check_player_sub(my_house, play)) {
mDemo_Request(mDemo_TYPE_DOOR, (ACTOR*)my_house, &aMHS_set_demo_info);
}
}
}
return 0;
}
typedef struct {
u8 centerRight_offset;
u8 leftUp_offset;
u8 leftDown_offset;
u8 rightDown_offset;
u8 rightUp_offset;
u8 shape;
} aMHS_ofs_c;
static void aMHS_make_bgOffset(mCoBG_OffsetTable_c* ofs_tbl, s8 def_val, int side_idx) {
static s8 height_tbl[32 * 6] = {
// East
4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 4, 11, 11, 1, 11, 11, 11, 11,
11, 0, 11, 11, 11, 0, 11, 1, 0, 0, 0, 0, 0, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11,
0, 4, 4, 4, 0, 4, 1, 4, 4, 4, 4, 4, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0,
// West
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 1, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 11, 11, 0, 11, 11, 1,
11, 11, 11, 11, 11, 0, 11, 11, 11, 4, 11, 1, 4, 4, 0, 4, 4, 1, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 11,
11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0
};
int ofs;
int i;
if (side_idx == 0) {
ofs = 0;
} else {
ofs = 6 * 16;
}
for (i = 0; i != 16; i++, ofs_tbl++) {
ofs_tbl->unit_attribute = mCoBG_ATTRIBUTE_NONE;
ofs_tbl->centerRight_offset = (height_tbl[ofs + i * 6 + 0] != 11) ? height_tbl[ofs + i * 6 + 0] : def_val;
ofs_tbl->leftUp_offset = (height_tbl[ofs + i * 6 + 1] != 11) ? height_tbl[ofs + i * 6 + 1] : def_val;
ofs_tbl->leftDown_offset = (height_tbl[ofs + i * 6 + 2] != 11) ? height_tbl[ofs + i * 6 + 2] : def_val;
ofs_tbl->rightDown_offset = (height_tbl[ofs + i * 6 + 3] != 11) ? height_tbl[ofs + i * 6 + 3] : def_val;
ofs_tbl->rightUp_offset = (height_tbl[ofs + i * 6 + 4] != 11) ? height_tbl[ofs + i * 6 + 4] : def_val;
ofs_tbl->shape = height_tbl[ofs + i * 6 + 5];
}
}
static void aMHS_set_bgOffset(ACTOR* actorx, int flag) {
static s8 height_dt[mHm_HOMESIZE_NUM - 1] = { 11, 14, 15, 14 };
static s8 addX[8] = {
216, 0, 40, 80, 176, 216, 0, 40,
};
static s8 addZ[4] = { 90, 40, 0, 216 };
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
int side_idx = my_house->action & 1;
int addX_ofs = side_idx == 0 ? 0 : 4;
mCoBG_OffsetTable_c offset_tbl[4 * 4];
mCoBG_OffsetTable_c* ofs_p;
mCoBG_OffsetTable_c tmp_ofs;
xyz_t pos;
int z;
int x;
// @BUG - they use the side of the house to get the size default rather than the index itself
#ifndef BUGFIXES
aMHS_make_bgOffset(offset_tbl, height_dt[Save_Get(homes[side_idx]).size_info.size], side_idx);
#else
aMHS_make_bgOffset(offset_tbl, height_dt[Save_Get(homes[my_house->action & 3]).size_info.size], side_idx);
#endif
ofs_p = offset_tbl;
for (z = 0; z < 4; z++) {
pos.z = actorx->home.position.z + addZ[z];
for (x = 0; x < 4; x++) {
pos.x = actorx->home.position.x + addX[addX_ofs + x];
mCoBG_SetPluss5PointOffset_file(pos, *ofs_p, __FILE__, 651);
ofs_p++;
}
}
}
static int aMHS_light_ctrl(STRUCTURE_ACTOR* my_house) {
return mRmTp_Index2LightSwitchStatus((my_house->action & 3) * 2) != FALSE;
}
static void aMHS_wait(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
switch (aMHS_check_player(my_house, play)) {
case 1:
aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR_WAIT);
break;
case 4:
if (mPlib_check_player_outdoor_start((GAME*)play)) {
aMHS_setup_animation(my_house, 0.5f);
aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR);
}
}
}
static void aMHS_open_door_wait(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
ACTOR* actorx = (ACTOR*)my_house;
if (actorx == (*GET_PLAYER_ACTOR_NOW()->get_door_label_proc)(gamePT)) {
mBGMPsComp_make_ps_wipe(0x249);
aMHS_setup_animation(my_house, 0.5f);
aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR);
}
}
static void aMHS_open_door(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
if (cKF_SkeletonInfo_R_play(&my_house->keyframe) != cKF_STATE_STOPPED) {
aMHS_door_closed_flag[my_house->arg0] = FALSE;
} else {
void* demo_class;
INTRO_DEMO_ACTOR* intro_demo;
int next_act;
if (my_house->arg2_f == 3) {
if (my_house->actor_class.world.angle.z == 0) {
my_house->actor_class.world.angle.z = 1;
}
next_act = aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT;
} else if (my_house->arg2_f == 0) {
aMHS_rewrite_pl_out_data(play, my_house);
aMHS_goto_next_pl_scene(play, my_house);
if (Common_Get(clip).demo_clip != NULL && Common_Get(clip).demo_clip->type == mDemo_CLIP_TYPE_INTRO_DEMO) {
demo_class = Common_Get(clip).demo_clip->class;
if (demo_class != NULL) {
intro_demo = (INTRO_DEMO_ACTOR*)demo_class;
intro_demo->player_in_intro_demo = FALSE;
}
}
mDemo_End((ACTOR*)my_house);
next_act = aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT;
} else {
next_act = aMHS_ACTION_WAIT;
}
aMHS_setup_action(my_house, next_act);
my_house->arg2_f = 0;
my_house->request_type = 0;
}
}
static void aMHS_setup_action(STRUCTURE_ACTOR* my_house, int action) {
static aSTR_MOVE_PROC process[aMHS_ACTION_NUM] = {
&aMHS_wait,
&aMHS_open_door_wait,
&aMHS_open_door,
(aSTR_MOVE_PROC)&none_proc1,
};
aMHS_door_closed_flag[my_house->arg0] = TRUE;
my_house->action_proc = process[action];
}
static void aMHS_actor_move(ACTOR* actorx, GAME* game) {
// clang-format off
static Door_data_c door_data = {
SCENE_PLAYERSELECT_SAVE,
mSc_DIRECT_NORTH,
0,
0,
100, 0, 120,
EMPTY_NO,
1,
0, 0, 0
};
// clang-format on
static u8 drtbl[] = {
mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH,
mSc_DIRECT_SOUTH_EAST, mSc_DIRECT_EAST, mSc_DIRECT_NORTH_EAST,
};
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
GAME_PLAY* play = (GAME_PLAY*)game;
my_house->arg2_f = drtbl[my_house->request_type];
aMHS_set_door_SE(my_house);
actorx->actor_specific -= (s16)(mEnv_GetWindPowerF() * 1000.0f);
(*my_house->action_proc)(my_house, play);
if (aMHS_light_ctrl(my_house)) {
chase_s(&my_house->actor_class.world.angle.x, DEG2SHORT_ANGLE(90.0f) - 1, 320);
} else {
chase_s(&my_house->actor_class.world.angle.x, DEG2SHORT_ANGLE(0.0f), 320);
}
if (my_house->actor_class.world.angle.z > 0) {
goto_other_scene(play, &door_data, 1);
Common_Get(transition).wipe_type = 3;
play->fb_fade_type = 9;
my_house->actor_class.world.angle.z = -1;
}
}
static void aMHS_actor_init(ACTOR* actorx, GAME* game) {
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
mFI_SetFG_common(DUMMY_HOUSE0 + my_house->action, actorx->home.position, FALSE);
aMHS_actor_move(actorx, game);
actorx->mv_proc = &aMHS_actor_move;
}
+27 -46
View File
@@ -14,57 +14,41 @@ extern void aNRTC_actor_init(ACTOR*, GAME*);
extern void aNRTC_actor_save(ACTOR*, GAME*);
ACTOR_PROFILE Npc_Rtc_Profile = {
mAc_PROFILE_NPC_RTC,
ACTOR_PART_NPC,
ACTOR_STATE_NONE,
SP_NPC_RTC,
ACTOR_OBJ_BANK_KEEP,
sizeof(NPCRTC_ACTOR),
aNRTC_actor_ct,
aNRTC_actor_dt,
aNRTC_actor_init,
mActor_NONE_PROC1,
aNRTC_actor_save,
mAc_PROFILE_NPC_RTC, ACTOR_PART_NPC, ACTOR_STATE_NONE, SP_NPC_RTC, ACTOR_OBJ_BANK_KEEP, sizeof(NPCRTC_ACTOR),
aNRTC_actor_ct, aNRTC_actor_dt, aNRTC_actor_init, mActor_NONE_PROC1, aNRTC_actor_save,
};
extern void aNRTC_actor_move(ACTOR*, GAME*);
extern void aNRTC_actor_draw(ACTOR*, GAME*);
extern int aNRTC_talk_init(ACTOR*, GAME*);
extern int aNRTC_talk_init(ACTOR*, GAME*);
extern int aNRTC_talk_end_chk(ACTOR*, GAME*);
extern void aNRTC_schedule_proc(NPC_ACTOR*, GAME_PLAY*, int);
extern void aNRTC_talk_request(ACTOR* actor,GAME*);
extern void aNRTC_talk_request(ACTOR* actor, GAME*);
extern void aNRTC_change_talk_proc(NPCRTC_ACTOR* rtc, int idx);
u8 aNRTC_sound_mode[] = {0x00,0x01,0x02,0x00};
u8 aNRTC_voice_mode[] = {0x00,0x01,0x02,0x00};
u8 aNRTC_sound_mode[] = { 0x00, 0x01, 0x02, 0x00 };
u8 aNRTC_voice_mode[] = { 0x00, 0x01, 0x02, 0x00 };
void aNRTC_actor_ct(ACTOR* actor, GAME* game){
static aNPC_ct_data_c ct_data = {
&aNRTC_actor_move,
&aNRTC_actor_draw,
5,
mActor_NONE_PROC1,
&aNRTC_talk_init,
&aNRTC_talk_end_chk,
0
};
void aNRTC_actor_ct(ACTOR* actor, GAME* game) {
static aNPC_ct_data_c ct_data = { &aNRTC_actor_move, &aNRTC_actor_draw, 5, mActor_NONE_PROC1,
&aNRTC_talk_init, &aNRTC_talk_end_chk, 0 };
NPCRTC_ACTOR* rtc = (NPCRTC_ACTOR*)actor;
GAME_PLAY* play = (GAME_PLAY*)game;
PLAYER_ACTOR* player;
xyz_t center;
xyz_t eye;
if(Common_Get(clip.npc_clip)->birth_check_proc(actor,game) == TRUE){
if (Common_Get(clip.npc_clip)->birth_check_proc(actor, game) == TRUE) {
rtc->npc_class.schedule.schedule_proc = aNRTC_schedule_proc;
Common_Get(clip.npc_clip)->ct_proc(actor,game,&ct_data);
Common_Get(clip.npc_clip)->ct_proc(actor, game, &ct_data);
actor->status_data.weight = MASSTYPE_IMMOVABLE;
mPlib_request_main_demo_wait_type1(play,0,NULL);
player = GET_PLAYER_ACTOR(play);
if(player != NULL){
mPlib_request_main_demo_wait_type1(game, 0, NULL);
player = GET_PLAYER_ACTOR(play);
if (player != NULL) {
player->actor_class.state_bitfield |= 0x80;
}
@@ -75,8 +59,8 @@ void aNRTC_actor_ct(ACTOR* actor, GAME* game){
eye.x = 100.0f;
eye.y = 130.0f;
eye.z = 210.0f;
Camera2_change_priority(play,0);
Camera2_change_priority(play, 0);
Camera2_request_main_lock(play, &center, &eye, 40.0f, 0, 100.0f, 400.0f, 5);
sAdo_SetOutMode(aNRTC_sound_mode[Save_Get(config.sound_mode)]);
sAdo_SetVoiceMode(aNRTC_voice_mode[Save_Get(config.voice_mode)]);
@@ -84,48 +68,45 @@ void aNRTC_actor_ct(ACTOR* actor, GAME* game){
rtc->npc_class.talk_info.default_act = 9;
rtc->npc_class.talk_info.melody_inst = 0;
rtc->unk9A0 = 0;
}
}
}
void aNRTC_actor_save(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->save_proc(actor,game);
Common_Get(clip.npc_clip)->save_proc(actor, game);
}
void aNRTC_actor_dt(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->dt_proc(actor,game);
Common_Get(clip.npc_clip)->dt_proc(actor, game);
}
void aNRTC_actor_init(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->init_proc(actor,game);
Common_Get(clip.npc_clip)->init_proc(actor, game);
}
void aNRTC_actor_move(ACTOR* actor, GAME* game){
void aNRTC_actor_move(ACTOR* actor, GAME* game) {
StaffRoll info;
f32 val = 0.5f;
u8 arm_flag = TRUE;
NPCRTC_ACTOR* rtc = (NPCRTC_ACTOR*)actor;
GAME_PLAY* play = (GAME_PLAY*)game;
if(rtc->npc_class.draw.animation_id == 0x76){
if (rtc->npc_class.draw.animation_id == 0x76) {
sAdos_GetStaffRollInfo(&info);
if(info.unk0 != 4){
if (info.unk0 != 4) {
val = 0.0f;
arm_flag = FALSE;
rtc->npc_class.draw.main_animation.keyframe.frame_control.current_frame = 1.0f + (64.0f * (f32)info.unk8);
rtc->npc_class.draw.main_animation.keyframe.frame_control.current_frame = 1.0f + (64.0f * (f32)info.unk8);
}
}
}
rtc->npc_class.draw.main_animation.keyframe.frame_control.speed = val;
sAdos_TTKK_ARM(arm_flag);
Common_Get(clip.npc_clip)->move_proc(actor,game);
Common_Get(clip.npc_clip)->move_proc(actor, game);
mSC_change_player_freeze(play);
}
void aNRTC_actor_draw(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->draw_proc(actor,game);
Common_Get(clip.npc_clip)->draw_proc(actor, game);
}
#include "../src/ac_npc_rtc_think.c.inc"
+380 -403
View File
@@ -12,308 +12,298 @@
#include "m_scene_ftr.h"
static void mSc_set_bank_status_after(Object_Bank_c* bank) {
bank->bank_id = ABS(bank->bank_id);
bank->ram_start = bank->dma_start;
bank->state = 0;
bank->bank_id = ABS(bank->bank_id);
bank->ram_start = bank->dma_start;
bank->state = 0;
}
static void mSc_clear_bank_status(Object_Bank_c* bank) {
bank->bank_id = 0;
bank->size = 0;
bank->dma_start = NULL;
bank->ram_start = NULL;
bank->bank_id = 0;
bank->size = 0;
bank->dma_start = NULL;
bank->ram_start = NULL;
}
static void Object_Exchange_keep_new_Player(GAME_PLAY* play) {
mPlib_Object_Exchange_keep_new_PlayerMdl(play);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerFaceTex(play);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 1, 0);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 2, 1);
mPlib_Object_Exchange_keep_new_PlayerMdl(play);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerFaceTex(play);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 1, 0);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 2, 1);
}
extern char* mSc_secure_exchange_keep_bank(Object_Exchange_c* exchange, s16 bank_id, size_t size) {
char* area = NULL;
Object_Bank_c* bank = exchange->banks + exchange->bank_idx;
char* area = NULL;
Object_Bank_c* bank = exchange->banks + exchange->bank_idx;
if (exchange->bank_idx < mSc_OBJECT_BANK_NUM) {
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + size, 32);
if (exchange->bank_idx < mSc_OBJECT_BANK_NUM) {
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + size, 32);
if (area >= exchange->max_ram_address) {
area = NULL;
if (area >= exchange->max_ram_address) {
area = NULL;
} else {
bank->bank_id = bank_id;
bank->ram_start = exchange->next_bank_ram_address;
bank->dma_start = exchange->next_bank_ram_address;
bank->rom_addr = 0;
bank->size = size;
bank->num_exist = 0;
bank->state = 3;
exchange->next_bank_ram_address = area;
exchange->bank_idx++;
}
}
else {
bank->bank_id = bank_id;
bank->ram_start = exchange->next_bank_ram_address;
bank->dma_start = exchange->next_bank_ram_address;
bank->rom_addr = 0;
bank->size = size;
bank->num_exist = 0;
bank->state = 3;
exchange->next_bank_ram_address = area;
exchange->bank_idx++;
}
}
return area;
return area;
}
extern void mSc_background_dmacopy_controller(Object_Bank_c* bank) {
switch (bank->state) {
case 1:
{
if (bank->_14 == 0) {
osCreateMesgQueue(&bank->dma_controller_msg_queue, &bank->dma_controller_msg, 1);
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
bank->state = 0;
}
switch (bank->state) {
case 1: {
if (bank->_14 == 0) {
osCreateMesgQueue(&bank->dma_controller_msg_queue, &bank->dma_controller_msg, 1);
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
bank->state = 0;
}
break;
break;
}
case 2: {
if (osRecvMesg(&bank->dma_controller_msg_queue, NULL, OS_MESSAGE_NOBLOCK) == FALSE) {
mSc_set_bank_status_after(bank);
}
break;
}
}
case 2:
{
if (osRecvMesg(&bank->dma_controller_msg_queue, NULL, OS_MESSAGE_NOBLOCK) == FALSE) {
mSc_set_bank_status_after(bank);
}
break;
}
}
}
extern void mSc_dmacopy_data_bank(Object_Exchange_c* exchange) {
/* stubbed */
/* stubbed */
}
extern int mSc_bank_regist_check(Object_Exchange_c* exchange, s16 bank_id) {
int res = -1;
int i;
int res = -1;
int i;
for (i = 0; i < mSc_OBJECT_BANK_NUM; i++) {
if (ABS(exchange->banks[i].bank_id) == bank_id) {
res = i;
for (i = 0; i < mSc_OBJECT_BANK_NUM; i++) {
if (ABS(exchange->banks[i].bank_id) == bank_id) {
res = i;
break;
break;
}
}
}
return res;
return res;
}
extern void mSc_regist_initial_exchange_bank(GAME_PLAY* play) {
play->object_exchange.selected_partition = 0;
play->object_exchange.exchange_id = play->object_exchange.bank_idx;
play->object_exchange.selected_partition = 0;
play->object_exchange.exchange_id = play->object_exchange.bank_idx;
if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) {
u32 size;
/* Split the remaining object exchange space into two equal portions */
size = (u32)(play->object_exchange.max_ram_address - play->object_exchange.next_bank_ram_address) / 2;
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] = (char*)ALIGN_NEXT((u32)play->object_exchange.next_bank_ram_address + size, 32);
play->object_exchange.start_address_save[1] = play->object_exchange.end_address_save[0];
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) {
u32 size;
/* Temporarily limit the maximum address to half the remaining free space */
play->object_exchange.max_ram_address = play->object_exchange.end_address_save[0];
}
else {
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] = play->object_exchange.max_ram_address;
play->object_exchange.start_address_save[1] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
}
/* Split the remaining object exchange space into two equal portions */
size = (u32)(play->object_exchange.max_ram_address - play->object_exchange.next_bank_ram_address) / 2;
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] =
(char*)ALIGN_NEXT((u32)play->object_exchange.next_bank_ram_address + size, 32);
play->object_exchange.exchange_id = play->object_exchange.bank_idx; /* leftover from DnM? */
play->object_exchange.start_address_save[1] = play->object_exchange.end_address_save[0];
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
/* Temporarily limit the maximum address to half the remaining free space */
play->object_exchange.max_ram_address = play->object_exchange.end_address_save[0];
} else {
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] = play->object_exchange.max_ram_address;
play->object_exchange.start_address_save[1] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
}
play->object_exchange.exchange_id = play->object_exchange.bank_idx; /* leftover from DnM? */
}
static void mSc_dmacopy_all_exchange_bank_sub(Object_Bank_c* bank, Object_Exchange_c* exchange, int idx) {
if (idx >= exchange->exchange_id) {
char* area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
if (idx >= exchange->exchange_id) {
char* area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
if (area >= exchange->max_ram_address) {
exchange->selected_partition = (exchange->selected_partition + 1) % 2;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
exchange->max_ram_address = exchange->end_address_save[exchange->selected_partition];
if (area >= exchange->max_ram_address) {
exchange->selected_partition = (exchange->selected_partition + 1) % 2;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
exchange->max_ram_address = exchange->end_address_save[exchange->selected_partition];
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
}
bank->dma_start = exchange->next_bank_ram_address;
bank->part_id = exchange->selected_partition;
exchange->next_bank_ram_address = area;
}
bank->dma_start = exchange->next_bank_ram_address;
bank->part_id = exchange->selected_partition;
exchange->next_bank_ram_address = area;
}
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
mSc_set_bank_status_after(bank);
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
mSc_set_bank_status_after(bank);
}
extern void mSc_dmacopy_all_exchange_bank(Object_Exchange_c* exchange) {
Object_Bank_c* bank;
int i;
Object_Bank_c* bank;
int i;
bank = exchange->banks + exchange->keep_id;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
bank = exchange->banks + exchange->keep_id;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
for (i = exchange->keep_id; i < mSc_OBJECT_BANK_NUM; i++) {
if (bank->bank_id != 0 && bank->state != 3) {
if (bank->bank_id < 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
}
else if (bank->num_exist != 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
}
else if (i >= exchange->exchange_id) {
mSc_clear_bank_status(bank);
}
else {
bank->bank_id = 0;
}
for (i = exchange->keep_id; i < mSc_OBJECT_BANK_NUM; i++) {
if (bank->bank_id != 0 && bank->state != 3) {
if (bank->bank_id < 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
} else if (bank->num_exist != 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
} else if (i >= exchange->exchange_id) {
mSc_clear_bank_status(bank);
} else {
bank->bank_id = 0;
}
}
bank++;
}
bank++;
}
if (Common_Get(clip).npc_clip != NULL) {
Common_Get(clip).npc_clip->rebuild_dma_proc();
}
if (Common_Get(clip).npc_clip != NULL) {
Common_Get(clip).npc_clip->rebuild_dma_proc();
}
if (Common_Get(clip)._068 != NULL) {
(*Common_Get(clip)._068)();
}
if (Common_Get(clip)._068 != NULL) {
(*Common_Get(clip)._068)();
}
if (Common_Get(clip).shop_manekin_clip != NULL) {
Common_Get(clip).shop_manekin_clip->manekin_dma_again_proc();
}
if (Common_Get(clip).shop_manekin_clip != NULL) {
Common_Get(clip).shop_manekin_clip->manekin_dma_again_proc();
}
if (Common_Get(clip).shop_indoor_clip != NULL) {
Common_Get(clip).shop_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).shop_indoor_clip != NULL) {
Common_Get(clip).shop_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).my_room_clip != NULL) {
Common_Get(clip).my_room_clip->redma_ftr_bank_proc();
}
if (Common_Get(clip).my_room_clip != NULL) {
Common_Get(clip).my_room_clip->redma_ftr_bank_proc();
}
if (Common_Get(clip).my_indoor_clip != NULL) {
Common_Get(clip).my_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).my_indoor_clip != NULL) {
Common_Get(clip).my_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).arrange_room_clip != NULL) {
Common_Get(clip).arrange_room_clip->redma_proc();
}
if (Common_Get(clip).arrange_room_clip != NULL) {
Common_Get(clip).arrange_room_clip->redma_proc();
}
if (Common_Get(clip).shop_umbrella_clip != NULL) {
Common_Get(clip).shop_umbrella_clip->umbrella_dma_again_proc();
}
if (Common_Get(clip).shop_umbrella_clip != NULL) {
Common_Get(clip).shop_umbrella_clip->umbrella_dma_again_proc();
}
if (Common_Get(clip).ball_redma_proc != NULL) {
(*Common_Get(clip).ball_redma_proc)();
}
if (Common_Get(clip).ball_redma_proc != NULL) {
(*Common_Get(clip).ball_redma_proc)();
}
}
extern void mSc_data_bank_ct(GAME_PLAY* play, Object_Exchange_c* exchange) {
char* exchange_arena;
char* exchange_arena;
bzero(exchange, sizeof(Object_Exchange_c));
bzero(exchange, sizeof(Object_Exchange_c));
exchange->keep_id = -1;
exchange->exchange_id = -1;
exchange->keep_id = -1;
exchange->exchange_id = -1;
exchange_arena = (char*)THA_allocAlign(&play->game.tha, mSc_ARENA_SIZE, ~0x1F);
exchange->next_bank_ram_address = exchange_arena;
exchange->start_address_save[0] = exchange_arena;
exchange->start_address_save[1] = exchange_arena;
exchange_arena = (char*)THA_allocAlign(&play->game.tha, mSc_ARENA_SIZE, ~0x1F);
exchange->next_bank_ram_address = exchange_arena;
exchange->start_address_save[0] = exchange_arena;
exchange->start_address_save[1] = exchange_arena;
exchange_arena += mSc_ARENA_SIZE;
exchange->max_ram_address = exchange_arena;
exchange->end_address_save[0] = exchange_arena;
exchange->end_address_save[1] = exchange_arena;
exchange_arena += mSc_ARENA_SIZE;
exchange->max_ram_address = exchange_arena;
exchange->end_address_save[0] = exchange_arena;
exchange->end_address_save[1] = exchange_arena;
}
extern void mSc_decide_exchange_bank(Object_Exchange_c* exchange) {
exchange->keep_id = exchange->bank_idx;
exchange->_194C = exchange->next_bank_ram_address;
exchange->keep_id = exchange->bank_idx;
exchange->_194C = exchange->next_bank_ram_address;
}
static void Scene_player_select(int scene_no, int npc_actor) {
if (Save_Get(scene_no) == scene_no) {
int met_villagers_bitfield = 0;
int met_villagers_num = 0;
mActor_name_t npc_id;
Animal_c* animal = Save_Get(animals);
Anmmem_c* memory;
int i;
int j;
int selected;
if (Save_Get(scene_no) == scene_no) {
int met_villagers_bitfield = 0;
int met_villagers_num = 0;
mActor_name_t npc_id;
Animal_c* animal = Save_Get(animals);
Anmmem_c* memory;
int i;
int j;
int selected;
/* Track all villagers who have met a player from town before */
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) {
memory = animal->memories;
/* Track all villagers who have met a player from town before */
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) {
memory = animal->memories;
for (j = 0; j < ANIMAL_MEMORY_NUM; j++) {
if (
memory->memory_player_id.land_id == Save_Get(land_info).id &&
mLd_CheckCmpLandName(memory->memory_player_id.land_name, Save_Get(land_info).name) == TRUE
) {
met_villagers_bitfield |= (1 << i);
met_villagers_num++;
for (j = 0; j < ANIMAL_MEMORY_NUM; j++) {
if (memory->memory_player_id.land_id == Save_Get(land_info).id &&
mLd_CheckCmpLandName(memory->memory_player_id.land_name, Save_Get(land_info).name) == TRUE) {
met_villagers_bitfield |= (1 << i);
met_villagers_num++;
break;
}
break;
}
memory++;
}
}
memory++;
}
}
animal++;
}
/* Roll a random villager if none have met a player in town before */
if (met_villagers_num == 0) {
do {
selected = RANDOM(ANIMAL_NUM_MAX);
} while (mNpc_CheckFreeAnimalPersonalID(&Save_Get(animals[selected]).id));
npc_id = Save_Get(animals[selected]).id.npc_id;
i = mNpc_SearchAnimalinfo(Save_Get(animals), npc_id, ANIMAL_NUM_MAX);
}
else {
/* Pick a random villager which has met a player in town */
selected = RANDOM(met_villagers_num);
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if ((met_villagers_bitfield & 1) != 0) {
if (selected == 0) {
break;
}
else {
selected--;
}
animal++;
}
met_villagers_bitfield >>= 1;
}
/* Roll a random villager if none have met a player in town before */
if (met_villagers_num == 0) {
do {
selected = RANDOM(ANIMAL_NUM_MAX);
} while (mNpc_CheckFreeAnimalPersonalID(&Save_Get(animals[selected]).id));
npc_id = Save_Get(animals[i]).id.npc_id;
npc_id = Save_Get(animals[selected]).id.npc_id;
i = mNpc_SearchAnimalinfo(Save_Get(animals), npc_id, ANIMAL_NUM_MAX);
} else {
/* Pick a random villager which has met a player in town */
selected = RANDOM(met_villagers_num);
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if ((met_villagers_bitfield & 1) != 0) {
if (selected == 0) {
break;
} else {
selected--;
}
}
met_villagers_bitfield >>= 1;
}
npc_id = Save_Get(animals[i]).id.npc_id;
}
if (scene_no == SCENE_PLAYERSELECT_2) {
Common_Set(player_select_animal_no, i);
}
mNpc_RegistEventNpc(npc_actor, npc_id, npc_id, Save_Get(animals[i]).cloth);
}
if (scene_no == SCENE_PLAYERSELECT_2) {
Common_Set(player_select_animal_no, i);
}
mNpc_RegistEventNpc(npc_actor, npc_id, npc_id, Save_Get(animals[i]).cloth);
}
}
static void Scene_Proc_Player_Ptr(GAME_PLAY* play, Scene_Word_u* data);
@@ -330,259 +320,246 @@ static void Scene_Proc_Sound(GAME_PLAY* play, Scene_Word_u* data);
typedef void (*mSc_SCENE_WORD_PROC)(GAME_PLAY*, Scene_Word_u*);
extern void Scene_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
static mSc_SCENE_WORD_PROC Scene_Proc[mSc_SCENE_DATA_TYPE_NUM] = {
&Scene_Proc_Player_Ptr,
&Scene_Proc_Ctrl_Actor_Ptr,
&Scene_Proc_Actor_Ptr,
&Scene_Proc_Object_Exchange_Bank_Ptr,
&Scene_Proc_Door_Data_Ptr,
&Scene_Proc_Field_ct,
&Scene_Proc_MyRoom_ct,
&Scene_Proc_ArrangeRoom_ct,
&Scene_Proc_ArrangeFurniture_ct,
&Scene_Proc_Sound,
NULL
};
static mSc_SCENE_WORD_PROC Scene_Proc[mSc_SCENE_DATA_TYPE_NUM] = { &Scene_Proc_Player_Ptr,
&Scene_Proc_Ctrl_Actor_Ptr,
&Scene_Proc_Actor_Ptr,
&Scene_Proc_Object_Exchange_Bank_Ptr,
&Scene_Proc_Door_Data_Ptr,
&Scene_Proc_Field_ct,
&Scene_Proc_MyRoom_ct,
&Scene_Proc_ArrangeRoom_ct,
&Scene_Proc_ArrangeFurniture_ct,
&Scene_Proc_Sound,
NULL };
/* Initialize all scene data */
while (TRUE) {
u32 type = scene_data->misc.type;
if (type == mSc_SCENE_DATA_TYPE_END) {
break;
}
if (type < mSc_SCENE_DATA_TYPE_NUM) {
(*Scene_Proc[type])(play, scene_data);
/* Initialize all scene data */
while (TRUE) {
u32 type = scene_data->misc.type;
if (type == mSc_SCENE_DATA_TYPE_END) {
break;
}
if (type < mSc_SCENE_DATA_TYPE_NUM) {
(*Scene_Proc[type])(play, scene_data);
}
scene_data++;
}
scene_data++;
}
/* Setup player select actors */
Scene_player_select(SCENE_PLAYERSELECT_2, SP_NPC_P_SEL2); // load
Scene_player_select(SCENE_PLAYERSELECT_SAVE, SP_NPC_RESTART); // save
/* Setup player select actors */
Scene_player_select(SCENE_PLAYERSELECT_2, SP_NPC_P_SEL2); // load
Scene_player_select(SCENE_PLAYERSELECT_SAVE, SP_NPC_RESTART); // save
/* Select Rover or Blanca for visiting town scene */
if (Save_Get(scene_no) == SCENE_START_DEMO3) {
int rover_shown = FALSE;
/* Select Rover or Blanca for visiting town scene */
if (Save_Get(scene_no) == SCENE_START_DEMO3) {
int rover_shown = FALSE;
if (mLd_CheckCmpLand(Common_Get(now_private)->player_ID.land_name, Common_Get(now_private)->player_ID.land_id,
Common_Get(travel_persistent_data).land.name,
Common_Get(travel_persistent_data).land.id) == TRUE) {
if (Common_Get(now_private)->state_flags & mPr_FLAG_MASK_CAT_SCHEDULED) {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
} else if (fqrand() < 0.5f) {
Common_Get(now_private)->state_flags |= mPr_FLAG_MASK_CAT_SCHEDULED; // Blanca is scheduled
} else {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
}
} else {
rover_shown = TRUE;
}
if (
mLd_CheckCmpLand(
Common_Get(now_private)->player_ID.land_name, Common_Get(now_private)->player_ID.land_id,
Common_Get(travel_persistent_data).land.name, Common_Get(travel_persistent_data).land.id
) == TRUE
) {
if (Common_Get(now_private)->state_flags & mPr_FLAG_MASK_CAT_SCHEDULED) {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
}
else if (fqrand() < 0.5f) {
Common_Get(now_private)->state_flags |= mPr_FLAG_MASK_CAT_SCHEDULED; // Blanca is scheduled
}
else {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
}
if (rover_shown == FALSE) {
mActor_name_t blanca_cloth;
mSP_SelectRandomItem_New(NULL, &blanca_cloth, 1, NULL, 0, mSP_KIND_CLOTH, mSP_LISTTYPE_ABC, FALSE);
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_MASK_CAT2, blanca_cloth);
Save_Get(mask_cat).cloth_no = (blanca_cloth >= ITM_CLOTH_START && blanca_cloth < ITM_CLOTH_END)
? (blanca_cloth - ITM_CLOTH_START)
: EMPTY_NO;
} else {
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_GUIDE, EMPTY_NO); // Rover
}
}
else {
rover_shown = TRUE;
}
if (rover_shown == FALSE) {
mActor_name_t blanca_cloth;
mSP_SelectRandomItem_New(NULL, &blanca_cloth, 1, NULL, 0, mSP_KIND_CLOTH, mSP_LISTTYPE_ABC, FALSE);
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_MASK_CAT2, blanca_cloth);
Save_Get(mask_cat).cloth_no = (blanca_cloth >= ITM_CLOTH_START && blanca_cloth < ITM_CLOTH_END) ? (blanca_cloth - ITM_CLOTH_START) : EMPTY_NO;
}
else {
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_GUIDE, EMPTY_NO); // Rover
}
}
}
static void Scene_Proc_Player_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
static s16 angle_table[8] = {
DEG2SHORT_ANGLE( 0.0f), /* 0x0000 */
DEG2SHORT_ANGLE( 45.0f), /* 0x2000 */
DEG2SHORT_ANGLE( 90.0f), /* 0x4000 */
DEG2SHORT_ANGLE( 135.0f), /* 0x6000 */
DEG2SHORT_ANGLE(-180.0f), /* 0x8000 */
DEG2SHORT_ANGLE(-135.0f), /* 0xA000 */
DEG2SHORT_ANGLE( -90.0f), /* 0xC000 */
DEG2SHORT_ANGLE( -45.0f) /* 0xE000 */
};
static s16 angle_table[mSc_DIRECT_NUM] = {
DEG2SHORT_ANGLE(0.0f), /* 0x0000 */
DEG2SHORT_ANGLE(45.0f), /* 0x2000 */
DEG2SHORT_ANGLE(90.0f), /* 0x4000 */
DEG2SHORT_ANGLE(135.0f), /* 0x6000 */
DEG2SHORT_ANGLE(-180.0f), /* 0x8000 */
DEG2SHORT_ANGLE(-135.0f), /* 0xA000 */
DEG2SHORT_ANGLE(-90.0f), /* 0xC000 */
DEG2SHORT_ANGLE(-45.0f) /* 0xE000 */
};
Actor_data* data = scene_data->actor.data_p;
Actor_data* data = scene_data->actor.data_p;
play->player_data = data;
play->player_data = data;
/* Update player position & orientation based on the current door exit data */
if (Common_Get(door_data).next_scene_id != 0) {
mem_copy((u8*)&data->position, (u8*)&Common_Get(door_data).exit_position, sizeof(s_xyz));
data->rotation.y = angle_table[Common_Get(door_data).exit_orientation];
}
/* Update player position & orientation based on the current door exit data */
if (Common_Get(door_data).next_scene_id != 0) {
mem_copy((u8*)&data->position, (u8*)&Common_Get(door_data).exit_position, sizeof(s_xyz));
data->rotation.y = angle_table[Common_Get(door_data).exit_orientation];
}
data->arg = Common_Get(door_data).extra_data;
Object_Exchange_keep_new_Player(play);
mSM_Object_Exchange_keep_new_Menu(play);
data->arg = Common_Get(door_data).extra_data;
Object_Exchange_keep_new_Player(play);
mSM_Object_Exchange_keep_new_Menu(play);
}
static void Scene_Proc_Ctrl_Actor_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
s16* data = scene_data->control_actor.ctrl_actor_profile_p;
s16* data = scene_data->control_actor.ctrl_actor_profile_p;
play->ctrl_actor_data_num = scene_data->control_actor.num_ctrl_actors;
play->ctrl_actor_data = data;
play->ctrl_actor_data_num = scene_data->control_actor.num_ctrl_actors;
play->ctrl_actor_data = data;
}
static void Scene_Proc_Actor_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
Actor_data* data_p = scene_data->actor.data_p;
Actor_data* data_p = scene_data->actor.data_p;
play->actor_data_num = scene_data->actor.num_actors;
play->actor_data = data_p;
play->actor_data_num = scene_data->actor.num_actors;
play->actor_data = data_p;
}
static void Scene_Proc_Object_Exchange_Bank_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
play->obj_bank_data_num = scene_data->object_bank.num_banks;
play->obj_bank_data = scene_data->object_bank.banks_p;
static void Scene_Proc_Object_Exchange_Bank_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
play->obj_bank_data_num = scene_data->object_bank.num_banks;
play->obj_bank_data = scene_data->object_bank.banks_p;
}
static void Scene_Proc_Door_Data_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
Door_data_c* data_p = scene_data->door_data.door_data_p;
play->door_info.num_doors = scene_data->door_data.num_doors;
play->door_info.door_data_p = data_p;
Door_data_c* data_p = scene_data->door_data.door_data_p;
play->door_info.num_doors = scene_data->door_data.num_doors;
play->door_info.door_data_p = data_p;
}
extern void Door_info_ct(Door_info_c* door_info) {
door_info->num_doors = 0;
door_info->num_doors = 0;
}
static void Scene_Proc_Sound(GAME_PLAY* play, Scene_Word_u* scene_data) {
// stubbed
// stubbed
}
static void set_item_info(GAME_PLAY* play, Scene_Word_Data_FieldCt_c* field_ct) {
static s16 profile_table[4] = {
mAc_PROFILE_BGITEM,
mAc_PROFILE_DUMMY,
mAc_PROFILE_BGPOLICEITEM,
mAc_PROFILE_BGPOSTITEM
};
static s16 profile_table[4] = { mAc_PROFILE_BGITEM, mAc_PROFILE_DUMMY, mAc_PROFILE_BGPOLICEITEM,
mAc_PROFILE_BGPOSTITEM };
int item_type = field_ct->item_type;
int item_type = field_ct->item_type;
if (item_type == 0) {
Common_Set(bg_item_profile, Common_Get(time).bgitem_profile);
}
else {
Common_Set(bg_item_profile, profile_table[item_type]);
}
if (item_type == 0) {
Common_Set(bg_item_profile, Common_Get(time).bgitem_profile);
} else {
Common_Set(bg_item_profile, profile_table[item_type]);
}
Common_Set(bg_item_type, item_type);
Common_Set(bg_item_type, item_type);
}
static void Scene_Proc_Field_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
mFM_SetFieldInitData(scene_data->field_ct.bg_num, scene_data->field_ct.bg_disp_size);
set_item_info(play, &scene_data->field_ct);
Common_Set(field_draw_type, scene_data->field_ct.draw_type);
Common_Set(game_started, FALSE);
Common_Set(in_initial_block, TRUE);
Common_Set(sunlight_flag, TRUE);
mFM_SetFieldInitData(scene_data->field_ct.bg_num, scene_data->field_ct.bg_disp_size);
set_item_info(play, &scene_data->field_ct);
Common_Set(field_draw_type, scene_data->field_ct.draw_type);
Common_Set(game_started, FALSE);
Common_Set(in_initial_block, TRUE);
Common_Set(sunlight_flag, TRUE);
}
static void Scene_Proc_MyRoom_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
mScn_ObtainMyRoomBank(play);
mScn_ObtainMyRoomBank(play);
}
static void Scene_Proc_ArrangeRoom_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
mScn_ObtainCarpetBank(play);
mScn_ObtainCarpetBank(play);
}
static void Scene_Proc_ArrangeFurniture_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
Common_Get(clip).arrange_ftr_num = scene_data->arrange_ftr_ct.arrange_ftr_num;
Common_Get(clip).arrange_ftr_num = scene_data->arrange_ftr_ct.arrange_ftr_num;
}
extern int goto_other_scene(GAME_PLAY* play, Door_data_c* door_data, int update_player_mode) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = 0; // failed
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = 0; // failed
if (player != NULL) {
if (play->fb_wipe_mode == 0) {
play->fb_fade_type = 2;
if (player != NULL) {
if (play->fb_wipe_mode == 0) {
play->fb_fade_type = 2;
if (door_data->wipe_type == 0) {
play->fb_wipe_type = 3;
}
else {
play->fb_wipe_type = door_data->wipe_type;
}
if (door_data->wipe_type == 0) {
play->fb_wipe_type = 3;
} else {
play->fb_wipe_type = door_data->wipe_type;
}
if (Common_Get(transition).wipe_type == 0xFF) {
Common_Get(transition).wipe_type = play->fb_wipe_type;
}
if (Common_Get(transition).wipe_type == 0xFF) {
Common_Get(transition).wipe_type = play->fb_wipe_type;
}
Common_Set(door_data, *door_data);
Common_Get(door_data).next_scene_id = door_data->next_scene_id + 1;
play->next_scene_no = door_data->next_scene_id;
Common_Set(door_data, *door_data);
Common_Get(door_data).next_scene_id = door_data->next_scene_id + 1;
play->next_scene_no = door_data->next_scene_id;
if (update_player_mode) {
mPlib_request_main_invade_type1(play);
}
if (update_player_mode) {
mPlib_request_main_invade_type1(play);
}
restore_fgdata_all(play);
play->game.pad_initialized = FALSE;
res = 1; // success
restore_fgdata_all(play);
play->game.pad_initialized = FALSE;
res = 1; // success
} else {
res = 2; // already changing scenes
}
}
else {
res = 2; // already changing scenes
}
}
return res;
return res;
}
extern int goto_next_scene(GAME_PLAY* play, int next_idx, int update_player_mode) {
int res = FALSE;
int res = FALSE;
if (play->door_info.num_doors != 0) {
res = goto_other_scene(play, play->door_info.door_data_p + next_idx, update_player_mode);
}
if (play->door_info.num_doors != 0) {
res = goto_other_scene(play, play->door_info.door_data_p + next_idx, update_player_mode);
}
return res;
return res;
}
extern int goto_emu_game(GAME_PLAY* play, u8 famicom_rom_id) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = FALSE;
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = FALSE;
if (player != NULL) {
Door_data_c* door_data;
play->fb_fade_type = 3;
play->fb_wipe_type = 3;
res = TRUE;
if (player != NULL) {
Door_data_c* door_data;
door_data = Common_GetPointer(famicom_emu_exit_door_data);
door_data->next_scene_id = Save_Get(scene_no);
door_data->exit_orientation = 0;
door_data->exit_type = 0;
door_data->extra_data = 0;
door_data->exit_position.x = player->actor_class.world.position.x;
door_data->exit_position.y = player->actor_class.world.position.y;
door_data->exit_position.z = player->actor_class.world.position.z;
door_data->door_actor_name = EMPTY_NO;
Common_Set(current_famicom_rom, famicom_rom_id);
}
play->fb_fade_type = 3;
play->fb_wipe_type = 3;
res = TRUE;
return res;
door_data = Common_GetPointer(famicom_emu_exit_door_data);
door_data->next_scene_id = Save_Get(scene_no);
door_data->exit_orientation = 0;
door_data->exit_type = 0;
door_data->extra_data = 0;
door_data->exit_position.x = player->actor_class.world.position.x;
door_data->exit_position.y = player->actor_class.world.position.y;
door_data->exit_position.z = player->actor_class.world.position.z;
door_data->door_actor_name = EMPTY_NO;
Common_Set(current_famicom_rom, famicom_rom_id);
}
return res;
}
extern void return_emu_game(GAME* game) {
mem_copy((u8*)Common_GetPointer(door_data), (u8*)Common_GetPointer(famicom_emu_exit_door_data), sizeof(Door_data_c)); // copy exit door data
Common_Get(door_data).next_scene_id = Common_Get(famicom_emu_exit_door_data).next_scene_id + 1;
game->pad_initialized = FALSE;
game_goto_next_game_play(game);
Save_Set(scene_no, Common_Get(famicom_emu_exit_door_data).next_scene_id);
mem_copy((u8*)Common_GetPointer(door_data), (u8*)Common_GetPointer(famicom_emu_exit_door_data),
sizeof(Door_data_c)); // copy exit door data
Common_Get(door_data).next_scene_id = Common_Get(famicom_emu_exit_door_data).next_scene_id + 1;
game->pad_initialized = FALSE;
game_goto_next_game_play(game);
Save_Set(scene_no, Common_Get(famicom_emu_exit_door_data).next_scene_id);
}
+844 -925
View File
File diff suppressed because it is too large Load Diff