diff options
| author | Petr Mrázek | 2012-02-19 10:43:12 +0100 |
|---|---|---|
| committer | Petr Mrázek | 2012-02-19 10:43:12 +0100 |
| commit | 7c346109c5b370a226a46585cfa2e461b0d100d0 (patch) | |
| tree | 2eeff170b0b7e8ca7f944955730ee92bdc2a7261 /ContentBuildingReader.cpp | |
| parent | d219e323689a7ea5d387346b906241f2e999df1e (diff) | |
| download | stonesense-7c346109c5b370a226a46585cfa2e461b0d100d0.tar.gz stonesense-7c346109c5b370a226a46585cfa2e461b0d100d0.tar.bz2 stonesense-7c346109c5b370a226a46585cfa2e461b0d100d0.tar.xz | |
Break everything forever.
Diffstat (limited to 'ContentBuildingReader.cpp')
| -rw-r--r-- | ContentBuildingReader.cpp | 180 |
1 files changed, 130 insertions, 50 deletions
diff --git a/ContentBuildingReader.cpp b/ContentBuildingReader.cpp index 5685ca6..10dc0bb 100644 --- a/ContentBuildingReader.cpp +++ b/ContentBuildingReader.cpp @@ -281,64 +281,144 @@ bool parseSpriteNode(SpriteNode* node, TiXmlElement* elemParent) return true;
}
-bool addSingleBuildingConfig( TiXmlElement* elemRoot, vector<BuildingConfiguration>* knownBuildings ){
- const char* strName = elemRoot->Attribute("name");
- const char* strGameID = elemRoot->Attribute("gameID");
-
- if (strName == NULL || strGameID == NULL || strName[0] == 0 || strGameID[0] == 0)
- {
- contentError("<building> node must have name and gameID attributes",elemRoot);
- return false;
- }
-
- int gameID = TranslateBuildingName(strGameID, contentLoader->classIdStrings );
-
- if (gameID == INVALID_INDEX) {
- return false;
- }
+#include "df/siegeengine_type.h"
+#include "df/workshop_type.h"
+#include "df/trap_type.h"
+#include "df/shop_type.h"
+#include "df/construction_type.h"
+#include "df/furnace_type.h"
- BuildingConfiguration building(strName, gameID );
- RootBlock* spriteroot = new RootBlock();
- building.sprites = spriteroot;
- if (!parseSpriteNode(spriteroot,elemRoot))
- {
- delete(spriteroot);
- return false;
- }
+bool addSingleBuildingConfig( TiXmlElement* elemRoot, vector<BuildingConfiguration>* knownBuildings ){
+ const char* strName = elemRoot->Attribute("name");
+ const char* strGameID = elemRoot->Attribute("game_type");
+ const char* strGameSub = elemRoot->Attribute("game_subtype");
+ const char* strGameCustom = elemRoot->Attribute("game_custom");
- //add a copy of 'building' to known buildings
- knownBuildings->push_back( building );
- return true;
-}
+ if (strName == NULL || strGameID == NULL || strName[0] == 0 || strGameID[0] == 0)
+ {
+ contentError("<building> node must have name and game_type attributes",elemRoot);
+ return false;
+ }
+ building_type::building_type main_type = (building_type::building_type) INVALID_INDEX;
+ int subtype = INVALID_INDEX;
-bool addSingleCustomBuildingConfig( TiXmlElement* elemRoot, vector<BuildingConfiguration>* knownBuildings ){
- const char* strName = elemRoot->Attribute("name");
- const char* strGameID = elemRoot->Attribute("gameID");
+ FOR_ENUM_ITEMS(building_type,i)
+ {
+ if (strGameID == ENUM_KEY_STR(building_type,i))
+ {
+ main_type = i;
+ break;
+ }
+ }
+ if(main_type == (building_type::building_type) INVALID_INDEX)
+ return false;
- if (strName == NULL || strGameID == NULL || strName[0] == 0 || strGameID[0] == 0)
- {
- contentError("<building> node must have name and gameID attributes",elemRoot);
- return false;
- }
+ // get subtype string, if available
+ string sub;
+ if(strGameSub)
+ sub = strGameSub;
- int gameID = TranslateBuildingName(strGameID, contentLoader->custom_workshop_types );
+ bool needs_custom = false;
- if (gameID == INVALID_INDEX) {
- return false;
- }
+ // process types
+ switch (main_type)
+ {
+ case building_type::Furnace:
+ {
+ FOR_ENUM_ITEMS(furnace_type,i)
+ {
+ if (strGameSub == ENUM_KEY_STR(furnace_type,i))
+ {
+ subtype = i;
+ break;
+ }
+ }
+ if(subtype == INVALID_INDEX)
+ return false;
+ if(subtype == furnace_type::Custom)
+ needs_custom = true;
+ break;
+ }
+ case building_type::Construction:
+ {
+ FOR_ENUM_ITEMS(construction_type,i)
+ {
+ if (strGameSub == ENUM_KEY_STR(construction_type,i))
+ {
+ subtype = i;
+ break;
+ }
+ }
+ if(subtype == INVALID_INDEX)
+ return false;
+ break;
+ }
+ case building_type::SiegeEngine:
+ {
+ FOR_ENUM_ITEMS(siegeengine_type,i)
+ {
+ if (strGameSub == ENUM_KEY_STR(siegeengine_type,i))
+ {
+ subtype = i;
+ break;
+ }
+ }
+ if(subtype == INVALID_INDEX)
+ return false;
+ break;
+ }
+ case building_type::Shop:
+ {
+ FOR_ENUM_ITEMS(shop_type,i)
+ {
+ if (strGameSub == ENUM_KEY_STR(shop_type,i))
+ {
+ subtype = i;
+ break;
+ }
+ }
+ if(subtype == INVALID_INDEX)
+ return false;
+ break;
+ }
+ case building_type::Workshop:
+ {
+ FOR_ENUM_ITEMS(workshop_type,i)
+ {
+ if (strGameSub == ENUM_KEY_STR(workshop_type,i))
+ {
+ subtype = i;
+ break;
+ }
+ }
+ if(subtype == INVALID_INDEX)
+ return false;
+ if(subtype == workshop_type::Custom)
+ needs_custom = true;
+ break;
+ }
+ default:
+ {
+ // we need no sub/custom type.
+ break;
+ }
+ }
+ // needs custom building spec, doesn't have a string... FAIL
+ if (needs_custom && !strGameCustom)
+ return false;
- BuildingConfiguration building(strName, gameID );
- RootBlock* spriteroot = new RootBlock();
- building.sprites = spriteroot;
- if (!parseSpriteNode(spriteroot,elemRoot))
- {
- delete(spriteroot);
- return false;
- }
+ BuildingConfiguration building(strName, main_type, subtype, string(strGameCustom) );
+ RootBlock* spriteroot = new RootBlock();
+ building.sprites = spriteroot;
+ if (!parseSpriteNode(spriteroot,elemRoot))
+ {
+ delete(spriteroot);
+ return false;
+ }
- //add a copy of 'building' to known buildings
- knownBuildings->push_back( building );
- return true;
+ //add a copy of 'building' to known buildings
+ knownBuildings->push_back( building );
+ return true;
}
void flushBuildingConfig( vector<BuildingConfiguration>* knownBuildings )
|
