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
|