Files
oracle-of-secrets/Docs/Sprites/Enemies/Wolfos.md
scawful aede7551a3 Add new sprite documentation for Minecart, Pedestal, Portal, and Switch Track
- Created detailed documentation for the Minecart sprite, outlining its properties, constants, collision setup, main logic, and design patterns.
- Added documentation for the Pedestal sprite, including its vanilla overrides, custom logic for item interaction, and event triggering based on area context.
- Introduced documentation for the Portal sprite, detailing its two-way warping system, initialization, main logic, and helper routines for seamless transitions.
- Documented the Switch Track sprite, explaining its interactive behavior, state-based animation, and integration with external switches for dynamic track manipulation.
2025-10-03 01:52:48 -04:00

5.2 KiB

Wolfos Mini-Boss Sprite Analysis

Overview

The wolfos sprite (ID: Sprite_Wolfos, which is $A9) functions as a mini-boss or special enemy. It engages Link in combat with various movement and attack patterns. A key aspect of this sprite is its integration into a mask quest, where it can be subdued and, under specific conditions, grants Link the Wolf Mask.

Key Properties:

  • Sprite ID: Sprite_Wolfos ($A9)
  • Description: A mini-boss/special enemy that fights Link and is part of a mask quest.
  • Number of Tiles: 4
  • Health: 30 (decimal)
  • Damage: 00 (Damage dealt to Link is likely handled by its attacks.)
  • Special Properties:
    • !Boss = 00 (Not marked as a boss, but functions as a mini-boss/special enemy.)
    • !ImperviousArrow = 01 (Impervious to arrows.)

Custom Variables/Macros:

  • WolfosDialogue = SprMiscD: Stores a flag to control Wolfos dialogue.
  • Wolfos_AnimateAction = SprMiscE: Stores the current animation action.
  • AttackForward(), AttackBack(), WalkRight(), WalkLeft(), AttackRight(), AttackLeft(), Subdued(), GrantMask(), Dismiss(): Macros for setting SprAction and Wolfos_AnimateAction, improving code clarity.
  • !NormalSpeed = $08, !AttackSpeed = $0F: Constants for movement speeds.

Main Logic Flow (Sprite_Wolfos_Main):

The Wolfos's behavior is governed by a state machine:

  • Wolfos_AttackForward (0x00), Wolfos_AttackBack (0x01), Wolfos_WalkRight (0x02), Wolfos_WalkLeft (0x03), Wolfos_AttackRight (0x04), Wolfos_AttackLeft (0x05): These states manage the Wolfos's movement and attacks. They call Wolfos_Move and can randomly trigger attack actions with increased speed and temporary imperviousness.
  • Wolfos_Subdued (0x06): In this state, the Wolfos stops moving, displays dialogue ($23), and waits for Link to play the Song of Healing (SongFlag = $01). If the song is played, it transitions to Wolfos_GrantMask.
  • Wolfos_GrantMask (0x07): Displays the Wolfos mask graphic, shows a message ($10F), grants Link the WolfMask item, and transitions to Wolfos_Dismiss.
  • Wolfos_Dismiss (0x08): Stops moving, kills the sprite, and clears Link's BRANDISH flag.

Initialization (Sprite_Wolfos_Prep):

  • Checks if Link is outdoors ($1B). If so, it further checks if the Wolfos has already been defeated ($7EF303 = $01). If defeated, the sprite is killed to prevent respawning.
  • Sets initial timers (SprTimerA = $40, SprTimerC = $40).
  • Configures deflection properties (SprDefl = $82, making it impervious to arrows).
  • Sets SprNbrOAM = $08 and initializes SprMiscG, X and SprMiscE, X to 0.

Defeat Check (Sprite_Wolfos_CheckIfDefeated):

  • Checks if Link is outdoors. If SprHealth, X drops below $04, the Wolfos is considered "defeated."
  • Upon defeat, it sets SprAction = $06 (Wolfos_Subdued), SprState = $09 (normal state, avoiding a full death animation), refills its health to $40, and clears WolfosDialogue. This indicates pacification rather than outright killing.

Movement (Wolfos_Move, Wolfos_DecideAction, Wolfos_MoveAction_Basic, Wolfos_MoveAction_CirclePlayer, Wolfos_MoveAction_Dodge):

  • Wolfos_Move: Handles damage flash, checks damage from player, prevents player from passing through, bounces from tile collision, checks for recoiling, moves the sprite, and calls Wolfos_DecideAction.
  • Wolfos_DecideAction: Determines the Wolfos's next movement action based on timers and random chance. It uses a jump table to select between Wolfos_MoveAction_Basic, Wolfos_MoveAction_CirclePlayer, and Wolfos_MoveAction_Dodge.
  • Wolfos_MoveAction_Basic: Basic movement towards or away from Link based on distance.
  • Wolfos_MoveAction_CirclePlayer: Attempts to circle the player.
  • Wolfos_MoveAction_Dodge: Dodges by applying speed towards the player.

Animation (Sprite_Wolfos_Animate):

  • This routine is called from Sprite_Wolfos_Main.
  • It uses Wolfos_AnimateAction (stored in SprMiscE, X) to determine which animation to play.
  • It has separate animation routines for AttackForward, AttackBack, WalkRight, WalkLeft, AttackRight, AttackLeft, and Subdued.
  • It also spawns sparkle garnishes (JSL Sprite_SpawnSparkleGarnish).

Drawing (Sprite_Wolfos_Draw):

  • Uses standard OAM allocation routines.
  • Handles animation frames, x/y offsets, character data, properties, and sizes for drawing the Wolfos.
  • Includes a special frame for the Wolf Mask ($CC) when granting the item.

Discrepancies/Notes:

  • Mask Quest Integration: The Wolfos is directly integrated into a mask quest, where playing the Song of Healing subdues it and leads to receiving the Wolf Mask.
  • Health Refill on Defeat: When defeated, its health is refilled to $40, and its state is set to Wolfos_Subdued, indicating it's not truly killed but rather pacified.
  • Hardcoded Values: Many numerical values for timers, speeds, and offsets are hardcoded. Replacing these with named constants would improve readability and maintainability.
  • JSL Link_ReceiveItem: This is a standard function for giving items to Link.
  • JSL Sprite_SpawnSparkleGarnish: This is a generic garnish spawning function.