Files
tww/src/d/actor/d_a_demo_item.cpp
T
2024-02-25 02:05:17 -05:00

558 lines
15 KiB
C++

/**
* d_a_demo_item.cpp
* Item - Cutscene Item
*/
#include "d/actor/d_a_demo_item.h"
#include "d/d_procname.h"
#include "d/d_drawlist.h"
#include "f_op/f_op_actor_mng.h"
#include "f_op/f_op_actor_mng.h"
#include "d/d_com_inf_game.h"
#include "d/d_item_data.h"
#include "d/d_item.h"
#include "m_Do/m_Do_mtx.h"
#include "f_op/f_op_camera.h"
static u8 dummy[0x4C]; // TODO
const int daDitem_c::m_rot_time = 8*30;
u8 daDitem_c::m_effect_type[0x100] = {
0x04, // dItem_HEART_e
0x03, // dItem_GREEN_RUPEE_e
0x03, // dItem_BLUE_RUPEE_e
0x03, // dItem_YELLOW_RUPEE_e
0x03, // dItem_RED_RUPEE_e
0x03, // dItem_PURPLE_RUPEE_e
0x03, // dItem_ORANGE_RUPEE_e
0x00, // KAKERA_HEART
0x00, // UTUWA_HEART
0x04, // S_MAGIC
0x04, // L_MAGIC
0x04, // BOMB_5
0x04, // BOMB_10
0x04, // BOMB_20
0x04, // BOMB_30
0x03, // dItem_SILVER_RUPEE_e
0x04, // ARROW_10
0x04, // ARROW_20
0x04, // ARROW_30
0x04, // noentry19
0x04, // noentry20
0x02, // dItem_SMALL_KEY_e
0x04, // RECOVER_FAIRY
0x04, // noentry23
0x04, // noentry24
0x04, // noentry25
0x03, // SUB_DUN_RUPEE
0x04, // noentry27
0x04, // noentry28
0x04, // noentry29
0x04, // dItem_TRIPLE_HEART_e
0x01, // dItem_JOY_PENDANT_e
0x00, // dItem_TELESCOPE_e
0x00, // dItem_TINGLE_TUNER_e
0x00, // dItem_WIND_WAKER_e
0x00, // CAMERA
0x00, // EMONO_BAG
0x00, // dItem_GRAPPLING_HOOK_e
0x00, // CAMERA2
0x00, // dItem_BOW_e
0x00, // PWR_GROOVE
0x00, // dItem_IRON_BOOTS_e
0x00, // dItem_MAGIC_ARMOR_e
0x04, // WATER_BOOTS
0x00, // ESA_BAG
0x00, // dItem_BOOMERANG_e
0x04, // BARE_HAND
0x00, // dItem_HOOKSHOT_e
0x00, // dItem_DELIVERY_BAG_e
0x00, // BOMB_BAG
0x03, // dItem_FUKU_e
0x00, // dItem_SKULL_HAMMER_e
0x00, // dItem_DEKU_LEAF_e
0x00, // dItem_MAGIC_ARROW_e
0x00, // dItem_LIGHT_ARROW_e
0x04, // dItem_NEW_FUKU_e
0x00, // SWORD
0x00, // MASTER_SWORD
0x04, // LV3_SWORD
0x00, // SHIELD
0x00, // MIRROR_SHIELD
0x00, // DROPPED_SWORD
0x04, // MASTER_SWORD_EX
0x01, // KAKERA_HEART2
0x04, // noentry64
0x04, // noentry65
0x00, // PIRATES_OMAMORI
0x00, // HEROS_OMAMORI
0x04, // GRASS_BALL
0x01, // SKULL_NECKLACE
0x01, // BOKOBABA_SEED
0x01, // GOLDEN_FEATHER
0x01, // BOKO_BELT
0x01, // RED_JELLY
0x01, // GREEN_JELLY
0x01, // BLUE_JELLY
0x01, // dItem_MAP_e
0x01, // dItem_COMPASS_e
0x00, // dItem_BOSS_KEY_e
0x04, // EMPTY_BSHIP
0x00, // EMPTY_BOTTLE
0x02, // RED_BOTTLE
0x02, // GREEN_BOTTLE
0x02, // BLUE_BOTTLE
0x00, // dItem_HALF_SOUP_BOTTLE_e
0x00, // dItem_SOUP_BOTTLE_e
0x02, // BIN_IN_WATER
0x02, // FAIRY_BOTTLE
0x00, // FIREFLY_BOTTLE
0x02, // FWATER_BOTTLE
0x04, // UNK_BOTTLE_5A
0x04, // UNK_BOTTLE_5B
0x04, // UNK_BOTTLE_5C
0x04, // UNK_BOTTLE_5D
0x04, // UNK_BOTTLE_5E
0x04, // UNK_BOTTLE_5F
0x04, // UNK_BOTTLE_60
0x00, // TRIFORCE1
0x00, // TRIFORCE2
0x00, // TRIFORCE3
0x00, // TRIFORCE4
0x00, // TRIFORCE5
0x00, // TRIFORCE6
0x00, // TRIFORCE7
0x00, // TRIFORCE8
0x00, // dItem_PEARL_NAYRU_e
0x00, // dItem_PEARL_DIN_e
0x00, // dItem_PEARL_FARORE_e
0x04, // KNOWLEDGE_TF
0x04, // TACT_SONG1
0x04, // TACT_SONG2
0x04, // TACT_SONG3
0x04, // TACT_SONG4
0x04, // TACT_SONG5
0x04, // TACT_SONG6
0x04, // noentry115
0x04, // noentry116
0x04, // noentry117
0x04, // noentry118
0x04, // noentry119
0x00, // NORMAL_SAIL
0x00, // TRIFORCE_MAP1
0x00, // TRIFORCE_MAP2
0x00, // TRIFORCE_MAP3
0x00, // TRIFORCE_MAP4
0x00, // TRIFORCE_MAP5
0x00, // TRIFORCE_MAP6
0x00, // TRIFORCE_MAP7
0x00, // TRIFORCE_MAP8
0x04, // noentry129
0x02, // BIRD_ESA_5
0x02, // dItem_HYOI_PEAR_e
0x04, // ESA1
0x04, // ESA2
0x04, // ESA3
0x04, // ESA4
0x04, // ESA5
0x04, // MAGIC_BEAN
0x04, // BIRD_ESA_10
0x04, // noentry139
0x02, // FLOWER_1
0x02, // FLOWER_2
0x02, // FLOWER_3
0x02, // HEROS_FLAG
0x02, // TAIRYO_FLAG
0x02, // SALES_FLAG
0x02, // WIND_FLAG
0x02, // RED_FLAG
0x02, // FOSSIL_HEAD
0x02, // WATER_STATUE
0x02, // POSTMAN_STATUE
0x02, // PRESIDENT_STATUE
0x02, // dItem_FATHER_LETTER_e
0x02, // dItem_NOTE_TO_MOM_e
0x02, // MAGYS_LETTER
0x02, // MO_LETTER
0x00, // COTTAGE_PAPER
0x02, // KAISEN_PRESENT1
0x02, // KAISEN_PRESENT2
0x00, // SALVAGE_ITEM1
0x04, // SALVAGE_ITEM2
0x04, // SALVAGE_ITEM3
0x04, // XXX_039
0x00, // TINGLE_STATUE1
0x00, // TINGLE_STATUE2
0x00, // TINGLE_STATUE3
0x00, // TINGLE_STATUE4
0x00, // TINGLE_STATUE5
0x00, // TINGLE_STATUE6
0x04, // noentry169
0x04, // dItem_HURRICANE_SPIN_e
0x00, // MAX_RUPEE_UP1
0x00, // MAX_RUPEE_UP2
0x00, // MAX_BOMB_UP1
0x00, // MAX_BOMB_UP2
0x00, // MAX_ARROW_UP1
0x00, // MAX_ARROW_UP2
0x04, // MAGIC_POWER
0x04, // MAX_MP_UP1
0x03, // TINCLE_RUPEE1
0x03, // TINCLE_RUPEE2
0x03, // TINCLE_RUPEE3
0x03, // TINCLE_RUPEE4
0x03, // TINCLE_RUPEE5
0x03, // TINCLE_RUPEE6
0x04, // LITHOGRAPH1
0x04, // LITHOGRAPH2
0x04, // LITHOGRAPH3
0x04, // LITHOGRAPH4
0x04, // LITHOGRAPH5
0x04, // LITHOGRAPH6
0x04, // COLLECT_MAP_64
0x04, // COLLECT_MAP_63
0x04, // COLLECT_MAP_62
0x00, // COLLECT_MAP_61
0x00, // COLLECT_MAP_60
0x00, // COLLECT_MAP_59
0x00, // COLLECT_MAP_58
0x00, // COLLECT_MAP_57
0x00, // COLLECT_MAP_56
0x00, // COLLECT_MAP_55
0x00, // COLLECT_MAP_54
0x00, // COLLECT_MAP_53
0x00, // COLLECT_MAP_52
0x00, // COLLECT_MAP_51
0x00, // COLLECT_MAP_50
0x00, // COLLECT_MAP_49
0x00, // COLLECT_MAP_48
0x00, // COLLECT_MAP_47
0x00, // COLLECT_MAP_46
0x00, // COLLECT_MAP_45
0x00, // COLLECT_MAP_44
0x00, // COLLECT_MAP_43
0x00, // COLLECT_MAP_42
0x00, // COLLECT_MAP_41
0x00, // COLLECT_MAP_40
0x00, // COLLECT_MAP_39
0x00, // COLLECT_MAP_38
0x00, // COLLECT_MAP_37
0x00, // COLLECT_MAP_36
0x00, // COLLECT_MAP_35
0x00, // COLLECT_MAP_34
0x00, // COLLECT_MAP_33
0x00, // COLLECT_MAP_32
0x00, // COLLECT_MAP_31
0x00, // COLLECT_MAP_30
0x00, // COLLECT_MAP_29
0x00, // COLLECT_MAP_28
0x00, // COLLECT_MAP_27
0x00, // COLLECT_MAP_26
0x00, // COLLECT_MAP_25
0x00, // COLLECT_MAP_24
0x00, // COLLECT_MAP_23
0x00, // COLLECT_MAP_22
0x00, // COLLECT_MAP_21
0x00, // COLLECT_MAP_20
0x00, // COLLECT_MAP_19
0x00, // COLLECT_MAP_18
0x00, // COLLECT_MAP_17
0x00, // COLLECT_MAP_16
0x00, // COLLECT_MAP_15
0x00, // COLLECT_MAP_14
0x00, // COLLECT_MAP_13
0x00, // COLLECT_MAP_12
0x00, // COLLECT_MAP_11
0x00, // COLLECT_MAP_10
0x00, // COLLECT_MAP_09
0x00, // COLLECT_MAP_08
0x00, // COLLECT_MAP_07
0x00, // COLLECT_MAP_06
0x00, // COLLECT_MAP_05
0x00, // COLLECT_MAP_04
0x00, // COLLECT_MAP_03
0x00, // COLLECT_MAP_02
0x00, // COLLECT_MAP_01
0x04, // dItem_NONE_e
};
/* 000000EC-00000320 .text setParticle__9daDitem_cFv */
void daDitem_c::setParticle() {
cXyz unused_scale(1.0f, 1.0f, 1.0f);
cXyz unused_pos(current.pos);
if (mpEmitters[0] || mpEmitters[1] || mpEmitters[2] || mpEmitters[3]) {
return;
}
if (chkArgFlag(0x02) || chkArgFlag(0x04) || chkArgFlag(0x08)) {
return;
}
csXyz angle;
angle.x = dCam_getAngleX(dComIfGp_getCamera(0)) - 0x2000;
angle.y = dCam_getAngleY(dComIfGp_getCamera(0));
angle.z = 0;
switch (m_effect_type[m_itemNo]) {
case 0:
mpEmitters[0] = dComIfGp_particle_set(0x1F7, &current.pos, &angle);
case 1:
mpEmitters[1] = dComIfGp_particle_set(0x1F8, &current.pos, &angle);
case 2:
mpEmitters[2] = dComIfGp_particle_set(0x1F9, &current.pos, &angle);
case 3:
mpEmitters[3] = dComIfGp_particle_set(0x1FA, &current.pos, &angle);
case 4:
break;
}
}
/* 0000035C-000003F0 .text CreateInit__9daDitem_cFv */
bool daDitem_c::CreateInit() {
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
hide();
clrFlag();
mArgFlag = daDitem_prm::getFlag(this);
if (!chkArgFlag(0x02) && !chkArgFlag(0x04) && !chkArgFlag(0x08)) {
current.angle.y = -0x2000;
}
for (int i = 0; i < ARRAY_SIZE(mpEmitters); i++) {
mpEmitters[i] = NULL;
}
return true;
}
/* 000003F0-000004AC .text set_effect__9daDitem_cFv */
void daDitem_c::set_effect() {
s16 angleX = dCam_getAngleX(dComIfGp_getCamera(0)) - 0x2000;
s16 angleY = dCam_getAngleY(dComIfGp_getCamera(0));
for (int i = 0; i < (int)ARRAY_SIZE(mpEmitters); i++) {
if (mpEmitters[i] == NULL) {
continue;
}
JGeometry::TVec3<s16> rot;
rot.set(angleX, angleY, 0);
mpEmitters[i]->playCreateParticle();
JGeometry::TVec3<f32> pos;
pos.set(current.pos);
mpEmitters[i]->setGlobalTranslation(pos);
mpEmitters[i]->setGlobalRotation(rot);
}
}
/* 000004AC-000006E4 .text set_pos__9daDitem_cFv */
void daDitem_c::set_pos() {
static cXyz offset_tbl[3] = {
cXyz(0.0f, 130.0f, 0.0f),
cXyz(0.0f, 90.0f, 50.0f),
cXyz(30.0f, 140.0f, 20.0f),
};
cXyz pos;
cXyz offset;
if (chkArgFlag(0x02)) {
offset = offset_tbl[1];
} else if (chkArgFlag(0x04)) {
offset = offset_tbl[2];
} else if (chkArgFlag(0x08)) {
offset = mOffsetPos;
} else {
offset = offset_tbl[0];
}
if (!chkArgFlag(0x08)) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
mDoMtx_stack_c::ZXYrotS(player->current.angle.x, player->shape_angle.y, player->current.angle.z);
mDoMtx_stack_c::multVec(&offset, &offset);
pos = dComIfGp_getPlayer(0)->current.pos;
} else {
pos = home.pos;
}
pos += offset;
current.pos = pos;
}
/* 000006E4-00000760 .text anim_control__9daDitem_cFv */
void daDitem_c::anim_control() {
switch (m_itemNo) {
case EMPTY_BSHIP:
case EMPTY_BOTTLE:
case RED_BOTTLE:
case GREEN_BOTTLE:
case BLUE_BOTTLE:
case dItem_HALF_SOUP_BOTTLE_e:
case dItem_SOUP_BOTTLE_e:
case BIN_IN_WATER:
case FAIRY_BOTTLE:
case FIREFLY_BOTTLE:
case FWATER_BOTTLE:
case UNK_BOTTLE_5A:
case UNK_BOTTLE_5B:
case UNK_BOTTLE_5C:
case UNK_BOTTLE_5D:
case UNK_BOTTLE_5E:
case UNK_BOTTLE_5F:
case UNK_BOTTLE_60:
if (field_0x634 > 30) {
animPlay(1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
}
break;
default:
animPlay(1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
break;
}
}
/* 00000760-00000880 .text set_mtx__9daDitem_cFv */
void daDitem_c::set_mtx() {
mpModel->setBaseScale(mScale);
fopAcM_addAngleY(this, current.angle.y + 0x0111, 0x0111);
if (chkArgFlag(0x02) || chkArgFlag(0x04) || chkArgFlag(0x08)) {
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
} else {
mDoMtx_stack_c::copy(dComIfGd_getInvViewMtx());
mDoMtx_stack_c::ZrotM(current.angle.z);
mDoMtx_stack_c::XrotM(0x12C0);
mDoMtx_stack_c::YrotM(current.angle.y);
mDoMtx_stack_c::now[0][3] = current.pos.x;
mDoMtx_stack_c::now[1][3] = current.pos.y;
mDoMtx_stack_c::now[2][3] = current.pos.z;
}
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
/* 00000880-000008F0 .text settingBeforeDraw__9daDitem_cFv */
void daDitem_c::settingBeforeDraw() {
if (isBomb(m_itemNo) || m_itemNo == BOMB_BAG || m_itemNo == dItem_SKULL_HAMMER_e || m_itemNo == dItem_SMALL_KEY_e) {
dDlst_texSpecmapST(&mEyePos, &mTevStr, mpModel->getModelData(), 1.0f);
}
}
/* 000008F0-000008F4 .text setListStart__9daDitem_cFv */
void daDitem_c::setListStart() {
}
BOOL daDitem_c::Delete() {
if (!chkArgFlag(0x01)) {
execItemGet(m_itemNo);
}
for (int i = 0; i < ARRAY_SIZE(mpEmitters); i++) {
if (mpEmitters[i]) {
mpEmitters[i]->setGlobalAlpha(0);
mpEmitters[i]->becomeInvalidEmitter();
mpEmitters[i] = NULL;
}
}
return DeleteBase(dItem_data::getArcname(m_itemNo));
}
s32 daDitem_c::create() {
fopAcM_SetupActor(this, daDitem_c);
m_itemNo = daDitem_prm::getNo(this);
char* arcName = dItem_data::getArcname(m_itemNo);
if (dItem_data::getBmdIdx(m_itemNo) == -1 || arcName == NULL) {
m_itemNo = dItem_GREEN_RUPEE_e;
}
s32 phase_state = dComIfG_resLoad(&mPhs, dItem_data::getArcname(m_itemNo));
if (phase_state == cPhs_COMPLEATE_e) {
u32 heap_size = dItem_data::getHeapSize(m_itemNo);
if (!fopAcM_entrySolidHeap(this, CheckItemCreateHeap, heap_size)) {
return cPhs_ERROR_e;
}
CreateInit();
}
return phase_state;
}
BOOL daDitem_c::draw() {
return DrawBase();
}
BOOL daDitem_c::execute() {
field_0x634++;
if (chkDraw()) {
setParticle();
set_effect();
fopAcM_onDraw(this);
} else {
fopAcM_offDraw(this);
}
anim_control();
if (chkDead()) {
fopAcM_delete(this);
}
set_pos();
set_mtx();
return TRUE;
}
/* 000008F4-00000994 .text daDitem_Delete__FP9daDitem_c */
static BOOL daDitem_Delete(daDitem_c* i_this) {
return i_this->Delete();
}
/* 00000994-00000B6C .text daDitem_Create__FP9daDitem_c */
static s32 daDitem_Create(daDitem_c* i_this) {
return i_this->create();
}
/* 00000D94-00000DB4 .text daDitem_IsDelete__FP9daDitem_c */
static BOOL daDitem_IsDelete(daDitem_c* i_this) {
return i_this->isdelete();
}
/* 00000DB4-00000E58 .text daDitem_Execute__FP9daDitem_c */
static BOOL daDitem_Execute(daDitem_c* i_this) {
return i_this->execute();
}
/* 00000E58-00000E84 .text daDitem_Draw__FP9daDitem_c */
static BOOL daDitem_Draw(daDitem_c* i_this) {
return i_this->draw();
}
/* 00000E84-00000E8C .text isdelete__9daDitem_cFv */
BOOL daDitem_c::isdelete() {
return TRUE;
}
static actor_method_class l_daDitem_Method = {
(process_method_func)daDitem_Create,
(process_method_func)daDitem_Delete,
(process_method_func)daDitem_Execute,
(process_method_func)daDitem_IsDelete,
(process_method_func)daDitem_Draw,
};
actor_process_profile_definition g_profile_Demo_Item = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 7,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_Demo_Item,
/* Proc SubMtd */ &g_fpcLf_Method.mBase,
/* Size */ sizeof(daDitem_c),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ 0x00FC,
/* Actor SubMtd */ &l_daDitem_Method,
/* Status */ fopAcStts_UNK4000_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* CullType */ fopAc_CULLBOX_0_e,
};