diff options
| author | Prakxo <87568477+Prakxo@users.noreply.github.com> | 2023-09-19 20:44:50 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-19 11:44:50 -0700 |
| commit | efd664e21960019bab6be475d848b5f9e68ea396 (patch) | |
| tree | 9e10e0a34cae73a9068f550e0fa4bfbbd6bce3bd /src/code/m_npc_schedule.c | |
| parent | ef0a26fd481675a955b301d1b2261ded362c4190 (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>
Diffstat (limited to 'src/code/m_npc_schedule.c')
| -rw-r--r-- | src/code/m_npc_schedule.c | 168 |
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(); +} |
