From efd664e21960019bab6be475d848b5f9e68ea396 Mon Sep 17 00:00:00 2001 From: Prakxo <87568477+Prakxo@users.noreply.github.com> Date: Tue, 19 Sep 2023 20:44:50 +0200 Subject: The NPC PR 2/3 OK (#97) * m_npc_schedule OK Co-authored-by: Maide * fix structs * fixes --------- Co-authored-by: Maide --- include/6D2720.h | 8 -- include/m_common_data.h | 3 +- include/m_event.h | 2 +- include/m_npc.h | 2 +- include/m_npc_schedule.h | 46 +++++++++ linker_scripts/jp/symbol_addrs_code.txt | 10 +- src/code/m_npc_schedule.c | 168 ++++++++++++++++++++++++++++++++ src/code/m_start_data_init.c | 2 +- yamls/jp/code.yaml | 3 +- 9 files changed, 226 insertions(+), 18 deletions(-) create mode 100644 include/m_npc_schedule.h create mode 100644 src/code/m_npc_schedule.c diff --git a/include/6D2720.h b/include/6D2720.h index 4fe9a80..eaccea7 100644 --- a/include/6D2720.h +++ b/include/6D2720.h @@ -3,14 +3,6 @@ #include "ultra64.h" - -// void func_800AEA80_jp(); -// void mNPS_set_schedule_area(); -// void func_800AEB9C_jp(); -// void func_800AEBC8_jp(); -// void func_800AEC74_jp(); -// void mNPS_schedule_manager(); -void mNPS_set_all_schedule_area(void); void func_800B0010_jp(void); #endif diff --git a/include/m_common_data.h b/include/m_common_data.h index dd96b67..48981c2 100644 --- a/include/m_common_data.h +++ b/include/m_common_data.h @@ -10,6 +10,7 @@ #include "m_mail.h" #include "m_npc.h" #include "m_npc_walk.h" +#include "m_npc_schedule.h" #include "m_private.h" #include "m_quest.h" #include "unk.h" @@ -234,7 +235,7 @@ typedef struct CommonData { /* 0x104B0 */ UNK_TYPE1 unk_104B0[0xE8]; /* 0x10598 */ mQst_not_saved_c quest; /* 0x105A0 */ u32 scene_from_title_demo; - /* 0x105A4 */ UNK_TYPE1 unk_105A4[0xF0]; + /* 0x105A4 */ NpsSchedule npcSchedule[ANIMAL_NUM_MAX]; /* 0x10694 */ NpcWalking npcWalk; /* 0x10710 */ UNK_TYPE1 unk_10710[0x3C]; /* 0x1074C */ UNK_TYPE unk_1074C; diff --git a/include/m_event.h b/include/m_event.h index 250cf21..67c911a 100644 --- a/include/m_event.h +++ b/include/m_event.h @@ -108,7 +108,7 @@ void mEv_finish(Event* event); // void func_8007FE0C_jp(); void mEv_clear_status(s32, s16); // void func_8007FEBC_jp(); -// void func_8007FF08_jp(); +s32 mEv_check_status(s32, s16); // void func_8007FF8C_jp(); // void func_8007FFC4_jp(); // void func_80080000_jp(); diff --git a/include/m_npc.h b/include/m_npc.h index 62f82cf..9191c09 100644 --- a/include/m_npc.h +++ b/include/m_npc.h @@ -88,7 +88,7 @@ void mNpc_RenewalAnimalMemory(void); // void func_800A78DC_jp(); // void mNpc_ClearAnimalInfo(); // void mNpc_ClearAnyAnimalInfo(); -// void mNpc_CheckFreeAnimalInfo(); +s32 mNpc_CheckFreeAnimalInfo(Animal_c*); // void mNpc_GetFreeAnimalInfo(); // void mNpc_UseFreeAnimalInfo(); // void mNpc_CopyAnimalInfo(); diff --git a/include/m_npc_schedule.h b/include/m_npc_schedule.h new file mode 100644 index 0000000..b410c6f --- /dev/null +++ b/include/m_npc_schedule.h @@ -0,0 +1,46 @@ +#ifndef M_NPC_SCHEDULE_H +#define M_NPC_SCHEDULE_H + +#include "ultra64.h" +#include "m_npc.h" + +typedef enum NpsScheduleType{ + /* 0 */ NPS_SCHEDULE_FIELD, /* in same acre as their home */ + /* 1 */ NPS_SCHEDULE_IN_HOUSE, /* inside their house */ + /* 2 */ NPS_SCHEDULE_SLEEP, /* asleep in their house */ + /* 3 */ NPS_SCHEDULE_STAND, /* standing around town?? */ + /* 4 */ NPS_SCHEDULE_WANDER, /* wander around town */ + /* 5 */ NPS_SCHEDULE_SPECIAL, /* unique schedule method for each NPC actor type */ + /* 6 */ NPS_SCHEDULE_TYPE_NUM +} NpsScheduleType; + +typedef struct NpsScheduleData { + /* 0x00 */ NpsScheduleType type; + /* 0x04 */ s32 endTime; +} NpsScheduleData; // size = 0x8 + +typedef struct NpsScheduleDataTable { + /* 0x00 */ s32 count; + /* 0x04 */ NpsScheduleData* scheduleData; +} NpsScheduleDataTable; // size = 0x8 + +typedef struct NpsSchedule{ + /* 0x00 */ AnmPersonalID_c* id; + /* 0x04 */ NpsScheduleDataTable* dataTable; + /* 0x08 */ u8 currentType; + /* 0x09 */ u8 forcedType; + /* 0x0A */ u8 savedType; + /* 0x0C */ s32 forcedTimer; +}NpsSchedule; // size = 0x10 + + + +NpsSchedule* mNPS_get_schedule_area(AnmPersonalID_c* id); +void mNPS_set_schedule_area(AnmPersonalID_c* id); +void mNPS_reset_schedule_area(AnmPersonalID_c* id); +void mNPS_schedule_manager_sub0(void); +void mNPS_schedule_manager_sub(void); +void mNPS_schedule_manager(void); +void mNPS_set_all_schedule_area(void); + +#endif diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt index 5828856..6b0553c 100644 --- a/linker_scripts/jp/symbol_addrs_code.txt +++ b/linker_scripts/jp/symbol_addrs_code.txt @@ -1145,7 +1145,7 @@ func_8007FDA8_jp = 0x8007FDA8; // type:func func_8007FE0C_jp = 0x8007FE0C; // type:func mEv_clear_status = 0x8007FE74; // type:func func_8007FEBC_jp = 0x8007FEBC; // type:func -func_8007FF08_jp = 0x8007FF08; // type:func +mEv_check_status = 0x8007FF08; // type:func func_8007FF8C_jp = 0x8007FF8C; // type:func func_8007FFC4_jp = 0x8007FFC4; // type:func func_80080000_jp = 0x80080000; // type:func @@ -2436,11 +2436,11 @@ func_800AE6CC_jp = 0x800AE6CC; // type:func func_800AE76C_jp = 0x800AE76C; // type:func func_800AE898_jp = 0x800AE898; // type:func mNpc_PrintFriendship_fdebug = 0x800AE8C8; // type:func -func_800AEA80_jp = 0x800AEA80; // type:func +mNPS_get_schedule_area = 0x800AEA80; // type:func mNPS_set_schedule_area = 0x800AEB50; // type:func -func_800AEB9C_jp = 0x800AEB9C; // type:func -func_800AEBC8_jp = 0x800AEBC8; // type:func -func_800AEC74_jp = 0x800AEC74; // type:func +mNPS_reset_schedule_area = 0x800AEB9C; // type:func +mNPS_schedule_manager_sub0 = 0x800AEBC8; // type:func +mNPS_schedule_manager_sub = 0x800AEC74; // type:func mNPS_schedule_manager = 0x800AED08; // type:func mNPS_set_all_schedule_area = 0x800AED68; // type:func mNpcW_GetGoalDataInfo = 0x800AEDD0; // type:func diff --git a/src/code/m_npc_schedule.c b/src/code/m_npc_schedule.c new file mode 100644 index 0000000..20510f6 --- /dev/null +++ b/src/code/m_npc_schedule.c @@ -0,0 +1,168 @@ +#include "m_npc_schedule.h" +#include "m_common_data.h" +#include "m_npc.h" +#include "m_event.h" +#include "macros.h" + +#define NPS_TIME_2_SEC(hour, min, sec) ((hour)*3600 + (min)*60 + (sec)) +#define NPS_MAKE_SCHEDULE_TABLE(scheduleData) \ + { ARRAY_COUNT(scheduleData), scheduleData } + +NpsScheduleData girl_schedule_dt[] = { + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(5, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(6, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(12, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(13, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(18, 30, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(21, 0, 0) }, + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(24, 0, 0) }, +}; + +NpsScheduleDataTable girl_schedule = NPS_MAKE_SCHEDULE_TABLE(girl_schedule_dt); + +NpsScheduleData ko_girl_schedule_dt[] = { + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(7, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(8, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(13, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(14, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(22, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(23, 30, 0) }, + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(24, 0, 0) }, +}; + +NpsScheduleDataTable ko_girl_schedule = NPS_MAKE_SCHEDULE_TABLE(ko_girl_schedule_dt); + +NpsScheduleData boy_schedule_dt[] = { + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(8, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(9, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(12, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(14, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(19, 30, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(22, 0, 0) }, + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(24, 0, 0) }, +}; + +NpsScheduleDataTable boy_schedule = NPS_MAKE_SCHEDULE_TABLE(boy_schedule_dt); + +NpsScheduleData sport_man_schedule_dt[] = { + { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(1, 0, 0) }, { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(5, 30, 0) }, + { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(6, 30, 0) }, { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(12, 0, 0) }, + { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(12, 30, 0) }, { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(23, 0, 0) }, + { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(24, 0, 0) }, +}; + +NpsScheduleDataTable sport_man_schedule = NPS_MAKE_SCHEDULE_TABLE(sport_man_schedule_dt); + +NpsScheduleData grim_man_schedule_dt[] = { + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(4, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(5, 0, 0) }, + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(10, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(11, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(15, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(16, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(22, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(23, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(24, 0, 0) }, +}; + +NpsScheduleDataTable grim_man_schedule = NPS_MAKE_SCHEDULE_TABLE(grim_man_schedule_dt); + +NpsScheduleData naniwa_lady_schedule_dt[] = { + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(1, 30, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(2, 30, 0) }, + { NPS_SCHEDULE_SLEEP, NPS_TIME_2_SEC(9, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(10, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(13, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(14, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(21, 0, 0) }, { NPS_SCHEDULE_IN_HOUSE, NPS_TIME_2_SEC(22, 0, 0) }, + { NPS_SCHEDULE_FIELD, NPS_TIME_2_SEC(24, 0, 0) }, +}; + +NpsScheduleDataTable naniwa_lady_schedule = NPS_MAKE_SCHEDULE_TABLE(naniwa_lady_schedule_dt); + +NpsScheduleDataTable* mNPS_schedule[NPC_LOOKS_NUM] = { &girl_schedule, &ko_girl_schedule, &boy_schedule, + &sport_man_schedule, &grim_man_schedule, &naniwa_lady_schedule }; + +NpsSchedule* mNPS_get_schedule_area(AnmPersonalID_c* id) { + NpsSchedule* schedule = common_data.npcSchedule; + s32 i; + + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if (schedule->id == id) { + return schedule; + } + + schedule++; + } + + return NULL; +} + +void mNPS_set_schedule_area(AnmPersonalID_c* id) { + NpsSchedule* schedule = mNPS_get_schedule_area(NULL); + + if (schedule != NULL) { + schedule->id = id; + schedule->dataTable = mNPS_schedule[id->looks]; + schedule->forcedTimer = 0; + } +} + +void mNPS_reset_schedule_area(AnmPersonalID_c* id) { + NpsSchedule* schedule = mNPS_get_schedule_area(id); + + if (schedule != NULL) { + schedule->id = NULL; + } +} + +void mNPS_schedule_manager_sub0(void) { + NpsSchedule* schedule = common_data.npcSchedule; + s32 i; + + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if (schedule->id != NULL) { + schedule->currentType = NPS_SCHEDULE_FIELD; + } + + schedule++; + } +} + +void mNPS_schedule_manager_sub(void) { + s32 sec = common_data.time.nowSec; + NpsSchedule* schedule = common_data.npcSchedule; + NpsScheduleData* entry; + s32 i; + s32 j; + + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if (schedule->id != NULL) { + entry = schedule->dataTable->scheduleData; + + for (j = schedule->dataTable->count; j != 0; j--) { + if (sec < entry->endTime) { + break; + } + entry++; + } + + schedule->savedType = entry->type; + if (schedule->forcedTimer > 0) { + schedule->currentType = schedule->forcedType; + schedule->forcedTimer--; + } else { + schedule->currentType = schedule->savedType; + } + } + schedule++; + } +} + +void mNPS_schedule_manager(void) { + s32 outside = mEv_CheckFirstJob() == TRUE; + + if (outside == FALSE) { + outside = mEv_check_status(0xD, 1) != FALSE; + } + + (outside == TRUE) ? mNPS_schedule_manager_sub0() : mNPS_schedule_manager_sub(); +} + +void mNPS_set_all_schedule_area(void) { + Animal_c* animal = common_data.animals; + s32 i; + + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if (mNpc_CheckFreeAnimalInfo(animal) == 0) { + mNPS_set_schedule_area(&animal->id); + } + animal++; + } + + mNPS_schedule_manager(); +} diff --git a/src/code/m_start_data_init.c b/src/code/m_start_data_init.c index 43ca1bf..c564b0d 100644 --- a/src/code/m_start_data_init.c +++ b/src/code/m_start_data_init.c @@ -8,7 +8,7 @@ #include "6BA500.h" #include "6C0690.h" #include "6C97F0.h" -#include "6D2720.h" +#include "m_npc_schedule.h" #include "6D9D80.h" #include "6DA460.h" #include "6DB420.h" diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml index 1357b92..080bc75 100644 --- a/yamls/jp/code.yaml +++ b/yamls/jp/code.yaml @@ -55,7 +55,7 @@ - [0x6C92D0, asm, code/6C92D0] - [0x6C97F0, asm, code/6C97F0] - [0x6CA4B0, asm, code/m_npc] - - [0x6D2720, asm, code/6D2720] + - [0x6D2720, c, code/m_npc_schedule] - [0x6D2A70, c, code/m_npc_walk] - [0x6D3CB0, asm, code/800B0010] - [0x6D3D20, asm, code/m_olib] @@ -148,6 +148,7 @@ - [0x72B7A0, data, code/m_lib] - [0x72B7D0, .data, code/m_lights] - [0x72B7F0, data, code/72B7F0] + - [0x72F610, .data, code/m_npc_schedule] - [0x72F7D0, .data, code/m_npc_walk] - [0x72F980, .data, code/m_player_call] - [0x72F9B0, data, code/72F9B0] -- cgit v1.2.3