mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-26 22:57:00 +02:00
* added new spells
- dispel - armageddon * spellbook cannot be opened by L-click on hero in battle when it shouldn't be possible * minor changes
This commit is contained in:
parent
1dcb99254c
commit
899be22db0
@ -267,6 +267,7 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
|
|||||||
spellToEffect[18] = 10; //implosion
|
spellToEffect[18] = 10; //implosion
|
||||||
spellToEffect[27] = 27; //shield
|
spellToEffect[27] = 27; //shield
|
||||||
spellToEffect[28] = 2; //air shield
|
spellToEffect[28] = 2; //air shield
|
||||||
|
spellToEffect[35] = 41; //dispel
|
||||||
spellToEffect[41] = 36; //bless
|
spellToEffect[41] = 36; //bless
|
||||||
spellToEffect[42] = 40; //curse
|
spellToEffect[42] = 40; //curse
|
||||||
spellToEffect[43] = 4; //bloodlust
|
spellToEffect[43] = 4; //bloodlust
|
||||||
@ -1941,32 +1942,56 @@ void CBattleInterface::castThisSpell(int spellID)
|
|||||||
|
|
||||||
void CBattleInterface::displayEffect(ui32 effect, int destTile)
|
void CBattleInterface::displayEffect(ui32 effect, int destTile)
|
||||||
{
|
{
|
||||||
if(graphics->battleACToDef[effect].size() != 0)
|
if(effect == 12) //armageddon
|
||||||
{
|
{
|
||||||
SBattleEffect be;
|
if(graphics->battleACToDef[effect].size() != 0)
|
||||||
be.anim = CDefHandler::giveDef(graphics->battleACToDef[effect][0]);
|
{
|
||||||
be.frame = 0;
|
CDefHandler * anim = CDefHandler::giveDef(graphics->battleACToDef[effect][0]);
|
||||||
be.maxFrame = be.anim->ourImages.size();
|
for(int i=0; i * anim->width < pos.w ; ++i)
|
||||||
be.x = 22 * ( ((destTile/BFIELD_WIDTH) + 1)%2 ) + 44 * (destTile % BFIELD_WIDTH) + 45;
|
{
|
||||||
be.y = 105 + 42 * (destTile/BFIELD_WIDTH);
|
for(int j=0; j * anim->height < pos.h ; ++j)
|
||||||
|
{
|
||||||
|
SBattleEffect be;
|
||||||
|
be.anim = CDefHandler::giveDef(graphics->battleACToDef[effect][0]);
|
||||||
|
be.frame = 0;
|
||||||
|
be.maxFrame = be.anim->ourImages.size();
|
||||||
|
be.x = i * anim->width;
|
||||||
|
be.y = j * anim->height;
|
||||||
|
|
||||||
if(effect != 1 && effect != 0)
|
battleEffects.push_back(be);
|
||||||
{
|
}
|
||||||
be.x -= be.anim->ourImages[0].bitmap->w/2;
|
}
|
||||||
be.y -= be.anim->ourImages[0].bitmap->h/2;
|
|
||||||
}
|
}
|
||||||
else if(effect == 1)
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(graphics->battleACToDef[effect].size() != 0)
|
||||||
{
|
{
|
||||||
be.x -= be.anim->ourImages[0].bitmap->w;
|
SBattleEffect be;
|
||||||
be.y -= be.anim->ourImages[0].bitmap->h;
|
be.anim = CDefHandler::giveDef(graphics->battleACToDef[effect][0]);
|
||||||
}
|
be.frame = 0;
|
||||||
else if (effect == 0)
|
be.maxFrame = be.anim->ourImages.size();
|
||||||
{
|
be.x = 22 * ( ((destTile/BFIELD_WIDTH) + 1)%2 ) + 44 * (destTile % BFIELD_WIDTH) + 45;
|
||||||
be.x -= be.anim->ourImages[0].bitmap->w/2;
|
be.y = 105 + 42 * (destTile/BFIELD_WIDTH);
|
||||||
be.y -= be.anim->ourImages[0].bitmap->h;
|
|
||||||
}
|
|
||||||
|
|
||||||
battleEffects.push_back(be);
|
if(effect != 1 && effect != 0)
|
||||||
|
{
|
||||||
|
be.x -= be.anim->ourImages[0].bitmap->w/2;
|
||||||
|
be.y -= be.anim->ourImages[0].bitmap->h/2;
|
||||||
|
}
|
||||||
|
else if(effect == 1)
|
||||||
|
{
|
||||||
|
be.x -= be.anim->ourImages[0].bitmap->w;
|
||||||
|
be.y -= be.anim->ourImages[0].bitmap->h;
|
||||||
|
}
|
||||||
|
else if (effect == 0)
|
||||||
|
{
|
||||||
|
be.x -= be.anim->ourImages[0].bitmap->w/2;
|
||||||
|
be.y -= be.anim->ourImages[0].bitmap->h;
|
||||||
|
}
|
||||||
|
|
||||||
|
battleEffects.push_back(be);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//battleEffects
|
//battleEffects
|
||||||
}
|
}
|
||||||
@ -2385,7 +2410,7 @@ void CBattleHero::setPhase(int newPhase)
|
|||||||
|
|
||||||
void CBattleHero::clickLeft(boost::logic::tribool down)
|
void CBattleHero::clickLeft(boost::logic::tribool down)
|
||||||
{
|
{
|
||||||
if(!down && myHero) if(myHero->getArt(17)) //if both conditions are satisfied; for certain reason myHero->getArt(17) has been checked once even though myHero was NULL
|
if(!down && myHero && LOCPLINT->cb->battleCanCastSpell()) //check conditions
|
||||||
{
|
{
|
||||||
for(int it=0; it<BFIELD_SIZE; ++it) //do nothing when any hex is hovered - hero's animation overlaps battlefield
|
for(int it=0; it<BFIELD_SIZE; ++it) //do nothing when any hex is hovered - hero's animation overlaps battlefield
|
||||||
{
|
{
|
||||||
|
@ -416,7 +416,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town)
|
|||||||
|
|
||||||
townlist->fun = boost::bind(&CCastleInterface::townChange,this);
|
townlist->fun = boost::bind(&CCastleInterface::townChange,this);
|
||||||
townlist->genList();
|
townlist->genList();
|
||||||
townlist->selected = getIndexOf(townlist->items,Town);
|
townlist->selected = vstd::findPos(townlist->items,Town);
|
||||||
if((townlist->selected+1) > townlist->SIZE)
|
if((townlist->selected+1) > townlist->SIZE)
|
||||||
townlist->from = townlist->selected - townlist->SIZE + 2;
|
townlist->from = townlist->selected - townlist->SIZE + 2;
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ public:
|
|||||||
CCastleInterface *owner;
|
CCastleInterface *owner;
|
||||||
const CGHeroInstance *hero;
|
const CGHeroInstance *hero;
|
||||||
int upg; //0 - up garrison, 1 - down garrison
|
int upg; //0 - up garrison, 1 - down garrison
|
||||||
bool highlight;
|
bool highlight; //indicates id the slot is highlighted
|
||||||
|
|
||||||
void hover (bool on);
|
void hover (bool on);
|
||||||
void clickRight (boost::logic::tribool down);
|
void clickRight (boost::logic::tribool down);
|
||||||
@ -65,8 +65,8 @@ public:
|
|||||||
class CCastleInterface : public CWindowWithGarrison
|
class CCastleInterface : public CWindowWithGarrison
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SDL_Rect pos;
|
SDL_Rect pos; //why not inherit this member from CIntObject ?
|
||||||
bool showing;
|
bool showing; //indicates if interface is active
|
||||||
CBuildingRect * hBuild; //highlighted building
|
CBuildingRect * hBuild; //highlighted building
|
||||||
SDL_Surface * townInt;
|
SDL_Surface * townInt;
|
||||||
SDL_Surface * cityBg;
|
SDL_Surface * cityBg;
|
||||||
@ -167,7 +167,7 @@ class CFortScreen : public IShowActivable, public CIntObject
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int bid;
|
int bid;
|
||||||
RecArea(int BID):bid(BID){};
|
RecArea(int BID):bid(BID){}; //c-tor
|
||||||
void clickLeft (tribool down);
|
void clickLeft (tribool down);
|
||||||
void clickRight (tribool down);
|
void clickRight (tribool down);
|
||||||
void activate();
|
void activate();
|
||||||
@ -181,10 +181,10 @@ public:
|
|||||||
std::vector<RecArea*> recAreas;
|
std::vector<RecArea*> recAreas;
|
||||||
std::vector<CCreaturePic*> crePics;
|
std::vector<CCreaturePic*> crePics;
|
||||||
|
|
||||||
CFortScreen(CCastleInterface * owner);
|
CFortScreen(CCastleInterface * owner); //c-tor
|
||||||
|
|
||||||
void draw( CCastleInterface * owner, bool first);
|
void draw( CCastleInterface * owner, bool first);
|
||||||
~CFortScreen();
|
~CFortScreen(); //d-tor
|
||||||
void close();
|
void close();
|
||||||
void show(SDL_Surface * to);
|
void show(SDL_Surface * to);
|
||||||
void activate();
|
void activate();
|
||||||
|
@ -2304,7 +2304,7 @@ void CPlayerInterface::battleStacksAttacked(std::set<BattleStackAttacked> & bsa)
|
|||||||
std::vector<CBattleInterface::SStackAttackedInfo> arg;
|
std::vector<CBattleInterface::SStackAttackedInfo> arg;
|
||||||
for(std::set<BattleStackAttacked>::iterator i = bsa.begin(); i != bsa.end(); i++)
|
for(std::set<BattleStackAttacked>::iterator i = bsa.begin(); i != bsa.end(); i++)
|
||||||
{
|
{
|
||||||
if(i->isEffect())
|
if(i->isEffect() && i->effect != 12) //and not armageddon
|
||||||
{
|
{
|
||||||
battleInt->displayEffect(i->effect, cb->battleGetStackByID(i->stackAttacked)->position);
|
battleInt->displayEffect(i->effect, cb->battleGetStackByID(i->stackAttacked)->position);
|
||||||
}
|
}
|
||||||
@ -2312,6 +2312,11 @@ void CPlayerInterface::battleStacksAttacked(std::set<BattleStackAttacked> & bsa)
|
|||||||
arg.push_back(to_put);
|
arg.push_back(to_put);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(bsa.begin()->isEffect() && bsa.begin()->effect == 12) //for armageddon - I hope this condition is enough
|
||||||
|
{
|
||||||
|
battleInt->displayEffect(bsa.begin()->effect, -1);
|
||||||
|
}
|
||||||
|
|
||||||
battleInt->stacksAreAttacked(arg);
|
battleInt->stacksAreAttacked(arg);
|
||||||
}
|
}
|
||||||
void CPlayerInterface::battleAttack(BattleAttack *ba)
|
void CPlayerInterface::battleAttack(BattleAttack *ba)
|
||||||
|
@ -22,13 +22,7 @@ void blitAtWR(SDL_Surface * src, SDL_Rect pos, SDL_Surface * dst=screen);
|
|||||||
void blitAt(SDL_Surface * src, SDL_Rect pos, SDL_Surface * dst=screen);
|
void blitAt(SDL_Surface * src, SDL_Rect pos, SDL_Surface * dst=screen);
|
||||||
void updateRect (SDL_Rect * rect, SDL_Surface * scr = screen);
|
void updateRect (SDL_Rect * rect, SDL_Surface * scr = screen);
|
||||||
bool isItIn(const SDL_Rect * rect, int x, int y);
|
bool isItIn(const SDL_Rect * rect, int x, int y);
|
||||||
template <typename T> int getIndexOf(const std::vector<T> & v, const T & val)
|
|
||||||
{
|
|
||||||
for(int i=0;i<v.size();i++)
|
|
||||||
if(v[i]==val)
|
|
||||||
return i;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
inline SDL_Rect genRect(const int & hh, const int & ww, const int & xx, const int & yy)
|
inline SDL_Rect genRect(const int & hh, const int & ww, const int & xx, const int & yy)
|
||||||
{
|
{
|
||||||
SDL_Rect ret;
|
SDL_Rect ret;
|
||||||
@ -59,9 +53,9 @@ namespace CSDL_Ext
|
|||||||
SDL_Surface * hFlip(SDL_Surface * toRot); //horizontal flip
|
SDL_Surface * hFlip(SDL_Surface * toRot); //horizontal flip
|
||||||
SDL_Surface * rotate02(SDL_Surface * toRot); //rotate 90 degrees left
|
SDL_Surface * rotate02(SDL_Surface * toRot); //rotate 90 degrees left
|
||||||
SDL_Surface * rotate03(SDL_Surface * toRot); //rotate 180 degrees
|
SDL_Surface * rotate03(SDL_Surface * toRot); //rotate 180 degrees
|
||||||
SDL_Cursor * SurfaceToCursor(SDL_Surface *image, int hx, int hy);
|
SDL_Cursor * SurfaceToCursor(SDL_Surface *image, int hx, int hy); //creates cursor from bitmap
|
||||||
Uint32 SDL_GetPixel(SDL_Surface *surface, const int & x, const int & y, bool colorByte = false);
|
Uint32 SDL_GetPixel(SDL_Surface *surface, const int & x, const int & y, bool colorByte = false);
|
||||||
SDL_Color SDL_GetPixelColor(SDL_Surface *surface, int x, int y);
|
SDL_Color SDL_GetPixelColor(SDL_Surface *surface, int x, int y); //returns color of pixel at given position
|
||||||
SDL_Surface * alphaTransform(SDL_Surface * src); //adds transparency and shadows (partial handling only; see examples of using for details)
|
SDL_Surface * alphaTransform(SDL_Surface * src); //adds transparency and shadows (partial handling only; see examples of using for details)
|
||||||
void blitWithRotate1(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect);//srcRect is not used, works with 8bpp sources and 24bpp dests
|
void blitWithRotate1(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect);//srcRect is not used, works with 8bpp sources and 24bpp dests
|
||||||
void blitWithRotate2(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect);//srcRect is not used, works with 8bpp sources and 24bpp dests
|
void blitWithRotate2(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect);//srcRect is not used, works with 8bpp sources and 24bpp dests
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
32 1 0 0 0 X
|
32 1 0 0 0 X
|
||||||
33 1 0 0 0 X
|
33 1 0 0 0 X
|
||||||
34 1 0 0 0 X
|
34 1 0 0 0 X
|
||||||
35 1 0 0 0 X
|
35 0 0 0 0 X
|
||||||
36 1 0 0 0 0
|
36 1 0 0 0 0
|
||||||
37 1 0 0 0 0
|
37 1 0 0 0 0
|
||||||
38 1 0 0 0 0
|
38 1 0 0 0 0
|
||||||
|
14
global.h
14
global.h
@ -114,12 +114,12 @@ template<typename T, size_t N> char (&_ArrayCountObj(const T (&)[N]))[N];
|
|||||||
namespace vstd
|
namespace vstd
|
||||||
{
|
{
|
||||||
template <typename Container, typename Item>
|
template <typename Container, typename Item>
|
||||||
bool contains(const Container & c, const Item &i)
|
bool contains(const Container & c, const Item &i) //returns true if container c contains item i
|
||||||
{
|
{
|
||||||
return std::find(c.begin(),c.end(),i) != c.end();
|
return std::find(c.begin(),c.end(),i) != c.end();
|
||||||
}
|
}
|
||||||
template <typename V, typename Item, typename Item2>
|
template <typename V, typename Item, typename Item2>
|
||||||
bool contains(const std::map<Item,V> & c, const Item2 &i)
|
bool contains(const std::map<Item,V> & c, const Item2 &i) //returns true if map c contains item i
|
||||||
{
|
{
|
||||||
return c.find(i)!=c.end();
|
return c.find(i)!=c.end();
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ namespace vstd
|
|||||||
return std::find(c.begin(),c.end(),i);
|
return std::find(c.begin(),c.end(),i);
|
||||||
}
|
}
|
||||||
template <typename T1, typename T2>
|
template <typename T1, typename T2>
|
||||||
int findPos(const std::vector<T1> & c, const T2 &s)
|
int findPos(const std::vector<T1> & c, const T2 &s) //returns position of first element in vector c equal to s, if there is no such element, -1 is returned
|
||||||
{
|
{
|
||||||
for(size_t i=0; i < c.size(); ++i)
|
for(size_t i=0; i < c.size(); ++i)
|
||||||
if(c[i] == s)
|
if(c[i] == s)
|
||||||
@ -161,7 +161,7 @@ namespace vstd
|
|||||||
return std::find(c.begin(),c.end(),i);
|
return std::find(c.begin(),c.end(),i);
|
||||||
}
|
}
|
||||||
template <typename Container, typename Item>
|
template <typename Container, typename Item>
|
||||||
bool operator-=(Container &c, const Item &i)
|
bool operator-=(Container &c, const Item &i) //removes element i from container c, returns false if c does not contain i
|
||||||
{
|
{
|
||||||
typename Container::iterator itr = find(c,i);
|
typename Container::iterator itr = find(c,i);
|
||||||
if(itr == c.end())
|
if(itr == c.end())
|
||||||
@ -212,7 +212,7 @@ namespace vstd
|
|||||||
using vstd::operator-=;
|
using vstd::operator-=;
|
||||||
|
|
||||||
template <typename t1, typename t2>
|
template <typename t1, typename t2>
|
||||||
t1 & amax(t1 &a, const t2 &b)
|
t1 & amax(t1 &a, const t2 &b) //assigns greater of (a, b) to a and returns maximum of (a, b)
|
||||||
{
|
{
|
||||||
if(a >= b)
|
if(a >= b)
|
||||||
return a;
|
return a;
|
||||||
@ -223,7 +223,7 @@ t1 & amax(t1 &a, const t2 &b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
template <typename t1, typename t2>
|
template <typename t1, typename t2>
|
||||||
t1 & amin(t1 &a, const t2 &b)
|
t1 & amin(t1 &a, const t2 &b) //assigns smaller of (a, b) to a and returns minimum of (a, b)
|
||||||
{
|
{
|
||||||
if(a <= b)
|
if(a <= b)
|
||||||
return a;
|
return a;
|
||||||
@ -236,7 +236,7 @@ t1 & amin(t1 &a, const t2 &b)
|
|||||||
#include "CConsoleHandler.h"
|
#include "CConsoleHandler.h"
|
||||||
extern DLL_EXPORT std::ostream *logfile;
|
extern DLL_EXPORT std::ostream *logfile;
|
||||||
extern DLL_EXPORT CConsoleHandler *console;
|
extern DLL_EXPORT CConsoleHandler *console;
|
||||||
template <int lvl> class CLogger
|
template <int lvl> class CLogger //logger, prints log info to console and saves in file
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CLogger<lvl>& operator<<(std::ostream& (*fun)(std::ostream&))
|
CLogger<lvl>& operator<<(std::ostream& (*fun)(std::ostream&))
|
||||||
|
@ -549,7 +549,16 @@ DLL_EXPORT void SetStackEffect::applyGs( CGameState *gs )
|
|||||||
{
|
{
|
||||||
CStack *s = gs->curB->getStack(id);
|
CStack *s = gs->curB->getStack(id);
|
||||||
if(s)
|
if(s)
|
||||||
s->effects.push_back(effect);
|
{
|
||||||
|
if(effect.id == 35) //dispel - removing all effects
|
||||||
|
{
|
||||||
|
s->effects.clear();
|
||||||
|
}
|
||||||
|
else //adding effect
|
||||||
|
{
|
||||||
|
s->effects.push_back(effect);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
tlog1 << "Cannot find stack " << id << std::endl;
|
tlog1 << "Cannot find stack " << id << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -2425,8 +2425,32 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
|
|||||||
sendAndApply(&si);
|
sendAndApply(&si);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 26: //armageddon
|
||||||
|
{
|
||||||
|
std::set<CStack*> attackedCres;
|
||||||
|
|
||||||
|
for(int it=0; it<gs->curB->stacks.size(); ++it)
|
||||||
|
{
|
||||||
|
attackedCres.insert(gs->curB->stacks[it]);
|
||||||
|
}
|
||||||
|
if(attackedCres.size() == 0) break;
|
||||||
|
StacksInjured si;
|
||||||
|
for(std::set<CStack*>::iterator it = attackedCres.begin(); it != attackedCres.end(); ++it)
|
||||||
|
{
|
||||||
|
BattleStackAttacked bsa;
|
||||||
|
bsa.flags |= 2;
|
||||||
|
bsa.effect = 12;
|
||||||
|
bsa.damageAmount = h->getPrimSkillLevel(2) * 10 + s->powers[h->getSpellSchoolLevel(s)];
|
||||||
|
bsa.stackAttacked = (*it)->ID;
|
||||||
|
prepareAttacked(bsa,*it);
|
||||||
|
si.stacks.insert(bsa);
|
||||||
|
}
|
||||||
|
sendAndApply(&si);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 27: //shield
|
case 27: //shield
|
||||||
case 28: //air shield
|
case 28: //air shield
|
||||||
|
case 35: //dispel
|
||||||
case 41: //bless
|
case 41: //bless
|
||||||
case 42: //curse
|
case 42: //curse
|
||||||
case 43: //bloodlust
|
case 43: //bloodlust
|
||||||
|
Loading…
Reference in New Issue
Block a user