aboutsummaryrefslogtreecommitdiff
path: root/src/unit/inc/unit.h
blob: 4a5ace74d252dabb9a3b2fab394e8615df0a3368 (plain) (blame)
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
125
126
127
128
129
130
131
132
133
134
#ifndef UNIT_H
#define UNIT_H

#include <camera.h>
#include <gfx.h>
#include <sfx.h>
#include <instance.h>
#include <resource_type.h>
#include <tech.h>
#include <unit_type.h>
#include <util.h>
#include <fixmath.h>
#include <stdbool.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct unit_tech
{
    enum tech_level carry;
};

enum unit_state
{
    UNIT_STATE_IDLE_MOVING,
    UNIT_STATE_SHELTERED,
    UNIT_STATE_HARVESTING_WOOD,
    UNIT_STATE_HARVESTING_GOLD,
    UNIT_STATE_CARRYING,
    UNIT_STATE_ATTACKING
};

struct unit_target
{
    struct instance *ins;
    enum unit_state state;
    instance_sheltered_cb shelter;
    instance_attacked_cb attack;
    instance_done_cb done;
    void *op;
};

struct unit
{
    struct instance instance;
    enum unit_type type;

    enum unit_dir
    {
        UNIT_DIR_N,
        UNIT_DIR_NE,
        UNIT_DIR_E,
        UNIT_DIR_SE,
        UNIT_DIR_S,
        UNIT_DIR_SW,
        UNIT_DIR_W,
        UNIT_DIR_NW,

        MAX_UNIT_DIRECTIONS
    } dir;

    enum unit_state state;

    struct
    {
        unsigned char t, i;
    } frame;

    union
    {
        struct unit_harvester
        {
            enum resource_type type;
            unsigned char carry, t;
            struct unit_target prev_target;
        } harvester;
    } us;

    fix16_t rx, ry, tx, ty;

    struct unit_target target;
};

UTIL_STATIC_ASSERT(!offsetof(struct unit, instance), "must be at offset zero");

struct unit_cfg
{
    enum unit_type type;
    unsigned long x, y;
};

void unit_create(const struct unit_cfg *cfg, struct unit *u);
int unit_render(const struct unit *u, const struct camera *cam, bool sel);
bool unit_can_harvest(const struct unit *u);
bool unit_target_valid(const struct unit *u, const struct unit_target *t);
void unit_set_target(struct unit *u, const struct unit_target *t);
void unit_move_to(struct unit *u, unsigned long x, unsigned long y);
bool unit_attacked(struct instance *, instance_hp ap);
void unit_update(const struct unit_tech *t, struct unit *u);
instance_hp unit_maxhp(const struct unit *u);
const char *unit_str(const struct unit *u);

enum
{
    UNIT_SPRITE_N,
    UNIT_SPRITE_NE,
    UNIT_SPRITE_E,
    UNIT_SPRITE_SE,
    UNIT_SPRITE_S,

    MAX_UNIT_SPRIES
};

extern struct sprite unit_sprites[MAX_UNIT_SPRIES];

enum unit_sound
{
    UNIT_SOUND_SELECTED,
    UNIT_SOUND_MOVE,
    UNIT_SOUND_MOVE_2,

    MAX_UNIT_SOUNDS
};

extern struct sound unit_sounds[MAX_UNIT_SOUNDS];

#ifdef __cplusplus
}
#endif

#endif /* UNIT_H */