summaryrefslogtreecommitdiff
path: root/src/map/magic-interpreter.t.hpp
blob: 26dc8d9ee1cea21658a5de9afd2ff8b0f543b6f4 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#ifndef MAGIC_INTERPRETER_T_HPP
#define MAGIC_INTERPRETER_T_HPP

#include "../common/utils2.hpp"

enum class SPELLARG : uint8_t
{
    NONE,
#define SPELLARG_NONE SPELLARG::NONE
    PC,
#define SPELLARG_PC SPELLARG::PC
    STRING,
#define SPELLARG_STRING SPELLARG::STRING
};

enum class TY : uint8_t
{
    UNDEF,
#define TY_UNDEF TY::UNDEF
    INT,
#define TY_INT TY::INT
    DIR,
#define TY_DIR TY::DIR
    STRING,
#define TY_STRING TY::STRING
    ENTITY,
#define TY_ENTITY TY::ENTITY
    LOCATION,
#define TY_LOCATION TY::LOCATION
    AREA,
#define TY_AREA TY::AREA
    SPELL,
#define TY_SPELL TY::SPELL
    INVOCATION,
#define TY_INVOCATION TY::INVOCATION
    FAIL = 127,
#define TY_FAIL TY::FAIL

    NEGATIVE_1 = 255,
};

// Note: there is also a typedef by this name in <dirent.h>
// but we should be fine since we never include it.
// (in the long term we should still rename this though)
enum class DIR : uint8_t
{
    S   = 0,
#define DIR_S DIR::S
    SW  = 1,
#define DIR_SW DIR::SW
    W   = 2,
#define DIR_W DIR::W
    NW  = 3,
#define DIR_NW DIR::NW
    N   = 4,
#define DIR_N DIR::N
    NE  = 5,
#define DIR_NE DIR::NE
    E   = 6,
#define DIR_E DIR::E
    SE  = 7,
#define DIR_SE DIR::SE

    COUNT,
};

constexpr
earray<int, DIR, DIR::COUNT> dirx //=
{{
    0, -1, -1, -1, 0, 1, 1, 1,
}}, diry //=
{{
    1, 1, 0, -1, -1, -1, 0, 1,
}};

constexpr
bool dir_is_diagonal(DIR d)
{
    return static_cast<uint8_t>(d) & 1;
}

enum class AREA : uint8_t
{
    LOCATION,
#define AREA_LOCATION AREA::LOCATION
    UNION,
#define AREA_UNION AREA::UNION
    RECT,
#define AREA_RECT AREA::RECT
    BAR,
#define AREA_BAR AREA::BAR
};

enum class EXPR : uint8_t
{
    VAL,
#define EXPR_VAL EXPR::VAL
    LOCATION,
#define EXPR_LOCATION EXPR::LOCATION
    AREA,
#define EXPR_AREA EXPR::AREA
    FUNAPP,
#define EXPR_FUNAPP EXPR::FUNAPP
    ID,
#define EXPR_ID EXPR::ID
    SPELLFIELD,
#define EXPR_SPELLFIELD EXPR::SPELLFIELD
};

// temporary rename to avoid collision with enum value
// in magic-interpreter-parser
enum class EFFECT_ : uint8_t
{
    SKIP,
#define EFFECT_SKIP EFFECT_::SKIP
    ABORT,
#define EFFECT_ABORT EFFECT_::ABORT
    ASSIGN,
#define EFFECT_ASSIGN EFFECT_::ASSIGN
    FOREACH,
#define EFFECT_FOREACH EFFECT_::FOREACH
    FOR,
#define EFFECT_FOR EFFECT_::FOR
    IF,
#define EFFECT_IF EFFECT_::IF
    SLEEP,
#define EFFECT_SLEEP EFFECT_::SLEEP
    // temporary rename to avoid collision with NpcSubtype
    SCRIPT_,
#define EFFECT_SCRIPT EFFECT_::SCRIPT_
    BREAK,
#define EFFECT_BREAK EFFECT_::BREAK
    OP,
#define EFFECT_OP EFFECT_::OP
    END,
#define EFFECT_END EFFECT_::END
    CALL,
#define EFFECT_CALL EFFECT_::CALL
};

enum class FOREACH_FILTER : uint8_t
{
    MOB,
#define FOREACH_FILTER_MOB FOREACH_FILTER::MOB
    PC,
#define FOREACH_FILTER_PC FOREACH_FILTER::PC
    ENTITY,
#define FOREACH_FILTER_ENTITY FOREACH_FILTER::ENTITY
    TARGET,
#define FOREACH_FILTER_TARGET FOREACH_FILTER::TARGET
    SPELL,
#define FOREACH_FILTER_SPELL FOREACH_FILTER::SPELL
    NPC,
#define FOREACH_FILTER_NPC FOREACH_FILTER::NPC
};

enum class SPELLGUARD : uint8_t
{
    CONDITION,
#define SPELLGUARD_CONDITION SPELLGUARD::CONDITION
    COMPONENTS,
#define SPELLGUARD_COMPONENTS SPELLGUARD::COMPONENTS
    CATALYSTS,
#define SPELLGUARD_CATALYSTS SPELLGUARD::CATALYSTS
    CHOICE,
#define SPELLGUARD_CHOICE SPELLGUARD::CHOICE
    MANA,
#define SPELLGUARD_MANA SPELLGUARD::MANA
    CASTTIME,
#define SPELLGUARD_CASTTIME SPELLGUARD::CASTTIME
    EFFECT,
#define SPELLGUARD_EFFECT SPELLGUARD::EFFECT
};

namespace e
{
enum class SPELL_FLAG : uint8_t
{
    ZERO        = 0,

    // spell associated not with caster but with place
    LOCAL       = 1 << 0,
#define SPELL_FLAG_LOCAL SPELL_FLAG::LOCAL
    // spell invocation never uttered
    SILENT      = 1 << 1,
#define SPELL_FLAG_SILENT SPELL_FLAG::SILENT
    // `magic word' only:  don't require spellcasting ability
    NONMAGIC    = 1 << 2,
#define SPELL_FLAG_NONMAGIC SPELL_FLAG::NONMAGIC
};
ENUM_BITWISE_OPERATORS(SPELL_FLAG)
}
using e::SPELL_FLAG;

enum class CONT_STACK : uint8_t
{
    FOREACH,
#define CONT_STACK_FOREACH CONT_STACK::FOREACH
    FOR,
#define CONT_STACK_FOR CONT_STACK::FOR
    PROC,
#define CONT_STACK_PROC CONT_STACK::PROC
};

namespace e
{
enum class INVOCATION_FLAG : uint8_t
{
    ZERO        = 0,

    // Bound directly to the caster (i.e., ignore its location)
    BOUND       = 1 << 0,
#define INVOCATION_FLAG_BOUND INVOCATION_FLAG::BOUND
    // Used `abort' to terminate
    ABORTED     = 1 << 1,
#define INVOCATION_FLAG_ABORTED INVOCATION_FLAG::ABORTED
    // On magical attacks: if we run out of steam, stop attacking altogether
    STOPATTACK  = 1 << 2,
#define INVOCATION_FLAG_STOPATTACK INVOCATION_FLAG::STOPATTACK
};
ENUM_BITWISE_OPERATORS(INVOCATION_FLAG)
}
using e::INVOCATION_FLAG;

#endif // MAGIC_INTERPRETER_T_HPP