summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp')
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp150
1 files changed, 149 insertions, 1 deletions
diff --git a/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp b/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
index 613754d1a..34c8aef87 100644
--- a/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
+++ b/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
@@ -4,7 +4,9 @@
#include "2s2h/CustomItem/CustomItem.h"
#include "2s2h/Rando/Rando.h"
#include "2s2h/ShipInit.hpp"
+#include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h"
#include "assets/2s2h_assets.h"
+#include "assets/overlays/ovl_Obj_Grass/ovl_Obj_Grass.h"
extern "C" {
#include "variables.h"
@@ -12,7 +14,7 @@ extern "C" {
#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h"
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
-void ObjGrass_Draw(Actor* actor, PlayState* play);
+void ObjGrass_OverrideMatrixCurrent(MtxF* matrix);
}
// clang-format off
@@ -981,6 +983,8 @@ std::map<int16_t, std::map<std::pair<float, float>, RandoCheckId>> grottoGrassMa
};
// clang-format on
+#define ENKUSA_RC (actor->home.rot.x)
+
float roundToWholeNumber(float value) {
int rounded = std::round(value);
float fnum = static_cast<float>(rounded);
@@ -1034,7 +1038,151 @@ void SpawnGrassDrop(Vec3f pos, RandoCheckId randoCheckId) {
});
}
+void EnKusaBush_RandoDraw(Actor* actor, PlayState* play) {
+ if (!CVarGetInteger("gRando.CSMC", 0)) {
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushDL);
+ return;
+ }
+
+ RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[ENKUSA_RC].randoItemId, (RandoCheckId)ENKUSA_RC);
+ RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType;
+
+ switch (randoItemType) {
+ case RITYPE_BOSS_KEY:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushBossKeyDL);
+ break;
+ case RITYPE_HEALTH:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushHeartDL);
+ break;
+ case RITYPE_LESSER:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushMinorDL);
+ break;
+ case RITYPE_MAJOR:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushMajorDL);
+ break;
+ case RITYPE_MASK:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushMaskDL);
+ break;
+ case RITYPE_SKULLTULA_TOKEN:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushTokenDL);
+ break;
+ case RITYPE_SMALL_KEY:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushSmallKeyDL);
+ break;
+ case RITYPE_STRAY_FAIRY:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushFairyDL);
+ break;
+ case RITYPE_JUNK:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushJunkDL);
+ break;
+ default:
+ Gfx_DrawDListOpa(play, (Gfx*)gRandoBushDL);
+ break;
+ }
+}
+
+Gfx* GetObjGrassDList(RandoCheckId randoCheckId) {
+ if (!CVarGetInteger("gRando.CSMC", 0)) {
+ return (Gfx*)gRandoBushDL;
+ }
+
+ RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId);
+ RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType;
+
+ switch (randoItemType) {
+ case RITYPE_BOSS_KEY:
+ return (Gfx*)gRandoBushBossKeyDL;
+ break;
+ case RITYPE_HEALTH:
+ return (Gfx*)gRandoBushHeartDL;
+ break;
+ case RITYPE_LESSER:
+ return (Gfx*)gRandoBushMinorDL;
+ break;
+ case RITYPE_MAJOR:
+ return (Gfx*)gRandoBushMajorDL;
+ break;
+ case RITYPE_MASK:
+ return (Gfx*)gRandoBushMaskDL;
+ break;
+ case RITYPE_SKULLTULA_TOKEN:
+ return (Gfx*)gRandoBushTokenDL;
+ break;
+ case RITYPE_SMALL_KEY:
+ return (Gfx*)gRandoBushSmallKeyDL;
+ break;
+ case RITYPE_STRAY_FAIRY:
+ return (Gfx*)gRandoBushFairyDL;
+ break;
+ case RITYPE_JUNK:
+ return (Gfx*)gRandoBushJunkDL;
+ break;
+ default:
+ return (Gfx*)gRandoBushDL;
+ break;
+ }
+}
+
+void ObjGrass_RandoDraw(ObjGrass* objGrass, ObjGrassElement* grassElem, s32 j, RandoCheckId randoCheckId) {
+ Vec3s rot = { 0, 0, 0 };
+ OPEN_DISPS(gPlayState->state.gfxCtx);
+ rot.y = grassElem->rotY;
+ Matrix_SetTranslateRotateYXZ(grassElem->pos.x, grassElem->pos.y, grassElem->pos.z, &rot);
+ Matrix_Scale(objGrass->actor.scale.x, objGrass->actor.scale.y, objGrass->actor.scale.z, MTXMODE_APPLY);
+ if (grassElem->flags & OBJ_GRASS_ELEM_ANIM) {
+ ObjGrass_OverrideMatrixCurrent(&objGrass->distortionMtx[j]);
+ }
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, GetObjGrassDList(randoCheckId));
+ gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gObjGrass_D_809AA9F0);
+ CLOSE_DISPS(gPlayState->state.gfxCtx);
+}
+
void Rando::ActorBehavior::InitObjGrassBehavior() {
+ COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA, IS_RANDO, [](Actor* actor) {
+ RandoCheckId randoCheckId = IdentifyGrass(actor->home.pos);
+ if (randoCheckId == RC_UNKNOWN) {
+ return;
+ }
+
+ if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) {
+ return;
+ }
+
+ ENKUSA_RC = randoCheckId;
+ });
+
+ COND_VB_SHOULD(VB_KUSA_BUSH_DRAW_BE_OVERRIDDEN, IS_RANDO, {
+ Actor* actor = va_arg(args, Actor*);
+ if (ENKUSA_RC != RC_UNKNOWN) {
+ *should = false;
+ actor->draw = EnKusaBush_RandoDraw;
+ }
+ });
+
+ COND_VB_SHOULD(VB_OBJGRASS_DRAW_BE_OVERRIDDEN, IS_RANDO, {
+ ObjGrass* objGrass = va_arg(args, ObjGrass*);
+ ObjGrassElement* grassElem = va_arg(args, ObjGrassElement*);
+ s32 j = va_arg(args, s32);
+ RandoCheckId randoCheckId = IdentifyGrass(grassElem->pos);
+ if (randoCheckId != RC_UNKNOWN) {
+ *should = false;
+ ObjGrass_RandoDraw(objGrass, grassElem, j, randoCheckId);
+ }
+ });
+
+ COND_VB_SHOULD(VB_CARRY_GRASS_DRAW_BE_OVERRIDDEN, IS_RANDO, {
+ ObjGrassCarry* grassCarryActor = va_arg(args, ObjGrassCarry*);
+ Actor* actor = &grassCarryActor->actor;
+ RandoCheckId randoCheckId = IdentifyGrass(grassCarryActor->grassElem->pos);
+ ENKUSA_RC = randoCheckId;
+ if (randoCheckId != RC_UNKNOWN) {
+ *should = false;
+ grassCarryActor->actor.draw = EnKusaBush_RandoDraw;
+ }
+ });
+
COND_VB_SHOULD(VB_GRASS_DROP_COLLECTIBLE, IS_RANDO, {
auto actorId = static_cast<ActorId>(va_arg(args, int32_t));
ObjGrassElement* grassElemActor;