AnimationController* _3dsLoader::loadFromFile(const string &fileName) const { PropertyBag xml; bool truespaceModel = false; string skin; TRACE(string("Loading 3DS model from \"") + fileName + string("\"")); xml.loadFromFile(fileName); AnimationController* controller = new AnimationController(); xml.get_optional("Truespace", truespaceModel); xml.get_optional("forceSkin", skin); for(size_t i=0, numAnimations=xml.count("animation"); i<numAnimations; ++i) { PropertyBag animation; string name; float fps = 0.0; bool looping = false; float priority = 0.0f; xml.get("animation", animation, i); animation.get("name", name); animation.get_optional("fps", fps); animation.get_optional("looping", looping); animation.get_optional("priority", priority); // Load all the keyframes vector<KeyFrame> keyFrames; const size_t length=animation.count("keyframe"); for(size_t j=0; j<length; ++j) { string keyFrameFile; animation.get("keyframe", keyFrameFile, j); Model keyFrame = loadKeyFrame(keyFrameFile); cullDegenerateMeshes(keyFrame); if(!skin.empty()) forceSkin(keyFrame, skin); if(truespaceModel) fixTrueSpaceVertices(keyFrame); keyFrames.push_back(keyFrame); } TRACE(string("Adding 3DS animation \"") + name + string("\" from ") + fileName); // Add it to the controller AnimationSequence animationSequence(keyFrames, name, priority, looping, 0, length, fps); controller->addAnimation(animationSequence); } return controller; }
void Monster::load(const PropertyBag &xml) { Creature::load(xml); if(xml.exists("preferredSpell")) { xml.get_optional("preferredSpell", preferredSpell); } else { preferredSpell = 0; } switch(preferredSpell) { case 0: spell = new SpellFireBall (&getZone(), m_ID, "data/spells/fireball.xml"); break; // Fireball case 1: spell = new SpellFireBall (&getZone(), m_ID, "data/spells/arctic-wind.xml"); break; // Arctic Wind case 2: spell = new SpellIncinerate (&getZone(), m_ID, "data/spells/incinerate.xml"); break; // Incinerate case 3: spell = new SpellFireBall (&getZone(), m_ID, "data/spells/chill.xml"); break; // Chill case 4: spell = new SpellHeal (&getZone(), m_ID, "data/spells/heal.xml"); break; // Heal case 5: spell = new SpellFireBall (&getZone(), m_ID, "data/spells/ice-blast.xml"); break; // Ice Blast case 6: spell = 0; break; // Reserved for "Resurrect" Spell default: spell = 0; break; }; if(spell!=0) { spell->available = true; } }