1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

* added support for non-damaging multi-target spells

* fixed not updating menu in battles
This commit is contained in:
mateuszb
2009-01-15 17:01:08 +00:00
parent c8ba52230b
commit a5c4586d13
2 changed files with 2891 additions and 2622 deletions

View File

@ -386,6 +386,8 @@ void CBattleInterface::show(SDL_Surface * to)
} }
SDL_SetClipRect(to, &buf); //restoring previous clip_rect
//showing menu background and console //showing menu background and console
blitAt(menu, pos.x, 556 + pos.y, to); blitAt(menu, pos.x, 556 + pos.y, to);
console->show(to); console->show(to);
@ -401,6 +403,10 @@ void CBattleInterface::show(SDL_Surface * to)
bConsoleUp->show(to); bConsoleUp->show(to);
bConsoleDown->show(to); bConsoleDown->show(to);
SDL_GetClipRect(to, &buf);
SDL_SetClipRect(to, &pos);
//showing hero animations //showing hero animations
if(attackingHero) if(attackingHero)
attackingHero->show(to); attackingHero->show(to);
@ -1418,6 +1424,26 @@ void CBattleInterface::battleFinished(const BattleResult& br)
void CBattleInterface::spellCasted(SpellCasted * sc) void CBattleInterface::spellCasted(SpellCasted * sc)
{ {
std::vector< std::string > anims; //for magic arrow and ice bolt 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) switch(sc->id)
{ {
case 15: //magic arrow case 15: //magic arrow
@ -1492,65 +1518,68 @@ void CBattleInterface::spellCasted(SpellCasted * sc)
} }
case 27: //shield case 27: //shield
{ {
displayEffect(27, sc->tile); DISPLAY2(27);
break; break;
} }
case 28: //air shield case 28: //air shield
{ {
displayEffect(2, sc->tile); DISPLAY2(2);
break; break;
} }
case 41: //bless case 41: //bless
{ {
displayEffect(36, sc->tile); DISPLAY2(36);
break; break;
} }
case 42: //curse case 42: //curse
{ {
displayEffect(40, sc->tile); DISPLAY2(40);
break; break;
} }
case 43: //bloodlust case 43: //bloodlust
{ {
displayEffect(4, sc->tile); //TODO: give better animation for this spell DISPLAY2(4);
//TODO: give better animation for this spell
break; break;
} }
case 45: //weakness case 45: //weakness
{ {
displayEffect(56, sc->tile); //TODO: give better animation for this spell DISPLAY2(56);
//TODO: give better animation for this spell
break; break;
} }
case 46: //stone skin case 46: //stone skin
{ {
displayEffect(54, sc->tile); DISPLAY2(54);
break; break;
} }
case 48: //prayer case 48: //prayer
{ {
displayEffect(0, sc->tile); DISPLAY2(0);
break; break;
} }
case 53: //haste case 53: //haste
{ {
displayEffect(31, sc->tile); DISPLAY2(31);
break; break;
} }
case 54: //slow case 54: //slow
{ {
displayEffect(19, sc->tile); DISPLAY2(19);
break; break;
} }
case 56: //frenzy case 56: //frenzy
{ {
displayEffect(17, sc->tile); DISPLAY2(17);
break; break;
} }
case 61: //forgetfulness case 61: //forgetfulness
{ {
displayEffect(42, sc->tile); DISPLAY2(42);
break; break;
} }
} }
#undef DISPLAY2
} }
void CBattleInterface::castThisSpell(int spellID) void CBattleInterface::castThisSpell(int spellID)

View File

@ -1313,121 +1313,361 @@ upgend:
case 27: //shield case 27: //shield
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 27; sse.effect.id = 27;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 27;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 28: //air shield case 28: //air shield
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 28; sse.effect.id = 28;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 28;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 41: //bless case 41: //bless
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 41; sse.effect.id = 41;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 41;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 42: //curse case 42: //curse
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 42; sse.effect.id = 42;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 42;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 43: //bloodlust case 43: //bloodlust
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 43; sse.effect.id = 43;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 43;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 45: //weakness case 45: //weakness
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 45; sse.effect.id = 45;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 45;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 46: //stone skin case 46: //stone skin
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 46; sse.effect.id = 46;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 46;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 48: //prayer case 48: //prayer
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 48; sse.effect.id = 48;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 48;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 53: //haste case 53: //haste
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 53; sse.effect.id = 53;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 53;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 54: //slow case 54: //slow
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 54; sse.effect.id = 54;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 54;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 56: //frenzy case 56: //frenzy
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 56; sse.effect.id = 56;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = 1; //! - different duration sse.effect.turnsRemain = 1; //! - different duration
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 56;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
case 61: //forgetfulness case 61: //forgetfulness
{ {
SetStackEffect sse; SetStackEffect sse;
if(getSchoolLevel(h,s) < 3) //not expert
{
sse.stack = gs->curB->getStackT(ba.destinationTile)->ID; sse.stack = gs->curB->getStackT(ba.destinationTile)->ID;
sse.effect.id = 61; sse.effect.id = 61;
sse.effect.level = getSchoolLevel(h,s); sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2); sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse); sendAndApply(&sse);
}
else
{
for(int it=0; it<gs->curB->stacks.size(); ++it)
{
//if it's non negative spell and our unit or non positive spell and hostile unit
if((VLC->spellh->spells[ba.additionalInfo].positiveness >= 0 && gs->curB->stacks[it]->owner == h->tempOwner)
||(VLC->spellh->spells[ba.additionalInfo].positiveness <= 0 && gs->curB->stacks[it]->owner != h->tempOwner )
)
{
sse.stack = gs->curB->stacks[it]->ID;
sse.effect.id = 61;
sse.effect.level = getSchoolLevel(h,s);
sse.effect.turnsRemain = h->getPrimSkillLevel(2);
sendAndApply(&sse);
}
}
}
break; break;
} }
} }