Files
ac-decomp/src/ac_groundhog_control.c
T
2023-12-09 13:34:31 +01:00

222 lines
7.4 KiB
C

#include "ac_groundhog_control.h"
#include "m_bgm.h"
#include "m_name_table.h"
#include "m_common_data.h"
static void aGHC_actor_ct(ACTOR* actor, GAME* game);
static void aGHC_actor_dt(ACTOR* actor, GAME* game);
static void aGHC_actor_move(ACTOR* actor, GAME* game);
ACTOR_PROFILE Groundhog_Control_Profile = {
mAc_PROFILE_GROUNDHOG_CONTROL,
ACTOR_PART_CONTROL,
ACTOR_STATE_NO_MOVE_WHILE_CULLED,
EMPTY_NO,
ACTOR_OBJ_BANK_KEEP,
sizeof(GROUNDHOG_CONTROL_ACTOR),
&aGHC_actor_ct,
&aGHC_actor_dt,
&aGHC_actor_move,
mActor_NONE_PROC1,
NULL
};
static int aGHC_get_now_term();
static void aGHC_setupAction(GROUNDHOG_CONTROL_ACTOR* groundhog_control, int action);
static void aGHC_actor_ct(ACTOR* actor, GAME* game) {
GROUNDHOG_CONTROL_ACTOR* groundhog_control = (GROUNDHOG_CONTROL_ACTOR*)actor;
int action = aGHC_ACTION_BEFORE_800;
aGHC_event_area_c* event_area;
if (aGHC_TIME_CHECK(8, 0, 0)) {
action = aGHC_ACTION_AFTER_800;
}
if (Common_Get(clip).groundhog_control_clip == NULL) {
Common_Get(clip).groundhog_control_clip = &groundhog_control->clip;
Common_Get(clip).groundhog_control_clip->now_term = aGHC_get_now_term();
}
event_area = (aGHC_event_area_c*)mEv_get_common_area(mEv_EVENT_GROUNDHOG_DAY, 0);
if (event_area == NULL) {
event_area = (aGHC_event_area_c*)mEv_reserve_common_area(mEv_EVENT_GROUNDHOG_DAY, 0);
}
else if (event_area->awaiting_birth == TRUE) {
action = aGHC_ACTION_BIRTH_RESET_WAIT;
groundhog_control->timer = 600;
}
groundhog_control->event_area_p = event_area;
aGHC_setupAction(groundhog_control, action);
}
static void aGHC_actor_dt(ACTOR* actor, GAME* game) {
Common_Get(clip).groundhog_control_clip = NULL;
mEv_actor_dying_message(mEv_EVENT_GROUNDHOG_DAY, actor);
}
static int aGHC_get_now_term() {
int res;
if (aGHC_TIME_CHECK(8, 0, 0)) {
res = 5;
}
else if (aGHC_TIME_CHECK(7, 59, 0)) {
res = 4;
}
else if (aGHC_TIME_CHECK(7, 55, 0)) {
res = 3;
}
else if (aGHC_TIME_CHECK(7, 45, 0)) {
res = 2;
}
else if (aGHC_TIME_CHECK(7, 30, 0)) {
res = 1;
}
else {
res = 0;
}
return res;
}
static void aGHC_search_soncho(GAME_PLAY* play) {
if (Common_Get(clip).groundhog_control_clip->attention_target_actor == NULL) {
Common_Get(clip).groundhog_control_clip->attention_target_actor = Actor_info_fgName_search(&play->actor_info, SP_NPC_EV_SPEECH_SONCHO, ACTOR_PART_NPC);
}
}
static void aGHC_set_attention_request(int groundhog_is_target) {
ACTOR* attention_target = NULL;
if (groundhog_is_target == FALSE) {
if (Common_Get(clip).groundhog_control_clip->attention_target_actor != NULL) {
attention_target = Common_Get(clip).groundhog_control_clip->attention_target_actor;
}
}
else if (Common_Get(clip).groundhog_control_clip->groundhog_npc_actor != NULL) {
attention_target = Common_Get(clip).groundhog_control_clip->groundhog_npc_actor;
}
if (attention_target != NULL) {
(*Common_Get(clip).npc_clip->set_attention_request_proc)(aNPC_ATTENTION_TYPE_ACTOR, attention_target, NULL);
}
}
static void aGHC_before_800(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
if (aGHC_TIME_CHECK(8, 0, 0) && Common_Get(clip).event_manager_clip != NULL) {
EVENT_MANAGER_ACTOR* event_manager = Common_Get(clip).event_manager_clip->event_manager_actor;
Common_Get(clip).groundhog_control_clip->fading_title = TRUE;
if ((*Common_Get(clip).event_manager_clip->title_fade_proc)(event_manager, mEv_EVENT_GROUNDHOG_DAY, 1, aEvMgr_EVENT_PLACE_SHRINE)) {
Common_Get(clip).groundhog_control_clip->fading_title = FALSE;
groundhog_control->event_area_p->awaiting_birth = TRUE;
}
}
}
static void aGHC_birth_reset_wait(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
groundhog_control->timer--;
if (groundhog_control->timer <= 0) {
aGHC_setupAction(groundhog_control, aGHC_ACTION_BIRTH_RESET);
}
}
static void aGHC_birth_reset(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
int bx;
int bz;
if (Common_Get(clip).npc_clip != NULL && Common_Get(clip).npc_clip->setupActor_proc != NULL && mFI_BlockKind2BkNum(&bx, &bz, mRF_BLOCKKIND_SHRINE) == TRUE) {
int spawned_actor = (*Common_Get(clip).npc_clip->setupActor_proc)(play, SP_NPC_EV_MAJIN, -1, -1, -1, bx, bz, 5, 8);
if (spawned_actor == TRUE) {
ACTOR* groundhog_actor = Actor_info_fgName_search(&play->actor_info, SP_NPC_EV_MAJIN, ACTOR_PART_NPC);
groundhog_actor->parent_actor = (ACTOR*)groundhog_control;
Common_Get(clip).groundhog_control_clip->groundhog_npc_actor = groundhog_actor;
groundhog_control->event_area_p->awaiting_birth = FALSE;
groundhog_control->attention_mode = aGHC_ATTENTION_GROUNDHOG;
mBGMPsComp_make_ps_quietField(360);
groundhog_control->timer = 240;
aGHC_setupAction(groundhog_control, aGHC_ACTION_RESET_SPEECH_BGM_START_WAIT);
}
}
}
static void aGHC_reset_speech_bgm_start_wait(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
groundhog_control->timer--;
if (groundhog_control->timer <= 0) {
mBGMPsComp_make_ps_demo(252, 360);
aGHC_setupAction(groundhog_control, aGHC_ACTION_RETIRE_RESET_WAIT);
}
}
static void aGHC_retire_reset_wait(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
if (groundhog_control->event_state == aGHC_EVENT_STATE_MAJIN_DONE) {
groundhog_control->timer = 60;
Camera2_Inter_set_reverse_mode(play);
mBGMPsComp_delete_ps_demo(252, 360);
groundhog_control->attention_mode = aGHC_ATTENTION_SONCHO;
aGHC_setupAction(groundhog_control, aGHC_ACTION_SONCHO_SPEECH_START_WAIT);
}
}
static void aGHC_soncho_speech_start_wait(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
groundhog_control->timer--;
if (groundhog_control->timer <= 0) {
aGHC_setupAction(groundhog_control, aGHC_ACTION_SONCHO_SPEECH_END_WAIT);
}
}
static void aGHC_soncho_speech_end_wait(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
if (groundhog_control->event_state == aGHC_EVENT_STATE_SONCHO_DONE) {
groundhog_control->timer = 20;
aGHC_setupAction(groundhog_control, aGHC_ACTION_FADE_OUT_START_WAIT);
}
}
static void aGHC_fade_out_start_wait(GROUNDHOG_CONTROL_ACTOR* groundhog_control, GAME_PLAY* play) {
groundhog_control->timer--;
if (groundhog_control->timer <= 0) {
Common_Set(event_title_fade_in_progress, TRUE);
mBGMPsComp_delete_ps_quietField();
mBGMPsComp_make_ps_co_quiet(360, 60);
aGHC_setupAction(groundhog_control, aGHC_ACTION_AFTER_800);
}
}
static void aGHC_setupAction(GROUNDHOG_CONTROL_ACTOR* groundhog_control, int action) {
static aGHC_ACTION_PROC process[aGHC_ACTION_NUM] = {
&aGHC_before_800,
&aGHC_birth_reset_wait,
&aGHC_birth_reset,
&aGHC_retire_reset_wait,
&aGHC_reset_speech_bgm_start_wait,
&aGHC_soncho_speech_start_wait,
&aGHC_soncho_speech_end_wait,
&aGHC_fade_out_start_wait,
(aGHC_ACTION_PROC)&none_proc1
};
groundhog_control->action_proc = process[action];
groundhog_control->action = action;
}
static void aGHC_actor_move(ACTOR* actor, GAME* game) {
GROUNDHOG_CONTROL_ACTOR* groundhog_control = (GROUNDHOG_CONTROL_ACTOR*)actor;
GAME_PLAY* play = (GAME_PLAY*)game;
Common_Get(clip).groundhog_control_clip->now_term = aGHC_get_now_term();
aGHC_search_soncho(play);
aGHC_set_attention_request(groundhog_control->attention_mode);
(*groundhog_control->action_proc)(groundhog_control, play);
groundhog_control->event_state = aGHC_EVENT_STATE_NONE;
}