mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
217 lines
5.2 KiB
C
217 lines
5.2 KiB
C
#include "ac_dump.h"
|
|
|
|
#include "m_name_table.h"
|
|
#include "m_rcp.h"
|
|
#include "sys_matrix.h"
|
|
#include "m_player_lib.h"
|
|
#include "m_common_data.h"
|
|
|
|
extern Gfx dump_s_DL_model[];
|
|
extern Gfx dump_w_DL_model[];
|
|
|
|
extern Vtx obj_dump_shadow_v[];
|
|
extern Gfx obj_dump_shadowT_model[];
|
|
|
|
static void aDUM_actor_ct(ACTOR* actor, GAME* game);
|
|
static void aDUM_actor_dt(ACTOR* actor, GAME* game);
|
|
static void aDUM_actor_init(ACTOR* actor, GAME* game);
|
|
static void aDUM_actor_draw(ACTOR* actor, GAME* game);
|
|
|
|
ACTOR_PROFILE Dump_Profile = {
|
|
mAc_PROFILE_DUMP,
|
|
ACTOR_PART_ITEM,
|
|
ACTOR_STATE_TA_SET | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED,
|
|
DUMP,
|
|
ACTOR_OBJ_BANK_KEEP,
|
|
sizeof(DUMP_ACTOR),
|
|
aDUM_actor_ct,
|
|
aDUM_actor_dt,
|
|
aDUM_actor_init,
|
|
aDUM_actor_draw,
|
|
NULL,
|
|
};
|
|
|
|
u8 aDUM_shadow_vtx_fix_flg_table[] = {
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
1,0,0,1,
|
|
};
|
|
|
|
bIT_ShadowData_c aDUM_shadow_data = {
|
|
48,
|
|
aDUM_shadow_vtx_fix_flg_table,
|
|
60.0f,
|
|
obj_dump_shadow_v,
|
|
obj_dump_shadowT_model,
|
|
};
|
|
|
|
static void aDUM_set_bgOffset(DUMP_ACTOR*, int);
|
|
static void aDUM_setup_action(DUMP_ACTOR*, int);
|
|
|
|
static void aDUM_actor_ct(ACTOR* actor, GAME* game){
|
|
DUMP_ACTOR* dump = (DUMP_ACTOR*)actor;
|
|
|
|
dump->season = Common_Get(time.season);
|
|
aDUM_set_bgOffset(dump,1);
|
|
aDUM_setup_action(dump,0);
|
|
actor->world.position.x -= 40.0f;
|
|
}
|
|
|
|
static void aDUM_actor_dt(ACTOR* actor, GAME* game){
|
|
|
|
actor->world.position.x += 40.0f;
|
|
}
|
|
|
|
static void aDUM_set_bgOffset_sub(DUMP_ACTOR* dump, int x, int z, s16 mode){
|
|
static int flag_tbl[6][6] = {
|
|
1,1,0,0,1,1,
|
|
1,0,0,0,0,1,
|
|
1,0,0,0,0,1,
|
|
1,0,0,0,0,1,
|
|
1,0,0,0,0,1,
|
|
1,1,1,1,1,1,
|
|
};
|
|
xyz_t pos;
|
|
|
|
pos.x = dump->actor_class.home.position.x - (x * 40);
|
|
pos.y = dump->actor_class.home.position.y;
|
|
pos.z = dump->actor_class.home.position.z - (z * 40);
|
|
|
|
if(flag_tbl[z][x] != 0){
|
|
mCoBG_SetPlussOffset(pos, mode, 100);
|
|
}
|
|
}
|
|
|
|
|
|
static void aDUM_set_bgOffset(DUMP_ACTOR* dump, int s){
|
|
s16 mode = s ? 4 : 4;
|
|
int i;
|
|
for (i = 0; i < 6; i++) {
|
|
aDUM_set_bgOffset_sub(dump,0,i,mode);
|
|
aDUM_set_bgOffset_sub(dump,1,i,mode);
|
|
aDUM_set_bgOffset_sub(dump,2,i,mode);
|
|
aDUM_set_bgOffset_sub(dump,3,i,mode);
|
|
aDUM_set_bgOffset_sub(dump,4,i,mode);
|
|
aDUM_set_bgOffset_sub(dump,5,i,mode);
|
|
}
|
|
}
|
|
|
|
static void aDUM_set_talk_info(ACTOR* actor){
|
|
rgba_t color;
|
|
|
|
mDemo_Set_msg_num(0x136A);
|
|
mDemo_Set_talk_display_name(0);
|
|
mDemo_Set_camera(1);
|
|
mPlib_Set_able_hand_all_item_in_demo(1);
|
|
mDemo_Set_ListenAble();
|
|
|
|
color.r = 185;
|
|
color.g = 60;
|
|
color.b = 40;
|
|
color.a = 255;
|
|
mDemo_Set_talk_window_color(&color);
|
|
}
|
|
|
|
|
|
static void aDUM_wait(DUMP_ACTOR* dump, GAME_PLAY* play){
|
|
ACTOR* actor = &dump->actor_class;
|
|
|
|
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
|
|
xyz_t pos;
|
|
|
|
xyz_t_move(&pos, &actor->world.position);
|
|
|
|
if ((mDemo_Check(7, actor) != 1) && (player != NULL) && (mDemo_Get_talk_actor() == NULL)) {
|
|
|
|
if(player->actor_class.world.position.z >= pos.z){
|
|
|
|
if(ABS(actor->player_angle_y) < 0x2000){
|
|
mDemo_Request(7, actor, aDUM_set_talk_info);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void aDUM_setup_action(DUMP_ACTOR* dump, int action){
|
|
static DUMP_PROC process[] = {aDUM_wait};
|
|
|
|
dump->proc = process[action];
|
|
dump->current_action = action;
|
|
}
|
|
|
|
|
|
static void aDUM_actor_move(ACTOR* actor, GAME* game){
|
|
GAME_PLAY* play = (GAME_PLAY*)game;
|
|
DUMP_ACTOR* dump = (DUMP_ACTOR*) actor;
|
|
|
|
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
|
|
|
|
int dbx, dbz, pbx, pbz;
|
|
|
|
mFI_Wpos2BlockNum(&dbx, &dbz, actor->world.position);
|
|
mFI_Wpos2BlockNum(&pbx, &pbz, player->actor_class.world.position);
|
|
|
|
if ((mDemo_Check(1, &player->actor_class) == 0) && (mDemo_Check(5, &player->actor_class) == 0) && (mDemo_Check(0x10, &player->actor_class) == 0) && ((dbx != pbx) || (dbz != pbz))) {
|
|
Actor_delete(actor);
|
|
}
|
|
else{
|
|
dump->proc(dump, play);
|
|
}
|
|
}
|
|
|
|
static void aDUM_actor_init(ACTOR* actor, GAME* game){
|
|
DUMP_ACTOR* dump = (DUMP_ACTOR*)actor;
|
|
|
|
mFI_SetFG_common(0xF115, actor->home.position, 0);
|
|
aDUM_actor_move(actor, game);
|
|
actor->mv_proc = aDUM_actor_move;
|
|
}
|
|
|
|
|
|
|
|
static void aDUM_actor_draw(ACTOR* actor, GAME* game){
|
|
static Gfx* model[] = {dump_s_DL_model, dump_w_DL_model};
|
|
DUMP_ACTOR* dump = (DUMP_ACTOR*)actor;
|
|
|
|
GRAPH* graph = game->graph;
|
|
u16* pal;
|
|
int type;
|
|
Gfx* gfx;
|
|
Mtx* cur;
|
|
|
|
type = dump->season == mTM_SEASON_WINTER;
|
|
pal = Common_Get(clip.structure_clip)->get_pal_segment_proc(aSTR_PAL_DUMP);
|
|
|
|
_texture_z_light_fog_prim_npc(graph);
|
|
|
|
OPEN_DISP(graph);
|
|
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
gSPSegment(gfx++, 0x8, pal);
|
|
|
|
|
|
Matrix_translate(-6000.0f, 0.0f,-10000.0f, 1);
|
|
|
|
cur =_Matrix_to_Mtx_new(graph);
|
|
|
|
if(cur != NULL){
|
|
gSPMatrix(gfx++, cur,G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, model[type]);
|
|
SET_POLY_OPA_DISP(gfx);
|
|
}
|
|
|
|
(*Common_Get(clip).bg_item_clip->draw_shadow_proc)(game, &aDUM_shadow_data, FALSE);
|
|
|
|
CLOSE_DISP(graph);
|
|
|
|
|
|
} |