summaryrefslogtreecommitdiff
path: root/src/list.rs
blob: 6c07c01fe51037e9b44de4ea99a6654254ff11c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
extern crate pancurses;

use location::Location;
use character::Character;
use constants::Colors;

pub struct List{
    pub men                 : Vec<Character>,
    impassable_locations    : Vec<Location>,
}

impl List {
    pub fn new(impassable_locations : Vec<Location>) -> List {
        let mut men = Vec::new();
        for i in 0..3 {
            men.push(Character::new('@', Colors::BlueUnit as u8, Location(150,150+i)));
        }
        List {
            men                     : men,
            impassable_locations    : impassable_locations,
        }
    }

    pub fn action(&mut self) {
        for i in 0..self.men.len() {
            let location = self.men[i].location.clone();
            let free_locations = self.get_free_locations(location);
            self.men[i].action(free_locations);
        }

        let impassable = self.get_all_impassable();
        for i in 0..self.men.len() {
            if self.men[i].needs_path {
                self.men[i].calculate_path(impassable.to_vec());
            }
        }
    }

    pub fn give_destination(&mut self, destination : Location) {
        for i in 0..self.men.len() {
            self.men[i].give_destination(destination)
        }
    }

    fn get_free_locations(&mut self, location : Location) -> Vec<(Location, usize)> {
        let mut potential_locations = location.neighbours(Vec::new());

        potential_locations.retain(|potential_location| {
            let mut keep = true;
            for man in self.men.iter() {
                if potential_location.0 == man.location {
                    keep = false;
                }
            }
            for impassable_location in self.impassable_locations.iter() {
                if potential_location.0 == *impassable_location {
                    keep = false;
                }
            }
            keep
        });

        potential_locations
    }

    fn get_all_impassable(&mut self) -> Vec<(Location, usize)> {
        let mut impassable = Vec::new();
        for man in self.men.iter() {
            impassable.push((man.location, 1));
        }
        for impassable_location in self.impassable_locations.iter() {
            impassable.push((*impassable_location,1));
        }
        impassable
    }
}