Files
oracle-of-secrets/Docs/Sprites/Enemies/VampireBat.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

3.5 KiB

Vampire Bat Mini-Boss Sprite Analysis

Overview

The vampire_bat sprite is a mini-boss, a specialized enemy that utilizes the generic Keese sprite ID ($11) but differentiates its behavior through SprSubtype = 02. It features more complex movement patterns and attacks compared to a standard Keese, including ascending, flying around, descending, and spawning other Keese.

Key Properties:

  • Sprite ID: 0x11 (Custom Keese Subtype 02)
  • Description: A mini-boss variant of the Keese, with enhanced movement and attack capabilities.
  • Number of Tiles: 8 (Inherited from the base Keese sprite.)
  • Health: 32 (decimal, set in Sprite_Keese_Prep based on subtype.)
  • 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.)
    • !Shadow = 01 (Draws a shadow.)

Main Logic Flow (Sprite_VampireBat_Main):

The Vampire Bat's behavior is governed by a state machine:

  • VampireBat_Idle (0x00): Waits for Link to approach within a specified distance ($24). Transitions to VampireBat_Ascend.
  • VampireBat_Ascend (0x01): Plays an ascending animation, increases its SprHeight to $50, and randomly spawns a Fire Keese (Sprite_SpawnFireKeese). Transitions to VampireBat_FlyAround.
  • VampireBat_FlyAround (0x02): Plays a flying animation, moves towards Link (Sprite_ProjectSpeedTowardsPlayer), and randomly selects new directions (Sprite_SelectNewDirection). Transitions to VampireBat_Descend after a timer.
  • VampireBat_Descend (0x03): Plays a descending animation, decreases its SprHeight until it's on the ground, and randomly uses Sprite_Twinrova_FireAttack. Transitions back to VampireBat_Idle after a timer.

Initialization (from Sprite_Keese_Prep in keese.asm):

The Vampire Bat does not have its own _Prep routine and relies on the generic Sprite_Keese_Prep routine in keese.asm. When SprSubtype = 02:

  • SprHealth is set to $20 (32 decimal).
  • SprDefl is set to $80.
  • SprTimerC is set to $30.

Drawing (Sprite_VampireBat_Draw):

  • This routine is called from Sprite_Keese_Long in keese.asm when SprSubtype = 02.
  • Uses standard OAM allocation routines.
  • Handles animation frames, x/y offsets, character data, properties, and sizes specific to the Vampire Bat's appearance.

Attack Spawning (Sprite_SpawnFireKeese, Sprite_SpawnIceKeese):

  • Sprite_SpawnFireKeese: Spawns a Keese sprite ($11) with SprSubtype = $01 (Fire Keese).
  • Sprite_SpawnIceKeese: Spawns a Keese sprite ($11) with SprSubtype = $00 (Ice Keese).

Interactions:

  • Damage: Responds to damage from Link, including flashing and bouncing from tile collisions.
  • Attacks: Can spawn Fire Keese and utilize Sprite_Twinrova_FireAttack (a shared attack function).

Discrepancies/Notes:

  • Shared Sprite ID: The Vampire Bat efficiently reuses the generic Keese sprite ID ($11), with SprSubtype = 02 serving as the primary differentiator for its unique behavior.
  • Health Management: Its health is configured within the generic Sprite_Keese_Prep routine based on its subtype.
  • Code Reuse: It reuses Sprite_Twinrova_FireAttack, demonstrating efficient code sharing across different boss/mini-boss sprites.
  • Hardcoded Values: Many numerical values for timers, speeds, and offsets are hardcoded. Replacing these with named constants would improve readability and maintainability.