1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-07 00:58:39 +02:00

hero animation

This commit is contained in:
mateuszb
2007-09-15 18:04:12 +00:00
parent f6953057d7
commit 3c4923a31e
6 changed files with 214 additions and 125 deletions

View File

@ -207,6 +207,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
int3 hp = CGI->heroh->heroInstances[details.heroID]->pos; int3 hp = CGI->heroh->heroInstances[details.heroID]->pos;
if(details.dst.x+1 == details.src.x && details.dst.y+1 == details.src.y) //tl if(details.dst.x+1 == details.src.x && details.dst.y+1 == details.src.y) //tl
{ {
ho->moveDir = 1;
CGI->mh->ttiles[hp.x-3][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -31, -31))); CGI->mh->ttiles[hp.x-3][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -31, -31)));
CGI->mh->ttiles[hp.x-2][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 1, -31))); CGI->mh->ttiles[hp.x-2][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 1, -31)));
CGI->mh->ttiles[hp.x-1][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 33, -31))); CGI->mh->ttiles[hp.x-1][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 33, -31)));
@ -239,6 +240,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x == details.src.x && details.dst.y+1 == details.src.y) //t else if(details.dst.x == details.src.x && details.dst.y+1 == details.src.y) //t
{ {
ho->moveDir = 2;
CGI->mh->ttiles[hp.x-2][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 0, -31))); CGI->mh->ttiles[hp.x-2][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 0, -31)));
CGI->mh->ttiles[hp.x-1][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 32, -31))); CGI->mh->ttiles[hp.x-1][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 32, -31)));
CGI->mh->ttiles[hp.x][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 64, -31))); CGI->mh->ttiles[hp.x][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 64, -31)));
@ -265,6 +267,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x-1 == details.src.x && details.dst.y+1 == details.src.y) //tr else if(details.dst.x-1 == details.src.x && details.dst.y+1 == details.src.y) //tr
{ {
ho->moveDir = 3;
CGI->mh->ttiles[hp.x-2][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -1, -31))); CGI->mh->ttiles[hp.x-2][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -1, -31)));
CGI->mh->ttiles[hp.x-1][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 31, -31))); CGI->mh->ttiles[hp.x-1][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 31, -31)));
CGI->mh->ttiles[hp.x][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 63, -31))); CGI->mh->ttiles[hp.x][hp.y-2][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, 63, -31)));
@ -297,6 +300,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x-1 == details.src.x && details.dst.y == details.src.y) //r else if(details.dst.x-1 == details.src.x && details.dst.y == details.src.y) //r
{ {
ho->moveDir = 4;
subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, -1, 0), ho->id); subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, -1, 0), ho->id);
subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 31, 0), ho->id); subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 31, 0), ho->id);
subRect(hp.x, hp.y-1, hp.z, genRect(32, 32, 63, 0), ho->id); subRect(hp.x, hp.y-1, hp.z, genRect(32, 32, 63, 0), ho->id);
@ -319,6 +323,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x-1 == details.src.x && details.dst.y-1 == details.src.y) //br else if(details.dst.x-1 == details.src.x && details.dst.y-1 == details.src.y) //br
{ {
ho->moveDir = 5;
subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, -1, -1), ho->id); subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, -1, -1), ho->id);
subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 31, -1), ho->id); subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 31, -1), ho->id);
subRect(hp.x, hp.y-1, hp.z, genRect(32, 32, 63, -1), ho->id); subRect(hp.x, hp.y-1, hp.z, genRect(32, 32, 63, -1), ho->id);
@ -351,6 +356,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x == details.src.x && details.dst.y-1 == details.src.y) //b else if(details.dst.x == details.src.x && details.dst.y-1 == details.src.y) //b
{ {
ho->moveDir = 6;
subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, 0, -1), ho->id); subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, 0, -1), ho->id);
subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 32, -1), ho->id); subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 32, -1), ho->id);
subRect(hp.x, hp.y-1, hp.z, genRect(32, 32, 64, -1), ho->id); subRect(hp.x, hp.y-1, hp.z, genRect(32, 32, 64, -1), ho->id);
@ -377,6 +383,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x+1 == details.src.x && details.dst.y-1 == details.src.y) //bl else if(details.dst.x+1 == details.src.x && details.dst.y-1 == details.src.y) //bl
{ {
ho->moveDir = 7;
CGI->mh->ttiles[hp.x-3][hp.y-1][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -31, -1))); CGI->mh->ttiles[hp.x-3][hp.y-1][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -31, -1)));
subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, 1, -1), ho->id); subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, 1, -1), ho->id);
subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 33, -1), ho->id); subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 33, -1), ho->id);
@ -409,6 +416,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
} }
else if(details.dst.x+1 == details.src.x && details.dst.y == details.src.y) //l else if(details.dst.x+1 == details.src.x && details.dst.y == details.src.y) //l
{ {
ho->moveDir = 8;
CGI->mh->ttiles[hp.x-3][hp.y-1][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -31, 0))); CGI->mh->ttiles[hp.x-3][hp.y-1][hp.z].objects.push_back(std::make_pair(ho, genRect(32, 32, -31, 0)));
subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, 1, 0), ho->id); subRect(hp.x-2, hp.y-1, hp.z, genRect(32, 32, 1, 0), ho->id);
subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 33, 0), ho->id); subRect(hp.x-1, hp.y-1, hp.z, genRect(32, 32, 33, 0), ho->id);
@ -432,7 +440,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
//first initializing done //first initializing done
SDL_framerateDelay(mainFPSmng); // after first move SDL_framerateDelay(mainFPSmng); // after first move
//main moving //main moving
for(int i=1; i<32; ++i) for(int i=1; i<32; i+=4)
{ {
if(details.dst.x+1 == details.src.x && details.dst.y+1 == details.src.y) //tl if(details.dst.x+1 == details.src.x && details.dst.y+1 == details.src.y) //tl
{ {
@ -722,6 +730,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
delObjRect(hp.x, hp.y, hp.z, ho->id); delObjRect(hp.x, hp.y, hp.z, ho->id);
} }
CGI->heroh->heroInstances[details.heroID]->pos = details.dst; //actualizing hero position CGI->heroh->heroInstances[details.heroID]->pos = details.dst; //actualizing hero position
ho->moveDir = 0; //move ended
//move finished //move finished
} }
void CPlayerInterface::heroKilled(const CHeroInstance * hero) void CPlayerInterface::heroKilled(const CHeroInstance * hero)

View File

@ -532,6 +532,8 @@ void CAmbarCendamo::deh3m()
nobj->pos.z = bufor[i++]; nobj->pos.z = bufor[i++];
nobj->defNumber = readNormalNr(i, 4); i+=4; nobj->defNumber = readNormalNr(i, 4); i+=4;
nobj->defObjInfoNumber = -1; nobj->defObjInfoNumber = -1;
nobj->isHero = false;
nobj->moveDir = 0;
//if (((nobj.x==0)&&(nobj.y==0)) || nobj.x>map.width || nobj.y>map.height || nobj.z>1 || nobj.defNumber>map.defy.size()) //if (((nobj.x==0)&&(nobj.y==0)) || nobj.x>map.width || nobj.y>map.height || nobj.z>1 || nobj.defNumber>map.defy.size())
// std::cout << "Alarm!!! Obiekt "<<ww<<" jest kopniety (lub wystaje poza mape)\n"; // std::cout << "Alarm!!! Obiekt "<<ww<<" jest kopniety (lub wystaje poza mape)\n";
@ -882,6 +884,8 @@ void CAmbarCendamo::deh3m()
nobj->info = spec; nobj->info = spec;
//////creating CHeroInstance //////creating CHeroInstance
CHeroInstance * nhi = new CHeroInstance; CHeroInstance * nhi = new CHeroInstance;
spec->myInstance = nhi;
nobj->isHero = true;
nhi->exp = spec->experience; nhi->exp = spec->experience;
nhi->level = CGI->heroh->level(nhi->exp); nhi->level = CGI->heroh->level(nhi->exp);
nhi->primSkills.resize(PRIMARY_SKILLS); nhi->primSkills.resize(PRIMARY_SKILLS);

View File

@ -6,7 +6,9 @@
#include "CGeneralTextHandler.h" #include "CGeneralTextHandler.h"
#include "CLodHandler.h" #include "CLodHandler.h"
#include "CAbilityHandler.h" #include "CAbilityHandler.h"
#include "SDL_Extensions.h"
#include <cmath> #include <cmath>
#include <iomanip>
CHeroHandler::~CHeroHandler() CHeroHandler::~CHeroHandler()
{ {
@ -310,6 +312,59 @@ void CHeroHandler::loadHeroClasses()
++i; ++i;
} }
++i; ++i;
std::stringstream nm;
nm<<"AH";
nm<<std::setw(2);
nm<<std::setfill('0');
nm<<heroClasses.size();
nm<<"_.DEF";
hc->moveAnim = CGI->spriteh->giveDef(nm.str());
for(int o=0; o<hc->moveAnim->ourImages.size(); ++o)
{
if(hc->moveAnim->ourImages[o].groupNumber==6)
{
for(int e=0; e<8; ++e)
{
Cimage nci;
nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o+e].bitmap);
nci.groupNumber = 10;
nci.imName = std::string();
hc->moveAnim->ourImages.push_back(nci);
}
o+=8;
}
if(hc->moveAnim->ourImages[o].groupNumber==7)
{
for(int e=0; e<8; ++e)
{
Cimage nci;
nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o+e].bitmap);
nci.groupNumber = 11;
nci.imName = std::string();
hc->moveAnim->ourImages.push_back(nci);
}
o+=8;
}
if(hc->moveAnim->ourImages[o].groupNumber==8)
{
for(int e=0; e<8; ++e)
{
Cimage nci;
nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o+e].bitmap);
nci.groupNumber = 12;
nci.imName = std::string();
hc->moveAnim->ourImages.push_back(nci);
}
o+=8;
}
}
for(int ff=0; ff<hc->moveAnim->ourImages.size(); ++ff)
{
CSDL_Ext::fullAlphaTransform(hc->moveAnim->ourImages[ff].bitmap);
}
hc->moveAnim->alphaTransformed = true;
heroClasses.push_back(hc); heroClasses.push_back(hc);
} }
} }
@ -386,122 +441,21 @@ unsigned int CHeroInstance::getLowestCreatureSpeed()
void CHeroHandler::initTerrainCosts() void CHeroHandler::initTerrainCosts()
{ {
for(int i=0; i<heroClasses.size(); ++i) std::ifstream inp;
inp.open("TERCOSTS.TXT", std::ios_base::in|std::ios_base::binary);
int tynum;
inp>>tynum;
for(int i=0; i<2*tynum; i+=2)
{ {
switch (i) int catNum;
inp>>catNum;
for(int k=0; k<catNum; ++k)
{ {
case EHeroClasses::HERO_KNIGHT: case EHeroClasses::HERO_CLERIC: int curCost;
{ inp>>curCost;
heroClasses[i]->terrCosts.push_back(100); //dirt heroClasses[i]->terrCosts.push_back(curCost);
heroClasses[i]->terrCosts.push_back(150); //sand heroClasses[i+1]->terrCosts.push_back(curCost);
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_RANGER: case EHeroClasses::HERO_DRUID:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_ALCHEMIST: case EHeroClasses::HERO_WIZARD:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(100); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_DEMONIAC: case EHeroClasses::HERO_HERETIC:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_DEATHKNIGHT: case EHeroClasses::HERO_NECROMANCER:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_WARLOCK: case EHeroClasses::HERO_OVERLORD:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_BARBARIAN: case EHeroClasses::HERO_BATTLEMAGE:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(175); //swamp
heroClasses[i]->terrCosts.push_back(100); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
case EHeroClasses::HERO_BEASTMASTER: case EHeroClasses::HERO_WITCH:
{
heroClasses[i]->terrCosts.push_back(100); //dirt
heroClasses[i]->terrCosts.push_back(150); //sand
heroClasses[i]->terrCosts.push_back(100); //grass
heroClasses[i]->terrCosts.push_back(150); //snow
heroClasses[i]->terrCosts.push_back(100); //swamp
heroClasses[i]->terrCosts.push_back(125); //rough
heroClasses[i]->terrCosts.push_back(100); //subterrain
heroClasses[i]->terrCosts.push_back(100); //lava
heroClasses[i]->terrCosts.push_back(-1); //water
heroClasses[i]->terrCosts.push_back(-1); //rock
break;
}
} }
} }
inp.close();
} }

View File

@ -9,7 +9,7 @@
class CHeroClass; class CHeroClass;
class CObjectInstance; class CObjectInstance;
class CDefHandler;
class CHero class CHero
{ {
@ -40,6 +40,7 @@ public:
std::vector<int> proSec; //probabilities of gaining secondary skills (out of 112), in id order std::vector<int> proSec; //probabilities of gaining secondary skills (out of 112), in id order
int selectionProbability[9]; //probability of selection in towns int selectionProbability[9]; //probability of selection in towns
std::vector<int> terrCosts; //default costs of going through terrains: dirt, sand, grass, snow, swamp, rough, subterrain, lava, water, rock; -1 means terrain is imapassable std::vector<int> terrCosts; //default costs of going through terrains: dirt, sand, grass, snow, swamp, rough, subterrain, lava, water, rock; -1 means terrain is imapassable
CDefHandler * moveAnim; //added group 10: up - left, 11 - left and 12 - left down
}; };
class CHeroInstance class CHeroInstance

View File

@ -60,6 +60,7 @@ public:
std::vector<CAbility *> abilities; //hero's abilities std::vector<CAbility *> abilities; //hero's abilities
std::vector<int> abilityLevels; //hero ability levels std::vector<int> abilityLevels; //hero ability levels
bool defaultMainStats; //if true attack, defence, power and knowledge are typical bool defaultMainStats; //if true attack, defence, power and knowledge are typical
CHeroInstance * myInstance; //pointer to appropriate hero instance
}; };
class CCreatureObjInfo : public CSpecObjInfo class CCreatureObjInfo : public CSpecObjInfo
@ -295,6 +296,8 @@ public:
int id; //number of object in CObjectHandler's vector int id; //number of object in CObjectHandler's vector
int3 pos; // position int3 pos; // position
CSpecObjInfo * info; //pointer to something with additional information CSpecObjInfo * info; //pointer to something with additional information
bool isHero; //true if this is a hero
unsigned char moveDir; //direction of hero movement (0 - default; 1 - lt; 2 - t; 3 - tr; 4 - r; 5 - br; 6 - b; 7 - bl; 8 - l)
bool operator<(const CObjectInstance & cmp) const; //screen printing priority comparing bool operator<(const CObjectInstance & cmp) const; //screen printing priority comparing
}; };

View File

@ -496,13 +496,131 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
sr.y = (by)*32; sr.y = (by)*32;
SDL_Rect pp = ttiles[x+bx][y+by][level].objects[h].second; SDL_Rect pp = ttiles[x+bx][y+by][level].objects[h].second;
int imgVal = CGI->ac->map.defy[ if(ttiles[x+bx][y+by][level].objects[h].first->isHero && ttiles[x+bx][y+by][level].objects[h].first->moveDir)
ttiles[x+bx][y+by][level].objects[h].first->defNumber] {
.handler->ourImages.size(); int imgVal = 8;
SDL_Surface * tb = CGI->ac->map.defy[ttiles[x+bx][y+by][level].objects[h].first->defNumber].handler->ourImages[anim%imgVal].bitmap; SDL_Surface * tb;
SDL_BlitSurface( switch(ttiles[x+bx][y+by][level].objects[h].first->moveDir)
CGI->ac->map.defy[ttiles[x+bx][y+by][level].objects[h].first->defNumber].handler->ourImages[anim%imgVal].bitmap, {
&pp,su,&sr); case 1:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==10)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 2:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==5)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 3:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==6)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 4:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==7)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 5:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==8)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 6:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==9)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 7:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==12)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
case 8:
{
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages;
for(int gg=0; gg<iv.size(); ++gg)
{
if(iv[gg].groupNumber==11)
{
tb = iv[gg+anim%imgVal].bitmap;
break;
}
}
SDL_BlitSurface(tb,&pp,su,&sr);
break;
}
}
}
else
{
int imgVal = CGI->ac->map.defy[ttiles[x+bx][y+by][level].objects[h].first->defNumber].handler->ourImages.size();
SDL_BlitSurface(CGI->ac->map.defy[ttiles[x+bx][y+by][level].objects[h].first->defNumber].handler->ourImages[anim%imgVal].bitmap,&pp,su,&sr);
}
} }
} }
} }
@ -823,7 +941,7 @@ int CMapHandler::getCost(int3 &a, int3 &b, CHeroInstance *hero)
{ {
int ret = hero->type->heroClass->terrCosts[CGI->mh->ttiles[a.x][a.y][a.z].malle]; int ret = hero->type->heroClass->terrCosts[CGI->mh->ttiles[a.x][a.y][a.z].malle];
if(!(a.x==b.x || a.y==b.y)) if(!(a.x==b.x || a.y==b.y))
ret*=1.4142; ret*=1.41421;
//TODO: use hero's pathfinding skill during calculating cost //TODO: use hero's pathfinding skill during calculating cost
return ret; return ret;