/* Copyright (C) 2010 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ #include "precompiled.h" #include "TerrainProperties.h" #include #include #include "ps/Filesystem.h" #include "ps/CLogger.h" #include "ps/Parser.h" #include "ps/XML/XeroXMB.h" #include "ps/XML/Xeromyces.h" #include "TextureManager.h" #include "ps/Overlay.h" CTerrainProperties::CTerrainProperties(CTerrainPropertiesPtr parent): m_pParent(parent), m_BaseColor(0), m_HasBaseColor(false), m_MovementClass("default") { if (m_pParent) m_Groups = m_pParent->m_Groups; } CTerrainPropertiesPtr CTerrainProperties::FromXML(const CTerrainPropertiesPtr& parent, const VfsPath& pathname) { CXeromyces XeroFile; if (XeroFile.Load(g_VFS, pathname) != PSRETURN_OK) return CTerrainPropertiesPtr(); XMBElement root = XeroFile.GetRoot(); CStr rootName = XeroFile.GetElementString(root.GetNodeName()); // Check that we've got the right kind of xml document if (rootName != "Terrains") { LOGERROR( L"TerrainProperties: Loading %ls: Root node is not terrains (found \"%hs\")", pathname.string().c_str(), rootName.c_str()); return CTerrainPropertiesPtr(); } #define ELMT(x) int el_##x = XeroFile.GetElementID(#x) ELMT(terrain); #undef ELMT // Ignore all non-terrain nodes, loading the first terrain node and // returning it. // Really, we only expect there to be one child and it to be of the right // type, though. XERO_ITER_EL(root, child) { if (child.GetNodeName() == el_terrain) { CTerrainPropertiesPtr ret (new CTerrainProperties(parent)); ret->LoadXml(child, &XeroFile, pathname); return ret; } else { LOGWARNING( L"TerrainProperties: Loading %ls: Unexpected node %hs\n", pathname.string().c_str(), XeroFile.GetElementString(child.GetNodeName()).c_str()); // Keep reading - typos shouldn't be showstoppers } } return CTerrainPropertiesPtr(); } void CTerrainProperties::LoadXml(XMBElement node, CXeromyces *pFile, const VfsPath& pathname) { #define ELMT(x) int elmt_##x = pFile->GetElementID(#x) #define ATTR(x) int attr_##x = pFile->GetAttributeID(#x) // Terrain Attribs ATTR(mmap); ATTR(groups); ATTR(movementclass); #undef ELMT #undef ATTR XERO_ITER_ATTR(node, attr) { if (attr.Name == attr_groups) { // Parse a comma-separated list of groups, add the new entry to // each of them CParser parser; CParserLine parserLine; parser.InputTaskType("GroupList", "<_$value_,>_$value_"); if (!parserLine.ParseString(parser, CStr(attr.Value))) continue; m_Groups.clear(); for (size_t i=0;iHasBaseColor()); } u32 CTerrainProperties::GetBaseColor() { if (m_HasBaseColor || !m_pParent) return m_BaseColor; else if (m_pParent) return m_pParent->GetBaseColor(); else // White, full opacity.. but this value shouldn't ever be used return 0xFFFFFFFF; }