Merge pull request #23 from Cuyler36/m_house_m_home

Implement & link m_house.c, m_home.c
This commit is contained in:
Prakxo
2023-04-27 11:32:07 +02:00
committed by GitHub
16 changed files with 1028 additions and 120 deletions
+5
View File
@@ -4,6 +4,11 @@ m_debug_hayakawa.c:
.text: [0x803965E4, 0x803973E8]
.rodata: [0x80641D50, 0x80641D90]
.data: [0x80651328, 0x80651358]
m_home.c:
.text: [0x803B2E88, 0x803B3688]
.data: [0x806546C8, 0x80655340]
m_house.c:
.text: [0x803B3688, 0x803B3880]
m_kabu_manager.c:
.text: [0x803B5CC4, 0x803B6280]
.rodata: [0x80642480, 0x806424C0]
+3 -4
View File
@@ -18,9 +18,6 @@ extern "C" {
#define G_SETCOMBINE_TEV 0xD0
#define G_SETTILE_DOLPHIN 0xD2
#define G_OFF 0
#define G_ON 1
#define G_FIRST_CMD G_SETTEXEDGEALPHA
/* Triangle/Quad vertex bit size */
@@ -209,7 +206,7 @@ typedef struct {
unsigned int d1:3;
unsigned int Ab1:3;
unsigned int Ad1:3;
} Gsetcombine;
} Gsetcombine_new;
typedef struct {
int cmd:8; /* 0xCF */
@@ -367,6 +364,7 @@ typedef struct {
unsigned int alpha1:3;
} combiner_tev_alpha;
/*
static combiner_tev_alpha tbla[8] = {
{ 0, TEV_ALPHA_COMBINED, 0, TEV_ALPHA_ONE },
{ 0, TEV_ALPHA_TEXEL0, 0, TEV_ALPHA_TEXEL0 },
@@ -412,6 +410,7 @@ static combiner_tev_color tblc[32] = {
{ 0, TEV_ZERO, 0, TEV_ZERO, 0, TEV_ZERO, 0, TEV_ZERO },
{ 0, TEV_ZERO, 0, TEV_ZERO, 0, TEV_ZERO, 0, TEV_ZERO }
};
*/
/* New Command Macros */
#define gsDPParam2(cmd, tag, param, extra) \
+6 -6
View File
@@ -10,12 +10,12 @@ extern "C" {
/* sizeof(mCD_player_calendar_c) == 0x68 */
typedef struct calendar_player_info_s {
u32 played_days[lbRTC_MONTHS_MAX]; /* bitfield of days where 1 bit represents a day played */
u32 event_days[lbRTC_MONTHS_MAX]; /* bitfield of events where 1 bit represents an event was on that day */
u16 event_flags; /* flags for specific event days the player played on */
u16 edit; /* unsure, might have something to do with saving an edit */
lbRTC_year_t year; /* year calendar was last updated */
lbRTC_month_t month; /* month calendar was last updated */
/* 0x00 */ u32 played_days[lbRTC_MONTHS_MAX]; /* bitfield of days where 1 bit represents a day played */
/* 0x30 */ u32 event_days[lbRTC_MONTHS_MAX]; /* bitfield of events where 1 bit represents an event was on that day */
/* 0x60 */ u16 event_flags; /* flags for specific event days the player played on */
/* 0x62 */ u8 edit; /* unsure, might have something to do with saving an edit */
/* 0x64 */ lbRTC_year_t year; /* year calendar was last updated */
/* 0x66 */ lbRTC_month_t month; /* month calendar was last updated */
} mCD_player_calendar_c;
#ifdef __cplusplus
+18
View File
@@ -0,0 +1,18 @@
#ifndef M_COCKROACH_H
#define M_COCKROACH_H
#include "types.h"
#include "m_home_h.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void mCkRh_InitGokiSaveData_1Room_ByHomeData(mHm_hs_c* home);
extern void mCkRh_InitGokiSaveData_IslandPlayerRoom();
#ifdef __cplusplus
}
#endif
#endif
+12 -3
View File
@@ -6,7 +6,7 @@
#include "m_land_h.h"
#include "lb_rtc.h"
#include "m_flashrom.h"
#include "m_home.h"
#include "m_home_h.h"
#include "m_private.h"
#include "m_npc.h"
#include "m_field_make.h"
@@ -17,6 +17,7 @@
#include "m_police_box.h"
#include "m_snowman.h"
#include "m_config.h"
#include "m_island.h"
#ifdef __cplusplus
extern "C" {
@@ -77,9 +78,15 @@ typedef struct Save_s {
/* 0x0212DC */ lbRTC_time_c last_grow_time; /* last time that a new villager moved into town */
/* 0x0212E4 */ u8 _tmp4[0xAA];
/* 0x02138E */ u8 saved_rom_debug; /* flag to set save to 'debug rom' mode */
/* 0x02138F */ u8 _tmp5[0x1199];
/* 0x02138F */ u8 _tmp5[0x11];
/* 0x0213A0 */ u8 keep_house_size[PLAYER_NUM]; /* saved flags for house sizes */
/* 0x0213A4 */ u8 _tmp6[0x1184];
/* 0x022528 */ OSTime time_delta; /* time delta against GC RTC */
/* 0x022530 */ u8 _tmp6[0x3AD0];
/* 0x022530 */ u8 _tmp7[0x10];
/* 0x022540 */ Island_c island; /* island data */
/* 0x023E40 */ u8 _tmp8[0x320];
/* 0x024160 */ Anmret_c return_animal; /* information about villager which moved back in to your town after moving to someone else's town */
/* 0x02416C */ u8 _tmp9[0x1E94];
} Save_t;
typedef union save_u {
@@ -97,6 +104,8 @@ typedef struct common_data_s {
/* 0x026008 */ int player_data_mode;
/* 0x02600C */ u8 _clip[0x104]; /* Temporary, clip is a struct with size 0x104 */
/* 0x026110 */ Time_c time;
/* 0x02613C */ Private_c* now_private;
/* 0x026140 */ mHm_hs_c* now_home;
} common_data_t;
extern common_data_t common_data;
+1 -1
View File
@@ -5,7 +5,7 @@
#include "m_lib.h"
#include "graph.h"
#include "game.h"
#include "gbi_extensions.h"
#include "libforest/gbi_extensions.h"
#ifdef __cplusplus
extern "C" {
+10 -102
View File
@@ -2,6 +2,7 @@
#define M_HOME_H
#include "types.h"
#include "m_home_h.h"
#include "m_field_make.h"
#include "m_actor_type.h"
#include "m_personal_id.h"
@@ -13,109 +14,16 @@
extern "C" {
#endif
#define HOME_MAILBOX_SIZE 10
#define HANIWA_ITEM_HOLD_NUM 4
#define HANIWA_MESSAGE_LEN 128
/* sizeof(mHm_rmsz_c) == 6 */
typedef struct home_size_info_s {
/* 0x00 */ struct {
/* 0x00 */ u8 day;
/* 0x01 */ u8 month;
/* 0x02 */ u16 year;
} upgrade_order_date; /* date you ordered an upgrade, seems to be a struct */
/* 0x04 */ u8 size:3; /* current house size */
/* 0x04 */ u8 next_size:3; /* next house size when upgrade is ordered */
/* 0x04 */ u8 statue_rank:2; /* statue ranking, 0 = gold, 1 = silver, 2 = bronze, 3 = jade */
/* 0x05 */ u8 renew:1; /* refresh house size & 'outlook' palette */
/* 0x05 */ u8 statue_ordered:1; /* set when statue is ordered from Nook */
/* 0x05 */ u8 basement_ordered:1; /* set when basement has been ordered */
/* 0x05 */ u8 pad:5; /* unused? */
} mHm_rmsz_c;
/* sizeof(Haniwa_Item_c) == 8 */
typedef struct home_haniwa_item_s {
/* 0x00 */ mActor_name_t item; /* held item */
/* 0x02 */ s16 exchange_type; /* type of exchange (sale, free, trade) */
/* 0x04 */ u32 extra_data; /* trade related data */
} Haniwa_Item_c;
/* sizeof(Haniwa_c) == 0xA4 */
typedef struct home_haniwa_s {
/* 0x00 */ Haniwa_Item_c items[HANIWA_ITEM_HOLD_NUM]; /* held items */
/* 0x20 */ u8 message[HANIWA_MESSAGE_LEN]; /* message for visitors */
/* 0xA0 */ u32 bells; /* held bells from selling items */
} Haniwa_c;
/* sizeof(mHm_wf_c) == 2 */
typedef struct home_wall_floor_s {
/* 0x00 */ u8 flooring_idx;
/* 0x01 */ u8 wallpaper_idx;
} mHm_wf_c;
/* sizeof(mHm_goki_c) == 0xA */
typedef struct home_goki_s {
/* 0x00 */ lbRTC_time_c time; /* last time updated */
/* 0x08 */ u8 num; /* number of cockroaches in the house */
} mHm_goki_c;
/* sizeof(mHm_lyr_c) == 0x228 */
typedef struct home_layer_s {
/* 0x000 */ mActor_name_t items[UT_Z_NUM][UT_X_NUM]; /* Furniture item actors */
/* 0x200 */ u64 ftr_switch; /* Bitfield for controlling which furniture items are active, max of 64 */
/* 0x208 */ u32 unk_208[8]; /* Only referenced in mISL_gc_to_agb_layer */
} mHm_lyr_c;
/* sizeof(mHm_flr_c) == 0x8A8 */
typedef struct home_floor_s {
/* 0x000 */ mHm_lyr_c layer_main;
/* 0x228 */ mHm_lyr_c layer_secondary; /* Also storage layer 0 */
/* 0x450 */ mHm_lyr_c layer_storage1;
/* 0x678 */ mHm_lyr_c layer_storage2;
/* 0x8A0 */ mHm_wf_c wall_floor;
/* 0x8A2 */ TempoBeat_c tempo_beat;
/* 0x8A4 */ struct {
u8 wall_original:1; /* is wallpaper a pattern (original)? */
u8 floor_original:1; /* is flooring a pattern (original)? */
u8 bit_2_7:6; /* unused? */
} fllot_bit; /* Name exposed? by mISL_gc_to_agb_fllot_bit */
} mHm_flr_c;
/* sizeof(mHm_hs_c) == 0x26B0 */
typedef struct home_s {
/* 0x0000 */ PersonalID_c ownerID; /* owner player's ID */
/* 0x0014 */ u8 unk_14[6];
/* 0x001A */ TempoBeat_c haniwa_tempo; /* unsure about this */
/* 0x001C */ lbRTC_ymd_t hra_mark_time; /* last HRA judge date */
/* 0x0020 */ u32 hra_mark_info; /* bitfield of HRA info pulled when HRA mails letter */
/* 0x0024 */ struct {
u8 house_updated:1; /* signals HRA to re-score house */
u8 has_saved:1; /* whether or not the player has saved at this house before */
u8 hra_member:1; /* whether or not the house has been setup for HRA membership */
u8 has_basement:1; /* set when the basement is built */
u8 bit_4:1; /* unused */
u8 bit_5:1; /* unused */
u8 bit_6:1; /* unused */
u8 bit_7:1; /* unused */
} flags;
/* 0x0026 */ mHm_rmsz_c size_info; /* home size info */
/* 0x002C */ u8 outlook_pal; /* current house palette */
/* 0x002D */ u8 ordered_outlook_pal; /* house palette ordered at Nook's via upgrade */
/* 0x002E */ u8 next_outlook_pal; /* next house palette set via all other means (villager, Wisp, paint @ Nook's, ...) */
/* 0x002F */ u8 door_original; /* player design shown on door, apparently called 'original', maybe 'original design'? */
/* 0x0030 */ u8 unk_30[8]; /* unused? */
/* 0x0038 */ mHm_flr_c main_floor; /* main floor */
/* 0x08E0 */ mHm_flr_c upper_floor; /* second floor */
/* 0x1188 */ mHm_flr_c basement; /* basement floor */
/* 0x1A30 */ Mail_c mailbox[HOME_MAILBOX_SIZE]; /* mailbox */
/* 0x25D4 */ Haniwa_c haniwa; /* gyroid info */
/* 0x2678 */ mHm_goki_c goki; /* cockroach info */
/* 0x2684 */ u32 music_box[2]; /* bitfield of inserted music */
/* 0x268C */ u8 unk_286C[36]; /* unused? */
} mHm_hs_c;
extern void mHm_ClearHomeInfo(int home_no);
extern void mHm_ClearAllHomeInfo();
extern void mHm_SetNowHome();
extern void mHm_SetDefaultPlayerRoomData(int home_no);
extern void mHm_InitHomeInfo(mHm_hs_c* home, int player_no);
extern void mHm_CheckRehouseOrder();
extern int mHm_KeepHouseSize(u8 player_no);
extern int mHm_CheckKeepHouseSize(u8 player_no);
extern int mHm_SetBasement(u8 home_no);
extern void mHm_InitCottage(mHm_cottage_c* cottage);
#ifdef __cplusplus
}
+161
View File
@@ -0,0 +1,161 @@
#ifndef M_HOME_H_H
#define M_HOME_H_H
#include "types.h"
#include "m_field_make.h"
#include "m_actor_type.h"
#include "m_personal_id.h"
#include "audio.h"
#include "lb_rtc.h"
#include "m_mail.h"
#ifdef __cplusplus
extern "C" {
#endif
#define HOME_MAILBOX_SIZE 10
#define HANIWA_ITEM_HOLD_NUM 4
#define HANIWA_MESSAGE_LEN 128
enum {
mHm_ROOM_MAIN,
mHm_ROOM_UPPER,
mHm_ROOM_BASEMENT,
mHm_ROOM_NUM
};
enum {
mHm_ROOMTYPE_SMALL,
mHm_ROOMTYPE_MEDIUM,
mHm_ROOMTYPE_LARGE,
mHm_ROOMTYPE_COTTAGE,
mHm_ROOMTYPE_NUM
};
enum {
mHm_HOMESIZE_SMALL, /* initial size */
mHm_HOMESIZE_MEDIUM, /* paid off first debt */
mHm_HOMESIZE_LARGE, /* paid off second debt (excluding basement) */
mHm_HOMESIZE_UPPER, /* paid off third debt & basement */
mHm_HOMESIZE_STATUE, /* paid off final debt */
mHm_HOMESIZE_NUM
};
/* sizeof(mHm_rmsz_c) == 6 */
typedef struct home_size_info_s {
/* 0x00 */ struct {
/* 0x00 */ u8 day;
/* 0x01 */ u8 month;
/* 0x02 */ u16 year;
} upgrade_order_date; /* date you ordered an upgrade, seems to be a struct */
/* 0x04 */ u8 size:3; /* current house size */
/* 0x04 */ u8 next_size:3; /* next house size when upgrade is ordered */
/* 0x04 */ u8 statue_rank:2; /* statue ranking, 0 = gold, 1 = silver, 2 = bronze, 3 = jade */
/* 0x05 */ u8 renew:1; /* refresh house size & 'outlook' palette */
/* 0x05 */ u8 statue_ordered:1; /* set when statue is ordered from Nook */
/* 0x05 */ u8 basement_ordered:1; /* set when basement has been ordered */
/* 0x05 */ u8 pad:5; /* unused? */
} mHm_rmsz_c;
/* sizeof(Haniwa_Item_c) == 8 */
typedef struct home_haniwa_item_s {
/* 0x00 */ mActor_name_t item; /* held item */
/* 0x02 */ s16 exchange_type; /* type of exchange (sale, free, trade) */
/* 0x04 */ u32 extra_data; /* trade related data */
} Haniwa_Item_c;
/* sizeof(Haniwa_c) == 0xA4 */
typedef struct home_haniwa_s {
/* 0x00 */ Haniwa_Item_c items[HANIWA_ITEM_HOLD_NUM]; /* held items */
/* 0x20 */ u8 message[HANIWA_MESSAGE_LEN]; /* message for visitors */
/* 0xA0 */ u32 bells; /* held bells from selling items */
} Haniwa_c;
/* sizeof(mHm_wf_c) == 2 */
typedef struct home_wall_floor_s {
/* 0x00 */ u8 flooring_idx;
/* 0x01 */ u8 wallpaper_idx;
} mHm_wf_c;
/* sizeof(mHm_goki_c) == 0xA */
typedef struct home_goki_s {
/* 0x00 */ lbRTC_time_c time; /* last time updated */
/* 0x08 */ u8 num; /* number of cockroaches in the house */
} mHm_goki_c;
/* sizeof(mHm_lyr_c) == 0x228 */
typedef struct home_layer_s {
/* 0x000 */ mActor_name_t items[UT_Z_NUM][UT_X_NUM]; /* Furniture item actors */
/* 0x200 */ u64 ftr_switch; /* Bitfield for controlling which furniture items are active, max of 64 */
/* 0x208 */ u32 unk_208[8]; /* Only referenced in mISL_gc_to_agb_layer */
} mHm_lyr_c;
/* sizeof(mHm_flr_c) == 0x8A8 */
typedef struct home_floor_s {
/* 0x000 */ mHm_lyr_c layer_main;
/* 0x228 */ mHm_lyr_c layer_secondary; /* Also storage layer 0 */
/* 0x450 */ mHm_lyr_c layer_storage1;
/* 0x678 */ mHm_lyr_c layer_storage2;
/* 0x8A0 */ mHm_wf_c wall_floor;
/* 0x8A2 */ TempoBeat_c tempo_beat;
/* 0x8A4 */ struct {
u8 wall_original:1; /* is wallpaper a pattern (original)? */
u8 floor_original:1; /* is flooring a pattern (original)? */
u8 bit_2_7:6; /* unused? */
} fllot_bit; /* Name exposed? by mISL_gc_to_agb_fllot_bit */
} mHm_flr_c;
/* sizeof(mHm_flg_c) == 1 */
typedef struct home_flags_s {
u8 house_updated:1; /* signals HRA to re-score house */
u8 has_saved:1; /* whether or not the player has saved at this house before */
u8 hra_member:1; /* whether or not the house has been setup for HRA membership */
u8 has_basement:1; /* set when the basement is built */
u8 bit_4:1; /* unused */
u8 bit_5:1; /* unused */
u8 bit_6:1; /* unused */
u8 bit_7:1; /* unused */
} mHm_flg_c;
/* sizeof(mHm_hs_c) == 0x26B0 */
typedef struct home_s {
/* 0x0000 */ PersonalID_c ownerID; /* owner player's ID */
/* 0x0014 */ u8 unk_14[6];
/* 0x001A */ TempoBeat_c haniwa_tempo; /* unsure about this */
/* 0x001C */ lbRTC_ymd_t hra_mark_time; /* last HRA judge date */
/* 0x0020 */ u32 hra_mark_info; /* bitfield of HRA info pulled when HRA mails letter */
/* 0x0024 */ mHm_flg_c flags;
/* 0x0026 */ mHm_rmsz_c size_info; /* home size info */
/* 0x002C */ u8 outlook_pal; /* current house palette */
/* 0x002D */ u8 ordered_outlook_pal; /* house palette ordered at Nook's via upgrade */
/* 0x002E */ u8 next_outlook_pal; /* next house palette set via all other means (villager, Wisp, paint @ Nook's, ...) */
/* 0x002F */ u8 door_original; /* player design shown on door, apparently called 'original', maybe 'original design'? */
/* 0x0030 */ u8 unk_30[8]; /* unused? */
/* 0x0038 */ mHm_flr_c floors[mHm_ROOM_NUM]; /* house floors, might be a union idk */
/* 0x1A30 */ Mail_c mailbox[HOME_MAILBOX_SIZE]; /* mailbox */
/* 0x25D4 */ Haniwa_c haniwa; /* gyroid info */
/* 0x2678 */ mHm_goki_c goki; /* cockroach info */
/* 0x2684 */ u32 music_box[2]; /* bitfield of inserted music */
/* 0x268C */ u8 unk_286C[36]; /* unused? */
} mHm_hs_c;
/* sizeof(mHm_cottage_c) == 0x8C8 */
typedef struct home_cottage_s {
/* 0x000 */ mHm_wf_c unused_wall_floor; /* Has wallpaper & flooring bounds checks in sChk_CheckSaveData_Cattage */
/* 0x002 */ u8 unk_2[2]; /* struct/array that is two bytes long, maybe another wall floor? */
/* 0x004 */ u8 unk_4; /* direct copy in agb_to_gc_cottage, GBA only? */
/* 0x005 */ u8 unk_5; /* direct copy in agb_to_gc_cottage, GBA only? */
/* 0x008 */ mHm_flr_c room; /* Cottage room */
/* 0x8B0 */ mHm_goki_c goki; /* Cottage cockroaches */
/* 0x8BC */ u32 music_box[2]; /* Cottage music storage... separate from main home? */
} mHm_cottage_c;
#ifdef __cplusplus
}
#endif
#endif
+44
View File
@@ -0,0 +1,44 @@
#ifndef M_HOUSE_H
#define M_HOUSE_H
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* House arrangement byte breakdown
*
* PX = player x
* HX = house x
*
* xx xx xx xx
* P3 P2 P1 P0
*
* Example:
* 01 11 10 00
* P3 P2 P1 P0
* H1 H3 H2 H0
**/
enum {
mHS_HOUSE0, /* Top-left house */
mHS_HOUSE1, /* Top-right house */
mHS_HOUSE2, /* Bottom-left house */
mHS_HOUSE3, /* Bottom-right house */
mHS_HOUSE_NUM
};
extern void mHS_house_init();
extern int mHS_get_arrange_idx(int player_no);
extern int mHS_get_pl_no(int house_no);
extern int mHS_get_pl_no_detail(int home_no);
extern int mHS_set_use(int player_no, int house_no);
#ifdef __cplusplus
}
#endif
#endif
+50
View File
@@ -0,0 +1,50 @@
#ifndef M_ISLAND_H
#define M_ISLAND_H
#include "types.h"
#include "m_personal_id.h"
#include "m_npc.h"
#include "m_land.h"
#include "m_field_make.h"
#include "m_home.h"
#include "m_needlework.h"
#ifdef __cplusplus
extern "C" {
#endif
#define mISL_ISLAND_NAME_LEN 8
#define mISL_FG_BLOCK_X_NUM 2
#define mISL_FG_BLOCK_Z_NUM 1
enum {
mISL_ISLAND_BLOCK_LEFT,
mISL_ISLAND_BLOCK_RIGHT,
mISL_ISLAND_BLOCK_NUM
};
/* sizeof(Island_c) == 0x1900 */
typedef struct island_s {
/* 0x0000 */ u8 name[mISL_ISLAND_NAME_LEN]; /* island name */
/* 0x0008 */ mLd_land_info_c landinfo; /* land info for town */
/* 0x0014 */ mFM_fg_c fgblock[mISL_FG_BLOCK_Z_NUM][mISL_FG_BLOCK_X_NUM]; /* island item actor data */
/* 0x0418 */ mHm_cottage_c cottage; /* player shared cottage data */
/* 0x0CE0 */ mNW_original_design_c flag_design; /* island flag design */
/* 0x0F00 */ Animal_c animal; /* islander info */
/* 0x1888 */ u16 deposit[mISL_FG_BLOCK_X_NUM * mISL_FG_BLOCK_Z_NUM][UT_Z_NUM]; /* buried item bitfield */
/* 0x18C8 */ u8 bg_data[mISL_ISLAND_BLOCK_NUM]; /* island acre ids */
/* 0x18CA */ lbRTC_time_c renew_time; /* last time island was visited? */
/* 0x18D2 */ u8 unused_18D2[14]; /* unused */
/* 0x18E0 */ u8 grass_tex_type; /* grass type */
/* 0x18E1 */ u8 last_song_male; /* last song kapp'n sang for a male character */
/* 0x18E2 */ u8 last_song_female; /* last song kapp'n sang for a female character */
/* 0x18E3 */ u8 unused_18E3[29]; /* unused */
} Island_c;
#ifdef __cplusplus
}
#endif
#endif
+3
View File
@@ -59,6 +59,9 @@ typedef struct mail_s {
/* 0x02E */ Mail_ct_c content;
} Mail_c;
extern int mMl_strlen(u8* str, int maxlen, u8 check_char);
extern void mMl_clear_mail_box(Mail_c* mail_box, int count);
#ifdef __cplusplus
}
#endif
+38
View File
@@ -0,0 +1,38 @@
#ifndef M_NAME_TABLE_H
#define M_NAME_TABLE_H
#include "types.h"
#include "m_actor_type.h"
/* TODO: these defintions are likely included from an auto-gen source */
#ifdef __cplusplus
extern "C" {
#endif
#define EMPTY_NO 0x0000
#define FTR_REDALOHASHIRT 0x1814
#define FTR_BLUEALOHASHIRT 0x1818
#define FTR_TAPEDECK 0x1E58
#define ITM_COLLEGERULE 0x2B00
#define FTR_ORANGEBOX 0x30F8
#define DOOR_START 0x4000
#define DOOR0 DOOR_START /* 0x4000 */
#define DOOR1 (DOOR0 + 1) /* 0x4001 */
#define EXIT_DOOR 0x4080
#define RSV_DOOR 0xFE1B
#define RSV_WALL_NO 0xFFFE /* interior wall item, no collision */
#define RSV_NO 0xFFFF /* reserved space, can't interact but no collision */
#ifdef __cplusplus
}
#endif
#endif
+38 -4
View File
@@ -25,6 +25,8 @@ extern "C" {
#define ANIMAL_HP_MAIL_NUM 4
#define ANIMAL_NAME_LEN PLAYER_NAME_LEN
#define mNpc_ISLAND_FTR_SAVE_NUM 4
/* sizeof(Anmremail_c) == 0x16 */
typedef struct animal_remail_s {
lbRTC_ymd_t date; /* date sent */
@@ -68,18 +70,35 @@ typedef struct animal_letter_info_s {
u8 bit5_7:3; /* seemingly unused */
} Anmlet_c;
/* sizeof(Anmlnd_c) == 0xA */
typedef struct animal_land_mem_s {
/* 0x00 */ u8 name[LAND_NAME_SIZE];
/* 0x08 */ u16 id;
} Anmlnd_c;
/* sizeof(memuni_U) == 0x12 */
typedef union {
Anmlnd_c land; /* size = 0xA */
u32 check; /* size = 4 */
} memuni_u;
/* sizeof(Anmmem_c) == 0x138 */
typedef struct animal_memory_s {
/* 0x000 */ PersonalID_c memory_player_id; /* personal id of the player memory belongs to */
/* 0x014 */ lbRTC_time_c last_speak_time; /* time the player last spoke to this villager */
/* 0x01C */ u8 land_name[LAND_NAME_SIZE]; /* memory origin land name */
/* 0x024 */ u16 land_id; /* memory origin land id */
/* 0x01C */ memuni_u memuni; /* union between town NPC land memory & islander player action memory */
/* 0x028 */ u64 saved_town_tune; /* memory origin town tune */
/* 0x030 */ s8 friendship; /* friendship with the player */
/* 0x031 */ Anmlet_c letter_info; /* saved letter flags */
/* 0x032 */ Anmplmail_c letter; /* saved letter */
} Anmmem_c;
/* sizeof(anmuni) == 8 */
typedef union {
u8 previous_land_name[LAND_NAME_SIZE];
mActor_name_t island_ftr[mNpc_ISLAND_FTR_SAVE_NUM];
} anmuni_u;
/* sizeof(AnmHPMail_c) == 0x1C */
typedef struct animal_password_mail_s {
/* 0x00 */ lbRTC_time_c receive_time;
@@ -94,7 +113,7 @@ typedef struct animal_s {
/* 0x89D */ u8 catchphrase[ANIMAL_CATCHPHRASE_LEN]; /* may be called 'word_ending' */
/* 0x8A8 */ mQst_contest_c contest_quest; /* current contest quest information */
/* 0x8D0 */ u8 parent_name[PLAYER_NAME_LEN]; /* name of the player who 'spawned' the villager in, unsure why this is tracked */
/* 0x8D8 */ u8 previous_land_name[LAND_NAME_SIZE]; /* name of the last town the villager lived in */
/* 0x8D8 */ anmuni_u anmuni; /* name of the last town the villager lived in or saved island ftr */
/* 0x8E0 */ u16 previous_land_id; /* id of the previous town the villager lived in */
/* 0x8E2 */ u8 mood; /* probably called 'feel' based on code */
/* 0x8E3 */ u8 mood_time; /* probably called 'feel_tim' based on code */
@@ -104,13 +123,28 @@ typedef struct animal_s {
/* 0x8E9 */ u8 moved_in; /* TRUE when the villager moved in after town creation, FALSE if they started out in town */
/* 0x8EA */ u8 removing; /* TRUE when the villager is leaving town, FALSE otherwise */
/* 0x8EB */ s8 cloth_original_id; /* 0xFF when not wearing an Able Sister's pattern, otherwise 0-3 indicating which pattern */
/* 0x8EC */ s8 umbrella_id; /* 0xFF when no umbrella, 0-31 when a standard umbrella, 32-35 when using an Able Sister's pattern */
/* 0x8EC */ s8 umbrella_id; /* 0xFF when no umbrella, 0-31 when a standard umbrella, 32-35 when using an Able Sister's pattern
/* 0x8ED */ u8 unk_8ED; /* Exists according to mISL_gc_to_agb_animal, but seems unused in practice */
/* 0x8EE */ mActor_name_t present_cloth; /* The most recently received shirt from a letter which the villager may change into */
/* 0x8F0 */ u8 animal_relations[ANIMAL_NUM_MAX]; /* relationships between all villagers in town, starts at 128 which is neutral */
/* 0x900 */ AnmHPMail_c hp_mail[ANIMAL_HP_MAIL_NUM]; /* mail password info storage */
/* 0x000 */ u8 unused[24]; /* unknown usage/unused */
} Animal_c;
/*
Struct for keeping track of an event where a villager can briefly return to your town after
moving away to another town. The time limit seems to be 60 days, and the villager will only
appear once per player during that time if the player talks to them.
*/
/* sizeof(Anmret_c) == 0xC */
typedef struct animal_return_s {
/* 0x00 */ mActor_name_t npc_id; /* id of the villager who left */
/* 0x02 */ u8 talk_bit; /* which players have already interacted with this villager */
/* 0x03 */ u8 exist; /* if the villager exists */
/* 0x04 */ lbRTC_time_c renew_time; /* time that this struct was updated */
} Anmret_c;
extern void mNpc_PrintRemoveInfo(gfxprint_t* gfxprint);
extern void mNpc_PrintFriendship_fdebug(gfxprint_t* gfxprint);
+4
View File
@@ -160,6 +160,10 @@ extern s16 mPr_GetGoodsPower();
extern s16 mPr_GetMoneyPower();
extern void mPr_PrintMapInfo_debug(gfxprint_t* gfxprint);
extern int mPr_NullCheckPersonalID(PersonalID_c* pid);
extern int mPr_CheckCmpPersonalID(PersonalID_c* pid_a, PersonalID_c* pid_b);
extern void mPr_ClearPersonalID(PersonalID_c* pid);
extern void mPr_CopyPersonalID(PersonalID_c* dst, PersonalID_c* src);
#ifdef __cplusplus
}
+519
View File
@@ -0,0 +1,519 @@
#include "m_home.h"
#include "m_common_data.h"
#include "m_house.h"
#include "m_string.h"
#include "m_font.h"
#include "m_mail.h"
#include "m_lib.h"
#include "m_name_table.h"
#include "m_field_make.h"
#include "libultra/libultra.h"
#include "m_cockroach.h"
#include "m_personal_id.h"
#include "m_private.h"
/* upstairs room base unit layout */
static mActor_name_t l_player_room_2_utinfo[UT_X_NUM * UT_Z_NUM] = {
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
DOOR0, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO
};
/* basement room base unit layout */
static mActor_name_t l_player_room_bm_utinfo[UT_X_NUM * UT_Z_NUM] = {
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, DOOR0, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO
};
/* small main room base unit layout */
static mActor_name_t l_proom_s_tmp[UT_X_NUM * UT_Z_NUM] = {
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, DOOR0, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, RSV_WALL_NO, EXIT_DOOR, EXIT_DOOR, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO
};
/* medium main room base unit layout */
static mActor_name_t l_proom_m_tmp[UT_X_NUM * UT_Z_NUM] = {
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, DOOR0, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EXIT_DOOR, EXIT_DOOR, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO
};
/* large main room base unit layout */
static mActor_name_t l_proom_l_tmp[UT_X_NUM * UT_Z_NUM] = {
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, DOOR1, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, DOOR0, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EXIT_DOOR, EXIT_DOOR, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO
};
/* island cottage base unit layout */
static mActor_name_t l_proom_cottage_tmp[UT_X_NUM * UT_Z_NUM] = {
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_DOOR, RSV_DOOR, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, EXIT_DOOR, EXIT_DOOR, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, RSV_WALL_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO,
EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO, EMPTY_NO
};
#define HANIWA_MSG_LINES 4
// TODO: fix me
#pragma pool_data on
/**
* @brief Clears the save data for a given home.
*
* @param home_no Index of the home which will be cleared (0-3).
**/
extern void mHm_ClearHomeInfo(int home_no) {
static int haniwa_msg[HANIWA_MSG_LINES] = { 0x76A, 0x76B, 0x76C, 0x76D }; /* These are probably defines somewhere from auto-gen */
int no;
mHm_hs_c* home;
u8 haniwa_msg_buf[HANIWA_MESSAGE_LEN];
u16* item_p;
u16* src_p;
int i;
u8* haniwa_msg_p;
int j;
no = home_no & 3;
home = Save_GetPointer(homes[no]);
bzero(home, sizeof(mHm_hs_c));
mPr_ClearPersonalID(&home->ownerID);
bcopy(l_proom_s_tmp, home->floors[mHm_ROOM_MAIN].layer_main.items, (UT_X_NUM * UT_Z_NUM) * sizeof(u16));
home->floors[mHm_ROOM_MAIN].layer_main.ftr_switch = 0;
*((u32*)&home->floors[mHm_ROOM_MAIN].layer_main.ftr_switch + 1) = 0; /* ftr_switch might be a union? */
*((u32*)&home->floors[mHm_ROOM_MAIN].layer_main.ftr_switch + 0) = 0;
item_p = (u16*)home->floors[mHm_ROOM_BASEMENT].layer_main.items;
src_p = l_player_room_bm_utinfo;
for (i = 0; i < UT_X_NUM * UT_Z_NUM; i++) {
*item_p++ = *src_p++;
}
item_p = ((u16*)home->floors[mHm_ROOM_UPPER].layer_main.items);
src_p = l_player_room_2_utinfo;
for (i = 0; i < UT_X_NUM * UT_Z_NUM; i++) {
*item_p++ = *src_p++;
}
mMl_clear_mail_box(home->mailbox, HOME_MAILBOX_SIZE);
Save_Set(homes[no].outlook_pal, no);
Save_Set(homes[no].next_outlook_pal, no);
mCkRh_InitGokiSaveData_1Room_ByHomeData(home);
mHm_SetDefaultPlayerRoomData(no);
haniwa_msg_p = home->haniwa.message;
for (j = 0; j < HANIWA_MSG_LINES; j++) {
int len;
mString_Load_StringFromRom(haniwa_msg_buf, HANIWA_MESSAGE_LEN, haniwa_msg[j]);
len = mMl_strlen(haniwa_msg_buf, HANIWA_MESSAGE_LEN, CHAR_SPACE);
haniwa_msg_buf[len] = CHAR_NEW_LINE;
mem_copy(haniwa_msg_p, haniwa_msg_buf, len + 1);
haniwa_msg_p += len + 1;
}
Save_Set(keep_house_size[no], 0);
Save_Set(homes[no].door_original, 0xFF);
}
#pragma pool_data reset
/**
* @brief Clears save data for all homes.
**/
extern void mHm_ClearAllHomeInfo() {
int i;
for (i = 0; i < PLAYER_NUM; i++) {
mHm_ClearHomeInfo(i);
}
}
/**
* @brief Sets common_data's 'now_home' pointer to the current player's home.
**/
extern void mHm_SetNowHome() {
mHm_hs_c* now_home = NULL;
if (Common_Get(player_no) < PLAYER_NUM) {
now_home = Save_GetPointer(homes[mHS_get_arrange_idx(Common_Get(player_no))]);
}
Common_Set(now_home, now_home);
}
/* sizeof(mHm_player_room_default_data_c) == 0x10 */
typedef struct {
/* 0x00 */ u8 wall_num;
/* 0x01 */ u8 floor_num;
/* 0x04 */ int item_ut_x;
/* 0x08 */ int item_ut_z;
/* 0x0C */ mActor_name_t item;
} mHm_player_room_default_data_c;
/* list of default properties for each house */
static mHm_player_room_default_data_c l_mHm_player_room_default_data[PLAYER_NUM] = {
{ 3, 38, 4, 1, FTR_TAPEDECK }, /* Top-left house, stone wall & old flooring */
{ 41, 42, 4, 1, FTR_TAPEDECK }, /* Top-right house, wood panelling & steel flooring */
{ 55, 5, 4, 1, FTR_TAPEDECK }, /* Bottom-left house, shanty wall & birch flooring */
{ 42, 34, 4, 1, FTR_TAPEDECK } /* Bottom-right house, concrete wall & charcoal tile */
};
/**
* @brief Sets the default data for a given home.
*
* @param home_no Index of the home which will receive the default data
**/
extern void mHm_SetDefaultPlayerRoomData(int home_no) {
int i;
int ut_x = l_mHm_player_room_default_data[home_no & 3].item_ut_x;
int ut_z = l_mHm_player_room_default_data[home_no & 3].item_ut_z;
Save_Set(homes[home_no & 3].floors[mHm_ROOM_MAIN].layer_main.items[ut_z][ut_x], l_mHm_player_room_default_data[home_no & 3].item);
Save_Set(homes[home_no & 3].floors[mHm_ROOM_MAIN].layer_main.items[1][1], FTR_ORANGEBOX);
Save_Set(homes[home_no & 3].floors[mHm_ROOM_MAIN].layer_secondary.items[1][1], ITM_COLLEGERULE);
for (i = 0; i < mHm_ROOM_NUM; i++) {
Save_Set(homes[home_no & 3].floors[i].wall_floor.flooring_idx, l_mHm_player_room_default_data[home_no & 3].floor_num);
Save_Set(homes[home_no & 3].floors[i].wall_floor.wallpaper_idx, l_mHm_player_room_default_data[home_no & 3].wall_num);
}
}
/**
* @brief Initializes the home's owner id to the given player's id.
*
* @param home Pointer to the mHm_hs_c home which will be updated
* @param player_no Index of the player whose id will be used
**/
extern void mHm_InitHomeInfo(mHm_hs_c* home, int player_no) {
mPr_CopyPersonalID(&home->ownerID, Save_GetPointer(private[player_no].player_ID));
}
/**
* @brief Sets/clears the wall and door layout for a given room.
*
* @param dst Pointer to the room item actor data
* @param roomtype Type of room to select correct room data (0-3)
* @param set when TRUE copy data, when FALSE clear data
**/
static void mHm_ChangeWallDoorFG(mActor_name_t* dst, int roomtype, int set) {
static mActor_name_t* player_room_tmp_table[mHm_ROOMTYPE_NUM] = {
l_proom_s_tmp, /* small room layout (default) */
l_proom_m_tmp, /* medium room layout */
l_proom_l_tmp, /* large room layout */
l_proom_cottage_tmp /* island cottage layout */
};
mActor_name_t* src;
int i;
if (roomtype < mHm_ROOMTYPE_SMALL || roomtype >= mHm_ROOMTYPE_NUM) {
roomtype = mHm_ROOMTYPE_SMALL;
}
src = player_room_tmp_table[roomtype];
for (i = 0; i < UT_X_NUM * UT_Z_NUM; i++) {
if (*src != EMPTY_NO) {
if (set == FALSE) {
*dst = EMPTY_NO; /* clear */
}
else {
*dst = *src; /* set */
}
}
src++;
dst++;
}
}
/**
* @brief Clears the wall & door data for a room.
*
* @param items Pointer to the room actor items
* @param roomtype Type of room to clear
**/
static void mHm_EraseWallDoor(mActor_name_t* items, int roomtype) {
mHm_ChangeWallDoorFG(items, roomtype, FALSE);
}
/**
* @brief Sets the wall & door data for a room.
*
* @param items Pointer to the room actor items
* @param roomtype Type of room to clear
**/
static void mHm_SetWallDoor(mActor_name_t* items, int roomtype) {
mHm_ChangeWallDoorFG(items, roomtype, TRUE);
}
/**
* @brief Updates the wall & door data for the main room.
*
* @param home Pointer to the mHm_hs_c home to update
* @param home_size Size of the home (0-4, but only 1-4 should be used for this function)
**/
static void mHm_RehouseWallDoor(mHm_hs_c* home, int home_size) {
static int room_size[mHm_HOMESIZE_NUM] = {
mHm_ROOMTYPE_SMALL, /* mHm_HOMESIZE_SMALL */
mHm_ROOMTYPE_MEDIUM, /* mHm_HOMESIZE_MEDIUM */
mHm_ROOMTYPE_LARGE, /* mHm_HOMESIZE_LARGE */
mHm_ROOMTYPE_LARGE, /* mHm_HOMESIZE_UPPER */
mHm_ROOMTYPE_SMALL /* mHm_HOMESIZE_STATUE */
};
int new_size;
int old_size;
if (home_size < mHm_HOMESIZE_MEDIUM || home_size >= mHm_HOMESIZE_NUM) {
home_size = mHm_HOMESIZE_MEDIUM;
}
old_size = room_size[home_size - 1];
new_size = room_size[home_size];
mHm_EraseWallDoor((u16*)home->floors[mHm_ROOM_MAIN].layer_main.items, old_size);
mHm_EraseWallDoor((u16*)home->floors[mHm_ROOM_MAIN].layer_secondary.items, old_size);
mHm_SetWallDoor((u16*)home->floors[mHm_ROOM_MAIN].layer_main.items, new_size);
mHm_SetWallDoor((u16*)home->floors[mHm_ROOM_MAIN].layer_secondary.items, new_size);
}
#define CHECK_ORDER_DATE(home, rtc_time) \
((home)->size_info.upgrade_order_date.day != (rtc_time)->day || \
(home)->size_info.upgrade_order_date.month != (rtc_time)->month || \
(home)->size_info.upgrade_order_date.year != (rtc_time)->year)
/**
* @brief Check if any house should be updated, and if so, update it.
**/
extern void mHm_CheckRehouseOrder() {
mHm_hs_c* home = Save_Get(homes);
lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time);
int i;
for (i = 0; i < PLAYER_NUM; i++) {
if (mPr_NullCheckPersonalID(&home->ownerID) == FALSE) {
if (home->outlook_pal != home->next_outlook_pal) {
home->outlook_pal = home->next_outlook_pal;
}
if (home->size_info.size != home->size_info.next_size && home->size_info.next_size < mHm_HOMESIZE_STATUE) {
if (CHECK_ORDER_DATE(home, rtc_time)) {
home->outlook_pal = home->ordered_outlook_pal;
home->next_outlook_pal = home->ordered_outlook_pal;
home->size_info.size = home->size_info.next_size;
home->size_info.renew = TRUE;
mHm_RehouseWallDoor(home, home->size_info.size);
}
}
else {
if (home->size_info.basement_ordered) {
if (CHECK_ORDER_DATE(home, rtc_time)) {
mHm_SetBasement(i);
home->size_info.renew = TRUE;
}
}
else if (home->size_info.statue_ordered == TRUE) {
if (CHECK_ORDER_DATE(home, rtc_time)) {
home->size_info.next_size = mHm_HOMESIZE_STATUE;
}
}
}
}
home++;
}
for (i = 0; i < PLAYER_NUM; i++) {
u32* state_flags = Save_GetPointer(private[i].state_flags);
*state_flags &= (~0x200); /* TODO: these need an enum/defines */
}
}
/**
* @brief Stores the player's current house size for later.
*
* @param player_no Index of the player whose house size will be saved
* @return TRUE/FALSE house size was kept
**/
extern int mHm_KeepHouseSize(u8 player_no) {
int arrange_idx;
mHm_hs_c* home;
u8* keep_house_size;
int res = FALSE;
if (player_no < PLAYER_NUM) {
arrange_idx = mHS_get_arrange_idx(player_no);
home = Save_GetPointer(homes[arrange_idx]);
keep_house_size = Save_GetPointer(keep_house_size[arrange_idx]);
res = TRUE;
/* I don't think this is a union or struct due to the unused first bit */
/* But maybe... perhaps they used a pad bit for the topmost bit unlike other structs */
*keep_house_size = 0;
*keep_house_size |= home->size_info.size;
*keep_house_size |= home->size_info.next_size << 3;
*keep_house_size |= home->size_info.renew << 6;
}
return res;
}
/**
* @brief Checks whether the kept house size for a player is the same as the actual size.
*
* @param player_no The index of the player whose house will be checked
* @returns TRUE/FALSE house size and keep house size are the same
**/
extern int mHm_CheckKeepHouseSize(u8 player_no) {
int arrange_idx;
mHm_hs_c* home;
u8* keep_house_size;
int res = FALSE;
if (player_no < PLAYER_NUM) {
arrange_idx = mHS_get_arrange_idx(player_no);
keep_house_size = Save_GetPointer(keep_house_size[arrange_idx]);
home = Save_Get(homes + arrange_idx);
if ((*keep_house_size & 7) == home->size_info.size &&
((*keep_house_size >> 3) & 7) == home->size_info.next_size &&
((*keep_house_size >> 6) & 1) == home->size_info.renew) {
res = TRUE;
}
}
return res;
}
/**
* @brief Updates player house flags to include basement
*
* @param home_no Index of the house whose basement flag will be enabled
* @return TRUE/FALSE was flag set
**/
extern int mHm_SetBasement(u8 home_no) {
if (home_no < PLAYER_NUM) {
mHm_flg_c* flags = Save_GetPointer(homes[home_no].flags);
if (flags->has_basement == FALSE) {
flags->has_basement = TRUE;
return TRUE;
}
}
return FALSE;
}
/**
* @brief Sets the default island cottage data
*
* @param cottage Pointer to the mHm_cottage_c cottage which will receive the default data
**/
static void mHm_SetDefaultCottageData(mHm_cottage_c* cottage) {
if (cottage == NULL) {
return;
}
cottage->room.wall_floor.flooring_idx = 13;
cottage->room.wall_floor.wallpaper_idx = 13;
cottage->room.layer_main.items[3][3] = FTR_REDALOHASHIRT;
cottage->room.layer_main.items[3][6] = FTR_BLUEALOHASHIRT;
cottage->room.layer_main.items[6][3] = FTR_REDALOHASHIRT;
cottage->room.layer_main.items[6][6] = FTR_BLUEALOHASHIRT;
}
/**
* @brief Initialize an mHm_cottage_c cottage.
*
* @param cottage Pointer to the mHm_cottage_c which will be initialized
**/
extern void mHm_InitCottage(mHm_cottage_c* cottage) {
if (cottage != NULL) {
bzero(cottage, sizeof(mHm_cottage_c));
mHm_SetWallDoor((u16*)cottage->room.layer_main.items, mHm_ROOMTYPE_COTTAGE);
mCkRh_InitGokiSaveData_IslandPlayerRoom();
mHm_SetDefaultCottageData(cottage);
}
}
+116
View File
@@ -0,0 +1,116 @@
#include "m_house.h"
#include "m_common_data.h"
#include "m_home.h"
#include "m_private.h"
#define DEFAULT_ARRANGEMENT ((mHS_HOUSE3 << 6) | (mHS_HOUSE2 << 4) | (mHS_HOUSE1 << 2) | (mHS_HOUSE0 << 0))
#define ARRANGE_GET(player_no) (((u32)Save_Get(house_arrangement) >> ((player_no) * 2)) & 3)
#define ARRANGE_MOVE(player_no, house_no) ((house_no) << ((player_no) * 2))
/**
* @brief Initializes the `house_arrangement` variable to its default state.
*
* The default state is:
* Player0: House0
* Player1: House1
* Player2: House2
* Player3: House3
**/
extern void mHS_house_init() {
Save_Set(house_arrangement, DEFAULT_ARRANGEMENT);
}
/**
* @brief Retrieves the house arrangement value for a given player index.
*
* @return The house index for the player.
**/
extern int mHS_get_arrange_idx(int player_no) {
return ARRANGE_GET(player_no);
}
/**
* @brief Returns the index of the player who owns the house index from `house_arrangement`.
*
* @return The owning player index for the house.
**/
extern int mHS_get_pl_no(int house_no) {
int i;
u32 arrangement = Save_Get(house_arrangement);
for (i = 0; i < PLAYER_NUM; i++) {
if ((arrangement & 3) == house_no) {
break;
}
arrangement >>= 2;
}
return i;
}
/**
* @brief Returns the index of the player who owns a house by checking house owner IDs.
*
* @return The owning player index for the house.
**/
extern int mHS_get_pl_no_detail(int home_no) {
mHm_hs_c* home = Save_Get(homes + (home_no & 3));
if (mPr_NullCheckPersonalID(&home->ownerID) == FALSE) {
int i;
for (i = 0; i < PLAYER_NUM; i++) {
if (mPr_CheckCmpPersonalID(&home->ownerID, Save_GetPointer(private[i].player_ID))) {
return i;
}
}
}
return -1;
}
/* TODO: this probably had some macro.. maybe refactor? */
/**
* @brief Sets the house arrangement value for `player_no` to `house_no`.
*
* This function also swaps houses with whichever player is set in house_arrangement
* with the house currently assigned to `player_no`.
*
* @return TRUE when successfully set, FALSE otherwise.
**/
extern int mHS_set_use(int player_no, int house_no) {
int now_player_no;
u32 house_arrangement;
int mask;
int plr_shift;
int new_shift;
int res = FALSE;
if (player_no < PLAYER_NUM && house_no < PLAYER_NUM) {
now_player_no = mHS_get_pl_no(house_no);
if (mPr_NullCheckPersonalID(Save_GetPointer(homes[house_no].ownerID)) == TRUE) {
if (now_player_no != player_no) {
plr_shift = player_no * 2;
new_shift = now_player_no * 2;
house_arrangement = Save_Get(house_arrangement);
/* create bitmask to clear previous saved indices */
mask = 0xffffffff;
mask ^= (3 << plr_shift) | (3 << new_shift); /* Remove the bits relating to both player indicies */
/* Swap the player who currently owns our selected house with whatever house our player "owns" currently */
Save_Set(house_arrangement, (
((house_arrangement & mask) | /* Clear old values */
(((house_arrangement >> plr_shift) & 3)) << new_shift) | /* move current player house idx to old player house idx */
(house_no << plr_shift))); /* set current player new house idx */
}
mHm_InitHomeInfo(Save_Get(homes + house_no), player_no);
res = TRUE;
}
}
return res;
}