-
Notifications
You must be signed in to change notification settings - Fork 0
/
Cruiser.cpp
107 lines (95 loc) · 2.73 KB
/
Cruiser.cpp
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
//
// Created by Admin on 6/18/2021.
//
#include "Cruiser.h"
#include "Freighter.h"
#include "Boat_patrol.h"
void Cruiser::update() {
switch (_currentState) {
/* if the ship is "stopped" , "docked" or "dead" then don't update the ship location */
case Stopped:
case Docked:
case Dead:
break;
case MovingTo:
MoveAgent(_position, _currentDestination, getSpeed());
break;
case MovingOnCourse:
MoveAgent(_position, _currentDestination, getSpeed(), _angle);
break;
default:
break;
}
}
void Cruiser::concreteStatus() {
std::cout << "Cruiser " << getName() << " at";
getPosition().print();
std::cout << ", force: " << this->_force << ",";
if (_currentState != Stopped)
std::cout << " moving on course " << _angle << " deg,";
std::cout << " speed " << std::setprecision(4) << std::round(getSpeed())
<< " nm/hr" << endl;
}
void Cruiser::attack(std::string shipName) {
for (auto &i : Model::get_Instance().getShipVector()) {
if (i->getName() == getName())
continue;
if (i->getName() == shipName) {
if (inProximity(nextState(_position, _angle, _speed),
nextState(i->getPosition(), i->getAngle(), i->getSpeed()),
_captureRange)) {
if (i->getType() == object_type::freighter) {
if (_force
> dynamic_cast<Freighter*>(i.get())->getResistance()) {
std::cout << getName() << " Attacked "
<< i.get()->getName() << std::endl;
i->update();
dynamic_cast<Freighter*>(i.get())->setContainers(0);
_force++;
i.get()->setCurrentState(state::Dead);
} else {
std::cout << getName() << " Failed to Attack "
<< i.get()->getName() << std::endl;
_force--;
}
} else if (i->getType() == patrol) {
double wq =
dynamic_cast<Boat_patrol*>(i.get())->getResistance();
if (_force
> dynamic_cast<Boat_patrol*>(i.get())->getResistance()) {
std::cout << getName() << " Attacked "
<< i.get()->getName() << std::endl;
i->update();
dynamic_cast<Boat_patrol*>(i.get())->setResistance(
wq--);
_force++;
i->stop();
i->setCurrentState(Dead);
} else {
std::cout << getName() << " Failed to Attack "
<< i.get()->getName() << std::endl;
dynamic_cast<Boat_patrol*>(i.get())->setResistance(
wq++);
_force--;
}
}
} else {
throw "cant attack cruiser";
}
}
}
}
void Cruiser::status() {
this->concreteStatus();
}
Point nextState(Point a, double angle, double speed) {
return Point(a.x + std::abs(std::cos(angle) * speed),
a.y + std::abs(speed * sin(angle)));
}
Point nextState(Point a, Point b, double speed) {
Cartesian_vector q;
q.delta_x = a.x - b.x;
q.delta_y = a.y - b.y;
Polar_vector temp = Polar_vector(q);
return nextState(a, temp.r, speed);
}