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"
14 using graphics::Animation;
15 using graphics::Sprite;
16 using loader::FieldDescription;
17 using loader::Interpreter;
18 using loader::TypeDescription;
42 const char *Capsule::ClassName() const {
43 return GetClass().name;
46 const char *Capsule::Tribe() const {
47 return GetClass().tribe;
50 const Spell *Capsule::Attack1() const {
51 return GetClass().attacks[0];
54 const Spell *Capsule::Attack2() const {
55 return GetClass().attacks[1];
58 const Spell *Capsule::Attack3() const {
59 return GetClass().attacks[2];
63 Uint16 Capsule::MaxHealth() const {
64 return maxHealth + GetClass().healthBoost;
68 Stats Capsule::GetStats() const {
69 return stats + GetClass().statBoost;
72 int Capsule::NextLevel() const {
73 int levelOffset(Level() - 1);
74 if (levelOffset < numLevels) {
75 return levelLadder[levelOffset] - Experience();
82 Sprite *Capsule::BattleSprite() {
83 return GetClass().battleSprite;
86 const Sprite *Capsule::BattleSprite() const {
87 return GetClass().battleSprite;
90 Animation *Capsule::MeleeAnimation() {
91 return GetClass().meleeAnimation;
94 Animation *Capsule::AttackAnimation() {
95 return GetClass().attackAnimation;
98 Animation *Capsule::SpellAnimation() {
99 return GetClass().spellAnimation;
103 Capsule::Class &Capsule::GetClass() {
104 assert(classes && curClass < numClasses);
105 return classes[curClass];
108 const Capsule::Class &Capsule::GetClass() const {
109 assert(classes && curClass < numClasses);
110 return classes[curClass];
114 Capsule::Class::Class()
129 void Capsule::CreateTypeDescription() {
132 TypeDescription &td(TypeDescription::Create(TYPE_ID, "Capsule"));
133 td.SetConstructor(&Construct);
134 td.SetSize(sizeof(Capsule));
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());
139 td.AddField("maxHealth", FieldDescription(((char *)&c.maxHealth) - ((char *)&c), Interpreter::NUMBER_ID));
141 td.AddField("stats", FieldDescription(((char *)&c.stats) - ((char *)&c), Stats::TYPE_ID));
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));
146 td.AddField("ladder", FieldDescription(((char *)&c.levelLadder) - ((char *)&c), Interpreter::NUMBER_ID).SetReferenced().SetAggregate());
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));
152 Class::CreateTypeDescription();
155 void Capsule::Construct(void *data) {
160 void Capsule::Class::CreateTypeDescription() {
163 TypeDescription &td(TypeDescription::Create(TYPE_ID, "CapsuleClass"));
164 td.SetConstructor(&Construct);
165 td.SetSize(sizeof(Class));
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());
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());
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());
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));
183 void Capsule::Class::Construct(void *data) {
184 new (data) Capsule::Class;