#include "StdInc.h" #include "CObstacleInstance.h" #include "CHeroHandler.h" #include "VCMI_Lib.h" #include "CSpellHandler.h" CObstacleInstance::CObstacleInstance() { obstacleType = USUAL; } CObstacleInstance::~CObstacleInstance() { } const CObstacleInfo & CObstacleInstance::getInfo() const { switch(obstacleType) { case ABSOLUTE_OBSTACLE: return VLC->heroh->absoluteObstacles[ID]; case USUAL: return VLC->heroh->obstacles[ID]; case MOAT: assert(0); default: assert(0); } } std::vector CObstacleInstance::getBlockedTiles() const { if(blocksTiles()) return getAffectedTiles(); return std::vector(); } std::vector CObstacleInstance::getStoppingTile() const { if(stopsMovement()) return getAffectedTiles(); return std::vector(); } std::vector CObstacleInstance::getAffectedTiles() const { switch(obstacleType) { case ABSOLUTE_OBSTACLE: case USUAL: return getInfo().getBlocked(pos); default: assert(0); return std::vector(); } } // bool CObstacleInstance::spellGenerated() const // { // if(obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE) // return false; // // return true; // } bool CObstacleInstance::visibleForSide(ui8 side, bool hasNativeStack) const { //by default obstacle is visible for everyone return true; } bool CObstacleInstance::stopsMovement() const { return obstacleType == QUICKSAND || obstacleType == MOAT; } bool CObstacleInstance::blocksTiles() const { return obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE || obstacleType == FORCE_FIELD; } SpellCreatedObstacle::SpellCreatedObstacle() { casterSide = -1; spellLevel = -1; casterSpellPower = -1; turnsRemaining = -1; visibleForAnotherSide = -1; } bool SpellCreatedObstacle::visibleForSide(ui8 side, bool hasNativeStack) const { switch(obstacleType) { case FIRE_WALL: case FORCE_FIELD: //these are always visible return true; case QUICKSAND: case LAND_MINE: //we hide mines and not discovered quicksands //quicksands are visible to the caster or if owned unit stepped into that particular patch //additionally if side has a native unit, mines/quicksands will be visible return casterSide == side || visibleForAnotherSide || hasNativeStack; default: assert(0); return false; } } std::vector SpellCreatedObstacle::getAffectedTiles() const { switch(obstacleType) { case QUICKSAND: case LAND_MINE: case FIRE_WALL: return std::vector(1, pos); case FORCE_FIELD: return VLC->spellh->spells[Spells::FORCE_FIELD]->rangeInHexes(pos, spellLevel, casterSide); //TODO Fire Wall default: assert(0); return std::vector(); } } void SpellCreatedObstacle::battleTurnPassed() { if(turnsRemaining > 0) turnsRemaining--; } std::vector MoatObstacle::getAffectedTiles() const { //rrr... need initializer lists static const BattleHex moatHexes[] = {11, 28, 44, 61, 77, 111, 129, 146, 164, 181}; return std::vector(moatHexes, moatHexes + ARRAY_COUNT(moatHexes)); }