-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunit.cpp
More file actions
100 lines (88 loc) · 1.92 KB
/
unit.cpp
File metadata and controls
100 lines (88 loc) · 1.92 KB
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
#include "unit.hpp"
using namespace std;
Unit::Unit() : Entity("UNIT_UNDEFINED","EMPTY",0,0,0) {
init();
}
Unit::Unit(std::string uid, std::string filename) : Entity(uid, filename, 0, 0, 0) {
init();
}
Unit::Unit(std::string uid, std::string filename, float x, float y, int tags) : Entity(uid, filename, x, y, tags){
init();
}
Unit::~Unit() {
// Drop all items
for (typename std::vector<Item*>::iterator it = inv.begin() ; it != inv.end(); ++it) {
(*it)->realX = realX;
(*it)->realY = realY;
(*it)->inInventory = false;
}
}
void Unit::init(){
state = STATE_IDLE;
timeToComplete = 1000;
skills = 1;
}
void Unit::walkTo(std::vector<point> path) {
curPath = path;
state = STATE_WALKING;
}
Unit* Unit::clone(std::string newUID) {
Unit* newUnit = new Unit(newUID, filename, realX, realY, tags);
newUnit->skills = skills;
return newUnit;
}
void Unit::update(float dt) {
// Prevent sudden jumping
if (dt > 1) {
dt = 1;
}
// Determine what to do depending on state
switch (state) {
case STATE_WALKING: {
if (curPath.empty()) {
state = STATE_FINISHED_JOB;
dx = 0;
dy = 0;
break;
}
point nextLoc = curPath.back();
if (realX < nextLoc.realX) {
dx = 2*speed*dt;
} else if (realX > nextLoc.realX) {
dx = -2*speed*dt;
}
if (realY < nextLoc.realY) {
dy = speed*dt;
} else if (realY > nextLoc.realY) {
dy = -speed*dt;
}
break;
}
case STATE_ACTING: {
timeToComplete -= dt;
if (timeToComplete < 0) {
state = STATE_FINISHED_JOB;
}
break;
}
case STATE_IDLE:
default:
break;
}
}
void Unit::startTask(float timeToComplete) {
state = STATE_ACTING;
this->timeToComplete = timeToComplete;
}
bool Unit::hasItem(Item* item) {
for (typename std::vector<Item*>::iterator it = inv.begin() ; it != inv.end(); ++it) {
if ((*it) == item) {
return true;
}
}
return false;
}
void Unit::pickupItem(Item* item) {
inv.push_back(item);
item->inInventory = true;
}