Merge pull request #311 from Cuyler36:bg_item_actors

Implement & link bg_post_item, bg_police_item
This commit is contained in:
Cuyler36
2024-03-19 18:57:52 -04:00
committed by GitHub
7 changed files with 567 additions and 0 deletions
+9
View File
@@ -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]
+33
View File
@@ -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
+50
View File
@@ -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"
+217
View File
@@ -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,
};
+66
View File
@@ -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();
}
}
+107
View File
@@ -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);
}
}
+85
View File
@@ -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);
}
}