浏览代码

Battle action start on client after intro sound

Dydzio 6 年之前
父节点
当前提交
262057ad1c
共有 2 个文件被更改,包括 26 次插入13 次删除
  1. 25 13
      client/battle/CBattleInterface.cpp
  2. 1 0
      client/battle/CBattleInterface.h

+ 25 - 13
client/battle/CBattleInterface.cpp

@@ -44,6 +44,8 @@
 #include "../../lib/NetPacks.h"
 #include "../../lib/NetPacks.h"
 #include "../../lib/UnlockGuard.h"
 #include "../../lib/UnlockGuard.h"
 
 
+int battleIntroSoundChannel; //required as variable for disabling it via ESC key
+
 CondSh<bool> CBattleInterface::animsAreDisplayed(false);
 CondSh<bool> CBattleInterface::animsAreDisplayed(false);
 CondSh<BattleAction *> CBattleInterface::givenCommand(nullptr);
 CondSh<BattleAction *> CBattleInterface::givenCommand(nullptr);
 
 
@@ -104,7 +106,7 @@ CBattleInterface::CBattleInterface(const CCreatureSet *army1, const CCreatureSet
 	currentlyHoveredHex(-1), attackingHex(-1), stackCanCastSpell(false), creatureCasting(false), spellDestSelectMode(false), spellToCast(nullptr), sp(nullptr),
 	currentlyHoveredHex(-1), attackingHex(-1), stackCanCastSpell(false), creatureCasting(false), spellDestSelectMode(false), spellToCast(nullptr), sp(nullptr),
 	creatureSpellToCast(-1),
 	creatureSpellToCast(-1),
 	siegeH(nullptr), attackerInt(att), defenderInt(defen), curInt(att), animIDhelper(0),
 	siegeH(nullptr), attackerInt(att), defenderInt(defen), curInt(att), animIDhelper(0),
-	myTurn(false), moveStarted(false), moveSoundHander(-1), bresult(nullptr)
+	myTurn(false), moveStarted(false), moveSoundHander(-1), bresult(nullptr), battleActionsStarted(false)
 {
 {
 	OBJ_CONSTRUCTION;
 	OBJ_CONSTRUCTION;
 
 
@@ -400,22 +402,25 @@ CBattleInterface::CBattleInterface(const CCreatureSet *army1, const CCreatureSet
 		bTacticNextStack();
 		bTacticNextStack();
 
 
 	CCS->musich->stopMusic();
 	CCS->musich->stopMusic();
-
-	int channel = CCS->soundh->playSoundFromSet(CCS->soundh->battleIntroSounds);
-	auto onIntroPlayed = []()
+	battleIntroSoundChannel = CCS->soundh->playSoundFromSet(CCS->soundh->battleIntroSounds);
+	auto onIntroPlayed = [&]()
 	{
 	{
-		if (LOCPLINT->battleInt)
+		if(LOCPLINT->battleInt)
+		{
 			CCS->musich->playMusicFromSet("battle", true);
 			CCS->musich->playMusicFromSet("battle", true);
+			battleActionsStarted = true;
+			blockUI(settings["session"]["spectate"].Bool());
+			battleIntroSoundChannel = -1;
+		}
 	};
 	};
 
 
-	CCS->soundh->setCallback(channel, onIntroPlayed);
+	CCS->soundh->setCallback(battleIntroSoundChannel, onIntroPlayed);
 	memset(stackCountOutsideHexes, 1, GameConstants::BFIELD_SIZE *sizeof(bool)); //initialize array with trues
 	memset(stackCountOutsideHexes, 1, GameConstants::BFIELD_SIZE *sizeof(bool)); //initialize array with trues
 
 
 	currentAction = INVALID;
 	currentAction = INVALID;
 	selectedAction = INVALID;
 	selectedAction = INVALID;
 	addUsedEvents(RCLICK | MOVE | KEYBOARD);
 	addUsedEvents(RCLICK | MOVE | KEYBOARD);
-
-	blockUI(settings["session"]["spectate"].Bool());
+	blockUI(true);
 }
 }
 
 
 CBattleInterface::~CBattleInterface()
 CBattleInterface::~CBattleInterface()
@@ -571,7 +576,10 @@ void CBattleInterface::keyPressed(const SDL_KeyboardEvent & key)
 	}
 	}
 	else if (key.keysym.sym == SDLK_ESCAPE)
 	else if (key.keysym.sym == SDLK_ESCAPE)
 	{
 	{
-		endCastingSpell();
+		if(!battleActionsStarted)
+			CCS->soundh->stopSound(battleIntroSoundChannel);
+		else
+			endCastingSpell();
 	}
 	}
 }
 }
 void CBattleInterface::mouseMoved(const SDL_MouseMotionEvent &sEvent)
 void CBattleInterface::mouseMoved(const SDL_MouseMotionEvent &sEvent)
@@ -1630,6 +1638,9 @@ void CBattleInterface::setHoveredStack(const CStack *stack)
 
 
 void CBattleInterface::activateStack()
 void CBattleInterface::activateStack()
 {
 {
+	if(!battleActionsStarted)
+		return; //"show" function should re-call this function
+
 	myTurn = true;
 	myTurn = true;
 	if (!!attackerInt && defenderInt) //hotseat -> need to pick which interface "takes over" as active
 	if (!!attackerInt && defenderInt) //hotseat -> need to pick which interface "takes over" as active
 		curInt = attackerInt->playerID == stackToActivate->owner ? attackerInt : defenderInt;
 		curInt = attackerInt->playerID == stackToActivate->owner ? attackerInt : defenderInt;
@@ -2079,7 +2090,7 @@ bool CBattleInterface::canStackMoveHere(const CStack * activeStack, BattleHex my
 
 
 void CBattleInterface::handleHex(BattleHex myNumber, int eventType)
 void CBattleInterface::handleHex(BattleHex myNumber, int eventType)
 {
 {
-	if (!myTurn) //we are not permit to do anything
+	if (!myTurn || !battleActionsStarted) //we are not permit to do anything
 		return;
 		return;
 
 
 	// This function handles mouse move over hexes and l-clicking on them.
 	// This function handles mouse move over hexes and l-clicking on them.
@@ -3039,21 +3050,22 @@ void CBattleInterface::show(SDL_Surface *to)
 	showBattlefieldObjects(to);
 	showBattlefieldObjects(to);
 	showProjectiles(to);
 	showProjectiles(to);
 
 
-	updateBattleAnimations();
+	if(battleActionsStarted)
+		updateBattleAnimations();
 
 
 	SDL_SetClipRect(to, &buf); //restoring previous clip_rect
 	SDL_SetClipRect(to, &buf); //restoring previous clip_rect
 
 
 	showInterface(to);
 	showInterface(to);
 
 
 	//activation of next stack
 	//activation of next stack
-	if (pendingAnims.empty() && stackToActivate != nullptr)
+	if (pendingAnims.empty() && stackToActivate != nullptr && battleActionsStarted) //FIXME: watch for recursive infinite loop here when working with this file, this needs rework anyway...
 	{
 	{
 		activateStack();
 		activateStack();
 
 
 		//we may have changed active interface (another side in hot-seat),
 		//we may have changed active interface (another side in hot-seat),
 		// so we can't continue drawing with old setting.
 		// so we can't continue drawing with old setting.
 		show(to);
 		show(to);
-	}
+	}		
 }
 }
 
 
 void CBattleInterface::showBackground(SDL_Surface *to)
 void CBattleInterface::showBackground(SDL_Surface *to)

+ 1 - 0
client/battle/CBattleInterface.h

@@ -175,6 +175,7 @@ private:
 	PossibleActions currentAction; //action that will be performed on l-click
 	PossibleActions currentAction; //action that will be performed on l-click
 	PossibleActions selectedAction; //last action chosen (and saved) by player
 	PossibleActions selectedAction; //last action chosen (and saved) by player
 	PossibleActions illegalAction; //most likely action that can't be performed here
 	PossibleActions illegalAction; //most likely action that can't be performed here
+	bool battleActionsStarted; //used for delaying battle actions until intro sound stops
 
 
 	void setActiveStack(const CStack *stack);
 	void setActiveStack(const CStack *stack);
 	void setHoveredStack(const CStack *stack);
 	void setHoveredStack(const CStack *stack);