mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-06-22 06:56:33 -04:00
link ef_hanabi_set
This commit is contained in:
+1
-1
@@ -1263,7 +1263,7 @@ config.libs = [
|
||||
Object(Matching, "effect/ef_hanabi_botan2.c"),
|
||||
Object(Matching, "effect/ef_hanabi_dummy.c"),
|
||||
Object(Matching, "effect/ef_hanabi_hoshi.c"),
|
||||
Object(NonMatching, "effect/ef_hanabi_set.c"),
|
||||
Object(Matching, "effect/ef_hanabi_set.c"),
|
||||
Object(NonMatching, "effect/ef_hanabi_switch.c"),
|
||||
Object(NonMatching, "effect/ef_hanabi_yanagi.c"),
|
||||
Object(NonMatching, "effect/ef_hanabira.c"),
|
||||
|
||||
+138
-4
@@ -1,10 +1,14 @@
|
||||
#include "ef_effect_control.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_player_lib.h"
|
||||
|
||||
static void eHanabiSet_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1);
|
||||
static void eHanabiSet_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg);
|
||||
static void eHanabiSet_mv(eEC_Effect_c* effect, GAME* game);
|
||||
static void eHanabiSet_dw(eEC_Effect_c* effect, GAME* game);
|
||||
|
||||
#define EFFECT_LIFETIME 200
|
||||
|
||||
eEC_PROFILE_c iam_ef_hanabi_set = {
|
||||
// clang-format off
|
||||
&eHanabiSet_init,
|
||||
@@ -17,18 +21,148 @@ eEC_PROFILE_c iam_ef_hanabi_set = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
s16 frame;
|
||||
s16 effect_id;
|
||||
} eHanabiSet_sqdt;
|
||||
|
||||
typedef struct {
|
||||
eHanabiSet_sqdt* frame_effects;
|
||||
int count;
|
||||
} eHanabiSet_set;
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt1[] = { { 0, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 30, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 50, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 120, eEC_EFFECT_HANABI_BOTAN1 },
|
||||
{ 190, eEC_EFFECT_HANABI_BOTAN1 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set1 = { eHanabiSet_sqdt1, ARRAY_COUNT(eHanabiSet_sqdt1) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt2[] = { { 0, eEC_EFFECT_HANABI_BOTAN1 },
|
||||
{ 50, eEC_EFFECT_HANABI_BOTAN1 },
|
||||
{ 80, eEC_EFFECT_HANABI_BOTAN1 },
|
||||
{ 140, eEC_EFFECT_HANABI_BOTAN2 },
|
||||
{ 190, eEC_EFFECT_HANABI_BOTAN2 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set2 = { eHanabiSet_sqdt2, ARRAY_COUNT(eHanabiSet_sqdt2) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt3[] = { { 0, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 50, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 80, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 140, eEC_EFFECT_HANABI_BOTAN2 },
|
||||
{ 190, eEC_EFFECT_HANABI_BOTAN2 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set3 = { eHanabiSet_sqdt3, ARRAY_COUNT(eHanabiSet_sqdt3) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt4[] = { { 0, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 50, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 80, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 140, eEC_EFFECT_HANABI_BOTAN1 },
|
||||
{ 190, eEC_EFFECT_HANABI_BOTAN1 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set4 = { eHanabiSet_sqdt4, ARRAY_COUNT(eHanabiSet_sqdt4) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt5[] = { { 0, eEC_EFFECT_HANABI_HOSHI }, { 20, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 50, eEC_EFFECT_HANABI_BOTAN2 }, { 90, eEC_EFFECT_HANABI_BOTAN2 },
|
||||
{ 140, eEC_EFFECT_HANABI_HOSHI }, { 160, eEC_EFFECT_HANABI_BOTAN1 },
|
||||
{ 170, eEC_EFFECT_HANABI_BOTAN1 }, { 170, eEC_EFFECT_HANABI_BOTAN1 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set5 = { eHanabiSet_sqdt5, ARRAY_COUNT(eHanabiSet_sqdt5) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt6[] = { { 0, eEC_EFFECT_HANABI_BOTAN1 }, { 20, eEC_EFFECT_HANABI_BOTAN2 },
|
||||
{ 50, eEC_EFFECT_HANABI_BOTAN2 }, { 90, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 140, eEC_EFFECT_HANABI_YANAGI }, { 160, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 170, eEC_EFFECT_HANABI_BOTAN2 }, { 170, eEC_EFFECT_HANABI_BOTAN2 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set6 = { eHanabiSet_sqdt6, ARRAY_COUNT(eHanabiSet_sqdt6) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt7[] = { { 0, eEC_EFFECT_HANABI_BOTAN2 }, { 20, eEC_EFFECT_HANABI_BOTAN2 },
|
||||
{ 50, eEC_EFFECT_HANABI_HOSHI }, { 90, eEC_EFFECT_HANABI_HOSHI },
|
||||
{ 140, eEC_EFFECT_HANABI_YANAGI }, { 160, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 170, eEC_EFFECT_HANABI_YANAGI }, { 170, eEC_EFFECT_HANABI_YANAGI } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set7 = { eHanabiSet_sqdt7, ARRAY_COUNT(eHanabiSet_sqdt7) };
|
||||
|
||||
eHanabiSet_sqdt eHanabiSet_sqdt8[] = { { 0, eEC_EFFECT_HANABI_YANAGI }, { 10, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 20, eEC_EFFECT_HANABI_YANAGI }, { 30, eEC_EFFECT_HANABI_YANAGI },
|
||||
{ 140, eEC_EFFECT_HANABI_BOTAN2 }, { 160, eEC_EFFECT_HANABI_BOTAN2 },
|
||||
{ 170, eEC_EFFECT_HANABI_BOTAN2 }, { 190, eEC_EFFECT_HANABI_BOTAN2 } };
|
||||
|
||||
eHanabiSet_set eHanabiSet_set8 = { eHanabiSet_sqdt8, ARRAY_COUNT(eHanabiSet_sqdt8) };
|
||||
|
||||
eHanabiSet_set* eHanabiSet_set_table[] = { &eHanabiSet_set1, &eHanabiSet_set2, &eHanabiSet_set3, &eHanabiSet_set4,
|
||||
&eHanabiSet_set5, &eHanabiSet_set6, &eHanabiSet_set7, &eHanabiSet_set8 };
|
||||
|
||||
static void eHanabiSet_SearchNicePos(xyz_t* outPos, GAME* game) {
|
||||
PLAYER_ACTOR* player = GET_PLAYER_ACTOR_GAME(game);
|
||||
xyz_t zerovec = { 0.f, 0.f, 0.f };
|
||||
*outPos = zerovec;
|
||||
if (player) {
|
||||
xyz_t playerPos = player->actor_class.world.position;
|
||||
xyz_t wpos = { 0.f, 0.f, 0.f };
|
||||
int bx, bz;
|
||||
if (mFI_BlockKind2BkNum(&bx, &bz, mRF_BLOCKKIND_POOL) && mFI_BkNum2WposXZ(&wpos.x, &wpos.z, bx, bz)) {
|
||||
wpos.x += 320.f;
|
||||
wpos.y = 0.f;
|
||||
wpos.z += 320.f;
|
||||
outPos->x = (wpos.x + playerPos.x) * 0.5f;
|
||||
outPos->y = mFI_BkNum2BaseHeight(bx, bz) + 20.f;
|
||||
outPos->z = (wpos.z + playerPos.z) * 0.5f - 40.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void eHanabiSet_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1) {
|
||||
// TODO
|
||||
xyz_t outPos;
|
||||
eHanabiSet_SearchNicePos(&outPos, game);
|
||||
eEC_CLIP->make_effect_proc(eEC_EFFECT_HANABI_SET, outPos, NULL, game, NULL, item_name, prio, 0, 0);
|
||||
}
|
||||
|
||||
static void eHanabiSet_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg) {
|
||||
// TODO
|
||||
int f = RANDOM(1000.f) % 4;
|
||||
int hourEndMinusOne = mEv_get_end_time(mEv_EVENT_FIREWORKS_SHOW) - 1;
|
||||
lbRTC_hour_t hour = Common_Get(time.rtc_time.hour);
|
||||
effect->timer = EFFECT_LIFETIME;
|
||||
if (hour > hourEndMinusOne && hour <= mEv_get_end_time(mEv_EVENT_FIREWORKS_SHOW)) {
|
||||
effect->effect_specific[1] = TRUE;
|
||||
effect->effect_specific[0] = f + 4;
|
||||
} else {
|
||||
effect->effect_specific[1] = FALSE;
|
||||
effect->effect_specific[0] = f;
|
||||
}
|
||||
}
|
||||
|
||||
static void eHanabiSet_mv(eEC_Effect_c* effect, GAME* game) {
|
||||
// TODO
|
||||
s16 alive_frames = EFFECT_LIFETIME - effect->timer;
|
||||
int idx = effect->effect_specific[0];
|
||||
eHanabiSet_set* set = eHanabiSet_set_table[idx];
|
||||
eHanabiSet_sqdt* frame_effect = set->frame_effects;
|
||||
int i;
|
||||
int count = set->count;
|
||||
eHanabiSet_SearchNicePos(&effect->position, game);
|
||||
for (i = 0; i < count; frame_effect++, i++) {
|
||||
if (frame_effect->frame == alive_frames) {
|
||||
xyz_t effect_position = effect->position;
|
||||
int effect_id = frame_effect->effect_id;
|
||||
int bx, bz;
|
||||
s16 arg = 0;
|
||||
if (effect->effect_specific[1] == 1) {
|
||||
arg = 1;
|
||||
}
|
||||
effect_position.x += RANDOM_F(250.f) - 125.f;
|
||||
effect_position.z += RANDOM_F(250.f) - 125.f;
|
||||
mFI_Wpos2BlockNum(&bx, &bz, effect_position);
|
||||
if (!eEC_CLIP->check_lookat_block_proc(effect->position) ||
|
||||
mFI_CheckBlockKind_OR(bx, bz, mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF)) {
|
||||
effect_id = eEC_EFFECT_HANABI_DUMMY;
|
||||
}
|
||||
eEC_CLIP->effect_make_proc(effect_id, effect_position, effect->prio, 0, game,
|
||||
(mActor_name_t)effect->item_name, arg, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void eHanabiSet_dw(eEC_Effect_c* effect, GAME* game) {
|
||||
// TODO
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user