diff options
| author | Jonas Ask | 2009-10-20 12:23:52 +0000 |
|---|---|---|
| committer | Jonas Ask | 2009-10-20 12:23:52 +0000 |
| commit | 9b1b95b33e4ba93a6ab7fed504d4bcf6e2abee9a (patch) | |
| tree | 2a7833db49114f38fd87fbaf39e0b69279bb8c2e /GameBuildings.cpp | |
| parent | 002c766257789fabe04deeb9d79d2e3fbcefc195 (diff) | |
| download | stonesense-9b1b95b33e4ba93a6ab7fed504d4bcf6e2abee9a.tar.gz stonesense-9b1b95b33e4ba93a6ab7fed504d4bcf6e2abee9a.tar.bz2 stonesense-9b1b95b33e4ba93a6ab7fed504d4bcf6e2abee9a.tar.xz | |
Adding all the code and resources for the first time. God speed!
Diffstat (limited to 'GameBuildings.cpp')
| -rw-r--r-- | GameBuildings.cpp | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/GameBuildings.cpp b/GameBuildings.cpp new file mode 100644 index 0000000..3628e43 --- /dev/null +++ b/GameBuildings.cpp @@ -0,0 +1,273 @@ +#include "common.h"
+#include "GUI.h"
+#include "SpriteMaps.h"
+#include "GameBuildings.h"
+
+
+void loadSpecialBuildingTypes (DisplaySegment* segment, Block* b, uint32_t relativex, uint32_t relativey, uint32_t height);
+
+int BlockNeighbourhoodType_simple(DisplaySegment* segment, Block* b, bool validationFuctionProc(Block*) ){
+ uint32_t x,y,z;
+ x = b->x; y = b->y; z = b->z;
+
+ bool n = validationFuctionProc( segment->getBlock( x, y-1, z) );
+ bool s = validationFuctionProc( segment->getBlock( x, y+1, z) );
+ bool e = validationFuctionProc( segment->getBlock( x+1, y, z) );
+ bool w = validationFuctionProc( segment->getBlock( x-1, y, z) );
+ /*bool nw = validationFuctionProc( segment->getBlock(, x-1, y-1, z) );
+ bool ne = validationFuctionProc( segment->getBlock(, x+1, y-1, z) );
+ bool SW = validationFuctionProc( segment->getBlock(, x-1, y+1, z) );
+ bool se = validationFuctionProc( segment->getBlock(, x+1, y+1, z) );*/
+
+ if(!n && !s && !w && !e) return eSimpleSingle;
+ if( n && !s && !w && !e) return eSimpleN;
+ if(!n && !s && w && !e) return eSimpleW;
+ if(!n && s && !w && !e) return eSimpleS;
+ if(!n && !s && !w && e) return eSimpleE;
+
+ if( n && s && !w && !e) return eSimpleNnS;
+ if(!n && !s && w && e) return eSimpleWnE;
+
+ if( n && !s && w && !e) return eSimpleNnW;
+ if(!n && s && w && !e) return eSimpleSnW;
+ if(!n && s && !w && e) return eSimpleSnE;
+ if( n && !s && !w && e) return eSimpleNnE;
+
+ //....
+
+ return eSimpleSingle;
+}
+//
+//bool hasWall(Block* b){
+// if(!b) return false;
+// return b->wallType > 0;
+//}
+
+bool blockHasBridge(Block* b){
+ if(!b) return 0;
+ return b->building.type == BUILDINGTYPE_BRIDGE;
+}
+
+dirTypes findWallCloseTo(DisplaySegment* segment, Block* b){
+ uint32_t x,y,z;
+ x = b->x; y = b->y; z = b->z;
+ bool n = hasWall( segment->getBlock( x, y-1, z) );
+ bool s = hasWall( segment->getBlock( x, y+1, z) );
+ bool e = hasWall( segment->getBlock( x+1, y, z) );
+ bool w = hasWall( segment->getBlock( x-1, y, z) );
+
+ if(w) return eSimpleW;
+ if(n) return eSimpleN;
+ if(s) return eSimpleS;
+ if(e) return eSimpleE;
+
+ return eSimpleSingle;
+}
+
+void ReadBuildings(DFHackAPI& DF, vector<t_building>* buildingHolder){
+ if(!buildingHolder) return;
+
+ vector <string> v_buildingtypes;//should be empty for all buildings
+ uint32_t numbuildings = DF.InitReadBuildings(v_buildingtypes);
+ t_building tempbuilding;
+
+ uint32_t index = 0;
+ while(index < numbuildings){
+ DF.ReadBuilding(index, tempbuilding);
+ buildingHolder->push_back(tempbuilding);
+ index++;
+ }
+}
+
+
+void MergeBuildingsToSegment(vector<t_building>* buildings, DisplaySegment* segment){
+ t_building tempbuilding;
+
+ uint32_t index = 0;
+ for(uint32_t i=0; i < buildings->size(); i++){
+ tempbuilding = (*buildings)[i];
+
+ int bheight = tempbuilding.y2 - tempbuilding.y1;
+ for(uint32_t yy = tempbuilding.y1; yy <= tempbuilding.y2; yy++)
+ for(uint32_t xx = tempbuilding.x1; xx <= tempbuilding.x2; xx++){
+ Block* b;
+ //want hashtable :(
+ if( b = segment->getBlock( xx, yy, tempbuilding.z) ){
+ b->building = tempbuilding;
+ //b->building.x1 = b->building.x2 = xx;
+ //b->building.y1 = b->building.y2 = yy;
+ loadSpecialBuildingTypes(segment, b, xx-tempbuilding.x1, yy-tempbuilding.y1, bheight);
+ }
+ }
+
+ index++;
+ }
+
+}
+
+int layoutTradeDepot[] = {
+ SPRITEOBJECT_COLUMN,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_COLUMN,
+ SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+ SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_COLUMN,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+ SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+ SPRITEOBJECT_COLUMN,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_COLUMN
+};
+int layoutStill[] = {
+ SPRITEOBJECT_COLUMN,SPRITEOBJECT_STATUE,SPRITEOBJECT_STATUE,
+ SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+ SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+};
+
+int layoutCarpenter[] = {
+ SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+ SPRITEOBJECT_TABLE_WOOD,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_PAVEDFLOOR,
+ SPRITEOBJECT_TABLE_WOOD,SPRITEOBJECT_PAVEDFLOOR,SPRITEOBJECT_TABLE_WOOD,
+};
+
+
+
+
+void loadSpecialBuildingTypes (DisplaySegment* segment, Block* b, uint32_t relativex, uint32_t relativey, uint32_t height){
+
+ int* buildingInfoArray = 0;
+ int arrayIndex;
+ int i;
+
+ switch(b->building.type){
+ case BUILDINGTYPE_DOOR:
+
+ i = findWallCloseTo(segment,b);
+ if( i == eSimpleN || i == eSimpleS )
+ b->mirroredBuilding = true;
+ break;
+
+ case BUILDINGTYPE_TRADEDEPOT:
+ buildingInfoArray = layoutTradeDepot;
+ //v = BlockNeighbourhoodType_simple(segment, b, &blockHasTradeDepot );
+ /*if(v)
+ b->overridingBuildingType = SPRITEOBJECT_COLUMN;
+ else
+ b->overridingBuildingType = SPRITEOBJECT_PAVEDFLOOR;*/
+ break;
+ case BUILDINGTYPE_W_STILL:
+ //buildingInfoArray = layoutStill;
+ break;
+ case BUILDINGTYPE_W_CARPENTER:
+ //buildingInfoArray = layoutCarpenter;
+ break;
+ case BUILDINGTYPE_BRIDGE:
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_C2;
+
+ if(b->building.x1 == b->x)
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_W;
+ if(b->building.x2 == b->x)
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_E;
+
+ if(b->building.y1 == b->y){
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_N;
+ if( b->building.x1 == b->x )
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_NW;
+ if( b->building.x2 == b->x )
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_NE;
+ }
+ if(b->building.y2 == b->y){
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_S;
+ if( b->building.x1 == b->x )
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_SW;
+ if( b->building.x2 == b->x )
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_SE;
+ }
+
+ if(b->building.y2 == b->building.y1 || b->building.x2 == b->building.x1 )
+ b->overridingBuildingType = SPRITEOBJECT_BRIDGE_C;
+ break;
+ }
+
+ if(buildingInfoArray){
+ arrayIndex = relativex + relativey*(height+1);
+ b->overridingBuildingType = buildingInfoArray[arrayIndex];
+ }
+}
+
+
+
+int getBuildingSprite(t_building &building, bool mirrored){
+
+ switch(building.type){
+ case BUILDINGTYPE_DOOR:
+ if(building.material.type == Mat_Wood) {
+ if(building.material.index == 9)//custom case for Willow doors, just to show it's possible
+ return mirrored ? SPRITEOBJECT_DOORWOOD_WILLOW_MIR : SPRITEOBJECT_DOORWOOD_WILLOW;
+ return mirrored ? SPRITEOBJECT_DOORWOOD_MIR : SPRITEOBJECT_DOORWOOD;
+ }
+ if(building.material.type == Mat_Stone)
+ return mirrored ? SPRITEOBJECT_DOORROCK_MIR : SPRITEOBJECT_DOORROCK;
+ break;
+
+ case BUILDINGTYPE_STOCKPILE:
+ return SPRITEOBJECT_STOCKPILE;
+ break;
+
+ case BUILDINGTYPE_ARMORSTAND:
+ return SPRITEOBJECT_ARMORSTAND;
+ break;
+
+ case BUILDINGTYPE_BED:
+ return SPRITEOBJECT_BED_WOOD;
+ break;
+
+ case BUILDINGTYPE_TABLE:
+ if(building.material.type == Mat_Wood)
+ return SPRITEOBJECT_TABLE_WOOD;
+ else
+ return SPRITEOBJECT_TABLE_ROCK;
+ break;
+ case BUILDINGTYPE_CHAIR:
+ if(building.material.type == Mat_Wood)
+ return SPRITEOBJECT_CHAIR_WOOD;
+ else
+ return SPRITEOBJECT_CHAIR_ROCK;
+ break;
+ case BUILDINGTYPE_STATUE:
+ return SPRITEOBJECT_STATUE;
+ break;
+ case BUILDINGTYPE_CABINET:
+ if(building.material.type == Mat_Wood)
+ return SPRITEOBJECT_CABINET_WOOD;
+ else
+ return SPRITEOBJECT_CABINET;
+ break;
+ case BUILDINGTYPE_CONTAINER:
+ return SPRITEOBJECT_CHEST;
+ case BUILDINGTYPE_FARM:
+ return SPRITEOBJECT_FARM;
+ break;
+ case BUILDINGTYPE_ZONE:
+ return SPRITEOBJECT_CURSORZONE;
+ break;
+ case BUILDINGTYPE_BULEPRINT:
+ return SPRITEOBJECT_BLUEPRINT;
+ break;
+ case BUILDINGTYPE_ROAD:
+ return SPRITEOBJECT_BRIDGE_C;
+ break;
+ }
+
+
+ return SPRITEOBJECT_NA;
+}
+
+
+bool BlockHasSuspendedBuilding(vector<t_building>* buildingList, Block* b){
+ for(uint32_t i=0; i < buildingList->size(); i++){
+ t_building* building = &(*buildingList)[i];
+ if(building->type == BUILDINGTYPE_BRIDGE){
+ if(b->z == building->z)
+ if(b->x >= building->x1 && b->x <= building->x2)
+ if(b->y >= building->y1 && b->y <= building->y2)
+ return true;
+
+ }
+ }
+ return false;
+}
\ No newline at end of file |
