summaryrefslogtreecommitdiff
path: root/src/character.rs
blob: 421ede473dcf36511db1a9a025991c156954d01a (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
extern crate rand;
use character::rand::Rng;

use constants::Orders;
use location::Location;

#[derive(Clone)]
pub struct Character {
    symbol              : char,
    color               : u8,
    order               : u8,
    location            : Location,
    desired_location    : Option<Location>,
    path                : Option<Vec<Location>>,
}

impl Character {

    pub fn new(symbol : char, color : u8, location : Location) -> Character {
        Character {
            symbol              : symbol,
            color               : color,
            order               : Orders::Wander as u8,
            location            : location,
            desired_location    : None,
            path                : None,
        }
    }

    pub fn action(&mut self, free_spaces : Vec<(Location,usize)>) {
        if self.order == Orders::Wander as u8 {
            self.wander(free_spaces);
        }
        else if self.order == Orders::Move as u8 {
            self.move_along_path(free_spaces);
        }
    }

    pub fn up(&mut self) {
        self.location.0 -= 1;
    }

    pub fn down(&mut self) {
        self.location.0 += 1;
    }

    pub fn right(&mut self) {
        self.location.1 += 1;
    }

    pub fn left(&mut self) {
        self.location.1 -= 1;
    }

    pub fn get_symbol(&self) -> char {
        self.symbol
    }

    pub fn get_color(&self) -> u8 {
        self.color
    }

    pub fn get_location(&self) -> Location {
        self.location
    }

    pub fn get_desired_location(&self) -> Option<Location> {
        self.desired_location
    }

    pub fn give_path(&mut self, path : Option<Vec<Location>>) {
        self.path = path;
    }

    pub fn give_destination(&mut self, destination : Location) {
        self.desired_location = Some(destination);
        self.order = Orders::Move as u8;
    }

    pub fn needs_path(&self) -> bool {
        if self.order == Orders::Wander as u8 {
            false
        }
        else if self.path.is_some() {
            false
        }
        else if self.desired_location.is_some() && self.path.is_none() {
            true
        }
        else {
            false
        }
    }

    fn wander(&mut self, free_spaces : Vec<(Location, usize)>) {
        let direction = rand::thread_rng().gen_range(0, free_spaces.len());
        self.location = free_spaces[direction].0;
    }

    fn move_along_path(&mut self, free_spaces : Vec<(Location, usize)>) {
        let mut moved = false;
        match self.path {
            Some(ref mut calculated_path) => {
                if calculated_path.len() > 0 {
                    let next_location = calculated_path.pop().unwrap();
                    for free_space in free_spaces {
                        if next_location == free_space.0 {
                            self.location = next_location;
                            moved = true;
                        }
                    }
                }
                else {
                    self.desired_location = None;
                    self.order = Orders::Wait as u8;
                }
            }
            _ => (),
        }
        if !moved {
            self.path = None;
        }
    }
}