浏览代码

Little more work on #760:
* no tactics in creature banks
* no spellcasting during tactics phase

Michał W. Urbańczyk 13 年之前
父节点
当前提交
3cf4ebc163
共有 4 个文件被更改,包括 17 次插入7 次删除
  1. 9 3
      lib/BattleState.cpp
  2. 1 1
      lib/CGameState.cpp
  3. 1 1
      lib/GameConstants.h
  4. 6 2
      server/NetPacksServer.cpp

+ 9 - 3
lib/BattleState.cpp

@@ -1472,6 +1472,7 @@ BattleInfo * BattleInfo::setupBattle( int3 tile, int terrain, int terType, const
 {
 	CMP_stack cmpst;
 	BattleInfo *curB = new BattleInfo;
+	curB->castSpells[0] = curB->castSpells[1] = 0;
 	curB->sides[0] = armies[0]->tempOwner;
 	curB->sides[1] = armies[1]->tempOwner;
 	if(curB->sides[1] == 254) 
@@ -1765,17 +1766,20 @@ BattleInfo * BattleInfo::setupBattle( int3 tile, int terrain, int terType, const
 	//////////////////////////////////////////////////////////////////////////
 
 	//tactics
+	bool isTacticsAllowed = !creatureBank; //no tactics in crebanks
+
 	int tacticLvls[2] = {0};
 	for(int i = 0; i < ARRAY_COUNT(tacticLvls); i++)
 	{
 		if(heroes[i])
 			tacticLvls[i] += heroes[i]->getSecSkillLevel(CGHeroInstance::TACTICS);
 	}
+	int tacticsSkillDiff = tacticLvls[0] - tacticLvls[1];
 
-	if(int diff = tacticLvls[0] - tacticLvls[1])
+	if(tacticsSkillDiff && isTacticsAllowed)
 	{
-		curB->tacticsSide = diff < 0;
-		curB->tacticDistance = std::abs(diff)*2 + 1;
+		curB->tacticsSide = tacticsSkillDiff < 0;
+		curB->tacticDistance = std::abs(tacticsSkillDiff)*2 + 1;
 	}
 	else
 		curB->tacticDistance = 0;
@@ -1820,6 +1824,8 @@ ESpellCastProblem::ESpellCastProblem BattleInfo::battleCanCastSpell(int player,
 	{
 		case ECastingMode::HERO_CASTING:
 		{
+			if(tacticDistance)
+				return ESpellCastProblem::ONGOING_TACTIC_PHASE;
 			if(castSpells[side] > 0)
 				return ESpellCastProblem::ALREADY_CASTED_THIS_TURN;
 			if(!heroes[side])

+ 1 - 1
lib/CGameState.cpp

@@ -2081,7 +2081,7 @@ int CGameState::victoryCheck( ui8 player ) const
 			BOOST_FOREACH(const CGTownInstance *t, map->towns)
 				if((t == map->victoryCondition.obj || !map->victoryCondition.obj)
 					&& t->tempOwner == player
-					&& vstd::contains(t->builtBuildings, 26))
+					&& vstd::contains(t->builtBuildings, EBuilding::GRAIL))
 					return 1;
 			break;
 

+ 1 - 1
lib/GameConstants.h

@@ -145,7 +145,7 @@ namespace ESpellCastProblem
 		OK, NO_HERO_TO_CAST_SPELL, ALREADY_CASTED_THIS_TURN, NO_SPELLBOOK, ANOTHER_ELEMENTAL_SUMMONED,
 		HERO_DOESNT_KNOW_SPELL, NOT_ENOUGH_MANA, ADVMAP_SPELL_INSTEAD_OF_BATTLE_SPELL,
 		SECOND_HEROS_SPELL_IMMUNITY, SPELL_LEVEL_LIMIT_EXCEEDED, NO_SPELLS_TO_DISPEL,
-		NO_APPROPRIATE_TARGET, STACK_IMMUNE_TO_SPELL, WRONG_SPELL_TARGET
+		NO_APPROPRIATE_TARGET, STACK_IMMUNE_TO_SPELL, WRONG_SPELL_TARGET, ONGOING_TACTIC_PHASE
 	};
 }
 

+ 6 - 2
server/NetPacksServer.cpp

@@ -265,8 +265,12 @@ bool MakeAction::applyGh( CGameHandler *gh )
 
 bool MakeCustomAction::applyGh( CGameHandler *gh )
 {
-	if(!GS(gh)->curB) ERROR_AND_RETURN;
-	if(gh->connections[GS(gh)->curB->getStack(GS(gh)->curB->activeStack)->owner] != c) ERROR_AND_RETURN;
+	const BattleInfo *b = GS(gh)->curB;
+	if(!b) ERROR_AND_RETURN;
+	if(b->tacticDistance) ERROR_AND_RETURN;
+	const CStack *active = GS(gh)->curB->getStack(GS(gh)->curB->activeStack);
+	if(!active) ERROR_AND_RETURN;
+	if(gh->connections[active->owner] != c) ERROR_AND_RETURN;
 	return gh->makeCustomAction(ba);
 }