浏览代码

Battles:
* removed some displaying problems
* showing last group of frames in creature animation won't crash
* added start moving and end moving animations
* fixed moving two-hex creatures
* showing/hiding graphic cursor
* a part of using graphic cursor

Michał W. Urbańczyk 17 年之前
父节点
当前提交
9ec606a40b
共有 5 个文件被更改,包括 88 次插入128 次删除
  1. 43 98
      CBattleInterface.cpp
  2. 13 2
      CCursorHandler.cpp
  3. 3 0
      CCursorHandler.h
  4. 27 27
      client/CCreatureAnimation.cpp
  5. 2 1
      client/CCreatureAnimation.h

+ 43 - 98
CBattleInterface.cpp

@@ -299,7 +299,7 @@ void CBattleInterface::show(SDL_Surface * to)
 	{
 		for(int v=0; v<stackDeadByHex[b].size(); ++v)
 		{
-			creAnims[stackDeadByHex[b][v]]->nextFrame(to, creAnims[stackDeadByHex[b][v]]->pos.x, creAnims[stackDeadByHex[b][v]]->pos.y, creDir[stackDeadByHex[b][v]], (animCount%2==0 || creAnims[stackDeadByHex[b][v]]->getType()!=2) && stacks[stackDeadByHex[b][v]].alive, stackDeadByHex[b][v]==activeStack); //increment always when moving, never if stack died
+			creAnims[stackDeadByHex[b][v]]->nextFrame(to, creAnims[stackDeadByHex[b][v]]->pos.x, creAnims[stackDeadByHex[b][v]]->pos.y, creDir[stackDeadByHex[b][v]], (animCount%4==0 || creAnims[stackDeadByHex[b][v]]->getType()!=2) && stacks[stackDeadByHex[b][v]].alive, stackDeadByHex[b][v]==activeStack); //increment always when moving, never if stack died
 			//printing amount
 			if(stacks[stackDeadByHex[b][v]].amount > 0) //don't print if stack is not alive
 			{
@@ -324,7 +324,7 @@ void CBattleInterface::show(SDL_Surface * to)
 	{
 		for(int v=0; v<stackAliveByHex[b].size(); ++v)
 		{
-			creAnims[stackAliveByHex[b][v]]->nextFrame(to, creAnims[stackAliveByHex[b][v]]->pos.x, creAnims[stackAliveByHex[b][v]]->pos.y, creDir[stackAliveByHex[b][v]], (animCount%2==0 || creAnims[stackAliveByHex[b][v]]->getType()!=2) && stacks[stackAliveByHex[b][v]].alive, stackAliveByHex[b][v]==activeStack); //increment always when moving, never if stack died
+			creAnims[stackAliveByHex[b][v]]->nextFrame(to, creAnims[stackAliveByHex[b][v]]->pos.x, creAnims[stackAliveByHex[b][v]]->pos.y, creDir[stackAliveByHex[b][v]], (animCount%4==0) && stacks[stackAliveByHex[b][v]].alive, stackAliveByHex[b][v]==activeStack); //increment always when moving, never if stack died
 			//printing amount
 			if(stacks[stackAliveByHex[b][v]].amount > 0) //don't print if stack is not alive
 			{
@@ -359,6 +359,8 @@ bool CBattleInterface::reverseCreature(int number, int hex, bool wideTrick)
 		show();
 		CSDL_Ext::update();
 		SDL_framerateDelay(LOCPLINT->mainFPSmng);
+		if((animCount+1)%4)
+			creAnims[number]->incrementFrame();
 	}
 	creDir[number] = !creDir[number];
 
@@ -369,7 +371,8 @@ bool CBattleInterface::reverseCreature(int number, int hex, bool wideTrick)
 
 	if(wideTrick && curs.creature->isDoubleWide())
 	{
-		creAnims[number]->pos.x -= 44;
+		if(!creDir[number])
+			creAnims[number]->pos.x -= 44;
 	}
 
 	creAnims[number]->setType(7);
@@ -492,122 +495,43 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo
 	int curStackPos = LOCPLINT->cb->battleGetPos(number);
 	int steps = creAnims[number]->framesInGroup(0);
 	int hexWbase = 44, hexHbase = 42;
+	bool twoTiles = LOCPLINT->cb->battleGetCreature(number).isDoubleWide();
 
 	if(startMoving) //animation of starting move
 	{
+		deactivate();
+		CGI->curh->hide();
+		creAnims[number]->setType(20);
+		//LOCPLINT->objsToBlit.erase(std::find(LOCPLINT->objsToBlit.begin(),LOCPLINT->objsToBlit.end(),this));
 		for(int i=0; i<creAnims[number]->framesInGroup(20); ++i)
 		{
 			show();
 			CSDL_Ext::update();
 			SDL_framerateDelay(LOCPLINT->mainFPSmng);
+			if((animCount+1)%4)
+				creAnims[number]->incrementFrame();
 		}
 	}
 
 	int mutPos = BattleInfo::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(BattleInfo::mutualPosition(curStackPos, destHex)) //reverse unit if necessary
+		switch(mutPos) //reverse unit if necessary
 		{
-		case 0:
+		case 0:	case 4:	case 5:
 			if(creDir[number] == true)
-				reverseCreature(number, curStackPos, true);
-			break;
-		case 1:
-			if(creDir[number] == false)
-				reverseCreature(number, curStackPos, true);
+				reverseCreature(number, curStackPos, twoTiles);
 			break;
-		case 2:
+		case 1:	case 2: case 3:
 			if(creDir[number] == false)
-				reverseCreature(number, curStackPos, true);
-			break;
-		case 3:
-			if(creDir[number] == false)
-				reverseCreature(number, curStackPos, true);
-			break;
-		case 4:
-			if(creDir[number] == true)
-				reverseCreature(number, curStackPos, true);
-			break;
-		case 5:
-			if(creDir[number] == true)
-				reverseCreature(number, curStackPos, true);
+				reverseCreature(number, curStackPos, twoTiles);
 			break;
 		}
 		//moving instructions
 		creAnims[number]->setType(0);
 		for(int i=0; i<steps; ++i)
 		{
-			switch(BattleInfo::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();
-			CSDL_Ext::update();
-			SDL_framerateDelay(LOCPLINT->mainFPSmng);
-		}
-		if( (LOCPLINT->cb->battleGetStackByID(number)->owner == attackingHeroInstance->tempOwner ) != creDir[number])
-		{
-			reverseCreature(number, curStackPos, true);
-		}
-
-	}
-	else //normal move instructions
-	{
-		switch(BattleInfo::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(BattleInfo::mutualPosition(curStackPos, destHex))
+			switch(mutPos)
 			{
 			case 0:
 				creAnims[number]->pos.x -= hexWbase/(2*steps);
@@ -635,30 +559,37 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo
 			show();
 			CSDL_Ext::update();
 			SDL_framerateDelay(LOCPLINT->mainFPSmng);
+			if((animCount+1)%4)
+				creAnims[number]->incrementFrame();
 		}
 	}
 
 	if(endMoving) //animation of ending move
 	{
+		creAnims[number]->setType(21);
 		for(int i=0; i<creAnims[number]->framesInGroup(21); ++i)
 		{
 			show();
 			CSDL_Ext::update();
 			SDL_framerateDelay(LOCPLINT->mainFPSmng);
+			if((animCount+1)%4)
+				creAnims[number]->incrementFrame();
 		}
 		creAnims[number]->setType(2); //resetting to default
+		activate();
+		CGI->curh->show();
 	}
 
 	CStack curs = *LOCPLINT->cb->battleGetStackByID(number);
 	if(endMoving) //resetting to default
 	{
 		if(creDir[number] != (curs.owner == attackingHeroInstance->tempOwner))
-			reverseCreature(number, destHex);
-		//creDir[number] = (curs.owner == attackingHeroInstance->tempOwner);
+			reverseCreature(number, destHex, twoTiles);	
 	}
-
 	std::pair <int, int> coords = CBattleHex::getXYUnitAnim(destHex, creDir[number], curs.creature);
 	creAnims[number]->pos.x = coords.first;
+	if(!endMoving && twoTiles && (creDir[number] != (curs.owner == attackingHeroInstance->tempOwner))) //big creature is reversed
+		creAnims[number]->pos.x -= 44;
 	creAnims[number]->pos.y = coords.second;
 }
 
@@ -1231,6 +1162,20 @@ void CBattleHex::mouseMoved(SDL_MouseMotionEvent &sEvent)
 		else //hovered pixel is inside hex
 		{
 			strictHovered = true;
+			if(myInterface->activeStack>=0)
+			{
+				if(std::find(myInterface->shadedHexes.begin(),myInterface->shadedHexes.end(),myNumber) == myInterface->shadedHexes.end())
+				{
+					CGI->curh->changeGraphic(1,0);
+				}
+				else
+				{
+					if(LOCPLINT->cb->battleGetStackByID(myInterface->activeStack)->creature->isFlying())
+						CGI->curh->changeGraphic(1,2);
+					else
+						CGI->curh->changeGraphic(1,1);
+				}
+			}
 		}
 	}
 

+ 13 - 2
CCursorHandler.cpp

@@ -31,10 +31,21 @@ void CCursorHandler::cursorMove(int x, int y)
 }
 void CCursorHandler::draw1()
 {
-	SDL_BlitSurface(screen,&genRect(32,32,xpos,ypos),help,&genRect(32,32,0,0));
-	blitAt(cursors[mode]->ourImages[number].bitmap,xpos,ypos);
+	if(!Show) return;
+	switch(mode)
+	{
+	case 0:
+		SDL_BlitSurface(screen,&genRect(32,32,xpos,ypos),help,&genRect(32,32,0,0));
+		blitAt(cursors[mode]->ourImages[number].bitmap,xpos,ypos);
+		break;
+	case 1:
+		SDL_BlitSurface(screen,&genRect(32,32,xpos-16,ypos-16),help,&genRect(32,32,0,0));
+		blitAt(cursors[mode]->ourImages[number].bitmap,xpos-16,ypos-16);
+		break;
+	}
 }
 void CCursorHandler::draw2()
 {
+	if(!Show) return;
 	blitAt(help,xpos,ypos);
 }

+ 3 - 0
CCursorHandler.h

@@ -11,6 +11,7 @@ class CCursorHandler //handles cursor
 public:
 	int mode, number;
 	SDL_Surface * help;
+	bool Show;
 
 	std::vector<CDefHandler*> cursors;
 	int xpos, ypos; //position of cursor
@@ -19,6 +20,8 @@ public:
 	void changeGraphic(int type, int no); //changes cursor graphic for type type (0 - adventure, 1 - combat, 2 - default, 3 - spellbook) and frame no (not used for type 3)
 	void draw1();
 	void draw2();
+	void hide(){Show=0;};
+	void show(){Show=1;};
 };
 
 

+ 27 - 27
client/CCreatureAnimation.cpp

@@ -60,10 +60,13 @@ CCreatureAnimation::CCreatureAnimation(std::string name) : RLEntries(NULL), RWEn
 	totalEntries=0;
 	for (int z=0; z<totalBlocks; z++)
 	{
-		int unknown1 = readNormalNr(i,4); i+=4;
+		int group = readNormalNr(i,4); i+=4; //block ID
 		totalInBlock = readNormalNr(i,4); i+=4;
 		for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
+		{
 			SEntries.push_back(SEntry());
+			SEntries[j].group = group;
+		}
 		int unknown2 = readNormalNr(i,4); i+=4;
 		int unknown3 = readNormalNr(i,4); i+=4;
 		for (j=0; j<totalInBlock; j++)
@@ -80,7 +83,6 @@ CCreatureAnimation::CCreatureAnimation(std::string name) : RLEntries(NULL), RWEn
 		//totalEntries+=totalInBlock;
 		for(int hh=0; hh<totalInBlock; ++hh)
 		{
-			SEntries[totalEntries].group = z;
 			++totalEntries;
 		}
 	}
@@ -125,43 +127,41 @@ int CCreatureAnimation::nextFrameMiddle(SDL_Surface *dest, int x, int y, bool at
 {
 	return nextFrame(dest,x-fullWidth/2,y-fullHeight/2,attacker,incrementFrame,yellowBorder,destRect);
 }
-int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder, SDL_Rect * destRect)
+void CCreatureAnimation::incrementFrame()
 {
-	if(dest->format->BytesPerPixel<3)
-		return -1; //not enough depth
-
-	//increasing frame numer
-	int SIndex = -1;
-	if(incrementFrame)
+	curFrame++;
+	if(type!=-1)
 	{
-		SIndex = curFrame++;
-		if(type!=-1)
+		if(curFrame==SEntries.size() || SEntries[curFrame].group!=type) //rewind
 		{
-			if(SEntries[curFrame].group!=type) //rewind
+			int j=-1; //first frame in displayed group
+			for(int g=0; g<SEntries.size(); ++g)
 			{
-				int j=-1; //first frame in displayed group
-				for(int g=0; g<SEntries.size(); ++g)
+				if(SEntries[g].group==type && j==-1)
 				{
-					if(SEntries[g].group==type && j==-1)
-					{
-						j = g;
-						break;
-					}
+					j = g;
+					break;
 				}
-				if(curFrame!=-1)
-					curFrame = j;
 			}
-		}
-		else
-		{
-			if(curFrame>=frames)
-				curFrame = 0;
+			if(curFrame!=-1)
+				curFrame = j;
 		}
 	}
 	else
 	{
-		SIndex = curFrame;
+		if(curFrame>=frames)
+			curFrame = 0;
 	}
+}
+int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker, bool IncrementFrame, bool yellowBorder, SDL_Rect * destRect)
+{
+	if(dest->format->BytesPerPixel<3)
+		return -1; //not enough depth
+
+	//increasing frame numer
+	int SIndex = curFrame;
+	if(IncrementFrame)
+		incrementFrame();
 	//frame number increased
 
 	long BaseOffset, 

+ 2 - 1
client/CCreatureAnimation.h

@@ -39,7 +39,8 @@ public:
 	int getType() const; //returns type of animation
 
 	int nextFrame(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next 
-	int nextFrameMiddle(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next 
+	int nextFrameMiddle(SDL_Surface * dest, int x, int y, bool attacker, bool IncrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next 
+	void incrementFrame();
 
 	int framesInGroup(int group) const; //retirns number of fromes in given group
 };