mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
Merge pull request #311 from Cuyler36:bg_item_actors
Implement & link bg_post_item, bg_police_item
This commit is contained in:
@@ -609,6 +609,15 @@ bg_item.c:
|
||||
.rodata: [0x80646178, 0x80646218]
|
||||
.data: [0x80692BE0, 0x80695B38]
|
||||
.bss: [0x812FD938, 0x812FDDC8]
|
||||
bg_police_item.c:
|
||||
.text: [0x804BE338, 0x804BE890]
|
||||
.rodata: [0x80646218, 0x80646220]
|
||||
.data: [0x80695B38, 0x80695D60]
|
||||
.bss: [0x812FDDC8, 0x812FDDE8]
|
||||
bg_post_item.c:
|
||||
.text: [0x804BE890, 0x804BE9FC]
|
||||
.rodata: [0x80646220, 0x80646228]
|
||||
.data: [0x80695D60, 0x80695D98]
|
||||
bg_winter_item.c:
|
||||
.text: [0x804BE9FC, 0x804C5E30]
|
||||
.rodata: [0x80646228, 0x806462C8]
|
||||
|
||||
@@ -2730,6 +2730,39 @@ extern int mNT_check_unknown(mActor_name_t item_no);
|
||||
#define DUMMY_FLAG 0xF122
|
||||
#define DUMMY_TENT 0xF127
|
||||
#define DUMMY_BOAT 0xF128
|
||||
#define RSV_POLICE_ITEM_0 0xF128 // why is this duplicated?
|
||||
#define RSV_POLICE_ITEM_1 0xF129
|
||||
#define RSV_POLICE_ITEM_2 0xF12A
|
||||
#define RSV_POLICE_ITEM_3 0xF12B
|
||||
#define RSV_POLICE_ITEM_4 0xF12C
|
||||
#define RSV_POLICE_ITEM_5 0xF12D
|
||||
#define RSV_POLICE_ITEM_6 0xF12E
|
||||
#define RSV_POLICE_ITEM_7 0xF12F
|
||||
#define RSV_POLICE_ITEM_8 0xF130
|
||||
#define RSV_POLICE_ITEM_9 0xF131
|
||||
#define RSV_POLICE_ITEM_10 0xF132
|
||||
#define RSV_POLICE_ITEM_11 0xF133
|
||||
#define RSV_POLICE_ITEM_12 0xF134
|
||||
#define RSV_POLICE_ITEM_13 0xF135
|
||||
#define RSV_POLICE_ITEM_14 0xF136
|
||||
#define RSV_POLICE_ITEM_15 0xF137
|
||||
#define RSV_POLICE_ITEM_16 0xF138
|
||||
#define RSV_POLICE_ITEM_17 0xF139
|
||||
#define RSV_POLICE_ITEM_18 0xF13A
|
||||
#define RSV_POLICE_ITEM_19 0xF13B
|
||||
#define RSV_POLICE_ITEM_20 0xF13C
|
||||
#define RSV_POLICE_ITEM_21 0xF13D
|
||||
#define RSV_POLICE_ITEM_22 0xF13E
|
||||
#define RSV_POLICE_ITEM_23 0xF13F
|
||||
#define RSV_POLICE_ITEM_24 0xF140
|
||||
#define RSV_POLICE_ITEM_25 0xF141
|
||||
#define RSV_POLICE_ITEM_26 0xF142
|
||||
#define RSV_POLICE_ITEM_27 0xF143
|
||||
#define RSV_POLICE_ITEM_28 0xF144
|
||||
#define RSV_POLICE_ITEM_29 0xF145
|
||||
#define RSV_POLICE_ITEM_30 0xF146
|
||||
#define RSV_POLICE_ITEM_31 0xF147
|
||||
#define RSV_POLICE_ITEM_END 0xF148
|
||||
|
||||
#define RSV_DOOR 0xFE1B
|
||||
#define RSV_FE1C 0xFE1C
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
#include "bg_police_item.h"
|
||||
|
||||
#include "m_name_table.h"
|
||||
#include "m_rcp.h"
|
||||
#include "sys_matrix.h"
|
||||
#include "m_player_lib.h"
|
||||
#include "m_common_data.h"
|
||||
|
||||
typedef struct bg_police_item_draw_pos {
|
||||
int next;
|
||||
MtxF mtx;
|
||||
} bPI_draw_pos_c;
|
||||
|
||||
typedef struct bg_police_item_draw_data {
|
||||
u16 start_idx[mNT_ITEM_TYPE_NUM - 1];
|
||||
bPI_draw_pos_c draw_pos[UT_TOTAL_NUM + 1];
|
||||
} bPI_draw_data_c;
|
||||
|
||||
typedef struct bg_police_item_draw_tbl {
|
||||
int draw_flag;
|
||||
bPI_draw_data_c draw_data;
|
||||
} bPI_draw_tbl_c;
|
||||
|
||||
typedef struct bg_police_item_s {
|
||||
ACTOR actor_class;
|
||||
bPI_draw_tbl_c draw_tbl;
|
||||
mFI_item_table_c item_tbl;
|
||||
} BG_POLICE_ITEM_ACTOR;
|
||||
|
||||
static void bPI_actor_move(ACTOR* actorx, GAME* game);
|
||||
static void bPI_actor_draw(ACTOR* actorx, GAME* game);
|
||||
|
||||
ACTOR_PROFILE BgPoliceItem_Profile = {
|
||||
mAc_PROFILE_BGPOLICEITEM,
|
||||
ACTOR_PART_ITEM,
|
||||
ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED,
|
||||
EMPTY_NO,
|
||||
ACTOR_OBJ_BANK_KEEP,
|
||||
sizeof(BG_POLICE_ITEM_ACTOR),
|
||||
mActor_NONE_PROC1,
|
||||
mActor_NONE_PROC1,
|
||||
&bPI_actor_move,
|
||||
&bPI_actor_draw,
|
||||
NULL,
|
||||
};
|
||||
|
||||
#include "../src/bg_police_item_data.c_inc"
|
||||
|
||||
#include "../src/bg_police_item_move.c_inc"
|
||||
#include "../src/bg_police_item_draw.c_inc"
|
||||
@@ -0,0 +1,217 @@
|
||||
extern Gfx apple_DL_mode[];
|
||||
extern Gfx orange_DL_mode[];
|
||||
extern Gfx peach_DL_mode[];
|
||||
extern Gfx pear_DL_mode[];
|
||||
extern Gfx nuts_DL_mode[];
|
||||
extern Gfx matutake_DL_mode[];
|
||||
extern Gfx kabu_DL_mode[];
|
||||
extern Gfx fish_DL_mode[];
|
||||
extern Gfx bag_DL_mode[];
|
||||
extern Gfx leaf_DL_mode[];
|
||||
extern Gfx obj_rollT_mat_model[];
|
||||
extern Gfx box_DL_mode[];
|
||||
extern Gfx pack_DL_mode[];
|
||||
extern Gfx present_DL_mode[];
|
||||
extern Gfx seed_DL_mode[];
|
||||
extern Gfx obj_haniwaT_mat_model[];
|
||||
extern Gfx obj_boxT_mat_model[];
|
||||
extern Gfx obj_cageT_mat_model[];
|
||||
extern Gfx obj_toolT_mat_model[];
|
||||
extern Gfx obj_fossilT_mat_model[];
|
||||
extern Gfx obj_trashT_mat_model[];
|
||||
extern Gfx obj_letterT_mat_model[];
|
||||
extern Gfx obj_otosiT_mat_model[];
|
||||
extern Gfx obj_item_shellAT_mat_model[];
|
||||
extern Gfx obj_item_shellBT_mat_model[];
|
||||
extern Gfx obj_item_shellCT_mat_model[];
|
||||
extern Gfx obj_shop_candy_mat_modelT[];
|
||||
extern Gfx obj_item_cocoT_mat_model[];
|
||||
extern Gfx obj_item_omikuji_mat_model[];
|
||||
extern Gfx obj_item_clothT_mat_model[];
|
||||
extern Gfx obj_item_carpetT_mat_model[];
|
||||
extern Gfx obj_item_wallT_mat_model[];
|
||||
extern Gfx obj_item_axeT_mat_model[];
|
||||
extern Gfx obj_item_netT_mat_model[];
|
||||
extern Gfx obj_item_rodT_mat_model[];
|
||||
extern Gfx obj_item_shovelT_mat_model[];
|
||||
extern Gfx obj_item_axe2T_mat_model[];
|
||||
extern Gfx obj_item_net2T_mat_model[];
|
||||
extern Gfx obj_item_rod2T_mat_model[];
|
||||
extern Gfx obj_item_shovel2T_mat_model[];
|
||||
extern Gfx obj_item_umbrellaT_mat_model[];
|
||||
extern Gfx obj_item_kazaT_mat_model[];
|
||||
extern Gfx obj_item_utiwaT_mat_model[];
|
||||
extern Gfx obj_item_paperT_mat_model[];
|
||||
extern Gfx obj_item_seedT_mat_model[];
|
||||
extern Gfx obj_item_fukuT_mat_model[];
|
||||
extern Gfx obj_item_taisouT_mat_model[];
|
||||
extern Gfx obj_mdT_mat_model[];
|
||||
extern Gfx obj_item_ticketT_mat_model[];
|
||||
extern Gfx obj_item_boneT_mat_model[];
|
||||
extern Gfx obj_item_diaryT_mat_model[];
|
||||
extern Gfx obj_item_fork_onT_mat_model[];
|
||||
|
||||
static Gfx* mode_DL_table[] = {
|
||||
NULL,
|
||||
apple_DL_mode,
|
||||
orange_DL_mode,
|
||||
peach_DL_mode,
|
||||
pear_DL_mode,
|
||||
nuts_DL_mode,
|
||||
matutake_DL_mode,
|
||||
kabu_DL_mode,
|
||||
fish_DL_mode,
|
||||
bag_DL_mode,
|
||||
leaf_DL_mode,
|
||||
obj_rollT_mat_model,
|
||||
box_DL_mode,
|
||||
pack_DL_mode,
|
||||
present_DL_mode,
|
||||
seed_DL_mode,
|
||||
obj_haniwaT_mat_model,
|
||||
obj_boxT_mat_model,
|
||||
obj_cageT_mat_model,
|
||||
obj_toolT_mat_model,
|
||||
obj_fossilT_mat_model,
|
||||
obj_trashT_mat_model,
|
||||
obj_letterT_mat_model,
|
||||
obj_otosiT_mat_model,
|
||||
obj_item_shellAT_mat_model,
|
||||
obj_item_shellBT_mat_model,
|
||||
obj_item_shellCT_mat_model,
|
||||
obj_shop_candy_mat_modelT,
|
||||
obj_item_cocoT_mat_model,
|
||||
obj_item_omikuji_mat_model,
|
||||
obj_item_clothT_mat_model,
|
||||
obj_item_carpetT_mat_model,
|
||||
obj_item_wallT_mat_model,
|
||||
obj_item_axeT_mat_model,
|
||||
obj_item_netT_mat_model,
|
||||
obj_item_rodT_mat_model,
|
||||
obj_item_shovelT_mat_model,
|
||||
obj_item_axe2T_mat_model,
|
||||
obj_item_net2T_mat_model,
|
||||
obj_item_rod2T_mat_model,
|
||||
obj_item_shovel2T_mat_model,
|
||||
obj_item_umbrellaT_mat_model,
|
||||
obj_item_kazaT_mat_model,
|
||||
obj_item_utiwaT_mat_model,
|
||||
obj_item_paperT_mat_model,
|
||||
obj_item_seedT_mat_model,
|
||||
obj_item_fukuT_mat_model,
|
||||
obj_item_taisouT_mat_model,
|
||||
obj_mdT_mat_model,
|
||||
obj_item_ticketT_mat_model,
|
||||
obj_item_boneT_mat_model,
|
||||
obj_item_diaryT_mat_model,
|
||||
obj_item_fork_onT_mat_model,
|
||||
};
|
||||
|
||||
extern Gfx apple_DL_vtx[];
|
||||
extern Gfx orange_DL_vtx[];
|
||||
extern Gfx peach_DL_vtx[];
|
||||
extern Gfx pear_DL_vtx[];
|
||||
extern Gfx nuts_DL_vtx[];
|
||||
extern Gfx matutake_DL_vtx[];
|
||||
extern Gfx kabu_DL_vtx[];
|
||||
extern Gfx fish_DL_vtx[];
|
||||
extern Gfx bag_DL_vtx[];
|
||||
extern Gfx leaf_DL_vtx[];
|
||||
extern Gfx obj_rollT_gfx_model[];
|
||||
extern Gfx box_DL_vtx[];
|
||||
extern Gfx pack_DL_vtx[];
|
||||
extern Gfx present_DL_vtx[];
|
||||
extern Gfx seed_DL_vtx[];
|
||||
extern Gfx obj_haniwaT_gfx_model[];
|
||||
extern Gfx obj_boxT_gfx_model[];
|
||||
extern Gfx obj_cageT_gfx_model[];
|
||||
extern Gfx obj_toolT_gfx_model[];
|
||||
extern Gfx obj_fossilT_gfx_model[];
|
||||
extern Gfx obj_trashT_gfx_model[];
|
||||
extern Gfx obj_letterT_gfx_model[];
|
||||
extern Gfx obj_otosiT_gfx_model[];
|
||||
extern Gfx obj_item_shellAT_gfx_model[];
|
||||
extern Gfx obj_item_shellBT_gfx_model[];
|
||||
extern Gfx obj_item_shellCT_gfx_model[];
|
||||
extern Gfx obj_shop_candy_gfx_modelT[];
|
||||
extern Gfx obj_item_cocoT_gfx_model[];
|
||||
extern Gfx obj_item_omikuji_gfx_model[];
|
||||
extern Gfx obj_item_clothT_gfx_model[];
|
||||
extern Gfx obj_item_carpetT_gfx_model[];
|
||||
extern Gfx obj_item_wallT_gfx_model[];
|
||||
extern Gfx obj_item_axeT_gfx_model[];
|
||||
extern Gfx obj_item_netT_gfx_model[];
|
||||
extern Gfx obj_item_rodT_gfx_model[];
|
||||
extern Gfx obj_item_shovelT_gfx_model[];
|
||||
extern Gfx obj_item_axe2T_gfx_model[];
|
||||
extern Gfx obj_item_net2T_gfx_model[];
|
||||
extern Gfx obj_item_rod2T_gfx_model[];
|
||||
extern Gfx obj_item_shovel2T_gfx_model[];
|
||||
extern Gfx obj_item_umbrellaT_gfx_model[];
|
||||
extern Gfx obj_item_kazaT_gfx_model[];
|
||||
extern Gfx obj_item_utiwaT_gfx_model[];
|
||||
extern Gfx obj_item_paperT_gfx_model[];
|
||||
extern Gfx obj_item_seedT_gfx_model[];
|
||||
extern Gfx obj_item_fukuT_gfx_model[];
|
||||
extern Gfx obj_item_taisouT_gfx_model[];
|
||||
extern Gfx obj_mdT_gfx_model[];
|
||||
extern Gfx obj_item_ticketT_gfx_model[];
|
||||
extern Gfx obj_item_boneT_gfx_model[];
|
||||
extern Gfx obj_item_diaryT_gfx_model[];
|
||||
extern Gfx obj_item_fork_onT_gfx_model[];
|
||||
|
||||
static Gfx* vtx_DL_table[] = {
|
||||
NULL,
|
||||
apple_DL_vtx,
|
||||
orange_DL_vtx,
|
||||
peach_DL_vtx,
|
||||
pear_DL_vtx,
|
||||
nuts_DL_vtx,
|
||||
matutake_DL_vtx,
|
||||
kabu_DL_vtx,
|
||||
fish_DL_vtx,
|
||||
bag_DL_vtx,
|
||||
leaf_DL_vtx,
|
||||
obj_rollT_gfx_model,
|
||||
box_DL_vtx,
|
||||
pack_DL_vtx,
|
||||
present_DL_vtx,
|
||||
seed_DL_vtx,
|
||||
obj_haniwaT_gfx_model,
|
||||
obj_boxT_gfx_model,
|
||||
obj_cageT_gfx_model,
|
||||
obj_toolT_gfx_model,
|
||||
obj_fossilT_gfx_model,
|
||||
obj_trashT_gfx_model,
|
||||
obj_letterT_gfx_model,
|
||||
obj_otosiT_gfx_model,
|
||||
obj_item_shellAT_gfx_model,
|
||||
obj_item_shellBT_gfx_model,
|
||||
obj_item_shellCT_gfx_model,
|
||||
obj_shop_candy_gfx_modelT,
|
||||
obj_item_cocoT_gfx_model,
|
||||
obj_item_omikuji_gfx_model,
|
||||
obj_item_clothT_gfx_model,
|
||||
obj_item_carpetT_gfx_model,
|
||||
obj_item_wallT_gfx_model,
|
||||
obj_item_axeT_gfx_model,
|
||||
obj_item_netT_gfx_model,
|
||||
obj_item_rodT_gfx_model,
|
||||
obj_item_shovelT_gfx_model,
|
||||
obj_item_axe2T_gfx_model,
|
||||
obj_item_net2T_gfx_model,
|
||||
obj_item_rod2T_gfx_model,
|
||||
obj_item_shovel2T_gfx_model,
|
||||
obj_item_umbrellaT_gfx_model,
|
||||
obj_item_kazaT_gfx_model,
|
||||
obj_item_utiwaT_gfx_model,
|
||||
obj_item_paperT_gfx_model,
|
||||
obj_item_seedT_gfx_model,
|
||||
obj_item_fukuT_gfx_model,
|
||||
obj_item_taisouT_gfx_model,
|
||||
obj_mdT_gfx_model,
|
||||
obj_item_ticketT_gfx_model,
|
||||
obj_item_boneT_gfx_model,
|
||||
obj_item_diaryT_gfx_model,
|
||||
obj_item_fork_onT_gfx_model,
|
||||
};
|
||||
@@ -0,0 +1,66 @@
|
||||
typedef struct draw_work_s {
|
||||
GAME* game;
|
||||
GRAPH* graph;
|
||||
bPI_draw_tbl_c* draw_tbl;
|
||||
int start_idx;
|
||||
Gfx* mode_p; // material (textures, etc)
|
||||
Gfx* vtx_p; // tris
|
||||
int _18;
|
||||
} bIP_draw_work_c;
|
||||
|
||||
static bIP_draw_work_c draw_work;
|
||||
|
||||
static void bPI_draw_item_loop(void) {
|
||||
bPI_draw_pos_c* draw_pos = draw_work.draw_tbl->draw_data.draw_pos + draw_work.start_idx;
|
||||
Gfx* vtx = draw_work.vtx_p;
|
||||
GRAPH* graph = draw_work.graph;
|
||||
Gfx* gfx;
|
||||
|
||||
OPEN_DISP(graph);
|
||||
gfx = NOW_POLY_OPA_DISP;
|
||||
|
||||
/* Load the texture data first */
|
||||
gSPDisplayList(gfx++, draw_work.mode_p);
|
||||
|
||||
for (draw_pos; draw_pos->next != 256; draw_pos += draw_pos->next) {
|
||||
Matrix_put(&draw_pos->mtx);
|
||||
|
||||
gDPPipeSync(gfx++);
|
||||
gSPMatrix(gfx++, _Matrix_to_Mtx_new(draw_work.graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
/* Draw all instances of this item using the loaded texture data */
|
||||
gSPDisplayList(gfx++, vtx);
|
||||
}
|
||||
|
||||
SET_POLY_OPA_DISP(gfx);
|
||||
CLOSE_DISP(graph);
|
||||
}
|
||||
|
||||
static void bPI_draw_item(void) {
|
||||
u16* start_idx = draw_work.draw_tbl->draw_data.start_idx;
|
||||
int i;
|
||||
|
||||
_texture_z_light_fog_prim(draw_work.graph);
|
||||
|
||||
/* We start at 1 so we skip mNT_ITEM_TYPE_NONE, start_idx already takes this into account */
|
||||
for (i = 1; i < mNT_ITEM_TYPE_NUM; i++, start_idx++) {
|
||||
/* If there's at least one entry of the item, draw all of the same type */
|
||||
if (*start_idx != 0) {
|
||||
draw_work.start_idx = *start_idx;
|
||||
draw_work.mode_p = mode_DL_table[i];
|
||||
draw_work.vtx_p = vtx_DL_table[i];
|
||||
bPI_draw_item_loop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void bPI_actor_draw(ACTOR* actorx, GAME* game) {
|
||||
BG_POLICE_ITEM_ACTOR* bg_police_item = (BG_POLICE_ITEM_ACTOR*)actorx;
|
||||
|
||||
draw_work.game = game;
|
||||
draw_work.graph = game->graph;
|
||||
|
||||
if (bg_police_item->draw_tbl.draw_flag == TRUE) {
|
||||
draw_work.draw_tbl = &bg_police_item->draw_tbl;
|
||||
bPI_draw_item();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
static void bPI_outPutData(u16* draw_start, bPI_draw_pos_c** draw_pos_pp, u16* data_count, int type,
|
||||
mFI_block_tbl_c* block_tbl, int idx) {
|
||||
if (type != mNT_ITEM_TYPE_NUM) {
|
||||
static f32 pos_table[] = {
|
||||
20.0f, 60.0f, 100.0f, 140.0f, 180.0f, 220.0f, 260.0f, 300.0f,
|
||||
340.0f, 380.0f, 420.0f, 460.0f, 500.0f, 540.0f, 580.0f, 620.0f,
|
||||
};
|
||||
|
||||
xyz_t pos;
|
||||
|
||||
pos.x = block_tbl->pos_x + pos_table[idx & 15];
|
||||
pos.z = block_tbl->pos_z + pos_table[(idx >> 4) & 15];
|
||||
pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 1.0f);
|
||||
|
||||
Matrix_translate(pos.x, pos.y, pos.z, 0);
|
||||
Matrix_scale(0.01f, 0.01f, 0.01f, 1);
|
||||
Matrix_get(&(*draw_pos_pp)->mtx);
|
||||
(*draw_pos_pp)->next = draw_start[type] - *data_count;
|
||||
draw_start[type] = *data_count;
|
||||
(*draw_pos_pp)++;
|
||||
(*data_count)++;
|
||||
}
|
||||
}
|
||||
|
||||
static void bPI_classifyitemDataTable(bPI_draw_tbl_c* draw_tbl, mFI_block_tbl_c* block_tbl, u16* draw_start) {
|
||||
bPI_draw_pos_c* draw_pos = draw_tbl->draw_data.draw_pos + 1;
|
||||
mActor_name_t* fg_p = block_tbl->items;
|
||||
mActor_name_t item;
|
||||
u16 data_count = 1;
|
||||
int i;
|
||||
|
||||
Matrix_push();
|
||||
|
||||
for (i = 0; i < UT_TOTAL_NUM; i++, fg_p++) {
|
||||
if (*fg_p >= RSV_POLICE_ITEM_0 && *fg_p < RSV_POLICE_ITEM_END) {
|
||||
item = Save_Get(police_box).keep_items[*fg_p - RSV_POLICE_ITEM_0];
|
||||
|
||||
if (item != EMPTY_NO) {
|
||||
bPI_outPutData(draw_start, &draw_pos, &data_count, mNT_get_itemTableNo(item) - 1, block_tbl, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Matrix_pull();
|
||||
}
|
||||
|
||||
static void bPI_set_draw_tbl(BG_POLICE_ITEM_ACTOR* bg_police_item, bPI_draw_tbl_c* draw_tbl,
|
||||
mFI_block_tbl_c* block_tbl) {
|
||||
bPI_draw_pos_c* draw_pos = draw_tbl->draw_data.draw_pos;
|
||||
u16 draw_start[mNT_ITEM_TYPE_NUM - 1];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(draw_start); i++) {
|
||||
draw_start[i] = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < (UT_TOTAL_NUM + 1); i++, draw_pos++) {
|
||||
draw_pos->next = 256;
|
||||
}
|
||||
|
||||
bPI_classifyitemDataTable(draw_tbl, block_tbl, draw_start);
|
||||
|
||||
{
|
||||
u16* start_idx_p = draw_tbl->draw_data.start_idx;
|
||||
u16* draw_start_p = draw_start;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(draw_start); i++) {
|
||||
*start_idx_p++ = *draw_start_p++;
|
||||
}
|
||||
}
|
||||
|
||||
bg_police_item->draw_tbl.draw_flag = TRUE;
|
||||
}
|
||||
|
||||
static void bPI_chg_draw_tbl(BG_POLICE_ITEM_ACTOR* bg_police_item) {
|
||||
int i;
|
||||
int j;
|
||||
|
||||
/* Why did they leave it in a loop lol... */
|
||||
for (i = 0; i < mFM_VISIBLE_BLOCK_NUM; i++) {
|
||||
bg_police_item->draw_tbl.draw_flag = FALSE;
|
||||
}
|
||||
|
||||
for (i = bg_police_item->item_tbl.count, j = 0; i != 0; i--) {
|
||||
bPI_set_draw_tbl(bg_police_item, &bg_police_item->draw_tbl, &bg_police_item->item_tbl.block_info_tbl[j]);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
static void bPI_renew_draw_and_crs_data(BG_POLICE_ITEM_ACTOR* bg_police_item, GAME_PLAY* play) {
|
||||
PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play);
|
||||
|
||||
if (player != NULL) {
|
||||
mFI_GetItemTable(&bg_police_item->item_tbl, player->actor_class.world.position, __FILE__, 182);
|
||||
}
|
||||
|
||||
bPI_chg_draw_tbl(bg_police_item);
|
||||
}
|
||||
|
||||
static void bPI_actor_move(ACTOR* actorx, GAME* game) {
|
||||
BG_POLICE_ITEM_ACTOR* bg_police_item = (BG_POLICE_ITEM_ACTOR*)actorx;
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
|
||||
if (mFI_FGisUpDate() == TRUE || mFI_ItemisBorn() == TRUE) {
|
||||
bPI_renew_draw_and_crs_data(bg_police_item, play);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
#include "bg_post_item.h"
|
||||
|
||||
#include "m_name_table.h"
|
||||
#include "m_post_office.h"
|
||||
#include "m_rcp.h"
|
||||
#include "sys_matrix.h"
|
||||
#include "m_common_data.h"
|
||||
|
||||
typedef struct bg_post_item_s {
|
||||
ACTOR actor_class;
|
||||
u8 keep_mail_sum;
|
||||
u8 update_mail_flag;
|
||||
} BG_POST_ITEM_ACTOR;
|
||||
|
||||
static void bPTI_actor_ct(ACTOR* actorx, GAME* game);
|
||||
static void bPTI_actor_draw(ACTOR* actorx, GAME* game);
|
||||
|
||||
ACTOR_PROFILE BgPostItem_Profile = {
|
||||
mAc_PROFILE_BGPOSTITEM,
|
||||
ACTOR_PART_ITEM,
|
||||
ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED,
|
||||
EMPTY_NO,
|
||||
ACTOR_OBJ_BANK_KEEP,
|
||||
sizeof(BG_POST_ITEM_ACTOR),
|
||||
&bPTI_actor_ct,
|
||||
mActor_NONE_PROC1,
|
||||
mActor_NONE_PROC1,
|
||||
&bPTI_actor_draw,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static void bPTI_actor_ct(ACTOR* actorx, GAME* game) {
|
||||
BG_POST_ITEM_ACTOR* bg_post_item = (BG_POST_ITEM_ACTOR*)actorx;
|
||||
int post_girl_type;
|
||||
|
||||
if (Common_Get(time.now_sec) >= (19 * mTM_SECONDS_IN_HOUR) ||
|
||||
Common_Get(time.now_sec) < (7 * mTM_SECONDS_IN_HOUR)) {
|
||||
post_girl_type = 1;
|
||||
} else {
|
||||
post_girl_type = 0;
|
||||
}
|
||||
|
||||
Common_Set(post_girl_npc_type, post_girl_type);
|
||||
bg_post_item->update_mail_flag = TRUE;
|
||||
}
|
||||
|
||||
extern Gfx obj_letterT_mat_model[];
|
||||
extern Gfx obj_letterT_gfx_model[];
|
||||
|
||||
static void bPTI_actor_draw(ACTOR* actorx, GAME* game) {
|
||||
static float setX[mPO_MAIL_STORAGE_SIZE] = { 80.0f, 120.0f, 160.0f, 200.0f, 240.0f };
|
||||
BG_POST_ITEM_ACTOR* bg_post_item = (BG_POST_ITEM_ACTOR*)actorx;
|
||||
int keep_mail_sum;
|
||||
|
||||
if (bg_post_item->update_mail_flag == TRUE) {
|
||||
bg_post_item->keep_mail_sum = mPO_get_keep_mail_sum();
|
||||
bg_post_item->update_mail_flag = FALSE;
|
||||
}
|
||||
|
||||
keep_mail_sum = bg_post_item->keep_mail_sum;
|
||||
if (keep_mail_sum > 0) {
|
||||
GRAPH* graph = game->graph;
|
||||
f32* setX_p = setX;
|
||||
Gfx* gfx;
|
||||
|
||||
_texture_z_light_fog_prim(graph);
|
||||
|
||||
OPEN_DISP(graph);
|
||||
gfx = NOW_POLY_OPA_DISP;
|
||||
|
||||
gSPDisplayList(gfx++, obj_letterT_mat_model);
|
||||
for (keep_mail_sum; keep_mail_sum != 0; keep_mail_sum--) {
|
||||
Matrix_translate(*setX_p, 60.0f, 60.0f, 0);
|
||||
Matrix_scale(0.01f, 0.01f, 0.01f, 1);
|
||||
|
||||
gDPPipeSync(gfx++);
|
||||
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(gfx++, obj_letterT_gfx_model);
|
||||
setX_p++;
|
||||
}
|
||||
|
||||
SET_POLY_OPA_DISP(gfx);
|
||||
CLOSE_DISP(graph);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user