diff options
author | Justin Worthe <justin.worthe@gmail.com> | 2017-06-18 15:15:11 +0200 |
---|---|---|
committer | Justin Worthe <justin.worthe@gmail.com> | 2017-06-18 15:15:11 +0200 |
commit | 862897ea1d183810c2783eaeeaf40f648ef3dc2d (patch) | |
tree | fb168f1122fa2839b52443c54555593045262a2a /src/knowledge.rs | |
parent | 29181fce4797b6e4833ab56d1fa7ff9fa865965b (diff) |
Added knowledge of weapons
Next step: knowledge of weapon's effects.
Diffstat (limited to 'src/knowledge.rs')
-rw-r--r-- | src/knowledge.rs | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/src/knowledge.rs b/src/knowledge.rs index 5e45f07..e12a8b2 100644 --- a/src/knowledge.rs +++ b/src/knowledge.rs @@ -9,7 +9,9 @@ use std::collections::HashMap; pub struct Knowledge { pub last_action: Action, pub opponent_map: OpponentMapKnowledge, - pub map_size: u16 + pub map_size: u16, + pub available_weapons: Vec<Weapon>, + pub charging_weapons: HashMap<Weapon, u16> } impl Knowledge { @@ -17,24 +19,47 @@ impl Knowledge { Knowledge { last_action: action, opponent_map: OpponentMapKnowledge::new(map_size), - map_size: map_size + map_size: map_size, + available_weapons: Vec::new(), + charging_weapons: HashMap::new() } } pub fn with_action(&self, action: Action) -> Knowledge { Knowledge { last_action: action, - opponent_map: self.opponent_map.clone(), - map_size: self.map_size + ..self.clone() } } pub fn resolve_last_action(&self, state: &State) -> Knowledge { let mut new_knowledge = self.clone(); + + let energy = state.player_map.energy; + let mut available_weapons: Vec<_> = state.player_map.ships.iter() + .filter(|&(_, ship_data)| !ship_data.destroyed) + .flat_map(|(ship, _)| ship.weapons()) + .collect(); + + available_weapons.sort_by_key(|weapon| format!("{}",weapon)); + available_weapons.dedup(); + new_knowledge.available_weapons = available_weapons.iter() + .filter(|weapon| weapon.energy_cost(state.map_size) <= energy) + .cloned() + .collect(); + + new_knowledge.charging_weapons = available_weapons.iter() + .filter(|weapon| weapon.energy_cost(state.map_size) > energy) + .map(|weapon| (weapon.clone(), weapon.energy_cost(state.map_size) - energy)) + .collect(); + match self.last_action { Action::PlaceShips(_) => {}, - Action::Shoot(p) => { + Action::Shoot(Weapon::SingleShot, p) => { new_knowledge.opponent_map.update_from_shot(p, &state); + }, + Action::Shoot(w, p) => { + //TODO } }; |