mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-22 22:24:16 -04:00
Implement & link ac_my_house
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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, ¢er, &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
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user