Files
oracle-of-secrets/Docs/Sprites/VampireBat.md
scawful 6780dd0d45 Add sprite analysis documentation for various bosses and mini-bosses
- Created detailed documentation for the Kydrog Boss sprite, outlining its phases, behaviors, and mechanics.
- Added analysis for the Manhandla sprite, including its transformation into Big Chuchu and phase management.
- Documented the Octoboss sprite, highlighting its unique mechanics and interactions with a "brother" Octoboss.
- Provided an overview of the Twinrova boss sprite, detailing its transformation and phase-based attacks.
- Included analysis for the Vampire Bat mini-boss, emphasizing its enhanced behavior compared to standard Keese.
- Documented the Wolfos mini-boss, focusing on its integration into a mask quest and unique pacification mechanics.
2025-10-02 21:24:44 -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.