aboutsummaryrefslogtreecommitdiff
path: root/game/playercontrol.h
blob: d6b1fd7db87ebe00afa32635d43b929015ed56c3 (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
#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,
    target_convert,
    menu_power,
    target_power,
    menu_unit,
    menu_day,
    menu_tech,
    menu_trade,
    menu_age_up,
    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