/** * 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, // dItem_HEART_PIECE_e 0x00, // dItem_HEART_CONTAINER_e 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, // dItem_BOMB_BAG_e 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, // dItem_TRIFORCE1_e 0x00, // dItem_TRIFORCE2_e 0x00, // dItem_TRIFORCE3_e 0x00, // dItem_TRIFORCE4_e 0x00, // dItem_TRIFORCE5_e 0x00, // dItem_TRIFORCE6_e 0x00, // dItem_TRIFORCE7_e 0x00, // dItem_TRIFORCE8_e 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, ¤t.pos, &angle); case 1: mpEmitters[1] = dComIfGp_particle_set(0x1F8, ¤t.pos, &angle); case 2: mpEmitters[2] = dComIfGp_particle_set(0x1F9, ¤t.pos, &angle); case 3: mpEmitters[3] = dComIfGp_particle_set(0x1FA, ¤t.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 rot; rot.set(angleX, angleY, 0); mpEmitters[i]->playCreateParticle(); JGeometry::TVec3 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 (m_timer > 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(scale); 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 == dItem_BOMB_BAG_e || m_itemNo == dItem_SKULL_HAMMER_e || m_itemNo == dItem_SMALL_KEY_e) { dDlst_texSpecmapST(&eyePos, &tevStr, 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() { m_timer++; 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 */ 0x0007, /* ListPrio */ fpcPi_CURRENT_e, /* ProcName */ PROC_Demo_Item, /* Proc SubMtd */ &g_fpcLf_Method.base, /* 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, };