diff options
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/m_npc_schedule.c | 168 | ||||
| -rw-r--r-- | src/code/m_start_data_init.c | 2 |
2 files changed, 169 insertions, 1 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(); +} 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" |
