mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-04-28 13:17:58 +03:00
Merge branch 'HarbourMasters:develop-blair' into develop-blair
This commit is contained in:
commit
044178d045
13 changed files with 120 additions and 57 deletions
|
@ -18,6 +18,12 @@ static const ALIGN_ASSET(2) char gTitleCopyright19982002Tex[] = dgTitleCopyright
|
|||
#define dgTitleCopyright19982003Tex "__OTR__objects/object_mag/gTitleCopyright19982003Tex"
|
||||
static const ALIGN_ASSET(2) char gTitleCopyright19982003Tex[] = dgTitleCopyright19982003Tex;
|
||||
|
||||
#define dgTitleCopyright19982004EngTex "__OTR__objects/object_mag/gTitleCopyright19982004EngTex"
|
||||
static const ALIGN_ASSET(2) char gTitleCopyright19982004EngTex[] = dgTitleCopyright19982004EngTex;
|
||||
|
||||
#define dgTitleCopyright19982004JpnTex "__OTR__objects/object_mag/gTitleCopyright19982004JpnTex"
|
||||
static const ALIGN_ASSET(2) char gTitleCopyright19982004JpnTex[] = dgTitleCopyright19982004JpnTex;
|
||||
|
||||
#define dgTitleMasterQuestSubtitleTex "__OTR__objects/object_mag/gTitleMasterQuestSubtitleTex"
|
||||
static const ALIGN_ASSET(2) char gTitleMasterQuestSubtitleTex[] = dgTitleMasterQuestSubtitleTex;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Root>
|
||||
<File Name="object_mag" Segment="6">
|
||||
<Texture Name="gTitleZeldaShieldLogoMQTex" OutName="title_zelda_shield_logo_mq" Format="rgba32" Width="160" Height="160" Offset="0x0"/>
|
||||
<Texture Name="gTitleCopyright19982003Tex" OutName="title_copyright_19982003" Format="ia8" Width="160" Height="16" Offset="0x19000"/>
|
||||
<Texture Name="gTitleCopyright19982002Tex" OutName="title_copyright_19982002" Format="ia8" Width="160" Height="16" Offset="0x19000"/>
|
||||
<Texture Name="gTitleEffectMask00Tex" OutName="title_effect_mask_0_0" Format="i4" Width="64" Height="64" Offset="0x1B600"/>
|
||||
<Texture Name="gTitleEffectMask01Tex" OutName="title_effect_mask_0_1" Format="i4" Width="64" Height="64" Offset="0x1BE00"/>
|
||||
<Texture Name="gTitleEffectMask02Tex" OutName="title_effect_mask_0_2" Format="i4" Width="64" Height="64" Offset="0x1C600"/>
|
||||
|
@ -18,4 +18,4 @@
|
|||
<Texture Name="gTitleDiskTex" OutName="title_disk" Format="ia8" Width="48" Height="16" Offset="0x1B300"/>
|
||||
<Texture Name="gTitleTitleJPNTex" OutName="title_title_jpn" Format="i8" Width="128" Height="16" Offset="0x20740"/>
|
||||
</File>
|
||||
</Root>
|
||||
</Root>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Root>
|
||||
<File Name="object_mag" Segment="6">
|
||||
<Texture Name="gTitleZeldaShieldLogoMQTex" OutName="title_zelda_shield_logo_mq" Format="rgba32" Width="160" Height="160" Offset="0x0"/>
|
||||
<Texture Name="gTitleCopyright19982003Tex" OutName="title_copyright_19982003" Format="ia8" Width="160" Height="16" Offset="0x19000"/>
|
||||
<Texture Name="gTitleCopyright19982002Tex" OutName="title_copyright_19982002" Format="ia8" Width="160" Height="16" Offset="0x19000"/>
|
||||
<Texture Name="gTitleDiskTex" OutName="title_disk" Format="ia8" Width="48" Height="16" Offset="0x19A00"/>
|
||||
<Texture Name="gTitleEffectMask00Tex" OutName="title_effect_mask_0_0" Format="i4" Width="64" Height="64" Offset="0x19D00"/>
|
||||
<Texture Name="gTitleEffectMask01Tex" OutName="title_effect_mask_0_1" Format="i4" Width="64" Height="64" Offset="0x1A500"/>
|
||||
|
@ -17,4 +17,4 @@
|
|||
<Texture Name="gTitleOcarinaOfTimeTMTextTex" OutName="title_ocarina_of_time_tm_text" Format="i8" Width="96" Height="8" Offset="0x1EB40"/>
|
||||
<Texture Name="gTitleTitleJPNTex" OutName="title_title_jpn" Format="i8" Width="128" Height="16" Offset="0x1EE40"/>
|
||||
</File>
|
||||
</Root>
|
||||
</Root>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<Root>
|
||||
<File Name="object_mag" Segment="6">
|
||||
<Texture Name="gTitleZeldaShieldLogoMQTex" OutName="title_zelda_shield_logo_mq" Format="rgba32" Width="160" Height="160" Offset="0x0"/>
|
||||
<Texture Name="gTitleCopyright19982002Tex" OutName="title_copyright_19982002" Format="ia8" Width="160" Height="16" Offset="0x19000"/>
|
||||
<Texture Name="gTitleCopyright19982003Tex" OutName="title_copyright_19982003" Format="ia8" Width="160" Height="16" Offset="0x19A00"/>
|
||||
<Texture Name="gTitleCopyright19982004JpnTex" OutName="title_copyright_19982004_jpn" Format="ia8" Width="160" Height="16" Offset="0x19000"/>
|
||||
<Texture Name="gTitleCopyright19982004EngTex" OutName="title_copyright_19982004_eng" Format="ia8" Width="160" Height="16" Offset="0x19A00"/>
|
||||
<Texture Name="gTitleDiskTex" OutName="title_disk" Format="ia8" Width="48" Height="16" Offset="0x1A400"/>
|
||||
<Texture Name="gTitleEffectMask00Tex" OutName="title_effect_mask_0_0" Format="i4" Width="64" Height="64" Offset="0x1A700"/>
|
||||
<Texture Name="gTitleEffectMask01Tex" OutName="title_effect_mask_0_1" Format="i4" Width="64" Height="64" Offset="0x1AF00"/>
|
||||
|
@ -18,4 +18,4 @@
|
|||
<Texture Name="gTitleOcarinaOfTimeTMTextTex" OutName="title_ocarina_of_time_tm_text" Format="i8" Width="96" Height="8" Offset="0x1F540"/>
|
||||
<Texture Name="gTitleTitleJPNTex" OutName="title_title_jpn" Format="i8" Width="128" Height="16" Offset="0x1F840"/>
|
||||
</File>
|
||||
</Root>
|
||||
</Root>
|
||||
|
|
|
@ -946,6 +946,14 @@ typedef enum {
|
|||
// - `*VBFishingData`
|
||||
VB_GIVE_RANDO_FISHING_PRIZE,
|
||||
|
||||
// #### `result`
|
||||
// ```c
|
||||
// false
|
||||
// ```
|
||||
// #### `args`
|
||||
// - '*Fishing' (&this)
|
||||
VB_GIVE_RANDO_GLITCH_FISHING_PRIZE,
|
||||
|
||||
// #### `result`
|
||||
// ```c
|
||||
// true
|
||||
|
|
|
@ -1591,6 +1591,17 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
}
|
||||
break;
|
||||
}
|
||||
case VB_GIVE_RANDO_GLITCH_FISHING_PRIZE: {
|
||||
if (IS_RANDO) {
|
||||
Fishing* fishing = va_arg(args, Fishing*);
|
||||
if (!Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING)) {
|
||||
Flags_SetRandomizerInf(RAND_INF_ADULT_FISHING);
|
||||
}
|
||||
*should = true;
|
||||
fishing->stateAndTimer = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VB_TRADE_TIMER_EYEDROPS: {
|
||||
EnMk* enMk = va_arg(args, EnMk*);
|
||||
Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_LH_TRADE_FROG);
|
||||
|
|
|
@ -50,7 +50,7 @@ void RegionTable_Init_BottomOfTheWell() {
|
|||
LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, true),
|
||||
LOCATION(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, true),
|
||||
LOCATION(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, true),
|
||||
//N64 has no extra check here, but I can't get past without dealing with the spider or taking a hit, they probably assume sticks
|
||||
//You can just barely pass the spider on the right side without damage or items, but it's probably tight enough to count as as a trick
|
||||
LOCATION(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->TakeDamage()),
|
||||
//Not technically behind a wall, but still logically needs lens due to pits
|
||||
LOCATION(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, logic->HasExplosives()),
|
||||
|
@ -160,7 +160,7 @@ void RegionTable_Init_BottomOfTheWell() {
|
|||
}, {
|
||||
//Exits
|
||||
Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}),
|
||||
//It's possible top abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch
|
||||
//It's possible to abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch
|
||||
//the exact range is just past the furthest away plank in the green goo section
|
||||
Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS, []{return Here(RR_BOTTOM_OF_THE_WELL_BASEMENT, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || (logic->CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_BASEMENT));});}),
|
||||
});
|
||||
|
|
|
@ -14,18 +14,19 @@ void RegionTable_Init_Market() {
|
|||
|
||||
areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()),
|
||||
LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()),
|
||||
LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()),
|
||||
//RANDOTODO add item avalibility to regions to remove need to hardcode logic in limited item use situations
|
||||
LOCATION(RC_MARKET_GRASS_1, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_2, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_3, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_4, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_5, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_6, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_7, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MARKET_GRASS_8, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))),
|
||||
LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild /*&& logic->CanRoll()*/),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_MARKET_ENTRANCE, []{return true;}),
|
||||
|
|
|
@ -558,9 +558,8 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
}
|
||||
return killed;
|
||||
case RE_DODONGO:
|
||||
return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() ||
|
||||
CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW);
|
||||
return CanUseSword() || CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) ||
|
||||
HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW);
|
||||
case RE_LIZALFOS:
|
||||
return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW);
|
||||
case RE_KEESE:
|
||||
|
@ -604,11 +603,9 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
(CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield()));
|
||||
case RE_DEAD_HAND:
|
||||
// RANDOTODO change Dead Hand trick to be sticks Dead Hand
|
||||
return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
(CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND));
|
||||
return CanUseSword() || (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND));
|
||||
case RE_WITHERED_DEKU_BABA:
|
||||
return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
CanUse(RG_BOOMERANG);
|
||||
return CanUseSword() || CanUse(RG_BOOMERANG);
|
||||
case RE_LIKE_LIKE:
|
||||
case RE_FLOORMASTER:
|
||||
return CanDamage();
|
||||
|
@ -645,8 +642,7 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
// bow and sling can wake them and damage after they shed their armour, so could reduce ammo requirements for
|
||||
// explosives to 10. requires 8 sticks to kill so would be a trick unless we apply higher stick bag logic
|
||||
case RE_IRON_KNUCKLE:
|
||||
return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
CanUse(RG_MEGATON_HAMMER) || HasExplosives();
|
||||
return CanUseSword() || CanUse(RG_MEGATON_HAMMER) || HasExplosives();
|
||||
// To stun flare dancer with chus, you have to hit the flame under it while it is spinning. It should eventually
|
||||
// return to spinning after dashing for a while if you miss the window it is possible to damage the core with
|
||||
// explosives, but difficult to get all 4 hits in even with chus, and if it reconstructs the core heals, so it
|
||||
|
@ -695,9 +691,8 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) ||
|
||||
CanUse(RG_FIRE_ARROWS);
|
||||
case RE_SHELL_BLADE:
|
||||
return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) ||
|
||||
CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE);
|
||||
return CanJumpslash() || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) ||
|
||||
CanUse(RG_DINS_FIRE);
|
||||
case RE_SPIKE:
|
||||
return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) ||
|
||||
CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) ||
|
||||
|
@ -744,25 +739,20 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
case RE_BARINADE:
|
||||
return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer();
|
||||
case RE_PHANTOM_GANON:
|
||||
return HasBossSoul(RG_PHANTOM_GANON_SOUL) &&
|
||||
(CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) &&
|
||||
return HasBossSoul(RG_PHANTOM_GANON_SOUL) && CanUseSword() &&
|
||||
(CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT));
|
||||
case RE_VOLVAGIA:
|
||||
return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER);
|
||||
case RE_MORPHA:
|
||||
return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) &&
|
||||
(CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
CanUse(RG_MEGATON_HAMMER));
|
||||
return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && (CanUseSword() || CanUse(RG_MEGATON_HAMMER));
|
||||
case RE_BONGO_BONGO:
|
||||
return HasBossSoul(RG_BONGO_BONGO_SOUL) &&
|
||||
(CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) &&
|
||||
(CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) &&
|
||||
(CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && CanUseSword() &&
|
||||
(CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) ||
|
||||
ctx->GetTrickOption(RT_SHADOW_BONGO));
|
||||
case RE_TWINROVA:
|
||||
return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) &&
|
||||
(CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) ||
|
||||
CanUse(RG_MEGATON_HAMMER));
|
||||
(CanUseSword() || CanUse(RG_MEGATON_HAMMER));
|
||||
case RE_GANONDORF:
|
||||
// RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the
|
||||
// energy ball and either of them regardless of jumpslashing to damage and kill ganondorf
|
||||
|
@ -771,8 +761,7 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
// for killing ganondorf and all of those can reflect the energy ball
|
||||
// This will not be the case once ammo logic in taken into account as
|
||||
// sticks are limited and using a bottle might become a requirement in that case
|
||||
return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) &&
|
||||
(CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD));
|
||||
return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && CanUseSword();
|
||||
case RE_GANON:
|
||||
return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD);
|
||||
case RE_DARK_LINK:
|
||||
|
@ -792,8 +781,7 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
|
|||
return CanUse(RG_BOOMERANG);
|
||||
case RE_BARI:
|
||||
return HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_MEGATON_HAMMER) ||
|
||||
CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) ||
|
||||
(TakeDamage() && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)));
|
||||
CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || (TakeDamage() && CanUseSword());
|
||||
case RE_SHABOM:
|
||||
// RANDOTODO when you add better damage logic, you can kill this by taking hits
|
||||
return CanUse(RG_BOOMERANG) || CanUse(RG_NUTS) || CanJumpslash() || CanUse(RG_DINS_FIRE) ||
|
||||
|
@ -962,7 +950,7 @@ bool Logic::CanBreakMudWalls() {
|
|||
}
|
||||
|
||||
bool Logic::CanGetDekuBabaSticks() {
|
||||
return (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG));
|
||||
return CanUseSword() || CanUse(RG_BOOMERANG);
|
||||
}
|
||||
|
||||
bool Logic::CanGetDekuBabaNuts() {
|
||||
|
@ -1060,9 +1048,13 @@ bool Logic::HasBottle() {
|
|||
return BottleCount() >= 1;
|
||||
}
|
||||
|
||||
bool Logic::CanUseSword() {
|
||||
return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);
|
||||
}
|
||||
|
||||
bool Logic::CanJumpslashExceptHammer() {
|
||||
// Not including hammer as hammer jump attacks can be weird;
|
||||
return CanUse(RG_STICKS) || CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD);
|
||||
return CanUse(RG_STICKS) || CanUseSword();
|
||||
}
|
||||
|
||||
bool Logic::CanJumpslash() {
|
||||
|
|
|
@ -209,6 +209,7 @@ class Logic {
|
|||
uint8_t BottleCount();
|
||||
uint8_t OcarinaButtons();
|
||||
bool HasBottle();
|
||||
bool CanUseSword();
|
||||
bool CanJumpslashExceptHammer();
|
||||
bool CanJumpslash();
|
||||
bool CanHitSwitch(EnemyDistance distance = ED_CLOSE, bool inWater = false);
|
||||
|
|
|
@ -2014,16 +2014,16 @@ void Settings::UpdateOptionProperties() {
|
|||
}
|
||||
}
|
||||
|
||||
int dungeonShuffle =
|
||||
bool dungeonShuffle =
|
||||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_OFF);
|
||||
int bossShuffle =
|
||||
bool bossShuffle =
|
||||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF);
|
||||
int overworldShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), RO_GENERIC_OFF);
|
||||
int interiorShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_GENERIC_OFF);
|
||||
int grottoShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_OFF);
|
||||
bool overworldShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), RO_GENERIC_OFF);
|
||||
bool interiorShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_GENERIC_OFF);
|
||||
bool grottoShuffle = CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_OFF);
|
||||
|
||||
// Hide Mixed Entrances option if no applicable entrance shuffles are visible
|
||||
if (!dungeonShuffle && !bossShuffle && !overworldShuffle && !interiorShuffle && !grottoShuffle) {
|
||||
// Hide Mixed Entrances option if 1 or no applicable entrance shuffles are visible
|
||||
if (dungeonShuffle + bossShuffle + overworldShuffle + interiorShuffle + grottoShuffle <= 1) {
|
||||
mOptions[RSK_MIXED_ENTRANCE_POOLS].Hide();
|
||||
} else {
|
||||
mOptions[RSK_MIXED_ENTRANCE_POOLS].Unhide();
|
||||
|
@ -2782,6 +2782,36 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
|
|||
trials[i]->SetAsRequired();
|
||||
}
|
||||
|
||||
bool dungeonShuffle = !mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES].Is(RO_GENERIC_OFF);
|
||||
bool bossShuffle = !mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].Is(RO_GENERIC_OFF);
|
||||
bool overworldShuffle = !mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES].Is(RO_GENERIC_OFF);
|
||||
bool interiorShuffle = !mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF);
|
||||
bool grottoShuffle = !mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES].Is(RO_GENERIC_OFF);
|
||||
|
||||
if (dungeonShuffle + bossShuffle + overworldShuffle + interiorShuffle + grottoShuffle <= 1) {
|
||||
mOptions[RSK_MIXED_ENTRANCE_POOLS].Set(RO_GENERIC_OFF);
|
||||
}
|
||||
|
||||
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !dungeonShuffle) {
|
||||
mOptions[RSK_MIX_DUNGEON_ENTRANCES].Set(RO_GENERIC_OFF);
|
||||
}
|
||||
|
||||
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !bossShuffle) {
|
||||
mOptions[RSK_MIX_BOSS_ENTRANCES].Set(RO_GENERIC_OFF);
|
||||
}
|
||||
|
||||
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !overworldShuffle) {
|
||||
mOptions[RSK_MIX_OVERWORLD_ENTRANCES].Set(RO_GENERIC_OFF);
|
||||
}
|
||||
|
||||
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !interiorShuffle) {
|
||||
mOptions[RSK_MIX_INTERIOR_ENTRANCES].Set(RO_GENERIC_OFF);
|
||||
}
|
||||
|
||||
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !grottoShuffle) {
|
||||
mOptions[RSK_MIX_GROTTO_ENTRANCES].Set(RO_GENERIC_OFF);
|
||||
}
|
||||
|
||||
if (mOptions[RSK_FOREST].Is(RO_CLOSED_FOREST_ON) &&
|
||||
(mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) ||
|
||||
mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES] || mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS] ||
|
||||
|
|
|
@ -484,8 +484,17 @@ bool EnMag_ShouldDrawPressStart(Font* font, Gfx** gfxP, bool isActualText) {
|
|||
// Title logo is shifted to the left in Master Quest
|
||||
#define LOGO_X_SHIFT (isMQ ? 0 : -8)
|
||||
#define LOGO_TEX (isMQ ? gTitleZeldaShieldLogoMQTex : gTitleZeldaShieldLogoTex)
|
||||
// Copyright texture is different depending on the version
|
||||
// JPN CE displays two slightly different 2004 copyrights when lang is jpn or not
|
||||
// Otherwise the other GC JPN versions either display 2002 for JPN or 2003 for others
|
||||
// Else fallback to 2003 for GC or 1998 for N64
|
||||
#define COPYRIGHT_TEX \
|
||||
(isJpnGC_CE \
|
||||
? (gSaveContext.language == LANGUAGE_JPN ? gTitleCopyright19982004JpnTex : gTitleCopyright19982004EngTex) \
|
||||
: (isGC ? ((isJpnGC_notCE || gSaveContext.language == LANGUAGE_JPN) ? gTitleCopyright19982002Tex \
|
||||
: gTitleCopyright19982003Tex) \
|
||||
: gTitleCopyright1998Tex))
|
||||
// Copyright texture is larger on GC
|
||||
#define COPYRIGHT_TEX (isGC ? gTitleCopyright19982003Tex : gTitleCopyright1998Tex)
|
||||
#define COPYRIGHT_TEX_WIDTH (isGC ? 160 : 128)
|
||||
#define COPYRIGHT_TEX_LEFT (isGC ? 78 : 94)
|
||||
|
||||
|
@ -515,6 +524,9 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxP) {
|
|||
u16 rectTop;
|
||||
bool isMQ = ResourceMgr_IsGameMasterQuest();
|
||||
bool isGC = ResourceMgr_GetGamePlatform(0) == GAME_PLATFORM_GC;
|
||||
bool isJpnGC_CE = isGC && ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_GC_CE;
|
||||
bool isJpnGC_notCE =
|
||||
isGC && (ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_GC || ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_MQ);
|
||||
|
||||
gSPSegment(gfx++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment);
|
||||
|
||||
|
|
|
@ -5170,7 +5170,9 @@ void Fishing_HandleOwnerDialog(Fishing* this, PlayState* play) {
|
|||
if (Actor_HasParent(&this->actor, play)) {
|
||||
this->stateAndTimer = 24;
|
||||
} else {
|
||||
Actor_OfferGetItem(&this->actor, play, GI_SCALE_GOLDEN, 2000.0f, 1000.0f);
|
||||
if (!GameInteractor_Should(VB_GIVE_RANDO_GLITCH_FISHING_PRIZE, false, &this)) {
|
||||
Actor_OfferGetItem(&this->actor, play, GI_SCALE_GOLDEN, 2000.0f, 1000.0f);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue