]> git.localhorst.tv Git - l2e.git/blob - src/common/Capsule.cpp
8fa1ca92e030ea5722aa94affce1c668aa7d0de3
[l2e.git] / src / common / Capsule.cpp
1 #include "Capsule.h"
2
3 #include "../common/Spell.h"
4 #include "../common/Stats.h"
5 #include "../graphics/Animation.h"
6 #include "../graphics/Sprite.h"
7 #include "../loader/Interpreter.h"
8 #include "../loader/TypeDescription.h"
9
10 #include <cassert>
11
12 using common::Spell;
13 using common::Stats;
14 using graphics::Animation;
15 using graphics::Sprite;
16 using loader::FieldDescription;
17 using loader::Interpreter;
18 using loader::TypeDescription;
19
20 namespace common {
21
22 Capsule::Capsule()
23 : name("")
24 , alignment("")
25
26 , maxHealth(0)
27
28 , level(1)
29 , experience(0)
30
31 , levelLadder(0)
32 , numLevels(0)
33
34 , classes(0)
35 , numClasses(0)
36 , curClass(0)
37 , maxClass(0) {
38
39 }
40
41
42 const char *Capsule::ClassName() const {
43         return GetClass().name;
44 }
45
46 const char *Capsule::Tribe() const {
47         return GetClass().tribe;
48 }
49
50 const Spell *Capsule::Attack1() const {
51         return GetClass().attacks[0];
52 }
53
54 const Spell *Capsule::Attack2() const {
55         return GetClass().attacks[1];
56 }
57
58 const Spell *Capsule::Attack3() const {
59         return GetClass().attacks[2];
60 }
61
62
63 Uint16 Capsule::MaxHealth() const {
64         return maxHealth + GetClass().healthBoost;
65 }
66
67
68 Stats Capsule::GetStats() const {
69         return stats + GetClass().statBoost;
70 }
71
72 int Capsule::NextLevel() const {
73         int levelOffset(Level() - 1);
74         if (levelOffset < numLevels) {
75                 return levelLadder[levelOffset] - Experience();
76         } else {
77                 return 0;
78         }
79 }
80
81
82 Sprite *Capsule::BattleSprite() {
83         return GetClass().battleSprite;
84 }
85
86 const Sprite *Capsule::BattleSprite() const {
87         return GetClass().battleSprite;
88 }
89
90 Animation *Capsule::MeleeAnimation() {
91         return GetClass().meleeAnimation;
92 }
93
94 Animation *Capsule::AttackAnimation() {
95         return GetClass().attackAnimation;
96 }
97
98 Animation *Capsule::SpellAnimation() {
99         return GetClass().spellAnimation;
100 }
101
102
103 Capsule::Class &Capsule::GetClass() {
104         assert(classes && curClass < numClasses);
105         return classes[curClass];
106 }
107
108 const Capsule::Class &Capsule::GetClass() const {
109         assert(classes && curClass < numClasses);
110         return classes[curClass];
111 }
112
113
114 Capsule::Class::Class()
115 : name(0)
116 , tribe(0)
117 , battleSprite(0)
118 , meleeAnimation(0)
119 , attackAnimation(0)
120 , spellAnimation(0)
121
122 , healthBoost(0) {
123         attacks[0] = 0;
124         attacks[1] = 0;
125         attacks[2] = 0;
126 }
127
128
129 void Capsule::CreateTypeDescription() {
130         Capsule c;
131
132         TypeDescription &td(TypeDescription::Create(TYPE_ID, "Capsule"));
133         td.SetConstructor(&Construct);
134         td.SetSize(sizeof(Capsule));
135
136         td.AddField("name", FieldDescription(((char *)&c.name) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
137         td.AddField("alignment", FieldDescription(((char *)&c.alignment) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
138
139         td.AddField("maxHealth", FieldDescription(((char *)&c.maxHealth) - ((char *)&c), Interpreter::NUMBER_ID));
140
141         td.AddField("stats", FieldDescription(((char *)&c.stats) - ((char *)&c), Stats::TYPE_ID));
142
143         td.AddField("level", FieldDescription(((char *)&c.level) - ((char *)&c), Interpreter::NUMBER_ID));
144         td.AddField("experience", FieldDescription(((char *)&c.experience) - ((char *)&c), Interpreter::NUMBER_ID));
145
146         td.AddField("ladder", FieldDescription(((char *)&c.levelLadder) - ((char *)&c), Interpreter::NUMBER_ID).SetReferenced().SetAggregate());
147
148         td.AddField("classes", FieldDescription(((char *)&c.classes) - ((char *)&c), Class::TYPE_ID).SetReferenced().SetAggregate());
149         td.AddField("class", FieldDescription(((char *)&c.curClass) - ((char *)&c), Interpreter::NUMBER_ID));
150         td.AddField("maxClass", FieldDescription(((char *)&c.maxClass) - ((char *)&c), Interpreter::NUMBER_ID));
151
152         Class::CreateTypeDescription();
153 }
154
155 void Capsule::Construct(void *data) {
156         new (data) Capsule;
157 }
158
159
160 void Capsule::Class::CreateTypeDescription() {
161         Class c;
162
163         TypeDescription &td(TypeDescription::Create(TYPE_ID, "CapsuleClass"));
164         td.SetConstructor(&Construct);
165         td.SetSize(sizeof(Class));
166
167         td.AddField("name", FieldDescription(((char *)&c.name) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
168         td.AddField("tribe", FieldDescription(((char *)&c.tribe) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
169
170         td.AddField("attack1", FieldDescription(((char *)&c.attacks[0]) - ((char *)&c), Spell::TYPE_ID).SetReferenced());
171         td.AddField("attack2", FieldDescription(((char *)&c.attacks[1]) - ((char *)&c), Spell::TYPE_ID).SetReferenced());
172         td.AddField("attack3", FieldDescription(((char *)&c.attacks[2]) - ((char *)&c), Spell::TYPE_ID).SetReferenced());
173
174         td.AddField("battleSprite", FieldDescription(((char *)&c.battleSprite) - ((char *)&c), Sprite::TYPE_ID).SetReferenced());
175         td.AddField("meleeAnimation", FieldDescription(((char *)&c.meleeAnimation) - ((char *)&c), Animation::TYPE_ID).SetReferenced());
176         td.AddField("attackAnimation", FieldDescription(((char *)&c.attackAnimation) - ((char *)&c), Animation::TYPE_ID).SetReferenced());
177         td.AddField("spellAnimation", FieldDescription(((char *)&c.spellAnimation) - ((char *)&c), Animation::TYPE_ID).SetReferenced());
178
179         td.AddField("healthBoost", FieldDescription(((char *)&c.healthBoost) - ((char *)&c), Interpreter::NUMBER_ID));
180         td.AddField("statBoost", FieldDescription(((char *)&c.statBoost) - ((char *)&c), Stats::TYPE_ID));
181 }
182
183 void Capsule::Class::Construct(void *data) {
184         new (data) Capsule::Class;
185 }
186
187 }