//======================================================================== // // ServerObjectTemplate.cpp // //IMPORTANT: Any code between //@BEGIN TFD... and //@END TFD... will be //overwritten the next time the template definition is compiled. Do not //make changes to code inside these blocks. // // copyright 2001 Sony Online Entertainment // //======================================================================== #include "serverGame/FirstServerGame.h" #include "ServerObjectTemplate.h" #include "sharedFile/Iff.h" #include "sharedMath/Vector.h" #include "sharedObject/ObjectTemplate.h" #include "sharedObject/ObjectTemplateList.h" //@BEGIN TFD TEMPLATE REFS #include "ServerObjectTemplate.h" //@END TFD TEMPLATE REFS #include #include const std::string DefaultString(""); const StringId DefaultStringId("", 0); const Vector DefaultVector(0,0,0); const TriggerVolumeData DefaultTriggerVolumeData; bool ServerObjectTemplate::ms_allowDefaultTemplateParams = true; typedef std::unordered_map > XP_MAP; static XP_MAP * XpMap = NULL; /** * Class constructor. */ ServerObjectTemplate::ServerObjectTemplate(const std::string & filename) //@BEGIN TFD INIT : ObjectTemplate(filename) ,m_scriptsLoaded(false) ,m_scriptsAppend(false) ,m_visibleFlagsLoaded(false) ,m_visibleFlagsAppend(false) ,m_deleteFlagsLoaded(false) ,m_deleteFlagsAppend(false) ,m_moveFlagsLoaded(false) ,m_moveFlagsAppend(false) ,m_contentsLoaded(false) ,m_contentsAppend(false) ,m_xpPointsLoaded(false) ,m_xpPointsAppend(false) ,m_versionOk(true) //@END TFD INIT { } // ServerObjectTemplate::ServerObjectTemplate /** * Class destructor. */ ServerObjectTemplate::~ServerObjectTemplate() { if (m_baseData) { m_baseData->releaseReference(); m_baseData=0; } //@BEGIN TFD CLEANUP { std::vector::iterator iter; for (iter = m_scripts.begin(); iter != m_scripts.end(); ++iter) { delete *iter; *iter = NULL; } m_scripts.clear(); } { std::vector::iterator iter; for (iter = m_visibleFlags.begin(); iter != m_visibleFlags.end(); ++iter) { delete *iter; *iter = NULL; } m_visibleFlags.clear(); } { std::vector::iterator iter; for (iter = m_deleteFlags.begin(); iter != m_deleteFlags.end(); ++iter) { delete *iter; *iter = NULL; } m_deleteFlags.clear(); } { std::vector::iterator iter; for (iter = m_moveFlags.begin(); iter != m_moveFlags.end(); ++iter) { delete *iter; *iter = NULL; } m_moveFlags.clear(); } { std::vector::iterator iter; for (iter = m_contents.begin(); iter != m_contents.end(); ++iter) { delete *iter; *iter = NULL; } m_contents.clear(); } { std::vector::iterator iter; for (iter = m_xpPoints.begin(); iter != m_xpPoints.end(); ++iter) { delete *iter; *iter = NULL; } m_xpPoints.clear(); } //@END TFD CLEANUP } // ServerObjectTemplate::~ServerObjectTemplate /** * Static function used to register this template. */ void ServerObjectTemplate::registerMe(void) { ObjectTemplateList::registerTemplate(ServerObjectTemplate_tag, create); if (XpMap == NULL) { XpMap = new XP_MAP(); NOT_NULL(XpMap); ExitChain::add(exit, "ServerObjectTemplate"); // @todo: fill in the rest of this map (*XpMap)[XP_rangedCombat] = ""; (*XpMap)[XP_meleeCombat] = ""; (*XpMap)[XP_tamingNoTime] = ""; (*XpMap)[XP_tamingShortTime] = ""; (*XpMap)[XP_tamingMediumTime] = ""; (*XpMap)[XP_tamingLargeTime] = ""; (*XpMap)[XP_architect] = ""; (*XpMap)[XP_botany] = ""; (*XpMap)[XP_bountyHunter] = ""; (*XpMap)[XP_chemist] = ""; (*XpMap)[XP_dancing] = ""; (*XpMap)[XP_facilityManagementSavings] = ""; (*XpMap)[XP_facilityManagementWearAndTear] = ""; (*XpMap)[XP_squadLeaderNoTime] = ""; (*XpMap)[XP_squadLeaderSmallTime] = ""; (*XpMap)[XP_squadLeaderMediumTime] = ""; (*XpMap)[XP_squadLeaderLargeTime] = ""; (*XpMap)[XP_hairdressing] = ""; (*XpMap)[XP_holonetSlicingPopularity] = ""; (*XpMap)[XP_holonetSlicingQuantity] = ""; (*XpMap)[XP_investigation] = ""; (*XpMap)[XP_medic] = ""; (*XpMap)[XP_military] = ""; (*XpMap)[XP_mining] = ""; (*XpMap)[XP_miningSavings] = ""; (*XpMap)[XP_musician] = "music"; (*XpMap)[XP_musicanPopularity] = ""; (*XpMap)[XP_politics] = ""; (*XpMap)[XP_slicing] = ""; (*XpMap)[XP_smuggling] = ""; (*XpMap)[XP_surveyingNoMinimum] = ""; (*XpMap)[XP_surveyingLowMinimum] = ""; (*XpMap)[XP_surveyingMediumMinimum] = ""; (*XpMap)[XP_surveyingHighMinimum] = ""; (*XpMap)[XP_survivalHealing] = ""; (*XpMap)[XP_survivalTracking] = ""; (*XpMap)[XP_vehicularControl] = ""; (*XpMap)[XP_vehicularWearAndTear] = ""; (*XpMap)[XP_resourceHarvestingOrganic] = "resource_harvesting_organic"; (*XpMap)[XP_resourceHarvestingInorganic] = "resource_harvesting_inorganic"; (*XpMap)[XP_crafting] = "crafting_general"; (*XpMap)[XP_craftingClothing] = "crafting_clothing_general"; (*XpMap)[XP_craftingClothingArmor] = "crafting_clothing_armor"; (*XpMap)[XP_craftingDroid] = "crafting_droid_general"; (*XpMap)[XP_craftingFood] = "crafting_food_general"; (*XpMap)[XP_craftingMedicine] = "crafting_medicine_general"; (*XpMap)[XP_craftingStructure] = "crafting_structure_general"; (*XpMap)[XP_craftingWeapons] = "crafting_weapons_general"; (*XpMap)[XP_craftingWeaponsMelee] = "crafting_weapons_melee"; (*XpMap)[XP_craftingWeaponsRanged] = "crafting_weapons_ranged"; (*XpMap)[XP_craftingWeaponsMunition] = "crafting_weapons_munition"; (*XpMap)[XP_craftingScout] = "scout"; (*XpMap)[XP_craftingCreature] = "crafting_bio_engineer_creature"; (*XpMap)[XP_craftingTissue] = "crafting_bio_engineer_tissue"; (*XpMap)[XP_craftingCamp] = "camp"; (*XpMap)[XP_craftingTrapping] = "trapping"; (*XpMap)[XP_craftingSpice] = "crafting_spice"; (*XpMap)[XP_industrialist] = "industrialist"; (*XpMap)[XP_jediGeneral] = "jedi_general"; (*XpMap)[XP_shipwright] = "shipwright"; (*XpMap)[XP_reverseEngineering] = "reverse_engineering"; } } // ServerObjectTemplate::registerMe /** * Called on program exit to clean up class-level memory. */ void ServerObjectTemplate::exit() { if (XpMap != NULL) { delete XpMap; XpMap = NULL; } } // ServerObjectTemplate::exit /** * Creates a ServerObjectTemplate template. * * @return a new instance of the template */ ObjectTemplate * ServerObjectTemplate::create(const std::string & filename) { return new ServerObjectTemplate(filename); } // ServerObjectTemplate::create /** * Returns the template id. * * @return the template id */ Tag ServerObjectTemplate::getId(void) const { return ServerObjectTemplate_tag; } // ServerObjectTemplate::getId /** * Returns this template's version. * * @return the version */ Tag ServerObjectTemplate::getTemplateVersion(void) const { return m_templateVersion; } // ServerObjectTemplate::getTemplateVersion /** * Returns the highest version of this template or it's base templates. * * @return the highest version */ Tag ServerObjectTemplate::getHighestTemplateVersion(void) const { if (m_baseData == NULL) return m_templateVersion; const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base == NULL) return m_templateVersion; return std::max(m_templateVersion, base->getHighestTemplateVersion()); } // ServerObjectTemplate::getHighestTemplateVersion // ---------------------------------------------------------------------- ServerObjectTemplate * ServerObjectTemplate::asServerObjectTemplate() { return this; } // ---------------------------------------------------------------------- ServerObjectTemplate const * ServerObjectTemplate::asServerObjectTemplate() const { return this; } // ---------------------------------------------------------------------- /** * Returns the xp string associated with an xp enum value * * @param type the xp type * * @return the string associated with the xp, or an empty string for a bad value */ const std::string & ServerObjectTemplate::getXpString(XpTypes type) { static const std::string emptyString; if (XpMap != NULL) { XP_MAP::const_iterator result = XpMap->find(type); if (result != XpMap->end()) return (*result).second; } return emptyString; } // ServerObjectTemplate::getXpString //---------------------------------------------------------------------- const std::string & ServerObjectTemplate::getDamageTypeString (DamageType type) { static const std::string emptyString; static const std::string DAMAGE_TYPE_NAMES[] = { "kinetic", "energy", "blast", "stun", "restraint", "elemental_heat", "elemental_cold", "elemental_acid", "elemental_electrical", "environmental_heat", "environmental_cold", "environmental_acid", "environmental_electrical" }; const int DAMAGE_TYPE_NAMES_SIZE = sizeof(DAMAGE_TYPE_NAMES) / sizeof(DAMAGE_TYPE_NAMES[0]); const int i_damage = static_cast(type); if (i_damage != 0) { for (int index = 0; index < DAMAGE_TYPE_NAMES_SIZE; ++index) { if ((i_damage & (1 << index)) != 0) return DAMAGE_TYPE_NAMES [index]; } } return emptyString; } //---------------------------------------------------------------------- const std::string & ServerObjectTemplate::getArmorRatingString (ArmorRating type) { static const std::string emptyString; static const std::string ARMOR_RATING_NAMES[] = { "none", "light", "medium", "heavy" }; const int ARMOR_RATING_NAMES_SIZE = sizeof(ARMOR_RATING_NAMES) / sizeof(ARMOR_RATING_NAMES[0]); const int i_type = static_cast(type); if (i_type < 0 || i_type >= ARMOR_RATING_NAMES_SIZE) return emptyString; return ARMOR_RATING_NAMES [i_type]; } //---------------------------------------------------------------------- //@BEGIN TFD const std::string & ServerObjectTemplate::getSharedTemplate(bool testData) const { #ifdef _DEBUG std::string testDataValue = DefaultString; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getSharedTemplate(true); #endif } if (!m_sharedTemplate.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter sharedTemplate in template %s", DataResource::getName())); return DefaultString; } else { DEBUG_FATAL(base == NULL, ("Template parameter sharedTemplate has not been defined in template %s!", DataResource::getName())); return base->getSharedTemplate(); } } const std::string & value = m_sharedTemplate.getValue(); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getSharedTemplate const std::string & ServerObjectTemplate::getScripts(int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_scriptsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter scripts in template %s", DataResource::getName())); return DefaultString; } else { DEBUG_FATAL(base == NULL, ("Template parameter scripts has not been defined in template %s!", DataResource::getName())); return base->getScripts(index); } } if (m_scriptsAppend && base != NULL) { int baseCount = base->getScriptsCount(); if (index < baseCount) return base->getScripts(index); index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_scripts.size(), ("template param index out of range")); const std::string & value = m_scripts[index]->getValue(); return value; } // ServerObjectTemplate::getScripts size_t ServerObjectTemplate::getScriptsCount(void) const { if (!m_scriptsLoaded) { if (m_baseData == NULL) return 0; const ServerObjectTemplate * base = dynamic_cast(m_baseData); DEBUG_FATAL(base == NULL, ("base template wrong type")); return base->getScriptsCount(); } size_t count = m_scripts.size(); // if we are extending our base template, add it's count if (m_scriptsAppend && m_baseData != NULL) { const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base != NULL) count += base->getScriptsCount(); } return count; } // ServerObjectTemplate::getScriptsCount void ServerObjectTemplate::getObjvars(DynamicVariableList &list) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_objvars.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter objvars in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter objvars has not been defined in template %s!", DataResource::getName())); base->getObjvars(list); return; } } if (m_objvars.isExtendingBaseList() && base != NULL) base->getObjvars(list); m_objvars.getDynamicVariableList(list); } // ServerObjectTemplate::getObjvars int ServerObjectTemplate::getVolume(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getVolume(true); #endif } if (!m_volume.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter volume in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter volume has not been defined in template %s!", DataResource::getName())); return base->getVolume(); } } int value = m_volume.getValue(); char delta = m_volume.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getVolume(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getVolume int ServerObjectTemplate::getVolumeMin(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getVolumeMin(true); #endif } if (!m_volume.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter volume in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter volume has not been defined in template %s!", DataResource::getName())); return base->getVolumeMin(); } } int value = m_volume.getMinValue(); char delta = m_volume.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getVolumeMin(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getVolumeMin int ServerObjectTemplate::getVolumeMax(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getVolumeMax(true); #endif } if (!m_volume.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter volume in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter volume has not been defined in template %s!", DataResource::getName())); return base->getVolumeMax(); } } int value = m_volume.getMaxValue(); char delta = m_volume.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getVolumeMax(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getVolumeMax ServerObjectTemplate::VisibleFlags ServerObjectTemplate::getVisibleFlags(int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_visibleFlagsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter visibleFlags in template %s", DataResource::getName())); return static_cast(0); } else { DEBUG_FATAL(base == NULL, ("Template parameter visibleFlags has not been defined in template %s!", DataResource::getName())); return base->getVisibleFlags(index); } } if (m_visibleFlagsAppend && base != NULL) { int baseCount = base->getVisibleFlagsCount(); if (index < baseCount) return base->getVisibleFlags(index); index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_visibleFlags.size(), ("template param index out of range")); return static_cast(m_visibleFlags[index]->getValue()); } // ServerObjectTemplate::getVisibleFlags size_t ServerObjectTemplate::getVisibleFlagsCount(void) const { if (!m_visibleFlagsLoaded) { if (m_baseData == NULL) return 0; const ServerObjectTemplate * base = dynamic_cast(m_baseData); DEBUG_FATAL(base == NULL, ("base template wrong type")); return base->getVisibleFlagsCount(); } size_t count = m_visibleFlags.size(); // if we are extending our base template, add it's count if (m_visibleFlagsAppend && m_baseData != NULL) { const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base != NULL) count += base->getVisibleFlagsCount(); } return count; } // ServerObjectTemplate::getVisibleFlagsCount ServerObjectTemplate::DeleteFlags ServerObjectTemplate::getDeleteFlags(int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_deleteFlagsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter deleteFlags in template %s", DataResource::getName())); return static_cast(0); } else { DEBUG_FATAL(base == NULL, ("Template parameter deleteFlags has not been defined in template %s!", DataResource::getName())); return base->getDeleteFlags(index); } } if (m_deleteFlagsAppend && base != NULL) { int baseCount = base->getDeleteFlagsCount(); if (index < baseCount) return base->getDeleteFlags(index); index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_deleteFlags.size(), ("template param index out of range")); return static_cast(m_deleteFlags[index]->getValue()); } // ServerObjectTemplate::getDeleteFlags size_t ServerObjectTemplate::getDeleteFlagsCount(void) const { if (!m_deleteFlagsLoaded) { if (m_baseData == NULL) return 0; const ServerObjectTemplate * base = dynamic_cast(m_baseData); DEBUG_FATAL(base == NULL, ("base template wrong type")); return base->getDeleteFlagsCount(); } size_t count = m_deleteFlags.size(); // if we are extending our base template, add it's count if (m_deleteFlagsAppend && m_baseData != NULL) { const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base != NULL) count += base->getDeleteFlagsCount(); } return count; } // ServerObjectTemplate::getDeleteFlagsCount ServerObjectTemplate::MoveFlags ServerObjectTemplate::getMoveFlags(int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_moveFlagsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter moveFlags in template %s", DataResource::getName())); return static_cast(0); } else { DEBUG_FATAL(base == NULL, ("Template parameter moveFlags has not been defined in template %s!", DataResource::getName())); return base->getMoveFlags(index); } } if (m_moveFlagsAppend && base != NULL) { int baseCount = base->getMoveFlagsCount(); if (index < baseCount) return base->getMoveFlags(index); index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_moveFlags.size(), ("template param index out of range")); return static_cast(m_moveFlags[index]->getValue()); } // ServerObjectTemplate::getMoveFlags size_t ServerObjectTemplate::getMoveFlagsCount(void) const { if (!m_moveFlagsLoaded) { if (m_baseData == NULL) return 0; const ServerObjectTemplate * base = dynamic_cast(m_baseData); DEBUG_FATAL(base == NULL, ("base template wrong type")); return base->getMoveFlagsCount(); } size_t count = m_moveFlags.size(); // if we are extending our base template, add it's count if (m_moveFlagsAppend && m_baseData != NULL) { const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base != NULL) count += base->getMoveFlagsCount(); } return count; } // ServerObjectTemplate::getMoveFlagsCount bool ServerObjectTemplate::getInvulnerable(bool testData) const { #ifdef _DEBUG bool testDataValue = false; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getInvulnerable(true); #endif } if (!m_invulnerable.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter invulnerable in template %s", DataResource::getName())); return false; } else { DEBUG_FATAL(base == NULL, ("Template parameter invulnerable has not been defined in template %s!", DataResource::getName())); return base->getInvulnerable(); } } bool value = m_invulnerable.getValue(); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getInvulnerable float ServerObjectTemplate::getComplexity(bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getComplexity(true); #endif } if (!m_complexity.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter complexity in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter complexity has not been defined in template %s!", DataResource::getName())); return base->getComplexity(); } } float value = m_complexity.getValue(); char delta = m_complexity.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getComplexity(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getComplexity float ServerObjectTemplate::getComplexityMin(bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getComplexityMin(true); #endif } if (!m_complexity.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter complexity in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter complexity has not been defined in template %s!", DataResource::getName())); return base->getComplexityMin(); } } float value = m_complexity.getMinValue(); char delta = m_complexity.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getComplexityMin(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getComplexityMin float ServerObjectTemplate::getComplexityMax(bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getComplexityMax(true); #endif } if (!m_complexity.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter complexity in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter complexity has not been defined in template %s!", DataResource::getName())); return base->getComplexityMax(); } } float value = m_complexity.getMaxValue(); char delta = m_complexity.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getComplexityMax(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getComplexityMax int ServerObjectTemplate::getTintIndex(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTintIndex(true); #endif } if (!m_tintIndex.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter tintIndex in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter tintIndex has not been defined in template %s!", DataResource::getName())); return base->getTintIndex(); } } int value = m_tintIndex.getValue(); char delta = m_tintIndex.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTintIndex(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getTintIndex int ServerObjectTemplate::getTintIndexMin(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTintIndexMin(true); #endif } if (!m_tintIndex.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter tintIndex in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter tintIndex has not been defined in template %s!", DataResource::getName())); return base->getTintIndexMin(); } } int value = m_tintIndex.getMinValue(); char delta = m_tintIndex.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTintIndexMin(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getTintIndexMin int ServerObjectTemplate::getTintIndexMax(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTintIndexMax(true); #endif } if (!m_tintIndex.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter tintIndex in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter tintIndex has not been defined in template %s!", DataResource::getName())); return base->getTintIndexMax(); } } int value = m_tintIndex.getMaxValue(); char delta = m_tintIndex.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTintIndexMax(); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getTintIndexMax float ServerObjectTemplate::getUpdateRanges(UpdateRanges index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } DEBUG_FATAL(index < 0 || index >= 3, ("template param index out of range")); if (!m_updateRanges[index].isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter updateRanges in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter updateRanges has not been defined in template %s!", DataResource::getName())); return base->getUpdateRanges(index); } } float value = m_updateRanges[index].getValue(); char delta = m_updateRanges[index].getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getUpdateRanges(index); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } return value; } // ServerObjectTemplate::getUpdateRanges float ServerObjectTemplate::getUpdateRangesMin(UpdateRanges index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } DEBUG_FATAL(index < 0 || index >= 3, ("template param index out of range")); if (!m_updateRanges[index].isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter updateRanges in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter updateRanges has not been defined in template %s!", DataResource::getName())); return base->getUpdateRangesMin(index); } } float value = m_updateRanges[index].getMinValue(); char delta = m_updateRanges[index].getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getUpdateRangesMin(index); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } return value; } // ServerObjectTemplate::getUpdateRangesMin float ServerObjectTemplate::getUpdateRangesMax(UpdateRanges index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } DEBUG_FATAL(index < 0 || index >= 3, ("template param index out of range")); if (!m_updateRanges[index].isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter updateRanges in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter updateRanges has not been defined in template %s!", DataResource::getName())); return base->getUpdateRangesMax(index); } } float value = m_updateRanges[index].getMaxValue(); char delta = m_updateRanges[index].getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getUpdateRangesMax(index); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } return value; } // ServerObjectTemplate::getUpdateRangesMax void ServerObjectTemplate::getContents(Contents &data, int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_contentsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter contents in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter contents has not been defined in template %s!", DataResource::getName())); base->getContents(data, index); return; } } if (m_contentsAppend && base != NULL) { int baseCount = base->getContentsCount(); if (index < baseCount) { base->getContents(data, index); return; } index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_contents.size(), ("template param index out of range")); const ObjectTemplate * structTemplate = (*m_contents[index]).getValue(); NOT_NULL(structTemplate); const _Contents *param = dynamic_cast(structTemplate); NOT_NULL(param); data.slotName = param->getSlotName(m_versionOk); data.equipObject = param->getEquipObject(m_versionOk); data.content = param->getContent(m_versionOk); } // ServerObjectTemplate::getContents void ServerObjectTemplate::getContentsMin(Contents &data, int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_contentsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter contents in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter contents has not been defined in template %s!", DataResource::getName())); base->getContentsMin(data, index); return; } } if (m_contentsAppend && base != NULL) { int baseCount = base->getContentsCount(); if (index < baseCount) { base->getContentsMin(data, index); return; } index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_contents.size(), ("template param index out of range")); const ObjectTemplate * structTemplate = (*m_contents[index]).getValue(); NOT_NULL(structTemplate); const _Contents *param = dynamic_cast(structTemplate); NOT_NULL(param); data.slotName = param->getSlotName(m_versionOk); data.equipObject = param->getEquipObject(m_versionOk); data.content = param->getContent(m_versionOk); } // ServerObjectTemplate::getContentsMin void ServerObjectTemplate::getContentsMax(Contents &data, int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_contentsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter contents in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter contents has not been defined in template %s!", DataResource::getName())); base->getContentsMax(data, index); return; } } if (m_contentsAppend && base != NULL) { int baseCount = base->getContentsCount(); if (index < baseCount) { base->getContentsMax(data, index); return; } index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_contents.size(), ("template param index out of range")); const ObjectTemplate * structTemplate = (*m_contents[index]).getValue(); NOT_NULL(structTemplate); const _Contents *param = dynamic_cast(structTemplate); NOT_NULL(param); data.slotName = param->getSlotName(m_versionOk); data.equipObject = param->getEquipObject(m_versionOk); data.content = param->getContent(m_versionOk); } // ServerObjectTemplate::getContentsMax size_t ServerObjectTemplate::getContentsCount(void) const { if (!m_contentsLoaded) { if (m_baseData == NULL) return 0; const ServerObjectTemplate * base = dynamic_cast(m_baseData); DEBUG_FATAL(base == NULL, ("base template wrong type")); return base->getContentsCount(); } size_t count = m_contents.size(); // if we are extending our base template, add it's count if (m_contentsAppend && m_baseData != NULL) { const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base != NULL) count += base->getContentsCount(); } return count; } // ServerObjectTemplate::getContentsCount void ServerObjectTemplate::getXpPoints(Xp &data, int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_xpPointsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter xpPoints in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter xpPoints has not been defined in template %s!", DataResource::getName())); base->getXpPoints(data, index); return; } } if (m_xpPointsAppend && base != NULL) { int baseCount = base->getXpPointsCount(); if (index < baseCount) { base->getXpPoints(data, index); return; } index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_xpPoints.size(), ("template param index out of range")); const ObjectTemplate * structTemplate = (*m_xpPoints[index]).getValue(); NOT_NULL(structTemplate); const _Xp *param = dynamic_cast(structTemplate); NOT_NULL(param); data.type = param->getType(m_versionOk); data.level = param->getLevel(m_versionOk); data.value = param->getValue(m_versionOk); } // ServerObjectTemplate::getXpPoints void ServerObjectTemplate::getXpPointsMin(Xp &data, int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_xpPointsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter xpPoints in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter xpPoints has not been defined in template %s!", DataResource::getName())); base->getXpPointsMin(data, index); return; } } if (m_xpPointsAppend && base != NULL) { int baseCount = base->getXpPointsCount(); if (index < baseCount) { base->getXpPointsMin(data, index); return; } index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_xpPoints.size(), ("template param index out of range")); const ObjectTemplate * structTemplate = (*m_xpPoints[index]).getValue(); NOT_NULL(structTemplate); const _Xp *param = dynamic_cast(structTemplate); NOT_NULL(param); data.type = param->getType(m_versionOk); data.level = param->getLevelMin(m_versionOk); data.value = param->getValueMin(m_versionOk); } // ServerObjectTemplate::getXpPointsMin void ServerObjectTemplate::getXpPointsMax(Xp &data, int index) const { const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_xpPointsLoaded) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter xpPoints in template %s", DataResource::getName())); return ; } else { DEBUG_FATAL(base == NULL, ("Template parameter xpPoints has not been defined in template %s!", DataResource::getName())); base->getXpPointsMax(data, index); return; } } if (m_xpPointsAppend && base != NULL) { int baseCount = base->getXpPointsCount(); if (index < baseCount) { base->getXpPointsMax(data, index); return; } index -= baseCount; } DEBUG_FATAL(index < 0 || static_cast(index) >= m_xpPoints.size(), ("template param index out of range")); const ObjectTemplate * structTemplate = (*m_xpPoints[index]).getValue(); NOT_NULL(structTemplate); const _Xp *param = dynamic_cast(structTemplate); NOT_NULL(param); data.type = param->getType(m_versionOk); data.level = param->getLevelMax(m_versionOk); data.value = param->getValueMax(m_versionOk); } // ServerObjectTemplate::getXpPointsMax size_t ServerObjectTemplate::getXpPointsCount(void) const { if (!m_xpPointsLoaded) { if (m_baseData == NULL) return 0; const ServerObjectTemplate * base = dynamic_cast(m_baseData); DEBUG_FATAL(base == NULL, ("base template wrong type")); return base->getXpPointsCount(); } size_t count = m_xpPoints.size(); // if we are extending our base template, add it's count if (m_xpPointsAppend && m_baseData != NULL) { const ServerObjectTemplate * base = dynamic_cast(m_baseData); if (base != NULL) count += base->getXpPointsCount(); } return count; } // ServerObjectTemplate::getXpPointsCount bool ServerObjectTemplate::getPersistByDefault(bool testData) const { #ifdef _DEBUG bool testDataValue = false; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getPersistByDefault(true); #endif } if (!m_persistByDefault.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter persistByDefault in template %s", DataResource::getName())); return false; } else { DEBUG_FATAL(base == NULL, ("Template parameter persistByDefault has not been defined in template %s!", DataResource::getName())); return base->getPersistByDefault(); } } bool value = m_persistByDefault.getValue(); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getPersistByDefault bool ServerObjectTemplate::getPersistContents(bool testData) const { #ifdef _DEBUG bool testDataValue = false; #else UNREF(testData); #endif const ServerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getPersistContents(true); #endif } if (!m_persistContents.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter persistContents in template %s", DataResource::getName())); return false; } else { DEBUG_FATAL(base == NULL, ("Template parameter persistContents has not been defined in template %s!", DataResource::getName())); return base->getPersistContents(); } } bool value = m_persistContents.getValue(); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::getPersistContents #ifdef _DEBUG /** * Special function used by datalint. Checks for duplicate values in base and derived templates. */ void ServerObjectTemplate::testValues(void) const { IGNORE_RETURN(getSharedTemplate(true)); IGNORE_RETURN(getVolumeMin(true)); IGNORE_RETURN(getVolumeMax(true)); IGNORE_RETURN(getInvulnerable(true)); IGNORE_RETURN(getComplexityMin(true)); IGNORE_RETURN(getComplexityMax(true)); IGNORE_RETURN(getTintIndexMin(true)); IGNORE_RETURN(getTintIndexMax(true)); IGNORE_RETURN(getPersistByDefault(true)); IGNORE_RETURN(getPersistContents(true)); } // ServerObjectTemplate::testValues #endif /** * Loads the template data from an iff file. We should already be in the form * for this template. * * @param file file to load from */ void ServerObjectTemplate::load(Iff &file) { static const int MAX_NAME_SIZE = 256; char paramName[MAX_NAME_SIZE]; if (file.getCurrentName() != ServerObjectTemplate_tag) { return; } file.enterForm(); m_templateVersion = file.getCurrentName(); if (m_templateVersion == TAG(D,E,R,V)) { file.enterForm(); file.enterChunk(); std::string baseFilename; file.read_string(baseFilename); file.exitChunk(); const ObjectTemplate *base = ObjectTemplateList::fetch(baseFilename); DEBUG_WARNING(base == NULL, ("was unable to load base template %s", baseFilename.c_str())); if (m_baseData == base && base != NULL) base->releaseReference(); else { if (m_baseData != NULL) m_baseData->releaseReference(); m_baseData = base; } file.exitForm(); m_templateVersion = file.getCurrentName(); } if (getHighestTemplateVersion() != TAG(0,0,1,1)) { if (DataLint::isEnabled()) DEBUG_WARNING(true, ("template %s version out of date", file.getFileName())); m_versionOk = false; } file.enterForm(); file.enterChunk(); int paramCount = file.read_int32(); file.exitChunk(); for (int i = 0; i < paramCount; ++i) { file.enterChunk(); file.read_string(paramName, MAX_NAME_SIZE); if (strcmp(paramName, "sharedTemplate") == 0) m_sharedTemplate.loadFromIff(file); else if (strcmp(paramName, "scripts") == 0) { std::vector::iterator iter; for (iter = m_scripts.begin(); iter != m_scripts.end(); ++iter) { delete *iter; *iter = NULL; } m_scripts.clear(); m_scriptsAppend = file.read_bool8(); int listCount = file.read_int32(); for (int j = 0; j < listCount; ++j) { StringParam * newData = new StringParam; newData->loadFromIff(file); m_scripts.push_back(newData); } m_scriptsLoaded = true; } else if (strcmp(paramName, "objvars") == 0) m_objvars.loadFromIff(file); else if (strcmp(paramName, "volume") == 0) m_volume.loadFromIff(file); else if (strcmp(paramName, "visibleFlags") == 0) { std::vector::iterator iter; for (iter = m_visibleFlags.begin(); iter != m_visibleFlags.end(); ++iter) { delete *iter; *iter = NULL; } m_visibleFlags.clear(); m_visibleFlagsAppend = file.read_bool8(); int listCount = file.read_int32(); for (int j = 0; j < listCount; ++j) { IntegerParam * newData = new IntegerParam; newData->loadFromIff(file); m_visibleFlags.push_back(newData); } m_visibleFlagsLoaded = true; } else if (strcmp(paramName, "deleteFlags") == 0) { std::vector::iterator iter; for (iter = m_deleteFlags.begin(); iter != m_deleteFlags.end(); ++iter) { delete *iter; *iter = NULL; } m_deleteFlags.clear(); m_deleteFlagsAppend = file.read_bool8(); int listCount = file.read_int32(); for (int j = 0; j < listCount; ++j) { IntegerParam * newData = new IntegerParam; newData->loadFromIff(file); m_deleteFlags.push_back(newData); } m_deleteFlagsLoaded = true; } else if (strcmp(paramName, "moveFlags") == 0) { std::vector::iterator iter; for (iter = m_moveFlags.begin(); iter != m_moveFlags.end(); ++iter) { delete *iter; *iter = NULL; } m_moveFlags.clear(); m_moveFlagsAppend = file.read_bool8(); int listCount = file.read_int32(); for (int j = 0; j < listCount; ++j) { IntegerParam * newData = new IntegerParam; newData->loadFromIff(file); m_moveFlags.push_back(newData); } m_moveFlagsLoaded = true; } else if (strcmp(paramName, "invulnerable") == 0) m_invulnerable.loadFromIff(file); else if (strcmp(paramName, "complexity") == 0) m_complexity.loadFromIff(file); else if (strcmp(paramName, "tintIndex") == 0) m_tintIndex.loadFromIff(file); else if (strcmp(paramName, "updateRanges") == 0) { int listCount = file.read_int32(); DEBUG_WARNING(listCount != 3, ("Template %s: read array size of %d for array \"updateRanges\" of size 3, reading values anyway", file.getFileName(), listCount)); int j; for (j = 0; j < 3 && j < listCount; ++j) m_updateRanges[j].loadFromIff(file); // if there are more params for updateRanges read and dump them for (; j < listCount; ++j) { FloatParam dummy; dummy.loadFromIff(file); } } else if (strcmp(paramName, "contents") == 0) { std::vector::iterator iter; for (iter = m_contents.begin(); iter != m_contents.end(); ++iter) { delete *iter; *iter = NULL; } m_contents.clear(); m_contentsAppend = file.read_bool8(); int listCount = file.read_int32(); for (int j = 0; j < listCount; ++j) { StructParamOT * newData = new StructParamOT; newData->loadFromIff(file); m_contents.push_back(newData); } m_contentsLoaded = true; } else if (strcmp(paramName, "xpPoints") == 0) { std::vector::iterator iter; for (iter = m_xpPoints.begin(); iter != m_xpPoints.end(); ++iter) { delete *iter; *iter = NULL; } m_xpPoints.clear(); m_xpPointsAppend = file.read_bool8(); int listCount = file.read_int32(); for (int j = 0; j < listCount; ++j) { StructParamOT * newData = new StructParamOT; newData->loadFromIff(file); m_xpPoints.push_back(newData); } m_xpPointsLoaded = true; } else if (strcmp(paramName, "persistByDefault") == 0) m_persistByDefault.loadFromIff(file); else if (strcmp(paramName, "persistContents") == 0) m_persistContents.loadFromIff(file); file.exitChunk(true); } file.exitForm(); return; } // ServerObjectTemplate::load //============================================================================= // class ServerObjectTemplate::_AttribMod /** * Class constructor. */ ServerObjectTemplate::_AttribMod::_AttribMod(const std::string & filename) : ObjectTemplate(filename) { } // ServerObjectTemplate::_AttribMod::_AttribMod /** * Class destructor. */ ServerObjectTemplate::_AttribMod::~_AttribMod() { } // ServerObjectTemplate::_AttribMod::~_AttribMod /** * Static function used to register this template. */ void ServerObjectTemplate::_AttribMod::registerMe(void) { ObjectTemplateList::registerTemplate(_AttribMod_tag, create); } // ServerObjectTemplate::_AttribMod::registerMe /** * Creates a ServerObjectTemplate::_AttribMod template. * * @return a new instance of the template */ ObjectTemplate * ServerObjectTemplate::_AttribMod::create(const std::string & filename) { return new ServerObjectTemplate::_AttribMod(filename); } // ServerObjectTemplate::_AttribMod::create /** * Returns the template id. * * @return the template id */ Tag ServerObjectTemplate::_AttribMod::getId(void) const { return _AttribMod_tag; } // ServerObjectTemplate::_AttribMod::getId ServerObjectTemplate::Attributes ServerObjectTemplate::_AttribMod::getTarget(bool versionOk, bool testData) const { #ifdef _DEBUG ServerObjectTemplate::Attributes testDataValue = static_cast(0); #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTarget(true); #endif } if (!m_target.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter target in template %s", DataResource::getName())); return static_cast(0); } else { DEBUG_FATAL(base == NULL, ("Template parameter target has not been defined in template %s!", DataResource::getName())); return base->getTarget(versionOk); } } Attributes value = static_cast(m_target.getValue()); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTarget int ServerObjectTemplate::_AttribMod::getValue(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValue(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValue(versionOk); } } int value = m_value.getValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValue(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getValue int ServerObjectTemplate::_AttribMod::getValueMin(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValueMin(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValueMin(versionOk); } } int value = m_value.getMinValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValueMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getValueMin int ServerObjectTemplate::_AttribMod::getValueMax(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValueMax(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValueMax(versionOk); } } int value = m_value.getMaxValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValueMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getValueMax float ServerObjectTemplate::_AttribMod::getTime(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTime(true); #endif } if (!m_time.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter time in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter time has not been defined in template %s!", DataResource::getName())); return base->getTime(versionOk); } } float value = m_time.getValue(); char delta = m_time.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTime(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTime float ServerObjectTemplate::_AttribMod::getTimeMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeMin(true); #endif } if (!m_time.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter time in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter time has not been defined in template %s!", DataResource::getName())); return base->getTimeMin(versionOk); } } float value = m_time.getMinValue(); char delta = m_time.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTimeMin float ServerObjectTemplate::_AttribMod::getTimeMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeMax(true); #endif } if (!m_time.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter time in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter time has not been defined in template %s!", DataResource::getName())); return base->getTimeMax(versionOk); } } float value = m_time.getMaxValue(); char delta = m_time.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTimeMax float ServerObjectTemplate::_AttribMod::getTimeAtValue(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeAtValue(true); #endif } if (!m_timeAtValue.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter timeAtValue in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter timeAtValue has not been defined in template %s!", DataResource::getName())); return base->getTimeAtValue(versionOk); } } float value = m_timeAtValue.getValue(); char delta = m_timeAtValue.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeAtValue(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTimeAtValue float ServerObjectTemplate::_AttribMod::getTimeAtValueMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeAtValueMin(true); #endif } if (!m_timeAtValue.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter timeAtValue in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter timeAtValue has not been defined in template %s!", DataResource::getName())); return base->getTimeAtValueMin(versionOk); } } float value = m_timeAtValue.getMinValue(); char delta = m_timeAtValue.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeAtValueMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTimeAtValueMin float ServerObjectTemplate::_AttribMod::getTimeAtValueMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeAtValueMax(true); #endif } if (!m_timeAtValue.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter timeAtValue in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter timeAtValue has not been defined in template %s!", DataResource::getName())); return base->getTimeAtValueMax(versionOk); } } float value = m_timeAtValue.getMaxValue(); char delta = m_timeAtValue.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeAtValueMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getTimeAtValueMax float ServerObjectTemplate::_AttribMod::getDecay(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getDecay(true); #endif } if (!m_decay.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter decay in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter decay has not been defined in template %s!", DataResource::getName())); return base->getDecay(versionOk); } } float value = m_decay.getValue(); char delta = m_decay.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getDecay(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getDecay float ServerObjectTemplate::_AttribMod::getDecayMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getDecayMin(true); #endif } if (!m_decay.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter decay in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter decay has not been defined in template %s!", DataResource::getName())); return base->getDecayMin(versionOk); } } float value = m_decay.getMinValue(); char delta = m_decay.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getDecayMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getDecayMin float ServerObjectTemplate::_AttribMod::getDecayMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_AttribMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getDecayMax(true); #endif } if (!m_decay.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter decay in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter decay has not been defined in template %s!", DataResource::getName())); return base->getDecayMax(versionOk); } } float value = m_decay.getMaxValue(); char delta = m_decay.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getDecayMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_AttribMod::getDecayMax #ifdef _DEBUG /** * Special function used by datalint. Checks for duplicate values in base and derived templates. */ void ServerObjectTemplate::_AttribMod::testValues(void) const { IGNORE_RETURN(getTarget(true)); IGNORE_RETURN(getValueMin(true)); IGNORE_RETURN(getValueMax(true)); IGNORE_RETURN(getTimeMin(true)); IGNORE_RETURN(getTimeMax(true)); IGNORE_RETURN(getTimeAtValueMin(true)); IGNORE_RETURN(getTimeAtValueMax(true)); IGNORE_RETURN(getDecayMin(true)); IGNORE_RETURN(getDecayMax(true)); } // ServerObjectTemplate::_AttribMod::testValues #endif /** * Loads the template data from an iff file. We should already be in the form * for this template. * * @param file file to load from */ void ServerObjectTemplate::_AttribMod::load(Iff &file) { static const int MAX_NAME_SIZE = 256; char paramName[MAX_NAME_SIZE]; file.enterForm(); file.enterChunk(); int paramCount = file.read_int32(); file.exitChunk(); for (int i = 0; i < paramCount; ++i) { file.enterChunk(); file.read_string(paramName, MAX_NAME_SIZE); if (strcmp(paramName, "target") == 0) m_target.loadFromIff(file); else if (strcmp(paramName, "value") == 0) m_value.loadFromIff(file); else if (strcmp(paramName, "time") == 0) m_time.loadFromIff(file); else if (strcmp(paramName, "timeAtValue") == 0) m_timeAtValue.loadFromIff(file); else if (strcmp(paramName, "decay") == 0) m_decay.loadFromIff(file); file.exitChunk(true); } file.exitForm(); UNREF(file); } // ServerObjectTemplate::_AttribMod::load //============================================================================= // struct ServerObjectTemplate::Contents /** * Struct constructor. */ ServerObjectTemplate::Contents::Contents(void) { content = NULL; } // ServerObjectTemplate::Contents::Contents() /** * Struct copy constructor. */ ServerObjectTemplate::Contents::Contents(const ServerObjectTemplate::Contents & source) : slotName(source.slotName), equipObject(source.equipObject), content(source.content) { if (content != NULL) const_cast(content)->addReference(); } // ServerObjectTemplate::Contents::Contents(const ServerObjectTemplate::Contents &) /** * Struct destructor. */ ServerObjectTemplate::Contents::~Contents() { if (content != NULL) { content->releaseReference(); content = NULL; } } // ServerObjectTemplate::Contents::~Contents #ifdef WIN32 /** * Struct destructor. */ ServerObjectTemplate::Contents & ServerObjectTemplate::Contents::operator =(const ServerObjectTemplate::Contents &) { DEBUG_FATAL(true, ("operator = should not be called for template structures!")); return *this; } // ServerObjectTemplate::Contents::operator = #endif //============================================================================= // class ServerObjectTemplate::_Contents /** * Class constructor. */ ServerObjectTemplate::_Contents::_Contents(const std::string & filename) : ObjectTemplate(filename) { } // ServerObjectTemplate::_Contents::_Contents /** * Class destructor. */ ServerObjectTemplate::_Contents::~_Contents() { } // ServerObjectTemplate::_Contents::~_Contents /** * Static function used to register this template. */ void ServerObjectTemplate::_Contents::registerMe(void) { ObjectTemplateList::registerTemplate(_Contents_tag, create); } // ServerObjectTemplate::_Contents::registerMe /** * Creates a ServerObjectTemplate::_Contents template. * * @return a new instance of the template */ ObjectTemplate * ServerObjectTemplate::_Contents::create(const std::string & filename) { return new ServerObjectTemplate::_Contents(filename); } // ServerObjectTemplate::_Contents::create /** * Returns the template id. * * @return the template id */ Tag ServerObjectTemplate::_Contents::getId(void) const { return _Contents_tag; } // ServerObjectTemplate::_Contents::getId const std::string & ServerObjectTemplate::_Contents::getSlotName(bool versionOk, bool testData) const { #ifdef _DEBUG std::string testDataValue = DefaultString; #else UNREF(testData); #endif const ServerObjectTemplate::_Contents * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getSlotName(true); #endif } if (!m_slotName.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter slotName in template %s", DataResource::getName())); return DefaultString; } else { DEBUG_FATAL(base == NULL, ("Template parameter slotName has not been defined in template %s!", DataResource::getName())); return base->getSlotName(versionOk); } } const std::string & value = m_slotName.getValue(); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Contents::getSlotName bool ServerObjectTemplate::_Contents::getEquipObject(bool versionOk, bool testData) const { #ifdef _DEBUG bool testDataValue = false; #else UNREF(testData); #endif const ServerObjectTemplate::_Contents * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getEquipObject(true); #endif } if (!m_equipObject.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter equipObject in template %s", DataResource::getName())); return false; } else { DEBUG_FATAL(base == NULL, ("Template parameter equipObject has not been defined in template %s!", DataResource::getName())); return base->getEquipObject(versionOk); } } bool value = m_equipObject.getValue(); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Contents::getEquipObject const ServerObjectTemplate * ServerObjectTemplate::_Contents::getContent(bool versionOk) const { const ServerObjectTemplate::_Contents * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); } if (!m_content.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter content in template %s", DataResource::getName())); return NULL; } else { DEBUG_FATAL(base == NULL, ("Template parameter content has not been defined in template %s!", DataResource::getName())); return base->getContent(versionOk); } } const ServerObjectTemplate * returnValue = NULL; const std::string & templateName = m_content.getValue(); if (!templateName.empty()) { returnValue = dynamic_cast(ObjectTemplateList::fetch(templateName)); if (returnValue == NULL) WARNING_STRICT_FATAL(true, ("Error loading template %s",templateName.c_str())); } return returnValue; } // ServerObjectTemplate::_Contents::getContent #ifdef _DEBUG /** * Special function used by datalint. Checks for duplicate values in base and derived templates. */ void ServerObjectTemplate::_Contents::testValues(void) const { IGNORE_RETURN(getSlotName(true)); IGNORE_RETURN(getEquipObject(true)); } // ServerObjectTemplate::_Contents::testValues #endif /** * Loads the template data from an iff file. We should already be in the form * for this template. * * @param file file to load from */ void ServerObjectTemplate::_Contents::load(Iff &file) { static const int MAX_NAME_SIZE = 256; char paramName[MAX_NAME_SIZE]; file.enterForm(); file.enterChunk(); int paramCount = file.read_int32(); file.exitChunk(); for (int i = 0; i < paramCount; ++i) { file.enterChunk(); file.read_string(paramName, MAX_NAME_SIZE); if (strcmp(paramName, "slotName") == 0) m_slotName.loadFromIff(file); else if (strcmp(paramName, "equipObject") == 0) m_equipObject.loadFromIff(file); else if (strcmp(paramName, "content") == 0) m_content.loadFromIff(file); file.exitChunk(true); } file.exitForm(); UNREF(file); } // ServerObjectTemplate::_Contents::load //============================================================================= // class ServerObjectTemplate::_MentalStateMod /** * Class constructor. */ ServerObjectTemplate::_MentalStateMod::_MentalStateMod(const std::string & filename) : ObjectTemplate(filename) { } // ServerObjectTemplate::_MentalStateMod::_MentalStateMod /** * Class destructor. */ ServerObjectTemplate::_MentalStateMod::~_MentalStateMod() { } // ServerObjectTemplate::_MentalStateMod::~_MentalStateMod /** * Static function used to register this template. */ void ServerObjectTemplate::_MentalStateMod::registerMe(void) { ObjectTemplateList::registerTemplate(_MentalStateMod_tag, create); } // ServerObjectTemplate::_MentalStateMod::registerMe /** * Creates a ServerObjectTemplate::_MentalStateMod template. * * @return a new instance of the template */ ObjectTemplate * ServerObjectTemplate::_MentalStateMod::create(const std::string & filename) { return new ServerObjectTemplate::_MentalStateMod(filename); } // ServerObjectTemplate::_MentalStateMod::create /** * Returns the template id. * * @return the template id */ Tag ServerObjectTemplate::_MentalStateMod::getId(void) const { return _MentalStateMod_tag; } // ServerObjectTemplate::_MentalStateMod::getId ServerObjectTemplate::MentalStates ServerObjectTemplate::_MentalStateMod::getTarget(bool versionOk, bool testData) const { #ifdef _DEBUG ServerObjectTemplate::MentalStates testDataValue = static_cast(0); #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTarget(true); #endif } if (!m_target.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter target in template %s", DataResource::getName())); return static_cast(0); } else { DEBUG_FATAL(base == NULL, ("Template parameter target has not been defined in template %s!", DataResource::getName())); return base->getTarget(versionOk); } } MentalStates value = static_cast(m_target.getValue()); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTarget float ServerObjectTemplate::_MentalStateMod::getValue(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValue(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValue(versionOk); } } float value = m_value.getValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValue(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getValue float ServerObjectTemplate::_MentalStateMod::getValueMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValueMin(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValueMin(versionOk); } } float value = m_value.getMinValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValueMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getValueMin float ServerObjectTemplate::_MentalStateMod::getValueMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValueMax(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValueMax(versionOk); } } float value = m_value.getMaxValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValueMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getValueMax float ServerObjectTemplate::_MentalStateMod::getTime(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTime(true); #endif } if (!m_time.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter time in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter time has not been defined in template %s!", DataResource::getName())); return base->getTime(versionOk); } } float value = m_time.getValue(); char delta = m_time.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTime(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTime float ServerObjectTemplate::_MentalStateMod::getTimeMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeMin(true); #endif } if (!m_time.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter time in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter time has not been defined in template %s!", DataResource::getName())); return base->getTimeMin(versionOk); } } float value = m_time.getMinValue(); char delta = m_time.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTimeMin float ServerObjectTemplate::_MentalStateMod::getTimeMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeMax(true); #endif } if (!m_time.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter time in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter time has not been defined in template %s!", DataResource::getName())); return base->getTimeMax(versionOk); } } float value = m_time.getMaxValue(); char delta = m_time.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTimeMax float ServerObjectTemplate::_MentalStateMod::getTimeAtValue(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeAtValue(true); #endif } if (!m_timeAtValue.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter timeAtValue in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter timeAtValue has not been defined in template %s!", DataResource::getName())); return base->getTimeAtValue(versionOk); } } float value = m_timeAtValue.getValue(); char delta = m_timeAtValue.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeAtValue(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTimeAtValue float ServerObjectTemplate::_MentalStateMod::getTimeAtValueMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeAtValueMin(true); #endif } if (!m_timeAtValue.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter timeAtValue in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter timeAtValue has not been defined in template %s!", DataResource::getName())); return base->getTimeAtValueMin(versionOk); } } float value = m_timeAtValue.getMinValue(); char delta = m_timeAtValue.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeAtValueMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTimeAtValueMin float ServerObjectTemplate::_MentalStateMod::getTimeAtValueMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getTimeAtValueMax(true); #endif } if (!m_timeAtValue.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter timeAtValue in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter timeAtValue has not been defined in template %s!", DataResource::getName())); return base->getTimeAtValueMax(versionOk); } } float value = m_timeAtValue.getMaxValue(); char delta = m_timeAtValue.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getTimeAtValueMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getTimeAtValueMax float ServerObjectTemplate::_MentalStateMod::getDecay(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getDecay(true); #endif } if (!m_decay.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter decay in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter decay has not been defined in template %s!", DataResource::getName())); return base->getDecay(versionOk); } } float value = m_decay.getValue(); char delta = m_decay.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getDecay(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getDecay float ServerObjectTemplate::_MentalStateMod::getDecayMin(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getDecayMin(true); #endif } if (!m_decay.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter decay in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter decay has not been defined in template %s!", DataResource::getName())); return base->getDecayMin(versionOk); } } float value = m_decay.getMinValue(); char delta = m_decay.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getDecayMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getDecayMin float ServerObjectTemplate::_MentalStateMod::getDecayMax(bool versionOk, bool testData) const { #ifdef _DEBUG float testDataValue = 0.0f; #else UNREF(testData); #endif const ServerObjectTemplate::_MentalStateMod * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getDecayMax(true); #endif } if (!m_decay.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter decay in template %s", DataResource::getName())); return 0.0f; } else { DEBUG_FATAL(base == NULL, ("Template parameter decay has not been defined in template %s!", DataResource::getName())); return base->getDecayMax(versionOk); } } float value = m_decay.getMaxValue(); char delta = m_decay.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { float baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getDecayMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_MentalStateMod::getDecayMax #ifdef _DEBUG /** * Special function used by datalint. Checks for duplicate values in base and derived templates. */ void ServerObjectTemplate::_MentalStateMod::testValues(void) const { IGNORE_RETURN(getTarget(true)); IGNORE_RETURN(getValueMin(true)); IGNORE_RETURN(getValueMax(true)); IGNORE_RETURN(getTimeMin(true)); IGNORE_RETURN(getTimeMax(true)); IGNORE_RETURN(getTimeAtValueMin(true)); IGNORE_RETURN(getTimeAtValueMax(true)); IGNORE_RETURN(getDecayMin(true)); IGNORE_RETURN(getDecayMax(true)); } // ServerObjectTemplate::_MentalStateMod::testValues #endif /** * Loads the template data from an iff file. We should already be in the form * for this template. * * @param file file to load from */ void ServerObjectTemplate::_MentalStateMod::load(Iff &file) { static const int MAX_NAME_SIZE = 256; char paramName[MAX_NAME_SIZE]; file.enterForm(); file.enterChunk(); int paramCount = file.read_int32(); file.exitChunk(); for (int i = 0; i < paramCount; ++i) { file.enterChunk(); file.read_string(paramName, MAX_NAME_SIZE); if (strcmp(paramName, "target") == 0) m_target.loadFromIff(file); else if (strcmp(paramName, "value") == 0) m_value.loadFromIff(file); else if (strcmp(paramName, "time") == 0) m_time.loadFromIff(file); else if (strcmp(paramName, "timeAtValue") == 0) m_timeAtValue.loadFromIff(file); else if (strcmp(paramName, "decay") == 0) m_decay.loadFromIff(file); file.exitChunk(true); } file.exitForm(); UNREF(file); } // ServerObjectTemplate::_MentalStateMod::load //============================================================================= // class ServerObjectTemplate::_Xp /** * Class constructor. */ ServerObjectTemplate::_Xp::_Xp(const std::string & filename) : ObjectTemplate(filename) { } // ServerObjectTemplate::_Xp::_Xp /** * Class destructor. */ ServerObjectTemplate::_Xp::~_Xp() { } // ServerObjectTemplate::_Xp::~_Xp /** * Static function used to register this template. */ void ServerObjectTemplate::_Xp::registerMe(void) { ObjectTemplateList::registerTemplate(_Xp_tag, create); } // ServerObjectTemplate::_Xp::registerMe /** * Creates a ServerObjectTemplate::_Xp template. * * @return a new instance of the template */ ObjectTemplate * ServerObjectTemplate::_Xp::create(const std::string & filename) { return new ServerObjectTemplate::_Xp(filename); } // ServerObjectTemplate::_Xp::create /** * Returns the template id. * * @return the template id */ Tag ServerObjectTemplate::_Xp::getId(void) const { return _Xp_tag; } // ServerObjectTemplate::_Xp::getId ServerObjectTemplate::XpTypes ServerObjectTemplate::_Xp::getType(bool versionOk, bool testData) const { #ifdef _DEBUG ServerObjectTemplate::XpTypes testDataValue = static_cast(0); #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getType(true); #endif } if (!m_type.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter type in template %s", DataResource::getName())); return static_cast(0); } else { DEBUG_FATAL(base == NULL, ("Template parameter type has not been defined in template %s!", DataResource::getName())); return base->getType(versionOk); } } XpTypes value = static_cast(m_type.getValue()); #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getType int ServerObjectTemplate::_Xp::getLevel(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getLevel(true); #endif } if (!m_level.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter level in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter level has not been defined in template %s!", DataResource::getName())); return base->getLevel(versionOk); } } int value = m_level.getValue(); char delta = m_level.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getLevel(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getLevel int ServerObjectTemplate::_Xp::getLevelMin(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getLevelMin(true); #endif } if (!m_level.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter level in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter level has not been defined in template %s!", DataResource::getName())); return base->getLevelMin(versionOk); } } int value = m_level.getMinValue(); char delta = m_level.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getLevelMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getLevelMin int ServerObjectTemplate::_Xp::getLevelMax(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getLevelMax(true); #endif } if (!m_level.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter level in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter level has not been defined in template %s!", DataResource::getName())); return base->getLevelMax(versionOk); } } int value = m_level.getMaxValue(); char delta = m_level.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getLevelMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getLevelMax int ServerObjectTemplate::_Xp::getValue(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValue(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValue(versionOk); } } int value = m_value.getValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValue(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getValue int ServerObjectTemplate::_Xp::getValueMin(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValueMin(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValueMin(versionOk); } } int value = m_value.getMinValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValueMin(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getValueMin int ServerObjectTemplate::_Xp::getValueMax(bool versionOk, bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerObjectTemplate::_Xp * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getValueMax(true); #endif } if (!m_value.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter value in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter value has not been defined in template %s!", DataResource::getName())); return base->getValueMax(versionOk); } } int value = m_value.getMaxValue(); char delta = m_value.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getValueMax(versionOk); else if (ms_allowDefaultTemplateParams) DEBUG_WARNING(true, ("No base template for delta, using 0")); else NOT_NULL(base); } if (delta == '+') value = baseValue + value; else if (delta == '-') value = baseValue - value; else if (delta == '=') value = baseValue + static_cast(baseValue * (value / 100.0f)); else if (delta == '_') value = baseValue - static_cast(baseValue * (value / 100.0f)); } #ifdef _DEBUG if (testData && base != NULL) { } #endif return value; } // ServerObjectTemplate::_Xp::getValueMax #ifdef _DEBUG /** * Special function used by datalint. Checks for duplicate values in base and derived templates. */ void ServerObjectTemplate::_Xp::testValues(void) const { IGNORE_RETURN(getType(true)); IGNORE_RETURN(getLevelMin(true)); IGNORE_RETURN(getLevelMax(true)); IGNORE_RETURN(getValueMin(true)); IGNORE_RETURN(getValueMax(true)); } // ServerObjectTemplate::_Xp::testValues #endif /** * Loads the template data from an iff file. We should already be in the form * for this template. * * @param file file to load from */ void ServerObjectTemplate::_Xp::load(Iff &file) { static const int MAX_NAME_SIZE = 256; char paramName[MAX_NAME_SIZE]; file.enterForm(); file.enterChunk(); int paramCount = file.read_int32(); file.exitChunk(); for (int i = 0; i < paramCount; ++i) { file.enterChunk(); file.read_string(paramName, MAX_NAME_SIZE); if (strcmp(paramName, "type") == 0) m_type.loadFromIff(file); else if (strcmp(paramName, "level") == 0) m_level.loadFromIff(file); else if (strcmp(paramName, "value") == 0) m_value.loadFromIff(file); file.exitChunk(true); } file.exitForm(); UNREF(file); } // ServerObjectTemplate::_Xp::load //@END TFD