mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-06-19 14:30:33 -04:00
1b0b96665a
Co-authored-by: NWPlayer123 <NWPlayer123@users.noreply.github.com>
182 lines
7.3 KiB
C
182 lines
7.3 KiB
C
#include "ef_effect_control.h"
|
|
|
|
#include "m_common_data.h"
|
|
#include "m_player_lib.h"
|
|
|
|
static void eDig_Scoop_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1);
|
|
static void eDig_Scoop_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg);
|
|
static void eDig_Scoop_mv(eEC_Effect_c* effect, GAME* game);
|
|
static void eDig_Scoop_dw(eEC_Effect_c* effect, GAME* game);
|
|
|
|
eEC_PROFILE_c iam_ef_dig_scoop = {
|
|
// clang-format off
|
|
&eDig_Scoop_init,
|
|
&eDig_Scoop_ct,
|
|
&eDig_Scoop_mv,
|
|
&eDig_Scoop_dw,
|
|
eEC_IGNORE_DEATH,
|
|
eEC_NO_CHILD_ID,
|
|
eEC_DEFAULT_DEATH_DIST,
|
|
// clang-format on
|
|
};
|
|
|
|
static void eDig_Scoop_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1) {
|
|
ACTOR* player_actorx = (ACTOR*)GET_PLAYER_ACTOR_GAME(game);
|
|
PLAYER_ACTOR* player;
|
|
int i;
|
|
s16 star_ef_angle;
|
|
s16 sand_angle;
|
|
xyz_t sand_pos;
|
|
s16 dust_angle;
|
|
|
|
pos.x += player_actorx->world.position.x + 30.0f * sin_s(angle);
|
|
pos.z += player_actorx->world.position.z + 30.0f * cos_s(angle);
|
|
pos.x /= 2.0f;
|
|
pos.z /= 2.0f;
|
|
|
|
if (eEC_CLIP != NULL) {
|
|
if (arg1 == 1) {
|
|
player = GET_PLAYER_ACTOR_GAME(game);
|
|
star_ef_angle = angle + DEG2SHORT_ANGLE2(22.5f);
|
|
|
|
switch (arg0) {
|
|
case mCoBG_ATTRIBUTE_BUSH: {
|
|
int i = 4;
|
|
|
|
do {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_BUSH_HAPPA, player->actor_class.world.position, prio,
|
|
angle, game, item_name, arg0, 1);
|
|
} while (i--);
|
|
|
|
if (Common_Get(time).season == mTM_SEASON_WINTER) {
|
|
int j = 4;
|
|
|
|
do {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_BUSH_YUKI, player->actor_class.world.position, prio,
|
|
angle, game, item_name, arg0, 0);
|
|
} while (j--);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case mCoBG_ATTRIBUTE_GRASS0:
|
|
case mCoBG_ATTRIBUTE_GRASS1:
|
|
case mCoBG_ATTRIBUTE_GRASS2:
|
|
case mCoBG_ATTRIBUTE_SOIL0:
|
|
case mCoBG_ATTRIBUTE_SOIL1:
|
|
case mCoBG_ATTRIBUTE_SOIL2: {
|
|
f32 ground_dist = mCoBG_GetBgY_AngleS_FromWpos(NULL, pos, 0.0f);
|
|
|
|
if (ground_dist < (pos.y + 10.0f)) {
|
|
break;
|
|
}
|
|
}
|
|
/* Fallthrough */
|
|
default: {
|
|
s16 i;
|
|
|
|
pos.y += 11.0f;
|
|
for (i = 0; i < 2; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_IMPACT_STAR, pos, prio, star_ef_angle, game, item_name,
|
|
arg0, (s16)i);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} else if (arg1 == 0) {
|
|
pos.y += 10.0f;
|
|
for (i = 0; i < 6; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_DIG_MUD, pos, prio, angle, game, item_name, arg0, i);
|
|
}
|
|
} else if (arg1 == 3) {
|
|
pos.y += 10.0f;
|
|
for (i = 3; i < 6; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_DIG_MUD, pos, prio, angle, game, item_name, arg0, i);
|
|
}
|
|
} else {
|
|
pos.y += 5.0f;
|
|
|
|
if (Common_Get(time).season == mTM_SEASON_WINTER) {
|
|
if (arg0 == mCoBG_ATTRIBUTE_GRASS0 || arg0 == mCoBG_ATTRIBUTE_GRASS1 ||
|
|
arg0 == mCoBG_ATTRIBUTE_GRASS2) {
|
|
for (i = 2; i < 6; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_YUKIDAMA, pos, prio, angle, game, item_name, arg0,
|
|
(0x2000 | 0x1000) | i);
|
|
}
|
|
} else if (arg0 == mCoBG_ATTRIBUTE_SAND) {
|
|
sand_angle = angle - DEG2SHORT_ANGLE2(45.0f);
|
|
for (i = 0; i < 3; i++) {
|
|
xyz_t sand_pos = pos;
|
|
|
|
sand_pos.x += 15.0f * sin_s(sand_angle);
|
|
sand_pos.z += 15.0f * cos_s(sand_angle);
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_SANDSPLASH, sand_pos, prio, sand_angle, game, item_name,
|
|
3, 0);
|
|
sand_angle += DEG2SHORT_ANGLE2(45.0f);
|
|
}
|
|
} else if (mEnv_NowWeather() != mEnv_WEATHER_RAIN && arg0 != mCoBG_ATTRIBUTE_WAVE) {
|
|
dust_angle = angle - DEG2SHORT_ANGLE2(45.0f);
|
|
for (i = 0; i < 3; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_TUMBLE_DUST, pos, prio, dust_angle, game, item_name, arg0,
|
|
i);
|
|
dust_angle += DEG2SHORT_ANGLE2(45.0f);
|
|
}
|
|
} else {
|
|
for (i = 2; i < 6; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_MIZUTAMA, pos, prio, angle, game, item_name, arg0,
|
|
(0x2000 | 0x1000) | i);
|
|
}
|
|
|
|
if (arg0 == mCoBG_ATTRIBUTE_WAVE) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_AMI_MIZU, pos, prio, angle, game, item_name, 1, 0);
|
|
}
|
|
}
|
|
} else {
|
|
if (arg0 == mCoBG_ATTRIBUTE_SAND) {
|
|
sand_angle = angle - DEG2SHORT_ANGLE2(45.0f);
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
xyz_t sand_pos = pos;
|
|
|
|
sand_pos.x += 15.0f * sin_s(sand_angle);
|
|
sand_pos.z += 15.0f * cos_s(sand_angle);
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_SANDSPLASH, sand_pos, prio, sand_angle, game, item_name,
|
|
3, 0);
|
|
sand_angle += DEG2SHORT_ANGLE2(45.0f);
|
|
}
|
|
} else if (mEnv_NowWeather() == mEnv_WEATHER_RAIN || arg0 == mCoBG_ATTRIBUTE_WAVE) {
|
|
for (i = 2; i < 6; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_MIZUTAMA, pos, prio, angle, game, item_name, arg0,
|
|
(0x2000 | 0x1000) | i);
|
|
}
|
|
|
|
if (arg0 == mCoBG_ATTRIBUTE_WAVE) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_AMI_MIZU, pos, prio, angle, game, item_name, 1, 0);
|
|
}
|
|
} else {
|
|
dust_angle = angle - DEG2SHORT_ANGLE2(45.0f);
|
|
for (i = 0; i < 3; i++) {
|
|
eEC_CLIP->effect_make_proc(eEC_EFFECT_TUMBLE_DUST, pos, prio, dust_angle, game, item_name, arg0,
|
|
i);
|
|
dust_angle += DEG2SHORT_ANGLE2(45.0f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
eEC_CLIP->make_effect_proc(eEC_EFFECT_DIG_SCOOP, pos, NULL, game, NULL, item_name, prio, arg0, arg1);
|
|
}
|
|
|
|
static void eDig_Scoop_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg) {
|
|
effect->timer = 0;
|
|
}
|
|
|
|
static void eDig_Scoop_mv(eEC_Effect_c* effect, GAME* game) {
|
|
// empty
|
|
}
|
|
|
|
static void eDig_Scoop_dw(eEC_Effect_c* effect, GAME* game) {
|
|
// empty
|
|
}
|