diff --git a/config/rel_slices.yml b/config/rel_slices.yml index b8986d2d..42da331c 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -578,6 +578,11 @@ ac_ev_castaway.c: ac_ev_dokutu.c: .text: [0x8051DFF4, 0x8051E228] .data: [0x806A05C8, 0x806A0608] +ac_ev_ghost.c: + .text: [0x8051F10C, 0x80520D78] + .rodata: [0x806491E8, 0x80649228] + .data: [0x806A06A0, 0x806A0938] + .bss: [0x81301820, 0x81301830] ac_ev_gypsy.c: .text: [0x80520D78, 0x80521414] .rodata: [0x80649228, 0x80649238] diff --git a/include/ac_ev_ghost.h b/include/ac_ev_ghost.h index 3c89a71a..4caf3a54 100644 --- a/include/ac_ev_ghost.h +++ b/include/ac_ev_ghost.h @@ -9,11 +9,44 @@ extern "C" { #endif +#define aEGH_MINIMUM_GRASS_COUNT 8 + +#define aEGH_BIT_FOUND_GHOST 1 + +enum { + aEGH_ITEM_LIST_FTR_A, + aEGH_ITEM_LIST_FTR_B, + aEGH_ITEM_LIST_FTR_C, + aEGH_ITEM_LIST_FTR_EVENT, + aEGH_ITEM_LIST_FTR_LOTTERY, + aEGH_ITEM_LIST_CARPET_A, + aEGH_ITEM_LIST_CARPET_B, + aEGH_ITEM_LIST_CARPET_C, + aEGH_ITEM_LIST_CARPET_EVENT, + aEGH_ITEM_LIST_WALL_A, + aEGH_ITEM_LIST_WALL_B, + aEGH_ITEM_LIST_WALL_C, + aEGH_ITEM_LIST_WALL_EVENT, + aEGH_ITEM_LIST_CLOTH_A, + aEGH_ITEM_LIST_CLOTH_B, + aEGH_ITEM_LIST_CLOTH_C, + aEGH_ITEM_LIST_CLOTH_EVENT, + aEGH_ITEM_LIST_BINSEN_A, + aEGH_ITEM_LIST_BINSEN_B, + aEGH_ITEM_LIST_BINSEN_C, + aEGH_ITEM_LIST_HANIWA, + aEGH_ITEM_LIST_UMBRELLA, + + aEGH_ITEM_LIST_NUM +}; + typedef struct ev_ghost_s EV_GHOST_ACTOR; +typedef void (*aEGH_PROC)(EV_GHOST_ACTOR*, GAME_PLAY*); + struct ev_ghost_s { /* 0x000 */ NPC_ACTOR npc_class; - /* 0x994 */ void* think_proc; + /* 0x994 */ aEGH_PROC think_proc; /* 0x998 */ int msg_no; /* 0x99C */ mActor_name_t give_item; /* 0x99E */ s16 bye_bye_angle; @@ -21,7 +54,15 @@ struct ev_ghost_s { /* 0x9A1 */ u8 bye_bye_scale_timer; /* 0x9A2 */ u8 bye_bye_transparency_delay_timer; /* 0x9A3 */ u8 think_act; - /* 0x9A4 */ + /* 0x9A4 */ u8 after_talk_think_act; + /* 0x9A5 */ u8 _9A5; + /* 0x9A6 */ u8 talk_act; + /* 0x9A7 */ u8 _9A7; + /* 0x9A8 */ u8 melody_inst; + /* 0x9A9 */ u8 alpha; + /* 0x9AA */ u8 _9AA; + /* 0x9AB */ u8 roof_pal; + /* 0x9AC */ u8 _9AC; }; extern ACTOR_PROFILE Ev_Ghost_Profile; diff --git a/include/ac_npc.h b/include/ac_npc.h index cb4df68a..039bed33 100644 --- a/include/ac_npc.h +++ b/include/ac_npc.h @@ -95,6 +95,7 @@ typedef void (*aNPC_DRAW_PROC)(ACTOR*, GAME*); typedef void (*aNPC_REBUILD_DMA_PROC)(); typedef void (*aNPC_ANIMATION_INIT_PROC)(ACTOR*, int, int); +typedef void (*aNPC_CHG_SCHEDULE_PROC)(NPC_ACTOR*, GAME_PLAY*, u8); typedef int (*aNPC_CLIP_THINK_PROC)(NPC_ACTOR*, GAME_PLAY*, int, int); typedef int (*aNPC_FORCE_CALL_REQ_PROC)(NPC_ACTOR*, int); @@ -122,7 +123,7 @@ struct ac_npc_clip_s { /* 0x0F8 */ aNPC_REBUILD_DMA_PROC rebuild_dma_proc; /* 0x0FC */ void* _0FC[(0x114 - 0x0FC) / sizeof(void*)]; /* 0x114 */ aNPC_ANIMATION_INIT_PROC animation_init_proc; - /* 0x118 */ void* _118; + /* 0x118 */ aNPC_CHG_SCHEDULE_PROC chg_schedule_proc; /* 0x11C */ void* _11C; /* 0x120 */ aNPC_CLIP_THINK_PROC think_proc; /* 0x124 */ aNPC_FORCE_CALL_REQ_PROC force_call_req_proc; @@ -166,7 +167,9 @@ typedef struct npc_draw_info_s { /* 0x5BC */ u8 _5BC; /* 0x5BD */ u8 _5BD; /* 0x5BE */ u8 _5BE; - /* 0x5BE */ u8 _5BF[0x630 - 0x5BF]; + /* 0x5BE */ u8 _5BF[0x5D0 - 0x5BF]; + /* 0x5D0 */ f32 animation_speed; + /* 0x5D4 */ u8 _5D4[0x630 - 0x5D4]; } aNPC_draw_info_c; typedef void (*aNPC_THINK_PROC)(NPC_ACTOR*, GAME_PLAY*, int); @@ -388,6 +391,18 @@ typedef struct npc_accessory_s { typedef void (*aNPC_PROC)(NPC_ACTOR* npc_actorx, GAME_PLAY* play, int schedule_idx); typedef void (*aNPC_SUB_PROC)(NPC_ACTOR* npc_actorx, GAME_PLAY* play); +enum { + aNPC_SCHEDULE_TYPE_FIELD, + aNPC_SCHEDULE_TYPE_IN_HOUSE, + aNPC_SCHEDULE_TYPE_SLEEP, + aNPC_SCHEDULE_TYPE_STAND, + aNPC_SCHEDULE_TYPE_WANDER, + aNPC_SCHEDULE_TYPE_WALK_WANDER, + aNPC_SCHEDULE_TYPE_SPECIAL, + + aNPC_SCHEDULE_TYPE_NUM +}; + struct npc_actor_s { ACTOR actor_class; s_xyz _174; diff --git a/include/m_event.h b/include/m_event.h index d5c0f840..47895eb0 100644 --- a/include/m_event.h +++ b/include/m_event.h @@ -372,7 +372,7 @@ typedef struct ghost_common_s { } mEv_gst_common_c; typedef struct ghost_event_s { - u16 violent_person_str_no; + u16 okoruhito_str_no; u16 flags; lbRTC_ymd_c renew_time; } mEv_gst_c; diff --git a/include/m_msg.h b/include/m_msg.h index d4f90d96..27912907 100644 --- a/include/m_msg.h +++ b/include/m_msg.h @@ -331,6 +331,13 @@ extern int mMsg_CopyAmPm(mMsg_Window_c* msg_p, u8* data, int start_idx, int len) extern int mMsg_CopyRamdomNumber2(u8* data, int start_idx, int len); extern int mMsg_CopyItem(mMsg_Window_c* msg_p, int str_no, u8* data, int start_idx, int len, int article, u32 capitalize); extern int mMsg_CopyMail(mMsg_Window_c* msg_p, int str_no, u8* data, int start_idx, int len, u32 capitalize); +extern int mMsg_sound_voice_get(int code); +extern int mMsg_sound_voice_get_for_editor(int code); +extern void mMsg_sound_spec_change_voice_force(mMsg_Window_c* msg_p); +extern int mMsg_sound_spec_change_voice(mMsg_Window_c* msg_p); +extern void mMsg_sound_set_voice_click(mMsg_Window_c* msg_p); +extern void mMsg_sound_set_voice_silent(mMsg_Window_c* msg_p, int update_mode); +extern void mMsg_sound_unset_voice_silent(mMsg_Window_c* msg_p, int update_mode); #ifdef __cplusplus } diff --git a/include/m_name_table.h b/include/m_name_table.h index aae01313..b0e01b95 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -569,8 +569,515 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define FTR_DRACAENA_WEST 0x13B3 #define HANIWA_START 0x15B0 -// -#define HANIWA_END 0x17AB +#define FTR_HANIWA000_SOUTH (HANIWA_START + 0) +#define FTR_HANIWA000_EAST (HANIWA_START + 1) +#define FTR_HANIWA000_NORTH (HANIWA_START + 2) +#define FTR_HANIWA000_WEST (HANIWA_START + 3) +#define FTR_HANIWA001_SOUTH (HANIWA_START + 4) +#define FTR_HANIWA001_EAST (HANIWA_START + 5) +#define FTR_HANIWA001_NORTH (HANIWA_START + 6) +#define FTR_HANIWA001_WEST (HANIWA_START + 7) +#define FTR_HANIWA002_SOUTH (HANIWA_START + 8) +#define FTR_HANIWA002_EAST (HANIWA_START + 9) +#define FTR_HANIWA002_NORTH (HANIWA_START + 10) +#define FTR_HANIWA002_WEST (HANIWA_START + 11) +#define FTR_HANIWA003_SOUTH (HANIWA_START + 12) +#define FTR_HANIWA003_EAST (HANIWA_START + 13) +#define FTR_HANIWA003_NORTH (HANIWA_START + 14) +#define FTR_HANIWA003_WEST (HANIWA_START + 15) +#define FTR_HANIWA004_SOUTH (HANIWA_START + 16) +#define FTR_HANIWA004_EAST (HANIWA_START + 17) +#define FTR_HANIWA004_NORTH (HANIWA_START + 18) +#define FTR_HANIWA004_WEST (HANIWA_START + 19) +#define FTR_HANIWA005_SOUTH (HANIWA_START + 20) +#define FTR_HANIWA005_EAST (HANIWA_START + 21) +#define FTR_HANIWA005_NORTH (HANIWA_START + 22) +#define FTR_HANIWA005_WEST (HANIWA_START + 23) +#define FTR_HANIWA006_SOUTH (HANIWA_START + 24) +#define FTR_HANIWA006_EAST (HANIWA_START + 25) +#define FTR_HANIWA006_NORTH (HANIWA_START + 26) +#define FTR_HANIWA006_WEST (HANIWA_START + 27) +#define FTR_HANIWA007_SOUTH (HANIWA_START + 28) +#define FTR_HANIWA007_EAST (HANIWA_START + 29) +#define FTR_HANIWA007_NORTH (HANIWA_START + 30) +#define FTR_HANIWA007_WEST (HANIWA_START + 31) +#define FTR_HANIWA008_SOUTH (HANIWA_START + 32) +#define FTR_HANIWA008_EAST (HANIWA_START + 33) +#define FTR_HANIWA008_NORTH (HANIWA_START + 34) +#define FTR_HANIWA008_WEST (HANIWA_START + 35) +#define FTR_HANIWA009_SOUTH (HANIWA_START + 36) +#define FTR_HANIWA009_EAST (HANIWA_START + 37) +#define FTR_HANIWA009_NORTH (HANIWA_START + 38) +#define FTR_HANIWA009_WEST (HANIWA_START + 39) +#define FTR_HANIWA010_SOUTH (HANIWA_START + 40) +#define FTR_HANIWA010_EAST (HANIWA_START + 41) +#define FTR_HANIWA010_NORTH (HANIWA_START + 42) +#define FTR_HANIWA010_WEST (HANIWA_START + 43) +#define FTR_HANIWA011_SOUTH (HANIWA_START + 44) +#define FTR_HANIWA011_EAST (HANIWA_START + 45) +#define FTR_HANIWA011_NORTH (HANIWA_START + 46) +#define FTR_HANIWA011_WEST (HANIWA_START + 47) +#define FTR_HANIWA012_SOUTH (HANIWA_START + 48) +#define FTR_HANIWA012_EAST (HANIWA_START + 49) +#define FTR_HANIWA012_NORTH (HANIWA_START + 50) +#define FTR_HANIWA012_WEST (HANIWA_START + 51) +#define FTR_HANIWA013_SOUTH (HANIWA_START + 52) +#define FTR_HANIWA013_EAST (HANIWA_START + 53) +#define FTR_HANIWA013_NORTH (HANIWA_START + 54) +#define FTR_HANIWA013_WEST (HANIWA_START + 55) +#define FTR_HANIWA014_SOUTH (HANIWA_START + 56) +#define FTR_HANIWA014_EAST (HANIWA_START + 57) +#define FTR_HANIWA014_NORTH (HANIWA_START + 58) +#define FTR_HANIWA014_WEST (HANIWA_START + 59) +#define FTR_HANIWA015_SOUTH (HANIWA_START + 60) +#define FTR_HANIWA015_EAST (HANIWA_START + 61) +#define FTR_HANIWA015_NORTH (HANIWA_START + 62) +#define FTR_HANIWA015_WEST (HANIWA_START + 63) +#define FTR_HANIWA016_SOUTH (HANIWA_START + 64) +#define FTR_HANIWA016_EAST (HANIWA_START + 65) +#define FTR_HANIWA016_NORTH (HANIWA_START + 66) +#define FTR_HANIWA016_WEST (HANIWA_START + 67) +#define FTR_HANIWA017_SOUTH (HANIWA_START + 68) +#define FTR_HANIWA017_EAST (HANIWA_START + 69) +#define FTR_HANIWA017_NORTH (HANIWA_START + 70) +#define FTR_HANIWA017_WEST (HANIWA_START + 71) +#define FTR_HANIWA018_SOUTH (HANIWA_START + 72) +#define FTR_HANIWA018_EAST (HANIWA_START + 73) +#define FTR_HANIWA018_NORTH (HANIWA_START + 74) +#define FTR_HANIWA018_WEST (HANIWA_START + 75) +#define FTR_HANIWA019_SOUTH (HANIWA_START + 76) +#define FTR_HANIWA019_EAST (HANIWA_START + 77) +#define FTR_HANIWA019_NORTH (HANIWA_START + 78) +#define FTR_HANIWA019_WEST (HANIWA_START + 79) +#define FTR_HANIWA020_SOUTH (HANIWA_START + 80) +#define FTR_HANIWA020_EAST (HANIWA_START + 81) +#define FTR_HANIWA020_NORTH (HANIWA_START + 82) +#define FTR_HANIWA020_WEST (HANIWA_START + 83) +#define FTR_HANIWA021_SOUTH (HANIWA_START + 84) +#define FTR_HANIWA021_EAST (HANIWA_START + 85) +#define FTR_HANIWA021_NORTH (HANIWA_START + 86) +#define FTR_HANIWA021_WEST (HANIWA_START + 87) +#define FTR_HANIWA022_SOUTH (HANIWA_START + 88) +#define FTR_HANIWA022_EAST (HANIWA_START + 89) +#define FTR_HANIWA022_NORTH (HANIWA_START + 90) +#define FTR_HANIWA022_WEST (HANIWA_START + 91) +#define FTR_HANIWA023_SOUTH (HANIWA_START + 92) +#define FTR_HANIWA023_EAST (HANIWA_START + 93) +#define FTR_HANIWA023_NORTH (HANIWA_START + 94) +#define FTR_HANIWA023_WEST (HANIWA_START + 95) +#define FTR_HANIWA024_SOUTH (HANIWA_START + 96) +#define FTR_HANIWA024_EAST (HANIWA_START + 97) +#define FTR_HANIWA024_NORTH (HANIWA_START + 98) +#define FTR_HANIWA024_WEST (HANIWA_START + 99) +#define FTR_HANIWA025_SOUTH (HANIWA_START + 100) +#define FTR_HANIWA025_EAST (HANIWA_START + 101) +#define FTR_HANIWA025_NORTH (HANIWA_START + 102) +#define FTR_HANIWA025_WEST (HANIWA_START + 103) +#define FTR_HANIWA026_SOUTH (HANIWA_START + 104) +#define FTR_HANIWA026_EAST (HANIWA_START + 105) +#define FTR_HANIWA026_NORTH (HANIWA_START + 106) +#define FTR_HANIWA026_WEST (HANIWA_START + 107) +#define FTR_HANIWA027_SOUTH (HANIWA_START + 108) +#define FTR_HANIWA027_EAST (HANIWA_START + 109) +#define FTR_HANIWA027_NORTH (HANIWA_START + 110) +#define FTR_HANIWA027_WEST (HANIWA_START + 111) +#define FTR_HANIWA028_SOUTH (HANIWA_START + 112) +#define FTR_HANIWA028_EAST (HANIWA_START + 113) +#define FTR_HANIWA028_NORTH (HANIWA_START + 114) +#define FTR_HANIWA028_WEST (HANIWA_START + 115) +#define FTR_HANIWA029_SOUTH (HANIWA_START + 116) +#define FTR_HANIWA029_EAST (HANIWA_START + 117) +#define FTR_HANIWA029_NORTH (HANIWA_START + 118) +#define FTR_HANIWA029_WEST (HANIWA_START + 119) +#define FTR_HANIWA030_SOUTH (HANIWA_START + 120) +#define FTR_HANIWA030_EAST (HANIWA_START + 121) +#define FTR_HANIWA030_NORTH (HANIWA_START + 122) +#define FTR_HANIWA030_WEST (HANIWA_START + 123) +#define FTR_HANIWA031_SOUTH (HANIWA_START + 124) +#define FTR_HANIWA031_EAST (HANIWA_START + 125) +#define FTR_HANIWA031_NORTH (HANIWA_START + 126) +#define FTR_HANIWA031_WEST (HANIWA_START + 127) +#define FTR_HANIWA032_SOUTH (HANIWA_START + 128) +#define FTR_HANIWA032_EAST (HANIWA_START + 129) +#define FTR_HANIWA032_NORTH (HANIWA_START + 130) +#define FTR_HANIWA032_WEST (HANIWA_START + 131) +#define FTR_HANIWA033_SOUTH (HANIWA_START + 132) +#define FTR_HANIWA033_EAST (HANIWA_START + 133) +#define FTR_HANIWA033_NORTH (HANIWA_START + 134) +#define FTR_HANIWA033_WEST (HANIWA_START + 135) +#define FTR_HANIWA034_SOUTH (HANIWA_START + 136) +#define FTR_HANIWA034_EAST (HANIWA_START + 137) +#define FTR_HANIWA034_NORTH (HANIWA_START + 138) +#define FTR_HANIWA034_WEST (HANIWA_START + 139) +#define FTR_HANIWA035_SOUTH (HANIWA_START + 140) +#define FTR_HANIWA035_EAST (HANIWA_START + 141) +#define FTR_HANIWA035_NORTH (HANIWA_START + 142) +#define FTR_HANIWA035_WEST (HANIWA_START + 143) +#define FTR_HANIWA036_SOUTH (HANIWA_START + 144) +#define FTR_HANIWA036_EAST (HANIWA_START + 145) +#define FTR_HANIWA036_NORTH (HANIWA_START + 146) +#define FTR_HANIWA036_WEST (HANIWA_START + 147) +#define FTR_HANIWA037_SOUTH (HANIWA_START + 148) +#define FTR_HANIWA037_EAST (HANIWA_START + 149) +#define FTR_HANIWA037_NORTH (HANIWA_START + 150) +#define FTR_HANIWA037_WEST (HANIWA_START + 151) +#define FTR_HANIWA038_SOUTH (HANIWA_START + 152) +#define FTR_HANIWA038_EAST (HANIWA_START + 153) +#define FTR_HANIWA038_NORTH (HANIWA_START + 154) +#define FTR_HANIWA038_WEST (HANIWA_START + 155) +#define FTR_HANIWA039_SOUTH (HANIWA_START + 156) +#define FTR_HANIWA039_EAST (HANIWA_START + 157) +#define FTR_HANIWA039_NORTH (HANIWA_START + 158) +#define FTR_HANIWA039_WEST (HANIWA_START + 159) +#define FTR_HANIWA040_SOUTH (HANIWA_START + 160) +#define FTR_HANIWA040_EAST (HANIWA_START + 161) +#define FTR_HANIWA040_NORTH (HANIWA_START + 162) +#define FTR_HANIWA040_WEST (HANIWA_START + 163) +#define FTR_HANIWA041_SOUTH (HANIWA_START + 164) +#define FTR_HANIWA041_EAST (HANIWA_START + 165) +#define FTR_HANIWA041_NORTH (HANIWA_START + 166) +#define FTR_HANIWA041_WEST (HANIWA_START + 167) +#define FTR_HANIWA042_SOUTH (HANIWA_START + 168) +#define FTR_HANIWA042_EAST (HANIWA_START + 169) +#define FTR_HANIWA042_NORTH (HANIWA_START + 170) +#define FTR_HANIWA042_WEST (HANIWA_START + 171) +#define FTR_HANIWA043_SOUTH (HANIWA_START + 172) +#define FTR_HANIWA043_EAST (HANIWA_START + 173) +#define FTR_HANIWA043_NORTH (HANIWA_START + 174) +#define FTR_HANIWA043_WEST (HANIWA_START + 175) +#define FTR_HANIWA044_SOUTH (HANIWA_START + 176) +#define FTR_HANIWA044_EAST (HANIWA_START + 177) +#define FTR_HANIWA044_NORTH (HANIWA_START + 178) +#define FTR_HANIWA044_WEST (HANIWA_START + 179) +#define FTR_HANIWA045_SOUTH (HANIWA_START + 180) +#define FTR_HANIWA045_EAST (HANIWA_START + 181) +#define FTR_HANIWA045_NORTH (HANIWA_START + 182) +#define FTR_HANIWA045_WEST (HANIWA_START + 183) +#define FTR_HANIWA046_SOUTH (HANIWA_START + 184) +#define FTR_HANIWA046_EAST (HANIWA_START + 185) +#define FTR_HANIWA046_NORTH (HANIWA_START + 186) +#define FTR_HANIWA046_WEST (HANIWA_START + 187) +#define FTR_HANIWA047_SOUTH (HANIWA_START + 188) +#define FTR_HANIWA047_EAST (HANIWA_START + 189) +#define FTR_HANIWA047_NORTH (HANIWA_START + 190) +#define FTR_HANIWA047_WEST (HANIWA_START + 191) +#define FTR_HANIWA048_SOUTH (HANIWA_START + 192) +#define FTR_HANIWA048_EAST (HANIWA_START + 193) +#define FTR_HANIWA048_NORTH (HANIWA_START + 194) +#define FTR_HANIWA048_WEST (HANIWA_START + 195) +#define FTR_HANIWA049_SOUTH (HANIWA_START + 196) +#define FTR_HANIWA049_EAST (HANIWA_START + 197) +#define FTR_HANIWA049_NORTH (HANIWA_START + 198) +#define FTR_HANIWA049_WEST (HANIWA_START + 199) +#define FTR_HANIWA050_SOUTH (HANIWA_START + 200) +#define FTR_HANIWA050_EAST (HANIWA_START + 201) +#define FTR_HANIWA050_NORTH (HANIWA_START + 202) +#define FTR_HANIWA050_WEST (HANIWA_START + 203) +#define FTR_HANIWA051_SOUTH (HANIWA_START + 204) +#define FTR_HANIWA051_EAST (HANIWA_START + 205) +#define FTR_HANIWA051_NORTH (HANIWA_START + 206) +#define FTR_HANIWA051_WEST (HANIWA_START + 207) +#define FTR_HANIWA052_SOUTH (HANIWA_START + 208) +#define FTR_HANIWA052_EAST (HANIWA_START + 209) +#define FTR_HANIWA052_NORTH (HANIWA_START + 210) +#define FTR_HANIWA052_WEST (HANIWA_START + 211) +#define FTR_HANIWA053_SOUTH (HANIWA_START + 212) +#define FTR_HANIWA053_EAST (HANIWA_START + 213) +#define FTR_HANIWA053_NORTH (HANIWA_START + 214) +#define FTR_HANIWA053_WEST (HANIWA_START + 215) +#define FTR_HANIWA054_SOUTH (HANIWA_START + 216) +#define FTR_HANIWA054_EAST (HANIWA_START + 217) +#define FTR_HANIWA054_NORTH (HANIWA_START + 218) +#define FTR_HANIWA054_WEST (HANIWA_START + 219) +#define FTR_HANIWA055_SOUTH (HANIWA_START + 220) +#define FTR_HANIWA055_EAST (HANIWA_START + 221) +#define FTR_HANIWA055_NORTH (HANIWA_START + 222) +#define FTR_HANIWA055_WEST (HANIWA_START + 223) +#define FTR_HANIWA056_SOUTH (HANIWA_START + 224) +#define FTR_HANIWA056_EAST (HANIWA_START + 225) +#define FTR_HANIWA056_NORTH (HANIWA_START + 226) +#define FTR_HANIWA056_WEST (HANIWA_START + 227) +#define FTR_HANIWA057_SOUTH (HANIWA_START + 228) +#define FTR_HANIWA057_EAST (HANIWA_START + 229) +#define FTR_HANIWA057_NORTH (HANIWA_START + 230) +#define FTR_HANIWA057_WEST (HANIWA_START + 231) +#define FTR_HANIWA058_SOUTH (HANIWA_START + 232) +#define FTR_HANIWA058_EAST (HANIWA_START + 233) +#define FTR_HANIWA058_NORTH (HANIWA_START + 234) +#define FTR_HANIWA058_WEST (HANIWA_START + 235) +#define FTR_HANIWA059_SOUTH (HANIWA_START + 236) +#define FTR_HANIWA059_EAST (HANIWA_START + 237) +#define FTR_HANIWA059_NORTH (HANIWA_START + 238) +#define FTR_HANIWA059_WEST (HANIWA_START + 239) +#define FTR_HANIWA060_SOUTH (HANIWA_START + 240) +#define FTR_HANIWA060_EAST (HANIWA_START + 241) +#define FTR_HANIWA060_NORTH (HANIWA_START + 242) +#define FTR_HANIWA060_WEST (HANIWA_START + 243) +#define FTR_HANIWA061_SOUTH (HANIWA_START + 244) +#define FTR_HANIWA061_EAST (HANIWA_START + 245) +#define FTR_HANIWA061_NORTH (HANIWA_START + 246) +#define FTR_HANIWA061_WEST (HANIWA_START + 247) +#define FTR_HANIWA062_SOUTH (HANIWA_START + 248) +#define FTR_HANIWA062_EAST (HANIWA_START + 249) +#define FTR_HANIWA062_NORTH (HANIWA_START + 250) +#define FTR_HANIWA062_WEST (HANIWA_START + 251) +#define FTR_HANIWA063_SOUTH (HANIWA_START + 252) +#define FTR_HANIWA063_EAST (HANIWA_START + 253) +#define FTR_HANIWA063_NORTH (HANIWA_START + 254) +#define FTR_HANIWA063_WEST (HANIWA_START + 255) +#define FTR_HANIWA064_SOUTH (HANIWA_START + 256) +#define FTR_HANIWA064_EAST (HANIWA_START + 257) +#define FTR_HANIWA064_NORTH (HANIWA_START + 258) +#define FTR_HANIWA064_WEST (HANIWA_START + 259) +#define FTR_HANIWA065_SOUTH (HANIWA_START + 260) +#define FTR_HANIWA065_EAST (HANIWA_START + 261) +#define FTR_HANIWA065_NORTH (HANIWA_START + 262) +#define FTR_HANIWA065_WEST (HANIWA_START + 263) +#define FTR_HANIWA066_SOUTH (HANIWA_START + 264) +#define FTR_HANIWA066_EAST (HANIWA_START + 265) +#define FTR_HANIWA066_NORTH (HANIWA_START + 266) +#define FTR_HANIWA066_WEST (HANIWA_START + 267) +#define FTR_HANIWA067_SOUTH (HANIWA_START + 268) +#define FTR_HANIWA067_EAST (HANIWA_START + 269) +#define FTR_HANIWA067_NORTH (HANIWA_START + 270) +#define FTR_HANIWA067_WEST (HANIWA_START + 271) +#define FTR_HANIWA068_SOUTH (HANIWA_START + 272) +#define FTR_HANIWA068_EAST (HANIWA_START + 273) +#define FTR_HANIWA068_NORTH (HANIWA_START + 274) +#define FTR_HANIWA068_WEST (HANIWA_START + 275) +#define FTR_HANIWA069_SOUTH (HANIWA_START + 276) +#define FTR_HANIWA069_EAST (HANIWA_START + 277) +#define FTR_HANIWA069_NORTH (HANIWA_START + 278) +#define FTR_HANIWA069_WEST (HANIWA_START + 279) +#define FTR_HANIWA070_SOUTH (HANIWA_START + 280) +#define FTR_HANIWA070_EAST (HANIWA_START + 281) +#define FTR_HANIWA070_NORTH (HANIWA_START + 282) +#define FTR_HANIWA070_WEST (HANIWA_START + 283) +#define FTR_HANIWA071_SOUTH (HANIWA_START + 284) +#define FTR_HANIWA071_EAST (HANIWA_START + 285) +#define FTR_HANIWA071_NORTH (HANIWA_START + 286) +#define FTR_HANIWA071_WEST (HANIWA_START + 287) +#define FTR_HANIWA072_SOUTH (HANIWA_START + 288) +#define FTR_HANIWA072_EAST (HANIWA_START + 289) +#define FTR_HANIWA072_NORTH (HANIWA_START + 290) +#define FTR_HANIWA072_WEST (HANIWA_START + 291) +#define FTR_HANIWA073_SOUTH (HANIWA_START + 292) +#define FTR_HANIWA073_EAST (HANIWA_START + 293) +#define FTR_HANIWA073_NORTH (HANIWA_START + 294) +#define FTR_HANIWA073_WEST (HANIWA_START + 295) +#define FTR_HANIWA074_SOUTH (HANIWA_START + 296) +#define FTR_HANIWA074_EAST (HANIWA_START + 297) +#define FTR_HANIWA074_NORTH (HANIWA_START + 298) +#define FTR_HANIWA074_WEST (HANIWA_START + 299) +#define FTR_HANIWA075_SOUTH (HANIWA_START + 300) +#define FTR_HANIWA075_EAST (HANIWA_START + 301) +#define FTR_HANIWA075_NORTH (HANIWA_START + 302) +#define FTR_HANIWA075_WEST (HANIWA_START + 303) +#define FTR_HANIWA076_SOUTH (HANIWA_START + 304) +#define FTR_HANIWA076_EAST (HANIWA_START + 305) +#define FTR_HANIWA076_NORTH (HANIWA_START + 306) +#define FTR_HANIWA076_WEST (HANIWA_START + 307) +#define FTR_HANIWA077_SOUTH (HANIWA_START + 308) +#define FTR_HANIWA077_EAST (HANIWA_START + 309) +#define FTR_HANIWA077_NORTH (HANIWA_START + 310) +#define FTR_HANIWA077_WEST (HANIWA_START + 311) +#define FTR_HANIWA078_SOUTH (HANIWA_START + 312) +#define FTR_HANIWA078_EAST (HANIWA_START + 313) +#define FTR_HANIWA078_NORTH (HANIWA_START + 314) +#define FTR_HANIWA078_WEST (HANIWA_START + 315) +#define FTR_HANIWA079_SOUTH (HANIWA_START + 316) +#define FTR_HANIWA079_EAST (HANIWA_START + 317) +#define FTR_HANIWA079_NORTH (HANIWA_START + 318) +#define FTR_HANIWA079_WEST (HANIWA_START + 319) +#define FTR_HANIWA080_SOUTH (HANIWA_START + 320) +#define FTR_HANIWA080_EAST (HANIWA_START + 321) +#define FTR_HANIWA080_NORTH (HANIWA_START + 322) +#define FTR_HANIWA080_WEST (HANIWA_START + 323) +#define FTR_HANIWA081_SOUTH (HANIWA_START + 324) +#define FTR_HANIWA081_EAST (HANIWA_START + 325) +#define FTR_HANIWA081_NORTH (HANIWA_START + 326) +#define FTR_HANIWA081_WEST (HANIWA_START + 327) +#define FTR_HANIWA082_SOUTH (HANIWA_START + 328) +#define FTR_HANIWA082_EAST (HANIWA_START + 329) +#define FTR_HANIWA082_NORTH (HANIWA_START + 330) +#define FTR_HANIWA082_WEST (HANIWA_START + 331) +#define FTR_HANIWA083_SOUTH (HANIWA_START + 332) +#define FTR_HANIWA083_EAST (HANIWA_START + 333) +#define FTR_HANIWA083_NORTH (HANIWA_START + 334) +#define FTR_HANIWA083_WEST (HANIWA_START + 335) +#define FTR_HANIWA084_SOUTH (HANIWA_START + 336) +#define FTR_HANIWA084_EAST (HANIWA_START + 337) +#define FTR_HANIWA084_NORTH (HANIWA_START + 338) +#define FTR_HANIWA084_WEST (HANIWA_START + 339) +#define FTR_HANIWA085_SOUTH (HANIWA_START + 340) +#define FTR_HANIWA085_EAST (HANIWA_START + 341) +#define FTR_HANIWA085_NORTH (HANIWA_START + 342) +#define FTR_HANIWA085_WEST (HANIWA_START + 343) +#define FTR_HANIWA086_SOUTH (HANIWA_START + 344) +#define FTR_HANIWA086_EAST (HANIWA_START + 345) +#define FTR_HANIWA086_NORTH (HANIWA_START + 346) +#define FTR_HANIWA086_WEST (HANIWA_START + 347) +#define FTR_HANIWA087_SOUTH (HANIWA_START + 348) +#define FTR_HANIWA087_EAST (HANIWA_START + 349) +#define FTR_HANIWA087_NORTH (HANIWA_START + 350) +#define FTR_HANIWA087_WEST (HANIWA_START + 351) +#define FTR_HANIWA088_SOUTH (HANIWA_START + 352) +#define FTR_HANIWA088_EAST (HANIWA_START + 353) +#define FTR_HANIWA088_NORTH (HANIWA_START + 354) +#define FTR_HANIWA088_WEST (HANIWA_START + 355) +#define FTR_HANIWA089_SOUTH (HANIWA_START + 356) +#define FTR_HANIWA089_EAST (HANIWA_START + 357) +#define FTR_HANIWA089_NORTH (HANIWA_START + 358) +#define FTR_HANIWA089_WEST (HANIWA_START + 359) +#define FTR_HANIWA090_SOUTH (HANIWA_START + 360) +#define FTR_HANIWA090_EAST (HANIWA_START + 361) +#define FTR_HANIWA090_NORTH (HANIWA_START + 362) +#define FTR_HANIWA090_WEST (HANIWA_START + 363) +#define FTR_HANIWA091_SOUTH (HANIWA_START + 364) +#define FTR_HANIWA091_EAST (HANIWA_START + 365) +#define FTR_HANIWA091_NORTH (HANIWA_START + 366) +#define FTR_HANIWA091_WEST (HANIWA_START + 367) +#define FTR_HANIWA092_SOUTH (HANIWA_START + 368) +#define FTR_HANIWA092_EAST (HANIWA_START + 369) +#define FTR_HANIWA092_NORTH (HANIWA_START + 370) +#define FTR_HANIWA092_WEST (HANIWA_START + 371) +#define FTR_HANIWA093_SOUTH (HANIWA_START + 372) +#define FTR_HANIWA093_EAST (HANIWA_START + 373) +#define FTR_HANIWA093_NORTH (HANIWA_START + 374) +#define FTR_HANIWA093_WEST (HANIWA_START + 375) +#define FTR_HANIWA094_SOUTH (HANIWA_START + 376) +#define FTR_HANIWA094_EAST (HANIWA_START + 377) +#define FTR_HANIWA094_NORTH (HANIWA_START + 378) +#define FTR_HANIWA094_WEST (HANIWA_START + 379) +#define FTR_HANIWA095_SOUTH (HANIWA_START + 380) +#define FTR_HANIWA095_EAST (HANIWA_START + 381) +#define FTR_HANIWA095_NORTH (HANIWA_START + 382) +#define FTR_HANIWA095_WEST (HANIWA_START + 383) +#define FTR_HANIWA096_SOUTH (HANIWA_START + 384) +#define FTR_HANIWA096_EAST (HANIWA_START + 385) +#define FTR_HANIWA096_NORTH (HANIWA_START + 386) +#define FTR_HANIWA096_WEST (HANIWA_START + 387) +#define FTR_HANIWA097_SOUTH (HANIWA_START + 388) +#define FTR_HANIWA097_EAST (HANIWA_START + 389) +#define FTR_HANIWA097_NORTH (HANIWA_START + 390) +#define FTR_HANIWA097_WEST (HANIWA_START + 391) +#define FTR_HANIWA098_SOUTH (HANIWA_START + 392) +#define FTR_HANIWA098_EAST (HANIWA_START + 393) +#define FTR_HANIWA098_NORTH (HANIWA_START + 394) +#define FTR_HANIWA098_WEST (HANIWA_START + 395) +#define FTR_HANIWA099_SOUTH (HANIWA_START + 396) +#define FTR_HANIWA099_EAST (HANIWA_START + 397) +#define FTR_HANIWA099_NORTH (HANIWA_START + 398) +#define FTR_HANIWA099_WEST (HANIWA_START + 399) +#define FTR_HANIWA100_SOUTH (HANIWA_START + 400) +#define FTR_HANIWA100_EAST (HANIWA_START + 401) +#define FTR_HANIWA100_NORTH (HANIWA_START + 402) +#define FTR_HANIWA100_WEST (HANIWA_START + 403) +#define FTR_HANIWA101_SOUTH (HANIWA_START + 404) +#define FTR_HANIWA101_EAST (HANIWA_START + 405) +#define FTR_HANIWA101_NORTH (HANIWA_START + 406) +#define FTR_HANIWA101_WEST (HANIWA_START + 407) +#define FTR_HANIWA102_SOUTH (HANIWA_START + 408) +#define FTR_HANIWA102_EAST (HANIWA_START + 409) +#define FTR_HANIWA102_NORTH (HANIWA_START + 410) +#define FTR_HANIWA102_WEST (HANIWA_START + 411) +#define FTR_HANIWA103_SOUTH (HANIWA_START + 412) +#define FTR_HANIWA103_EAST (HANIWA_START + 413) +#define FTR_HANIWA103_NORTH (HANIWA_START + 414) +#define FTR_HANIWA103_WEST (HANIWA_START + 415) +#define FTR_HANIWA104_SOUTH (HANIWA_START + 416) +#define FTR_HANIWA104_EAST (HANIWA_START + 417) +#define FTR_HANIWA104_NORTH (HANIWA_START + 418) +#define FTR_HANIWA104_WEST (HANIWA_START + 419) +#define FTR_HANIWA105_SOUTH (HANIWA_START + 420) +#define FTR_HANIWA105_EAST (HANIWA_START + 421) +#define FTR_HANIWA105_NORTH (HANIWA_START + 422) +#define FTR_HANIWA105_WEST (HANIWA_START + 423) +#define FTR_HANIWA106_SOUTH (HANIWA_START + 424) +#define FTR_HANIWA106_EAST (HANIWA_START + 425) +#define FTR_HANIWA106_NORTH (HANIWA_START + 426) +#define FTR_HANIWA106_WEST (HANIWA_START + 427) +#define FTR_HANIWA107_SOUTH (HANIWA_START + 428) +#define FTR_HANIWA107_EAST (HANIWA_START + 429) +#define FTR_HANIWA107_NORTH (HANIWA_START + 430) +#define FTR_HANIWA107_WEST (HANIWA_START + 431) +#define FTR_HANIWA108_SOUTH (HANIWA_START + 432) +#define FTR_HANIWA108_EAST (HANIWA_START + 433) +#define FTR_HANIWA108_NORTH (HANIWA_START + 434) +#define FTR_HANIWA108_WEST (HANIWA_START + 435) +#define FTR_HANIWA109_SOUTH (HANIWA_START + 436) +#define FTR_HANIWA109_EAST (HANIWA_START + 437) +#define FTR_HANIWA109_NORTH (HANIWA_START + 438) +#define FTR_HANIWA109_WEST (HANIWA_START + 439) +#define FTR_HANIWA110_SOUTH (HANIWA_START + 440) +#define FTR_HANIWA110_EAST (HANIWA_START + 441) +#define FTR_HANIWA110_NORTH (HANIWA_START + 442) +#define FTR_HANIWA110_WEST (HANIWA_START + 443) +#define FTR_HANIWA111_SOUTH (HANIWA_START + 444) +#define FTR_HANIWA111_EAST (HANIWA_START + 445) +#define FTR_HANIWA111_NORTH (HANIWA_START + 446) +#define FTR_HANIWA111_WEST (HANIWA_START + 447) +#define FTR_HANIWA112_SOUTH (HANIWA_START + 448) +#define FTR_HANIWA112_EAST (HANIWA_START + 449) +#define FTR_HANIWA112_NORTH (HANIWA_START + 450) +#define FTR_HANIWA112_WEST (HANIWA_START + 451) +#define FTR_HANIWA113_SOUTH (HANIWA_START + 452) +#define FTR_HANIWA113_EAST (HANIWA_START + 453) +#define FTR_HANIWA113_NORTH (HANIWA_START + 454) +#define FTR_HANIWA113_WEST (HANIWA_START + 455) +#define FTR_HANIWA114_SOUTH (HANIWA_START + 456) +#define FTR_HANIWA114_EAST (HANIWA_START + 457) +#define FTR_HANIWA114_NORTH (HANIWA_START + 458) +#define FTR_HANIWA114_WEST (HANIWA_START + 459) +#define FTR_HANIWA115_SOUTH (HANIWA_START + 460) +#define FTR_HANIWA115_EAST (HANIWA_START + 461) +#define FTR_HANIWA115_NORTH (HANIWA_START + 462) +#define FTR_HANIWA115_WEST (HANIWA_START + 463) +#define FTR_HANIWA116_SOUTH (HANIWA_START + 464) +#define FTR_HANIWA116_EAST (HANIWA_START + 465) +#define FTR_HANIWA116_NORTH (HANIWA_START + 466) +#define FTR_HANIWA116_WEST (HANIWA_START + 467) +#define FTR_HANIWA117_SOUTH (HANIWA_START + 468) +#define FTR_HANIWA117_EAST (HANIWA_START + 469) +#define FTR_HANIWA117_NORTH (HANIWA_START + 470) +#define FTR_HANIWA117_WEST (HANIWA_START + 471) +#define FTR_HANIWA118_SOUTH (HANIWA_START + 472) +#define FTR_HANIWA118_EAST (HANIWA_START + 473) +#define FTR_HANIWA118_NORTH (HANIWA_START + 474) +#define FTR_HANIWA118_WEST (HANIWA_START + 475) +#define FTR_HANIWA119_SOUTH (HANIWA_START + 476) +#define FTR_HANIWA119_EAST (HANIWA_START + 477) +#define FTR_HANIWA119_NORTH (HANIWA_START + 478) +#define FTR_HANIWA119_WEST (HANIWA_START + 479) +#define FTR_HANIWA120_SOUTH (HANIWA_START + 480) +#define FTR_HANIWA120_EAST (HANIWA_START + 481) +#define FTR_HANIWA120_NORTH (HANIWA_START + 482) +#define FTR_HANIWA120_WEST (HANIWA_START + 483) +#define FTR_HANIWA121_SOUTH (HANIWA_START + 484) +#define FTR_HANIWA121_EAST (HANIWA_START + 485) +#define FTR_HANIWA121_NORTH (HANIWA_START + 486) +#define FTR_HANIWA121_WEST (HANIWA_START + 487) +#define FTR_HANIWA122_SOUTH (HANIWA_START + 488) +#define FTR_HANIWA122_EAST (HANIWA_START + 489) +#define FTR_HANIWA122_NORTH (HANIWA_START + 490) +#define FTR_HANIWA122_WEST (HANIWA_START + 491) +#define FTR_HANIWA123_SOUTH (HANIWA_START + 492) +#define FTR_HANIWA123_EAST (HANIWA_START + 493) +#define FTR_HANIWA123_NORTH (HANIWA_START + 494) +#define FTR_HANIWA123_WEST (HANIWA_START + 495) +#define FTR_HANIWA124_SOUTH (HANIWA_START + 496) +#define FTR_HANIWA124_EAST (HANIWA_START + 497) +#define FTR_HANIWA124_NORTH (HANIWA_START + 498) +#define FTR_HANIWA124_WEST (HANIWA_START + 499) +#define FTR_HANIWA125_SOUTH (HANIWA_START + 500) +#define FTR_HANIWA125_EAST (HANIWA_START + 501) +#define FTR_HANIWA125_NORTH (HANIWA_START + 502) +#define FTR_HANIWA125_WEST (HANIWA_START + 503) +#define FTR_HANIWA126_SOUTH (HANIWA_START + 504) +#define FTR_HANIWA126_EAST (HANIWA_START + 505) +#define FTR_HANIWA126_NORTH (HANIWA_START + 506) +#define FTR_HANIWA126_WEST (HANIWA_START + 507) +#define HANIWA_END (HANIWA_START + 507) #define FTR_CLOTH_START 0x17AC #define FTR_CLOTH_MANNIQUIN000_SOUTH FTR_CLOTH_START @@ -783,18 +1290,46 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITM_SHOVEL 0x2202 #define ITM_ROD 0x2203 #define ITM_UMBRELLA_START (ITM_TOOL_START + 4) -#define ITM_GELATO_UMBRELLA 0x2204 -#define ITM_DAFFODIL_PARASOL 0x2205 -// TODO: other umbrellas -#define ITM_FLAME_UMBRELLA 0x2223 -#define ITM_MY_ORG_UMBRELLA0 0x2224 -#define ITM_MY_ORG_UMBRELLA1 0x2225 -#define ITM_MY_ORG_UMBRELLA2 0x2226 -#define ITM_MY_ORG_UMBRELLA3 0x2227 -#define ITM_MY_ORG_UMBRELLA4 0x2228 -#define ITM_MY_ORG_UMBRELLA5 0x2229 -#define ITM_MY_ORG_UMBRELLA6 0x222A -#define ITM_MY_ORG_UMBRELLA7 0x222B +#define ITM_UMBRELLA00 (ITM_TOOL_START + 4) +#define ITM_UMBRELLA01 (ITM_TOOL_START + 5) +#define ITM_UMBRELLA02 (ITM_TOOL_START + 6) +#define ITM_UMBRELLA03 (ITM_TOOL_START + 7) +#define ITM_UMBRELLA04 (ITM_TOOL_START + 8) +#define ITM_UMBRELLA05 (ITM_TOOL_START + 9) +#define ITM_UMBRELLA06 (ITM_TOOL_START + 10) +#define ITM_UMBRELLA07 (ITM_TOOL_START + 11) +#define ITM_UMBRELLA08 (ITM_TOOL_START + 12) +#define ITM_UMBRELLA09 (ITM_TOOL_START + 13) +#define ITM_UMBRELLA10 (ITM_TOOL_START + 14) +#define ITM_UMBRELLA11 (ITM_TOOL_START + 15) +#define ITM_UMBRELLA12 (ITM_TOOL_START + 16) +#define ITM_UMBRELLA13 (ITM_TOOL_START + 17) +#define ITM_UMBRELLA14 (ITM_TOOL_START + 18) +#define ITM_UMBRELLA15 (ITM_TOOL_START + 19) +#define ITM_UMBRELLA16 (ITM_TOOL_START + 20) +#define ITM_UMBRELLA17 (ITM_TOOL_START + 21) +#define ITM_UMBRELLA18 (ITM_TOOL_START + 22) +#define ITM_UMBRELLA19 (ITM_TOOL_START + 23) +#define ITM_UMBRELLA20 (ITM_TOOL_START + 24) +#define ITM_UMBRELLA21 (ITM_TOOL_START + 25) +#define ITM_UMBRELLA22 (ITM_TOOL_START + 26) +#define ITM_UMBRELLA23 (ITM_TOOL_START + 27) +#define ITM_UMBRELLA24 (ITM_TOOL_START + 28) +#define ITM_UMBRELLA25 (ITM_TOOL_START + 29) +#define ITM_UMBRELLA26 (ITM_TOOL_START + 30) +#define ITM_UMBRELLA27 (ITM_TOOL_START + 31) +#define ITM_UMBRELLA28 (ITM_TOOL_START + 32) +#define ITM_UMBRELLA29 (ITM_TOOL_START + 33) +#define ITM_UMBRELLA30 (ITM_TOOL_START + 34) +#define ITM_UMBRELLA31 (ITM_TOOL_START + 35) +#define ITM_MY_ORG_UMBRELLA0 (ITM_TOOL_START + 36) +#define ITM_MY_ORG_UMBRELLA1 (ITM_TOOL_START + 37) +#define ITM_MY_ORG_UMBRELLA2 (ITM_TOOL_START + 38) +#define ITM_MY_ORG_UMBRELLA3 (ITM_TOOL_START + 39) +#define ITM_MY_ORG_UMBRELLA4 (ITM_TOOL_START + 40) +#define ITM_MY_ORG_UMBRELLA5 (ITM_TOOL_START + 41) +#define ITM_MY_ORG_UMBRELLA6 (ITM_TOOL_START + 42) +#define ITM_MY_ORG_UMBRELLA7 (ITM_TOOL_START + 43) #define ITM_UMBRELLA_END (ITM_TOOL_START + 44) #define ITM_SICKLE 0x222C #define ITM_RED_PAINT 0x222D diff --git a/include/m_player_lib.h b/include/m_player_lib.h index edba9e7e..2a6d528f 100644 --- a/include/m_player_lib.h +++ b/include/m_player_lib.h @@ -62,7 +62,7 @@ extern void mPlib_Object_Exchange_keep_new_PlayerMdl(GAME_PLAY* play); extern void mPlib_Object_Exchange_keep_new_PlayerTex(GAME_PLAY* play, int bank_id, int base_idx); extern void mPlib_Object_Exchange_keep_new_PlayerFaceTex(GAME_PLAY* play); extern void mPlib_Object_Exchange_keep_new_PlayerFacePallet(GAME_PLAY* play, int bank_id, int base_idx); -extern void mPlib_request_main_give_type1(GAME_PLAY* play, mActor_name_t item, int mode, int present, int on_surface); +extern void mPlib_request_main_give_type1(GAME* game, mActor_name_t item, int mode, int present, int on_surface); #define GET_PLAYER_ACTOR(play) get_player_actor_withoutCheck(play) #define GET_PLAYER_ACTOR_NOW() get_player_actor_withoutCheck((GAME_PLAY*)gamePT) diff --git a/include/m_private.h b/include/m_private.h index 151d68e6..f85ddf45 100644 --- a/include/m_private.h +++ b/include/m_private.h @@ -25,6 +25,7 @@ extern "C" { #define mPr_FLAG_POSTOFFICE_GIFT3 (1 << 5) // 999,999,999 Bells #define mPr_FLAG_MUSEUM_COMP_HANDBILL_SCHEDULED (1 << 6) // player is scheduled to receive completion letter & reward #define mPr_FLAG_MUSEUM_COMP_HANDBILL_RECEIVED (1 << 7) // player has received the completion letter & reward +#define mPr_FLAG_UPDATE_OUTLOOK_PENDING (1 << 9) // player bought a new coat of roof paint to be repainted #define mPr_MONEY_POWER_MIN -80 diff --git a/include/m_shop.h b/include/m_shop.h index c34591af..5605202d 100644 --- a/include/m_shop.h +++ b/include/m_shop.h @@ -28,6 +28,23 @@ extern "C" { #define mSP_SUPER_SUM 90000 // sales sum for upgrading to Nookway #define mSP_DSUPER_SUM 240000 // sales sum for upgrading to Nookington's +enum { + mSP_ROOF_COLOR_RED, + mSP_ROOF_COLOR_ORANGE, + mSP_ROOF_COLOR_YELLOW, + mSP_ROOF_COLOR_PALE_GREEN, + mSP_ROOF_COLOR_GREEN, + mSP_ROOF_COLOR_SKY_BLUE, + mSP_ROOF_COLOR_BLUE, + mSP_ROOF_COLOR_PURPLE, + mSP_ROOF_COLOR_PINK, + mSP_ROOF_COLOR_BLACK, + mSP_ROOF_COLOR_WHITE, + mSP_ROOF_COLOR_BROWN, + + mSP_ROOF_COLOR_NUM +}; + /* item list groups */ enum { mSP_LIST_A, /* A priority list */ diff --git a/src/ac_ev_ghost.c b/src/ac_ev_ghost.c index c3966a12..6930e3e3 100644 --- a/src/ac_ev_ghost.c +++ b/src/ac_ev_ghost.c @@ -2,6 +2,305 @@ #include "m_event.h" #include "m_common_data.h" +#include "m_msg.h" +#include "m_string.h" +#include "libultra/libultra.h" +#include "m_player_lib.h" +#include "m_item_name.h" +#include "m_house.h" + +enum { + aEGH_TALK_END_WAIT, + aEGH_TALK_GIVE_ME_WAIT, + aEGH_TALK_SELECT_WAIT, + aEGH_TALK_SELECT_ROOF, + aEGH_TALK_GIVE_YOU_WAIT, + aEGH_TALK_CLEAR_GRASS, + + aEGH_TALK_NUM +}; + +enum { + aEGH_THINK_NORMAL_WAIT, + aEGH_THINK_IRAI, + aEGH_THINK_IRAI_AF, + aEGH_THINK_BYE, + aEGH_THINK_WELCOM, + aEGH_THINK_BYEBYE, + aEGH_THINK_SPEAK, // ? + + aEGH_THINK_NUM +}; + +enum { + aEGH_THINK_INIT_NONE, + aEGH_THINK_INIT_NORMAL_WAIT, + aEGH_THINK_INIT_IRAI, + aEGH_THINK_INIT_IRAI_AF, + aEGH_THINK_INIT_BYE, + aEGH_THINK_INIT_WELCOM, + aEGH_THINK_INIT_BYEBYE, + + aEGH_THINK_INIT_NUM +}; + +enum { + aEGH_THINK_PROC_NONE, + aEGH_THINK_PROC_IRAI, + aEGH_THINK_PROC_BYE, + aEGH_THINK_PROC_BYEBYE, + aEGH_THINK_PROC_SPEAK_BYEBYE, + + aEGH_THINK_PROC_NUM +}; + +enum { + aEGH_TALK_REQUEST_NONE, + aEGH_TALK_REQUEST_NORM, + aEGH_TALK_REQUEST_FORCE, + + aEGH_TALK_REQUEST_NUM +}; + +typedef struct ghost_think_setup_s { + u8 think_proc; + u8 think_init_proc; + u8 talk_request_proc; + u8 talk_act; + u8 talk_after_act; +} aEGH_setup_c; + +static void aEGH_actor_ct(ACTOR*, GAME*); +static void aEGH_actor_dt(ACTOR*, GAME*); +static void aEGH_actor_move(ACTOR*, GAME*); +static void aEGH_actor_draw(ACTOR*, GAME*); +static void aEGH_actor_init(ACTOR*, GAME*); +static void aEGH_actor_save(ACTOR*, GAME*); + +ACTOR_PROFILE Ev_Ghost_Profile = { + mAc_PROFILE_EV_GHOST, + ACTOR_PART_NPC, + ACTOR_STATE_NONE, + SP_NPC_EV_GHOST, + ACTOR_OBJ_BANK_KEEP, + sizeof(EV_GHOST_ACTOR), + &aEGH_actor_ct, + &aEGH_actor_dt, + &aEGH_actor_init, + mActor_NONE_PROC1, + &aEGH_actor_save +}; + +static int aEGH_talk_init(ACTOR*, GAME*); +static int aEGH_talk_end_chk(ACTOR*, GAME*); + +static int aEGH_change_talk_proc(EV_GHOST_ACTOR* ghost, u8 talk_act); +static void aEGH_setup_think_proc(EV_GHOST_ACTOR* ghost, GAME_PLAY* play, u8 think_act); +static void aEGH_schedule_proc(NPC_ACTOR* actorx, GAME_PLAY* play, int sched_type); + +static int aEGH_bitset_func(u16 bit); +static int aEGH_bitclr_func(u16 bit); +static u16 aEGH_bitcheck_func(u16 bit); + +static void aEGH_byebye_check(EV_GHOST_ACTOR* ghost, GAME_PLAY* play); + +static void aEGH_actor_ct(ACTOR* actorx, GAME* game) { + static aNPC_ct_data_c ct_data = { + &aEGH_actor_move, + &aEGH_actor_draw, + 5, + (aNPC_TALK_REQUEST_PROC)&none_proc1, + &aEGH_talk_init, + &aEGH_talk_end_chk, + 0 + }; + + mEv_gst_c* ghost_save = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + + if ((*Common_Get(clip).npc_clip->birth_check_proc)(actorx, game) == TRUE) { + ghost->npc_class.schedule.schedule_proc = &aEGH_schedule_proc; + (*Common_Get(clip).npc_clip->ct_proc)(actorx, game, &ct_data); + ghost->npc_class.palActorIgnoreTimer = -1; + ghost->_9A7 = 0; + ghost->melody_inst = 0; + ghost->npc_class.talk_info.melody_inst = 0; + + if (ghost_save == NULL) { + mEv_reserve_save_area(mEv_EVENT_GHOST, 54); + ghost_save = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + + if (ghost_save != NULL) { + ghost_save->flags = 0; + ghost_save->okoruhito_str_no = RANDOM_F(32.0f); + mTM_set_renew_time(&ghost_save->renew_time, rtc_time); + } + } + else { + if ( + rtc_time->year != ghost_save->renew_time.year || + rtc_time->month != ghost_save->renew_time.month || + rtc_time->day != ghost_save->renew_time.day + ) { + ghost_save->flags = 0; + ghost_save->okoruhito_str_no = RANDOM_F(32.0f); + mTM_set_renew_time(&ghost_save->renew_time, rtc_time); + } + + if ((ghost_save->flags & mEv_GHOST_FLAG_HITODAMA_EXIST) != 0) { + Actor_delete(actorx); + } + } + + if (Common_Get(player_no) == mPr_FOREIGNER) { + Actor_delete(actorx); + } + + ghost->_9AA = 0; + ghost->npc_class.talk_info.default_animation = 126; + ghost->_9AC = 0; + + if (aEGH_bitcheck_func(aEGH_BIT_FOUND_GHOST) != FALSE) { + ghost->alpha = 140; + } + else { + if (mFI_GetItemNumField_BCT(GRASS_A, GRASS_C) < aEGH_MINIMUM_GRASS_COUNT) { + Actor_delete(actorx); + } + + ghost->alpha = 0; + } + } +} + +static void aEGH_actor_save(ACTOR* actorx, GAME* game) { + mNpc_RenewalSetNpc(actorx); +} + +static void aEGH_actor_dt(ACTOR* actorx, GAME* game) { + mEv_actor_dying_message(mEv_EVENT_GHOST, actorx); + (*Common_Get(clip).npc_clip->dt_proc)(actorx, game); +} + +static void aEGH_actor_init(ACTOR* actorx, GAME* game) { + (*Common_Get(clip).npc_clip->init_proc)(actorx, game); +} + +static int aEGH_set_request_act(EV_GHOST_ACTOR* ghost, u8 priority, u8 idx, u8 type, u16 arg0, u16 arg1, u16 arg2) { + int res = FALSE; + + if (priority >= ghost->npc_class.request.act_priority) { + u16 args[6]; + + bzero(args, sizeof(args)); + args[0] = arg0; + args[2] = arg1; + args[3] = arg2; + ghost->npc_class.request.act_priority = priority; + ghost->npc_class.request.act_idx = idx; + ghost->npc_class.request.act_type = type; + mem_copy((u8*)ghost->npc_class.request.act_args, (u8*)args, sizeof(args)); + res = TRUE; + } + + return res; +} + +static void aEGH_actor_move(ACTOR* actorx, GAME* game) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + int step; + int alpha; + int target_alpha; + int delta_alpha; + + if (aEGH_bitcheck_func(aEGH_BIT_FOUND_GHOST) != FALSE) { + actorx->actor_specific = 1; + } + else { + actorx->actor_specific = 0; + } + + (*Common_Get(clip).npc_clip->move_proc)(actorx, game); + aEGH_byebye_check(ghost, play); + + if (ghost->npc_class.schedule.type == aNPC_SCHEDULE_TYPE_WALK_WANDER && ghost->think_act != aEGH_THINK_SPEAK) { + ghost->_9AC = 1; + (*Common_Get(clip).npc_clip->chg_schedule_proc)((NPC_ACTOR*)ghost, play, aNPC_SCHEDULE_TYPE_SPECIAL); + actorx->status_data.weight = 255; + } + + alpha = ghost->alpha; + + if (aEGH_bitcheck_func(aEGH_BIT_FOUND_GHOST) != FALSE) { + step = 1; + + if (mDemo_Get_talk_actor() == actorx) { + ghost->npc_class.draw._5BE = 0; + ghost->npc_class.draw.animation_speed = 0.5f; + target_alpha = 190; + } + else { + if (actorx->speed > 0.1f) { + target_alpha = 80; + } + else { + target_alpha = 140; + } + + if (alpha <= 140) { + step = 1; + } + + ghost->npc_class.draw._5BE = 1; + ghost->npc_class.draw.animation_speed = 0.25f; + } + + delta_alpha = alpha - target_alpha; + if (ABS(delta_alpha) < step) { + alpha = target_alpha; + } + else { + if (delta_alpha < 0) { + alpha += step; + } + else { + alpha -= step; + } + } + } + else if (ghost->bye_bye_transparency_delay_timer != 0) { + ghost->bye_bye_transparency_delay_timer--; + } + else { + alpha -= 4; + + if (alpha < 0) { + alpha = 0; + } + } + + ghost->alpha = alpha; + actorx->shape_info.draw_shadow = FALSE; +} + +static void aEGH_actor_draw(ACTOR* actorx, GAME* game) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + GRAPH* graph = game->graph; + Gfx* gfx; + + OPEN_DISP(graph); + gfx = NOW_POLY_XLU_DISP; + + gDPPipeSync(gfx++); + gDPSetEnvColor(gfx++, 255, 255, 255, ghost->alpha); + + SET_POLY_XLU_DISP(gfx); + CLOSE_DISP(graph); + + (*Common_Get(clip).npc_clip->draw_proc)(actorx, game); +} #include "../src/ac_ev_ghost_talk.c_inc" #include "../src/ac_ev_ghost_schedule.c_inc" diff --git a/src/ac_ev_ghost_schedule.c_inc b/src/ac_ev_ghost_schedule.c_inc index e69de29b..0423ba3a 100644 --- a/src/ac_ev_ghost_schedule.c_inc +++ b/src/ac_ev_ghost_schedule.c_inc @@ -0,0 +1,376 @@ +static void aEGH_look_player(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + if (ghost->npc_class.action.step == aNPC_ACTION_END_STEP) { + u8 action = 4; + s16 player_y = ghost->npc_class.actor_class.player_angle_y; + s16 rot_y = ghost->npc_class.actor_class.shape_info.rotation.y; + s16 diff = player_y - rot_y; + + if (ABS(diff) < DEG2SHORT_ANGLE(67.5f)) { + action = 0; + } + + aEGH_set_request_act(ghost, 4, action, 2, 1, 0, 0); + } +} + +static int aEGH_bitset_func(u16 bit) { + u32 player_no = Common_Get(player_no); + mEv_gst_c* ghost_save = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + mEv_gst_common_c* ghost_common = (mEv_gst_common_c*)mEv_get_common_area(mEv_EVENT_GHOST, 55); + + if (player_no == mPr_FOREIGNER) { + if (ghost_common != NULL) { + ghost_common->flags |= bit; + return TRUE; + } + } + else if (ghost_save != NULL) { + ghost_save->flags |= (u16)(bit << player_no); + return TRUE; + } + + return FALSE; +} + +static int aEGH_bitclr_func(u16 bit) { + u32 player_no = Common_Get(player_no); + mEv_gst_c* ghost_save = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + mEv_gst_common_c* ghost_common = (mEv_gst_common_c*)mEv_get_common_area(mEv_EVENT_GHOST, 55); + + if (player_no == mPr_FOREIGNER) { + if (ghost_common != NULL) { + ghost_common->flags &= ~bit; + return TRUE; + } + } + else if (ghost_save != NULL) { + ghost_save->flags &= ~(u16)(bit << player_no); + return TRUE; + } + + return FALSE; +} + +static u16 aEGH_bitcheck_func(u16 bit) { + u32 player_no = Common_Get(player_no); + mEv_gst_c* ghost_save = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + mEv_gst_common_c* ghost_common = (mEv_gst_common_c*)mEv_get_common_area(mEv_EVENT_GHOST, 55); + + if (player_no == mPr_FOREIGNER) { + if (ghost_common != NULL) { + return ghost_common->flags & bit; + } + } + else if (ghost_save != NULL) { + return (u16)(bit << player_no) & ghost_save->flags; + } + + return FALSE; +} + +static int aEGH_equal_block(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + int bx; + int bz; + + mFI_Wpos2BlockNum(&bx, &bz, GET_PLAYER_ACTOR(play)->actor_class.world.position); + return bx == ghost->npc_class.actor_class.block_x && bz == ghost->npc_class.actor_class.block_z; +} + +static int aEGH_time_over() { + return Common_Get(time.now_sec) > (4 * mTM_SECONDS_IN_HOUR); +} + +static void aEGH_byebye_check(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + ACTOR* actorx = (ACTOR*)ghost; + + if ( + mDemo_Check(mDemo_TYPE_TALK, actorx) == FALSE && + mDemo_Check(mDemo_TYPE_SPEAK, actorx) == FALSE && + aEGH_time_over() != FALSE + ) { + if (aEGH_equal_block(ghost, play)) { + switch (ghost->think_act) { + case aEGH_THINK_SPEAK: + { + aEGH_setup_think_proc(ghost, play, aEGH_THINK_BYEBYE); + ghost->msg_no = 0x2EDD; + ghost->npc_class.actor_class.talk_distance = 1000.0f; + ghost->_9AA = 1; + break; + } + + case aEGH_THINK_NORMAL_WAIT: + case aEGH_THINK_IRAI_AF: + case aEGH_THINK_BYE: + case aEGH_THINK_WELCOM: + { + Actor_delete((ACTOR*)ghost); + break; + } + } + } + else { + aEGH_setup_think_proc(ghost, play, aEGH_THINK_IRAI); + } + } +} + +static void aEGH_irai(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + if (ghost->npc_class.actor_class.player_distance_xz > 220.0f) { + aEGH_setup_think_proc(ghost, play, aEGH_THINK_BYE); + } +} + +static void aEGH_bye(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + if (ghost->npc_class.actor_class.player_distance_xz < 200.0f) { + aEGH_setup_think_proc(ghost, play, aEGH_THINK_WELCOM); + } +} + +static void aEGH_byebye(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + if (ghost->alpha == 0) { + Actor_delete((ACTOR*)ghost); + } + else { + if (ghost->bye_bye_timer != 0) { + ghost->bye_bye_timer--; + + if (ghost->bye_bye_timer == 0) { + sAdo_SysTrgStart(0x16C); + } + } + else { + if (ghost->bye_bye_angle < 30000) { + ghost->bye_bye_angle += 60; + } + + ghost->npc_class.actor_class.shape_info.rotation.y += ghost->bye_bye_angle; + ghost->npc_class.actor_class.world.angle.y = ghost->npc_class.actor_class.shape_info.rotation.y; + ghost->npc_class.movement.mv_angl = ghost->npc_class.actor_class.world.angle.y; + ghost->npc_class.movement.mv_add_angl = 0; + } + + if (ghost->bye_bye_scale_timer != 0) { + ghost->bye_bye_scale_timer--; + } + else { + ghost->npc_class.actor_class.scale.x += -0.00004f; + ghost->npc_class.actor_class.scale.z = ghost->npc_class.actor_class.scale.x; + } + } +} + +static void aEGH_speak_byebye(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + ACTOR* actorx = (ACTOR*)ghost; + + if ( + mDemo_Check(mDemo_TYPE_TALK, actorx) == FALSE && + mDemo_Check(mDemo_TYPE_SPEAK, actorx) == FALSE && + aEGH_equal_block(ghost, play) == FALSE + ) { + aEGH_setup_think_proc(ghost, play, aEGH_THINK_IRAI); + } +} + +static void aEGH_think_main_proc(NPC_ACTOR* actorx, GAME_PLAY* play) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + + (*ghost->think_proc)(ghost, play); + aEGH_look_player(ghost, play); +} + +static void aEGH_think_init_proc(NPC_ACTOR* actorx, GAME_PLAY* play) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + u8 think_act; + + if (ghost->_9AC) { + ghost->_9AC = FALSE; + } + else { + if (aEGH_bitcheck_func(aEGH_BIT_FOUND_GHOST)) { + ghost->alpha = 140; + think_act = aEGH_THINK_SPEAK; + } + else { + ghost->alpha = 0; + think_act = aEGH_THINK_IRAI_AF; + } + + actorx->actor_class.status_data.weight = 255; + actorx->condition_info.hide_request = FALSE; + aEGH_setup_think_proc(ghost, play, think_act); + actorx->condition_info.demo_flg = aNPC_COND_DEMO_SKIP_FOOTSTEPS_VFX | + aNPC_COND_DEMO_SKIP_FEEL_CHECK | + aNPC_COND_DEMO_SKIP_FOOTSTEPS | + aNPC_COND_DEMO_SKIP_ENTRANCE_CHECK | + aNPC_COND_DEMO_SKIP_HEAD_LOOKAT; + } +} + +static void aEGH_normal_wait_init(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + (*Common_Get(clip).npc_clip->animation_init_proc)((ACTOR*)ghost, 126, FALSE); + ghost->npc_class.draw.main_animation.keyframe.frame_control.mode = cKF_FRAMECONTROL_REPEAT; + ghost->npc_class.action.idx = 0; + aEGH_set_request_act(ghost, 4, 0, 0, 0, 0, 0); +} + +static void aEGH_irai_init(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + ghost->npc_class.actor_class.talk_distance = 80.0f; + aEGH_normal_wait_init(ghost, play); + ghost->msg_no = 0x2EE2; +} + +static void aEGH_irai_af_init(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + ghost->npc_class.actor_class.talk_distance = 55.0f; + ghost->msg_no = 0x2EE7; + (*Common_Get(clip).npc_clip->chg_schedule_proc)((NPC_ACTOR*)ghost, play, 5); + ghost->npc_class.actor_class.status_data.weight = 80; +} + +static void aEGH_bye_init(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + ghost->npc_class.actor_class.talk_distance = 280.0f; + aEGH_normal_wait_init(ghost, play); + ghost->msg_no = 0x2ED8; +} + +static void aEGH_welcom_init(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + ghost->npc_class.actor_class.talk_distance = 200.0f; + aEGH_normal_wait_init(ghost, play); + ghost->msg_no = 0x2ED3; +} + +static void aEGH_byebye_init(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + aEGH_bitclr_func(aEGH_BIT_FOUND_GHOST); + ghost->bye_bye_angle = -1000; + ghost->bye_bye_timer = 25; + ghost->bye_bye_scale_timer = 48; + ghost->bye_bye_transparency_delay_timer = 43; + aEGH_normal_wait_init(ghost, play); + ghost->npc_class.head.lock_flag = TRUE; +} + +static aEGH_setup_c dt_tbl[aEGH_THINK_NUM] = { + { + aEGH_THINK_PROC_BYE, + aEGH_THINK_INIT_NORMAL_WAIT, + aEGH_TALK_REQUEST_NONE, + aEGH_TALK_END_WAIT, + aEGH_THINK_NORMAL_WAIT + }, + { + aEGH_THINK_PROC_BYEBYE, + aEGH_THINK_INIT_BYEBYE, + aEGH_TALK_REQUEST_NONE, + aEGH_TALK_END_WAIT, + aEGH_THINK_IRAI + }, + + { + aEGH_THINK_PROC_NONE, + aEGH_THINK_INIT_WELCOM, + aEGH_TALK_REQUEST_FORCE, + aEGH_TALK_END_WAIT, + aEGH_THINK_WELCOM + }, + + { + aEGH_THINK_PROC_BYE, + aEGH_THINK_INIT_BYE, + aEGH_TALK_REQUEST_FORCE, + aEGH_TALK_GIVE_ME_WAIT, + aEGH_THINK_NORMAL_WAIT + }, + + { + aEGH_THINK_PROC_IRAI, + aEGH_THINK_INIT_IRAI, + aEGH_TALK_REQUEST_FORCE, + aEGH_TALK_SELECT_WAIT, + aEGH_THINK_SPEAK + }, + + { + aEGH_THINK_PROC_SPEAK_BYEBYE, + aEGH_THINK_INIT_NORMAL_WAIT, + aEGH_TALK_REQUEST_FORCE, + aEGH_TALK_SELECT_ROOF, + aEGH_THINK_IRAI + }, + + { + aEGH_THINK_PROC_NONE, + aEGH_THINK_INIT_IRAI_AF, + aEGH_TALK_REQUEST_NORM, + aEGH_TALK_END_WAIT, + aEGH_THINK_SPEAK + } +}; + +static aEGH_PROC proc_table[aEGH_THINK_PROC_NUM] = { + (aEGH_PROC)&none_proc1, + &aEGH_irai, + &aEGH_bye, + &aEGH_byebye, + &aEGH_speak_byebye +}; + +static aEGH_PROC init_table[aEGH_THINK_INIT_NUM] = { + (aEGH_PROC)&none_proc1, + &aEGH_normal_wait_init, + &aEGH_irai_init, + &aEGH_irai_af_init, + &aEGH_bye_init, + &aEGH_welcom_init, + &aEGH_byebye_init +}; + +static void aEGH_setup_think_proc(EV_GHOST_ACTOR* ghost, GAME_PLAY* play, u8 think_act) { + static aNPC_TALK_REQUEST_PROC talk_request_table[aEGH_TALK_REQUEST_NUM] = { + (aNPC_TALK_REQUEST_PROC)&none_proc1, + &aEGH_norm_talk_request, + &aEGH_force_talk_request + }; + + aEGH_setup_c* data = &dt_tbl[think_act]; + + ghost->think_act = think_act; + ghost->think_proc = proc_table[data->think_proc]; + ghost->npc_class.talk_info.talk_request_proc = talk_request_table[data->talk_request_proc]; + ghost->talk_act = data->talk_act; + ghost->after_talk_think_act = data->talk_after_act; + (*init_table[data->think_init_proc])(ghost, play); + ghost->_9A7 = TRUE; +} + +static void aEGH_think_proc(NPC_ACTOR* actorx, GAME_PLAY* play, int think_type) { + switch (think_type) { + case 0: + aEGH_think_init_proc(actorx, play); + break; + case 1: + aEGH_think_main_proc(actorx, play); + break; + } +} + +static void aEGH_schedule_init_proc(NPC_ACTOR* actorx, GAME_PLAY* play) { + actorx->think.think_proc = &aEGH_think_proc; + (*Common_Get(clip).npc_clip->think_proc)(actorx, play, aNPC_THINK_SPECIAL, 0); +} + +static void aEGH_schedule_main_proc(NPC_ACTOR* actorx, GAME_PLAY* play) { + if ((*Common_Get(clip).npc_clip->think_proc)(actorx, play, -1, 1) == FALSE) { + (*Common_Get(clip).npc_clip->think_proc)(actorx, play, -1, 2); + } +} + +static void aEGH_schedule_proc(NPC_ACTOR* actorx, GAME_PLAY* play, int sched_type) { + switch (sched_type) { + case 0: + aEGH_schedule_init_proc(actorx, play); + break; + case 1: + aEGH_schedule_main_proc(actorx, play); + break; + } +} diff --git a/src/ac_ev_ghost_talk.c_inc b/src/ac_ev_ghost_talk.c_inc index e69de29b..6d84157d 100644 --- a/src/ac_ev_ghost_talk.c_inc +++ b/src/ac_ev_ghost_talk.c_inc @@ -0,0 +1,625 @@ +static int aEGH_hitodama_num() { + int i; + int num; + Private_c* priv = Common_Get(now_private); + + for (i = 0, num = 0; i < mEv_GHOST_HITODAMA_NUM; i++) { + int n = mPr_GetPossessionItemSumWithCond(priv, ITM_SPIRIT0 + i, mPr_ITEM_COND_NORMAL); + + num += n * (i + 1); + } + + return num; +} + +static void aEGH_okoruhito() { + static u8 pf_string[mMsg_FREE_STRING_LEN]; + mEv_gst_c* ghost_ev = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + + mString_Load_StringFromRom(pf_string, sizeof(pf_string), 0x62E + ghost_ev->okoruhito_str_no); + mMsg_Set_item_str(mMsg_Get_base_window_p(), mMsg_FREE_STR1, pf_string, sizeof(pf_string)); +} + +static void aEGH_delete_hitodama() { + int i; + int num; + Private_c* priv = Common_Get(now_private); + + for (i = 0, num = 0; i < mEv_GHOST_HITODAMA_NUM; i++) { + int idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_SPIRIT0 + i, mPr_ITEM_COND_NORMAL); + + while (idx != -1) { + mPr_SetPossessionItem(Common_Get(now_private), idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_SPIRIT0 + i, mPr_ITEM_COND_NORMAL); + } + } +} + +static mActor_name_t aEGH_get_collect(int selected_idx, mActor_name_t* list) { + while (*list != EMPTY_NO) { + if (mSP_CollectCheck(*list) == FALSE) { + if (selected_idx > 0) { + selected_idx--; + } + else { + return *list; + } + } + + list++; + } + + return EMPTY_NO; +} + +static void aEGH_check_collect_num(int* list_num, int* uncollect_num, mActor_name_t* list) { + *list_num = 0; + *uncollect_num = 0; + + while (*list != EMPTY_NO) { + (*list_num)++; + + if (mSP_CollectCheck(*list) == FALSE) { + (*uncollect_num)++; + } + + list++; + } +} + +extern mActor_name_t ftr_listA[]; +extern mActor_name_t ftr_listB[]; +extern mActor_name_t ftr_listC[]; +extern mActor_name_t ftr_listEvent[]; +extern mActor_name_t ftr_listLottery[]; +extern mActor_name_t carpet_listA[]; +extern mActor_name_t carpet_listB[]; +extern mActor_name_t carpet_listC[]; +extern mActor_name_t carpet_listEvent[]; +extern mActor_name_t wall_listA[]; +extern mActor_name_t wall_listB[]; +extern mActor_name_t wall_listC[]; +extern mActor_name_t wall_listEvent[]; +extern mActor_name_t cloth_listA[]; +extern mActor_name_t cloth_listB[]; +extern mActor_name_t cloth_listC[]; +extern mActor_name_t cloth_listEvent[]; +extern mActor_name_t binsen_listA[]; +extern mActor_name_t binsen_listB[]; +extern mActor_name_t binsen_listC[]; + +static mActor_name_t list_haniwa[HANIWA_NUM + 1] = { + FTR_HANIWA000_SOUTH, + FTR_HANIWA001_SOUTH, + FTR_HANIWA002_SOUTH, + FTR_HANIWA003_SOUTH, + FTR_HANIWA004_SOUTH, + FTR_HANIWA005_SOUTH, + FTR_HANIWA006_SOUTH, + FTR_HANIWA007_SOUTH, + FTR_HANIWA008_SOUTH, + FTR_HANIWA009_SOUTH, + FTR_HANIWA010_SOUTH, + FTR_HANIWA011_SOUTH, + FTR_HANIWA012_SOUTH, + FTR_HANIWA013_SOUTH, + FTR_HANIWA014_SOUTH, + FTR_HANIWA015_SOUTH, + FTR_HANIWA016_SOUTH, + FTR_HANIWA017_SOUTH, + FTR_HANIWA018_SOUTH, + FTR_HANIWA019_SOUTH, + FTR_HANIWA020_SOUTH, + FTR_HANIWA021_SOUTH, + FTR_HANIWA022_SOUTH, + FTR_HANIWA023_SOUTH, + FTR_HANIWA024_SOUTH, + FTR_HANIWA025_SOUTH, + FTR_HANIWA026_SOUTH, + FTR_HANIWA027_SOUTH, + FTR_HANIWA028_SOUTH, + FTR_HANIWA029_SOUTH, + FTR_HANIWA030_SOUTH, + FTR_HANIWA031_SOUTH, + FTR_HANIWA032_SOUTH, + FTR_HANIWA033_SOUTH, + FTR_HANIWA034_SOUTH, + FTR_HANIWA035_SOUTH, + FTR_HANIWA036_SOUTH, + FTR_HANIWA037_SOUTH, + FTR_HANIWA038_SOUTH, + FTR_HANIWA039_SOUTH, + FTR_HANIWA040_SOUTH, + FTR_HANIWA041_SOUTH, + FTR_HANIWA042_SOUTH, + FTR_HANIWA043_SOUTH, + FTR_HANIWA044_SOUTH, + FTR_HANIWA045_SOUTH, + FTR_HANIWA046_SOUTH, + FTR_HANIWA047_SOUTH, + FTR_HANIWA048_SOUTH, + FTR_HANIWA049_SOUTH, + FTR_HANIWA050_SOUTH, + FTR_HANIWA051_SOUTH, + FTR_HANIWA052_SOUTH, + FTR_HANIWA053_SOUTH, + FTR_HANIWA054_SOUTH, + FTR_HANIWA055_SOUTH, + FTR_HANIWA056_SOUTH, + FTR_HANIWA057_SOUTH, + FTR_HANIWA058_SOUTH, + FTR_HANIWA059_SOUTH, + FTR_HANIWA060_SOUTH, + FTR_HANIWA061_SOUTH, + FTR_HANIWA062_SOUTH, + FTR_HANIWA063_SOUTH, + FTR_HANIWA064_SOUTH, + FTR_HANIWA065_SOUTH, + FTR_HANIWA066_SOUTH, + FTR_HANIWA067_SOUTH, + FTR_HANIWA068_SOUTH, + FTR_HANIWA069_SOUTH, + FTR_HANIWA070_SOUTH, + FTR_HANIWA071_SOUTH, + FTR_HANIWA072_SOUTH, + FTR_HANIWA073_SOUTH, + FTR_HANIWA074_SOUTH, + FTR_HANIWA075_SOUTH, + FTR_HANIWA076_SOUTH, + FTR_HANIWA077_SOUTH, + FTR_HANIWA078_SOUTH, + FTR_HANIWA079_SOUTH, + FTR_HANIWA080_SOUTH, + FTR_HANIWA081_SOUTH, + FTR_HANIWA082_SOUTH, + FTR_HANIWA083_SOUTH, + FTR_HANIWA084_SOUTH, + FTR_HANIWA085_SOUTH, + FTR_HANIWA086_SOUTH, + FTR_HANIWA087_SOUTH, + FTR_HANIWA088_SOUTH, + FTR_HANIWA089_SOUTH, + FTR_HANIWA090_SOUTH, + FTR_HANIWA091_SOUTH, + FTR_HANIWA092_SOUTH, + FTR_HANIWA093_SOUTH, + FTR_HANIWA094_SOUTH, + FTR_HANIWA095_SOUTH, + FTR_HANIWA096_SOUTH, + FTR_HANIWA097_SOUTH, + FTR_HANIWA098_SOUTH, + FTR_HANIWA099_SOUTH, + FTR_HANIWA100_SOUTH, + FTR_HANIWA101_SOUTH, + FTR_HANIWA102_SOUTH, + FTR_HANIWA103_SOUTH, + FTR_HANIWA104_SOUTH, + FTR_HANIWA105_SOUTH, + FTR_HANIWA106_SOUTH, + FTR_HANIWA107_SOUTH, + FTR_HANIWA108_SOUTH, + FTR_HANIWA109_SOUTH, + FTR_HANIWA110_SOUTH, + FTR_HANIWA111_SOUTH, + FTR_HANIWA112_SOUTH, + FTR_HANIWA113_SOUTH, + FTR_HANIWA114_SOUTH, + FTR_HANIWA115_SOUTH, + FTR_HANIWA116_SOUTH, + FTR_HANIWA117_SOUTH, + FTR_HANIWA118_SOUTH, + FTR_HANIWA119_SOUTH, + FTR_HANIWA120_SOUTH, + FTR_HANIWA121_SOUTH, + FTR_HANIWA122_SOUTH, + FTR_HANIWA123_SOUTH, + FTR_HANIWA124_SOUTH, + FTR_HANIWA125_SOUTH, + FTR_HANIWA126_SOUTH, + EMPTY_NO /* end of list */ +}; + +static mActor_name_t umbrella_list[UMBRELLA_NUM + 1] = { + ITM_UMBRELLA00, + ITM_UMBRELLA01, + ITM_UMBRELLA02, + ITM_UMBRELLA03, + ITM_UMBRELLA04, + ITM_UMBRELLA05, + ITM_UMBRELLA06, + ITM_UMBRELLA07, + ITM_UMBRELLA08, + ITM_UMBRELLA09, + ITM_UMBRELLA10, + ITM_UMBRELLA11, + ITM_UMBRELLA12, + ITM_UMBRELLA13, + ITM_UMBRELLA14, + ITM_UMBRELLA15, + ITM_UMBRELLA16, + ITM_UMBRELLA17, + ITM_UMBRELLA18, + ITM_UMBRELLA19, + ITM_UMBRELLA20, + ITM_UMBRELLA21, + ITM_UMBRELLA22, + ITM_UMBRELLA23, + ITM_UMBRELLA24, + ITM_UMBRELLA25, + ITM_UMBRELLA26, + ITM_UMBRELLA27, + ITM_UMBRELLA28, + ITM_UMBRELLA29, + ITM_UMBRELLA30, + ITM_UMBRELLA31, + EMPTY_NO /* end of list */ +}; + +static mActor_name_t aEGH_not_collect_get() { + static mActor_name_t* item_list[aEGH_ITEM_LIST_NUM] = { + ftr_listA, + ftr_listB, + ftr_listC, + ftr_listEvent, + ftr_listLottery, + carpet_listA, + carpet_listB, + carpet_listC, + carpet_listEvent, + wall_listA, + wall_listB, + wall_listC, + wall_listEvent, + cloth_listA, + cloth_listB, + cloth_listC, + cloth_listEvent, + binsen_listA, + binsen_listB, + binsen_listC, + list_haniwa, + umbrella_list + }; + + int list_num_tbl[aEGH_ITEM_LIST_NUM]; + int uncollect_num_tbl[aEGH_ITEM_LIST_NUM]; + int no_uncollected_flag = FALSE; + int selected_idx; + mActor_name_t item; + int i; + int total_count; + + /* Calculate total items in each list and uncollected items in each list */ + for (i = 0; i < aEGH_ITEM_LIST_NUM; i++) { + aEGH_check_collect_num(&list_num_tbl[i], &uncollect_num_tbl[i], item_list[i]); + } + + for (i = 0, total_count = 0; i < aEGH_ITEM_LIST_NUM; i++) { + total_count += uncollect_num_tbl[i]; + } + + /* If no uncollected items remain, select one at random from all lists */ + if (total_count == 0) { + no_uncollected_flag = TRUE; /* all items collected */ + for (i = 0, total_count = 0; i < aEGH_ITEM_LIST_NUM; i++) { + total_count += list_num_tbl[i]; + } + } + + selected_idx = RANDOM(total_count); + if (no_uncollected_flag) { + /* Transform the absolute idx into the list idx by removing all entries up to the selected list */ + for (i = 0; i < aEGH_ITEM_LIST_NUM && selected_idx >= list_num_tbl[i]; i++) { + selected_idx -= list_num_tbl[i]; + } + + if (i != aEGH_ITEM_LIST_NUM) { + item = item_list[i][selected_idx]; + } + else { + item = ITM_FOOD_PEACH; /* If we somehow failed to select an item, we'll give them a peach */ + } + } + else { + /* Transform the absolute idx into the list idx by removing all entries up to the selected list */ + for (i = 0; i < aEGH_ITEM_LIST_NUM && selected_idx >= uncollect_num_tbl[i]; i++) { + selected_idx -= uncollect_num_tbl[i]; + } + + if (i != aEGH_ITEM_LIST_NUM) { + item = aEGH_get_collect(selected_idx, item_list[i]); /* Get the uncollected item from the list */ + + if (item == EMPTY_NO) { + item = ITM_FOOD_APPLE; /* If we somehow failed to get an uncollected item, we'll give them an apple */ + } + } + else { + item = ITM_FOOD_PEACH; /* If we somehow failed to select an item, we'll give them a peach */ + } + } + + return mRmTp_FtrItemNo2Item1ItemNo(item, TRUE); +} + +static void aEGH_give_me_wait(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); + + switch (order) { + case 1: + { + mPlib_request_main_give_type1((GAME*)play, ITM_SPIRIT0, 7, FALSE, FALSE); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); + mMsg_Set_LockContinue(mMsg_Get_base_window_p()); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); + aEGH_delete_hitodama(); + break; + } + + case 2: + { + if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { + mMsg_Unset_LockContinue(mMsg_Get_base_window_p()); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + aEGH_change_talk_proc(ghost, aEGH_TALK_SELECT_WAIT); + } + + break; + } + } +} + +static void aEGH_select_wait(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); + mMsg_Window_c* msg_p = mMsg_Get_base_window_p(); + mEv_gst_c* ghost_data = (mEv_gst_c*)mEv_get_save_area(mEv_EVENT_GHOST, 54); + + if (order == 1 && mMsg_Check_MainNormalContinue(mMsg_Get_base_window_p())) { + ghost->after_talk_think_act = 1; + ghost_data->flags |= 0x8000; + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + + switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { + case mChoice_CHOICE0: /* Clear weeds */ + { + u32 num_weeds = mFI_GetItemNumField(GRASS_A, GRASS_C); + + if (num_weeds < 50) { + mMsg_Set_continue_msg_num(msg_p, 0x2EF1); + } + else if (num_weeds < 150) { + mMsg_Set_continue_msg_num(msg_p, 0x2EF2); + } + else if (num_weeds < 450) { + mMsg_Set_continue_msg_num(msg_p, 0x2EF3); + } + else if (num_weeds < 900) { + mMsg_Set_continue_msg_num(msg_p, 0x2EF4); + } + else { + mMsg_Set_continue_msg_num(msg_p, 0x2EF5); + } + + aEGH_change_talk_proc(ghost, aEGH_TALK_CLEAR_GRASS); + break; + } + + case mChoice_CHOICE1: + { + aEGH_change_talk_proc(ghost, aEGH_TALK_SELECT_ROOF); + ghost->roof_pal = 0; + break; + } + + case mChoice_CHOICE2: + { + u8 name[mIN_ITEM_NAME_LEN]; + + aEGH_change_talk_proc(ghost, aEGH_TALK_GIVE_YOU_WAIT); + ghost->give_item = aEGH_not_collect_get(); + mIN_copy_name_str(name, ghost->give_item); + mMsg_Set_item_str_art(msg_p, mMsg_ITEM_STR0, name, mIN_ITEM_NAME_LEN, mIN_get_item_article(ghost->give_item)); + break; + } + } + } +} + +static void aEGH_select_roof(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); + int arrange_idx = mHS_get_arrange_idx(Common_Get(player_no)); + mHm_hs_c* home = Save_GetPointer(homes[arrange_idx]); + + if (order == 1 && mMsg_Check_MainNormalContinue(mMsg_Get_base_window_p())) { + int selected; + + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + selected = mChoice_Get_ChoseNum(mChoice_Get_base_window_p()); + + if (selected >= mChoice_CHOICE3) { + ghost->roof_pal += 3; + + if (ghost->roof_pal >= mSP_ROOF_COLOR_NUM) { + ghost->roof_pal = 0; + } + } + else { + ghost->roof_pal += (u8)selected; + home->outlook_pal = ghost->roof_pal; + + /* Only update the 'next outlook' palette if the player doesn't have a coat of paint already scheduled */ + if ((Common_Get(now_private)->state_flags & mPr_FLAG_UPDATE_OUTLOOK_PENDING) == 0) { + home->next_outlook_pal = ghost->roof_pal; + } + + aEGH_change_talk_proc(ghost, aEGH_TALK_END_WAIT); + } + } +} + +static void aEGH_give_you_wait(EV_GHOST_ACTOR* ghost, GAME_PLAY* play) { + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); + + if (order == 2) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, ghost->give_item); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); + mPr_SetFreePossessionItem(Common_Get(now_private), ghost->give_item, mPr_ITEM_COND_NORMAL); + aEGH_change_talk_proc(ghost, aEGH_TALK_END_WAIT); + } +} + +static int aEGH_change_talk_proc(EV_GHOST_ACTOR* ghost, u8 talk_act) { + ghost->talk_act = talk_act; + return TRUE; +} + +static void aEGH_set_force_talk_info(ACTOR* actorx) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + mEv_gst_common_c* ghost_common = (mEv_gst_common_c*)mEv_get_common_area(mEv_EVENT_GHOST, 55); + + mDemo_Set_msg_num(ghost->msg_no + RANDOM(5)); + aEGH_okoruhito(); + + switch (ghost->msg_no) { + case 0x2EE2: + { + mDemo_Set_talk_turn(TRUE); + mDemo_Set_camera(CAMERA2_PROCESS_TALK); + + if (aEGH_bitcheck_func(aEGH_BIT_FOUND_GHOST) == FALSE) { + sAdo_SysTrgStart(0x6B); + aEGH_bitset_func(aEGH_BIT_FOUND_GHOST); + } + + ghost_common->flags |= mEv_GHOST_FLAG_ACTIVE; + break; + } + + case 0x2EDD: + { + mDemo_Set_talk_turn(TRUE); + mDemo_Set_camera(CAMERA2_PROCESS_NORMAL); + break; + } + + case 0x2ED3: + case 0x2ED8: + { + mDemo_Set_talk_turn(FALSE); + mDemo_Set_camera(CAMERA2_PROCESS_NORMAL); + mMsg_sound_set_voice_click(mMsg_Get_base_window_p()); + break; + } + + default: + { + mDemo_Set_talk_turn(FALSE); + mDemo_Set_camera(CAMERA2_PROCESS_NORMAL); + break; + } + } + + aEGH_change_talk_proc(ghost, aEGH_TALK_END_WAIT); +} + +static void aEGH_force_talk_request(ACTOR* actorx, GAME* game) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + f32 dist = GET_PLAYER_ACTOR(play)->actor_class.world.position.y - actorx->world.position.y; + + if (dist < 0.0f) { + dist = -dist; + } + + if (!( + !(ghost->_9A7 == FALSE && actorx->player_distance_xz < actorx->talk_distance) || + !(dist < 60.0f) && (ghost->_9AA == FALSE) + )) { + mDemo_Request(mDemo_TYPE_SPEAK, actorx, &aEGH_set_force_talk_info); + } + else { + ghost->_9A7 = FALSE; + } +} + +static void aEGH_set_norm_talk_info(ACTOR* actorx) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + int hitodama_num; + int msg_no; + + aEGH_okoruhito(); + mDemo_Set_talk_turn(TRUE); + mDemo_Set_camera(CAMERA2_PROCESS_TALK); + aEGH_change_talk_proc(ghost, aEGH_TALK_END_WAIT); + + hitodama_num = aEGH_hitodama_num(); + if (hitodama_num == 0) { + msg_no = 0x2EE7 + RANDOM(5); + } + else if (hitodama_num >= mEv_GHOST_HITODAMA_NUM) { + msg_no = 0x2EF0; + aEGH_change_talk_proc(ghost, aEGH_TALK_GIVE_ME_WAIT); + Save_Get(event_save_common).ghost_day = 0; + } + else { + msg_no = 0x2EEB + hitodama_num; + } + + mDemo_Set_msg_num(msg_no); +} + +static void aEGH_norm_talk_request(ACTOR* actorx, GAME* game) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + + if (ghost->_9A7 == FALSE) { + mDemo_Request(mDemo_TYPE_TALK, actorx, &aEGH_set_norm_talk_info); + } + else { + ghost->_9A7 = FALSE; + } +} + +static int aEGH_talk_init(ACTOR* actorx, GAME* game) { + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + + ghost->npc_class.talk_info.talk_request_proc = (aNPC_TALK_REQUEST_PROC)&none_proc1; + mDemo_Set_ListenAble(); + mDemo_Start(actorx); + return TRUE; +} + +typedef void (*aEGH_TALK_PROC)(EV_GHOST_ACTOR*, GAME_PLAY*); + +static int aEGH_talk_end_chk(ACTOR* actorx, GAME* game) { + static aEGH_TALK_PROC proc[aEGH_TALK_NUM] = { + (aEGH_TALK_PROC)&none_proc1, + &aEGH_give_me_wait, + &aEGH_select_wait, + &aEGH_select_roof, + &aEGH_give_you_wait, + (aEGH_TALK_PROC)&none_proc1 + }; + + EV_GHOST_ACTOR* ghost = (EV_GHOST_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + int res = FALSE; + + (*proc[ghost->talk_act])(ghost, play); + + if (mDemo_Check(mDemo_TYPE_SPEAK, actorx) == FALSE && mDemo_Check(mDemo_TYPE_TALK, actorx) == FALSE) { + if (ghost->talk_act == aEGH_TALK_CLEAR_GRASS) { + Save_Set(clear_grass, TRUE); + } + + aEGH_setup_think_proc(ghost, play, ghost->after_talk_think_act); + + if (ghost->melody_inst != 0) { + ghost->npc_class.talk_info.melody_inst = ghost->melody_inst; + ghost->melody_inst = 0; + } + + res = TRUE; + } + + return res; +} diff --git a/src/m_event.c b/src/m_event.c index 7a4778cc..c0b351d8 100644 --- a/src/m_event.c +++ b/src/m_event.c @@ -1219,7 +1219,7 @@ static void init_weekly_event() { sched_date = after_n_day(today_date.raw, ofs - rtc_time->weekday); event_dates[mEv_SAVE_DATE_WEEKLY] = sched_date; Save_Get(event_save_common).weekly_event.type = mEv_EVENT_DOZAEMON; // Gulliver - Save_Get(event_save_common).current_event_state = 0; + Save_Get(event_save_common).dozaemon_completed = FALSE; } /* Check if Guillver should spawn today */ diff --git a/src/m_mail_password_check.c b/src/m_mail_password_check.c index 2518bd4c..954c4211 100644 --- a/src/m_mail_password_check.c +++ b/src/m_mail_password_check.c @@ -1082,7 +1082,7 @@ extern int mMpswd_check_present_user(mActor_name_t item) { price = mSP_ItemNo2ItemPrice(item); } } - else if (item >= ITM_GELATO_UMBRELLA && item <= ITM_MY_ORG_UMBRELLA7) { + else if (item >= ITM_UMBRELLA00 && item <= ITM_MY_ORG_UMBRELLA7) { price = mSP_ItemNo2ItemPrice(item); } else if ( @@ -1193,7 +1193,7 @@ static int mMpswd_check_present_other(mActor_name_t item) { case ITEM1_CAT_TOOL: { /* allow umbrellas */ - if (item >= ITM_GELATO_UMBRELLA && item <= ITM_FLAME_UMBRELLA) { + if (item >= ITM_UMBRELLA00 && item <= ITM_UMBRELLA31) { res = TRUE; break; } diff --git a/src/m_shop.c b/src/m_shop.c index 2343b8ce..b7b12558 100644 --- a/src/m_shop.c +++ b/src/m_shop.c @@ -2074,7 +2074,7 @@ extern void mSP_RandomUmbSelect(mActor_name_t* umb_list, int count) { int set = FALSE; while (!set) { - mActor_name_t umb = ITM_GELATO_UMBRELLA + RANDOM(UMBRELLA_NUM); + mActor_name_t umb = ITM_UMBRELLA00 + RANDOM(UMBRELLA_NUM); if (mSP_GoodsExistAlready(umb_list, count, umb) == FALSE) { umb_list[i] = umb; diff --git a/src/m_soncho.c b/src/m_soncho.c index 8eae2593..0cfa5261 100644 --- a/src/m_soncho.c +++ b/src/m_soncho.c @@ -744,7 +744,7 @@ static void mSCR_talk_pickup_all(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* pla switch (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9)) { case 1: { - mPlib_request_main_give_type1(play, ITM_EXCERCISE_CARD00, 7, FALSE, FALSE); + mPlib_request_main_give_type1((GAME*)play, ITM_EXCERCISE_CARD00, 7, FALSE, FALSE); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); mMsg_Set_LockContinue(mMsg_Get_base_window_p()); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); @@ -772,7 +772,7 @@ static void mSCR_talk_inspection(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* pla switch (order) { case 1: { - mPlib_request_main_give_type1(play, ITM_EXCERCISE_CARD00, 8, FALSE, FALSE); + mPlib_request_main_give_type1((GAME*)play, ITM_EXCERCISE_CARD00, 8, FALSE, FALSE); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); diff --git a/src/m_titledemo.c b/src/m_titledemo.c index c94eb7e4..ab9d68ed 100644 --- a/src/m_titledemo.c +++ b/src/m_titledemo.c @@ -53,8 +53,8 @@ extern void mTD_player_keydata_init(GAME_PLAY* play) { else if (tool == ITM_ROD) { tool = ITM_ROD; } - else if (tool == ITM_GELATO_UMBRELLA) { - tool = ITM_GELATO_UMBRELLA; + else if (tool == ITM_UMBRELLA00) { + tool = ITM_UMBRELLA00; } mPlib_SetData2_controller_data_for_title_demo(tool);