//======================================================================== // // ServerResourceContainerObjectTemplate.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 "ServerResourceContainerObjectTemplate.h" #include "serverGame/ResourceContainerObject.h" #include "sharedFile/Iff.h" #include "sharedObject/ObjectTemplate.h" #include "sharedObject/ObjectTemplateList.h" //@BEGIN TFD TEMPLATE REFS //@END TFD TEMPLATE REFS #include const std::string DefaultString(""); const StringId DefaultStringId("", 0); const Vector DefaultVector(0,0,0); const TriggerVolumeData DefaultTriggerVolumeData; bool ServerResourceContainerObjectTemplate::ms_allowDefaultTemplateParams = true; /** * Class constructor. */ ServerResourceContainerObjectTemplate::ServerResourceContainerObjectTemplate(const std::string & filename) //@BEGIN TFD INIT : ServerTangibleObjectTemplate(filename) ,m_versionOk(true) //@END TFD INIT { } // ServerResourceContainerObjectTemplate::ServerResourceContainerObjectTemplate /** * Class destructor. */ ServerResourceContainerObjectTemplate::~ServerResourceContainerObjectTemplate() { //@BEGIN TFD CLEANUP //@END TFD CLEANUP } // ServerResourceContainerObjectTemplate::~ServerResourceContainerObjectTemplate /** * Static function used to register this template. */ void ServerResourceContainerObjectTemplate::registerMe(void) { ObjectTemplateList::registerTemplate(ServerResourceContainerObjectTemplate_tag, create); } // ServerResourceContainerObjectTemplate::registerMe /** * Creates a ServerResourceContainerObjectTemplate template. * * @return a new instance of the template */ ObjectTemplate * ServerResourceContainerObjectTemplate::create(const std::string & filename) { return new ServerResourceContainerObjectTemplate(filename); } // ServerResourceContainerObjectTemplate::create /** * Returns the template id. * * @return the template id */ Tag ServerResourceContainerObjectTemplate::getId(void) const { return ServerResourceContainerObjectTemplate_tag; } // ServerResourceContainerObjectTemplate::getId /** * Returns this template's version. * * @return the version */ Tag ServerResourceContainerObjectTemplate::getTemplateVersion(void) const { return m_templateVersion; } // ServerResourceContainerObjectTemplate::getTemplateVersion /** * Returns the highest version of this template or it's base templates. * * @return the highest version */ Tag ServerResourceContainerObjectTemplate::getHighestTemplateVersion(void) const { if (m_baseData == NULL) return m_templateVersion; const ServerResourceContainerObjectTemplate * base = dynamic_cast(m_baseData); if (base == NULL) return m_templateVersion; return std::max(m_templateVersion, base->getHighestTemplateVersion()); } // ServerResourceContainerObjectTemplate::getHighestTemplateVersion /** * Creates a new object from this template. * * @return the object */ Object * ServerResourceContainerObjectTemplate::createObject(void) const { return new ResourceContainerObject(this); } // ServerResourceContainerObjectTemplate::createObject //@BEGIN TFD int ServerResourceContainerObjectTemplate::getMaxResources(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerResourceContainerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getMaxResources(true); #endif } if (!m_maxResources.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter maxResources in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter maxResources has not been defined in template %s!", DataResource::getName())); return base->getMaxResources(); } } int value = m_maxResources.getValue(); char delta = m_maxResources.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getMaxResources(); 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; } // ServerResourceContainerObjectTemplate::getMaxResources int ServerResourceContainerObjectTemplate::getMaxResourcesMin(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerResourceContainerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getMaxResourcesMin(true); #endif } if (!m_maxResources.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter maxResources in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter maxResources has not been defined in template %s!", DataResource::getName())); return base->getMaxResourcesMin(); } } int value = m_maxResources.getMinValue(); char delta = m_maxResources.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getMaxResourcesMin(); 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; } // ServerResourceContainerObjectTemplate::getMaxResourcesMin int ServerResourceContainerObjectTemplate::getMaxResourcesMax(bool testData) const { #ifdef _DEBUG int testDataValue = 0; #else UNREF(testData); #endif const ServerResourceContainerObjectTemplate * base = NULL; if (m_baseData != NULL) { base = dynamic_cast(m_baseData); #ifdef _DEBUG if (testData && base != NULL) testDataValue = base->getMaxResourcesMax(true); #endif } if (!m_maxResources.isLoaded()) { if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL) { DEBUG_WARNING(true, ("Returning default value for missing parameter maxResources in template %s", DataResource::getName())); return 0; } else { DEBUG_FATAL(base == NULL, ("Template parameter maxResources has not been defined in template %s!", DataResource::getName())); return base->getMaxResourcesMax(); } } int value = m_maxResources.getMaxValue(); char delta = m_maxResources.getDeltaType(); if (delta == '+' || delta == '-' || delta == '_' || delta == '=') { int baseValue = 0; if (m_baseData != NULL) { if (base != NULL) baseValue = base->getMaxResourcesMax(); 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; } // ServerResourceContainerObjectTemplate::getMaxResourcesMax #ifdef _DEBUG /** * Special function used by datalint. Checks for duplicate values in base and derived templates. */ void ServerResourceContainerObjectTemplate::testValues(void) const { IGNORE_RETURN(getMaxResourcesMin(true)); IGNORE_RETURN(getMaxResourcesMax(true)); ServerTangibleObjectTemplate::testValues(); } // ServerResourceContainerObjectTemplate::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 ServerResourceContainerObjectTemplate::load(Iff &file) { static const int MAX_NAME_SIZE = 256; char paramName[MAX_NAME_SIZE]; if (file.getCurrentName() != ServerResourceContainerObjectTemplate_tag) { ServerTangibleObjectTemplate::load(file); 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,0,0)) { 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, "maxResources") == 0) m_maxResources.loadFromIff(file); file.exitChunk(true); } file.exitForm(); ServerTangibleObjectTemplate::load(file); file.exitForm(); return; } // ServerResourceContainerObjectTemplate::load //@END TFD