From 8dac07e97c7724660c1083916348dc00970c1b3b Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Sun, 1 Dec 2024 04:51:31 -0500 Subject: [PATCH] Implement & link ac_house --- configure.py | 2 +- include/ac_house.h | 6 +- include/audio_defs.h | 5 + include/m_name_table.h | 238 +++++++++++++++++ src/actor/ac_house.c | 252 ++++++++++++++++++ src/actor/ac_house_draw.c_inc | 281 ++++++++++++++++++++ src/actor/ac_house_move.c_inc | 485 ++++++++++++++++++++++++++++++++++ 7 files changed, 1267 insertions(+), 2 deletions(-) create mode 100644 src/actor/ac_house.c create mode 100644 src/actor/ac_house_draw.c_inc create mode 100644 src/actor/ac_house_move.c_inc diff --git a/configure.py b/configure.py index b1c956e7..47ad3425 100644 --- a/configure.py +++ b/configure.py @@ -979,7 +979,7 @@ config.libs = [ Object(Matching, "actor/ac_handOverItem.c"), Object(Matching, "actor/ac_haniwa.c"), Object(Matching, "actor/ac_hatumode_control.c"), - Object(NonMatching, "actor/ac_house.c"), + Object(Matching, "actor/ac_house.c"), Object(Matching, "actor/ac_house_clock.c"), Object(NonMatching, "actor/ac_house_goki.c"), Object(NonMatching, "actor/ac_htable.c"), diff --git a/include/ac_house.h b/include/ac_house.h index a2d4d918..0ce21566 100644 --- a/include/ac_house.h +++ b/include/ac_house.h @@ -3,11 +3,16 @@ #include "types.h" #include "m_actor.h" +#include "ac_structure.h" +#include "m_snowman.h" +#include "m_event_map_npc.h" #ifdef __cplusplus extern "C" { #endif +typedef STRUCTURE_ACTOR HOUSE_ACTOR; + extern ACTOR_PROFILE House_Profile; #ifdef __cplusplus @@ -15,4 +20,3 @@ extern ACTOR_PROFILE House_Profile; #endif #endif - diff --git a/include/audio_defs.h b/include/audio_defs.h index 6a10ba2a..dfad42c4 100644 --- a/include/audio_defs.h +++ b/include/audio_defs.h @@ -29,6 +29,11 @@ typedef enum audio_sound_effects { NA_SE_ZOOMUP = 4, NA_SE_ZOOMDOWN_SHORT, + NA_SE_6 = 0x6, + NA_SE_7 = 0x7, + NA_SE_8 = 0x8, + NA_SE_9 = 0x9, + NA_SE_A = 0xA, NA_SE_PAGE_OKURI = 0xB, diff --git a/include/m_name_table.h b/include/m_name_table.h index 2e685e4e..d7c2c23a 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -3014,6 +3014,244 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define NPC_END (NPC_START + 236) #define DUMMY_START 0xF000 +#define DUMMY_NPC_HOUSE_000 (DUMMY_START + 5) // F005 +#define DUMMY_NPC_HOUSE_001 (DUMMY_START + 6) // F006 +#define DUMMY_NPC_HOUSE_002 (DUMMY_START + 7) // F007 +#define DUMMY_NPC_HOUSE_003 (DUMMY_START + 8) // F008 +#define DUMMY_NPC_HOUSE_004 (DUMMY_START + 9) // F009 +#define DUMMY_NPC_HOUSE_005 (DUMMY_START + 10) // F00A +#define DUMMY_NPC_HOUSE_006 (DUMMY_START + 11) // F00B +#define DUMMY_NPC_HOUSE_007 (DUMMY_START + 12) // F00C +#define DUMMY_NPC_HOUSE_008 (DUMMY_START + 13) // F00D +#define DUMMY_NPC_HOUSE_009 (DUMMY_START + 14) // F00E +#define DUMMY_NPC_HOUSE_010 (DUMMY_START + 15) // F00F +#define DUMMY_NPC_HOUSE_011 (DUMMY_START + 16) // F010 +#define DUMMY_NPC_HOUSE_012 (DUMMY_START + 17) // F011 +#define DUMMY_NPC_HOUSE_013 (DUMMY_START + 18) // F012 +#define DUMMY_NPC_HOUSE_014 (DUMMY_START + 19) // F013 +#define DUMMY_NPC_HOUSE_015 (DUMMY_START + 20) // F014 +#define DUMMY_NPC_HOUSE_016 (DUMMY_START + 21) // F015 +#define DUMMY_NPC_HOUSE_017 (DUMMY_START + 22) // F016 +#define DUMMY_NPC_HOUSE_018 (DUMMY_START + 23) // F017 +#define DUMMY_NPC_HOUSE_019 (DUMMY_START + 24) // F018 +#define DUMMY_NPC_HOUSE_020 (DUMMY_START + 25) // F019 +#define DUMMY_NPC_HOUSE_021 (DUMMY_START + 26) // F01A +#define DUMMY_NPC_HOUSE_022 (DUMMY_START + 27) // F01B +#define DUMMY_NPC_HOUSE_023 (DUMMY_START + 28) // F01C +#define DUMMY_NPC_HOUSE_024 (DUMMY_START + 29) // F01D +#define DUMMY_NPC_HOUSE_025 (DUMMY_START + 30) // F01E +#define DUMMY_NPC_HOUSE_026 (DUMMY_START + 31) // F01F +#define DUMMY_NPC_HOUSE_027 (DUMMY_START + 32) // F020 +#define DUMMY_NPC_HOUSE_028 (DUMMY_START + 33) // F021 +#define DUMMY_NPC_HOUSE_029 (DUMMY_START + 34) // F022 +#define DUMMY_NPC_HOUSE_030 (DUMMY_START + 35) // F023 +#define DUMMY_NPC_HOUSE_031 (DUMMY_START + 36) // F024 +#define DUMMY_NPC_HOUSE_032 (DUMMY_START + 37) // F025 +#define DUMMY_NPC_HOUSE_033 (DUMMY_START + 38) // F026 +#define DUMMY_NPC_HOUSE_034 (DUMMY_START + 39) // F027 +#define DUMMY_NPC_HOUSE_035 (DUMMY_START + 40) // F028 +#define DUMMY_NPC_HOUSE_036 (DUMMY_START + 41) // F029 +#define DUMMY_NPC_HOUSE_037 (DUMMY_START + 42) // F02A +#define DUMMY_NPC_HOUSE_038 (DUMMY_START + 43) // F02B +#define DUMMY_NPC_HOUSE_039 (DUMMY_START + 44) // F02C +#define DUMMY_NPC_HOUSE_040 (DUMMY_START + 45) // F02D +#define DUMMY_NPC_HOUSE_041 (DUMMY_START + 46) // F02E +#define DUMMY_NPC_HOUSE_042 (DUMMY_START + 47) // F02F +#define DUMMY_NPC_HOUSE_043 (DUMMY_START + 48) // F030 +#define DUMMY_NPC_HOUSE_044 (DUMMY_START + 49) // F031 +#define DUMMY_NPC_HOUSE_045 (DUMMY_START + 50) // F032 +#define DUMMY_NPC_HOUSE_046 (DUMMY_START + 51) // F033 +#define DUMMY_NPC_HOUSE_047 (DUMMY_START + 52) // F034 +#define DUMMY_NPC_HOUSE_048 (DUMMY_START + 53) // F035 +#define DUMMY_NPC_HOUSE_049 (DUMMY_START + 54) // F036 +#define DUMMY_NPC_HOUSE_050 (DUMMY_START + 55) // F037 +#define DUMMY_NPC_HOUSE_051 (DUMMY_START + 56) // F038 +#define DUMMY_NPC_HOUSE_052 (DUMMY_START + 57) // F039 +#define DUMMY_NPC_HOUSE_053 (DUMMY_START + 58) // F03A +#define DUMMY_NPC_HOUSE_054 (DUMMY_START + 59) // F03B +#define DUMMY_NPC_HOUSE_055 (DUMMY_START + 60) // F03C +#define DUMMY_NPC_HOUSE_056 (DUMMY_START + 61) // F03D +#define DUMMY_NPC_HOUSE_057 (DUMMY_START + 62) // F03E +#define DUMMY_NPC_HOUSE_058 (DUMMY_START + 63) // F03F +#define DUMMY_NPC_HOUSE_059 (DUMMY_START + 64) // F040 +#define DUMMY_NPC_HOUSE_060 (DUMMY_START + 65) // F041 +#define DUMMY_NPC_HOUSE_061 (DUMMY_START + 66) // F042 +#define DUMMY_NPC_HOUSE_062 (DUMMY_START + 67) // F043 +#define DUMMY_NPC_HOUSE_063 (DUMMY_START + 68) // F044 +#define DUMMY_NPC_HOUSE_064 (DUMMY_START + 69) // F045 +#define DUMMY_NPC_HOUSE_065 (DUMMY_START + 70) // F046 +#define DUMMY_NPC_HOUSE_066 (DUMMY_START + 71) // F047 +#define DUMMY_NPC_HOUSE_067 (DUMMY_START + 72) // F048 +#define DUMMY_NPC_HOUSE_068 (DUMMY_START + 73) // F049 +#define DUMMY_NPC_HOUSE_069 (DUMMY_START + 74) // F04A +#define DUMMY_NPC_HOUSE_070 (DUMMY_START + 75) // F04B +#define DUMMY_NPC_HOUSE_071 (DUMMY_START + 76) // F04C +#define DUMMY_NPC_HOUSE_072 (DUMMY_START + 77) // F04D +#define DUMMY_NPC_HOUSE_073 (DUMMY_START + 78) // F04E +#define DUMMY_NPC_HOUSE_074 (DUMMY_START + 79) // F04F +#define DUMMY_NPC_HOUSE_075 (DUMMY_START + 80) // F050 +#define DUMMY_NPC_HOUSE_076 (DUMMY_START + 81) // F051 +#define DUMMY_NPC_HOUSE_077 (DUMMY_START + 82) // F052 +#define DUMMY_NPC_HOUSE_078 (DUMMY_START + 83) // F053 +#define DUMMY_NPC_HOUSE_079 (DUMMY_START + 84) // F054 +#define DUMMY_NPC_HOUSE_080 (DUMMY_START + 85) // F055 +#define DUMMY_NPC_HOUSE_081 (DUMMY_START + 86) // F056 +#define DUMMY_NPC_HOUSE_082 (DUMMY_START + 87) // F057 +#define DUMMY_NPC_HOUSE_083 (DUMMY_START + 88) // F058 +#define DUMMY_NPC_HOUSE_084 (DUMMY_START + 89) // F059 +#define DUMMY_NPC_HOUSE_085 (DUMMY_START + 90) // F05A +#define DUMMY_NPC_HOUSE_086 (DUMMY_START + 91) // F05B +#define DUMMY_NPC_HOUSE_087 (DUMMY_START + 92) // F05C +#define DUMMY_NPC_HOUSE_088 (DUMMY_START + 93) // F05D +#define DUMMY_NPC_HOUSE_089 (DUMMY_START + 94) // F05E +#define DUMMY_NPC_HOUSE_090 (DUMMY_START + 95) // F05F +#define DUMMY_NPC_HOUSE_091 (DUMMY_START + 96) // F060 +#define DUMMY_NPC_HOUSE_092 (DUMMY_START + 97) // F061 +#define DUMMY_NPC_HOUSE_093 (DUMMY_START + 98) // F062 +#define DUMMY_NPC_HOUSE_094 (DUMMY_START + 99) // F063 +#define DUMMY_NPC_HOUSE_095 (DUMMY_START + 100) // F064 +#define DUMMY_NPC_HOUSE_096 (DUMMY_START + 101) // F065 +#define DUMMY_NPC_HOUSE_097 (DUMMY_START + 102) // F066 +#define DUMMY_NPC_HOUSE_098 (DUMMY_START + 103) // F067 +#define DUMMY_NPC_HOUSE_099 (DUMMY_START + 104) // F068 +#define DUMMY_NPC_HOUSE_100 (DUMMY_START + 105) // F069 +#define DUMMY_NPC_HOUSE_101 (DUMMY_START + 106) // F06A +#define DUMMY_NPC_HOUSE_102 (DUMMY_START + 107) // F06B +#define DUMMY_NPC_HOUSE_103 (DUMMY_START + 108) // F06C +#define DUMMY_NPC_HOUSE_104 (DUMMY_START + 109) // F06D +#define DUMMY_NPC_HOUSE_105 (DUMMY_START + 110) // F06E +#define DUMMY_NPC_HOUSE_106 (DUMMY_START + 111) // F06F +#define DUMMY_NPC_HOUSE_107 (DUMMY_START + 112) // F070 +#define DUMMY_NPC_HOUSE_108 (DUMMY_START + 113) // F071 +#define DUMMY_NPC_HOUSE_109 (DUMMY_START + 114) // F072 +#define DUMMY_NPC_HOUSE_110 (DUMMY_START + 115) // F073 +#define DUMMY_NPC_HOUSE_111 (DUMMY_START + 116) // F074 +#define DUMMY_NPC_HOUSE_112 (DUMMY_START + 117) // F075 +#define DUMMY_NPC_HOUSE_113 (DUMMY_START + 118) // F076 +#define DUMMY_NPC_HOUSE_114 (DUMMY_START + 119) // F077 +#define DUMMY_NPC_HOUSE_115 (DUMMY_START + 120) // F078 +#define DUMMY_NPC_HOUSE_116 (DUMMY_START + 121) // F079 +#define DUMMY_NPC_HOUSE_117 (DUMMY_START + 122) // F07A +#define DUMMY_NPC_HOUSE_118 (DUMMY_START + 123) // F07B +#define DUMMY_NPC_HOUSE_119 (DUMMY_START + 124) // F07C +#define DUMMY_NPC_HOUSE_120 (DUMMY_START + 125) // F07D +#define DUMMY_NPC_HOUSE_121 (DUMMY_START + 126) // F07E +#define DUMMY_NPC_HOUSE_122 (DUMMY_START + 127) // F07F +#define DUMMY_NPC_HOUSE_123 (DUMMY_START + 128) // F080 +#define DUMMY_NPC_HOUSE_124 (DUMMY_START + 129) // F081 +#define DUMMY_NPC_HOUSE_125 (DUMMY_START + 130) // F082 +#define DUMMY_NPC_HOUSE_126 (DUMMY_START + 131) // F083 +#define DUMMY_NPC_HOUSE_127 (DUMMY_START + 132) // F084 +#define DUMMY_NPC_HOUSE_128 (DUMMY_START + 133) // F085 +#define DUMMY_NPC_HOUSE_129 (DUMMY_START + 134) // F086 +#define DUMMY_NPC_HOUSE_130 (DUMMY_START + 135) // F087 +#define DUMMY_NPC_HOUSE_131 (DUMMY_START + 136) // F088 +#define DUMMY_NPC_HOUSE_132 (DUMMY_START + 137) // F089 +#define DUMMY_NPC_HOUSE_133 (DUMMY_START + 138) // F08A +#define DUMMY_NPC_HOUSE_134 (DUMMY_START + 139) // F08B +#define DUMMY_NPC_HOUSE_135 (DUMMY_START + 140) // F08C +#define DUMMY_NPC_HOUSE_136 (DUMMY_START + 141) // F08D +#define DUMMY_NPC_HOUSE_137 (DUMMY_START + 142) // F08E +#define DUMMY_NPC_HOUSE_138 (DUMMY_START + 143) // F08F +#define DUMMY_NPC_HOUSE_139 (DUMMY_START + 144) // F090 +#define DUMMY_NPC_HOUSE_140 (DUMMY_START + 145) // F091 +#define DUMMY_NPC_HOUSE_141 (DUMMY_START + 146) // F092 +#define DUMMY_NPC_HOUSE_142 (DUMMY_START + 147) // F093 +#define DUMMY_NPC_HOUSE_143 (DUMMY_START + 148) // F094 +#define DUMMY_NPC_HOUSE_144 (DUMMY_START + 149) // F095 +#define DUMMY_NPC_HOUSE_145 (DUMMY_START + 150) // F096 +#define DUMMY_NPC_HOUSE_146 (DUMMY_START + 151) // F097 +#define DUMMY_NPC_HOUSE_147 (DUMMY_START + 152) // F098 +#define DUMMY_NPC_HOUSE_148 (DUMMY_START + 153) // F099 +#define DUMMY_NPC_HOUSE_149 (DUMMY_START + 154) // F09A +#define DUMMY_NPC_HOUSE_150 (DUMMY_START + 155) // F09B +#define DUMMY_NPC_HOUSE_151 (DUMMY_START + 156) // F09C +#define DUMMY_NPC_HOUSE_152 (DUMMY_START + 157) // F09D +#define DUMMY_NPC_HOUSE_153 (DUMMY_START + 158) // F09E +#define DUMMY_NPC_HOUSE_154 (DUMMY_START + 159) // F09F +#define DUMMY_NPC_HOUSE_155 (DUMMY_START + 160) // F0A0 +#define DUMMY_NPC_HOUSE_156 (DUMMY_START + 161) // F0A1 +#define DUMMY_NPC_HOUSE_157 (DUMMY_START + 162) // F0A2 +#define DUMMY_NPC_HOUSE_158 (DUMMY_START + 163) // F0A3 +#define DUMMY_NPC_HOUSE_159 (DUMMY_START + 164) // F0A4 +#define DUMMY_NPC_HOUSE_160 (DUMMY_START + 165) // F0A5 +#define DUMMY_NPC_HOUSE_161 (DUMMY_START + 166) // F0A6 +#define DUMMY_NPC_HOUSE_162 (DUMMY_START + 167) // F0A7 +#define DUMMY_NPC_HOUSE_163 (DUMMY_START + 168) // F0A8 +#define DUMMY_NPC_HOUSE_164 (DUMMY_START + 169) // F0A9 +#define DUMMY_NPC_HOUSE_165 (DUMMY_START + 170) // F0AA +#define DUMMY_NPC_HOUSE_166 (DUMMY_START + 171) // F0AB +#define DUMMY_NPC_HOUSE_167 (DUMMY_START + 172) // F0AC +#define DUMMY_NPC_HOUSE_168 (DUMMY_START + 173) // F0AD +#define DUMMY_NPC_HOUSE_169 (DUMMY_START + 174) // F0AE +#define DUMMY_NPC_HOUSE_170 (DUMMY_START + 175) // F0AF +#define DUMMY_NPC_HOUSE_171 (DUMMY_START + 176) // F0B0 +#define DUMMY_NPC_HOUSE_172 (DUMMY_START + 177) // F0B1 +#define DUMMY_NPC_HOUSE_173 (DUMMY_START + 178) // F0B2 +#define DUMMY_NPC_HOUSE_174 (DUMMY_START + 179) // F0B3 +#define DUMMY_NPC_HOUSE_175 (DUMMY_START + 180) // F0B4 +#define DUMMY_NPC_HOUSE_176 (DUMMY_START + 181) // F0B5 +#define DUMMY_NPC_HOUSE_177 (DUMMY_START + 182) // F0B6 +#define DUMMY_NPC_HOUSE_178 (DUMMY_START + 183) // F0B7 +#define DUMMY_NPC_HOUSE_179 (DUMMY_START + 184) // F0B8 +#define DUMMY_NPC_HOUSE_180 (DUMMY_START + 185) // F0B9 +#define DUMMY_NPC_HOUSE_181 (DUMMY_START + 186) // F0BA +#define DUMMY_NPC_HOUSE_182 (DUMMY_START + 187) // F0BB +#define DUMMY_NPC_HOUSE_183 (DUMMY_START + 188) // F0BC +#define DUMMY_NPC_HOUSE_184 (DUMMY_START + 189) // F0BD +#define DUMMY_NPC_HOUSE_185 (DUMMY_START + 190) // F0BE +#define DUMMY_NPC_HOUSE_186 (DUMMY_START + 191) // F0BF +#define DUMMY_NPC_HOUSE_187 (DUMMY_START + 192) // F0C0 +#define DUMMY_NPC_HOUSE_188 (DUMMY_START + 193) // F0C1 +#define DUMMY_NPC_HOUSE_189 (DUMMY_START + 194) // F0C2 +#define DUMMY_NPC_HOUSE_190 (DUMMY_START + 195) // F0C3 +#define DUMMY_NPC_HOUSE_191 (DUMMY_START + 196) // F0C4 +#define DUMMY_NPC_HOUSE_192 (DUMMY_START + 197) // F0C5 +#define DUMMY_NPC_HOUSE_193 (DUMMY_START + 198) // F0C6 +#define DUMMY_NPC_HOUSE_194 (DUMMY_START + 199) // F0C7 +#define DUMMY_NPC_HOUSE_195 (DUMMY_START + 200) // F0C8 +#define DUMMY_NPC_HOUSE_196 (DUMMY_START + 201) // F0C9 +#define DUMMY_NPC_HOUSE_197 (DUMMY_START + 202) // F0CA +#define DUMMY_NPC_HOUSE_198 (DUMMY_START + 203) // F0CB +#define DUMMY_NPC_HOUSE_199 (DUMMY_START + 204) // F0CC +#define DUMMY_NPC_HOUSE_200 (DUMMY_START + 205) // F0CD +#define DUMMY_NPC_HOUSE_201 (DUMMY_START + 206) // F0CE +#define DUMMY_NPC_HOUSE_202 (DUMMY_START + 207) // F0CF +#define DUMMY_NPC_HOUSE_203 (DUMMY_START + 208) // F0D0 +#define DUMMY_NPC_HOUSE_204 (DUMMY_START + 209) // F0D1 +#define DUMMY_NPC_HOUSE_205 (DUMMY_START + 210) // F0D2 +#define DUMMY_NPC_HOUSE_206 (DUMMY_START + 211) // F0D3 +#define DUMMY_NPC_HOUSE_207 (DUMMY_START + 212) // F0D4 +#define DUMMY_NPC_HOUSE_208 (DUMMY_START + 213) // F0D5 +#define DUMMY_NPC_HOUSE_209 (DUMMY_START + 214) // F0D6 +#define DUMMY_NPC_HOUSE_210 (DUMMY_START + 215) // F0D7 +#define DUMMY_NPC_HOUSE_211 (DUMMY_START + 216) // F0D8 +#define DUMMY_NPC_HOUSE_212 (DUMMY_START + 217) // F0D9 +#define DUMMY_NPC_HOUSE_213 (DUMMY_START + 218) // F0DA +#define DUMMY_NPC_HOUSE_214 (DUMMY_START + 219) // F0DB +#define DUMMY_NPC_HOUSE_215 (DUMMY_START + 220) // F0DC +#define DUMMY_NPC_HOUSE_216 (DUMMY_START + 221) // F0DD +#define DUMMY_NPC_HOUSE_217 (DUMMY_START + 222) // F0DE +#define DUMMY_NPC_HOUSE_218 (DUMMY_START + 223) // F0DF +#define DUMMY_NPC_HOUSE_219 (DUMMY_START + 224) // F0E0 +#define DUMMY_NPC_HOUSE_220 (DUMMY_START + 225) // F0E1 +#define DUMMY_NPC_HOUSE_221 (DUMMY_START + 226) // F0E2 +#define DUMMY_NPC_HOUSE_222 (DUMMY_START + 227) // F0E3 +#define DUMMY_NPC_HOUSE_223 (DUMMY_START + 228) // F0E4 +#define DUMMY_NPC_HOUSE_224 (DUMMY_START + 229) // F0E5 +#define DUMMY_NPC_HOUSE_225 (DUMMY_START + 230) // F0E6 +#define DUMMY_NPC_HOUSE_226 (DUMMY_START + 231) // F0E7 +#define DUMMY_NPC_HOUSE_227 (DUMMY_START + 232) // F0E8 +#define DUMMY_NPC_HOUSE_228 (DUMMY_START + 233) // F0E9 +#define DUMMY_NPC_HOUSE_229 (DUMMY_START + 234) // F0EA +#define DUMMY_NPC_HOUSE_230 (DUMMY_START + 235) // F0EB +#define DUMMY_NPC_HOUSE_231 (DUMMY_START + 236) // F0EC +#define DUMMY_NPC_HOUSE_232 (DUMMY_START + 237) // F0ED +#define DUMMY_NPC_HOUSE_233 (DUMMY_START + 238) // F0EE +#define DUMMY_NPC_HOUSE_234 (DUMMY_START + 239) // F0EF +#define DUMMY_NPC_HOUSE_235 (DUMMY_START + 240) // F0F0 +#define DUMMY_NPC_HOUSE_236 (DUMMY_START + 241) // F0F1 +#define DUMMY_NPC_HOUSE_237 (DUMMY_START + 242) // F0F2 #define DUMMY_HOUSE0 0xF0F3 #define DUMMY_HOUSE1 0xF0F4 #define DUMMY_HOUSE2 0xF0F5 diff --git a/src/actor/ac_house.c b/src/actor/ac_house.c new file mode 100644 index 00000000..5ccc8c51 --- /dev/null +++ b/src/actor/ac_house.c @@ -0,0 +1,252 @@ +#include "ac_house.h" + +#include "m_common_data.h" +#include "m_player_lib.h" +#include "m_bgm.h" +#include "sys_matrix.h" +#include "m_rcp.h" +#include "m_debug.h" + +enum { + aHUS_ACTION_WAIT, + aHUS_ACTION_OPEN_DOOR_WAIT, + aHUS_ACTION_OPEN_DOOR, + aHUS_ACTION_NEXT_SCENE_WAIT, + + aHUS_ACTION_NUM +}; + +enum { + aHUS_MSG_NONE, + aHUS_MSG_AWAY, + aHUS_MSG_SLEEP, + + aHUS_MSG_NUM +}; + +enum { + aHUS_REQUEST_NPC_CLOSE_DOOR, + aHUS_REQUEST_NPC_OPEN_DOOR, + aHUS_REQUEST_PLAYER_ENTER, + aHUS_REQUEST_PLAYER_LEAVE, + + aHUS_REQUEST_NUM +}; + +#define aHUS_GET_LOOKS(h) ((h)->arg0) +#define aHUS_GET_ANIMAL_P(h) ((Animal_c*)(h)->arg1) +#define aHUS_GET_ANIMAL_IDX(h) ((h)->arg2) +#define aHUS_GET_LIGHT_PERCENT(h) ((h)->arg1_f) + +#define aHUS_SET_LOOKS(h, v) ((h)->arg0 = (v)) +#define aHUS_SET_ANIMAL_P(h, v) ((h)->arg1 = (int)(v)) +#define aHUS_SET_ANIMAL_IDX(h, v) ((h)->arg2 = (v)) +#define aHUS_SET_LIGHT_PERCENT(h, v) ((h)->arg1_f = (v)) + +static void aHUS_actor_ct(ACTOR* actorx, GAME* game); +static void aHUS_actor_dt(ACTOR* actorx, GAME* game); +static void aHUS_actor_init(ACTOR* actorx, GAME* game); +static void aHUS_actor_move(ACTOR* actorx, GAME* game); +static void aHUS_actor_draw(ACTOR* actorx, GAME* game); + +// clang-format off +ACTOR_PROFILE House_Profile = { + mAc_PROFILE_HOUSE, + ACTOR_PART_ITEM, + ACTOR_STATE_NONE, + NPC_HOUSE_START, + ACTOR_OBJ_BANK_KEEP, + sizeof(HOUSE_ACTOR), + &aHUS_actor_ct, + &aHUS_actor_dt, + &aHUS_actor_init, + &aHUS_actor_draw, + NULL, +}; +// clang-format on + +static void aHUS_setup_animation(HOUSE_ACTOR* house, f32 speed); +static void aHUS_setup_action(HOUSE_ACTOR* house, int action); +static void change_FGUnit(ACTOR* actorx, int keep_flag); +static void aHUS_set_bgOffset(ACTOR* actorx, int idx); +static f32 aHUS_ctrl_light(HOUSE_ACTOR* house); + +extern Vtx obj_house1_shadow_v[]; +extern Gfx obj_house1_shadow_model[]; + +extern Vtx obj_s_house2_shadow_v[]; +extern Gfx obj_s_house2_shadow_model[]; + +extern Vtx obj_s_house3_shadow_v[]; +extern Gfx obj_s_house3_shadow_model[]; + +extern Vtx obj_s_house4_shadow_v[]; +extern Gfx obj_s_house4_shadow_model[]; + +extern Vtx obj_s_house5_shadow_v[]; +extern Gfx obj_s_house5_shadow_model[]; + +// clang-format off +static u8 aHUS_shadow_vtx_fix_flg_table0[] = { + TRUE, FALSE, FALSE, TRUE, + FALSE, TRUE, TRUE, FALSE, + FALSE, TRUE, TRUE, FALSE, + TRUE, FALSE, FALSE, TRUE, + FALSE, TRUE, FALSE, TRUE, +}; +// clang-format on + +// clang-format off +static u8 aHUS_shadow_vtx_fix_flg_table1[] = { + TRUE, FALSE, FALSE, TRUE, + FALSE, TRUE, FALSE, TRUE, + TRUE, FALSE, FALSE, TRUE, + TRUE, FALSE, FALSE, TRUE, + TRUE, FALSE, FALSE, TRUE, + FALSE, TRUE, TRUE, FALSE, + TRUE, FALSE, FALSE, TRUE, +}; +// clang-format on + +// clang-format off +static u8 aHUS_shadow_vtx_fix_flg_table2[] = { + TRUE, FALSE, FALSE, TRUE, + FALSE, TRUE, FALSE, TRUE, + TRUE, FALSE, FALSE, TRUE, + TRUE, FALSE, FALSE, TRUE, + TRUE, FALSE, FALSE, TRUE, + FALSE, TRUE, TRUE, FALSE, +}; +// clang-format on + +static bIT_ShadowData_c aHUS_shadow_data0 = { + ARRAY_COUNT(aHUS_shadow_vtx_fix_flg_table0), + aHUS_shadow_vtx_fix_flg_table0, + 60.0f, + obj_house1_shadow_v, + obj_house1_shadow_model, +}; + +static bIT_ShadowData_c aHUS_shadow_data1 = { + ARRAY_COUNT(aHUS_shadow_vtx_fix_flg_table1), + aHUS_shadow_vtx_fix_flg_table1, + 60.0f, + obj_s_house2_shadow_v, + obj_s_house2_shadow_model, +}; + +static bIT_ShadowData_c aHUS_shadow_data2 = { + ARRAY_COUNT(aHUS_shadow_vtx_fix_flg_table2), + aHUS_shadow_vtx_fix_flg_table2, + 60.0f, + obj_s_house3_shadow_v, + obj_s_house3_shadow_model, +}; + +static bIT_ShadowData_c aHUS_shadow_data3 = { + ARRAY_COUNT(aHUS_shadow_vtx_fix_flg_table1), + aHUS_shadow_vtx_fix_flg_table1, + 60.0f, + obj_s_house4_shadow_v, + obj_s_house4_shadow_model, +}; + +static bIT_ShadowData_c aHUS_shadow_data4 = { + ARRAY_COUNT(aHUS_shadow_vtx_fix_flg_table1), + aHUS_shadow_vtx_fix_flg_table1, + 60.0f, + obj_s_house5_shadow_v, + obj_s_house5_shadow_model, +}; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_house1; +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_house2; +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_house3; +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_house4; +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_house5; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_house1; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_house2; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_house3; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_house4; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_house5; + +// clang-format off +static cKF_Skeleton_R_c* aHUS_house_model_normal[] = { + &cKF_bs_r_obj_s_house1, + &cKF_bs_r_obj_s_house2, + &cKF_bs_r_obj_s_house3, + &cKF_bs_r_obj_s_house4, + &cKF_bs_r_obj_s_house5, +}; +// clang-format on + +// clang-format off +static cKF_Skeleton_R_c* aHUS_house_model_winter[] = { + &cKF_bs_r_obj_w_house1, + &cKF_bs_r_obj_w_house2, + &cKF_bs_r_obj_w_house3, + &cKF_bs_r_obj_w_house4, + &cKF_bs_r_obj_w_house5, +}; +// clang-format on + +static cKF_Skeleton_R_c** aHUS_house_model[] = { aHUS_house_model_normal, aHUS_house_model_winter }; + +// clang-format off +static bIT_ShadowData_c* aHUS_shadow_data[] = { + &aHUS_shadow_data0, + &aHUS_shadow_data1, + &aHUS_shadow_data2, + &aHUS_shadow_data3, + &aHUS_shadow_data4, +}; +// clang-format on + +static void aHUS_actor_ct(ACTOR* actorx, GAME* game) { + HOUSE_ACTOR* house = (HOUSE_ACTOR*)actorx; + int season; + s16 shape; + s16 pal; + int idx = mNpc_SearchAnimalinfo(Save_Get(animals), NPC_START + (actorx->npc_id - NPC_HOUSE_START), ANIMAL_NUM_MAX); + + if (idx >= 0) { + aHUS_SET_LOOKS(house, mNpc_GetLooks(Common_Get(npclist[idx]).name)); + aHUS_SET_ANIMAL_P(house, Save_GetPointer(animals[idx])); + aHUS_SET_ANIMAL_IDX(house, idx); + house->season = Common_Get(time.season); + season = house->season == mTM_SEASON_WINTER; + shape = Common_Get(npclist[idx]).house_data.type; + pal = Common_Get(npclist[idx]).house_data.palette; + house->structure_type = aSTR_TYPE_HOUSE1 + shape; + house->structure_pal = aSTR_PAL_HOUSE1_A + (s16)(pal + (shape * 5)); + } else { + aHUS_SET_LOOKS(house, mNpc_LOOKS_GIRL); + aHUS_SET_ANIMAL_P(house, Save_GetPointer(animals[0])); + aHUS_SET_ANIMAL_IDX(house, 0); + house->season = Common_Get(time.season); + shape = 0; + pal = 0; + season = house->season == mTM_SEASON_WINTER; + house->structure_type = aSTR_TYPE_HOUSE1; + house->structure_pal = aSTR_PAL_HOUSE1_A; + } + + cKF_SkeletonInfo_R_ct(&house->keyframe, aHUS_house_model[season][shape], NULL, house->work_area, house->morph_area); + aHUS_set_bgOffset(actorx, 1); + change_FGUnit(actorx, TRUE); + aHUS_setup_action(house, aHUS_ACTION_WAIT); + aHUS_setup_animation(house, 0.0f); + cKF_SkeletonInfo_R_play(&house->keyframe); + aHUS_SET_LIGHT_PERCENT(house, aHUS_ctrl_light(house)); +} + +static void aHUS_actor_dt(ACTOR* actorx, GAME* game) { + HOUSE_ACTOR* house = (HOUSE_ACTOR*)actorx; + + change_FGUnit(actorx, FALSE); + cKF_SkeletonInfo_R_dt(&house->keyframe); +} + +#include "../src/actor/ac_house_move.c_inc" +#include "../src/actor/ac_house_draw.c_inc" diff --git a/src/actor/ac_house_draw.c_inc b/src/actor/ac_house_draw.c_inc new file mode 100644 index 00000000..4d9eec0e --- /dev/null +++ b/src/actor/ac_house_draw.c_inc @@ -0,0 +1,281 @@ +extern Gfx obj_s_shop2_window_model[]; +extern Gfx obj_w_shop2_window_model[]; + +static int aHUS_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) { + HOUSE_ACTOR* house; + GRAPH* graph; + int b; + int rg; + + house = (HOUSE_ACTOR*)arg; + graph = game->graph; + + if (joint_idx == 1 || joint_idx == 3) { + OPEN_POLY_OPA_DISP(graph); + + b = 0.5f + (150 * aHUS_GET_LIGHT_PERCENT(house)); + rg = 0.5f + (255 * aHUS_GET_LIGHT_PERCENT(house)); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, rg, rg, b, 255); + + CLOSE_POLY_OPA_DISP(graph); + } + + if (joint_idx == 7) { + *joint_shape = NULL; + } + + return TRUE; +} + +extern Gfx obj_s_house1_windowL_model[]; +extern Gfx obj_s_house1_windowR_model[]; + +extern Gfx obj_s_house2_window_model[]; + +extern Gfx obj_s_house3_windowL_model[]; +extern Gfx obj_s_house3_windowR_model[]; + +extern Gfx obj_s_house4_windowL_model[]; +extern Gfx obj_s_house4_windowR_model[]; + +extern Gfx obj_s_house5_windowL_model[]; +extern Gfx obj_s_house5_windowR_model[]; + +extern Gfx obj_w_house1_windowL_model[]; +extern Gfx obj_w_house1_windowR_model[]; + +extern Gfx obj_w_house2_window_model[]; + +extern Gfx obj_w_house3_windowL_model[]; +extern Gfx obj_w_house3_windowR_model[]; + +extern Gfx obj_w_house4_windowL_model[]; +extern Gfx obj_w_house4_windowR_model[]; + +extern Gfx obj_w_house5_windowL_model[]; +extern Gfx obj_w_house5_windowR_model[]; + +static int aHUS_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* window_model_table[][2][2] = { + { + { obj_s_house1_windowL_model, obj_s_house1_windowR_model }, + { obj_w_house1_windowL_model, obj_w_house1_windowR_model }, + }, + { + { obj_s_house2_window_model, NULL }, + { obj_w_house2_window_model, NULL }, + }, + { + { obj_s_house3_windowL_model, obj_s_house3_windowR_model }, + { obj_w_house3_windowL_model, obj_w_house3_windowR_model }, + }, + { + { obj_s_house4_windowL_model, obj_s_house4_windowR_model }, + { obj_w_house4_windowL_model, obj_w_house4_windowR_model }, + }, + { + { obj_s_house5_windowL_model, obj_s_house5_windowR_model }, + { obj_w_house5_windowL_model, obj_w_house5_windowR_model }, + }, + }; + + static xyz_t window_light_offset_table[] = { { -100.0f, 0.0f, 0.0f }, { 100.0f, 0.0f, 0.0f } }; + + GRAPH* graph; + HOUSE_ACTOR* house; + u16* pal_p; + int season; + int type; + int l; + int r; + int g; + int b; + Mtx* mtx; + xyz_t posR; + xyz_t posL; + int mod_l; + + house = (HOUSE_ACTOR*)arg; + graph = game->graph; + + if (joint_idx == 7) { + mtx = _Matrix_to_Mtx_new(graph); + if (mtx != NULL) { + if (aHUS_GET_LIGHT_PERCENT(house) > 0.0f) { + l = aHUS_GET_LIGHT_PERCENT(house) * 120.0f + 0.5f; + r = 255; + g = 255; + b = 150; + } else { + l = 0; + r = 0; + g = 0; + b = 0; + } + + pal_p = CLIP(structure_clip)->get_pal_segment_proc(house->structure_pal); + type = house->structure_type; + season = house->season == mTM_SEASON_WINTER; + + _texture_z_light_fog_prim_shadow(graph); + + OPEN_SHADOW_DISP(graph); + + gSPSegment(SHADOW_DISP++, ANIME_1_TXT_SEG, pal_p); + gDPSetPrimColor(SHADOW_DISP++, 0, l, r, g, b, 0); + gSPMatrix(SHADOW_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + // @cleanup - why check this so late? we already deferenced house multiple times + if (house != NULL) { + posL.x = house->actor_class.world.position.x + window_light_offset_table[0].x; + posL.y = house->actor_class.world.position.y + window_light_offset_table[0].y; + posL.z = house->actor_class.world.position.z + window_light_offset_table[0].z; + mCoBG_GetBgY_AngleS_FromWpos(NULL, posL, 0.0f); // @cleanup - leftover call? completely unused, waste of cycles + + posR.x = house->actor_class.world.position.x + window_light_offset_table[1].x; + posR.y = house->actor_class.world.position.y + window_light_offset_table[1].y; + posR.z = house->actor_class.world.position.z + window_light_offset_table[1].z; + mCoBG_GetBgY_AngleS_FromWpos(NULL, posR, 0.0f); // @cleanup - leftover call? completely unused, waste of cycles + + mod_l = REGADDR(mREG, 10) + l; + gDPSetPrimColor(SHADOW_DISP++, 0, mod_l, r, g, b, 0); + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x40 | 0x10); + + if (REGADDR(mREG, 13) == 5) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH); + } else if (REGADDR(mREG, 13) == 1) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x10); + } else if (REGADDR(mREG, 13) == 2) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH); + } else if (REGADDR(mREG, 13) == 3) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x40 | 0x10); + } else if (REGADDR(mREG, 13) == 4) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x40); + } + + if (REGADDR(mREG, 13) >= 0) { + if (window_model_table[type][season][1] != NULL) { + gSPDisplayList(SHADOW_DISP++, window_model_table[type][season][1]); + } + + gSPDisplayList(SHADOW_DISP++, window_model_table[type][season][0]); + } + + mod_l = REGADDR(mREG, 11) + l; + gDPSetPrimColor(SHADOW_DISP++, 0, mod_l, r, g, b, 0); + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x40); + + if (REGADDR(mREG, 15) == 5) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH); + } else if (REGADDR(mREG, 15) == 1) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x10); + } else if (REGADDR(mREG, 15) == 2) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH); + } else if (REGADDR(mREG, 15) == 3) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x40 | 0x10); + } else if (REGADDR(mREG, 15) == 4) { + gSPLoadGeometryMode(SHADOW_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH | 0x40); + } + + if (REGADDR(mREG, 15) >= 0) { + if (window_model_table[type][season][1] != NULL) { + gSPDisplayList(SHADOW_DISP++, window_model_table[type][season][1]); + } + + gSPDisplayList(SHADOW_DISP++, window_model_table[type][season][0]); + } + + gSPClearGeometryMode(SHADOW_DISP++, 0x40 | 0x10); + } + + CLOSE_SHADOW_DISP(graph); + } + } + + return TRUE; +} + +static void aHUS_actor_draw_ta_set(ACTOR* actorx, GAME* game) { + // clang-format off + static u8 edge_alpha[][2] = { + { 64, 64 }, + { 91, 91 }, + { 63, 3 }, + { 92, 92 }, + { 48, 48 }, + }; + // clang-format on + // clang-format off + static int adjust_mode[][2] = { + { G_TA_DOLPHIN, G_TA_DOLPHIN }, + { G_TA_N64, G_TA_N64 }, + { G_TA_DOLPHIN, G_TA_N64 }, + { G_TA_DOLPHIN, G_TA_DOLPHIN }, + { G_TA_DOLPHIN, G_TA_DOLPHIN }, + }; + // clang-format on + + GRAPH* graph = game->graph; + HOUSE_ACTOR* house = (HOUSE_ACTOR*)actorx; + int type = house->structure_type; + int season = house->season == mTM_SEASON_WINTER; + u8 a = GETREG(MYKREG, 1) + edge_alpha[type][season]; + int adjust = adjust_mode[type][season]; + + OPEN_DISP(graph); + + gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, adjust); + gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, adjust); + gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, a); + gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, a); + + CLOSE_DISP(graph); +} + +static void aHUS_actor_draw_ta_clr(ACTOR* actorx, 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); +} + +static void aHUS_actor_draw(ACTOR* actorx, GAME* game) { + GRAPH* graph; + cKF_SkeletonInfo_R_c* keyframe; + Mtx* mtx; + u16* pal; + HOUSE_ACTOR* house; + + graph = game->graph; + house = (HOUSE_ACTOR*)actorx; + keyframe = &house->keyframe; + + mtx = GRAPH_ALLOC_TYPE(graph, Mtx, (u32)keyframe->skeleton->num_shown_joints); + if (mtx == NULL) { + return; + } + + aHUS_actor_draw_ta_set(actorx, game); + pal = Common_Get(clip).structure_clip->get_pal_segment_proc(house->structure_pal); + + _texture_z_light_fog_prim_npc(graph); + + OPEN_POLY_OPA_DISP(graph); + + gSPSegment(POLY_OPA_DISP++, ANIME_1_TXT_SEG, pal); + + CLOSE_POLY_OPA_DISP(graph); + + cKF_Si3_draw_R_SV(game, keyframe, mtx, &aHUS_actor_draw_before, &aHUS_actor_draw_after, actorx); + + CLIP(bg_item_clip)->draw_shadow_proc(game, aHUS_shadow_data[house->structure_type], TRUE); + aHUS_actor_draw_ta_clr(actorx, game); +} diff --git a/src/actor/ac_house_move.c_inc b/src/actor/ac_house_move.c_inc new file mode 100644 index 00000000..4957ed57 --- /dev/null +++ b/src/actor/ac_house_move.c_inc @@ -0,0 +1,485 @@ +static void aHUS_set_door_SE_sub(ACTOR* actorx, u16 se_no) { + sAdo_OngenTrgStart(se_no, &actorx->world.position); +} + +static void change_FGUnit(ACTOR* actorx, int keep_flag) { + mActor_name_t* fg_p; + mActor_name_t item; + xyz_t pos; + + xyz_t_move(&pos, &actorx->world.position); + pos.z += 2 * mFI_UT_WORLDSIZE_Z_F; + + if (keep_flag == FALSE) { + mFI_SetFG_common(EMPTY_NO, pos, TRUE); + } else { + fg_p = mFI_GetUnitFG(pos); + + if (fg_p != NULL) { + if (!mSN_ClearSnowman(fg_p)) { + item = *fg_p; + + if ((ITEM_IS_BURIED_PITFALL_HOLE(item) || item == SHINE_SPOT) == TRUE) { + item = bg_item_fg_sub_dig2take_conv(item); + mPB_keep_item(item); + mFI_SetFG_common(RSV_NO, pos, TRUE); + mFI_Wpos2DepositOFF(pos); + } else { + mFI_Wpos2DepositOFF(pos); + mPB_keep_item(*fg_p); + mFI_SetFG_common(RSV_NO, pos, TRUE); + } + } else { + mFI_SetFG_common(RSV_NO, pos, TRUE); + } + } + } +} + +static void aHUS_set_doorSE(HOUSE_ACTOR* house) { + static f32 chk_pat_in[] = { 10.0f, 14.0f, 35.0f, 50.0f }; + static f32 chk_pat_out[] = { 2.0f, 8.0f, 33.0f, 40.0f }; + static u16 se_no[] = { NA_SE_6, NA_SE_7, NA_SE_8, NA_SE_9 }; + + f32* chk_pat_p; + int i; + + switch (house->request_type) { + case aHUS_REQUEST_NPC_OPEN_DOOR: + case aHUS_REQUEST_PLAYER_LEAVE: + chk_pat_p = chk_pat_in; + break; + // case aHUS_REQUEST_NPC_CLOSE_DOOR: + case aHUS_REQUEST_PLAYER_ENTER: + default: + chk_pat_p = chk_pat_out; + break; + } + + for (i = 0; i < 4; i++) { + if (cKF_FrameControl_passCheck_now(&house->keyframe.frame_control, *chk_pat_p)) { + aHUS_set_door_SE_sub((ACTOR*)house, se_no[i]); + break; + } + + chk_pat_p++; + } +} + +// clang-format off +static Door_data_c aHUS_npc_house_door_data = { + SCENE_NPC_HOUSE, + mSc_DIRECT_NORTH, + 0, + 0, + { 160, 0, 300 }, + EMPTY_NO, + 1, + { 0, 0, 0 }, +}; +// clang-format on + +static int aHUS_odekake_check(HOUSE_ACTOR* house, GAME_PLAY* play) { + Animal_c* animal_p; + int ret; + int idx; + ACTOR* npc_actor_p; + int status; + int goal; + mActor_name_t name; + + animal_p = aHUS_GET_ANIMAL_P(house); + idx = aHUS_GET_ANIMAL_IDX(house); + ret = FALSE; + house->arg0_f = 0.0f; + name = Common_Get(npclist[idx]).name; + npc_actor_p = Actor_info_fgName_search(&play->actor_info, Common_Get(npclist[idx]).name, ACTOR_PART_NPC); + + if (mEvNM_CheckJointEvent(name)) { + house->arg0_f = 1.0f; + ret = TRUE; + } else if (mNpc_CheckNpcExistBlock(idx, play->block_table.block_x, play->block_table.block_z) && npc_actor_p != NULL) { + if (animal_p->is_home == TRUE) { + if (house->arg3 == 2) { + house->arg0_f = 2.0f; + ret = TRUE; + } + } else if (mNpcW_GetWalkInfoStatusGoalAnimalIdx(&status, &goal, idx) && status == mNpcW_INFO_STATUS_WALKING && goal == mNpcW_GOAL_MY_HOME && !animal_p->is_home) { + house->arg0_f = 1.0f; + ret = TRUE; + } + } else { + if (animal_p->is_home == TRUE) { + if (house->arg3 == 2) { + house->arg0_f = 2.0f; + ret = TRUE; + } + } else { + house->arg0_f = 1.0f; + ret = TRUE; + } + } + + return ret; +} + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house1; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house1; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house2; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house2; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house3; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house3; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house4; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house4; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house5; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house5; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house1_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house1_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house2_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house2_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house3_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house3_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house4_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house4_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_house5_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_house5_out; + +static void aHUS_setup_animation(HOUSE_ACTOR* house, f32 speed) { + static cKF_Animation_R_c* animation[][5][2] = { + { + { &cKF_ba_r_obj_s_house1, &cKF_ba_r_obj_w_house1 }, + { &cKF_ba_r_obj_s_house2, &cKF_ba_r_obj_w_house2 }, + { &cKF_ba_r_obj_s_house3, &cKF_ba_r_obj_w_house3 }, + { &cKF_ba_r_obj_s_house4, &cKF_ba_r_obj_w_house4 }, + { &cKF_ba_r_obj_s_house5, &cKF_ba_r_obj_w_house5 }, + }, + { + { &cKF_ba_r_obj_s_house1_out, &cKF_ba_r_obj_w_house1_out }, + { &cKF_ba_r_obj_s_house2_out, &cKF_ba_r_obj_w_house2_out }, + { &cKF_ba_r_obj_s_house3_out, &cKF_ba_r_obj_w_house3_out }, + { &cKF_ba_r_obj_s_house4_out, &cKF_ba_r_obj_w_house4_out }, + { &cKF_ba_r_obj_s_house5_out, &cKF_ba_r_obj_w_house5_out }, + }, + }; + + static f32 start_idx[] = { 1.0f, 25.0f, 1.0f, 1.0f }; + static f32 end_idx[] = { 51.0f, 51.0f, 51.0f, 51.0f }; + int type; + cKF_Animation_R_c* anim_p; + int season; + f32 start; + f32 end; + + season = house->season == mTM_SEASON_WINTER; + switch (house->request_type) { + case aHUS_REQUEST_PLAYER_ENTER: + type = 2; + break; + case aHUS_REQUEST_NUM: + type = 1; + break; // what would trigger this?? + default: + type = 0; + break; + } + + anim_p = animation[type != 0][house->structure_type - aSTR_TYPE_HOUSE1][season]; + start = start_idx[type]; + end = end_idx[type]; + + cKF_SkeletonInfo_R_init(&house->keyframe, house->keyframe.skeleton, anim_p, start, end, start, speed, 0.0f, cKF_FRAMECONTROL_STOP, NULL); +} + +static void aHUS_rewrite_out_data(HOUSE_ACTOR* house, GAME_PLAY* play) { + Door_data_c* out_data_p = Common_GetPointer(structure_exit_door_data); + mActor_name_t name; + xyz_t pos; + + if (play->fb_wipe_mode == 0) { + name = NPC_START + (house->actor_class.npc_id - NPC_HOUSE_START); + if (mNpc_SearchAnimalinfo(Save_Get(animals), name, ANIMAL_NUM_MAX) == -1) { + name = RSV_NO; + } + Common_Set(house_owner_name, name); + + out_data_p->next_scene_id = Save_Get(scene_no); + out_data_p->exit_orientation = mSc_DIRECT_SOUTH; + out_data_p->exit_type = 0; + out_data_p->extra_data = 2; + + pos.x = house->actor_class.home.position.x; + pos.z = house->actor_class.home.position.z + 60.0f; + pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f); + + out_data_p->exit_position.x = (s16)pos.x; + out_data_p->exit_position.y = (s16)pos.y; + out_data_p->exit_position.z = (s16)pos.z; + out_data_p->door_actor_name = house->actor_class.npc_id; + out_data_p->wipe_type = 1; + } +} + +static void aHUS_set_talk_info_check_player(ACTOR* actorx) { + HOUSE_ACTOR* house = (HOUSE_ACTOR*)actorx; + rgba_t window_color; + int msg_no; + + if (house->arg0_f == 2.0f) { + msg_no = 0x1363 + aHUS_GET_LOOKS(house); // Sleeping + } else { + msg_no = 0x2AFE; // I'm not in right now. + } + + mDemo_Set_msg_num(msg_no); + mDemo_Set_talk_display_name(FALSE); + mDemo_Set_camera(CAMERA2_PROCESS_NORMAL); + mPlib_Set_able_hand_all_item_in_demo(mPlayer_ABLE_ITEM_CAN_USE_UMBRELLA); + mDemo_Set_ListenAble(); + + window_color.r = 145; + window_color.g = 60; + window_color.b = 40; + window_color.a = 255; + mDemo_Set_talk_window_color(&window_color); +} + +static int aHUS_check_player(HOUSE_ACTOR* house, GAME_PLAY* play) { + int ret = 0; + PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play); + mNPS_schedule_c* sched_p; + Animal_c* animal_p; + mActor_name_t name; + + if (player == NULL) { + return 0; + } + + name = house->actor_class.npc_id; + name = name - NPC_HOUSE_START + DUMMY_NPC_HOUSE_000; + if ((mActor_name_t)player->item_in_front == name && chkTrigger(BUTTON_A)) { + if ((mEv_CheckFirstJob() == TRUE || mEv_check_status(mEv_EVENT_HALLOWEEN, mEv_STATUS_ACTIVE)) == TRUE) { + house->arg3 = 0; + } else { + animal_p = aHUS_GET_ANIMAL_P(house); + sched_p = mNPS_get_schedule_area(&animal_p->id); + house->arg3 = sched_p->current_type; + } + + if (aHUS_odekake_check(house, play)) { + mDemo_Request(mDemo_TYPE_SPEAK, (ACTOR*)house, &aHUS_set_talk_info_check_player); + } else { + ret = 2; + } + } + + return ret; +} + +static void aHUS_open_door_demo_ct(ACTOR* actorx) { + mDemo_Set_house_info(mFI_UNIT_BASE_SIZE_F, mDemo_DIRECT_S); + mDemo_Set_camera(CAMERA2_PROCESS_DOOR); +} + +static int aHUS_check_open(HOUSE_ACTOR* house, GAME_PLAY* play) { + int ret = 0; + int request; + + if (mDemo_Check(mDemo_TYPE_DOOR, (ACTOR*)house)) { + return 2; + } else { + request = house->request_type; + + if (request == 0) { + if (aHUS_check_player(house, play) == 2) { + mDemo_Request(mDemo_TYPE_DOOR, (ACTOR*)house, &aHUS_open_door_demo_ct); + } + + ret = 0; + } else if (request == 1 || request == 2) { + ret = 1; + } else if (request == 3) { + ret = 2; + } else if (request == 4) { + ret = 3; + } + } + + return ret; +} + +static void aHUS_set_bgOffset(ACTOR* actorx, int idx) { + // clang-format off + static mCoBG_OffsetTable_c height_table_ct[] = { + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 0, 0, 0, 0, 0, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + { mCoBG_ATTRIBUTE_NONE, 7, 7, 7, 7, 7, 0 }, + }; + // clang-format on + static mCoBG_OffsetTable_c* height_table[] = { height_table_ct, height_table_ct }; + static f32 addX[] = { -mFI_UT_WORLDSIZE_X_F, 0.0f, mFI_UT_WORLDSIZE_X_F }; + static f32 addZ[] = { mFI_UT_WORLDSIZE_Z_F, 0.0f, -mFI_UT_WORLDSIZE_Z_F }; + mCoBG_OffsetTable_c* ofs_p = height_table[idx]; + xyz_t pos; + int i; + + for (i = 0; i < 3; i++) { + pos.z = actorx->home.position.z + addZ[i]; + + pos.x = actorx->home.position.x + addX[0]; + mCoBG_SetPluss5PointOffset_file(pos, ofs_p[0], __FILE__, 620); + + pos.x = actorx->home.position.x + addX[1]; + mCoBG_SetPluss5PointOffset_file(pos, ofs_p[1], __FILE__, 624); + + pos.x = actorx->home.position.x + addX[2]; + mCoBG_SetPluss5PointOffset_file(pos, ofs_p[2], __FILE__, 628); + + ofs_p += 3; + } +} + +static f32 aHUS_ctrl_light(HOUSE_ACTOR* house) { + Animal_c* animal_p = aHUS_GET_ANIMAL_P(house); + mNPS_schedule_c* sched_p = mNPS_get_schedule_area(&animal_p->id); + int now_sec = Common_Get(time.now_sec); + mActor_name_t name; + + if (sched_p == NULL) { + return 0.0f; + } + + name = Common_Get(npclist[aHUS_GET_ANIMAL_IDX(house)]).name; + if (mEvNM_CheckJointEvent(name) && !mEv_CheckArbeit()) { + return 0.0f; + } + + if (sched_p->current_type == mNPS_SCHED_IN_HOUSE && animal_p->is_home == TRUE && + (now_sec >= (18 * mTM_SECONDS_IN_HOUR) || now_sec <= (5 * mTM_SECONDS_IN_HOUR))) { + if (house->request_type == 2) { + return 0.0f; + } else { + return 1.0f; + } + } else { + return 0.0f; + } +} + +static void aHUS_wait(HOUSE_ACTOR* house, GAME_PLAY* play) { + int next_act = -1; + + switch (aHUS_check_open(house, play)) { + case 1: + next_act = aHUS_ACTION_OPEN_DOOR; + break; + case 3: + if (mPlib_check_player_outdoor_start((GAME*)play)) { + next_act = aHUS_ACTION_OPEN_DOOR; + } + break; + case 2: + next_act = aHUS_ACTION_OPEN_DOOR_WAIT; + break; + } + + if (next_act != -1) { + aHUS_setup_action(house, next_act); + } else { + return; + } + + switch (house->request_type) { + case 1: + case 2: + case 4: + aHUS_setup_animation(house, 0.5f); + break; + case 3: + break; + } +} + +static void aHUS_open_door_wait(HOUSE_ACTOR* house, GAME_PLAY* play) { + ACTOR* actorx = (ACTOR*)house; + + if (actorx == GET_PLAYER_ACTOR_NOW()->get_door_label_proc(gamePT)) { + mBGMPsComp_make_ps_wipe(0x249); + house->request_type = 3; + aHUS_setup_animation(house, 0.5f); + aHUS_setup_action(house, aHUS_ACTION_OPEN_DOOR); + } +} + +static void aHUS_open_door(HOUSE_ACTOR* house, GAME_PLAY* play) { + int next_act; + + if (cKF_SkeletonInfo_R_play(&house->keyframe) == cKF_STATE_STOPPED) { + switch (house->request_type) { + case 3: + aHUS_rewrite_out_data(house, play); + goto_other_scene(play, &aHUS_npc_house_door_data, FALSE); + play->fb_fade_type = 9; + next_act = aHUS_ACTION_NEXT_SCENE_WAIT; + mDemo_End((ACTOR*)house); + break; + case 1: + case 2: + house->actor_class.state_bitfield = House_Profile.initial_flags_state; + next_act = aHUS_ACTION_WAIT; + break; + default: + next_act = aHUS_ACTION_WAIT; + break; + } + + house->request_type = 0; + aHUS_setup_action(house, next_act); + } +} + +static void aHUS_setup_action(HOUSE_ACTOR* house, int action) { + // clang-format off + static void* process[] = { + &aHUS_wait, + &aHUS_open_door_wait, + &aHUS_open_door, + &none_proc1, + }; + // clang-format on + + house->action_proc = process[action]; +} + +static void aHUS_actor_move(ACTOR* actorx, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + HOUSE_ACTOR* house = (HOUSE_ACTOR*)actorx; + + aHUS_set_doorSE(house); + (*house->action_proc)((STRUCTURE_ACTOR*)house, play); + chase_f(&aHUS_GET_LIGHT_PERCENT(house), aHUS_ctrl_light(house), 0.019532442f); +} + +static void aHUS_actor_init(ACTOR* actorx, GAME* game) { + mActor_name_t name; + + name =actorx->npc_id; + name = name - NPC_HOUSE_START + DUMMY_NPC_HOUSE_000; + mFI_SetFG_common(name, actorx->home.position, FALSE); + aHUS_actor_move(actorx, game); + actorx->mv_proc = &aHUS_actor_move; +}