Преглед на файлове

better battle pathfinder and unit reversing

mateuszb преди 17 години
родител
ревизия
33e3bf4849
променени са 3 файла, в които са добавени 130 реда и са изтрити 51 реда
  1. 127 48
      CBattleInterface.cpp
  2. 1 1
      CBattleInterface.h
  3. 2 2
      CGameState.cpp

+ 127 - 48
CBattleInterface.cpp

@@ -270,7 +270,7 @@ void CBattleInterface::show(SDL_Surface * to)
 	CSDL_Ext::update();
 }
 
-bool CBattleInterface::reverseCreature(int number, int hex)
+bool CBattleInterface::reverseCreature(int number, int hex, bool wideTrick)
 {
 	if(creAnims[number]==NULL)
 		return false; //there is no such creature
@@ -285,7 +285,12 @@ bool CBattleInterface::reverseCreature(int number, int hex)
 	CStack curs = LOCPLINT->cb->battleGetStackByID(number);
 	std::pair <int, int> coords = CBattleHex::getXYUnitAnim(hex, creDir[number], curs.creature);
 	creAnims[number]->pos.x = coords.first;
-	creAnims[number]->pos.y = coords.second;
+	//creAnims[number]->pos.y = coords.second;
+
+	if(wideTrick && curs.creature->isDoubleWide())
+	{
+		creAnims[number]->pos.x -= 44;
+	}
 
 	creAnims[number]->setType(7);
 	for(int g=0; g<creAnims[number]->framesInGroup(7); ++g)
@@ -364,6 +369,7 @@ void CBattleInterface::stackActivated(int number)
 
 void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, bool endMoving)
 {
+	//a few useful variables
 	int curStackPos = LOCPLINT->cb->battleGetPos(number);
 	int steps = creAnims[number]->framesInGroup(0);
 	int hexWbase = 44, hexHbase = 42;
@@ -377,67 +383,140 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo
 		}
 	}
 
-	switch(CBattleHex::mutualPosition(curStackPos, destHex)) //reverse unit if necessary
-	{
-	case 0:
-		if(creDir[number] == true)
-			reverseCreature(number, curStackPos);
-		break;
-	case 1:
-		if(creDir[number] == false)
-			reverseCreature(number, curStackPos);
-		break;
-	case 2:
-		if(creDir[number] == false)
-			reverseCreature(number, curStackPos);
-		break;
-	case 3:
-		if(creDir[number] == false)
-			reverseCreature(number, curStackPos);
-		break;
-	case 4:
-		if(creDir[number] == true)
-			reverseCreature(number, curStackPos);
-		break;
-	case 5:
-		if(creDir[number] == true)
-			reverseCreature(number, curStackPos);
-		break;
-	}
-	//moving instructions
-	creAnims[number]->setType(0);
-	for(int i=0; i<steps; ++i)
-	{
-		switch(CBattleHex::mutualPosition(curStackPos, destHex))
+	int mutPos = CBattleHex::mutualPosition(curStackPos, destHex);
+
+	if(LOCPLINT->cb->battleGetCreature(number).isDoubleWide() && 
+		((creDir[number] && mutPos == 5) || (creDir[number] && mutPos == 0) || (creDir[number] && mutPos == 4))) //for special cases
+	{
+		switch(CBattleHex::mutualPosition(curStackPos, destHex)) //reverse unit if necessary
 		{
 		case 0:
-			creAnims[number]->pos.x -= hexWbase/(2*steps);
-			creAnims[number]->pos.y -= hexHbase/steps;
+			if(creDir[number] == true)
+				reverseCreature(number, curStackPos, true);
 			break;
 		case 1:
-			creAnims[number]->pos.x += hexWbase/(2*steps);
-			creAnims[number]->pos.y -= hexHbase/steps;
+			if(creDir[number] == false)
+				reverseCreature(number, curStackPos, true);
 			break;
 		case 2:
-			creAnims[number]->pos.x += hexWbase/steps;
+			if(creDir[number] == false)
+				reverseCreature(number, curStackPos, true);
 			break;
 		case 3:
-			creAnims[number]->pos.x += hexWbase/(2*steps);
-			creAnims[number]->pos.y += hexHbase/steps;
+			if(creDir[number] == false)
+				reverseCreature(number, curStackPos, true);
 			break;
 		case 4:
-			creAnims[number]->pos.x -= hexWbase/(2*steps);
-			creAnims[number]->pos.y += hexHbase/steps;
+			if(creDir[number] == true)
+				reverseCreature(number, curStackPos, true);
 			break;
 		case 5:
-			creAnims[number]->pos.x -= hexWbase/steps;
+			if(creDir[number] == true)
+				reverseCreature(number, curStackPos, true);
 			break;
 		}
-		show();
-		SDL_framerateDelay(LOCPLINT->mainFPSmng);
+		//moving instructions
+		creAnims[number]->setType(0);
+		for(int i=0; i<steps; ++i)
+		{
+			switch(CBattleHex::mutualPosition(curStackPos, destHex))
+			{
+			case 0:
+				creAnims[number]->pos.x -= hexWbase/(2*steps);
+				creAnims[number]->pos.y -= hexHbase/steps;
+				break;
+			case 1:
+				creAnims[number]->pos.x += hexWbase/(2*steps);
+				creAnims[number]->pos.y -= hexHbase/steps;
+				break;
+			case 2:
+				creAnims[number]->pos.x += hexWbase/steps;
+				break;
+			case 3:
+				creAnims[number]->pos.x += hexWbase/(2*steps);
+				creAnims[number]->pos.y += hexHbase/steps;
+				break;
+			case 4:
+				creAnims[number]->pos.x -= hexWbase/(2*steps);
+				creAnims[number]->pos.y += hexHbase/steps;
+				break;
+			case 5:
+				creAnims[number]->pos.x -= hexWbase/steps;
+				break;
+			}
+			show();
+			SDL_framerateDelay(LOCPLINT->mainFPSmng);
+		}
+		if( (LOCPLINT->cb->battleGetStackByID(number).owner == attackingHeroInstance->tempOwner ) != creDir[number])
+		{
+			reverseCreature(number, curStackPos, true);
+		}
+
+	}
+	else //normal move instructions
+	{
+		switch(CBattleHex::mutualPosition(curStackPos, destHex)) //reverse unit if necessary
+		{
+		case 0:
+			if(creDir[number] == true)
+				reverseCreature(number, curStackPos);
+			break;
+		case 1:
+			if(creDir[number] == false)
+				reverseCreature(number, curStackPos);
+			break;
+		case 2:
+			if(creDir[number] == false)
+				reverseCreature(number, curStackPos);
+			break;
+		case 3:
+			if(creDir[number] == false)
+				reverseCreature(number, curStackPos);
+			break;
+		case 4:
+			if(creDir[number] == true)
+				reverseCreature(number, curStackPos);
+			break;
+		case 5:
+			if(creDir[number] == true)
+				reverseCreature(number, curStackPos);
+			break;
+		}
+		//moving instructions
+		creAnims[number]->setType(0);
+		for(int i=0; i<steps; ++i)
+		{
+			switch(CBattleHex::mutualPosition(curStackPos, destHex))
+			{
+			case 0:
+				creAnims[number]->pos.x -= hexWbase/(2*steps);
+				creAnims[number]->pos.y -= hexHbase/steps;
+				break;
+			case 1:
+				creAnims[number]->pos.x += hexWbase/(2*steps);
+				creAnims[number]->pos.y -= hexHbase/steps;
+				break;
+			case 2:
+				creAnims[number]->pos.x += hexWbase/steps;
+				break;
+			case 3:
+				creAnims[number]->pos.x += hexWbase/(2*steps);
+				creAnims[number]->pos.y += hexHbase/steps;
+				break;
+			case 4:
+				creAnims[number]->pos.x -= hexWbase/(2*steps);
+				creAnims[number]->pos.y += hexHbase/steps;
+				break;
+			case 5:
+				creAnims[number]->pos.x -= hexWbase/steps;
+				break;
+			}
+			show();
+			SDL_framerateDelay(LOCPLINT->mainFPSmng);
+		}
 	}
 
-	if(endMoving) //animation of starting move
+	if(endMoving) //animation of ending move
 	{
 		for(int i=0; i<creAnims[number]->framesInGroup(21); ++i)
 		{
@@ -445,7 +524,7 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo
 			SDL_framerateDelay(LOCPLINT->mainFPSmng);
 		}
 	}
-	
+
 	creAnims[number]->setType(2); //resetting to default
 	CStack curs = LOCPLINT->cb->battleGetStackByID(number);
 	if(endMoving) //resetting to default

+ 1 - 1
CBattleInterface.h

@@ -106,7 +106,7 @@ public:
 	void activate();
 	void deactivate();
 	void show(SDL_Surface * to = NULL);
-	bool reverseCreature(int number, int hex); //reverses animation of given creature playing animation of reversing
+	bool reverseCreature(int number, int hex, bool wideTrick = false); //reverses animation of given creature playing animation of reversing
 
 	//call-ins
 	void newStack(CStack stack); //new stack appeared on battlefield

+ 2 - 2
CGameState.cpp

@@ -295,7 +295,7 @@ bool CGameState::battleMoveCreatureStack(int ID, int dest)
 		accessibility[k] = true;
 	for(int g=0; g<curB->stacks.size(); ++g)
 	{
-		//if(curB->stacks[g]->owner == owner) //we don't want to lock enemy's positions
+		if(curB->stacks[g]->owner == owner && curB->stacks[g]->ID != ID) //we don't want to lock enemy's positions and this units' position
 		{
 			accessibility[curB->stacks[g]->position] = false;
 			if(curB->stacks[g]->creature->isDoubleWide()) //if it's a double hex creature
@@ -447,7 +447,7 @@ std::vector<int> CGameState::battleGetRange(int ID)
 		accessibility[k] = true;
 	for(int g=0; g<curB->stacks.size(); ++g)
 	{
-		if(curB->stacks[g]->owner == owner) //we don't want to lock enemy's positions
+		if(curB->stacks[g]->owner == owner && curB->stacks[g]->ID != ID) //we don't want to lock enemy's positions or current unit's position
 		{
 			accessibility[curB->stacks[g]->position] = false;
 			if(curB->stacks[g]->creature->isDoubleWide()) //if it's a double hex creature