summaryrefslogtreecommitdiff
path: root/src/code/m_npc_schedule.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/code/m_npc_schedule.c')
-rw-r--r--src/code/m_npc_schedule.c168
1 files changed, 168 insertions, 0 deletions
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();
+}