Merge pull request #70 from Cuyler36/ac_structure

Implement & link ac_structure.c
This commit is contained in:
Cuyler36
2023-07-01 18:55:28 -04:00
committed by GitHub
10 changed files with 562 additions and 12 deletions
+5
View File
@@ -200,6 +200,11 @@ m_random_field/mRF_MakePerfectBit.c:
.text: [0x8050B1AC, 0x8050B1D4]
m_random_field/mRF_GetRandomStepMode.c:
.text: [0x8050B284, 0x8050B2C0]
ac_structure.c:
.text: [0x805BCA00, 0x805BD06C]
.rodata: [0x8064AC30, 0x8064AC38]
.data: [0x806C6C00, 0x806C6ED0]
.bss: [0x813280F0, 0x8133DEB0]
m_select.c:
.text: [0x80627F88, 0x80629CA8]
.rodata: [0x8064D1B0, 0x8064D1B8]
+104 -1
View File
@@ -3,18 +3,121 @@
#include "types.h"
#include "m_actor.h"
#include "m_actor_dlftbls.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef ACTOR* (*aSTR_SETUP_ACTOR_PROC)(GAME_PLAY*, mActor_name_t, int, f32, f32);
#define aSTR_ACTOR_TBL_COUNT 9
#define aSTR_OVERLAY_SIZE 0x2400
enum structure_type {
aSTR_TYPE_HOUSE1,
aSTR_TYPE_HOUSE2,
aSTR_TYPE_HOUSE3,
aSTR_TYPE_HOUSE4,
aSTR_TYPE_HOUSE5,
aSTR_TYPE_MYHOME,
aSTR_TYPE_6,
aSTR_TYPE_7,
aSTR_TYPE_SHOP1,
aSTR_TYPE_SHOP2,
aSTR_TYPE_SHOP3,
aSTR_TYPE_SHOP4,
aSTR_TYPE_POST_OFFICE,
aSTR_TYPE_STATION1,
aSTR_TYPE_STATION2,
aSTR_TYPE_STATION3,
aSTR_TYPE_TRAIN0,
aSTR_TYPE_TRAIN1,
aSTR_TYPE_POLICE_BOX,
aSTR_TYPE_FALLS,
aSTR_TYPE_FALLSESW,
aSTR_TYPE_SIGN,
aSTR_TYPE_SHRINE,
aSTR_TYPE_BRSHOP,
aSTR_TYPE_BUGGY,
aSTR_TYPE_S_CAR,
aSTR_TYPE_KAMAKURA, // also used for camping tent
aSTR_TYPE_GOZA,
aSTR_TYPE_RADIO,
aSTR_TYPE_YATAI,
aSTR_TYPE_TUKIMI,
aSTR_TYPE_TUKIMI2,
aSTR_TYPE_MIKUJI,
aSTR_TYPE_COUNT,
aSTR_TYPE_COUNT02,
aSTR_TYPE_SPORTSFAIR_A,
aSTR_TYPE_SPORTSFAIR_B,
aSTR_TYPE_TURI,
aSTR_TYPE_TURI2,
aSTR_TYPE_KOINOBORI,
aSTR_TYPE_DUMP,
aSTR_TYPE_WINDMILL,
aSTR_TYPE_LOTUS,
aSTR_TYPE_MIKANBOX,
aSTR_TYPE_DOUZOU,
aSTR_TYPE_TOUDAI,
aSTR_TYPE_GHOG,
aSTR_TYPE_HTABLE,
aSTR_TYPE_MUSEUM,
aSTR_TYPE_BRIDGE_A,
aSTR_TYPE_50,
aSTR_TYPE_NEEDLEWORK_SHOP,
aSTR_TYPE_FLAG,
aSTR_TYPE_BOAT,
aSTR_TYPE_COTTAGE_MY,
aSTR_TYPE_COTTAGE_NPC,
aSTR_TYPE_NUM
};
typedef struct actor_structure_control_s STRUCTURE_CONTROL_ACTOR;
typedef struct actor_structure_s STRUCTURE_ACTOR;
typedef STRUCTURE_ACTOR* (*aSTR_SETUP_ACTOR_PROC)(GAME*, mActor_name_t, s16, f32, f32);
typedef void (*aSTR_GET_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*);
typedef void (*aSTR_FREE_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*);
typedef STRUCTURE_ACTOR* (*aSTR_GET_ACTOR_AREA_PROC)();
typedef void (*aSTR_FREE_ACTOR_AREA_PROC)(STRUCTURE_ACTOR*);
typedef u16* (*aSTR_GET_PAL_SEGMENT_PROC)(s16);
struct actor_structure_s {
ACTOR actor_class;
u8 _174[0x2B0 - 0x174];
int request_type;
u8 _2B4[0x2DC - 0x2B4];
};
typedef struct actor_overlay_info_s {
u8* overlay_p;
int used;
} aSTR_Overlay_info_c;
// TODO: finish clip
typedef struct actor_structure_clip_s {
aSTR_SETUP_ACTOR_PROC setup_actor_proc;
aSTR_GET_OVERLAY_AREA_PROC get_overlay_area_proc;
aSTR_FREE_OVERLAY_AREA_PROC free_overlay_area_proc;
aSTR_GET_ACTOR_AREA_PROC get_actor_area_proc;
aSTR_FREE_ACTOR_AREA_PROC free_actor_area_proc;
STRUCTURE_ACTOR* structure_actor_tbl[aSTR_ACTOR_TBL_COUNT];
int structure_actor_used_tbl[aSTR_ACTOR_TBL_COUNT];
aSTR_Overlay_info_c overlay_area[aSTR_ACTOR_TBL_COUNT];
aSTR_GET_PAL_SEGMENT_PROC get_pal_segment_proc;
} aSTR_Clip_c;
struct actor_structure_control_s {
ACTOR actor_class;
int _174;
mActor_name_t str_door_name;
u8 reset;
};
extern ACTOR_PROFILE Structure_Profile;
#ifdef __cplusplus
+2
View File
@@ -15,6 +15,7 @@ extern "C" {
#endif
typedef void (*mActor_proc)(ACTOR*, GAME*);
#define NONE_ACTOR_PROC ((mActor_proc)&none_proc1)
#define ACTOR_STATE_NONE 0
#define ACTOR_STATE_NO_MOVE_WHILE_CULLED (1 << 4)
@@ -398,6 +399,7 @@ extern ACTOR* Actor_info_fgName_search(Actor_info* actor_info, mActor_name_t fg_
extern void Actor_world_to_eye(ACTOR* actor, f32 eye_height);
extern void Shape_Info_init(ACTOR* actor, f32 y_ofs, mActor_shadow_proc shadow_proc, f32 shadow_sizeX, f32 shadow_sizeZ);
extern void Actor_position_moveF(ACTOR* actor);
extern ACTOR* Actor_info_make_actor(Actor_info* actor_info, GAME* game, s16 profile, f32 x, f32 y, f32 z, short rot_x, short rot_y, short rot_z, s8 block_x, s8 block_z, s16 mvactor_list_no, mActor_name_t actor_name, s16 arg, s8 npc_idx, int data_bank);
extern void mAc_ActorShadowCircle(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play);
extern void mAc_ActorShadowEllipse(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play);
+3 -3
View File
@@ -8,7 +8,7 @@
extern "C" {
#endif
typedef struct actor_dfltbl_s {
typedef struct actor_dlftbl_s {
u32 rom_start; // unused in AC
u32 rom_end; // unused in AC
u8* ram_start; // used only with a check, but never set in AC
@@ -19,10 +19,10 @@ typedef struct actor_dfltbl_s {
u16 flags; // related to memory pinning but functionally useless in AC since alloc_buf is never allocated
s8 num_actors; // number of this type of actor that currently exist
s8 unk2; // unused in AC
} ACTOR_DFLTBL;
} ACTOR_DLFTBL;
extern int actor_dlftbls_num;
extern ACTOR_DFLTBL actor_dlftbls[];
extern ACTOR_DLFTBL actor_dlftbls[];
extern void actor_dlftbls_init();
extern void actor_dlftbls_cleanup();
+1
View File
@@ -50,6 +50,7 @@ enum field_type2 {
enum field_room {
/* TODO: others */
mFI_FIELD_FG = mFI_TO_FIELD_ID(mFI_FIELDTYPE_FG, 0),
mFI_FIELD_PLAYER0_ROOM = mFI_TO_FIELD_ID(mFI_FIELDTYPE_PLAYER_ROOM, 0),
mFI_FIELD_PLAYER1_ROOM,
+88 -3
View File
@@ -59,6 +59,9 @@ extern int mNT_check_unknown(mActor_name_t item_no);
#define ITEM_NAME_GET_CAT(n) (((n) & 0x0F00) >> 8)
#define ITEM_NAME_GET_INDEX(n) ((mActor_name_t)(n) & 0xFF)
#define NPC_HOUSE_ID_TO_NPC_ID(house) (house + 0x9000)
#define NPC_ID_TO_NPC_HOUSE_ID(npc) (npc - 0x9000)
#define ITEM_IS_FTR(n) \
(ITEM_NAME_GET_TYPE(n) == NAME_TYPE_FTR0 || ITEM_NAME_GET_TYPE(n) == NAME_TYPE_FTR1)
@@ -468,14 +471,96 @@ extern int mNT_check_unknown(mActor_name_t item_no);
#define EXIT_DOOR 0x4080
#define NPC_HOUSE_START 0x5000
#define NPC_HOUSE000 NPC_HOUSE_START
//
#define NPC_HOUSE_END 0x50EE
#define STRUCTURE_START 0x5800
#define HOUSE0 (STRUCTURE_START)
#define HOUSE1 (HOUSE0 + 1)
#define HOUSE2 (HOUSE1 + 1)
#define HOUSE3 (HOUSE2 + 1)
#define TRAIN_STATION 0x5809
#define TRAIN0 0x580A
#define TRAIN1 0x580B
#define SHOP0 (HOUSE3 + 1)
#define SHOP1 (SHOP0 + 1)
#define SHOP2 (SHOP1 + 1)
#define SHOP3 (SHOP2 + 1)
#define POST_OFFICE (SHOP3 + 1)
#define TRAIN_STATION (POST_OFFICE + 1)
#define TRAIN0 (TRAIN_STATION + 1)
#define TRAIN1 (TRAIN0 + 1)
#define POLICE_STATION (TRAIN1 + 1)
#define WATERFALL_SOUTH (POLICE_STATION + 1)
#define WATERFALL_EAST (WATERFALL_SOUTH + 1)
#define WATERFALL_WEST (WATERFALL_EAST + 1)
#define SIGN00 (WATERFALL_WEST + 1)
#define SIGN01 (SIGN00 + 1)
#define SIGN02 (SIGN01 + 1)
#define SIGN03 (SIGN02 + 1)
#define SIGN04 (SIGN03 + 1)
#define SIGN05 (SIGN04 + 1)
#define SIGN06 (SIGN05 + 1)
#define SIGN07 (SIGN06 + 1)
#define SIGN08 (SIGN07 + 1)
#define SIGN09 (SIGN08 + 1)
#define SIGN10 (SIGN09 + 1)
#define SIGN11 (SIGN10 + 1)
#define SIGN12 (SIGN11 + 1)
#define SIGN13 (SIGN12 + 1)
#define SIGN14 (SIGN13 + 1)
#define SIGN15 (SIGN14 + 1)
#define SIGN16 (SIGN15 + 1)
#define SIGN17 (SIGN16 + 1)
#define SIGN18 (SIGN17 + 1)
#define SIGN19 (SIGN18 + 1)
#define SIGN20 (SIGN19 + 1)
#define WISHING_WELL (SIGN20 + 1)
#define BROKER_TENT (WISHING_WELL + 1)
#define FORTUNE_TENT (BROKER_TENT + 1)
#define DESIGNER_CAR (FORTUNE_TENT + 1)
#define KAMAKURA (DESIGNER_CAR + 1)
#define SAKURA_TABLE0 (KAMAKURA + 1)
#define SAKURA_TABLE1 (SAKURA_TABLE0 + 1)
#define AEROBICS_RADIO (SAKURA_TABLE1 + 1)
#define FIREWORKS_STALL0 (AEROBICS_RADIO + 1)
#define FIREWORKS_STALL1 (FIREWORKS_STALL0 + 1)
#define NEWYEAR_SHRINE0 (FIREWORKS_STALL1 + 1)
#define NEWYEAR_SHRINE1 (NEWYEAR_SHRINE0 + 1)
#define NEWYEAR_TABLE (NEWYEAR_SHRINE1 + 1)
#define NEWYEAR_COUNTDOWN0 (NEWYEAR_TABLE + 1)
#define NEWYEAR_COUNTDOWN1 (NEWYEAR_COUNTDOWN0 + 1)
#define SPORTSFAIR_BALLS_RED (NEWYEAR_COUNTDOWN1 + 1)
#define SPORTSFAIR_BALLS_WHITE (SPORTSFAIR_BALLS_RED + 1)
#define SPORTSFAIR_BASKET_RED (SPORTSFAIR_BALLS_WHITE + 1)
#define SPORTSFAIR_BASKET_WHITE (SPORTSFAIR_BASKET_RED + 1)
#define FISHCHECK_STAND0 (SPORTSFAIR_BASKET_WHITE + 1)
#define FISHCHECK_STAND1 (FISHCHECK_STAND0 + 1)
#define KOINOBORI_WINDSOCK (FISHCHECK_STAND1 + 1)
#define DUMP (KOINOBORI_WINDSOCK + 1)
#define WINDMILL0 (DUMP + 1)
#define WINDMILL1 (WINDMILL0 + 1)
#define WINDMILL2 (WINDMILL1 + 1)
#define WINDMILL3 (WINDMILL2 + 1)
#define WINDMILL4 (WINDMILL3 + 1)
#define LOTUS (WINDMILL4 + 1)
#define MIKANBOX (LOTUS + 1)
#define DOUZOU (MIKANBOX + 1) // train station statue
#define TOUDAI (DOUZOU + 1) // lighthouse
#define GHOG (TOUDAI + 1)
#define HTABLE0 (GHOG + 1)
#define HTABLE1 (HTABLE0 + 1)
#define HTABLE2 (HTABLE1 + 1)
#define TENT (HTABLE2 + 1)
#define MUSEUM (TENT + 1)
#define BRIDGE_A0 (MUSEUM + 1)
#define BRIDGE_A1 (BRIDGE_A0 + 1)
#define NEEDLEWORK_SHOP (BRIDGE_A1 + 1)
#define FLAG (NEEDLEWORK_SHOP + 1)
#define BOAT (FLAG + 1)
#define COTTAGE_MY (BOAT + 1)
#define COTTAGE_NPC (COTTAGE_MY + 1)
#define PORT_SIGN (COTTAGE_NPC + 1)
#define STRUCTURE_END (PORT_SIGN + 1)
#define ETC_START 0x8000
#define ETC_AIRPLANE ETC_START
+1 -1
View File
@@ -4,6 +4,6 @@
#include "types.h"
#include "dolphin/vi.h"
void viBlack(BOOL);
extern void viBlack(int black);
#endif
+354
View File
@@ -0,0 +1,354 @@
#include "ac_structure.h"
#include "m_play.h"
#include "m_name_table.h"
#include "m_malloc.h"
#include "m_common_data.h"
static void aSTR_actor_ct(ACTOR* actor, GAME* game);
static void aSTR_actor_dt(ACTOR* actor, GAME* game);
static void aSTR_actor_move(ACTOR* actor, GAME* game);
ACTOR_PROFILE Structure_Profile = {
mAc_PROFILE_STRUCTURE,
ACTOR_PART_CONTROL,
ACTOR_STATE_NO_MOVE_WHILE_CULLED | ACTOR_STATE_NO_DRAW_WHILE_CULLED,
EMPTY_NO,
ACTOR_OBJ_BANK_3,
sizeof(STRUCTURE_CONTROL_ACTOR),
&aSTR_actor_ct,
&aSTR_actor_dt,
&aSTR_actor_move,
NONE_ACTOR_PROC,
NULL
};
static u8 aSTR_overlay[aSTR_ACTOR_TBL_COUNT][aSTR_OVERLAY_SIZE];
static STRUCTURE_ACTOR aSTR_actor_cl[aSTR_ACTOR_TBL_COUNT];
static void aSTR_init_clip_area();
static void aSTR_free_clip_area();
static void aSTR_actor_ct(ACTOR* actor, GAME* game) {
STRUCTURE_CONTROL_ACTOR* structure = (STRUCTURE_CONTROL_ACTOR*)actor;
aSTR_init_clip_area();
structure->str_door_name = Common_Get(door_data).door_actor_name;
structure->reset = Common_Get(door_data).exit_type;
}
static void aSTR_actor_dt(ACTOR* actor, GAME* game) {
aSTR_free_clip_area();
}
static int request[2]; // TODO: fix ordering by using separate TUs
static void aSTR_check_door_data(STRUCTURE_CONTROL_ACTOR* actor, GAME* game) {
//static int request[2] = { 4, 5 };
GAME_PLAY* play = (GAME_PLAY*)game;
if (ITEM_NAME_GET_TYPE(actor->str_door_name) == NAME_TYPE_STRUCT) {
STRUCTURE_ACTOR* str_actor = (STRUCTURE_ACTOR*)Actor_info_fgName_search(&play->actor_info, actor->str_door_name, ACTOR_PART_ITEM);
if (str_actor != NULL && str_actor->request_type == 0) {
str_actor->request_type = request[actor->reset == TRUE];
actor->str_door_name = EMPTY_NO;
}
}
else {
actor->str_door_name = EMPTY_NO;
}
}
static void aSTR_actor_move(ACTOR* actor, GAME* game) {
STRUCTURE_CONTROL_ACTOR* structure = (STRUCTURE_CONTROL_ACTOR*)actor;
switch (mFI_GetFieldId()) {
case mFI_FIELD_FG:
aSTR_check_door_data(structure, game);
break;
}
}
extern u16* structure_pal_adrs_nowinter[];
extern u16* structure_pal_adrs_winter[];
static u16* aSTR_get_pal_segment(s16 structure_type) {
static u16** pal_adrs_table[2] = { structure_pal_adrs_nowinter, structure_pal_adrs_winter };
int winter = Common_Get(time).season == mTM_SEASON_WINTER;
return pal_adrs_table[winter][structure_type];
}
typedef struct structure_setup_info_s {
s16 profile;
s16 structure_type; // aSTR_TYPE_*
s16 pal_no;
s16 pad;
} aSTR_setup_info;
static STRUCTURE_ACTOR* aSTR_setupActor_proc(GAME* game, mActor_name_t structure_name, s16 arg, f32 x, f32 z) {
static aSTR_setup_info setupInfo_table[] = {
{ mAc_PROFILE_MYHOUSE, 5, 25, 0 },
{ mAc_PROFILE_MYHOUSE, 5, 26, 0 },
{ mAc_PROFILE_MYHOUSE, 5, 27, 0 },
{ mAc_PROFILE_MYHOUSE, 5, 28, 0 },
{ mAc_PROFILE_SHOP, 8, 37, 0 },
{ mAc_PROFILE_CONVENI, 9, 38, 0 },
{ mAc_PROFILE_SUPER, 10, 39, 0 },
{ mAc_PROFILE_DEPART, 11, 40, 0 },
{ mAc_PROFILE_POST_OFFICE, 12, 41, 0 },
{ mAc_PROFILE_STATION, 13, 42, 0 },
{ mAc_PROFILE_TRAIN0, 16, 57, 0 },
{ mAc_PROFILE_TRAIN1, 17, 58, 0 },
{ mAc_PROFILE_POLICE_BOX, 18, 59, 0 },
{ mAc_PROFILE_FALLS, 19, 60, 0 },
{ mAc_PROFILE_FALLSESW, 20, 61, 0 },
{ mAc_PROFILE_FALLSESW, 20, 61, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
{ mAc_PROFILE_SHRINE, 22, 63, 0 },
{ mAc_PROFILE_BRSHOP, 23, 64, 0 },
{ mAc_PROFILE_BUGGY, 24, 65, 0 },
{ mAc_PROFILE_S_CAR, 25, 66, 0 },
{ mAc_PROFILE_KAMAKURA, 26, 67, 0 },
{ mAc_PROFILE_GOZA, 27, 68, 0 },
{ mAc_PROFILE_GOZA, 27, 68, 0 },
{ mAc_PROFILE_RADIO, 28, 69, 0 },
{ mAc_PROFILE_YATAI, 29, 70, 0 },
{ mAc_PROFILE_YATAI, 29, 70, 0 },
{ mAc_PROFILE_TUKIMI, 30, 71, 0 },
{ mAc_PROFILE_TUKIMI, 31, 72, 0 },
{ mAc_PROFILE_MIKUJI, 32, 73, 0 },
{ mAc_PROFILE_COUNT, 33, 74, 0 },
{ mAc_PROFILE_COUNT02, 34, 75, 0 },
{ mAc_PROFILE_TAMA, 35, 76, 0 },
{ mAc_PROFILE_TAMA, 36, 77, 0 },
{ mAc_PROFILE_KAGO, 35, 76, 0 },
{ mAc_PROFILE_KAGO, 36, 77, 0 },
{ mAc_PROFILE_TURI, 37, 78, 0 },
{ mAc_PROFILE_TURI, 38, 79, 0 },
{ mAc_PROFILE_KOINOBORI, 39, 80, 0 },
{ mAc_PROFILE_DUMP, 40, 81, 0 },
{ mAc_PROFILE_WINDMILL, 41, 82, 0 },
{ mAc_PROFILE_WINDMILL, 41, 83, 0 },
{ mAc_PROFILE_WINDMILL, 41, 84, 0 },
{ mAc_PROFILE_WINDMILL, 41, 85, 0 },
{ mAc_PROFILE_WINDMILL, 41, 86, 0 },
{ mAc_PROFILE_LOTUS, 42, 87, 0 },
{ mAc_PROFILE_MIKANBOX, 43, 88, 0 },
{ mAc_PROFILE_DOUZOU, 44, 89, 0 },
{ mAc_PROFILE_TOUDAI, 45, 90, 0 },
{ mAc_PROFILE_GHOG, 46, 91, 0 },
{ mAc_PROFILE_HTABLE, 47, 91, 0 },
{ mAc_PROFILE_HTABLE, 47, 91, 0 },
{ mAc_PROFILE_HTABLE, 47, 91, 0 },
{ mAc_PROFILE_TENT, 26, 67, 0 },
{ mAc_PROFILE_MUSEUM, 48, 91, 0 },
{ mAc_PROFILE_BRIDGE_A, 49, 92, 0 },
{ mAc_PROFILE_BRIDGE_A, 49, 92, 0 },
{ mAc_PROFILE_NEEDLEWORK_SHOP, 51, 93, 0 },
{ mAc_PROFILE_FLAG, 52, 94, 0 },
{ mAc_PROFILE_BOAT, 53, 95, 0 },
{ mAc_PROFILE_COTTAGE_MY, 54, 96, 0 },
{ mAc_PROFILE_COTTAGE_NPC, 55, 97, 0 },
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
};
STRUCTURE_ACTOR* str_actor;
GAME_PLAY* play = (GAME_PLAY*)game;
s16 profile;
xyz_t pos;
if (structure_name < NPC_HOUSE_END) {
mNpc_SearchAnimalinfo(Save_Get(animals), NPC_HOUSE_ID_TO_NPC_ID(structure_name), ANIMAL_NUM_MAX);
profile = mAc_PROFILE_HOUSE;
}
else if (structure_name >= HOUSE0 && structure_name < SHOP0) {
int idx = structure_name - STRUCTURE_START;
profile = setupInfo_table[idx].profile;
}
else if (structure_name >= TRAIN_STATION && structure_name < TRAIN0) {
profile = mAc_PROFILE_STATION;
}
else {
int idx = structure_name - STRUCTURE_START;
profile = setupInfo_table[idx].profile;
}
pos.x = x;
pos.z = z;
pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f);
str_actor = (STRUCTURE_ACTOR*)Actor_info_make_actor(&play->actor_info, game, profile, pos.x, pos.y, pos.z, 0, 0, 0, play->block_table.block_x, play->block_table.block_z, -1, structure_name, arg, -1, -1);
if (str_actor != NULL) {
mFI_SetFG_common(RSV_NO, pos, FALSE);
}
return str_actor;
}
static int aSTR_get_overlay_free_area_idx() {
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
aSTR_Overlay_info_c* overlay_info = clip->overlay_area;
int res = -1;
int i;
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
if (overlay_info->used == FALSE) {
res = i;
break;
}
overlay_info++;
}
return res;
}
static void aSTR_get_overlay_area_proc(ACTOR_DLFTBL* dlftbl) {
int overlay_idx = aSTR_get_overlay_free_area_idx();
if (overlay_idx != -1) {
aSTR_Overlay_info_c* overlay_info = Common_Get(clip).structure_clip->overlay_area + overlay_idx;
aSTR_Overlay_info_c* overlay2_info;
dlftbl->alloc_buf = overlay_info->overlay_p;
overlay2_info = Common_Get(clip).structure_clip->overlay_area + overlay_idx;
overlay2_info->used = TRUE;
}
else {
dlftbl->alloc_buf = NULL;
}
}
static void aSTR_free_overlay_area_proc(ACTOR_DLFTBL* dlftbl) {
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
aSTR_Overlay_info_c* overlay_info = clip->overlay_area;
int i;
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
if (overlay_info->overlay_p == dlftbl->alloc_buf) {
overlay_info->used = FALSE;
dlftbl->alloc_buf = NULL;
break;
}
overlay_info++;
}
}
static STRUCTURE_ACTOR* aSTR_get_actor_area_proc() {
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl;
int* str_used_tbl = clip->structure_actor_used_tbl;
STRUCTURE_ACTOR* res = NULL;
int i;
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
if (*str_tbl != NULL && *str_used_tbl == FALSE) {
*str_used_tbl = TRUE;
res = *str_tbl;
break;
}
str_tbl++;
str_used_tbl++;
}
return res;
}
static void aSTR_free_actor_area_proc(STRUCTURE_ACTOR* str_actor) {
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl;
int* str_used_tbl = clip->structure_actor_used_tbl;
int i;
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
if (*str_tbl == str_actor) {
*str_used_tbl = FALSE;
break;
}
str_tbl++;
str_used_tbl++;
}
}
static void aSTR_init_clip_area() {
if (Common_Get(clip).structure_clip == NULL) {
int i;
Common_Set(clip.structure_clip, (aSTR_Clip_c*)zelda_malloc(sizeof(aSTR_Clip_c)));
Common_Get(clip).structure_clip->setup_actor_proc = &aSTR_setupActor_proc;
Common_Get(clip).structure_clip->get_overlay_area_proc = &aSTR_get_overlay_area_proc;
Common_Get(clip).structure_clip->free_overlay_area_proc = &aSTR_free_overlay_area_proc;
Common_Get(clip).structure_clip->get_actor_area_proc = &aSTR_get_actor_area_proc;
Common_Get(clip).structure_clip->free_actor_area_proc = &aSTR_free_actor_area_proc;
Common_Get(clip).structure_clip->get_pal_segment_proc = &aSTR_get_pal_segment;
{
STRUCTURE_ACTOR** str_tbl = Common_Get(clip).structure_clip->structure_actor_tbl;
int* str_used_tbl = Common_Get(clip).structure_clip->structure_actor_used_tbl;
aSTR_Overlay_info_c* overlay_info = Common_Get(clip).structure_clip->overlay_area;
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
*str_tbl = &aSTR_actor_cl[i];
*str_used_tbl = FALSE;
str_tbl++;
str_used_tbl++;
overlay_info->overlay_p = aSTR_overlay[i];
overlay_info->used = FALSE;
overlay_info++;
}
}
}
}
static void aSTR_free_clip_area() {
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
if (clip != NULL) {
STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl;
aSTR_Overlay_info_c* overlay_info = clip->overlay_area;
int i;
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
if (*str_tbl != NULL) {
*str_tbl = NULL;
}
if (overlay_info->overlay_p != NULL) {
overlay_info->overlay_p = NULL;
}
str_tbl++;
overlay_info++;
}
zelda_free(Common_Get(clip).structure_clip);
Common_Set(clip.structure_clip, NULL);
}
}
static int request[2] = { 4, 5 }; // TODO: remove when separated TUs are implemented and aSTR_check_door_data is corrected
+1 -1
View File
@@ -253,7 +253,7 @@
{0,0,NULL,NULL,NULL,NULL,0,0,0,0}
ACTOR_DFLTBL actor_dlftbls[] = {
ACTOR_DLFTBL actor_dlftbls[] = {
MAKE_ACTOR_DLF(Player),
MAKE_ACTOR_DLF(BgItem),
MAKE_ACTOR_DLF(Sample),
+3 -3
View File
@@ -1,5 +1,5 @@
#include "sys_vimgr.h"
void viBlack(BOOL black){
VISetBlack(black);
}
extern void viBlack(int black) {
VISetBlack(black);
}