summaryrefslogtreecommitdiff
path: root/src/knowledge.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2017-06-18 15:15:11 +0200
committerJustin Worthe <justin.worthe@gmail.com>2017-06-18 15:15:11 +0200
commit862897ea1d183810c2783eaeeaf40f648ef3dc2d (patch)
treefb168f1122fa2839b52443c54555593045262a2a /src/knowledge.rs
parent29181fce4797b6e4833ab56d1fa7ff9fa865965b (diff)
Added knowledge of weapons
Next step: knowledge of weapon's effects.
Diffstat (limited to 'src/knowledge.rs')
-rw-r--r--src/knowledge.rs35
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
}
};