瀏覽代碼

Deactivate activeStack during spellCast

Adriankhl 2 年之前
父節點
當前提交
76a71226a2

+ 9 - 0
client/battle/BattleInterface.cpp

@@ -310,6 +310,12 @@ void BattleInterface::spellCast(const BattleSpellCast * sc)
 {
 	windowObject->blockUI(true);
 
+	// Disable current active stack duing the cast
+	// Store the current activeStack to stackToActivate
+	stacksController->deactivateStack();
+
+	CCS->curh->set(Cursor::Combat::BLOCKED);
+
 	const SpellID spellID = sc->spellID;
 	const CSpell * spell = spellID.toSpell();
 	auto targetedTile = sc->tile;
@@ -551,6 +557,9 @@ void BattleInterface::endAction(const BattleAction* action)
 {
 	const CStack *stack = curInt->cb->battleGetStackByID(action->stackNumber);
 
+	// Activate stack from stackToActivate because this might have been temporary disabled, e.g., during spell cast
+	activateStack();
+
 	stacksController->endAction(action);
 	windowObject->updateQueue();
 

+ 9 - 0
client/battle/BattleStacksController.cpp

@@ -683,6 +683,15 @@ void BattleStacksController::stackActivated(const CStack *stack)
 	owner.activateStack();
 }
 
+void BattleStacksController::deactivateStack()
+{
+	if (!activeStack) {
+		return;
+	}
+	stackToActivate = activeStack;
+	setActiveStack(nullptr);
+}
+
 void BattleStacksController::activateStack()
 {
 	if ( !currentAnimations.empty())

+ 3 - 1
client/battle/BattleStacksController.h

@@ -118,7 +118,9 @@ public:
 	void startAction(const BattleAction* action);
 	void endAction(const BattleAction* action);
 
-	void activateStack(); //sets activeStack to stackToActivate etc. //FIXME: No, it's not clear at all
+	void deactivateStack(); //copy activeStack to stackToActivate, then set activeStack to nullptr to temporary disable current stack
+
+	void activateStack(); //copy stackToActivate to activeStack to enable controls of the stack
 
 	void setActiveStack(const CStack *stack);
 	void setSelectedStack(const CStack *stack);