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
|
#ifndef PLAYERCONTROL_H
#define PLAYERCONTROL_H
#include <iostream>
#include "gst.h"
#include "view.h"
#include <vector>
#include <functional>
enum pc_state {
select,
move,
attack,
train,
build,
merge,
trade,
age_up,
heal,
power,
move_target,
attack_target,
menu_train,
menu_build,
target_build,
merge_target,
target_heal,
menu_power,
target_power,
menu_unit,
menu_day,
end
};
enum pc_action {
sel_unit,
sel_ground,
opt,
back
};
class Fsm;
using lambda = std::function<pc_state(Gst&, View&, Fsm&, int p)>;
class Arc {
public:
Arc (pc_state from, pc_action act, int p, lambda f)
: from(from), act(act), p(p), f(f) {};
pc_state from;
pc_action act;
int p;
lambda f;
};
class Fsm {
public:
Fsm() { state = select; }
void transition (Gst &gst, View &view, Fsm &fsm, pc_action act, int p) {
std::cout << "> transitioning from " << state << " with " << act << std::endl;
for (Arc a : arcs) {
if (a.from == state && a.act == act && (a.p == p || a.p == -1)) {
state = a.f(gst, view, fsm, p);
break;
}
}
}
std::vector<Arc> arcs;
private:
pc_state state;
};
class Player_control {
public:
Player_control ();
void process (Gst &gst, View &view);
Fsm fsm;
};
#endif
|