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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
#ifndef TIBIA_CREATURE_HH_
#define TIBIA_CREATURE_HH_ 1
#include "main.hh"
struct TCreature;
struct TSkill{
// REGULAR FUNCTIONS
// =========================================================================
TSkill(int SkNr, TCreature *Master);
int Get(void);
int GetProgress(void);
void Check(void);
void Change(int Amount);
void SetMDAct(int MDAct);
void Load(int Act, int Max, int Min, int DAct, int MDAct,
int Cycle, int MaxCycle, int Count, int MaxCount, int AddLevel,
int Exp, int FactorPercent, int NextLevel, int Delta);
void Save(int *Act, int *Max, int *Min, int *DAct, int *MDAct,
int *Cycle, int *MaxCycle, int *Count, int *MaxCount, int *AddLevel,
int *Exp, int *FactorPercent, int *NextLevel, int *Delta);
// VIRTUAL FUNCTIONS
// =========================================================================
virtual ~TSkill(void); // VTABLE[ 0]
// Duplicate destructor that also calls operator delete. // VTABLE[ 1]
virtual void Set(int Value); // VTABLE[ 2]
virtual void Increase(int Amount); // VTABLE[ 3]
virtual void Decrease(int Amount); // VTABLE[ 4]
virtual int GetExpForLevel(int Level); // VTABLE[ 5]
virtual void Advance(int Range); // VTABLE[ 6]
virtual void ChangeSkill(int FactorPercent, int Delta); // VTABLE[ 7]
virtual int ProbeValue(int Max, bool Increase); // VTABLE[ 8]
virtual bool Probe(int Diff, int Prob, bool Increase); // VTABLE[ 9]
virtual bool Process(void); // VTABLE[10]
virtual bool SetTimer(int Cycle, int Count, int MaxCount, int AdditionalValue); // VTABLE[11]
virtual bool DelTimer(void); // VTABLE[12]
virtual int TimerValue(void); // VTABLE[13]
virtual bool Jump(int Range); // VTABLE[14]
virtual void Event(int Range); // VTABLE[15]
virtual void Reset(void); // VTABLE[16]
// DATA
// =========================================================================
//void *VTABLE; // IMPLICIT
int DAct; // Delta Value - Probably from equipment.
int MDAct; // Delta Magic Value - Probably from spells.
uint16 SkNr;
TCreature *Master;
int Act; // Actual Value (?)
int Max;
int Min;
int FactorPercent;
int LastLevel;
int NextLevel;
int Delta;
int Exp;
int Cycle;
int MaxCycle;
int Count;
int MaxCount;
int AddLevel;
};
struct TSkillLevel: TSkill {
void Increase(int Amount) override;
void Decrease(int Amount) override;
int GetExpForLevel(int Level) override;
bool Jump(int Range) override;
};
struct TSkillProbe: TSkill {
void Increase(int Amount) override;
void Decrease(int Amount) override;
int GetExpForLevel(int Level) override;
void ChangeSkill(int FactorPercent, int Delta) override;
int ProbeValue(int Max, bool Increase) override;
bool Probe(int Diff, int Prob, bool Increase) override;
bool SetTimer(int Cycle, int Count, int MaxCount, int AdditionalValue) override;
bool Jump(int Range) override;
void Event(int Range) override;
};
struct TSkillAdd: TSkill {
void Advance(int Range) override;
};
struct TSkillHitpoints: TSkillAdd {
void Set(int Value) override;
};
struct TSkillMana: TSkillAdd {
void Set(int Value) override;
};
struct TSkillGoStrength: TSkillAdd {
bool SetTimer(int Cycle, int Count, int MaxCount, int AdditionalValue) override;
void Event(int Range) override;
};
struct TSkillCarryStrength: TSkillAdd {
void Set(int Value) override;
};
struct TSkillSoulpoints: TSkillAdd {
void Set(int Value) override;
int TimerValue(void) override;
void Event(int Range) override;
};
struct TSkillFed: TSkill {
void Event(int Range) override;
};
struct TSkillLight: TSkill {
bool SetTimer(int Cycle, int Count, int MaxCount, int AdditionalValue) override;
void Event(int Range) override;
};
struct TSkillIllusion: TSkill {
bool SetTimer(int Cycle, int Count, int MaxCount, int AdditionalValue) override;
void Event(int Range) override;
};
struct TSkillPoison: TSkill {
bool Process(void) override;
bool SetTimer(int Cycle, int Count, int MaxCount, int AdditionalValue) override;
void Event(int Range) override;
void Reset(void) override;
};
struct TSkillBurning: TSkill {
void Event(int Range) override;
};
struct TSkillEnergy: TSkill {
void Event(int Range) override;
};
struct TSkillBase{
// REGULAR FUNCTIONS
// =========================================================================
TSkillBase(void);
~TSkillBase(void);
bool NewSkill(uint16 SkillNo, TCreature *Creature);
bool SetSkills(int Race);
void ProcessSkills(void);
bool SetTimer(uint16 SkNr, int Cycle, int Count, int MaxCount, int AdditionalValue);
void DelTimer(uint16 SkNr);
// DATA
// =========================================================================
TSkill *Skills[25];
TSkill *TimerList[25];
uint16 FirstFreeTimer;
};
// TODO(fusion): Maybe split this file?
//==============================================================================
struct TCombatEntry{
uint32 ID;
uint32 Damage;
int TimeStamp;
};
struct TCombat{
TCreature *Master;
uint32 EarliestAttackTime;
uint32 EarliestDefendTime;
uint32 LastDefendTime;
uint32 LatestAttackTime;
uint32 AttackMode;
uint32 ChaseMode;
uint32 SecureMode;
uint32 AttackDest;
bool Following;
Object Shield;
Object Close;
Object Missile;
Object Throw;
Object Wand;
Object Ammo;
bool Fist;
uint32 CombatDamage;
int ActCombatEntry;
TCombatEntry CombatList[20];
int LearningPoints;
};
struct TOutfit{
int OutfitID;
union{
uint16 ObjectType;
uint8 Colors[4];
};
};
struct TCreature: TSkillBase {
// REGULAR FUNCTIONS
// =========================================================================
// TODO
// VIRTUAL FUNCTIONS
// =========================================================================
virtual ~TCreature(void); // VTABLE[ 0]
// Duplicate destructor that also calls operator delete. // VTABLE[ 1]
virtual void Death(void); // VTABLE[ 2]
virtual void MovePossible(void); // VTABLE[ 3]
virtual void IsPeaceful(void); // VTABLE[ 4]
virtual void GetMaster(void); // VTABLE[ 5]
virtual void TalkStimulus(void); // VTABLE[ 6]
virtual void DamageStimulus(void); // VTABLE[ 7]
virtual void IdleStimulus(void); // VTABLE[ 8]
virtual void CreatureMoveStimulus(void); // VTABLE[ 9]
virtual void AttackStimulus(void); // VTABLE[10]
// DATA
// =========================================================================
//void *VTABLE; // IMPLICIT
//TSkillBase super_TSkillBase; // IMPLICIT
TCombat Combat;
uint32 ID;
TCreature *NextHashEntry;
uint32 NextChainCreature;
char Name[31];
char Murderer[31];
TOutfit OrgOutfit;
TOutfit Outfit;
int startx;
int starty;
int startz;
int posx;
int posy;
int posz;
int Sex;
int Race;
int Direction;
int Radius;
CreatureType Type;
bool IsDead;
int LoseInventory;
bool LoggingOut;
bool LogoutAllowed;
uint32 EarliestLogoutRound;
uint32 EarliestProtectionZoneRound;
uint32 EarliestYellRound;
uint32 EarliestTradeChannelRound;
uint32 EarliestSpellTime;
uint32 EarliestMultiuseTime;
uint32 EarliestWalkTime;
uint32 LifeEndRound;
TKnownCreature *FirstKnowingConnection;
int SummonedCreatures;
uint32 FireDamageOrigin;
uint32 PoisonDamageOrigin;
uint32 EnergyDamageOrigin;
Object CrObject;
vector<TToDoEntry> ToDoList;
int ActToDo;
int NrToDo;
uint32 NextWakeup;
bool Stop;
bool LockToDo;
uint8 Profession;
TConnection *Connection;
};
#endif //TIBIA_CREATURE_HH_
|