From a1f2934e82312761b6eb2cc2cb427895868f5f19 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 21 Jul 2018 12:37:56 +0200 Subject: Added an index, to make the missile towers a proper circular buffer --- src/engine/bitwise_engine.rs | 45 +++++++++++++++++++++++++++----------------- src/engine/constants.rs | 1 + 2 files changed, 29 insertions(+), 17 deletions(-) (limited to 'src/engine') diff --git a/src/engine/bitwise_engine.rs b/src/engine/bitwise_engine.rs index 99e4d92..add7d31 100644 --- a/src/engine/bitwise_engine.rs +++ b/src/engine/bitwise_engine.rs @@ -23,7 +23,9 @@ pub struct PlayerBuildings { pub occupied: u64, pub energy_towers: u64, - pub missile_towers: [u64; MISSILE_COOLDOWN+1], + + pub missile_towers: [u64; MISSILE_COOLDOWN_STATES], + pub firing_tower: usize, pub missiles: [(u64, u64); MISSILE_MAX_SINGLE_CELL], pub tesla_cooldowns: [TeslaCooldown; TESLA_MAX] @@ -178,6 +180,26 @@ impl BitwiseGameState { self.player_buildings.tesla_cooldowns.sort_by_key(|b| (!b.active, b.pos)); self.opponent_buildings.tesla_cooldowns.sort_by_key(|b| (!b.active, b.pos)); + + + while self.player_buildings.firing_tower > 0 { + self.player_buildings.firing_tower -= 1; + let zero = self.player_buildings.missile_towers[0]; + for i in 1..self.player_buildings.missile_towers.len() { + self.player_buildings.missile_towers[i-1] = self.player_buildings.missile_towers[i]; + } + let end = self.player_buildings.missile_towers.len()-1; + self.player_buildings.missile_towers[end] = zero; + } + while self.opponent_buildings.firing_tower > 0 { + self.opponent_buildings.firing_tower -= 1; + let zero = self.opponent_buildings.missile_towers[0]; + for i in 1..self.opponent_buildings.missile_towers.len() { + self.opponent_buildings.missile_towers[i-1] = self.opponent_buildings.missile_towers[i]; + } + let end = self.opponent_buildings.missile_towers.len()-1; + self.opponent_buildings.missile_towers[end] = zero; + } } #[cfg(debug_assertions)] @@ -256,7 +278,7 @@ impl BitwiseGameState { player_buildings.energy_towers |= bitfield; } if building_type == BuildingType::Attack { - player_buildings.missile_towers[0] |= bitfield; + player_buildings.missile_towers[player_buildings.firing_tower] |= bitfield; } if building_type == BuildingType::Tesla { let ref mut tesla_cooldown = if player_buildings.tesla_cooldowns[0].active { @@ -321,27 +343,15 @@ impl BitwiseGameState { } fn add_missiles(player_buildings: &mut PlayerBuildings) { - let mut missiles = player_buildings.missile_towers[0]; + let mut missiles = player_buildings.missile_towers[player_buildings.firing_tower]; for mut tier in player_buildings.missiles.iter_mut() { let setting = !tier.0 & missiles; tier.0 |= setting; missiles &= !setting; } - - BitwiseGameState::rotate_missile_towers(player_buildings); - } - - //TODO: Add a pointer and stop rotating here - fn rotate_missile_towers(player_buildings: &mut PlayerBuildings) { - let zero = player_buildings.missile_towers[0]; - for i in 1..player_buildings.missile_towers.len() { - player_buildings.missile_towers[i-1] = player_buildings.missile_towers[i]; - } - let end = player_buildings.missile_towers.len()-1; - player_buildings.missile_towers[end] = zero; + player_buildings.firing_tower = (player_buildings.firing_tower + 1) % MISSILE_COOLDOWN_STATES; } - fn move_and_collide_missiles(opponent: &mut Player, opponent_buildings: &mut PlayerBuildings, player_missiles: &mut [(u64, u64); MISSILE_MAX_SINGLE_CELL]) { for _ in 0..MISSILE_SPEED { for i in 0..MISSILE_MAX_SINGLE_CELL { @@ -417,7 +427,8 @@ impl PlayerBuildings { buildings: [0; DEFENCE_HEALTH], occupied: 0, energy_towers: 0, - missile_towers: [0; MISSILE_COOLDOWN+1], + missile_towers: [0; MISSILE_COOLDOWN_STATES], + firing_tower: 0, missiles: [(0,0); MISSILE_MAX_SINGLE_CELL], tesla_cooldowns: [TeslaCooldown::empty(); TESLA_MAX] } diff --git a/src/engine/constants.rs b/src/engine/constants.rs index e77392e..e321a81 100644 --- a/src/engine/constants.rs +++ b/src/engine/constants.rs @@ -3,6 +3,7 @@ pub const SINGLE_MAP_WIDTH: u8 = FULL_MAP_WIDTH/2; pub const MAP_HEIGHT: u8 = 8; pub const MISSILE_COOLDOWN: usize = 3; +pub const MISSILE_COOLDOWN_STATES: usize = MISSILE_COOLDOWN+1; pub const MISSILE_SPEED: usize = 2; pub const MISSILE_MAX_SINGLE_CELL: usize = SINGLE_MAP_WIDTH as usize / MISSILE_SPEED; pub const MISSILE_DAMAGE: u8 = 5; -- cgit v1.2.3