1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

Aesthetic changes in BattleHex (#303)

This commit is contained in:
FeniksFire
2017-05-29 09:33:34 +02:00
committed by ArseniyShestakov
parent 8a494b7820
commit 039e3842fc
5 changed files with 52 additions and 74 deletions

View File

@ -76,7 +76,7 @@ std::pair<si16, si16> BattleHex::getXY() const
return std::make_pair(getX(), getY()); return std::make_pair(getX(), getY());
} }
BattleHex& BattleHex::moveInDir(EDir dir, bool hasToBeValid) BattleHex& BattleHex::moveInDirection(EDir dir, bool hasToBeValid)
{ {
si16 x(getX()), y(getY()); si16 x(getX()), y(getY());
switch(dir) switch(dir)
@ -102,58 +102,41 @@ BattleHex& BattleHex::moveInDir(EDir dir, bool hasToBeValid)
default: default:
throw std::runtime_error("Disaster: wrong direction in BattleHex::operator+=!\n"); throw std::runtime_error("Disaster: wrong direction in BattleHex::operator+=!\n");
break; break;
} }
return *this; return *this;
} }
BattleHex &BattleHex::operator+=(BattleHex::EDir dir) BattleHex &BattleHex::operator+=(BattleHex::EDir dir)
{ {
return moveInDir(dir); return moveInDirection(dir);
} }
BattleHex BattleHex::movedInDir(BattleHex::EDir dir, bool hasToBeValid) const BattleHex BattleHex::cloneInDirection(BattleHex::EDir dir, bool hasToBeValid) const
{ {
BattleHex result(*this); BattleHex result(hex);
result.moveInDir(dir, hasToBeValid); result.moveInDirection(dir, hasToBeValid);
return result; return result;
} }
BattleHex BattleHex::operator+(BattleHex::EDir dir) const BattleHex BattleHex::operator+(BattleHex::EDir dir) const
{ {
return movedInDir(dir); return cloneInDirection(dir);
} }
std::vector<BattleHex> BattleHex::neighbouringTiles() const std::vector<BattleHex> BattleHex::neighbouringTiles() const
{ {
std::vector<BattleHex> ret; std::vector<BattleHex> ret;
const int WN = GameConstants::BFIELD_WIDTH; for(EDir dir = EDir(0); dir <= EDir(5); dir = EDir(dir+1))
// H3 order : TR, R, BR, BL, L, TL (T = top, B = bottom ...) checkAndPush(cloneInDirection(dir, false), ret);
checkAndPush(hex - ( (hex/WN)%2 ? WN+1 : WN ), ret); // 1
checkAndPush(hex + 1, ret); // 2
checkAndPush(hex + ( (hex/WN)%2 ? WN : WN+1 ), ret); // 3
checkAndPush(hex + ( (hex/WN)%2 ? WN-1 : WN ), ret); // 4
checkAndPush(hex - 1, ret); // 5
checkAndPush(hex - ( (hex/WN)%2 ? WN : WN-1 ), ret); // 6
return ret; return ret;
} }
signed char BattleHex::mutualPosition(BattleHex hex1, BattleHex hex2) signed char BattleHex::mutualPosition(BattleHex hex1, BattleHex hex2)
{ {
if(hex2 == hex1 - ( (hex1/17)%2 ? 18 : 17 )) //top left for(EDir dir = EDir(0); dir <= EDir(5); dir = EDir(dir+1))
return 0; if(hex2 == hex1.cloneInDirection(dir,false))
if(hex2 == hex1 - ( (hex1/17)%2 ? 17 : 16 )) //top right return dir;
return 1; return INVALID;
if(hex2 == hex1 + 1 && hex1%17 != 16) //right
return 2;
if(hex2 == hex1 + ( (hex1/17)%2 ? 17 : 18 )) //bottom right
return 3;
if(hex2 == hex1 + ( (hex1/17)%2 ? 16 : 17 )) //bottom left
return 4;
if(hex2 == hex1 - 1 && hex1%17 != 0) //left
return 5;
return -1;
} }
char BattleHex::getDistance(BattleHex hex1, BattleHex hex2) char BattleHex::getDistance(BattleHex hex1, BattleHex hex2)

View File

@ -15,7 +15,7 @@ struct DLL_LINKAGE BattleHex //TODO: decide if this should be changed to class f
{ {
si16 hex; si16 hex;
static const si16 INVALID = -1; static const si16 INVALID = -1;
enum EDir { RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, LEFT, TOP_LEFT, TOP_RIGHT }; enum EDir { TOP_LEFT, TOP_RIGHT, RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, LEFT};
BattleHex(); BattleHex();
BattleHex(si16 _hex); BattleHex(si16 _hex);
@ -31,16 +31,12 @@ struct DLL_LINKAGE BattleHex //TODO: decide if this should be changed to class f
si16 getX() const; si16 getX() const;
si16 getY() const; si16 getY() const;
std::pair<si16, si16> getXY() const; std::pair<si16, si16> getXY() const;
//moving to direction BattleHex& moveInDirection(EDir dir, bool hasToBeValid = true);
BattleHex& moveInDir(EDir dir, bool hasToBeValid = true); BattleHex& operator+=(EDir dir);
BattleHex& operator+=(EDir dir); //sugar for above BattleHex cloneInDirection(EDir dir, bool hasToBeValid = true) const;
//generates new BattleHex moved by given dir
BattleHex movedInDir(EDir dir, bool hasToBeValid = true) const;
BattleHex operator+(EDir dir) const; BattleHex operator+(EDir dir) const;
std::vector<BattleHex> neighbouringTiles() const; std::vector<BattleHex> neighbouringTiles() const;
//returns info about mutual position of given hexes (-1 - they're distant, 0 - left top, 1 - right top, 2 - right, 3 - right bottom, 4 - left bottom, 5 - left)
static signed char mutualPosition(BattleHex hex1, BattleHex hex2); static signed char mutualPosition(BattleHex hex1, BattleHex hex2);
//returns distance between given hexes
static char getDistance(BattleHex hex1, BattleHex hex2); static char getDistance(BattleHex hex1, BattleHex hex2);
static void checkAndPush(BattleHex tile, std::vector<BattleHex> & ret); static void checkAndPush(BattleHex tile, std::vector<BattleHex> & ret);
static BattleHex getClosestTile(bool attackerOwned, BattleHex initialPos, std::set<BattleHex> & possibilities); //TODO: vector or set? copying one to another is bad static BattleHex getClosestTile(bool attackerOwned, BattleHex initialPos, std::set<BattleHex> & possibilities); //TODO: vector or set? copying one to another is bad

View File

@ -566,9 +566,9 @@ std::vector<BattleHex> WallMechanics::rangeInHexes(BattleHex centralHex, ui8 sch
}; };
ret.push_back(centralHex); ret.push_back(centralHex);
addIfValid(centralHex.moveInDir(firstStep, false)); addIfValid(centralHex.moveInDirection(firstStep, false));
if(schoolLvl >= 2) //advanced versions of fire wall / force field cotnains of 3 hexes if(schoolLvl >= 2) //advanced versions of fire wall / force field cotnains of 3 hexes
addIfValid(centralHex.moveInDir(secondStep, false)); //moveInDir function modifies subject hex addIfValid(centralHex.moveInDirection(secondStep, false)); //moveInDir function modifies subject hex
return ret; return ret;
} }

View File

@ -144,31 +144,31 @@ static void summonGuardiansHelper(std::vector<BattleHex> & output, const BattleH
int y = targetPosition.getY(); int y = targetPosition.getY();
if (targetIsAttacker) //handle front guardians, TODO: should we handle situation when units start battle near opposite side of the battlefield? Cannot happen in normal H3... if (targetIsAttacker) //handle front guardians, TODO: should we handle situation when units start battle near opposite side of the battlefield? Cannot happen in normal H3...
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false).movedInDir(BattleHex::EDir::RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false).cloneInDirection(BattleHex::EDir::RIGHT, false), output);
else else
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false).movedInDir(BattleHex::EDir::LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false).cloneInDirection(BattleHex::EDir::LEFT, false), output);
//guardian spawn locations for four default position cases for attacker and defender, non-default starting location for att and def is handled in first two if's //guardian spawn locations for four default position cases for attacker and defender, non-default starting location for att and def is handled in first two if's
if (targetIsAttacker && ((y % 2 == 0) || (x > 1))) if (targetIsAttacker && ((y % 2 == 0) || (x > 1)))
{ {
if (targetIsTwoHex && (y % 2 == 1) && (x == 2)) //handle exceptional case if (targetIsTwoHex && (y % 2 == 1) && (x == 2)) //handle exceptional case
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::TOP_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::TOP_RIGHT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::BOTTOM_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::BOTTOM_RIGHT, false), output);
} }
else else
{ //add back-side guardians for two-hex target, side guardians for one-hex { //add back-side guardians for two-hex target, side guardians for one-hex
BattleHex::checkAndPush(targetPosition.movedInDir(targetIsTwoHex ? BattleHex::EDir::TOP_LEFT : BattleHex::EDir::TOP_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(targetIsTwoHex ? BattleHex::EDir::TOP_LEFT : BattleHex::EDir::TOP_RIGHT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(targetIsTwoHex ? BattleHex::EDir::BOTTOM_LEFT : BattleHex::EDir::BOTTOM_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(targetIsTwoHex ? BattleHex::EDir::BOTTOM_LEFT : BattleHex::EDir::BOTTOM_RIGHT, false), output);
if (!targetIsTwoHex && x > 2) //back guard for one-hex if (!targetIsTwoHex && x > 2) //back guard for one-hex
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false), output);
else if (targetIsTwoHex)//front-side guardians for two-hex target else if (targetIsTwoHex)//front-side guardians for two-hex target
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false).movedInDir(BattleHex::EDir::TOP_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false).cloneInDirection(BattleHex::EDir::TOP_RIGHT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false).movedInDir(BattleHex::EDir::BOTTOM_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false).cloneInDirection(BattleHex::EDir::BOTTOM_RIGHT, false), output);
if (x > 3) //back guard for two-hex if (x > 3) //back guard for two-hex
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false).movedInDir(BattleHex::EDir::LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false).cloneInDirection(BattleHex::EDir::LEFT, false), output);
} }
} }
@ -178,36 +178,36 @@ static void summonGuardiansHelper(std::vector<BattleHex> & output, const BattleH
{ {
if (targetIsTwoHex && (y % 2 == 0) && (x == GameConstants::BFIELD_WIDTH - 3)) //handle exceptional case... equivalent for above for defender side if (targetIsTwoHex && (y % 2 == 0) && (x == GameConstants::BFIELD_WIDTH - 3)) //handle exceptional case... equivalent for above for defender side
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::TOP_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::TOP_LEFT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::BOTTOM_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false), output);
} }
else else
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(targetIsTwoHex ? BattleHex::EDir::TOP_RIGHT : BattleHex::EDir::TOP_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(targetIsTwoHex ? BattleHex::EDir::TOP_RIGHT : BattleHex::EDir::TOP_LEFT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(targetIsTwoHex ? BattleHex::EDir::BOTTOM_RIGHT : BattleHex::EDir::BOTTOM_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(targetIsTwoHex ? BattleHex::EDir::BOTTOM_RIGHT : BattleHex::EDir::BOTTOM_LEFT, false), output);
if (!targetIsTwoHex && x < GameConstants::BFIELD_WIDTH - 3) if (!targetIsTwoHex && x < GameConstants::BFIELD_WIDTH - 3)
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false), output);
else if (targetIsTwoHex) else if (targetIsTwoHex)
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false).movedInDir(BattleHex::EDir::TOP_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false).cloneInDirection(BattleHex::EDir::TOP_LEFT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false).movedInDir(BattleHex::EDir::BOTTOM_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false).cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false), output);
if (x < GameConstants::BFIELD_WIDTH - 4) if (x < GameConstants::BFIELD_WIDTH - 4)
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false).movedInDir(BattleHex::EDir::RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false).cloneInDirection(BattleHex::EDir::RIGHT, false), output);
} }
} }
} }
else if (!targetIsAttacker && y % 2 == 0) else if (!targetIsAttacker && y % 2 == 0)
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false).movedInDir(BattleHex::EDir::TOP_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false).cloneInDirection(BattleHex::EDir::TOP_LEFT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::LEFT, false).movedInDir(BattleHex::EDir::BOTTOM_LEFT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::LEFT, false).cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false), output);
} }
else if (targetIsAttacker && y % 2 == 1) else if (targetIsAttacker && y % 2 == 1)
{ {
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false).movedInDir(BattleHex::EDir::TOP_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false).cloneInDirection(BattleHex::EDir::TOP_RIGHT, false), output);
BattleHex::checkAndPush(targetPosition.movedInDir(BattleHex::EDir::RIGHT, false).movedInDir(BattleHex::EDir::BOTTOM_RIGHT, false), output); BattleHex::checkAndPush(targetPosition.cloneInDirection(BattleHex::EDir::RIGHT, false).cloneInDirection(BattleHex::EDir::BOTTOM_RIGHT, false), output);
} }
} }

View File

@ -10,7 +10,6 @@
#include "StdInc.h" #include "StdInc.h"
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
#include "../lib/BattleHex.h" #include "../lib/BattleHex.h"
BOOST_AUTO_TEST_SUITE(BattlefieldHex_Suite) BOOST_AUTO_TEST_SUITE(BattlefieldHex_Suite)
BOOST_AUTO_TEST_CASE(getNeighbouringTiles) BOOST_AUTO_TEST_CASE(getNeighbouringTiles)
@ -38,11 +37,11 @@ BOOST_AUTO_TEST_CASE(getNeighbouringTiles)
BOOST_REQUIRE(neighbouringTiles.size()==6 && mainHex==93); BOOST_REQUIRE(neighbouringTiles.size()==6 && mainHex==93);
BOOST_TEST(neighbouringTiles.at(0)==75); BOOST_TEST(neighbouringTiles.at(0)==75);
BOOST_TEST(neighbouringTiles.at(1)==94); BOOST_TEST(neighbouringTiles.at(1)==76);
BOOST_TEST(neighbouringTiles.at(2)==110); BOOST_TEST(neighbouringTiles.at(2)==94);
BOOST_TEST(neighbouringTiles.at(3)==109); BOOST_TEST(neighbouringTiles.at(3)==110);
BOOST_TEST(neighbouringTiles.at(4)==92); BOOST_TEST(neighbouringTiles.at(4)==109);
BOOST_TEST(neighbouringTiles.at(5)==76); BOOST_TEST(neighbouringTiles.at(5)==92);
} }
BOOST_AUTO_TEST_CASE(getDistance) BOOST_AUTO_TEST_CASE(getDistance)
@ -107,17 +106,17 @@ BOOST_AUTO_TEST_CASE(getClosestTile)
BOOST_AUTO_TEST_CASE(moveEDir) BOOST_AUTO_TEST_CASE(moveEDir)
{ {
BattleHex mainHex(20); BattleHex mainHex(20);
mainHex.moveInDir(BattleHex::EDir::BOTTOM_RIGHT); mainHex.moveInDirection(BattleHex::EDir::BOTTOM_RIGHT);
BOOST_TEST(mainHex==37); BOOST_TEST(mainHex==37);
mainHex.moveInDir(BattleHex::EDir::RIGHT); mainHex.moveInDirection(BattleHex::EDir::RIGHT);
BOOST_TEST(mainHex==38); BOOST_TEST(mainHex==38);
mainHex.moveInDir(BattleHex::EDir::TOP_RIGHT); mainHex.moveInDirection(BattleHex::EDir::TOP_RIGHT);
BOOST_TEST(mainHex==22); BOOST_TEST(mainHex==22);
mainHex.moveInDir(BattleHex::EDir::TOP_LEFT); mainHex.moveInDirection(BattleHex::EDir::TOP_LEFT);
BOOST_TEST(mainHex==4); BOOST_TEST(mainHex==4);
mainHex.moveInDir(BattleHex::EDir::LEFT); mainHex.moveInDirection(BattleHex::EDir::LEFT);
BOOST_TEST(mainHex==3); BOOST_TEST(mainHex==3);
mainHex.moveInDir(BattleHex::EDir::BOTTOM_LEFT); mainHex.moveInDirection(BattleHex::EDir::BOTTOM_LEFT);
BOOST_TEST(mainHex==20); BOOST_TEST(mainHex==20);
} }