|
|
@@ -1478,7 +1478,7 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
else
|
|
|
pos = attackerLoose[army1->stacksCount()-1][k];
|
|
|
|
|
|
- CStack * stack = curB->generateNewStack(i->second, stacks.size(), true, i->first, gs->map->terrain[tile.x][tile.y][tile.z].tertype, pos);
|
|
|
+ CStack * stack = curB->generateNewStack(i->second, stacks.size(), true, i->first, pos);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
|
|
|
@@ -1493,7 +1493,7 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
else
|
|
|
pos = defenderLoose[army2->stacksCount()-1][k];
|
|
|
|
|
|
- CStack * stack = curB->generateNewStack(i->second, stacks.size(), false, i->first, gs->map->terrain[tile.x][tile.y][tile.z].tertype, pos);
|
|
|
+ CStack * stack = curB->generateNewStack(i->second, stacks.size(), false, i->first, pos);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
|
|
|
@@ -1514,17 +1514,17 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
{
|
|
|
if(hero1->getArt(13)) //ballista
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(146, 1, hero1), stacks.size(), true, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 52);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(146, 1, hero1), stacks.size(), true, 255, 52);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
if(hero1->getArt(14)) //ammo cart
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(148, 1, hero1), stacks.size(), true, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 18);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(148, 1, hero1), stacks.size(), true, 255, 18);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
if(hero1->getArt(15)) //first aid tent
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(147, 1, hero1), stacks.size(), true, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 154);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(147, 1, hero1), stacks.size(), true, 255, 154);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
}
|
|
|
@@ -1533,23 +1533,23 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
//defending hero shouldn't receive ballista (bug #551)
|
|
|
if(hero2->getArt(13) && !town) //ballista
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(146, 1, hero2), stacks.size(), false, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 66);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(146, 1, hero2), stacks.size(), false, 255, 66);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
if(hero2->getArt(14)) //ammo cart
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(148, 1, hero1), stacks.size(), false, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 32);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(148, 1, hero1), stacks.size(), false, 255, 32);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
if(hero2->getArt(15)) //first aid tent
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(147, 1, hero2), stacks.size(), false, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 168);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(147, 1, hero2), stacks.size(), false, 255, 168);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
}
|
|
|
if(town && hero1 && town->hasFort()) //catapult
|
|
|
{
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(145, 1, hero1), stacks.size(), true, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, 120);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(145, 1, hero1), stacks.size(), true, 255, 120);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
//war machines added
|
|
|
@@ -1559,14 +1559,14 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
|
|
|
case 3: //castle
|
|
|
{//lower tower / upper tower
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(149, 1, hero2), stacks.size(), false, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, -4);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(149, 1, hero2), stacks.size(), false, 255, -4);
|
|
|
stacks.push_back(stack);
|
|
|
- stack = curB->generateNewStack(CStackInstance(149, 1, hero2), stacks.size(), false, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, -3);
|
|
|
+ stack = curB->generateNewStack(CStackInstance(149, 1, hero2), stacks.size(), false, 255, -3);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
case 2: //citadel
|
|
|
{//main tower
|
|
|
- CStack * stack = curB->generateNewStack(CStackInstance(149, 1, hero2), stacks.size(), false, 255, gs->map->terrain[tile.x][tile.y][tile.z].tertype, -2);
|
|
|
+ CStack * stack = curB->generateNewStack(CStackInstance(149, 1, hero2), stacks.size(), false, 255, -2);
|
|
|
stacks.push_back(stack);
|
|
|
}
|
|
|
}
|
|
|
@@ -1676,8 +1676,7 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //giving terrain premies for heroes & stacks
|
|
|
-
|
|
|
+ //giving terrain overalay premies
|
|
|
int bonusSubtype = -1;
|
|
|
switch(terType)
|
|
|
{
|
|
|
@@ -1703,86 +1702,47 @@ void CGameHandler::setupBattle(BattleInfo * curB, int3 tile, const CArmedInstanc
|
|
|
}
|
|
|
|
|
|
{ //common part for cases 9, 14, 15, 16, 17
|
|
|
- const CGHeroInstance * cHero = NULL;
|
|
|
- for(int i=0; i<2; ++i)
|
|
|
- {
|
|
|
- if(i == 0) cHero = hero1;
|
|
|
- else cHero = hero2;
|
|
|
-
|
|
|
- if(cHero == NULL) continue;
|
|
|
-
|
|
|
- GiveBonus gs;
|
|
|
- gs.bonus = Bonus(Bonus::ONE_BATTLE, Bonus::MAGIC_SCHOOL_SKILL, Bonus::OBJECT, 3, -1, "", bonusSubtype);
|
|
|
- gs.id = cHero->id;
|
|
|
-
|
|
|
- sendAndApply(&gs);
|
|
|
- }
|
|
|
-
|
|
|
+ curB->addNewBonus(new Bonus(Bonus::ONE_BATTLE, Bonus::MAGIC_SCHOOL_SKILL, Bonus::TERRAIN_OVERLAY, 3, -1, "", bonusSubtype));
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case 18: //holy ground
|
|
|
{
|
|
|
- for(int g=0; g<stacks.size(); ++g) //+1 morale bonus for good creatures, -1 morale bonus for evil creatures
|
|
|
- {
|
|
|
- if (stacks[g]->type->isGood())
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, 1, Bonus::TERRAIN_OVERLAY));
|
|
|
- else if (stacks[g]->type->isEvil())
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, -1, Bonus::TERRAIN_OVERLAY));
|
|
|
- }
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, +1, Bonus::TERRAIN_OVERLAY)->addLimiter(new CreatureAlignmentLimiter(GOOD)));
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, -1, Bonus::TERRAIN_OVERLAY)->addLimiter(new CreatureAlignmentLimiter(EVIL)));
|
|
|
break;
|
|
|
}
|
|
|
case 19: //clover field
|
|
|
- {
|
|
|
- for(int g=0; g<stacks.size(); ++g)
|
|
|
- {
|
|
|
- if(stacks[g]->type->faction == -1) //+2 luck bonus for neutral creatures
|
|
|
- {
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::LUCK, Bonus::ONE_BATTLE, 0, 2, Bonus::TERRAIN_OVERLAY));
|
|
|
- }
|
|
|
- }
|
|
|
+ { //+2 luck bonus for neutral creatures
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::LUCK, Bonus::ONE_BATTLE, 0, +2, Bonus::TERRAIN_OVERLAY)->addLimiter(new CreatureFactionLimiter(-1)));
|
|
|
break;
|
|
|
}
|
|
|
case 20: //evil fog
|
|
|
{
|
|
|
- for(int g=0; g<stacks.size(); ++g) //-1 morale bonus for good creatures, +1 morale bonus for evil creatures
|
|
|
- {
|
|
|
- if (stacks[g]->type->isGood())
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, -1, Bonus::TERRAIN_OVERLAY));
|
|
|
- else if (stacks[g]->type->isEvil())
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, 1, Bonus::TERRAIN_OVERLAY));
|
|
|
- }
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, -1, Bonus::TERRAIN_OVERLAY)->addLimiter(new CreatureAlignmentLimiter(GOOD)));
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::MORALE, Bonus::ONE_BATTLE, 0, +1, Bonus::TERRAIN_OVERLAY)->addLimiter(new CreatureAlignmentLimiter(EVIL)));
|
|
|
break;
|
|
|
}
|
|
|
case 22: //cursed ground
|
|
|
{
|
|
|
- for(int g=0; g<stacks.size(); ++g) //no luck nor morale
|
|
|
- {
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::NO_MORALE, Bonus::ONE_BATTLE, 0, 0, Bonus::TERRAIN_OVERLAY));
|
|
|
- stacks[g]->addNewBonus(makeFeature(Bonus::NO_LUCK, Bonus::ONE_BATTLE, 0, 0, Bonus::TERRAIN_OVERLAY));
|
|
|
- }
|
|
|
-
|
|
|
- const CGHeroInstance * cHero = NULL;
|
|
|
- for(int i=0; i<2; ++i) //blocking spells above level 1
|
|
|
- {
|
|
|
- if(i == 0) cHero = hero1;
|
|
|
- else cHero = hero2;
|
|
|
-
|
|
|
- if(cHero == NULL) continue;
|
|
|
-
|
|
|
- GiveBonus gs;
|
|
|
- gs.bonus = Bonus(Bonus::ONE_BATTLE, Bonus::BLOCK_SPELLS_ABOVE_LEVEL, Bonus::OBJECT, 1, -1, "", bonusSubtype);
|
|
|
- gs.id = cHero->id;
|
|
|
-
|
|
|
- sendAndApply(&gs);
|
|
|
- }
|
|
|
-
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::NO_MORALE, Bonus::ONE_BATTLE, 0, 0, Bonus::TERRAIN_OVERLAY));
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::NO_LUCK, Bonus::ONE_BATTLE, 0, 0, Bonus::TERRAIN_OVERLAY));
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::BLOCK_SPELLS_ABOVE_LEVEL, Bonus::ONE_BATTLE, 0, 1, Bonus::TERRAIN_OVERLAY));
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ //overlay premies given
|
|
|
|
|
|
- //premies given
|
|
|
+ //native terrain bonuses
|
|
|
+ int terrain = this->getTile(tile)->tertype;
|
|
|
+ if(town) //during siege always take premies for native terrain of faction
|
|
|
+ terrain = VLC->heroh->nativeTerrains[town->town->typeID];
|
|
|
|
|
|
+ ILimiter *nativeTerrain = new CreatureNativeTerrainLimiter(terrain);
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::STACKS_SPEED, Bonus::ONE_BATTLE, 0, 1, Bonus::TERRAIN_NATIVE)->addLimiter(nativeTerrain));
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::PRIMARY_SKILL, Bonus::ONE_BATTLE, PrimarySkill::ATTACK, 1, Bonus::TERRAIN_NATIVE)->addLimiter(nativeTerrain));
|
|
|
+ curB->addNewBonus(makeFeature(Bonus::PRIMARY_SKILL, Bonus::ONE_BATTLE, PrimarySkill::DEFENSE, 1, Bonus::TERRAIN_NATIVE)->addLimiter(nativeTerrain));
|
|
|
+ //////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//send info about battles
|
|
|
BattleStart bs;
|