Yiga Clan member spawns and LevelSensor.byml: Difference between pages

(Difference between pages)
Jump to navigation Jump to search
no edit summary
imported>Leoetlino
 
imported>Leoetlino
No edit summary
 
Line 1: Line 1:
Yiga Clan members are spawned by two different systems.
<onlyinclude>
{{resloc|path=Ecosystem/LevelSensor.byml|locations=[[Bootup.pack]]}}
'''LevelSensor.byml''' is the main configuration file for the LevelSensor subsystem (which handles parts of [[difficulty scaling]]). Its file format is [[BYML]].
</onlyinclude>
All information related to difficulty (enemy and weapon) scaling is stored in this configuration file. Human-readable versions dumped from [[Renotesfiles:game files/1.0.0 LevelSensor.yml|1.0.0]] and [[Renotesfiles:game files/1.5.0 LevelSensor.yml|1.5.0]] are included in the [https://github.com/leoetlino/botw-re-notes botw-re-notes] repo. A [[Renotesfiles:game files/1.0.0 1.5.0 LevelSensor.yml.diff|diff between 1.0.0 and 1.5.0]] is also provided in the repo.


Some are statically spawned by [[PlacementMgr]], which means that they are listed in [[map unit]]s and visible on the [https://objmap.zeldamods.org object map]. However, after Link completes enough main quests, most Yiga Clan members the player sees are actually dynamically spawned by [[AutoPlacementMgr]].
[1.4.0] Flag entries for Golden enemies, Igneo Talus Titan and Monk Maz Koshia were added to the kill point table. Weapon entries for the One-Hit Obliterator and Weapon_Sword_503 were also added to the weapon scaling list. They cannot receive any modifier. (Yes, the developers forgot to add golden enemies to the config in 1.3.0.)


== Static ==
[[Category:Content (BotW)]]
=== Traveler (disguised Yigas) ===
These are linked to 'Link' tags that make them spawn if and only if the Electric_Relic_AssassinFirst flag (set when the Yiga Clan Hideout location text appears) ''or'' Npc_Kakariko001_TalkEnd (set after talking to Impa) flag is set.
 
=== Near the hideout ===
The ''five'' non-disguised static Yiga clan members inside and near the hideout seem to be spawned unconditionally.
 
== Dynamic ==
Other Yiga Clan members are not listed on the map. This is because they are dynamically spawned by a component called the AutoPlacement Manager. Unlike PlacementMgr, AutoPlacementMgr doesn't use map units to determine which actors to spawn. The current [[map area]] the player is in and various configuration files control whether Yiga enemies spawn or not.
 
=== Condition 1: AreaData ===
Just like other auto-generated actors, Enemy_Assassin_Shooter_Junior or Enemy_Assassin_Middle must be listed in an area's auto-generated enemies for Yiga Clan members to be spawned by AutoPlacementMgr.
 
* Area 0: GerudoHighlands
** Enemy_Assassin_Shooter_Junior x1
* Area 1: WestHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 2: TamulPlateau
** Enemy_Assassin_Middle x1
* Area 3: HeburaMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 4: GerudoHighlands
** Enemy_Assassin_Shooter_Junior x1
* Area 5: HeburaMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 6: CentralHyrule
** Enemy_Assassin_Shooter_Junior x1
* Area 8: HyruleForest
** Enemy_Assassin_Shooter_Junior x1
* Area 9: HeburaMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 10: HyliaLake
** Enemy_Assassin_Shooter_Junior x1
* Area 11: LanayruWaterSources
** Enemy_Assassin_Shooter_Junior x1
* Area 12: CentralHyrule
** Enemy_Assassin_Shooter_Junior x1
* Area 13: EastHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 14: HyruleForest
** Enemy_Assassin_Shooter_Junior x1
* Area 15: EldinMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 16: HyruleForest
** Enemy_Assassin_Shooter_Junior x1
* Area 17: EldinCanyon
** Enemy_Assassin_Middle x1
* Area 18: TabantaFrontier
** Enemy_Assassin_Shooter_Junior x1
* Area 19: WestHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 20: TamulOutback
** Enemy_Assassin_Middle x1
* Area 21: GerudoDesert
** Enemy_Assassin_Shooter_Junior x1
* Area 22: TamulOutback
** Enemy_Assassin_Shooter_Junior x1
* Area 23: TabantaFrontier
** Enemy_Assassin_Shooter_Junior x1
* Area 24: FironeGrassland
** Enemy_Assassin_Shooter_Junior x1
* Area 25: FironeGrassland
** Enemy_Assassin_Shooter_Junior x1
* Area 26: CentralHyrule
** Enemy_Assassin_Shooter_Junior x1
* Area 27: TabantaFrontier
** Enemy_Assassin_Middle x1
* Area 29: FironeGrassland
** Enemy_Assassin_Shooter_Junior x1
* Area 30: TamulSea
** Enemy_Assassin_Shooter_Junior x1
* Area 31: TabantaFrontier
** Enemy_Assassin_Shooter_Junior x1
* Area 32: CentralHyrule
** Enemy_Assassin_Middle x1
* Area 33: TamulPlateau
** Enemy_Assassin_Shooter_Junior x1
* Area 36: FironeGrassland
** Enemy_Assassin_Shooter_Junior x1
* Area 37: HeburaMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 39: HeburaMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 40: GerudoDesert
** Enemy_Assassin_Shooter_Junior x1
* Area 41: CentralHyrule
** Enemy_Assassin_Shooter_Junior x1
* Area 42: TabantaFrontier
** Enemy_Assassin_Shooter_Junior x1
* Area 43: HateruSea
** Enemy_Assassin_Shooter_Junior x1
* Area 48: TabantaFrontier
** Enemy_Assassin_Shooter_Junior x1
* Area 49: WestHateru
** Enemy_Assassin_Middle x1
* Area 52: EldinMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 53: EldinMountains
** Enemy_Assassin_Middle x1
* Area 54: TamulSea
** Enemy_Assassin_Middle x1
* Area 57: LanayruSea
** Enemy_Assassin_Shooter_Junior x1
* Area 58: HateruSea
** Enemy_Assassin_Shooter_Junior x1
* Area 59: WestHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 60: HyruleForest
** Enemy_Assassin_Shooter_Junior x1
* Area 61: EastHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 62: EastHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 63: HyruleHill
** Enemy_Assassin_Shooter_Junior x1
* Area 65: LanayruWetlands
** Enemy_Assassin_Shooter_Junior x1
* Area 70: CentralHyrule
** Enemy_Assassin_Middle x1
* Area 71: TamulPlateau
** Enemy_Assassin_Middle x1
* Area 72: GerudoDesert
** Enemy_Assassin_Shooter_Junior x1
* Area 73: GerudoHighlands
** Enemy_Assassin_Shooter_Junior x1
* Area 74: FironeGrassland
** Enemy_Assassin_Shooter_Junior x1
* Area 75: TamulPlateau
** Enemy_Assassin_Middle x1
* Area 76: CentralHyrule
** Enemy_Assassin_Shooter_Junior x1
* Area 78: EastHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 80: TabantaFrontier
** Enemy_Assassin_Middle x1
* Area 81: HyruleHill
** Enemy_Assassin_Shooter_Junior x1
* Area 82: CentralHyrule
** Enemy_Assassin_Shooter_Junior x1
* Area 83: TabantaFrontier
** Enemy_Assassin_Shooter_Junior x1
* Area 86: EastHateru
** Enemy_Assassin_Shooter_Junior x1
* Area 87: GerudoDesert
** Enemy_Assassin_Shooter_Junior x1
* Area 88: HyruleForest
** Enemy_Assassin_Shooter_Junior x1
* Area 89: EldinMountains
** Enemy_Assassin_Shooter_Junior x1
* Area 90: FironeGrassland
** Enemy_Assassin_Shooter_Junior x1
* Area 93: WestHateru
** Enemy_Assassin_Shooter_Junior x1
 
=== Condition 2: Event flow ===
Just like other auto-generated actors, the AutoPlacement event flows for Enemy_Assassin_Shooter_Junior or Enemy_Assassin_Middle must call the CreateData action for them to be spawned.
 
The full set of conditions can be found here:
* Enemy_Assassin_Middle: https://eventviewer.zeldamods.org/viewer.html?data=/d/AutoPlacementNear_Enemy_Assassin_Middle.json&params=1&entry=EntryPoint0
* Enemy_Assassin_Shooter_Junior: https://eventviewer.zeldamods.org/viewer.html?data=/d/AutoPlacementNear_Enemy_Assassin_Shooter_Junior.json&params=1&entry=EntryPoint0
 
=== Condition 3: AutoPlacementMgr ===
This series of checks is specific to Yiga enemies and hardcoded in AutoPlacementMgr (in the [[executable]]).
 
'''If the Electric_Relic_GetBack flag is set''', which happens when Link opens the Thunder Helm chest in the hideout and the quest log shows this message:
<blockquote><poem>
You retrieved the chief's heirloom from the
thieves' leader!
 
It's time to head back to Gerudo Town
and return the heirloom to Riju!
</poem></blockquote>
 
Then:
* Blademasters are allowed to spawn, and their weapon is a Windcleaver (Weapon_Lsword_074)
* Archers are allowed to spawn, and their weapon is a Duplex Bow (Weapon_Bow_040)
* Footsoldiers now carry a Demon Carver (Weapon_Sword_073) instead of a Vicious Sickle (Weapon_Sword_053) 25% of the time.
 
'''Otherwise''', only non-archer footsoldiers are allowed to spawn, and '''only if''' [the player has talked to Impa ''or'' the Electric_Relic_AssassinFirst flag is set]. In this case, their weapon is always a Vicious Sickle. Note that because non-archer footsoldiers do not have auto placement entries, this effectively means no Yiga enemy can dynamically spawn.
 
Note: if Electric_Relic_GetBack is set, [[AIDef:Action/CreateAndReplaceAssassin]] will create Yiga enemy actors with the DropTable parameter set to "HighRank". This causes them to drop better items upon defeat.
 
<div class="mw-collapsible mw-collapsed">
Source: (with the code cleaned up)
<div class="mw-collapsible-content">
<source lang="c++">
// This is at 0x710073D7FC in Switch 1.5.0
bool yigaWeaponStuff(sead::SafeString& enemyName, sead::SafeString& weaponName, bool wantFootsoldier,
                    const sead::SafeString& disguisedActorName)
{
  const bool isFootsoldier = wantFootsoldier || enemyName == "Enemy_Assassin_Junior";
  const bool isShooterJunior = enemyName == "Enemy_Assassin_Shooter_Junior";
  weaponName = "";
 
  if ( !wantFootsoldier && isFootsoldier )  // well, this is a bug!
  {
    enemyName = "";
    return false;
  }
 
  if ( wantFootsoldier )
  {
    if ( disguisedActorName == "Npc_Assassin_001" )
      enemyName = "Enemy_Assassin_Junior_Npc_001";
    else if (disguisedActorName == "Npc_Assassin_002")
      enemyName = "Enemy_Assassin_Junior_Npc_002";
    else
      enemyName = "Enemy_Assassin_Junior";
  }
 
  // If the player has opened the Thunder Helm chest
  // (more precisely: basic signal was emitted by the chest)
  if ( getFlag_ElectricRelic_GetBack() )
  {
    // Footsoldier
    if (isFootsoldier)
    {
      if ( random() < 0.75 )
        weaponName = "Weapon_Sword_073";  // Demon Carver
      else
        weaponName = "Weapon_Sword_053";  // Vicious Sickle
    }
    // Archer
    else if (isShooterJunior)
    {
      weaponName = "Weapon_Bow_040";  // Duplex Bow
    }
    // Blademaster
    else
    {
      weaponName = "Weapon_Lsword_074";  // Windcleaver
    }
    return !enemyName.empty();
  }
 
  // Otherwise, if the player has NOT opened the chest:
  // Only footsoldiers are allowed to spawn
  // And *only if* [the player has talked to Impa or Electric_Relic_AssassinFirst is set]
  //
  // Note that non-archer footsoldiers are not dynamic spawns.
  if (isFootsoldier && (getFlag_Npc_Kakariko001_TalkEnd() || getFlag_Electric_Relic_AssassinFirst()))
  {
    weaponName = "Weapon_Sword_053";  // Vicious Sickle
    return true;
  }
 
  // In any other case, blank out the enemy name and prevent it from spawning.
  enemyName = "";
  return false;
}
</source>
</div>
</div>
 
[[Category:Internals]]
[[Category:Game mechanics]]
Anonymous user

Navigation menu