# HG changeset patch # User Emmanuel Gil Peyrot # Date 1565562145 -7200 # Node ID 838d9402b12f56872665cf845217d3ad16633989 # Parent 965ecdbf0316db1eea0824048f8d941c6adcf909 Implement ECL instruction 98, for directional sprites. diff --git a/src/th06/ecl_vm.rs b/src/th06/ecl_vm.rs --- a/src/th06/ecl_vm.rs +++ b/src/th06/ecl_vm.rs @@ -528,6 +528,17 @@ impl EclRunner { let mut enemy = self.enemy.borrow_mut(); enemy.set_anim(index as u8); } + // 98 + SubInstruction::SetMultipleAnims(default, end_left, end_right, left, right, _unused) => { + // TODO: check in ghidra! + let mut enemy = self.enemy.borrow_mut(); + enemy.movement_dependant_sprites = if left == -1 { + None + } else { + enemy.set_anim(default as u8); + Some((end_left as u8, end_right as u8, left as u8, right as u8)) + }; + } // 100 SubInstruction::SetDeathAnim(index) => { diff --git a/src/th06/enemy.rs b/src/th06/enemy.rs --- a/src/th06/enemy.rs +++ b/src/th06/enemy.rs @@ -112,6 +112,19 @@ struct Element { anmrunner: AnmRunner, } +#[derive(PartialEq)] +pub(crate) enum Direction { + Left, + Center, + Right, +} + +impl Default for Direction { + fn default() -> Direction { + Direction::Center + } +} + /// The enemy struct, containing everything pertaining to an enemy. #[derive(Default)] pub struct Enemy { @@ -143,7 +156,7 @@ pub struct Enemy { pub(crate) bullet_launch_interval: u32, pub(crate) bullet_launch_timer: u32, pub(crate) death_anim: i32, - pub(crate) direction: u32, + pub(crate) direction: Direction, pub(crate) update_mode: u32, // Bools. @@ -161,7 +174,7 @@ pub struct Enemy { pub(crate) extended_bullet_attributes: Option<(u32, u32, u32, u32, f32, f32, f32, f32)>, pub(crate) bullet_attributes: Option<(i16, i16, u32, u32, u32, f32, f32, f32, f32, u32)>, pub(crate) bullet_launch_offset: Offset, - pub(crate) movement_dependant_sprites: Option<(f32, f32, f32, f32)>, + pub(crate) movement_dependant_sprites: Option<(u8, u8, u8, u8)>, pub(crate) screen_box: Option<(f32, f32, f32, f32)>, // Callbacks. @@ -258,6 +271,24 @@ impl Enemy { } y += dy; + if let Some((end_left, end_right, left, right)) = self.movement_dependant_sprites { + if x < self.pos.x && self.direction != Direction::Left { + self.set_anim(left); + self.direction = Direction::Left; + } else if x > self.pos.x && self.direction != Direction::Right { + self.set_anim(right); + self.direction = Direction::Right; + } else if x == self.pos.x && self.direction != Direction::Center { + let anim = if self.direction == Direction::Left { + end_left + } else { + end_right + }; + self.set_anim(anim); + self.direction = Direction::Center; + } + } + self.pos = Position { x, y }; self.frame += 1;