Implement & link ac_house

This commit is contained in:
Cuyler36
2024-12-01 04:51:31 -05:00
parent b5f0796fc1
commit 8dac07e97c
7 changed files with 1267 additions and 2 deletions
+1 -1
View File
@@ -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"),
+5 -1
View File
@@ -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
+5
View File
@@ -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,
+238
View File
@@ -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
+252
View File
@@ -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"
+281
View File
@@ -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);
}
+485
View File
@@ -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;
}