Implement & link ac_my_house

This commit is contained in:
Cuyler36
2024-02-27 14:44:08 -05:00
parent 0565854a62
commit 1b1e06c2cf
15 changed files with 3046 additions and 2269 deletions
+548 -621
View File
File diff suppressed because it is too large Load Diff
+212
View File
@@ -0,0 +1,212 @@
#include "ac_my_house.h"
#include "m_name_table.h"
#include "bg_item_h.h"
#include "m_common_data.h"
#include "m_house.h"
#include "m_player_lib.h"
#include "m_demo.h"
#include "ac_intro_demo.h"
#include "m_bgm.h"
#include "sys_matrix.h"
#include "m_rcp.h"
#include "libforest/gbi_extensions.h"
enum {
aMHS_ACTION_WAIT,
aMHS_ACTION_OPEN_DOOR_WAIT,
aMHS_ACTION_OPEN_DOOR,
aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT,
aMHS_ACTION_NUM
};
static void aMHS_actor_ct(ACTOR*, GAME*);
static void aMHS_actor_dt(ACTOR*, GAME*);
static void aMHS_actor_init(ACTOR*, GAME*);
static void aMHS_actor_draw(ACTOR*, GAME*);
static int aMHS_light_ctrl(STRUCTURE_ACTOR* my_house);
static void aMHS_setup_action(STRUCTURE_ACTOR* my_house, int action);
static void aMHS_setup_animation(STRUCTURE_ACTOR* my_house, f32 speed);
static void aMHS_set_bgOffset(ACTOR* actorx, int flag);
ACTOR_PROFILE MyHouse_Profile = {
mAc_PROFILE_MYHOUSE,
ACTOR_PART_ITEM,
ACTOR_STATE_NONE,
HOUSE0,
ACTOR_OBJ_BANK_KEEP,
sizeof(MY_HOUSE_ACTOR),
&aMHS_actor_ct,
&aMHS_actor_dt,
&aMHS_actor_init,
&aMHS_actor_draw,
NULL,
};
static u8 aMHS_lv1_shadowE_vtx_fix_flg_table[] = {
FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE,
};
static u8 aMHS_lv1_shadowW_vtx_fix_flg_table[] = {
TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE,
};
extern Vtx obj_myhome1_shadowE_v[];
extern Gfx obj_myhome1_shadowET_model[];
static bIT_ShadowData_c aMHS_lv1_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome1_shadowE_v, obj_myhome1_shadowET_model,
};
extern Vtx obj_myhome1_shadowW_v[];
extern Gfx obj_myhome1_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv1_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome1_shadowW_v, obj_myhome1_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv1_shadow_data[2] = { &aMHS_lv1_shadowW_data, &aMHS_lv1_shadowE_data };
extern Vtx obj_myhome2_shadowE_v[];
extern Gfx obj_myhome2_shadowET_model[];
static bIT_ShadowData_c aMHS_lv2_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome2_shadowE_v, obj_myhome2_shadowET_model,
};
extern Vtx obj_myhome2_shadowW_v[];
extern Gfx obj_myhome2_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv2_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome2_shadowW_v, obj_myhome2_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv2_shadow_data[2] = { &aMHS_lv2_shadowW_data, &aMHS_lv2_shadowE_data };
extern Vtx obj_myhome3_shadowE_v[];
extern Gfx obj_myhome3_shadowET_model[];
static bIT_ShadowData_c aMHS_lv3_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome3_shadowE_v, obj_myhome3_shadowET_model,
};
extern Vtx obj_myhome3_shadowW_v[];
extern Gfx obj_myhome3_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv3_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome3_shadowW_v, obj_myhome3_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv3_shadow_data[2] = { &aMHS_lv3_shadowW_data, &aMHS_lv3_shadowE_data };
extern Vtx obj_myhome4_shadowE_v[];
extern Gfx obj_myhome4_shadowET_model[];
static bIT_ShadowData_c aMHS_lv4_shadowE_data = {
18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome4_shadowE_v, obj_myhome4_shadowET_model,
};
extern Vtx obj_myhome4_shadowW_v[];
extern Gfx obj_myhome4_shadowWT_model[];
static bIT_ShadowData_c aMHS_lv4_shadowW_data = {
18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome4_shadowW_v, obj_myhome4_shadowWT_model,
};
static bIT_ShadowData_c* aMHS_lv4_shadow_data[2] = { &aMHS_lv4_shadowW_data, &aMHS_lv4_shadowE_data };
static f32 aMHS_posX_table[2] = { 20.0f, -20.0f };
static int aMHS_door_closed_flag[mHm_HOMESIZE_NUM - 1];
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome1;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome1;
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome2;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome2;
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome3;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome3;
extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome4;
extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome4;
static void aMHS_actor_ct(ACTOR* actorx, GAME* game) {
static cKF_Skeleton_R_c* skl[mHm_HOMESIZE_NUM - 1][2] = {
{ &cKF_bs_r_obj_s_myhome1, &cKF_bs_r_obj_w_myhome1 },
{ &cKF_bs_r_obj_s_myhome2, &cKF_bs_r_obj_w_myhome2 },
{ &cKF_bs_r_obj_s_myhome3, &cKF_bs_r_obj_w_myhome3 },
{ &cKF_bs_r_obj_s_myhome4, &cKF_bs_r_obj_w_myhome4 },
};
static s16 angle_table[2] = { DEG2SHORT_ANGLE(90.0f), DEG2SHORT_ANGLE(0.0f) };
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
int house_idx = actorx->npc_id - HOUSE0;
int side_idx = house_idx & 1;
int size = Save_Get(homes[house_idx]).size_info.size;
int season;
s16 param_2 = 50;
my_house->season = Common_Get(time.season);
season = my_house->season == mTM_SEASON_WINTER;
if (size != mHm_HOMESIZE_UPPER) {
param_2 = 5 + size;
}
cKF_SkeletonInfo_R_ct(&my_house->keyframe, skl[size][season], NULL, my_house->work_area, my_house->morph_area);
my_house->action = house_idx;
my_house->arg0 = size;
my_house->arg2 = param_2;
my_house->arg1 = Save_Get(homes[house_idx]).outlook_pal;
my_house->arg1 += aSTR_PAL_MYHOME_A;
actorx->world.position.x += aMHS_posX_table[side_idx];
actorx->world.position.z += 20.0f;
// arg0_f = x pos + 2 * posX_table, arg1_f = z pos + 40.0f
my_house->arg0_f = actorx->world.position.x;
my_house->arg0_f += aMHS_posX_table[side_idx];
my_house->arg1_f = actorx->world.position.z + 20.0f;
my_house->arg3 = mEv_CheckFirstIntro() != FALSE;
if (aMHS_light_ctrl(my_house) != FALSE) {
actorx->world.angle.x = DEG2SHORT_ANGLE(90.0f) - 1; // 0x3FFF
} else {
actorx->world.angle.x = DEG2SHORT_ANGLE(0.0f);
}
actorx->shape_info.rotation.y = angle_table[side_idx];
actorx->world.angle.z = DEG2SHORT_ANGLE(0.0f);
actorx->cull_width = 450.0f;
actorx->cull_radius = 450.0f;
if (mPr_CheckFishCompleteTalk(mHS_get_pl_no(house_idx))) {
actorx->speed = TRUE; // Store fish weathervane bool as... speed?
}
if (mPr_CheckInsectCompleteTalk(mHS_get_pl_no(house_idx))) {
actorx->gravity = TRUE; // Store insect plaque bool as... gravity?
}
aMHS_setup_action(my_house, aMHS_ACTION_WAIT);
aMHS_setup_animation(my_house, 0.0f);
cKF_SkeletonInfo_R_play(&my_house->keyframe);
aMHS_set_bgOffset(actorx, 1);
aMHS_door_closed_flag[my_house->arg0] = TRUE;
}
static void aMHS_actor_dt(ACTOR* actorx, GAME* game) {
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
int house_idx = actorx->npc_id - HOUSE0;
cKF_SkeletonInfo_R_dt(&my_house->keyframe);
actorx->world.position.x -= aMHS_posX_table[house_idx & 1];
actorx->world.position.z -= 20.0f;
}
#include "../src/ac_my_house_move.c_inc"
#include "../src/ac_my_house_draw.c_inc"
+260
View File
@@ -0,0 +1,260 @@
static int aMHS_actor_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) {
static s16 angle_table[2] = { DEG2SHORT_ANGLE(0.0f), DEG2SHORT_ANGLE(90.0f) };
GRAPH* graph = game->graph;
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)arg;
int l;
int r;
int g;
int b;
int a;
Gfx* gfx;
OPEN_DISP(graph);
gfx = NOW_POLY_OPA_DISP;
if (joint_idx == 8) {
int angle = my_house->actor_class.world.angle.x;
if (angle == (DEG2SHORT_ANGLE(90.0f) - 1)) {
l = 120;
r = 255;
g = 255;
b = 150;
a = 255;
} else if (angle == DEG2SHORT_ANGLE(0.0f)) {
l = 0;
r = 0;
g = 0;
b = 0;
a = 255;
} else {
f32 inter = (f32)angle * (1.0f / 16383.0f); // approx (1.0f / (f32)DEG2SHORT_ANGLE(90.0f)
l = inter * 120.0f;
r = inter * 255.0f;
g = inter * 255.0f;
b = inter * 150.0f;
a = 255;
}
gDPSetPrimColor(gfx++, 0, l, r, g, b, a);
} else if (joint_idx == 12) {
*joint_shape = NULL; // Don't draw window frame shadow yet
} else if (joint_idx == 3 || joint_idx == 5) {
int draw_comp_fish = my_house->actor_class.speed;
if (draw_comp_fish) {
s16 angle = (s16)(joint_idx == 3 ? mEnv_GetWindAngleS() : my_house->actor_class.actor_specific);
if (joint_idx == 3) {
angle += angle_table[my_house->action & 1]; // rotate based on side house is on
}
if (my_house->arg0 == 0) {
Matrix_RotateY(angle, 1);
} else {
Matrix_RotateX(angle, 1);
}
if (my_house->arg0 == 1) {
Matrix_RotateZ(DEG2SHORT_ANGLE(-90.0f), 1);
}
} else {
*joint_shape = NULL; // do not draw fish decoration joints
}
} else if (joint_idx == 1) {
int draw_comp_insect = my_house->actor_class.gravity;
if (draw_comp_insect == FALSE) {
*joint_shape = NULL; // do not draw insect decoration joint
}
} else if (joint_idx == 6 && aMHS_door_closed_flag[my_house->arg0]) {
joint_rot->y = DEG2SHORT_ANGLE(-89.895630f); // draw door shut
}
SET_POLY_OPA_DISP(gfx);
CLOSE_DISP(graph);
return TRUE;
}
extern Gfx obj_s_myhome1_window_model[];
extern Gfx obj_w_myhome1_window_model[];
extern Gfx obj_s_myhome2_window_model[];
extern Gfx obj_w_myhome2_window_model[];
extern Gfx obj_s_myhome3_window_model[];
extern Gfx obj_w_myhome3_window_model[];
extern Gfx obj_s_myhome4_window_model[];
extern Gfx obj_w_myhome4_window_model[];
static int aMHS_actor_draw_after(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) {
static Gfx* mdl[mHm_HOMESIZE_NUM - 1][2] = {
{ obj_s_myhome1_window_model, obj_w_myhome1_window_model },
{ obj_s_myhome2_window_model, obj_w_myhome2_window_model },
{ obj_s_myhome3_window_model, obj_w_myhome3_window_model },
{ obj_s_myhome4_window_model, obj_w_myhome4_window_model },
};
GRAPH* graph = game->graph;
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)arg;
u32 season;
int l;
int r;
int g;
int b;
int a;
Mtx* mtx;
Gfx* gfx;
// Draw window frame shadow last
if (joint_idx == 12) {
mtx = _Matrix_to_Mtx_new(graph);
if (mtx != NULL) {
int angle = my_house->actor_class.world.angle.x;
if (angle == (DEG2SHORT_ANGLE(90.0f) - 1)) {
l = 120;
r = 255;
g = 255;
b = 150;
a = 255;
} else if (angle == DEG2SHORT_ANGLE(0.0f)) {
l = 0;
r = 0;
g = 0;
b = 0;
a = 255;
} else {
f32 inter = (f32)angle * (1.0f / 16383.0f); // approx (1.0f / (f32)DEG2SHORT_ANGLE(90.0f)
l = inter * 120.0f;
r = 255;
g = 255;
b = 150;
a = 255;
}
season = my_house->season == mTM_SEASON_WINTER;
_texture_z_light_fog_prim_shadow(graph);
OPEN_DISP(graph);
gfx = NOW_SHADOW_DISP;
gDPSetPrimColor(gfx++, 0, l, r, g, b, a);
gSPMatrix(gfx++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gfx++, mdl[my_house->arg0][season]);
SET_SHADOW_DISP(gfx);
CLOSE_DISP(graph);
}
}
return TRUE;
}
static void aMHS_actor_draw_ta_set(STRUCTURE_ACTOR* my_house, GAME* game) {
static u8 edge_alpha[mHm_HOMESIZE_NUM - 1] = { 96, 64, 112, 96 };
GRAPH* graph = game->graph;
OPEN_DISP(graph);
gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_DOLPHIN);
gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, G_TA_DOLPHIN);
gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, edge_alpha[my_house->arg0]);
gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, edge_alpha[my_house->arg0]);
CLOSE_DISP(graph);
}
static void aMHS_actor_draw_ta_clr(STRUCTURE_ACTOR* my_house, GAME* game) {
GRAPH* graph = game->graph;
OPEN_DISP(graph);
gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_N64);
gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, G_TA_N64);
gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, 144);
gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, 144);
CLOSE_DISP(graph);
}
extern u8 obj_myhome_mark_tex_txt[];
extern u16 obj_myhome_mark_pal[];
static int aMHS_actor_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos);
static int aMHS_actor_draw_after(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape,
u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos);
static void aMHS_actor_draw_ta_set(STRUCTURE_ACTOR* my_house, GAME* game);
static void aMHS_actor_draw_ta_clr(STRUCTURE_ACTOR* my_house, GAME* game);
extern u8 obj_myhome_mark_tex_txt[];
extern u16 obj_myhome_mark_pal[];
static void aMHS_actor_draw(ACTOR* actorx, GAME* game) {
static bIT_ShadowData_c** shadow_data[mHm_HOMESIZE_NUM - 1] = {
aMHS_lv1_shadow_data,
aMHS_lv2_shadow_data,
aMHS_lv3_shadow_data,
aMHS_lv4_shadow_data,
};
GRAPH* graph;
cKF_SkeletonInfo_R_c* keyframe;
Mtx* mtx;
int door_original;
int pl_no;
bIT_ShadowData_c** shadow_data_pp;
Gfx* gfx;
GAME_PLAY* play;
STRUCTURE_ACTOR* my_house;
play = (GAME_PLAY*)game;
graph = play->game.graph;
my_house = (STRUCTURE_ACTOR*)actorx;
keyframe = &my_house->keyframe;
door_original = Save_Get(homes[my_house->action]).door_original;
pl_no = mHS_get_pl_no_detail(my_house->action);
mtx = GRAPH_ALLOC_TYPE(graph, Mtx, keyframe->skeleton->num_shown_joints);
if (mtx != NULL) {
aMHS_actor_draw_ta_set(my_house, (GAME*)play);
_texture_z_light_fog_prim(graph);
OPEN_DISP(graph);
gfx = NOW_POLY_OPA_DISP;
gSPSegment(gfx++, G_MWO_SEGMENT_8, (*Common_Get(clip).structure_clip->get_pal_segment_proc)(my_house->arg1));
if (door_original == 0xFF || pl_no == -1) {
gSPSegment(gfx++, G_MWO_SEGMENT_9, obj_myhome_mark_tex_txt);
gSPSegment(gfx++, G_MWO_SEGMENT_A, obj_myhome_mark_pal);
} else {
int org_idx = door_original & 7;
u16* pal = mNW_PaletteIdx2Palette(Save_Get(private[pl_no]).my_org[org_idx].palette);
u8* tex = Save_Get(private[pl_no]).my_org[org_idx].design.data;
gSPSegment(gfx++, G_MWO_SEGMENT_9, tex);
gSPSegment(gfx++, G_MWO_SEGMENT_A, pal);
}
SET_POLY_OPA_DISP(gfx);
CLOSE_DISP(graph);
cKF_Si3_draw_R_SV((GAME*)play, keyframe, mtx, &aMHS_actor_draw_before, &aMHS_actor_draw_after, my_house);
shadow_data_pp = shadow_data[my_house->arg0];
Matrix_translate(my_house->actor_class.world.position.x, my_house->actor_class.world.position.y,
my_house->actor_class.world.position.z, 0);
Matrix_scale(0.01f, 0.01f, 0.01f, 1);
(*Common_Get(clip).bg_item_clip->draw_shadow_proc)((GAME*)play, shadow_data_pp[my_house->action & 1], 0);
aMHS_actor_draw_ta_clr(my_house, (GAME*)play);
}
}
+483
View File
@@ -0,0 +1,483 @@
static void aMHS_set_door_SE_sub(STRUCTURE_ACTOR* my_house, u16 se_idx) {
sAdo_OngenTrgStart(se_idx, &my_house->actor_class.world.position);
}
static void aMHS_set_door_SE(STRUCTURE_ACTOR* my_house) {
static f32 chk_pat_in[4] = { 10.0f, 14.0f, 35.0f, 50.0f };
static f32 chk_pat_out[4] = { 2.0f, 8.0f, 33.0f, 40.0f };
static u16 se_no[4] = { 6, 7, 8, 9 };
f32* chk_pat_p;
int i;
switch ((int)my_house->arg2_f) {
case 0:
case 3:
chk_pat_p = chk_pat_in;
break;
default:
chk_pat_p = chk_pat_out;
break;
}
for (i = 0; i < 4; i++, chk_pat_p++) {
if (cKF_FrameControl_passCheck_now(&my_house->keyframe.frame_control, *chk_pat_p)) {
aMHS_set_door_SE_sub(my_house, se_no[i]);
break;
}
}
}
static void aMHS_goto_next_pl_scene(GAME_PLAY* play, STRUCTURE_ACTOR* my_house) {
static int next_scene_no[mHm_HOMESIZE_NUM - 1] = {
SCENE_MY_ROOM_S,
SCENE_MY_ROOM_M,
SCENE_MY_ROOM_L,
SCENE_MY_ROOM_LL1,
};
static s16 startX[mHm_HOMESIZE_NUM - 1] = {
120,
160,
200,
200,
};
static s16 startZ[mHm_HOMESIZE_NUM - 1] = {
220,
300,
380,
380,
};
Door_data_c door_data;
door_data.next_scene_id = next_scene_no[my_house->arg0];
door_data.exit_orientation = mSc_DIRECT_NORTH;
door_data.exit_type = 0;
door_data.extra_data = 0;
door_data.exit_position.x = startX[my_house->arg0];
door_data.exit_position.y = 0;
door_data.exit_position.z = startZ[my_house->arg0];
door_data.door_actor_name = EMPTY_NO;
door_data.wipe_type = 1;
goto_other_scene(play, &door_data, 0);
play->fb_fade_type = 9;
}
// In
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome1;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome1;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome2;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome2;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome3;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome3;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome4;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome4;
// Out
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome1_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome1_out;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome2_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome2_out;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome3_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome3_out;
extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome4_out;
extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome4_out;
static void aMHS_setup_animation(STRUCTURE_ACTOR* my_house, f32 speed) {
static cKF_Animation_R_c* ani[2][mHm_HOMESIZE_NUM - 1][2] = {
{
{ &cKF_ba_r_obj_s_myhome1, &cKF_ba_r_obj_w_myhome1 },
{ &cKF_ba_r_obj_s_myhome2, &cKF_ba_r_obj_w_myhome2 },
{ &cKF_ba_r_obj_s_myhome3, &cKF_ba_r_obj_w_myhome3 },
{ &cKF_ba_r_obj_s_myhome4, &cKF_ba_r_obj_w_myhome4 },
},
{
{ &cKF_ba_r_obj_s_myhome1_out, &cKF_ba_r_obj_w_myhome1_out },
{ &cKF_ba_r_obj_s_myhome2_out, &cKF_ba_r_obj_w_myhome2_out },
{ &cKF_ba_r_obj_s_myhome3_out, &cKF_ba_r_obj_w_myhome3_out },
{ &cKF_ba_r_obj_s_myhome4_out, &cKF_ba_r_obj_w_myhome4_out },
}
};
static f32 start_idx[mHm_HOMESIZE_NUM - 1] = { 1.0f, 25.0f, 1.0f, 1.0f };
static f32 end_idx[mHm_HOMESIZE_NUM - 1] = { 51.0f, 51.0f, 51.0f, 51.0f };
int type = (int)my_house->arg2_f;
int size = my_house->arg0;
int season = my_house->season == mTM_SEASON_WINTER;
int dir = 0;
if (type != 0 && type != 3) {
dir = 1;
}
cKF_SkeletonInfo_R_init(&my_house->keyframe, my_house->keyframe.skeleton, ani[dir][size][season], start_idx[type],
end_idx[type], start_idx[type], speed, 0.0f, cKF_FRAMECONTROL_STOP, NULL);
}
static void aMHS_rewrite_pl_out_data(GAME_PLAY* play, STRUCTURE_ACTOR* my_house) {
static u8 out_drt[2] = { mSc_DIRECT_SOUTH_EAST, mSc_DIRECT_SOUTH_WEST };
static f32 restartX[2] = { 48.29f, -48.29f };
Door_data_c* exit_data = Common_GetPointer(structure_exit_door_data);
int direct = my_house->action & 1;
if (play->fb_wipe_mode == 0) {
xyz_t exit_pos;
s_xyz* exit_pos_p = &exit_data->exit_position;
exit_data->next_scene_id = Save_Get(scene_no);
exit_data->exit_orientation = out_drt[direct];
exit_data->exit_type = 0;
exit_data->extra_data = 2;
exit_pos.x = my_house->actor_class.world.position.x + restartX[direct];
exit_pos.z = my_house->actor_class.world.position.z + 48.29f;
exit_pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(exit_pos, 0.0f);
exit_pos_p->x = exit_pos.x;
exit_pos_p->y = exit_pos.y;
exit_pos_p->z = exit_pos.z;
exit_data->door_actor_name = my_house->actor_class.npc_id;
exit_data->wipe_type = 1;
Common_Set(house_owner_name, my_house->action);
}
}
static f32 aMHS_player_chk_f[2] = { 1.0f, -1.0f };
static u16 aMHS_player_chk_angl0[2] = { DEG2SHORT_ANGLE(-180.0f), DEG2SHORT_ANGLE(90.0f) };
static u16 aMHS_player_chk_angl1[2] = { DEG2SHORT_ANGLE(-90.0f), DEG2SHORT_ANGLE(-180.0f) };
static int aMHS_check_player_sub(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play);
int direct = my_house->action & 1;
f32 dist_x;
f32 dist_z;
int res = FALSE;
if (player == NULL) {
return FALSE;
}
dist_x = player->actor_class.world.position.x - my_house->arg0_f;
dist_z = player->actor_class.world.position.z - my_house->arg1_f;
if ((dist_x * dist_x) + (dist_z * dist_z) < (40.0f * 40.0f) &&
dist_z + dist_x * aMHS_player_chk_f[direct] < 40.0f) {
u16 angle_y = player->actor_class.shape_info.rotation.y;
if (angle_y > aMHS_player_chk_angl0[direct] && angle_y < aMHS_player_chk_angl1[direct]) {
if (chkTrigger(BUTTON_A) == FALSE) {
return FALSE;
}
if (Common_Get(reset_flag)) {
Common_Set(reset_type, 1);
} else {
res = TRUE;
}
}
}
return res;
}
static int aMHS_check_player_in_intro_demo(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
mDemo_Clip_c* clip = Common_Get(clip).demo_clip;
INTRO_DEMO_ACTOR* intro_demo;
if (clip == NULL) {
return 0;
}
intro_demo = (INTRO_DEMO_ACTOR*)clip->class;
if (intro_demo == NULL || clip->type != mDemo_CLIP_TYPE_INTRO_DEMO || mEv_CheckFirstIntro() == FALSE) {
return 0;
}
if (my_house->arg3_f == TRUE && intro_demo->player_in_intro_demo == TRUE) {
return 1;
}
if (mPlib_check_label_player_demo_wait((GAME*)play, my_house)) {
int action;
my_house->arg3_f = TRUE;
action = my_house->action;
intro_demo->selected_house = action;
intro_demo->player_intro_demo_state =
mPr_NullCheckPersonalID(&Save_Get(homes[action]).ownerID) ? aID_STATE_TAKEN_HOUSE : aID_STATE_FREE_HOUSE;
return 2;
} else {
if (aMHS_check_player_sub(my_house, play) == TRUE) {
mPlib_request_main_demo_wait_type1((GAME*)play, 0, my_house);
}
return 0;
}
}
static void aMHS_set_demo_info(ACTOR* actorx) {
static int direct[2] = { mSc_DIRECT_NORTH_EAST, mSc_DIRECT_NORTH_WEST };
mDemo_Set_house_info(0.0f, direct[((STRUCTURE_ACTOR*)actorx)->action & 1]);
mDemo_Set_camera(CAMERA2_PROCESS_DOOR);
}
static void aMHS_set_demo_info_save(ACTOR* actorx) {
aMHS_set_demo_info(actorx);
mBGMPsComp_make_ps_wipe(0x249);
}
static int aMHS_check_player(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
int intro_demo_state;
if (my_house->arg2_f != 0) {
if (my_house->arg2_f == 3) {
if (mDemo_Check(mDemo_TYPE_DOOR2, (ACTOR*)my_house)) {
return 1;
}
mDemo_Request(mDemo_TYPE_DOOR2, (ACTOR*)my_house, &aMHS_set_demo_info_save);
return 0;
} else {
return 4;
}
}
intro_demo_state = aMHS_check_player_in_intro_demo(my_house, play);
if (intro_demo_state != 2) {
if (intro_demo_state == 1) {
if (mDemo_Check(mDemo_TYPE_DOOR2, (ACTOR*)my_house)) {
return 1;
} else {
mDemo_Request(mDemo_TYPE_DOOR2, (ACTOR*)my_house, &aMHS_set_demo_info);
return 0;
}
} else {
if (mDemo_Check(mDemo_TYPE_DOOR, (ACTOR*)my_house)) {
return 1;
} else if (aMHS_check_player_sub(my_house, play)) {
mDemo_Request(mDemo_TYPE_DOOR, (ACTOR*)my_house, &aMHS_set_demo_info);
}
}
}
return 0;
}
typedef struct {
u8 centerRight_offset;
u8 leftUp_offset;
u8 leftDown_offset;
u8 rightDown_offset;
u8 rightUp_offset;
u8 shape;
} aMHS_ofs_c;
static void aMHS_make_bgOffset(mCoBG_OffsetTable_c* ofs_tbl, s8 def_val, int side_idx) {
static s8 height_tbl[32 * 6] = {
// East
4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 4, 11, 11, 1, 11, 11, 11, 11,
11, 0, 11, 11, 11, 0, 11, 1, 0, 0, 0, 0, 0, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11,
0, 4, 4, 4, 0, 4, 1, 4, 4, 4, 4, 4, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0,
// West
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 1, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 11, 11, 0, 11, 11, 1,
11, 11, 11, 11, 11, 0, 11, 11, 11, 4, 11, 1, 4, 4, 0, 4, 4, 1, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 11,
11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0
};
int ofs;
int i;
if (side_idx == 0) {
ofs = 0;
} else {
ofs = 6 * 16;
}
for (i = 0; i != 16; i++, ofs_tbl++) {
ofs_tbl->unit_attribute = mCoBG_ATTRIBUTE_NONE;
ofs_tbl->centerRight_offset = (height_tbl[ofs + i * 6 + 0] != 11) ? height_tbl[ofs + i * 6 + 0] : def_val;
ofs_tbl->leftUp_offset = (height_tbl[ofs + i * 6 + 1] != 11) ? height_tbl[ofs + i * 6 + 1] : def_val;
ofs_tbl->leftDown_offset = (height_tbl[ofs + i * 6 + 2] != 11) ? height_tbl[ofs + i * 6 + 2] : def_val;
ofs_tbl->rightDown_offset = (height_tbl[ofs + i * 6 + 3] != 11) ? height_tbl[ofs + i * 6 + 3] : def_val;
ofs_tbl->rightUp_offset = (height_tbl[ofs + i * 6 + 4] != 11) ? height_tbl[ofs + i * 6 + 4] : def_val;
ofs_tbl->shape = height_tbl[ofs + i * 6 + 5];
}
}
static void aMHS_set_bgOffset(ACTOR* actorx, int flag) {
static s8 height_dt[mHm_HOMESIZE_NUM - 1] = { 11, 14, 15, 14 };
static s8 addX[8] = {
216, 0, 40, 80, 176, 216, 0, 40,
};
static s8 addZ[4] = { 90, 40, 0, 216 };
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
int side_idx = my_house->action & 1;
int addX_ofs = side_idx == 0 ? 0 : 4;
mCoBG_OffsetTable_c offset_tbl[4 * 4];
mCoBG_OffsetTable_c* ofs_p;
mCoBG_OffsetTable_c tmp_ofs;
xyz_t pos;
int z;
int x;
// @BUG - they use the side of the house to get the size default rather than the index itself
#ifndef BUGFIXES
aMHS_make_bgOffset(offset_tbl, height_dt[Save_Get(homes[side_idx]).size_info.size], side_idx);
#else
aMHS_make_bgOffset(offset_tbl, height_dt[Save_Get(homes[my_house->action & 3]).size_info.size], side_idx);
#endif
ofs_p = offset_tbl;
for (z = 0; z < 4; z++) {
pos.z = actorx->home.position.z + addZ[z];
for (x = 0; x < 4; x++) {
pos.x = actorx->home.position.x + addX[addX_ofs + x];
mCoBG_SetPluss5PointOffset_file(pos, *ofs_p, __FILE__, 651);
ofs_p++;
}
}
}
static int aMHS_light_ctrl(STRUCTURE_ACTOR* my_house) {
return mRmTp_Index2LightSwitchStatus((my_house->action & 3) * 2) != FALSE;
}
static void aMHS_wait(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
switch (aMHS_check_player(my_house, play)) {
case 1:
aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR_WAIT);
break;
case 4:
if (mPlib_check_player_outdoor_start((GAME*)play)) {
aMHS_setup_animation(my_house, 0.5f);
aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR);
}
}
}
static void aMHS_open_door_wait(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
ACTOR* actorx = (ACTOR*)my_house;
if (actorx == (*GET_PLAYER_ACTOR_NOW()->get_door_label_proc)(gamePT)) {
mBGMPsComp_make_ps_wipe(0x249);
aMHS_setup_animation(my_house, 0.5f);
aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR);
}
}
static void aMHS_open_door(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) {
if (cKF_SkeletonInfo_R_play(&my_house->keyframe) != cKF_STATE_STOPPED) {
aMHS_door_closed_flag[my_house->arg0] = FALSE;
} else {
void* demo_class;
INTRO_DEMO_ACTOR* intro_demo;
int next_act;
if (my_house->arg2_f == 3) {
if (my_house->actor_class.world.angle.z == 0) {
my_house->actor_class.world.angle.z = 1;
}
next_act = aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT;
} else if (my_house->arg2_f == 0) {
aMHS_rewrite_pl_out_data(play, my_house);
aMHS_goto_next_pl_scene(play, my_house);
if (Common_Get(clip).demo_clip != NULL && Common_Get(clip).demo_clip->type == mDemo_CLIP_TYPE_INTRO_DEMO) {
demo_class = Common_Get(clip).demo_clip->class;
if (demo_class != NULL) {
intro_demo = (INTRO_DEMO_ACTOR*)demo_class;
intro_demo->player_in_intro_demo = FALSE;
}
}
mDemo_End((ACTOR*)my_house);
next_act = aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT;
} else {
next_act = aMHS_ACTION_WAIT;
}
aMHS_setup_action(my_house, next_act);
my_house->arg2_f = 0;
my_house->request_type = 0;
}
}
static void aMHS_setup_action(STRUCTURE_ACTOR* my_house, int action) {
static aSTR_MOVE_PROC process[aMHS_ACTION_NUM] = {
&aMHS_wait,
&aMHS_open_door_wait,
&aMHS_open_door,
(aSTR_MOVE_PROC)&none_proc1,
};
aMHS_door_closed_flag[my_house->arg0] = TRUE;
my_house->action_proc = process[action];
}
static void aMHS_actor_move(ACTOR* actorx, GAME* game) {
// clang-format off
static Door_data_c door_data = {
SCENE_PLAYERSELECT_SAVE,
mSc_DIRECT_NORTH,
0,
0,
100, 0, 120,
EMPTY_NO,
1,
0, 0, 0
};
// clang-format on
static u8 drtbl[] = {
mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH,
mSc_DIRECT_SOUTH_EAST, mSc_DIRECT_EAST, mSc_DIRECT_NORTH_EAST,
};
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
GAME_PLAY* play = (GAME_PLAY*)game;
my_house->arg2_f = drtbl[my_house->request_type];
aMHS_set_door_SE(my_house);
actorx->actor_specific -= (s16)(mEnv_GetWindPowerF() * 1000.0f);
(*my_house->action_proc)(my_house, play);
if (aMHS_light_ctrl(my_house)) {
chase_s(&my_house->actor_class.world.angle.x, DEG2SHORT_ANGLE(90.0f) - 1, 320);
} else {
chase_s(&my_house->actor_class.world.angle.x, DEG2SHORT_ANGLE(0.0f), 320);
}
if (my_house->actor_class.world.angle.z > 0) {
goto_other_scene(play, &door_data, 1);
Common_Get(transition).wipe_type = 3;
play->fb_fade_type = 9;
my_house->actor_class.world.angle.z = -1;
}
}
static void aMHS_actor_init(ACTOR* actorx, GAME* game) {
STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx;
mFI_SetFG_common(DUMMY_HOUSE0 + my_house->action, actorx->home.position, FALSE);
aMHS_actor_move(actorx, game);
actorx->mv_proc = &aMHS_actor_move;
}
+27 -46
View File
@@ -14,57 +14,41 @@ extern void aNRTC_actor_init(ACTOR*, GAME*);
extern void aNRTC_actor_save(ACTOR*, GAME*);
ACTOR_PROFILE Npc_Rtc_Profile = {
mAc_PROFILE_NPC_RTC,
ACTOR_PART_NPC,
ACTOR_STATE_NONE,
SP_NPC_RTC,
ACTOR_OBJ_BANK_KEEP,
sizeof(NPCRTC_ACTOR),
aNRTC_actor_ct,
aNRTC_actor_dt,
aNRTC_actor_init,
mActor_NONE_PROC1,
aNRTC_actor_save,
mAc_PROFILE_NPC_RTC, ACTOR_PART_NPC, ACTOR_STATE_NONE, SP_NPC_RTC, ACTOR_OBJ_BANK_KEEP, sizeof(NPCRTC_ACTOR),
aNRTC_actor_ct, aNRTC_actor_dt, aNRTC_actor_init, mActor_NONE_PROC1, aNRTC_actor_save,
};
extern void aNRTC_actor_move(ACTOR*, GAME*);
extern void aNRTC_actor_draw(ACTOR*, GAME*);
extern int aNRTC_talk_init(ACTOR*, GAME*);
extern int aNRTC_talk_init(ACTOR*, GAME*);
extern int aNRTC_talk_end_chk(ACTOR*, GAME*);
extern void aNRTC_schedule_proc(NPC_ACTOR*, GAME_PLAY*, int);
extern void aNRTC_talk_request(ACTOR* actor,GAME*);
extern void aNRTC_talk_request(ACTOR* actor, GAME*);
extern void aNRTC_change_talk_proc(NPCRTC_ACTOR* rtc, int idx);
u8 aNRTC_sound_mode[] = {0x00,0x01,0x02,0x00};
u8 aNRTC_voice_mode[] = {0x00,0x01,0x02,0x00};
u8 aNRTC_sound_mode[] = { 0x00, 0x01, 0x02, 0x00 };
u8 aNRTC_voice_mode[] = { 0x00, 0x01, 0x02, 0x00 };
void aNRTC_actor_ct(ACTOR* actor, GAME* game){
static aNPC_ct_data_c ct_data = {
&aNRTC_actor_move,
&aNRTC_actor_draw,
5,
mActor_NONE_PROC1,
&aNRTC_talk_init,
&aNRTC_talk_end_chk,
0
};
void aNRTC_actor_ct(ACTOR* actor, GAME* game) {
static aNPC_ct_data_c ct_data = { &aNRTC_actor_move, &aNRTC_actor_draw, 5, mActor_NONE_PROC1,
&aNRTC_talk_init, &aNRTC_talk_end_chk, 0 };
NPCRTC_ACTOR* rtc = (NPCRTC_ACTOR*)actor;
GAME_PLAY* play = (GAME_PLAY*)game;
PLAYER_ACTOR* player;
xyz_t center;
xyz_t eye;
if(Common_Get(clip.npc_clip)->birth_check_proc(actor,game) == TRUE){
if (Common_Get(clip.npc_clip)->birth_check_proc(actor, game) == TRUE) {
rtc->npc_class.schedule.schedule_proc = aNRTC_schedule_proc;
Common_Get(clip.npc_clip)->ct_proc(actor,game,&ct_data);
Common_Get(clip.npc_clip)->ct_proc(actor, game, &ct_data);
actor->status_data.weight = MASSTYPE_IMMOVABLE;
mPlib_request_main_demo_wait_type1(play,0,NULL);
player = GET_PLAYER_ACTOR(play);
if(player != NULL){
mPlib_request_main_demo_wait_type1(game, 0, NULL);
player = GET_PLAYER_ACTOR(play);
if (player != NULL) {
player->actor_class.state_bitfield |= 0x80;
}
@@ -75,8 +59,8 @@ void aNRTC_actor_ct(ACTOR* actor, GAME* game){
eye.x = 100.0f;
eye.y = 130.0f;
eye.z = 210.0f;
Camera2_change_priority(play,0);
Camera2_change_priority(play, 0);
Camera2_request_main_lock(play, &center, &eye, 40.0f, 0, 100.0f, 400.0f, 5);
sAdo_SetOutMode(aNRTC_sound_mode[Save_Get(config.sound_mode)]);
sAdo_SetVoiceMode(aNRTC_voice_mode[Save_Get(config.voice_mode)]);
@@ -84,48 +68,45 @@ void aNRTC_actor_ct(ACTOR* actor, GAME* game){
rtc->npc_class.talk_info.default_act = 9;
rtc->npc_class.talk_info.melody_inst = 0;
rtc->unk9A0 = 0;
}
}
}
void aNRTC_actor_save(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->save_proc(actor,game);
Common_Get(clip.npc_clip)->save_proc(actor, game);
}
void aNRTC_actor_dt(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->dt_proc(actor,game);
Common_Get(clip.npc_clip)->dt_proc(actor, game);
}
void aNRTC_actor_init(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->init_proc(actor,game);
Common_Get(clip.npc_clip)->init_proc(actor, game);
}
void aNRTC_actor_move(ACTOR* actor, GAME* game){
void aNRTC_actor_move(ACTOR* actor, GAME* game) {
StaffRoll info;
f32 val = 0.5f;
u8 arm_flag = TRUE;
NPCRTC_ACTOR* rtc = (NPCRTC_ACTOR*)actor;
GAME_PLAY* play = (GAME_PLAY*)game;
if(rtc->npc_class.draw.animation_id == 0x76){
if (rtc->npc_class.draw.animation_id == 0x76) {
sAdos_GetStaffRollInfo(&info);
if(info.unk0 != 4){
if (info.unk0 != 4) {
val = 0.0f;
arm_flag = FALSE;
rtc->npc_class.draw.main_animation.keyframe.frame_control.current_frame = 1.0f + (64.0f * (f32)info.unk8);
rtc->npc_class.draw.main_animation.keyframe.frame_control.current_frame = 1.0f + (64.0f * (f32)info.unk8);
}
}
}
rtc->npc_class.draw.main_animation.keyframe.frame_control.speed = val;
sAdos_TTKK_ARM(arm_flag);
Common_Get(clip.npc_clip)->move_proc(actor,game);
Common_Get(clip.npc_clip)->move_proc(actor, game);
mSC_change_player_freeze(play);
}
void aNRTC_actor_draw(ACTOR* actor, GAME* game) {
Common_Get(clip.npc_clip)->draw_proc(actor,game);
Common_Get(clip.npc_clip)->draw_proc(actor, game);
}
#include "../src/ac_npc_rtc_think.c.inc"
+380 -403
View File
@@ -12,308 +12,298 @@
#include "m_scene_ftr.h"
static void mSc_set_bank_status_after(Object_Bank_c* bank) {
bank->bank_id = ABS(bank->bank_id);
bank->ram_start = bank->dma_start;
bank->state = 0;
bank->bank_id = ABS(bank->bank_id);
bank->ram_start = bank->dma_start;
bank->state = 0;
}
static void mSc_clear_bank_status(Object_Bank_c* bank) {
bank->bank_id = 0;
bank->size = 0;
bank->dma_start = NULL;
bank->ram_start = NULL;
bank->bank_id = 0;
bank->size = 0;
bank->dma_start = NULL;
bank->ram_start = NULL;
}
static void Object_Exchange_keep_new_Player(GAME_PLAY* play) {
mPlib_Object_Exchange_keep_new_PlayerMdl(play);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerFaceTex(play);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 1, 0);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 2, 1);
mPlib_Object_Exchange_keep_new_PlayerMdl(play);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 0, 0);
mPlib_Object_Exchange_keep_new_PlayerTex(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerPallet(play, 1, 2);
mPlib_Object_Exchange_keep_new_PlayerFaceTex(play);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 1, 0);
mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 2, 1);
}
extern char* mSc_secure_exchange_keep_bank(Object_Exchange_c* exchange, s16 bank_id, size_t size) {
char* area = NULL;
Object_Bank_c* bank = exchange->banks + exchange->bank_idx;
char* area = NULL;
Object_Bank_c* bank = exchange->banks + exchange->bank_idx;
if (exchange->bank_idx < mSc_OBJECT_BANK_NUM) {
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + size, 32);
if (exchange->bank_idx < mSc_OBJECT_BANK_NUM) {
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + size, 32);
if (area >= exchange->max_ram_address) {
area = NULL;
if (area >= exchange->max_ram_address) {
area = NULL;
} else {
bank->bank_id = bank_id;
bank->ram_start = exchange->next_bank_ram_address;
bank->dma_start = exchange->next_bank_ram_address;
bank->rom_addr = 0;
bank->size = size;
bank->num_exist = 0;
bank->state = 3;
exchange->next_bank_ram_address = area;
exchange->bank_idx++;
}
}
else {
bank->bank_id = bank_id;
bank->ram_start = exchange->next_bank_ram_address;
bank->dma_start = exchange->next_bank_ram_address;
bank->rom_addr = 0;
bank->size = size;
bank->num_exist = 0;
bank->state = 3;
exchange->next_bank_ram_address = area;
exchange->bank_idx++;
}
}
return area;
return area;
}
extern void mSc_background_dmacopy_controller(Object_Bank_c* bank) {
switch (bank->state) {
case 1:
{
if (bank->_14 == 0) {
osCreateMesgQueue(&bank->dma_controller_msg_queue, &bank->dma_controller_msg, 1);
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
bank->state = 0;
}
switch (bank->state) {
case 1: {
if (bank->_14 == 0) {
osCreateMesgQueue(&bank->dma_controller_msg_queue, &bank->dma_controller_msg, 1);
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
bank->state = 0;
}
break;
break;
}
case 2: {
if (osRecvMesg(&bank->dma_controller_msg_queue, NULL, OS_MESSAGE_NOBLOCK) == FALSE) {
mSc_set_bank_status_after(bank);
}
break;
}
}
case 2:
{
if (osRecvMesg(&bank->dma_controller_msg_queue, NULL, OS_MESSAGE_NOBLOCK) == FALSE) {
mSc_set_bank_status_after(bank);
}
break;
}
}
}
extern void mSc_dmacopy_data_bank(Object_Exchange_c* exchange) {
/* stubbed */
/* stubbed */
}
extern int mSc_bank_regist_check(Object_Exchange_c* exchange, s16 bank_id) {
int res = -1;
int i;
int res = -1;
int i;
for (i = 0; i < mSc_OBJECT_BANK_NUM; i++) {
if (ABS(exchange->banks[i].bank_id) == bank_id) {
res = i;
for (i = 0; i < mSc_OBJECT_BANK_NUM; i++) {
if (ABS(exchange->banks[i].bank_id) == bank_id) {
res = i;
break;
break;
}
}
}
return res;
return res;
}
extern void mSc_regist_initial_exchange_bank(GAME_PLAY* play) {
play->object_exchange.selected_partition = 0;
play->object_exchange.exchange_id = play->object_exchange.bank_idx;
play->object_exchange.selected_partition = 0;
play->object_exchange.exchange_id = play->object_exchange.bank_idx;
if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) {
u32 size;
/* Split the remaining object exchange space into two equal portions */
size = (u32)(play->object_exchange.max_ram_address - play->object_exchange.next_bank_ram_address) / 2;
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] = (char*)ALIGN_NEXT((u32)play->object_exchange.next_bank_ram_address + size, 32);
play->object_exchange.start_address_save[1] = play->object_exchange.end_address_save[0];
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) {
u32 size;
/* Temporarily limit the maximum address to half the remaining free space */
play->object_exchange.max_ram_address = play->object_exchange.end_address_save[0];
}
else {
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] = play->object_exchange.max_ram_address;
play->object_exchange.start_address_save[1] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
}
/* Split the remaining object exchange space into two equal portions */
size = (u32)(play->object_exchange.max_ram_address - play->object_exchange.next_bank_ram_address) / 2;
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] =
(char*)ALIGN_NEXT((u32)play->object_exchange.next_bank_ram_address + size, 32);
play->object_exchange.exchange_id = play->object_exchange.bank_idx; /* leftover from DnM? */
play->object_exchange.start_address_save[1] = play->object_exchange.end_address_save[0];
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
/* Temporarily limit the maximum address to half the remaining free space */
play->object_exchange.max_ram_address = play->object_exchange.end_address_save[0];
} else {
play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[0] = play->object_exchange.max_ram_address;
play->object_exchange.start_address_save[1] = play->object_exchange.next_bank_ram_address;
play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address;
}
play->object_exchange.exchange_id = play->object_exchange.bank_idx; /* leftover from DnM? */
}
static void mSc_dmacopy_all_exchange_bank_sub(Object_Bank_c* bank, Object_Exchange_c* exchange, int idx) {
if (idx >= exchange->exchange_id) {
char* area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
if (idx >= exchange->exchange_id) {
char* area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
if (area >= exchange->max_ram_address) {
exchange->selected_partition = (exchange->selected_partition + 1) % 2;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
exchange->max_ram_address = exchange->end_address_save[exchange->selected_partition];
if (area >= exchange->max_ram_address) {
exchange->selected_partition = (exchange->selected_partition + 1) % 2;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
exchange->max_ram_address = exchange->end_address_save[exchange->selected_partition];
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32);
}
bank->dma_start = exchange->next_bank_ram_address;
bank->part_id = exchange->selected_partition;
exchange->next_bank_ram_address = area;
}
bank->dma_start = exchange->next_bank_ram_address;
bank->part_id = exchange->selected_partition;
exchange->next_bank_ram_address = area;
}
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
mSc_set_bank_status_after(bank);
_JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size);
DCStoreRangeNoSync(bank->dma_start, bank->size);
mSc_set_bank_status_after(bank);
}
extern void mSc_dmacopy_all_exchange_bank(Object_Exchange_c* exchange) {
Object_Bank_c* bank;
int i;
Object_Bank_c* bank;
int i;
bank = exchange->banks + exchange->keep_id;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
bank = exchange->banks + exchange->keep_id;
exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition];
for (i = exchange->keep_id; i < mSc_OBJECT_BANK_NUM; i++) {
if (bank->bank_id != 0 && bank->state != 3) {
if (bank->bank_id < 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
}
else if (bank->num_exist != 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
}
else if (i >= exchange->exchange_id) {
mSc_clear_bank_status(bank);
}
else {
bank->bank_id = 0;
}
for (i = exchange->keep_id; i < mSc_OBJECT_BANK_NUM; i++) {
if (bank->bank_id != 0 && bank->state != 3) {
if (bank->bank_id < 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
} else if (bank->num_exist != 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
} else if (i >= exchange->exchange_id) {
mSc_clear_bank_status(bank);
} else {
bank->bank_id = 0;
}
}
bank++;
}
bank++;
}
if (Common_Get(clip).npc_clip != NULL) {
Common_Get(clip).npc_clip->rebuild_dma_proc();
}
if (Common_Get(clip).npc_clip != NULL) {
Common_Get(clip).npc_clip->rebuild_dma_proc();
}
if (Common_Get(clip)._068 != NULL) {
(*Common_Get(clip)._068)();
}
if (Common_Get(clip)._068 != NULL) {
(*Common_Get(clip)._068)();
}
if (Common_Get(clip).shop_manekin_clip != NULL) {
Common_Get(clip).shop_manekin_clip->manekin_dma_again_proc();
}
if (Common_Get(clip).shop_manekin_clip != NULL) {
Common_Get(clip).shop_manekin_clip->manekin_dma_again_proc();
}
if (Common_Get(clip).shop_indoor_clip != NULL) {
Common_Get(clip).shop_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).shop_indoor_clip != NULL) {
Common_Get(clip).shop_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).my_room_clip != NULL) {
Common_Get(clip).my_room_clip->redma_ftr_bank_proc();
}
if (Common_Get(clip).my_room_clip != NULL) {
Common_Get(clip).my_room_clip->redma_ftr_bank_proc();
}
if (Common_Get(clip).my_indoor_clip != NULL) {
Common_Get(clip).my_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).my_indoor_clip != NULL) {
Common_Get(clip).my_indoor_clip->indoor_dma_again_proc();
}
if (Common_Get(clip).arrange_room_clip != NULL) {
Common_Get(clip).arrange_room_clip->redma_proc();
}
if (Common_Get(clip).arrange_room_clip != NULL) {
Common_Get(clip).arrange_room_clip->redma_proc();
}
if (Common_Get(clip).shop_umbrella_clip != NULL) {
Common_Get(clip).shop_umbrella_clip->umbrella_dma_again_proc();
}
if (Common_Get(clip).shop_umbrella_clip != NULL) {
Common_Get(clip).shop_umbrella_clip->umbrella_dma_again_proc();
}
if (Common_Get(clip).ball_redma_proc != NULL) {
(*Common_Get(clip).ball_redma_proc)();
}
if (Common_Get(clip).ball_redma_proc != NULL) {
(*Common_Get(clip).ball_redma_proc)();
}
}
extern void mSc_data_bank_ct(GAME_PLAY* play, Object_Exchange_c* exchange) {
char* exchange_arena;
char* exchange_arena;
bzero(exchange, sizeof(Object_Exchange_c));
bzero(exchange, sizeof(Object_Exchange_c));
exchange->keep_id = -1;
exchange->exchange_id = -1;
exchange->keep_id = -1;
exchange->exchange_id = -1;
exchange_arena = (char*)THA_allocAlign(&play->game.tha, mSc_ARENA_SIZE, ~0x1F);
exchange->next_bank_ram_address = exchange_arena;
exchange->start_address_save[0] = exchange_arena;
exchange->start_address_save[1] = exchange_arena;
exchange_arena = (char*)THA_allocAlign(&play->game.tha, mSc_ARENA_SIZE, ~0x1F);
exchange->next_bank_ram_address = exchange_arena;
exchange->start_address_save[0] = exchange_arena;
exchange->start_address_save[1] = exchange_arena;
exchange_arena += mSc_ARENA_SIZE;
exchange->max_ram_address = exchange_arena;
exchange->end_address_save[0] = exchange_arena;
exchange->end_address_save[1] = exchange_arena;
exchange_arena += mSc_ARENA_SIZE;
exchange->max_ram_address = exchange_arena;
exchange->end_address_save[0] = exchange_arena;
exchange->end_address_save[1] = exchange_arena;
}
extern void mSc_decide_exchange_bank(Object_Exchange_c* exchange) {
exchange->keep_id = exchange->bank_idx;
exchange->_194C = exchange->next_bank_ram_address;
exchange->keep_id = exchange->bank_idx;
exchange->_194C = exchange->next_bank_ram_address;
}
static void Scene_player_select(int scene_no, int npc_actor) {
if (Save_Get(scene_no) == scene_no) {
int met_villagers_bitfield = 0;
int met_villagers_num = 0;
mActor_name_t npc_id;
Animal_c* animal = Save_Get(animals);
Anmmem_c* memory;
int i;
int j;
int selected;
if (Save_Get(scene_no) == scene_no) {
int met_villagers_bitfield = 0;
int met_villagers_num = 0;
mActor_name_t npc_id;
Animal_c* animal = Save_Get(animals);
Anmmem_c* memory;
int i;
int j;
int selected;
/* Track all villagers who have met a player from town before */
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) {
memory = animal->memories;
/* Track all villagers who have met a player from town before */
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) {
memory = animal->memories;
for (j = 0; j < ANIMAL_MEMORY_NUM; j++) {
if (
memory->memory_player_id.land_id == Save_Get(land_info).id &&
mLd_CheckCmpLandName(memory->memory_player_id.land_name, Save_Get(land_info).name) == TRUE
) {
met_villagers_bitfield |= (1 << i);
met_villagers_num++;
for (j = 0; j < ANIMAL_MEMORY_NUM; j++) {
if (memory->memory_player_id.land_id == Save_Get(land_info).id &&
mLd_CheckCmpLandName(memory->memory_player_id.land_name, Save_Get(land_info).name) == TRUE) {
met_villagers_bitfield |= (1 << i);
met_villagers_num++;
break;
}
break;
}
memory++;
}
}
memory++;
}
}
animal++;
}
/* Roll a random villager if none have met a player in town before */
if (met_villagers_num == 0) {
do {
selected = RANDOM(ANIMAL_NUM_MAX);
} while (mNpc_CheckFreeAnimalPersonalID(&Save_Get(animals[selected]).id));
npc_id = Save_Get(animals[selected]).id.npc_id;
i = mNpc_SearchAnimalinfo(Save_Get(animals), npc_id, ANIMAL_NUM_MAX);
}
else {
/* Pick a random villager which has met a player in town */
selected = RANDOM(met_villagers_num);
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if ((met_villagers_bitfield & 1) != 0) {
if (selected == 0) {
break;
}
else {
selected--;
}
animal++;
}
met_villagers_bitfield >>= 1;
}
/* Roll a random villager if none have met a player in town before */
if (met_villagers_num == 0) {
do {
selected = RANDOM(ANIMAL_NUM_MAX);
} while (mNpc_CheckFreeAnimalPersonalID(&Save_Get(animals[selected]).id));
npc_id = Save_Get(animals[i]).id.npc_id;
npc_id = Save_Get(animals[selected]).id.npc_id;
i = mNpc_SearchAnimalinfo(Save_Get(animals), npc_id, ANIMAL_NUM_MAX);
} else {
/* Pick a random villager which has met a player in town */
selected = RANDOM(met_villagers_num);
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if ((met_villagers_bitfield & 1) != 0) {
if (selected == 0) {
break;
} else {
selected--;
}
}
met_villagers_bitfield >>= 1;
}
npc_id = Save_Get(animals[i]).id.npc_id;
}
if (scene_no == SCENE_PLAYERSELECT_2) {
Common_Set(player_select_animal_no, i);
}
mNpc_RegistEventNpc(npc_actor, npc_id, npc_id, Save_Get(animals[i]).cloth);
}
if (scene_no == SCENE_PLAYERSELECT_2) {
Common_Set(player_select_animal_no, i);
}
mNpc_RegistEventNpc(npc_actor, npc_id, npc_id, Save_Get(animals[i]).cloth);
}
}
static void Scene_Proc_Player_Ptr(GAME_PLAY* play, Scene_Word_u* data);
@@ -330,259 +320,246 @@ static void Scene_Proc_Sound(GAME_PLAY* play, Scene_Word_u* data);
typedef void (*mSc_SCENE_WORD_PROC)(GAME_PLAY*, Scene_Word_u*);
extern void Scene_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
static mSc_SCENE_WORD_PROC Scene_Proc[mSc_SCENE_DATA_TYPE_NUM] = {
&Scene_Proc_Player_Ptr,
&Scene_Proc_Ctrl_Actor_Ptr,
&Scene_Proc_Actor_Ptr,
&Scene_Proc_Object_Exchange_Bank_Ptr,
&Scene_Proc_Door_Data_Ptr,
&Scene_Proc_Field_ct,
&Scene_Proc_MyRoom_ct,
&Scene_Proc_ArrangeRoom_ct,
&Scene_Proc_ArrangeFurniture_ct,
&Scene_Proc_Sound,
NULL
};
static mSc_SCENE_WORD_PROC Scene_Proc[mSc_SCENE_DATA_TYPE_NUM] = { &Scene_Proc_Player_Ptr,
&Scene_Proc_Ctrl_Actor_Ptr,
&Scene_Proc_Actor_Ptr,
&Scene_Proc_Object_Exchange_Bank_Ptr,
&Scene_Proc_Door_Data_Ptr,
&Scene_Proc_Field_ct,
&Scene_Proc_MyRoom_ct,
&Scene_Proc_ArrangeRoom_ct,
&Scene_Proc_ArrangeFurniture_ct,
&Scene_Proc_Sound,
NULL };
/* Initialize all scene data */
while (TRUE) {
u32 type = scene_data->misc.type;
if (type == mSc_SCENE_DATA_TYPE_END) {
break;
}
if (type < mSc_SCENE_DATA_TYPE_NUM) {
(*Scene_Proc[type])(play, scene_data);
/* Initialize all scene data */
while (TRUE) {
u32 type = scene_data->misc.type;
if (type == mSc_SCENE_DATA_TYPE_END) {
break;
}
if (type < mSc_SCENE_DATA_TYPE_NUM) {
(*Scene_Proc[type])(play, scene_data);
}
scene_data++;
}
scene_data++;
}
/* Setup player select actors */
Scene_player_select(SCENE_PLAYERSELECT_2, SP_NPC_P_SEL2); // load
Scene_player_select(SCENE_PLAYERSELECT_SAVE, SP_NPC_RESTART); // save
/* Setup player select actors */
Scene_player_select(SCENE_PLAYERSELECT_2, SP_NPC_P_SEL2); // load
Scene_player_select(SCENE_PLAYERSELECT_SAVE, SP_NPC_RESTART); // save
/* Select Rover or Blanca for visiting town scene */
if (Save_Get(scene_no) == SCENE_START_DEMO3) {
int rover_shown = FALSE;
/* Select Rover or Blanca for visiting town scene */
if (Save_Get(scene_no) == SCENE_START_DEMO3) {
int rover_shown = FALSE;
if (mLd_CheckCmpLand(Common_Get(now_private)->player_ID.land_name, Common_Get(now_private)->player_ID.land_id,
Common_Get(travel_persistent_data).land.name,
Common_Get(travel_persistent_data).land.id) == TRUE) {
if (Common_Get(now_private)->state_flags & mPr_FLAG_MASK_CAT_SCHEDULED) {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
} else if (fqrand() < 0.5f) {
Common_Get(now_private)->state_flags |= mPr_FLAG_MASK_CAT_SCHEDULED; // Blanca is scheduled
} else {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
}
} else {
rover_shown = TRUE;
}
if (
mLd_CheckCmpLand(
Common_Get(now_private)->player_ID.land_name, Common_Get(now_private)->player_ID.land_id,
Common_Get(travel_persistent_data).land.name, Common_Get(travel_persistent_data).land.id
) == TRUE
) {
if (Common_Get(now_private)->state_flags & mPr_FLAG_MASK_CAT_SCHEDULED) {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
}
else if (fqrand() < 0.5f) {
Common_Get(now_private)->state_flags |= mPr_FLAG_MASK_CAT_SCHEDULED; // Blanca is scheduled
}
else {
Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED;
rover_shown = TRUE;
}
if (rover_shown == FALSE) {
mActor_name_t blanca_cloth;
mSP_SelectRandomItem_New(NULL, &blanca_cloth, 1, NULL, 0, mSP_KIND_CLOTH, mSP_LISTTYPE_ABC, FALSE);
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_MASK_CAT2, blanca_cloth);
Save_Get(mask_cat).cloth_no = (blanca_cloth >= ITM_CLOTH_START && blanca_cloth < ITM_CLOTH_END)
? (blanca_cloth - ITM_CLOTH_START)
: EMPTY_NO;
} else {
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_GUIDE, EMPTY_NO); // Rover
}
}
else {
rover_shown = TRUE;
}
if (rover_shown == FALSE) {
mActor_name_t blanca_cloth;
mSP_SelectRandomItem_New(NULL, &blanca_cloth, 1, NULL, 0, mSP_KIND_CLOTH, mSP_LISTTYPE_ABC, FALSE);
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_MASK_CAT2, blanca_cloth);
Save_Get(mask_cat).cloth_no = (blanca_cloth >= ITM_CLOTH_START && blanca_cloth < ITM_CLOTH_END) ? (blanca_cloth - ITM_CLOTH_START) : EMPTY_NO;
}
else {
mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_GUIDE, EMPTY_NO); // Rover
}
}
}
static void Scene_Proc_Player_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
static s16 angle_table[8] = {
DEG2SHORT_ANGLE( 0.0f), /* 0x0000 */
DEG2SHORT_ANGLE( 45.0f), /* 0x2000 */
DEG2SHORT_ANGLE( 90.0f), /* 0x4000 */
DEG2SHORT_ANGLE( 135.0f), /* 0x6000 */
DEG2SHORT_ANGLE(-180.0f), /* 0x8000 */
DEG2SHORT_ANGLE(-135.0f), /* 0xA000 */
DEG2SHORT_ANGLE( -90.0f), /* 0xC000 */
DEG2SHORT_ANGLE( -45.0f) /* 0xE000 */
};
static s16 angle_table[mSc_DIRECT_NUM] = {
DEG2SHORT_ANGLE(0.0f), /* 0x0000 */
DEG2SHORT_ANGLE(45.0f), /* 0x2000 */
DEG2SHORT_ANGLE(90.0f), /* 0x4000 */
DEG2SHORT_ANGLE(135.0f), /* 0x6000 */
DEG2SHORT_ANGLE(-180.0f), /* 0x8000 */
DEG2SHORT_ANGLE(-135.0f), /* 0xA000 */
DEG2SHORT_ANGLE(-90.0f), /* 0xC000 */
DEG2SHORT_ANGLE(-45.0f) /* 0xE000 */
};
Actor_data* data = scene_data->actor.data_p;
Actor_data* data = scene_data->actor.data_p;
play->player_data = data;
play->player_data = data;
/* Update player position & orientation based on the current door exit data */
if (Common_Get(door_data).next_scene_id != 0) {
mem_copy((u8*)&data->position, (u8*)&Common_Get(door_data).exit_position, sizeof(s_xyz));
data->rotation.y = angle_table[Common_Get(door_data).exit_orientation];
}
/* Update player position & orientation based on the current door exit data */
if (Common_Get(door_data).next_scene_id != 0) {
mem_copy((u8*)&data->position, (u8*)&Common_Get(door_data).exit_position, sizeof(s_xyz));
data->rotation.y = angle_table[Common_Get(door_data).exit_orientation];
}
data->arg = Common_Get(door_data).extra_data;
Object_Exchange_keep_new_Player(play);
mSM_Object_Exchange_keep_new_Menu(play);
data->arg = Common_Get(door_data).extra_data;
Object_Exchange_keep_new_Player(play);
mSM_Object_Exchange_keep_new_Menu(play);
}
static void Scene_Proc_Ctrl_Actor_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
s16* data = scene_data->control_actor.ctrl_actor_profile_p;
s16* data = scene_data->control_actor.ctrl_actor_profile_p;
play->ctrl_actor_data_num = scene_data->control_actor.num_ctrl_actors;
play->ctrl_actor_data = data;
play->ctrl_actor_data_num = scene_data->control_actor.num_ctrl_actors;
play->ctrl_actor_data = data;
}
static void Scene_Proc_Actor_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
Actor_data* data_p = scene_data->actor.data_p;
Actor_data* data_p = scene_data->actor.data_p;
play->actor_data_num = scene_data->actor.num_actors;
play->actor_data = data_p;
play->actor_data_num = scene_data->actor.num_actors;
play->actor_data = data_p;
}
static void Scene_Proc_Object_Exchange_Bank_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
play->obj_bank_data_num = scene_data->object_bank.num_banks;
play->obj_bank_data = scene_data->object_bank.banks_p;
static void Scene_Proc_Object_Exchange_Bank_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
play->obj_bank_data_num = scene_data->object_bank.num_banks;
play->obj_bank_data = scene_data->object_bank.banks_p;
}
static void Scene_Proc_Door_Data_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) {
Door_data_c* data_p = scene_data->door_data.door_data_p;
play->door_info.num_doors = scene_data->door_data.num_doors;
play->door_info.door_data_p = data_p;
Door_data_c* data_p = scene_data->door_data.door_data_p;
play->door_info.num_doors = scene_data->door_data.num_doors;
play->door_info.door_data_p = data_p;
}
extern void Door_info_ct(Door_info_c* door_info) {
door_info->num_doors = 0;
door_info->num_doors = 0;
}
static void Scene_Proc_Sound(GAME_PLAY* play, Scene_Word_u* scene_data) {
// stubbed
// stubbed
}
static void set_item_info(GAME_PLAY* play, Scene_Word_Data_FieldCt_c* field_ct) {
static s16 profile_table[4] = {
mAc_PROFILE_BGITEM,
mAc_PROFILE_DUMMY,
mAc_PROFILE_BGPOLICEITEM,
mAc_PROFILE_BGPOSTITEM
};
static s16 profile_table[4] = { mAc_PROFILE_BGITEM, mAc_PROFILE_DUMMY, mAc_PROFILE_BGPOLICEITEM,
mAc_PROFILE_BGPOSTITEM };
int item_type = field_ct->item_type;
int item_type = field_ct->item_type;
if (item_type == 0) {
Common_Set(bg_item_profile, Common_Get(time).bgitem_profile);
}
else {
Common_Set(bg_item_profile, profile_table[item_type]);
}
if (item_type == 0) {
Common_Set(bg_item_profile, Common_Get(time).bgitem_profile);
} else {
Common_Set(bg_item_profile, profile_table[item_type]);
}
Common_Set(bg_item_type, item_type);
Common_Set(bg_item_type, item_type);
}
static void Scene_Proc_Field_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
mFM_SetFieldInitData(scene_data->field_ct.bg_num, scene_data->field_ct.bg_disp_size);
set_item_info(play, &scene_data->field_ct);
Common_Set(field_draw_type, scene_data->field_ct.draw_type);
Common_Set(game_started, FALSE);
Common_Set(in_initial_block, TRUE);
Common_Set(sunlight_flag, TRUE);
mFM_SetFieldInitData(scene_data->field_ct.bg_num, scene_data->field_ct.bg_disp_size);
set_item_info(play, &scene_data->field_ct);
Common_Set(field_draw_type, scene_data->field_ct.draw_type);
Common_Set(game_started, FALSE);
Common_Set(in_initial_block, TRUE);
Common_Set(sunlight_flag, TRUE);
}
static void Scene_Proc_MyRoom_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
mScn_ObtainMyRoomBank(play);
mScn_ObtainMyRoomBank(play);
}
static void Scene_Proc_ArrangeRoom_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
mScn_ObtainCarpetBank(play);
mScn_ObtainCarpetBank(play);
}
static void Scene_Proc_ArrangeFurniture_ct(GAME_PLAY* play, Scene_Word_u* scene_data) {
Common_Get(clip).arrange_ftr_num = scene_data->arrange_ftr_ct.arrange_ftr_num;
Common_Get(clip).arrange_ftr_num = scene_data->arrange_ftr_ct.arrange_ftr_num;
}
extern int goto_other_scene(GAME_PLAY* play, Door_data_c* door_data, int update_player_mode) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = 0; // failed
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = 0; // failed
if (player != NULL) {
if (play->fb_wipe_mode == 0) {
play->fb_fade_type = 2;
if (player != NULL) {
if (play->fb_wipe_mode == 0) {
play->fb_fade_type = 2;
if (door_data->wipe_type == 0) {
play->fb_wipe_type = 3;
}
else {
play->fb_wipe_type = door_data->wipe_type;
}
if (door_data->wipe_type == 0) {
play->fb_wipe_type = 3;
} else {
play->fb_wipe_type = door_data->wipe_type;
}
if (Common_Get(transition).wipe_type == 0xFF) {
Common_Get(transition).wipe_type = play->fb_wipe_type;
}
if (Common_Get(transition).wipe_type == 0xFF) {
Common_Get(transition).wipe_type = play->fb_wipe_type;
}
Common_Set(door_data, *door_data);
Common_Get(door_data).next_scene_id = door_data->next_scene_id + 1;
play->next_scene_no = door_data->next_scene_id;
Common_Set(door_data, *door_data);
Common_Get(door_data).next_scene_id = door_data->next_scene_id + 1;
play->next_scene_no = door_data->next_scene_id;
if (update_player_mode) {
mPlib_request_main_invade_type1(play);
}
if (update_player_mode) {
mPlib_request_main_invade_type1(play);
}
restore_fgdata_all(play);
play->game.pad_initialized = FALSE;
res = 1; // success
restore_fgdata_all(play);
play->game.pad_initialized = FALSE;
res = 1; // success
} else {
res = 2; // already changing scenes
}
}
else {
res = 2; // already changing scenes
}
}
return res;
return res;
}
extern int goto_next_scene(GAME_PLAY* play, int next_idx, int update_player_mode) {
int res = FALSE;
int res = FALSE;
if (play->door_info.num_doors != 0) {
res = goto_other_scene(play, play->door_info.door_data_p + next_idx, update_player_mode);
}
if (play->door_info.num_doors != 0) {
res = goto_other_scene(play, play->door_info.door_data_p + next_idx, update_player_mode);
}
return res;
return res;
}
extern int goto_emu_game(GAME_PLAY* play, u8 famicom_rom_id) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = FALSE;
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
int res = FALSE;
if (player != NULL) {
Door_data_c* door_data;
play->fb_fade_type = 3;
play->fb_wipe_type = 3;
res = TRUE;
if (player != NULL) {
Door_data_c* door_data;
door_data = Common_GetPointer(famicom_emu_exit_door_data);
door_data->next_scene_id = Save_Get(scene_no);
door_data->exit_orientation = 0;
door_data->exit_type = 0;
door_data->extra_data = 0;
door_data->exit_position.x = player->actor_class.world.position.x;
door_data->exit_position.y = player->actor_class.world.position.y;
door_data->exit_position.z = player->actor_class.world.position.z;
door_data->door_actor_name = EMPTY_NO;
Common_Set(current_famicom_rom, famicom_rom_id);
}
play->fb_fade_type = 3;
play->fb_wipe_type = 3;
res = TRUE;
return res;
door_data = Common_GetPointer(famicom_emu_exit_door_data);
door_data->next_scene_id = Save_Get(scene_no);
door_data->exit_orientation = 0;
door_data->exit_type = 0;
door_data->extra_data = 0;
door_data->exit_position.x = player->actor_class.world.position.x;
door_data->exit_position.y = player->actor_class.world.position.y;
door_data->exit_position.z = player->actor_class.world.position.z;
door_data->door_actor_name = EMPTY_NO;
Common_Set(current_famicom_rom, famicom_rom_id);
}
return res;
}
extern void return_emu_game(GAME* game) {
mem_copy((u8*)Common_GetPointer(door_data), (u8*)Common_GetPointer(famicom_emu_exit_door_data), sizeof(Door_data_c)); // copy exit door data
Common_Get(door_data).next_scene_id = Common_Get(famicom_emu_exit_door_data).next_scene_id + 1;
game->pad_initialized = FALSE;
game_goto_next_game_play(game);
Save_Set(scene_no, Common_Get(famicom_emu_exit_door_data).next_scene_id);
mem_copy((u8*)Common_GetPointer(door_data), (u8*)Common_GetPointer(famicom_emu_exit_door_data),
sizeof(Door_data_c)); // copy exit door data
Common_Get(door_data).next_scene_id = Common_Get(famicom_emu_exit_door_data).next_scene_id + 1;
game->pad_initialized = FALSE;
game_goto_next_game_play(game);
Save_Set(scene_no, Common_Get(famicom_emu_exit_door_data).next_scene_id);
}
+844 -925
View File
File diff suppressed because it is too large Load Diff