]> git.localhorst.tv Git - l2e.git/blob - src/common/Capsule.cpp
extracted common capsule base
[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 Uint16 Capsule::MaxHealth() const {
43         return maxHealth + GetClass().healthBoost;
44 }
45
46
47 Stats Capsule::GetStats() {
48         return stats + GetClass().statBoost;
49 }
50
51 int Capsule::NextLevel() const {
52         int levelOffset(Level() - 1);
53         if (levelOffset < numLevels) {
54                 return levelLadder[levelOffset] - Experience();
55         } else {
56                 return 0;
57         }
58 }
59
60
61 Sprite *Capsule::BattleSprite() {
62         return GetClass().battleSprite;
63 }
64
65 const Sprite *Capsule::BattleSprite() const {
66         return GetClass().battleSprite;
67 }
68
69 Animation *Capsule::MeleeAnimation() {
70         return GetClass().meleeAnimation;
71 }
72
73 Animation *Capsule::AttackAnimation() {
74         return GetClass().attackAnimation;
75 }
76
77 Animation *Capsule::SpellAnimation() {
78         return GetClass().spellAnimation;
79 }
80
81
82 Capsule::Class &Capsule::GetClass() {
83         assert(classes && curClass < numClasses);
84         return classes[curClass];
85 }
86
87 const Capsule::Class &Capsule::GetClass() const {
88         assert(classes && curClass < numClasses);
89         return classes[curClass];
90 }
91
92
93 Capsule::Class::Class()
94 : name(0)
95 , tribe(0)
96 , battleSprite(0)
97 , meleeAnimation(0)
98 , attackAnimation(0)
99 , spellAnimation(0)
100
101 , healthBoost(0) {
102         attacks[0] = 0;
103         attacks[1] = 0;
104         attacks[2] = 0;
105 }
106
107
108 void Capsule::CreateTypeDescription() {
109         Capsule c;
110
111         TypeDescription &td(TypeDescription::Create(TYPE_ID, "Capsule"));
112         td.SetConstructor(&Construct);
113         td.SetSize(sizeof(Capsule));
114
115         td.AddField("name", FieldDescription(((char *)&c.name) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
116         td.AddField("alignment", FieldDescription(((char *)&c.alignment) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
117
118         td.AddField("maxHealth", FieldDescription(((char *)&c.maxHealth) - ((char *)&c), Interpreter::NUMBER_ID));
119
120         td.AddField("stats", FieldDescription(((char *)&c.stats) - ((char *)&c), Stats::TYPE_ID));
121
122         td.AddField("level", FieldDescription(((char *)&c.level) - ((char *)&c), Interpreter::NUMBER_ID));
123         td.AddField("experience", FieldDescription(((char *)&c.experience) - ((char *)&c), Interpreter::NUMBER_ID));
124
125         td.AddField("ladder", FieldDescription(((char *)&c.levelLadder) - ((char *)&c), Interpreter::NUMBER_ID).SetReferenced().SetAggregate());
126
127         td.AddField("classes", FieldDescription(((char *)&c.classes) - ((char *)&c), Class::TYPE_ID).SetReferenced().SetAggregate());
128         td.AddField("class", FieldDescription(((char *)&c.curClass) - ((char *)&c), Interpreter::NUMBER_ID));
129         td.AddField("maxClass", FieldDescription(((char *)&c.maxClass) - ((char *)&c), Interpreter::NUMBER_ID));
130
131         Class::CreateTypeDescription();
132 }
133
134 void Capsule::Construct(void *data) {
135         new (data) Capsule;
136 }
137
138
139 void Capsule::Class::CreateTypeDescription() {
140         Class c;
141
142         TypeDescription &td(TypeDescription::Create(TYPE_ID, "CapsuleClass"));
143         td.SetConstructor(&Construct);
144         td.SetSize(sizeof(Class));
145
146         td.AddField("name", FieldDescription(((char *)&c.name) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
147         td.AddField("tribe", FieldDescription(((char *)&c.tribe) - ((char *)&c), Interpreter::STRING_ID).SetReferenced());
148
149         td.AddField("attack1", FieldDescription(((char *)&c.attacks[0]) - ((char *)&c), Spell::TYPE_ID).SetReferenced());
150         td.AddField("attack2", FieldDescription(((char *)&c.attacks[1]) - ((char *)&c), Spell::TYPE_ID).SetReferenced());
151         td.AddField("attack3", FieldDescription(((char *)&c.attacks[2]) - ((char *)&c), Spell::TYPE_ID).SetReferenced());
152
153         td.AddField("battleSprite", FieldDescription(((char *)&c.battleSprite) - ((char *)&c), Sprite::TYPE_ID).SetReferenced());
154         td.AddField("meleeAnimation", FieldDescription(((char *)&c.meleeAnimation) - ((char *)&c), Animation::TYPE_ID).SetReferenced());
155         td.AddField("attackAnimation", FieldDescription(((char *)&c.attackAnimation) - ((char *)&c), Animation::TYPE_ID).SetReferenced());
156         td.AddField("spellAnimation", FieldDescription(((char *)&c.spellAnimation) - ((char *)&c), Animation::TYPE_ID).SetReferenced());
157
158         td.AddField("healthBoost", FieldDescription(((char *)&c.healthBoost) - ((char *)&c), Interpreter::NUMBER_ID));
159         td.AddField("statBoost", FieldDescription(((char *)&c.statBoost) - ((char *)&c), Stats::TYPE_ID));
160 }
161
162 void Capsule::Class::Construct(void *data) {
163         new (data) Capsule::Class;
164 }
165
166 }