Split into two enhancements

"Blue Fire Arrows" and "Sunlight Arrows"
This commit is contained in:
Sarge-117 2022-08-30 11:06:42 -07:00
parent 12ae59d133
commit 8e2f035278
5 changed files with 27 additions and 24 deletions

View File

@ -2017,10 +2017,13 @@ namespace SohImGui {
"Play unique fanfares when obtaining quest items " "Play unique fanfares when obtaining quest items "
"(medallions/stones/songs). Note that these fanfares are longer than usual." "(medallions/stones/songs). Note that these fanfares are longer than usual."
); );
PaddedEnhancementCheckbox("Enhanced Magic Arrows", "gEnhancedMagicArrows", true, false); PaddedEnhancementCheckbox("Blue Fire Arrows", "gBlueFireArrows", true, false);
Tooltip( Tooltip(
"Allows Ice Arrows to melt red ice and allows Light Arrows " "Allows Ice Arrows to melt red ice and break mud walls"
"to activate Sun Switches." );
PaddedEnhancementCheckbox("Sunlight Arrows", "gSunLightArrows", true, false);
Tooltip(
"Allows Light Arrows to activate Sun Switches"
); );
ImGui::EndMenu(); ImGui::EndMenu();
} }

View File

@ -94,7 +94,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_STOP), ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_STOP),
}; };
bool enhancedIceArrowDC = false; bool blueFireArrowsDC = false;
void BgBreakwall_SetupAction(BgBreakwall* this, BgBreakwallActionFunc actionFunc) { void BgBreakwall_SetupAction(BgBreakwall* this, BgBreakwallActionFunc actionFunc) {
this->actionFunc = actionFunc; this->actionFunc = actionFunc;
@ -105,7 +105,7 @@ void BgBreakwall_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad; s32 pad;
s32 wallType = ((this->dyna.actor.params >> 13) & 3) & 0xFF; s32 wallType = ((this->dyna.actor.params >> 13) & 3) & 0xFF;
enhancedIceArrowDC = (gSaveContext.n64ddFlag && (CVar_GetS32("gEnhancedMagicArrows", 0) != 0)); blueFireArrowsDC = (gSaveContext.n64ddFlag && (CVar_GetS32("gBlueFireArrows", 0) != 0));
Actor_ProcessInitChain(&this->dyna.actor, sInitChain); Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, DPM_UNK); DynaPolyActor_Init(&this->dyna, DPM_UNK);
@ -126,7 +126,7 @@ void BgBreakwall_Init(Actor* thisx, GlobalContext* globalCtx) {
Collider_InitQuad(globalCtx, &this->collider); Collider_InitQuad(globalCtx, &this->collider);
Collider_SetQuad(globalCtx, &this->collider, &this->dyna.actor, &sQuadInit); Collider_SetQuad(globalCtx, &this->collider, &this->dyna.actor, &sQuadInit);
// If "Blue Fire Arrows" are enabled, set up this collider for them // If "Blue Fire Arrows" are enabled, set up this collider for them
if (enhancedIceArrowDC) { if (blueFireArrowsDC) {
Collider_InitQuad(globalCtx, &this->colliderIceArrow); Collider_InitQuad(globalCtx, &this->colliderIceArrow);
Collider_SetQuad(globalCtx, &this->colliderIceArrow, &this->dyna.actor, &sIceArrowQuadInit); Collider_SetQuad(globalCtx, &this->colliderIceArrow, &this->dyna.actor, &sIceArrowQuadInit);
} }
@ -259,7 +259,7 @@ void BgBreakwall_WaitForObject(BgBreakwall* this, GlobalContext* globalCtx) {
void BgBreakwall_Wait(BgBreakwall* this, GlobalContext* globalCtx) { void BgBreakwall_Wait(BgBreakwall* this, GlobalContext* globalCtx) {
bool blueFireArrowHit = false; bool blueFireArrowHit = false;
// If "Blue Fire Arrows" enabled, check this collider for a hit // If "Blue Fire Arrows" enabled, check this collider for a hit
if (enhancedIceArrowDC) { if (blueFireArrowsDC) {
if (this->colliderIceArrow.base.acFlags & AC_HIT) { if (this->colliderIceArrow.base.acFlags & AC_HIT) {
this->colliderIceArrow.base.acFlags &= ~AC_HIT; this->colliderIceArrow.base.acFlags &= ~AC_HIT;
if ((this->colliderIceArrow.base.ac != NULL) && (this->colliderIceArrow.base.ac->id == ACTOR_EN_ARROW)) { if ((this->colliderIceArrow.base.ac != NULL) && (this->colliderIceArrow.base.ac->id == ACTOR_EN_ARROW)) {
@ -358,7 +358,7 @@ void BgBreakwall_Draw(Actor* thisx, GlobalContext* globalCtx) {
Collider_SetQuadVertices(&this->collider, &colQuad[0], &colQuad[1], &colQuad[2], &colQuad[3]); Collider_SetQuadVertices(&this->collider, &colQuad[0], &colQuad[1], &colQuad[2], &colQuad[3]);
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
if (enhancedIceArrowDC) { if (blueFireArrowsDC) {
Collider_SetQuadVertices(&this->colliderIceArrow, &colQuad[0], &colQuad[1], &colQuad[2], &colQuad[3]); Collider_SetQuadVertices(&this->colliderIceArrow, &colQuad[0], &colQuad[1], &colQuad[2], &colQuad[3]);
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->colliderIceArrow.base); CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->colliderIceArrow.base);
} }

View File

@ -95,7 +95,7 @@ static ColliderCylinderInit sIceArrowCylinderInit = {
{ 0, 0, 0, { 0, 0, 0 } }, { 0, 0, 0, { 0, 0, 0 } },
}; };
bool enhancedIceArrow = false; bool blueFireArrows = false;
void func_80890740(BgIceShelter* this, GlobalContext* globalCtx) { void func_80890740(BgIceShelter* this, GlobalContext* globalCtx) {
static s16 cylinderRadii[] = { 47, 33, 44, 41, 100 }; static s16 cylinderRadii[] = { 47, 33, 44, 41, 100 };
@ -103,11 +103,11 @@ void func_80890740(BgIceShelter* this, GlobalContext* globalCtx) {
s32 pad; s32 pad;
s32 type = (this->dyna.actor.params >> 8) & 7; s32 type = (this->dyna.actor.params >> 8) & 7;
enhancedIceArrow = (gSaveContext.n64ddFlag && (CVar_GetS32("gEnhancedMagicArrows", 0) != 0)); blueFireArrows = (gSaveContext.n64ddFlag && (CVar_GetS32("gBlueFireArrows", 0) != 0));
Collider_InitCylinder(globalCtx, &this->cylinder1); Collider_InitCylinder(globalCtx, &this->cylinder1);
// If "Blue Fire Arrows" is enabled, set up a collider on the red ice that responds to them // If "Blue Fire Arrows" is enabled, set up a collider on the red ice that responds to them
if (enhancedIceArrow) { if (blueFireArrows) {
Collider_SetCylinder(globalCtx, &this->cylinder1, &this->dyna.actor, &sIceArrowCylinderInit); Collider_SetCylinder(globalCtx, &this->cylinder1, &this->dyna.actor, &sIceArrowCylinderInit);
} else { } else {
Collider_SetCylinder(globalCtx, &this->cylinder1, &this->dyna.actor, &sCylinder1Init); Collider_SetCylinder(globalCtx, &this->cylinder1, &this->dyna.actor, &sCylinder1Init);
@ -325,7 +325,7 @@ void func_8089107C(BgIceShelter* this, GlobalContext* globalCtx) {
} }
} }
// If we have "Blue Fire Arrows" enabled, check both cylinders for a hit // If we have "Blue Fire Arrows" enabled, check both cylinders for a hit
if (enhancedIceArrow) { if (blueFireArrows) {
CheckIceArrowHit(this, this->cylinder1, type, globalCtx); CheckIceArrowHit(this, this->cylinder1, type, globalCtx);
CheckIceArrowHit(this, this->cylinder2, type, globalCtx); CheckIceArrowHit(this, this->cylinder2, type, globalCtx);
} }

View File

@ -98,7 +98,7 @@ void BgJyaLift_DelayMove(BgJyaLift* this, GlobalContext* globalCtx) {
if (this->moveDelay >= 20) { if (this->moveDelay >= 20) {
// Skip this cutscene if using Enhanced Arrows, since activating the switch while // Skip this cutscene if using Enhanced Arrows, since activating the switch while
// not standing on the platform will cause the cutscene to show the unloaded room // not standing on the platform will cause the cutscene to show the unloaded room
if (!(gSaveContext.n64ddFlag && CVar_GetS32("gEnhancedMagicArrows", 0) != 0)) { if (!(gSaveContext.n64ddFlag && CVar_GetS32("gSunLightArrows", 0) != 0)) {
OnePointCutscene_Init(globalCtx, 3430, -99, &this->dyna.actor, MAIN_CAM); OnePointCutscene_Init(globalCtx, 3430, -99, &this->dyna.actor, MAIN_CAM);
} }
BgJyaLift_SetupMove(this); BgJyaLift_SetupMove(this);

View File

@ -73,7 +73,7 @@ static ColliderJntSphInit sColliderJntSphInit = {
1, 1,
sColliderJntSphElementInit, sColliderJntSphElementInit,
}; };
// Collider info used for "Enhanced Arrows" // Collider info used for "Sunlight Arrows"
static ColliderJntSphElementInit sColliderLightArrowElementInit[] = { static ColliderJntSphElementInit sColliderLightArrowElementInit[] = {
{ {
{ {
@ -87,7 +87,7 @@ static ColliderJntSphElementInit sColliderLightArrowElementInit[] = {
{ 0, { { 0, 0, 0 }, 19 }, 100 }, { 0, { { 0, 0, 0 }, 19 }, 100 },
}, },
}; };
// Sphere collider used for "Enhanced Arrows" // Sphere collider used for "Sunlight Arrows"
static ColliderJntSphInit sColliderLightArrowInit = { static ColliderJntSphInit sColliderLightArrowInit = {
{ {
COLTYPE_NONE, COLTYPE_NONE,
@ -102,7 +102,7 @@ static ColliderJntSphInit sColliderLightArrowInit = {
}; };
bool activatedByLightArrow = false; bool activatedByLightArrow = false;
bool enhancedLightArrow = false; bool sunLightArrows = false;
static CollisionCheckInfoInit sColChkInfoInit = { 0, 12, 60, MASS_IMMOVABLE }; static CollisionCheckInfoInit sColChkInfoInit = { 0, 12, 60, MASS_IMMOVABLE };
@ -121,11 +121,11 @@ static InitChainEntry sInitChain[] = {
void ObjLightswitch_InitCollider(ObjLightswitch* this, GlobalContext* globalCtx) { void ObjLightswitch_InitCollider(ObjLightswitch* this, GlobalContext* globalCtx) {
s32 pad; s32 pad;
enhancedLightArrow = (gSaveContext.n64ddFlag && (CVar_GetS32("gEnhancedMagicArrows", 0) != 0)); sunLightArrows = (gSaveContext.n64ddFlag && (CVar_GetS32("gSunLightArrows", 0) != 0));
Collider_InitJntSph(globalCtx, &this->collider); Collider_InitJntSph(globalCtx, &this->collider);
// If "Enhanced Arrows" is enabled, set up the collider to allow Light Arrow hits // If "Sunlight Arrows" is enabled, set up the collider to allow Light Arrow hits
if (enhancedLightArrow) { if (sunLightArrows) {
Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sColliderLightArrowInit, this->colliderItems); Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sColliderLightArrowInit, this->colliderItems);
} else { } else {
Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sColliderJntSphInit, this->colliderItems); Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sColliderJntSphInit, this->colliderItems);
@ -251,7 +251,7 @@ void ObjLightswitch_Destroy(Actor* thisx, GlobalContext* globalCtx2) {
// vanishing on its own after activating the sun switch by Light Arrow // vanishing on its own after activating the sun switch by Light Arrow
// Also prevents the cobra mirror from rotating to face the sun on its own // Also prevents the cobra mirror from rotating to face the sun on its own
// Makes sun switches temporary when activated by Light Arrows (will turn off on room exit) // Makes sun switches temporary when activated by Light Arrows (will turn off on room exit)
if (activatedByLightArrow && enhancedLightArrow) { if (activatedByLightArrow && sunLightArrows) {
switch (this->actor.params >> 4 & 3) { switch (this->actor.params >> 4 & 3) {
case OBJLIGHTSWITCH_TYPE_STAY_ON: case OBJLIGHTSWITCH_TYPE_STAY_ON:
case OBJLIGHTSWITCH_TYPE_2: case OBJLIGHTSWITCH_TYPE_2:
@ -277,7 +277,7 @@ void ObjLightswitch_SetupOff(ObjLightswitch* this) {
this->color[1] = 125 << 6; this->color[1] = 125 << 6;
this->color[2] = 255 << 6; this->color[2] = 255 << 6;
this->alpha = 255 << 6; this->alpha = 255 << 6;
if (enhancedLightArrow) { if (sunLightArrows) {
activatedByLightArrow = false; activatedByLightArrow = false;
} }
} }
@ -291,7 +291,7 @@ void ObjLightswitch_Off(ObjLightswitch* this, GlobalContext* globalCtx) {
ObjLightswitch_SetSwitchFlag(this, globalCtx); ObjLightswitch_SetSwitchFlag(this, globalCtx);
// Remember if we've been activated by a Light Arrow, so we can // Remember if we've been activated by a Light Arrow, so we can
// prevent the switch from immediately turning back off // prevent the switch from immediately turning back off
if (enhancedLightArrow) { if (sunLightArrows) {
if (this->collider.base.ac != NULL && this->collider.base.ac->id == ACTOR_EN_ARROW) { if (this->collider.base.ac != NULL && this->collider.base.ac->id == ACTOR_EN_ARROW) {
activatedByLightArrow = true; activatedByLightArrow = true;
} }
@ -363,7 +363,7 @@ void ObjLightswitch_On(ObjLightswitch* this, GlobalContext* globalCtx) {
ObjLightswitch_SetupTurnOff(this); ObjLightswitch_SetupTurnOff(this);
} }
// If hit by sunlight after already being turned on, then behave as if originally activated by sunlight // If hit by sunlight after already being turned on, then behave as if originally activated by sunlight
if (enhancedLightArrow && (this->collider.base.acFlags & AC_HIT)) { if (sunLightArrows && (this->collider.base.acFlags & AC_HIT)) {
if (this->collider.base.ac != NULL && this->collider.base.ac->id != ACTOR_EN_ARROW) { if (this->collider.base.ac != NULL && this->collider.base.ac->id != ACTOR_EN_ARROW) {
activatedByLightArrow = false; activatedByLightArrow = false;
} }
@ -377,7 +377,7 @@ void ObjLightswitch_On(ObjLightswitch* this, GlobalContext* globalCtx) {
break; break;
case OBJLIGHTSWITCH_TYPE_2: case OBJLIGHTSWITCH_TYPE_2:
// If hit by sunlight after already being turned on, then behave as if originally activated by sunlight // If hit by sunlight after already being turned on, then behave as if originally activated by sunlight
if (enhancedLightArrow && (this->collider.base.acFlags & AC_HIT)) { if (sunLightArrows && (this->collider.base.acFlags & AC_HIT)) {
if (this->collider.base.ac != NULL && this->collider.base.ac->id != ACTOR_EN_ARROW) { if (this->collider.base.ac != NULL && this->collider.base.ac->id != ACTOR_EN_ARROW) {
activatedByLightArrow = false; activatedByLightArrow = false;
} }