mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-06-26 00:14:34 -04:00
222 lines
7.4 KiB
C
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;
|
|
}
|