mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-22 22:24:16 -04:00
Implement & link ac_house_goki
This commit is contained in:
+1
-1
@@ -981,7 +981,7 @@ config.libs = [
|
||||
Object(Matching, "actor/ac_hatumode_control.c"),
|
||||
Object(Matching, "actor/ac_house.c"),
|
||||
Object(Matching, "actor/ac_house_clock.c"),
|
||||
Object(NonMatching, "actor/ac_house_goki.c"),
|
||||
Object(Matching, "actor/ac_house_goki.c"),
|
||||
Object(Matching, "actor/ac_htable.c"),
|
||||
Object(Matching, "actor/ac_ins_amenbo.c"),
|
||||
Object(Matching, "actor/ac_ins_batta.c"),
|
||||
|
||||
+16
-1
@@ -8,6 +8,22 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct house_goki_actor_s HOUSE_GOKI_ACTOR;
|
||||
typedef void (*aHG_ACT_PROC)(ACTOR* actorx, GAME* game);
|
||||
|
||||
struct house_goki_actor_s {
|
||||
/* 0x000 */ACTOR actor_class;
|
||||
/* 0x174 */aHG_ACT_PROC act_proc;
|
||||
/* 0x178 */int _178;
|
||||
/* 0x17C */int action;
|
||||
/* 0x180 */f32 timer;
|
||||
/* 0x184 */f32 timer2;
|
||||
/* 0x188 */int jump_flag;
|
||||
/* 0x18C */f32 shadow_alpha;
|
||||
/* 0x190 */f32 alpha;
|
||||
/* 0x194 */f32 anm_no;
|
||||
};
|
||||
|
||||
extern ACTOR_PROFILE House_Goki_Profile;
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -15,4 +31,3 @@ extern ACTOR_PROFILE House_Goki_Profile;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -93,6 +93,7 @@ typedef enum audio_sound_effects {
|
||||
NA_SE_CLEAN_UP_FTR = 0x58,
|
||||
|
||||
NA_SE_TOOL_FURI = 0x5A, // swing?
|
||||
NA_SE_GOKI_DEAD = 0x5B,
|
||||
NA_SE_AMI_HIT = 0x5C,
|
||||
NA_SE_TOOL_GET,
|
||||
NA_SE_5E = 0x5E,
|
||||
@@ -152,6 +153,8 @@ typedef enum audio_sound_effects {
|
||||
|
||||
NA_SE_12D = 0x12D,
|
||||
|
||||
NA_SE_GOKI_JUMP_AWAY = 0x132,
|
||||
|
||||
NA_SE_TREE_TOUCH = 0x134,
|
||||
NA_SE_TREE_YURASU,
|
||||
|
||||
|
||||
+4
-1
@@ -409,7 +409,7 @@ typedef enum bank_id {
|
||||
ACTOR_OBJ_BANK_366,
|
||||
ACTOR_OBJ_BANK_367,
|
||||
ACTOR_OBJ_BANK_368,
|
||||
ACTOR_OBJ_BANK_369,
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI,
|
||||
ACTOR_OBJ_BANK_NPC_SAO,
|
||||
ACTOR_OBJ_BANK_TUMBLER,
|
||||
ACTOR_OBJ_BANK_372,
|
||||
@@ -1045,6 +1045,9 @@ enum {
|
||||
mAc_HILITE_NUM
|
||||
};
|
||||
|
||||
#define mAc_CHK_HIT_WALL(actor, wall) ((actor)->bg_collision_check.result.hit_wall & (wall))
|
||||
#define mAc_CHK_HIT_ATR_WALL(actor, wall) ((actor)->bg_collision_check.result.hit_attribute_wall & (wall))
|
||||
|
||||
/* sizeof(ACTOR_PROFILE) == 0x24 */
|
||||
struct actor_profile_s {
|
||||
/* 0x00 */ s16 id; /* unique actor type ID */
|
||||
|
||||
@@ -362,6 +362,7 @@ extern void mCoBG_VirtualBGCheck(xyz_t* rev_pos_p, mCoBG_Check_c* bg_check, cons
|
||||
f32 ground_dist, s16 attr_wall, s16 rev_type, s16 check_type);
|
||||
extern f32 mCoBG_Wpos2GroundCheckOnly(const xyz_t* pos_p, f32 ground_dist);
|
||||
extern int mCoBG_Wpos2CheckNpc(xyz_t wpos);
|
||||
extern void mCoBG_WallCheckOnly(xyz_t* rev_pos_p, ACTOR* actor, f32 range, f32 ground_dist, s16 rev_type, s16 check_type);
|
||||
|
||||
typedef int (*mCoBG_LINECHECK_PROC)(mActor_name_t);
|
||||
|
||||
|
||||
@@ -0,0 +1,457 @@
|
||||
#include "ac_house_goki.h"
|
||||
|
||||
#include "m_actor_shadow.h"
|
||||
#include "m_play.h"
|
||||
#include "m_player_lib.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_cockroach.h"
|
||||
#include "sys_matrix.h"
|
||||
#include "m_rcp.h"
|
||||
|
||||
enum {
|
||||
aHG_ACT_AWAY,
|
||||
aHG_ACT_JUMP_AWAY,
|
||||
aHG_ACT_WAIT,
|
||||
aHG_ACT_MOVE,
|
||||
aHG_ACT_DEAD,
|
||||
|
||||
aHG_ACT_NUM
|
||||
};
|
||||
|
||||
static void aHG_actor_ct(ACTOR* actorx, GAME* game);
|
||||
static void aHG_actor_move(ACTOR* actorx, GAME* game);
|
||||
static void aHG_actor_draw(ACTOR* actorx, GAME* game);
|
||||
|
||||
// clang-format off
|
||||
ACTOR_PROFILE House_Goki_Profile = {
|
||||
mAc_PROFILE_HOUSE_GOKI,
|
||||
ACTOR_PART_BG,
|
||||
ACTOR_STATE_NO_MOVE_WHILE_CULLED,
|
||||
EMPTY_NO,
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI,
|
||||
sizeof(HOUSE_GOKI_ACTOR),
|
||||
&aHG_actor_ct,
|
||||
mActor_NONE_PROC1,
|
||||
&aHG_actor_move,
|
||||
&aHG_actor_draw,
|
||||
NULL,
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
static void aHG_setupAction(HOUSE_GOKI_ACTOR* goki, GAME* game, int action);
|
||||
|
||||
static void aHG_actor_ct(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
|
||||
goki->alpha = 30.0f;
|
||||
if (actorx->actor_specific <= 0) {
|
||||
actorx->actor_specific = 0;
|
||||
goki->alpha = 255.0f;
|
||||
}
|
||||
|
||||
actorx->scale.x = 0.01f;
|
||||
actorx->scale.y = 0.01f;
|
||||
actorx->scale.z = 0.01f;
|
||||
|
||||
Shape_Info_init(actorx, 0.0f, &mAc_ActorShadowCircle, 6.0f, 6.0f);
|
||||
xyz_t_move(&actorx->home.position, &actorx->world.position);
|
||||
actorx->gravity = -2.0f;
|
||||
actorx->shape_info.rotation.y = actorx->player_angle_y + DEG2SHORT_ANGLE2(180.0f);
|
||||
actorx->world.angle.y = actorx->shape_info.rotation.y;
|
||||
aHG_setupAction(goki, game, aHG_ACT_AWAY);
|
||||
}
|
||||
|
||||
static void aHG_anime_proc(HOUSE_GOKI_ACTOR* goki) {
|
||||
goki->anm_no += 0.5f;
|
||||
if (goki->anm_no >= 2.0f) {
|
||||
goki->anm_no -= 2.0f;
|
||||
}
|
||||
}
|
||||
|
||||
static void aHG_calc_timer(HOUSE_GOKI_ACTOR* goki) {
|
||||
goki->timer -= 0.5f;
|
||||
if (goki->timer < 0.0f) {
|
||||
goki->timer = 0.0f;
|
||||
}
|
||||
|
||||
goki->timer2 -= 0.5f;
|
||||
if (goki->timer2 < 0.0f) {
|
||||
goki->timer2 = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
static s16 aHG_away_bg_hitangle_check_proc(ACTOR* actorx) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
s16 angle = 777; // 0x309
|
||||
s16 wall_angle[2];
|
||||
int i;
|
||||
|
||||
goki->timer2 = 0.0f;
|
||||
if (actorx->player_distance_xz > 20.0f) {
|
||||
wall_angle[0] = 777;
|
||||
wall_angle[1] = 777;
|
||||
|
||||
if (actorx->bg_collision_check.result.hit_wall & mCoBG_HIT_WALL_FRONT) {
|
||||
wall_angle[0] = DEG2SHORT_ANGLE2(-90.0f);
|
||||
wall_angle[1] = DEG2SHORT_ANGLE2(90.0f);
|
||||
}
|
||||
|
||||
if ((actorx->bg_collision_check.result.hit_wall & mCoBG_HIT_WALL_RIGHT) || (actorx->bg_collision_check.result.hit_wall & mCoBG_HIT_WALL_LEFT)) {
|
||||
if (wall_angle[0] == 777) {
|
||||
wall_angle[0] = DEG2SHORT_ANGLE2(180.0f) - actorx->world.angle.y;
|
||||
if (wall_angle[0] > 0) {
|
||||
wall_angle[0] = DEG2SHORT_ANGLE2(360.0f) - actorx->world.angle.y;
|
||||
}
|
||||
} else if (actorx->bg_collision_check.result.hit_wall & mCoBG_HIT_WALL_RIGHT) {
|
||||
wall_angle[0] = DEG2SHORT_ANGLE2(90.0f);
|
||||
} else {
|
||||
wall_angle[0] = DEG2SHORT_ANGLE2(-90.0f);
|
||||
}
|
||||
|
||||
angle = wall_angle[0];
|
||||
} else {
|
||||
i = 0;
|
||||
|
||||
if (wall_angle[0] != 777) {
|
||||
// wall_angle[0] -= actorx->player_angle_y;
|
||||
angle = ABS((s16)(wall_angle[0] - actorx->player_angle_y));
|
||||
}
|
||||
|
||||
if (wall_angle[1] != 777) {
|
||||
// wall_angle[1] -= actorx->player_angle_y;
|
||||
|
||||
|
||||
if (angle < (s16)ABS((s16)(wall_angle[1] - actorx->player_angle_y))) {
|
||||
i = 1;
|
||||
}
|
||||
}
|
||||
|
||||
angle = wall_angle[i];
|
||||
}
|
||||
}
|
||||
|
||||
return angle;
|
||||
}
|
||||
|
||||
static void aHG_decide_next_act_idx_wait_move(HOUSE_GOKI_ACTOR* goki, GAME* game) {
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
int next_act_idx = aHG_ACT_MOVE;
|
||||
|
||||
goki->timer = 5.0f + RANDOM_F(5.0f);
|
||||
if (play->game_frame % 100 > 20 || RANDOM_F(1.0f) < 0.5f) {
|
||||
next_act_idx = aHG_ACT_WAIT;
|
||||
} else if (goki->actor_class.player_distance_xz < 60.0f) {
|
||||
next_act_idx = aHG_ACT_WAIT;
|
||||
}
|
||||
|
||||
aHG_setupAction(goki, game, next_act_idx);
|
||||
}
|
||||
|
||||
static void aHG_position_move(ACTOR* actorx) {
|
||||
s16 angleY = actorx->world.angle.y;
|
||||
|
||||
actorx->position_speed.x = actorx->speed * sin_s(angleY);
|
||||
actorx->position_speed.z = actorx->speed * cos_s(angleY);
|
||||
actorx->position_speed.y += actorx->gravity;
|
||||
Actor_position_move(actorx);
|
||||
}
|
||||
|
||||
static void aHG_BGcheck(ACTOR* actorx) {
|
||||
mCoBG_WallCheckOnly(NULL, actorx, 15.0f, 0.0f, 0, 0);
|
||||
if (actorx->world.position.y < actorx->home.position.y) {
|
||||
actorx->world.position.y = actorx->home.position.y;
|
||||
}
|
||||
}
|
||||
|
||||
static int aHG_calc_add_alpha(HOUSE_GOKI_ACTOR* goki) {
|
||||
int ret = FALSE;
|
||||
|
||||
goki->alpha += 3.5f;
|
||||
if (goki->alpha > 255.0f) {
|
||||
goki->alpha = 255.0f;
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int aHG_check_dead(ACTOR* actorx, GAME* game) {
|
||||
ACTOR* playerx = GET_PLAYER_ACTOR_GAME_ACTOR(game);
|
||||
int ret = FALSE;
|
||||
|
||||
if (aMR_CLIP != NULL && aMR_CLIP->check_danna_kill_proc(&actorx->world.position)) {
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
if (actorx->bg_collision_check.result.unk_flag2 || actorx->bg_collision_check.result.unk_flag3) {
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
if (playerx != NULL && !F32_IS_ZERO(playerx->speed) && actorx->player_distance_xz < 9.0f && actorx->world.position.y == actorx->home.position.y) {
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int aHG_player_check(ACTOR* actorx, GAME* game) {
|
||||
ACTOR* playerx = GET_PLAYER_ACTOR_GAME_ACTOR(game);
|
||||
int ret = FALSE;
|
||||
|
||||
if (playerx != NULL && !F32_IS_ZERO(playerx->speed) && actorx->player_distance_xz < 60.0f) {
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int aHG_check_threshold(ACTOR* actorx) {
|
||||
mActor_name_t* fg_p = mFI_GetUnitFG(actorx->world.position);
|
||||
|
||||
if (fg_p != NULL && *fg_p == RSV_DOOR) {
|
||||
actorx->shape_info.rotation.y = DEG2SHORT_ANGLE2(180.0f);
|
||||
actorx->world.angle.y = DEG2SHORT_ANGLE2(180.0f);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void aHG_away(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
|
||||
if (goki->timer <= 0.0f && !goki->jump_flag && !aHG_player_check(actorx, game)) {
|
||||
goki->timer = 20.0f + RANDOM_F(20.0f);
|
||||
aHG_setupAction(goki, game, aHG_ACT_WAIT);
|
||||
} else {
|
||||
if (aHG_check_threshold(actorx) == TRUE) {
|
||||
goki->jump_flag = TRUE;
|
||||
goki->timer2 = 4.0f + RANDOM_F(4.0f);
|
||||
} else {
|
||||
goki->jump_flag = FALSE;
|
||||
|
||||
if (goki->timer2 <= 0.0f) {
|
||||
if (actorx->bg_collision_check.result.hit_wall != mCoBG_DIDNT_HIT_WALL) {
|
||||
f32 chance = 0.2f;
|
||||
s16 angle = aHG_away_bg_hitangle_check_proc(actorx);
|
||||
|
||||
if (angle != 777) {
|
||||
actorx->world.angle.y += angle;
|
||||
actorx->world.angle.y &= 0xC000; // only allow movement on pure X & Z axes: 0, 90, 180, 270
|
||||
actorx->shape_info.rotation.y = actorx->world.angle.y;
|
||||
goki->timer2 = 5.0f + RANDOM_F(5.0f);
|
||||
} else {
|
||||
chance = 0.5f;
|
||||
}
|
||||
|
||||
if (RANDOM_F(1.0f) < chance) {
|
||||
aHG_setupAction(goki, game, aHG_ACT_JUMP_AWAY);
|
||||
}
|
||||
} else {
|
||||
actorx->world.angle.y = actorx->player_angle_y + DEG2SHORT_ANGLE2(180.0f);
|
||||
actorx->shape_info.rotation.y = actorx->world.angle.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sAdo_OngenPos((u32)goki, NA_SE_GOKI_MOVE, &actorx->world.position);
|
||||
}
|
||||
}
|
||||
|
||||
static void aHG_jump_away(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
|
||||
if (actorx->world.position.y == actorx->home.position.y) {
|
||||
aHG_setupAction(goki, game, aHG_ACT_AWAY);
|
||||
} else {
|
||||
aHG_anime_proc(goki);
|
||||
if (actorx->position_speed.y < 0.0f) {
|
||||
actorx->gravity = -7.0f;
|
||||
}
|
||||
aHG_check_threshold(actorx);
|
||||
}
|
||||
}
|
||||
|
||||
static void aHG_wait(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
ACTOR* playerx = GET_PLAYER_ACTOR_GAME_ACTOR(game); // @unused
|
||||
|
||||
if (aHG_player_check(actorx, game) == TRUE) {
|
||||
aHG_setupAction(goki, game, aHG_ACT_AWAY);
|
||||
} else if (goki->timer <= 0.0f) {
|
||||
aHG_decide_next_act_idx_wait_move(goki, game);
|
||||
}
|
||||
}
|
||||
|
||||
static void aHG_move(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
|
||||
if (aHG_player_check(actorx, game) == TRUE) {
|
||||
aHG_setupAction(goki, game, aHG_ACT_AWAY);
|
||||
} else {
|
||||
if (mAc_CHK_HIT_WALL(actorx, mCoBG_HIT_WALL_FRONT) ||
|
||||
mAc_CHK_HIT_ATR_WALL(actorx, mCoBG_HIT_WALL_FRONT) ||
|
||||
mAc_CHK_HIT_WALL(actorx, mCoBG_HIT_WALL_RIGHT) ||
|
||||
mAc_CHK_HIT_ATR_WALL(actorx, mCoBG_HIT_WALL_RIGHT) ||
|
||||
mAc_CHK_HIT_WALL(actorx, mCoBG_HIT_WALL_LEFT) ||
|
||||
mAc_CHK_HIT_ATR_WALL(actorx, mCoBG_HIT_WALL_LEFT)) {
|
||||
if (!goki->jump_flag) {
|
||||
actorx->shape_info.rotation.y += DEG2SHORT_ANGLE2(180.0f);
|
||||
actorx->world.angle.y = actorx->shape_info.rotation.y;
|
||||
}
|
||||
|
||||
goki->jump_flag = TRUE;
|
||||
} else {
|
||||
if (aHG_check_threshold(actorx) == TRUE) {
|
||||
goki->timer = 5.0f + RANDOM_F(5.0f);
|
||||
}
|
||||
|
||||
goki->jump_flag = FALSE;
|
||||
}
|
||||
|
||||
if (goki->timer <= 0.0f) {
|
||||
aHG_decide_next_act_idx_wait_move(goki, game);
|
||||
} else {
|
||||
sAdo_OngenPos((u32)goki, NA_SE_GOKI_MOVE, &actorx->world.position);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void aHG_dead(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
|
||||
goki->alpha = goki->shadow_alpha;
|
||||
if (((int)goki->timer & 2) == 0) {
|
||||
goki->alpha = 0.0f;
|
||||
}
|
||||
|
||||
goki->shadow_alpha -= 2.5f;
|
||||
if (goki->shadow_alpha < 0.0f) {
|
||||
goki->shadow_alpha = 0.0f;
|
||||
}
|
||||
|
||||
actorx->shape_info.shadow_alpha_change_rate = goki->shadow_alpha * 0.0015f;
|
||||
if (goki->timer <= 0.0f) {
|
||||
Actor_delete(actorx);
|
||||
}
|
||||
}
|
||||
|
||||
static void aHG_away_init(HOUSE_GOKI_ACTOR* goki, GAME* game) {
|
||||
goki->timer = 20.0f + RANDOM_F(20.0f);
|
||||
goki->timer2 = 0.0f;
|
||||
goki->jump_flag = FALSE;
|
||||
goki->anm_no = 0.0f;
|
||||
goki->actor_class.speed = 8.0f;
|
||||
}
|
||||
|
||||
static void aHG_jump_away_init(HOUSE_GOKI_ACTOR* goki, GAME* game) {
|
||||
// @BUG - incorrect usage of random generator again. Devs clearly intended this to be a random
|
||||
// binary value (0 or 1), but calling RANDOM(1) will always result in 0 when aliasing to integer.
|
||||
// Bug results in the cockroach jump movement always being 22.5 degrees more than
|
||||
// the player angle.
|
||||
#ifndef BUGFIXES
|
||||
goki->actor_class.shape_info.rotation.y = goki->actor_class.player_angle_y + (s16)(DEG2SHORT_ANGLE2(22.5f) - ((s16)RANDOM(1) * DEG2SHORT_ANGLE2(45.0f)));
|
||||
#else
|
||||
goki->actor_class.shape_info.rotation.y = goki->actor_class.player_angle_y + (s16)(DEG2SHORT_ANGLE2(22.5f) - ((s16)RANDOM(2) * DEG2SHORT_ANGLE2(45.0f)));
|
||||
#endif
|
||||
goki->actor_class.world.angle.y = goki->actor_class.shape_info.rotation.y;
|
||||
goki->actor_class.position_speed.y = 17.0f;
|
||||
goki->actor_class.gravity = -2.0f;
|
||||
goki->actor_class.speed = 5.0f;
|
||||
sAdo_OngenTrgStart(NA_SE_GOKI_JUMP_AWAY, &goki->actor_class.world.position);
|
||||
}
|
||||
|
||||
static void aHG_wait_init(HOUSE_GOKI_ACTOR* goki, GAME* game) {
|
||||
goki->actor_class.shape_info.rotation.y = goki->actor_class.player_angle_y + DEG2SHORT_ANGLE2(180.0f);
|
||||
goki->actor_class.world.angle.y = goki->actor_class.shape_info.rotation.y;
|
||||
goki->actor_class.speed = 0.0f;
|
||||
goki->anm_no = 0.0f;
|
||||
}
|
||||
|
||||
static void aHG_move_init(HOUSE_GOKI_ACTOR* goki, GAME* game) {
|
||||
xyz_t pos;
|
||||
|
||||
goki->timer = 5.0f + RANDOM_F(5.0f);
|
||||
goki->jump_flag = FALSE;
|
||||
xyz_t_move(&pos, &goki->actor_class.world.position);
|
||||
pos.x += 80.0f - RANDOM_F(160.0f);
|
||||
pos.z += 80.0f - RANDOM_F(160.0f);
|
||||
goki->actor_class.shape_info.rotation.y = search_position_angleY(&goki->actor_class.world.position, &pos);
|
||||
goki->actor_class.world.angle.y = goki->actor_class.shape_info.rotation.y;
|
||||
goki->actor_class.speed = 4.0f;
|
||||
}
|
||||
|
||||
static void aHG_dead_init(HOUSE_GOKI_ACTOR* goki, GAME* game) {
|
||||
eEC_CLIP->effect_make_proc(eEC_EFFECT_GOKI, goki->actor_class.world.position, 1, 0, game, EMPTY_NO, 0, 0);
|
||||
mCkRh_CalcCanLookGokiCount(-1);
|
||||
sAdo_OngenTrgStart(NA_SE_GOKI_DEAD, &goki->actor_class.world.position);
|
||||
goki->shadow_alpha = 255.0f;
|
||||
goki->actor_class.speed = 0.0f;
|
||||
goki->timer = 40.0f;
|
||||
}
|
||||
|
||||
typedef void (*aHG_INIT_PROC)(HOUSE_GOKI_ACTOR* goki, GAME* game);
|
||||
|
||||
static void aHG_setupAction(HOUSE_GOKI_ACTOR* goki, GAME* game, int act) {
|
||||
static aHG_INIT_PROC init_proc[] = {
|
||||
&aHG_away_init,
|
||||
&aHG_jump_away_init,
|
||||
&aHG_wait_init,
|
||||
&aHG_move_init,
|
||||
&aHG_dead_init,
|
||||
};
|
||||
|
||||
static aHG_ACT_PROC act_proc[] = {
|
||||
&aHG_away,
|
||||
&aHG_jump_away,
|
||||
&aHG_wait,
|
||||
&aHG_move,
|
||||
&aHG_dead,
|
||||
};
|
||||
|
||||
goki->action = act;
|
||||
goki->act_proc = act_proc[act];
|
||||
(*init_proc[act])(goki, game);
|
||||
}
|
||||
|
||||
static void aHG_actor_move(ACTOR* actorx, GAME* game) {
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
|
||||
aHG_position_move(actorx);
|
||||
aHG_BGcheck(actorx);
|
||||
aHG_calc_timer(goki);
|
||||
|
||||
if (goki->action != aHG_ACT_DEAD && aHG_calc_add_alpha(goki) == TRUE && aHG_check_dead(actorx, game) == TRUE) {
|
||||
aHG_setupAction(goki, game, aHG_ACT_DEAD);
|
||||
}
|
||||
|
||||
(*goki->act_proc)(actorx, game);
|
||||
}
|
||||
|
||||
extern Gfx act_m_house_goki1T_model[];
|
||||
extern Gfx act_m_house_goki2T_model[];
|
||||
|
||||
static void aHG_actor_draw(ACTOR* actorx, GAME* game) {
|
||||
static Gfx* aHG_displayList[] = { act_m_house_goki1T_model, act_m_house_goki2T_model };
|
||||
GRAPH* graph = game->graph;
|
||||
HOUSE_GOKI_ACTOR* goki = (HOUSE_GOKI_ACTOR*)actorx;
|
||||
|
||||
Matrix_push();
|
||||
Matrix_translate(actorx->world.position.x, actorx->world.position.y + 2.0f, actorx->world.position.z, 0);
|
||||
Matrix_scale(actorx->scale.x, actorx->scale.y, actorx->scale.z, 1);
|
||||
Matrix_RotateX(actorx->shape_info.rotation.x, 1);
|
||||
Matrix_RotateY(actorx->shape_info.rotation.y, 1);
|
||||
_texture_z_light_fog_prim_xlu(graph);
|
||||
|
||||
OPEN_POLY_XLU_DISP(graph);
|
||||
|
||||
gSPMatrix(POLY_XLU_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_LOAD | G_MTX_NOPUSH);
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, (u32)goki->alpha);
|
||||
gSPDisplayList(POLY_XLU_DISP++, aHG_displayList[(int)goki->anm_no]);
|
||||
|
||||
CLOSE_POLY_XLU_DISP(graph);
|
||||
|
||||
Matrix_pull();
|
||||
}
|
||||
@@ -42,7 +42,7 @@ extern s16 MUSEUM_FOSSIL_ctrl_actor_data[] = {
|
||||
};
|
||||
|
||||
extern s16 MUSEUM_FOSSIL_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_369, // 0
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 0
|
||||
};
|
||||
|
||||
extern Door_data_c MUSEUM_FOSSIL_door_data[] = {
|
||||
|
||||
@@ -42,7 +42,7 @@ extern s16 P_ROOM_BM_L_ctrl_actor_data[] = {
|
||||
};
|
||||
|
||||
extern s16 P_ROOM_BM_L_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_369, // 0
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 0
|
||||
};
|
||||
|
||||
extern Door_data_c P_ROOM_BM_L_door_data[] = {
|
||||
|
||||
@@ -42,7 +42,7 @@ extern s16 P_ROOM_BM_LL1_ctrl_actor_data[] = {
|
||||
};
|
||||
|
||||
extern s16 P_ROOM_BM_LL1_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_369, // 0
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 0
|
||||
};
|
||||
|
||||
extern Door_data_c P_ROOM_BM_LL1_door_data[] = {
|
||||
|
||||
@@ -42,7 +42,7 @@ extern s16 P_ROOM_BM_M_ctrl_actor_data[] = {
|
||||
};
|
||||
|
||||
extern s16 P_ROOM_BM_M_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_369, // 0
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 0
|
||||
};
|
||||
|
||||
extern Door_data_c P_ROOM_BM_M_door_data[] = {
|
||||
|
||||
@@ -42,7 +42,7 @@ extern s16 P_ROOM_BM_S_ctrl_actor_data[] = {
|
||||
};
|
||||
|
||||
extern s16 P_ROOM_BM_S_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_369, // 0
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 0
|
||||
};
|
||||
|
||||
extern Door_data_c P_ROOM_BM_S_door_data[] = {
|
||||
|
||||
@@ -60,7 +60,7 @@ extern Actor_data PLAYER_ROOM_ISLAND_actor_data[] = {
|
||||
|
||||
extern s16 PLAYER_ROOM_ISLAND_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_ROOM_SUNSHINE, // 0
|
||||
ACTOR_OBJ_BANK_369, // 1
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 1
|
||||
};
|
||||
|
||||
extern Door_data_c PLAYER_ROOM_ISLAND_door_data[] = {
|
||||
|
||||
@@ -60,7 +60,7 @@ extern Actor_data PLAYER_ROOM_L_actor_data[] = {
|
||||
|
||||
extern s16 PLAYER_ROOM_L_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_ROOM_SUNSHINE, // 0
|
||||
ACTOR_OBJ_BANK_369, // 1
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 1
|
||||
};
|
||||
|
||||
extern Door_data_c PLAYER_ROOM_L_door_data[] = {
|
||||
|
||||
@@ -60,7 +60,7 @@ extern Actor_data PLAYER_ROOM_LL1_actor_data[] = {
|
||||
|
||||
extern s16 PLAYER_ROOM_LL1_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_ROOM_SUNSHINE, // 0
|
||||
ACTOR_OBJ_BANK_369, // 1
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 1
|
||||
};
|
||||
|
||||
extern Door_data_c PLAYER_ROOM_LL1_door_data[] = {
|
||||
|
||||
@@ -60,7 +60,7 @@ extern Actor_data PLAYER_ROOM_LL2_actor_data[] = {
|
||||
|
||||
extern s16 PLAYER_ROOM_LL2_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_ROOM_SUNSHINE, // 0
|
||||
ACTOR_OBJ_BANK_369, // 1
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 1
|
||||
};
|
||||
|
||||
extern Door_data_c PLAYER_ROOM_LL2_door_data[] = {
|
||||
|
||||
@@ -60,7 +60,7 @@ extern Actor_data PLAYER_ROOM_M_actor_data[] = {
|
||||
|
||||
extern s16 PLAYER_ROOM_M_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_ROOM_SUNSHINE, // 0
|
||||
ACTOR_OBJ_BANK_369, // 1
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 1
|
||||
};
|
||||
|
||||
extern Door_data_c PLAYER_ROOM_M_door_data[] = {
|
||||
|
||||
@@ -60,7 +60,7 @@ extern Actor_data PLAYER_ROOM_S_actor_data[] = {
|
||||
|
||||
extern s16 PLAYER_ROOM_S_object_bank[] = {
|
||||
ACTOR_OBJ_BANK_ROOM_SUNSHINE, // 0
|
||||
ACTOR_OBJ_BANK_369, // 1
|
||||
ACTOR_OBJ_BANK_HOUSE_GOKI, // 1
|
||||
};
|
||||
|
||||
extern Door_data_c PLAYER_ROOM_S_door_data[] = {
|
||||
|
||||
Reference in New Issue
Block a user