summaryrefslogtreecommitdiff
path: root/src/map/skill.t.hpp
blob: 69dab8580f3dc68e203c33ccf7f4ecd8c164884d (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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#ifndef SKILL_T_HPP
#define SKILL_T_HPP

#include <cstdint>

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

// TODO remove most of these as their corresponding SkillIDs get deleted.
enum class StatusChange : uint16_t
{
    // indices into (map_session_data).status_change
    SC_SENDMAX          = 256,
#define SC_SENDMAX StatusChange::SC_SENDMAX

    // sometimes means "none", sometimes not
    NEGATIVE1           = 0xffff,
    ANY_BAD             = NEGATIVE1,

    // these ones are used by clif_status_change,
    // e.g. by the magic system
    ZERO                = 0,
    ATTACK_ICON_GENERIC = 2000,
    ATTACK_ICON_SHEARING = 2001,
    CART                = 0x0c,
    CLIF_OPTION_SC_INVISIBILITY = 0x1000,
#define CLIF_OPTION_SC_INVISIBILITY StatusChange::CLIF_OPTION_SC_INVISIBILITY
    CLIF_OPTION_SC_SCRIBE = 0x1001,
#define CLIF_OPTION_SC_SCRIBE StatusChange::CLIF_OPTION_SC_SCRIBE

    // the rest are the normal effects
    SC_SLOWPOISON       = 14,   // item script
#define SC_SLOWPOISON StatusChange::SC_SLOWPOISON

    SC_BROKNARMOR       = 32,   // ?
#define SC_BROKNARMOR StatusChange::SC_BROKNARMOR
    SC_BROKNWEAPON      = 33,   // ?
#define SC_BROKNWEAPON StatusChange::SC_BROKNWEAPON

    SC_WEIGHT50         = 35,   // ? sort of used
#define SC_WEIGHT50 StatusChange::SC_WEIGHT50
    SC_WEIGHT90         = 36,   // definitely used
#define SC_WEIGHT90 StatusChange::SC_WEIGHT90
    SC_SPEEDPOTION0     = 37,   // item script
#define SC_SPEEDPOTION0 StatusChange::SC_SPEEDPOTION0

    SC_HEALING          = 70,   // item script
#define SC_HEALING StatusChange::SC_HEALING

    SC_STONE            = 128,  // ?bad
#define SC_STONE StatusChange::SC_STONE
    SC_FREEZE           = 129,  // ?bad
#define SC_FREEZE StatusChange::SC_FREEZE
    SC_STAN             = 130,  // ?bad
#define SC_STAN StatusChange::SC_STAN
    SC_SLEEP            = 131,  // ?bad
#define SC_SLEEP StatusChange::SC_SLEEP
    SC_POISON           = 132,  // bad; actually used
#define SC_POISON StatusChange::SC_POISON
    SC_CURSE            = 133,  // ?bad
#define SC_CURSE StatusChange::SC_CURSE
    SC_SILENCE          = 134,  // ?bad
#define SC_SILENCE StatusChange::SC_SILENCE
    SC_CONFUSION        = 135,  // ?bad
#define SC_CONFUSION StatusChange::SC_CONFUSION
    SC_BLIND            = 136,  // ?bad
#define SC_BLIND StatusChange::SC_BLIND

    SC_SAFETYWALL       = 140,  // ?skill.cpp skill_unit thingies
#define SC_SAFETYWALL StatusChange::SC_SAFETYWALL
    SC_PNEUMA           = 141,  // ?skill.cpp skill_unit thingies
#define SC_PNEUMA StatusChange::SC_PNEUMA

    SC_ANKLE            = 143,  // ?skill.cpp skill_unit thingies
#define SC_ANKLE StatusChange::SC_ANKLE

    SC_ATKPOT           = 185,  // item script
#define SC_ATKPOT StatusChange::SC_ATKPOT
    SC_MATKPOT          = 186,  // unused, but kept for parallel
#define SC_MATKPOT StatusChange::SC_MATKPOT

    SC_NOCHAT           = 188,  // ? something with manner
#define SC_NOCHAT StatusChange::SC_NOCHAT

    SC_SELFDESTRUCTION  = 190,  // see table - maybe used, maybe not
#define SC_SELFDESTRUCTION StatusChange::SC_SELFDESTRUCTION

// Added for Fate's spells
    SC_HIDE             = 194,  // Hide from `detect' magic (PCs only)
#define SC_HIDE StatusChange::SC_HIDE
    SC_SHEARED          = 194,  // Has been sheared (mobs only)
#define SC_SHEARED StatusChange::SC_SHEARED
    SC_HALT_REGENERATE  = 195,  // Suspend regeneration
#define SC_HALT_REGENERATE StatusChange::SC_HALT_REGENERATE
    SC_FLYING_BACKPACK  = 196,  // Flying backpack
#define SC_FLYING_BACKPACK StatusChange::SC_FLYING_BACKPACK
    SC_MBARRIER         = 197,  // Magical barrier, magic resistance (val1 : power (%))
#define SC_MBARRIER StatusChange::SC_MBARRIER
    SC_HASTE            = 198,  // `Haste' spell (val1 : power)
#define SC_HASTE StatusChange::SC_HASTE
    SC_PHYS_SHIELD      = 199,  // `Protect' spell, reduce damage (val1: power)
#define SC_PHYS_SHIELD StatusChange::SC_PHYS_SHIELD
    MAX_STATUSCHANGE    = 200,
#define MAX_STATUSCHANGE StatusChange::MAX_STATUSCHANGE
};

constexpr
StatusChange MAJOR_STATUS_EFFECTS[] =
{
    SC_STONE,
    SC_FREEZE,
    SC_STAN,
    SC_SLEEP,
    SC_POISON,
    SC_CURSE,
    SC_SILENCE,
    SC_CONFUSION,
    SC_BLIND,
};

constexpr
StatusChange MAJOR_STATUS_EFFECTS_1[] =
{
    SC_STONE,
    SC_FREEZE,
    SC_STAN,
    SC_SLEEP,
};

// needed to work around some subtractative indexing
// I think it *might* be able to be totally removed.
enum class BadSC
{
    STONE       = 0,
    FREEZE      = 1,
    STAN        = 2,
    SLEEP       = 3,
    POISON      = 4,
    CURSE       = 5,
    SILENCE     = 6,
    CONFUSION   = 7,
    BLIND       = 8,

    COUNT       = 9, // formerly 10,
    // there is apocryphal evidence of a "bleeding" effect
};

constexpr
StatusChange BadSC_to_SC(BadSC bsc)
{
    return StatusChange(uint16_t(SC_STONE) + int(bsc));
}

constexpr
BadSC BadSC_from_SC(StatusChange sc)
{
    return BadSC(uint16_t(sc) - uint16_t(SC_STONE));
}

// TODO remove most of these
enum class SkillID : uint16_t
{
    // TODO: Remove these!
    NEGATIVE            = 0xffff,
    ZERO                = 0x0000,
    ONE                 = 0x0001,

    // Basic skills.
    // These should probably be made unconditional.
    NV_EMOTE            = 1,    //
#define NV_EMOTE SkillID::NV_EMOTE
    NV_TRADE            = 2,    //
#define NV_TRADE SkillID::NV_TRADE
    NV_PARTY            = 3,    //
#define NV_PARTY SkillID::NV_PARTY

    AC_OWL              = 45,   // Mallard's Eye
#define AC_OWL SkillID::AC_OWL

    NPC_SELFDESTRUCTION = 175,  //
#define NPC_SELFDESTRUCTION SkillID::NPC_SELFDESTRUCTION

    NPC_POISON          = 178,  //
#define NPC_POISON SkillID::NPC_POISON

    NPC_SUMMONSLAVE     = 198,  //
#define NPC_SUMMONSLAVE SkillID::NPC_SUMMONSLAVE
    NPC_EMOTION         = 199,  //
#define NPC_EMOTION SkillID::NPC_EMOTION

    TMW_SKILLPOOL       = 339,  // skill pool size
#define TMW_SKILLPOOL SkillID::TMW_SKILLPOOL

    // magic skills
    TMW_MAGIC           = 340,  //
#define TMW_MAGIC SkillID::TMW_MAGIC
    TMW_MAGIC_LIFE      = 341,  //
#define TMW_MAGIC_LIFE SkillID::TMW_MAGIC_LIFE
    TMW_MAGIC_WAR       = 342,  //
#define TMW_MAGIC_WAR SkillID::TMW_MAGIC_WAR
    TMW_MAGIC_TRANSMUTE = 343,  //
#define TMW_MAGIC_TRANSMUTE SkillID::TMW_MAGIC_TRANSMUTE
    TMW_MAGIC_NATURE    = 344,  //
#define TMW_MAGIC_NATURE SkillID::TMW_MAGIC_NATURE
    TMW_MAGIC_ETHER     = 345,  //
#define TMW_MAGIC_ETHER SkillID::TMW_MAGIC_ETHER
    TMW_MAGIC_DARK      = 346,  //
#define TMW_MAGIC_DARK SkillID::TMW_MAGIC_DARK
    TMW_MAGIC_LIGHT     = 347,  //
#define TMW_MAGIC_LIGHT SkillID::TMW_MAGIC_LIGHT

    // focusable skills
    TMW_BRAWLING        = 350,  //
#define TMW_BRAWLING SkillID::TMW_BRAWLING
    TMW_LUCKY_COUNTER   = 351,  //
#define TMW_LUCKY_COUNTER SkillID::TMW_LUCKY_COUNTER
    TMW_SPEED           = 352,  //
#define TMW_SPEED SkillID::TMW_SPEED
    TMW_RESIST_POISON   = 353,  //
#define TMW_RESIST_POISON SkillID::TMW_RESIST_POISON
    TMW_ASTRAL_SOUL     = 354,  //
#define TMW_ASTRAL_SOUL SkillID::TMW_ASTRAL_SOUL
    TMW_RAGING          = 355,  //
#define TMW_RAGING SkillID::TMW_RAGING

    // Note: this value is also hard-coded in common/mmo.hpp
    MAX_SKILL_DB        = 474, // not 450
#define MAX_SKILL_DB SkillID::MAX_SKILL_DB
};

namespace e
{
enum class SkillFlags : uint16_t
{
    ZERO        = 0x00,
    // is a pool skill
    FLAG        = 0x01,
#define SKILL_POOL_FLAG SkillFlags::FLAG
    // is an active pool skill
    ACTIVE      = 0x02,
#define SKILL_POOL_ACTIVE SkillFlags::ACTIVE
    // pool skill has been activated (used for clif)
    ACTIVATED   = 0x04,
#define SKILL_POOL_ACTIVATED SkillFlags::ACTIVATED
};
ENUM_BITWISE_OPERATORS(SkillFlags)
}
using e::SkillFlags;

#endif // SKILL_T_HPP