changeset 666:838d9402b12f

Implement ECL instruction 98, for directional sprites.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Mon, 12 Aug 2019 00:22:25 +0200
parents 965ecdbf0316
children 904849807fd8
files src/th06/ecl_vm.rs src/th06/enemy.rs
diffstat 2 files changed, 44 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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) => {
--- 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;