|
|
@@ -616,7 +616,7 @@ void CBattleInterface::mouseMoved(const SDL_MouseMotionEvent &sEvent)
|
|
|
else if(isTileAttackable(myNumber)) //available enemy (melee attackable)
|
|
|
{
|
|
|
int fromHex = previouslyHoveredHex;
|
|
|
- if(fromHex!=-1 && fromHex%17!=0 && fromHex%17!=16 && vstd::contains(shadedHexes, fromHex))
|
|
|
+ if(fromHex!=-1 && fromHex%BFIELD_WIDTH!=0 && fromHex%BFIELD_WIDTH!=(BFIELD_WIDTH-1) && vstd::contains(shadedHexes, fromHex))
|
|
|
{
|
|
|
switch(BattleInfo::mutualPosition(fromHex, myNumber))
|
|
|
{
|
|
|
@@ -1311,19 +1311,19 @@ void CBattleInterface::hexLclicked(int whichOne)
|
|
|
switch(CGI->curh->number)
|
|
|
{
|
|
|
case 12:
|
|
|
- giveCommand(6,whichOne + ( (whichOne/17)%2 ? 17 : 18 ),activeStack,whichOne);
|
|
|
+ giveCommand(6,whichOne + ( (whichOne/BFIELD_WIDTH)%2 ? BFIELD_WIDTH : BFIELD_WIDTH+1 ),activeStack,whichOne);
|
|
|
break;
|
|
|
case 7:
|
|
|
- giveCommand(6,whichOne + ( (whichOne/17)%2 ? 16 : 17 ),activeStack,whichOne);
|
|
|
+ giveCommand(6,whichOne + ( (whichOne/BFIELD_WIDTH)%2 ? BFIELD_WIDTH-1 : BFIELD_WIDTH ),activeStack,whichOne);
|
|
|
break;
|
|
|
case 8:
|
|
|
giveCommand(6,whichOne - 1,activeStack,whichOne);
|
|
|
break;
|
|
|
case 9:
|
|
|
- giveCommand(6,whichOne - ( (whichOne/17)%2 ? 18 : 17 ),activeStack,whichOne);
|
|
|
+ giveCommand(6,whichOne - ( (whichOne/BFIELD_WIDTH)%2 ? BFIELD_WIDTH+1 : BFIELD_WIDTH ),activeStack,whichOne);
|
|
|
break;
|
|
|
case 10:
|
|
|
- giveCommand(6,whichOne - ( (whichOne/17)%2 ? 17 : 16 ),activeStack,whichOne);
|
|
|
+ giveCommand(6,whichOne - ( (whichOne/BFIELD_WIDTH)%2 ? BFIELD_WIDTH : BFIELD_WIDTH-1 ),activeStack,whichOne);
|
|
|
break;
|
|
|
case 11:
|
|
|
giveCommand(6,whichOne + 1,activeStack,whichOne);
|
|
|
@@ -1345,12 +1345,13 @@ void CBattleInterface::stackIsShooting(int ID, int dest)
|
|
|
float projectileAngle; //in radians; if positive, projectiles goes up
|
|
|
float straightAngle = 0.2f; //maximal angle in radians between straight horizontal line and shooting line for which shot is considered to be straight (absoulte value)
|
|
|
int fromHex = LOCPLINT->cb->battleGetPos(ID);
|
|
|
- projectileAngle = atan2(float(abs(dest - fromHex)/17), float(abs(dest - fromHex)%17));
|
|
|
+ projectileAngle = atan2(float(abs(dest - fromHex)/BFIELD_WIDTH), float(abs(dest - fromHex)%BFIELD_WIDTH));
|
|
|
if(fromHex < dest)
|
|
|
projectileAngle = -projectileAngle;
|
|
|
|
|
|
SProjectileInfo spi;
|
|
|
spi.creID = LOCPLINT->cb->battleGetStackByID(ID)->creature->idNumber;
|
|
|
+ spi.reverse = !LOCPLINT->cb->battleGetStackByID(ID)->attackerOwned;
|
|
|
|
|
|
spi.step = 0;
|
|
|
spi.frameNum = 0;
|
|
|
@@ -1425,25 +1426,6 @@ void CBattleInterface::spellCasted(SpellCasted * sc)
|
|
|
{
|
|
|
std::vector< std::string > anims; //for magic arrow and ice bolt
|
|
|
|
|
|
-#define DISPLAY2(SP_ID) \
|
|
|
- if(sc->skill < 3) \
|
|
|
- { \
|
|
|
- displayEffect(SP_ID, sc->tile); \
|
|
|
- } \
|
|
|
- else \
|
|
|
- { \
|
|
|
- std::map<int, CStack> stacks = LOCPLINT->cb->battleGetStacks(); \
|
|
|
- for(std::map<int, CStack>::iterator it = stacks.begin(); it!=stacks.end(); ++it) \
|
|
|
- { \
|
|
|
- if((CGI->spellh->spells[sc->id].positiveness >= 0 && it->second.owner == LOCPLINT->playerID) \
|
|
|
- ||(CGI->spellh->spells[sc->id].positiveness <= 0 && it->second.owner != LOCPLINT->playerID ) \
|
|
|
- ) \
|
|
|
- { \
|
|
|
- displayEffect(SP_ID, it->second.position); \
|
|
|
- } \
|
|
|
- } \
|
|
|
- }
|
|
|
-
|
|
|
switch(sc->id)
|
|
|
{
|
|
|
case 15: //magic arrow
|
|
|
@@ -1518,68 +1500,67 @@ void CBattleInterface::spellCasted(SpellCasted * sc)
|
|
|
}
|
|
|
case 27: //shield
|
|
|
{
|
|
|
- DISPLAY2(27);
|
|
|
+ displayEffect(27, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 28: //air shield
|
|
|
{
|
|
|
- DISPLAY2(2);
|
|
|
+ displayEffect(2, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 41: //bless
|
|
|
{
|
|
|
- DISPLAY2(36);
|
|
|
+ displayEffect(36, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 42: //curse
|
|
|
{
|
|
|
- DISPLAY2(40);
|
|
|
+ displayEffect(40, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 43: //bloodlust
|
|
|
{
|
|
|
- DISPLAY2(4);
|
|
|
+ displayEffect(4, sc->tile);
|
|
|
//TODO: give better animation for this spell
|
|
|
break;
|
|
|
}
|
|
|
case 45: //weakness
|
|
|
{
|
|
|
- DISPLAY2(56);
|
|
|
+ displayEffect(56, sc->tile);
|
|
|
//TODO: give better animation for this spell
|
|
|
break;
|
|
|
}
|
|
|
case 46: //stone skin
|
|
|
{
|
|
|
- DISPLAY2(54);
|
|
|
+ displayEffect(54, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 48: //prayer
|
|
|
{
|
|
|
- DISPLAY2(0);
|
|
|
+ displayEffect(0, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 53: //haste
|
|
|
{
|
|
|
- DISPLAY2(31);
|
|
|
+ displayEffect(31, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 54: //slow
|
|
|
{
|
|
|
- DISPLAY2(19);
|
|
|
+ displayEffect(19, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 56: //frenzy
|
|
|
{
|
|
|
- DISPLAY2(17);
|
|
|
+ displayEffect(17, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
case 61: //forgetfulness
|
|
|
{
|
|
|
- DISPLAY2(42);
|
|
|
+ displayEffect(42, sc->tile);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-#undef DISPLAY2
|
|
|
}
|
|
|
|
|
|
void CBattleInterface::castThisSpell(int spellID)
|
|
|
@@ -1633,7 +1614,19 @@ void CBattleInterface::castThisSpell(int spellID)
|
|
|
spellSelMode = -1;
|
|
|
}
|
|
|
}
|
|
|
- CGI->curh->changeGraphic(3, 0);
|
|
|
+ if(spellSelMode == -1) //user does not have to select location
|
|
|
+ {
|
|
|
+ spellToCast->destinationTile = -1;
|
|
|
+ LOCPLINT->cb->battleMakeAction(spellToCast);
|
|
|
+ delete spellToCast;
|
|
|
+ spellToCast = NULL;
|
|
|
+ spellDestSelectMode = false;
|
|
|
+ CGI->curh->changeGraphic(1, 6);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CGI->curh->changeGraphic(3, 0);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void CBattleInterface::displayEffect(ui32 effect, int destTile)
|
|
|
@@ -1897,8 +1890,8 @@ void CBattleInterface::redrawBackgroundWithHexes(int activeStack)
|
|
|
{
|
|
|
for(size_t m=0; m<shadedHexes.size(); ++m) //rows
|
|
|
{
|
|
|
- int i = shadedHexes[m]/17; //row
|
|
|
- int j = shadedHexes[m]%17-1; //column
|
|
|
+ int i = shadedHexes[m]/BFIELD_WIDTH; //row
|
|
|
+ int j = shadedHexes[m]%BFIELD_WIDTH-1; //column
|
|
|
int x = 58 + (i%2==0 ? 22 : 0) + 44*j;
|
|
|
int y = 86 + 42 * i;
|
|
|
CSDL_Ext::blit8bppAlphaTo24bpp(cellShade, NULL, backgroundWithHexes, &genRect(cellShade->h, cellShade->w, x, y));
|
|
|
@@ -1946,7 +1939,16 @@ void CBattleInterface::projectileShowHelper(SDL_Surface * to)
|
|
|
dst.w = idToProjectile[it->creID]->ourImages[it->frameNum].bitmap->w;
|
|
|
dst.x = it->x;
|
|
|
dst.y = it->y;
|
|
|
- CSDL_Ext::blit8bppAlphaTo24bpp(idToProjectile[it->creID]->ourImages[it->frameNum].bitmap, NULL, to, &dst);
|
|
|
+ if(it->reverse)
|
|
|
+ {
|
|
|
+ SDL_Surface * rev = CSDL_Ext::rotate01(idToProjectile[it->creID]->ourImages[it->frameNum].bitmap);
|
|
|
+ CSDL_Ext::blit8bppAlphaTo24bpp(rev, NULL, to, &dst);
|
|
|
+ SDL_FreeSurface(rev);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CSDL_Ext::blit8bppAlphaTo24bpp(idToProjectile[it->creID]->ourImages[it->frameNum].bitmap, NULL, to, &dst);
|
|
|
+ }
|
|
|
//actualizing projectile
|
|
|
++it->step;
|
|
|
if(it->step == it->lastStep)
|