# HG changeset patch # User Emmanuel Gil Peyrot # Date 1566042654 -7200 # Node ID 1adecaddf442e08b31f654fed5c43d3a29186724 # Parent ac092b70c39ad14babd70879d00b0176245b0217 ecl_vm: implement SetBulletInterval and SetBulletIntervalEx. 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 @@ -607,7 +607,19 @@ impl EclRunner { flags); } + // 76 + SubInstruction::SetBulletInterval(interval) => { + let mut enemy = self.enemy.borrow_mut(); + enemy.set_bullet_launch_interval(0, interval); + } + // 77 + SubInstruction::SetBulletIntervalEx(interval) => { + let rand_start = self.get_prng().borrow_mut().get_u32(); + + let mut enemy = self.enemy.borrow_mut(); + enemy.set_bullet_launch_interval(rand_start, interval); + } // 78-79 are more interpolation flags // 78 diff --git a/src/th06/enemy.rs b/src/th06/enemy.rs --- a/src/th06/enemy.rs +++ b/src/th06/enemy.rs @@ -206,8 +206,8 @@ pub struct Enemy { pub(crate) low_life_trigger: Option, pub(crate) timeout: Option, pub(crate) remaining_lives: u32, - pub(crate) bullet_launch_interval: u32, - pub(crate) bullet_launch_timer: u32, + bullet_launch_interval: u32, + bullet_launch_timer: u32, pub(crate) death_anim: i32, pub(crate) direction: Direction, pub(crate) update_mode: u32, @@ -349,6 +349,14 @@ impl Enemy { } } + /// Sets the bullet launch interval. + pub(crate) fn set_bullet_launch_interval(&mut self, rand_start: u32, interval: i32) { + let coeff_interval = interval / 5; + let difficulty_modifier = coeff_interval + (-coeff_interval * 2) * self.get_difficulty() / 32; + self.bullet_launch_interval = (interval + difficulty_modifier) as u32; + self.bullet_launch_timer = rand_start % self.bullet_launch_interval; + } + /// Run all interpolators and such, and update internal variables once per /// frame. pub fn update(&mut self) { @@ -402,6 +410,15 @@ impl Enemy { self.pos = Position { x, y }; + if self.bullet_launch_interval != 0 { + if self.bullet_launch_timer == 0 { + self.bullet_attributes.fire(); + self.bullet_launch_timer = self.bullet_launch_interval; + } + self.bullet_launch_timer += 1; + self.bullet_launch_timer %= self.bullet_launch_interval; + } + self.frame += 1; }