Implement & link ac_broker_design

This commit is contained in:
Cuyler36
2024-10-30 23:33:05 -04:00
parent 5cc76898a6
commit 9f76dcb010
4 changed files with 151 additions and 3 deletions
+1 -1
View File
@@ -939,7 +939,7 @@ config.libs = [
Object(Matching, "actor/ac_boxTrick01.c"),
Object(Matching, "actor/ac_br_shop.c"),
Object(Matching, "actor/ac_bridge_a.c"),
Object(NonMatching, "actor/ac_broker_design.c"),
Object(Matching, "actor/ac_broker_design.c"),
Object(Matching, "actor/ac_buggy.c"),
Object(NonMatching, "actor/ac_conveni.c"),
Object(Matching, "actor/ac_cottage.c"),
+15 -1
View File
@@ -8,6 +8,21 @@
extern "C" {
#endif
typedef mActor_name_t (*aBD_GET_NO_PROC)(int ux, int uz);
typedef int (*aBD_REPORT_SALES_PROC)(int ux, int uz);
typedef struct broker_design_clip_s {
aBD_GET_NO_PROC get_no_proc;
aBD_REPORT_SALES_PROC report_sales_proc;
} aBD_clip_c;
typedef struct broker_design_actor_s BROKER_DESIGN_ACTOR;
struct broker_design_actor_s {
ACTOR actor_class;
aBD_clip_c clip;
};
extern ACTOR_PROFILE Broker_Design_Profile;
#ifdef __cplusplus
@@ -15,4 +30,3 @@ extern ACTOR_PROFILE Broker_Design_Profile;
#endif
#endif
+2 -1
View File
@@ -29,6 +29,7 @@
#include "ac_htable.h"
#include "ac_sign.h"
#include "ac_boxTrick01.h"
#include "ac_broker_design.h"
#ifdef __cplusplus
extern "C" {
@@ -69,7 +70,7 @@ typedef struct clip_s {
/* 0x08C */ aSTR_Clip_c* structure_clip;
/* 0x090 */ eEC_EffectControl_Clip_c* effect_clip;
/* 0x094 */ aTOL_Clip_c* tools_clip;
/* 0x098 */ void* _098;
/* 0x098 */ aBD_clip_c* broker_design_clip;
/* 0x09C */ aMI_Clip_c* my_indoor_clip;
/* 0x0A0 */ mDemo_Clip_c* demo_clip; /* can be multiple clip classes */
/* 0x0A4 */ mDemo_Clip_c* demo_clip2; /* can be multiple clip classes */
+133
View File
@@ -0,0 +1,133 @@
#include "ac_broker_design.h"
#include "m_common_data.h"
static void Broker_Design_Actor_ct(ACTOR* actorx, GAME* game);
static void Broker_Design_Actor_dt(ACTOR* actorx, GAME* game);
static void Broker_Design_Actor_move(ACTOR* actorx, GAME* game);
static void Broker_Design_Actor_draw(ACTOR* actorx, GAME* game);
static mActor_name_t aBD_UnitNo2FtrNo(int ux, int uz);
static int aBD_ReportFtrSales(int ux, int uz);
// clang-format off
ACTOR_PROFILE Broker_Design_Profile = {
mAc_PROFILE_BROKER_DESIGN,
ACTOR_PART_BG,
ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED,
EMPTY_NO,
ACTOR_OBJ_BANK_KEEP,
sizeof(BROKER_DESIGN_ACTOR),
&Broker_Design_Actor_ct,
&Broker_Design_Actor_dt,
&Broker_Design_Actor_move,
&Broker_Design_Actor_draw,
NULL,
};
// clang-format on
typedef struct broker_set_data_s {
int ux;
int uz;
} aBD_set_data_c;
static void aBD_SetFurnitureFg(ACTOR* actorx) {
mActor_name_t* item_p = Save_Get(event_save_data).special.event.broker.items;
int i;
mActor_name_t* fg_p = mFI_BkNumtoUtFGTop(0, 0);
static aBD_set_data_c set_data[] = { { 2, 2 }, { 4, 2 }, { 2, 4 } };
for (i = 0; i < 3; i++) {
// nothing
}
for (i = 0; i < 3; i++) {
int ut;
ut = set_data[i].ux + set_data[i].uz * UT_X_NUM;
if (item_p[i] == EMPTY_NO) {
fg_p[ut] = RSV_SHOP_SOLD_FTR;
} else if (ITEM_IS_FTR(item_p[i])) {
fg_p[ut] = item_p[i];
}
}
}
static void Broker_Design_Actor_ct(ACTOR* actorx, GAME* game) {
BROKER_DESIGN_ACTOR* broker_design = (BROKER_DESIGN_ACTOR*)actorx;
if (mEv_CheckEvent(mEv_SPNPC_BROKER)) {
aBD_SetFurnitureFg(actorx);
}
broker_design->clip.get_no_proc = &aBD_UnitNo2FtrNo;
broker_design->clip.report_sales_proc = &aBD_ReportFtrSales;
CLIP(broker_design_clip) = &broker_design->clip;
}
static void Broker_Design_Actor_dt(ACTOR* actorx, GAME* game) {
CLIP(broker_design_clip) = NULL;
}
static void Broker_Design_Actor_draw(ACTOR* actorx, GAME* game) {
// nothing
}
static void Broker_Design_Actor_move(ACTOR* actorx, GAME* game) {
// nothing
}
static mActor_name_t aBD_UnitNo2FtrNo(int ux, int uz) {
int bx;
int bz;
int block_ux;
int block_uz;
mActor_name_t ftr;
bx = ux / UT_X_NUM;
bz = uz / UT_Z_NUM;
block_ux = ux - bx * UT_X_NUM;
block_uz = uz - bz * UT_Z_NUM;
if (aMR_CLIP != NULL) {
if (aMR_CLIP->unitNum2ftrItemNoftrId_proc(&ftr, NULL, block_ux, block_uz, mCoBG_LAYER0) && ITEM_IS_FTR(ftr)) {
return ftr;
}
}
return RSV_NO;
}
static int aBD_ReportFtrSales(int ux, int uz) {
mActor_name_t ftr = aBD_UnitNo2FtrNo(ux, uz);
if (ITEM_IS_FTR(ftr) && aMR_CLIP != NULL) {
mActor_name_t sold_ftr;
int sold_ftrID;
mActor_name_t* fg_p;
int local_ux;
int local_uz;
int local_ut;
fg_p = mFI_BkNumtoUtFGTop(0, 0);
local_ux = ux & 0xF;
local_uz = uz & 0xF;
local_ut = local_ux + local_uz * UT_X_NUM;
if (aMR_CLIP->unitNum2ftrItemNoftrId_proc(&sold_ftr, &sold_ftrID, ux, uz, mCoBG_LAYER0)) {
int i;
mActor_name_t* ftr_p = Save_Get(event_save_data).special.event.broker.items;
aMR_CLIP->ftrId2extinguishFtr_proc(sold_ftrID);
fg_p[local_ut] = RSV_SHOP_SOLD_FTR;
for (i = 0; i < 3; i++) {
if (ftr == ftr_p[i]) {
ftr_p[i] = EMPTY_NO;
return TRUE;
}
}
}
}
return FALSE;
}