summaryrefslogtreecommitdiff
path: root/BlockCondition.cpp
diff options
context:
space:
mode:
authorJapa2010-04-09 14:12:29 +0000
committerJapa2010-04-09 14:12:29 +0000
commit81aefc8e03ff3f647494012e18bcdc8f33f4de42 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /BlockCondition.cpp
parentc3d0b7d6778af46299901d959d589d6599afa21c (diff)
downloadstonesense-81aefc8e03ff3f647494012e18bcdc8f33f4de42.tar.gz
stonesense-81aefc8e03ff3f647494012e18bcdc8f33f4de42.tar.bz2
stonesense-81aefc8e03ff3f647494012e18bcdc8f33f4de42.tar.xz
There is no trunk
it is not the code that compiles, it is you.
Diffstat (limited to 'BlockCondition.cpp')
-rw-r--r--BlockCondition.cpp349
1 files changed, 0 insertions, 349 deletions
diff --git a/BlockCondition.cpp b/BlockCondition.cpp
deleted file mode 100644
index d4bf2f3..0000000
--- a/BlockCondition.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-#include "BlockCondition.h"
-#include "GameBuildings.h"
-#include "WorldSegment.h"
-#include "ContentLoader.h"
-#include <iostream>
-
-int getDirectionFromString(const char* strDir)
-{
- if (strDir == NULL)
- return INVALID_INDEX;
- if( strcmp(strDir, "None") == 0)
- return eSimpleSingle;
- if( strcmp(strDir, "North") == 0)
- return eSimpleN;
- if( strcmp(strDir, "South") == 0)
- return eSimpleS;
- if( strcmp(strDir, "West") == 0)
- return eSimpleW;
- if( strcmp(strDir, "East") == 0)
- return eSimpleE;
- //these will change when rotation is available
- if( strcmp(strDir, "TopRight") == 0)
- return eSimpleN;
- if( strcmp(strDir, "BottomLeft") == 0)
- return eSimpleS;
- if( strcmp(strDir, "TopLeft") == 0)
- return eSimpleW;
- if( strcmp(strDir, "BottomRight") == 0)
- return eSimpleE;
- return INVALID_INDEX;
-}
-
-int getBuildingFromString(const char* strType)
-{
- for (uint32_t i=0; i<contentLoader.buildingNameStrings.size(); i++){
- if (contentLoader.buildingNameStrings[i].compare(strType) == 0)
- {
- return i;
- }
- }
- return INVALID_INDEX;
-}
-
-NeighbourWallCondition::NeighbourWallCondition(const char* strDir)
- : BlockCondition()
-{
- this->value = getDirectionFromString(strDir);
-}
-
-bool NeighbourWallCondition::Matches(Block* b)
-{
-
- bool n = hasWall( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eUp ) );
- bool s = hasWall( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eDown ) );
- bool w = hasWall( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eLeft ) );
- bool e = hasWall( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eRight ) );
-
- if( value == eSimpleN && n) return true;
- if( value == eSimpleS && s) return true;
- if( value == eSimpleW && w) return true;
- if( value == eSimpleE && e) return true;
-
- if( value == eSimpleSingle && !n && !s && !w && !e) return true;
-
- return false;
-}
-
-
-PositionIndexCondition::PositionIndexCondition(const char* strValue)
- : BlockCondition()
-{
- this->value = atoi( strValue );
-}
-
-bool PositionIndexCondition::Matches(Block* b)
-{
- int x = b->x - b->building.info.x1;
- int y = b->y - b->building.info.y1;
- int w = b->building.info.x2 - b->building.info.x1 + 1 ;
- int pos = y * w + x;
-
- return pos == this->value;
-}
-
-
-
-
-MaterialTypeCondition::MaterialTypeCondition(const char* strValue, const char* strSubtype)
- : BlockCondition()
-{
- // is there a better way to handle this?
- // seems non-extensible
- subtype = INVALID_INDEX;
- value = lookupMaterialType(strValue);
- if (value == INVALID_INDEX)
- return;
- if (strSubtype == NULL || strSubtype[0] == 0)
- return;
- subtype = lookupMaterialIndex(value, strSubtype);
- if (subtype == INVALID_INDEX)
- {
- WriteErr("Material subtype not found in MaterialTypeCondition: %s\n", strSubtype);
- //make material never match;
- value = INVALID_INDEX;
- }
-}
-
-bool MaterialTypeCondition::Matches(Block* b)
-{
- if (b->building.info.material.type != this->value)
- return false;
- if (this->subtype == INVALID_INDEX)
- return true;
- return b->building.info.material.index == this->subtype;
-}
-
-
-AnimationFrameCondition::AnimationFrameCondition(const char* strValue)
- : BlockCondition()
-{
- this->value = atoi( strValue );
-}
-
-bool AnimationFrameCondition::Matches(Block* b)
-{
- return this->value == currentAnimationFrame;
-}
-
-
-BuildingOccupancyCondition::BuildingOccupancyCondition(const char* strValue)
- : BlockCondition()
-{
- this->value = atoi( strValue );
-}
-
-bool BuildingOccupancyCondition::Matches(Block* b)
-{
- return b->occ.bits.building == this->value;
-}
-
-
-
-NeighbourSameBuildingCondition::NeighbourSameBuildingCondition(const char* strDir)
- : BlockCondition()
-{
- this->value = getDirectionFromString(strDir);
-}
-
-bool NeighbourSameBuildingCondition::Matches(Block* b)
-{
- int blocksBuildingIndex = b->building.index;
-
- bool n = hasBuildingOfIndex( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eUp ), blocksBuildingIndex );
- bool s = hasBuildingOfIndex( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eDown ), blocksBuildingIndex );
- bool w = hasBuildingOfIndex( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eLeft ), blocksBuildingIndex );
- bool e = hasBuildingOfIndex( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eRight ), blocksBuildingIndex );
-
- if( value == eSimpleN && n) return true;
- if( value == eSimpleS && s) return true;
- if( value == eSimpleW && w) return true;
- if( value == eSimpleE && e) return true;
-
- if( value == eSimpleSingle && !n && !s && !w && !e) return true;
-
- return false;
-}
-
-
-
-NeighbourIdenticalCondition::NeighbourIdenticalCondition(const char* strDir)
- : BlockCondition()
-{
- this->value = getDirectionFromString(strDir);
-}
-
-bool NeighbourIdenticalCondition::Matches(Block* b)
-{
- int blocksBuildingIndex = b->building.index;
- int blocksBuildingOcc = b->occ.bits.building;
-
- bool n = hasBuildingIdentity( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eUp ), blocksBuildingIndex, blocksBuildingOcc );
- bool s = hasBuildingIdentity( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eDown ), blocksBuildingIndex, blocksBuildingOcc );
- bool w = hasBuildingIdentity( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eLeft ), blocksBuildingIndex, blocksBuildingOcc );
- bool e = hasBuildingIdentity( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eRight ), blocksBuildingIndex, blocksBuildingOcc );
-
- if( value == eSimpleN && n) return true;
- if( value == eSimpleS && s) return true;
- if( value == eSimpleW && w) return true;
- if( value == eSimpleE && e) return true;
-
- if( value == eSimpleSingle && !n && !s && !w && !e) return true;
-
- return false;
-}
-
-
-NeighbourOfTypeCondition::NeighbourOfTypeCondition(const char* strDir, const char* strType)
- : BlockCondition()
-{
- this->direction = getDirectionFromString(strDir);
- this->value = getBuildingFromString(strType);
-}
-
-bool NeighbourOfTypeCondition::Matches(Block* b)
-{
- bool n = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eUp ), value );
- bool s = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eDown ), value );
- bool w = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eLeft ), value);
- bool e = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eRight ), value );
-
- if( direction == eSimpleN && n) return true;
- if( direction == eSimpleS && s) return true;
- if( direction == eSimpleW && w) return true;
- if( direction == eSimpleE && e) return true;
-
- if( direction == eSimpleSingle && !n && !s && !w && !e) return true;
-
- return false;
-}
-
-NeighbourSameTypeCondition::NeighbourSameTypeCondition(const char* strDir)
- : BlockCondition()
-{
- this->direction = getDirectionFromString(strDir);
-}
-
-bool NeighbourSameTypeCondition::Matches(Block* b)
-{
- int value = b->building.info.type;
-
- bool n = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eUp ), value );
- bool s = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eDown ), value );
- bool w = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eLeft ), value);
- bool e = hasBuildingOfID( b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eRight ), value );
-
- if( direction == eSimpleN && n) return true;
- if( direction == eSimpleS && s) return true;
- if( direction == eSimpleW && w) return true;
- if( direction == eSimpleE && e) return true;
-
- if( direction == eSimpleSingle && !n && !s && !w && !e) return true;
-
- return false;
-}
-
-AndConditionalNode::~AndConditionalNode(void)
-{
- uint32_t max = (int)children.size();
- for(uint32_t i=0; i<max; i++)
- {
- delete(children[i]);
- }
-}
-
-bool AndConditionalNode::Matches(Block* b)
-{
- uint32_t max = (int)children.size();
- for(uint32_t i=0; i<max; i++)
- {
- if (!children[i]->Matches( b ))
- return false;
- }
- return true;
-}
-bool AndConditionalNode::addCondition(BlockCondition* cond)
-{
- children.push_back(cond);
- return true;
-}
-
-OrConditionalNode::~OrConditionalNode(void)
-{
- uint32_t max = (int)children.size();
- for(uint32_t i=0; i<max; i++)
- {
- delete(children[i]);
- }
-}
-
-bool OrConditionalNode::Matches(Block* b)
-{
- uint32_t max = (int)children.size();
- for(uint32_t i=0; i<max; i++)
- {
- if (children[i]->Matches( b ))
- return true;
- }
- return false;
-}
-bool OrConditionalNode::addCondition(BlockCondition* cond)
-{
- children.push_back(cond);
- return true;
-}
-
-bool AlwaysCondition::Matches(Block* b)
-{
- return true;
-}
-bool NeverCondition::Matches(Block* b)
-{
- return false;
-}
-
-NotConditionalNode::NotConditionalNode(void)
-{
- childcond = NULL;
-}
-
-NotConditionalNode::~NotConditionalNode(void)
-{
- delete(childcond);
-}
-
-bool NotConditionalNode::Matches(Block* b)
-{
- if (childcond == NULL)
- return true;
- return !childcond->Matches( b );
-}
-bool NotConditionalNode::addCondition(BlockCondition* cond)
-{
- if (childcond != NULL)
- {
- WriteErr("Too many condition elements for NotConditionalNode\n");
- return false;
- }
- childcond = cond;
- return true;
-}
-
-bool HaveFloorCondition::Matches(Block* b)
-{
- return (b->floorType > 0);
-}
-
-FluidBelowCondition::FluidBelowCondition(const char* strValue)
- : BlockCondition()
-{
- this->value = atoi( strValue );
-}
-
-bool FluidBelowCondition::Matches(Block* b)
-{
- Block* bLow = b->ownerSegment->getBlockRelativeTo( b->x, b->y, b->z, eBelow );
- if (!bLow)
- return false;
- return (bLow->water.index >= this->value);
-}