Yiga Clan member spawns

From ZeldaMods
Jump to: navigation, search

Yiga Clan members are spawned by two different systems.

Some are statically spawned by PlacementMgr, which means that they are listed in map units and visible on the object map. However, after Link completes enough main quests, most Yiga Clan members the player sees are actually dynamically spawned by AutoPlacementMgr.

Static

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:

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:

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!

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) 75% 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.

Source: (with the code cleaned up)

// 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;
}