summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2023-09-19 20:44:50 +0200
committerGitHub <noreply@github.com>2023-09-19 11:44:50 -0700
commitefd664e21960019bab6be475d848b5f9e68ea396 (patch)
tree9e10e0a34cae73a9068f550e0fa4bfbbd6bce3bd
parentef0a26fd481675a955b301d1b2261ded362c4190 (diff)
The NPC PR 2/3 OK (#97)
* m_npc_schedule OK Co-authored-by: Maide <you@example.com> * fix structs * fixes --------- Co-authored-by: Maide <you@example.com>
-rw-r--r--include/6D2720.h8
-rw-r--r--include/m_common_data.h3
-rw-r--r--include/m_event.h2
-rw-r--r--include/m_npc.h2
-rw-r--r--include/m_npc_schedule.h46
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt10
-rw-r--r--src/code/m_npc_schedule.c168
-rw-r--r--src/code/m_start_data_init.c2
-rw-r--r--yamls/jp/code.yaml3
9 files changed, 226 insertions, 18 deletions
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]