mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Changes for BattleInterface classes according to code review:
- added documentation comments for classes, members and methods - added const specifier to methods where applicable - renamed some methods with more clear name - removed some commented-out or unused code
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleActionsController.cpp, part of VCMI engine | ||||
|  * BattleActionsController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -141,7 +141,7 @@ void BattleActionsController::enterCreatureCastingMode() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| std::vector<PossiblePlayerBattleAction> BattleActionsController::getPossibleActionsForStack(const CStack *stack) | ||||
| std::vector<PossiblePlayerBattleAction> BattleActionsController::getPossibleActionsForStack(const CStack *stack) const | ||||
| { | ||||
| 	BattleClientInterfaceData data; //hard to get rid of these things so for now they're required data to pass | ||||
| 	data.creatureSpellToCast = owner->stacksController->activeStackSpellToCast(); | ||||
| @@ -742,7 +742,7 @@ bool BattleActionsController::isCastingPossibleHere(const CStack *sactive, const | ||||
| 	return isCastingPossible; | ||||
| } | ||||
|  | ||||
| bool BattleActionsController::canStackMoveHere(const CStack * stackToMove, BattleHex myNumber) | ||||
| bool BattleActionsController::canStackMoveHere(const CStack * stackToMove, BattleHex myNumber) const | ||||
| { | ||||
| 	std::vector<BattleHex> acc = owner->curInt->cb->battleGetAvailableHexes(stackToMove); | ||||
| 	BattleHex shiftedDest = myNumber.cloneInDirection(stackToMove->destShiftDir(), false); | ||||
| @@ -762,12 +762,12 @@ void BattleActionsController::activateStack() | ||||
| 		possibleActions = getPossibleActionsForStack(s); | ||||
| } | ||||
|  | ||||
| bool BattleActionsController::spellcastingModeActive() | ||||
| bool BattleActionsController::spellcastingModeActive() const | ||||
| { | ||||
| 	return spellDestSelectMode; | ||||
| } | ||||
|  | ||||
| SpellID BattleActionsController::selectedSpell() | ||||
| SpellID BattleActionsController::selectedSpell() const | ||||
| { | ||||
| 	if (!spellToCast) | ||||
| 		return SpellID::NONE; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleActionsController.h, part of VCMI engine | ||||
|  * BattleActionsController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -25,39 +25,72 @@ enum class MouseHoveredHexContext | ||||
| 	OCCUPIED_HEX | ||||
| }; | ||||
|  | ||||
| /// Class that controls actions that can be performed by player, e.g. moving stacks, attacking, etc | ||||
| /// As well as all relevant feedback for these actions in user interface | ||||
| class BattleActionsController | ||||
| { | ||||
| 	BattleInterface * owner; | ||||
|  | ||||
| 	std::vector<PossiblePlayerBattleAction> possibleActions; //all actions possible to call at the moment by player | ||||
| 	std::vector<PossiblePlayerBattleAction> localActions; //actions possible to take on hovered hex | ||||
| 	std::vector<PossiblePlayerBattleAction> illegalActions; //these actions display message in case of illegal target | ||||
| 	PossiblePlayerBattleAction currentAction; //action that will be performed on l-click | ||||
| 	PossiblePlayerBattleAction selectedAction; //last action chosen (and saved) by player | ||||
| 	PossiblePlayerBattleAction illegalAction; //most likely action that can't be performed here | ||||
| 	/// all actions possible to call at the moment by player | ||||
| 	std::vector<PossiblePlayerBattleAction> possibleActions; | ||||
|  | ||||
| 	bool creatureCasting; //if true, stack currently aims to cats a spell | ||||
| 	bool spellDestSelectMode; //if true, player is choosing destination for his spell - only for GUI / console | ||||
| 	std::shared_ptr<BattleAction> spellToCast; //spell for which player is choosing destination | ||||
| 	const CSpell *currentSpell; //spell pointer for convenience | ||||
| 	/// actions possible to take on hovered hex | ||||
| 	std::vector<PossiblePlayerBattleAction> localActions; | ||||
|  | ||||
| 	/// these actions display message in case of illegal target | ||||
| 	std::vector<PossiblePlayerBattleAction> illegalActions; | ||||
|  | ||||
| 	/// action that will be performed on l-click | ||||
| 	PossiblePlayerBattleAction currentAction; | ||||
|  | ||||
| 	/// last action chosen (and saved) by player | ||||
| 	PossiblePlayerBattleAction selectedAction; | ||||
|  | ||||
| 	/// if there are not possible actions to choose from, this action should be show as "illegal" in UI | ||||
| 	PossiblePlayerBattleAction illegalAction; | ||||
|  | ||||
| 	/// if true, stack currently aims to cats a spell | ||||
| 	bool creatureCasting; | ||||
|  | ||||
| 	/// if true, player is choosing destination for his spell - only for GUI / console | ||||
| 	bool spellDestSelectMode; | ||||
|  | ||||
| 	/// spell for which player is choosing destination | ||||
| 	std::shared_ptr<BattleAction> spellToCast; | ||||
|  | ||||
| 	/// spell for which player is choosing destination, pointer for convenience | ||||
| 	const CSpell *currentSpell; | ||||
|  | ||||
| 	/// cached message that was set by this class in status bar | ||||
| 	std::string currentConsoleMsg; | ||||
|  | ||||
| 	bool isCastingPossibleHere (const CStack *sactive, const CStack *shere, BattleHex myNumber); | ||||
| 	bool canStackMoveHere (const CStack *sactive, BattleHex MyNumber); //TODO: move to BattleState / callback | ||||
|  | ||||
| 	std::vector<PossiblePlayerBattleAction> getPossibleActionsForStack (const CStack *stack); //called when stack gets its turn | ||||
| 	bool canStackMoveHere (const CStack *sactive, BattleHex MyNumber) const; //TODO: move to BattleState / callback | ||||
| 	std::vector<PossiblePlayerBattleAction> getPossibleActionsForStack (const CStack *stack) const; //called when stack gets its turn | ||||
| 	void reorderPossibleActionsPriority(const CStack * stack, MouseHoveredHexContext context); | ||||
|  | ||||
| 	std::string currentConsoleMsg; | ||||
| public: | ||||
| 	BattleActionsController(BattleInterface * owner); | ||||
|  | ||||
| 	/// initialize list of potential actions for new active stack | ||||
| 	void activateStack(); | ||||
| 	void endCastingSpell(); //ends casting spell (eg. when spell has been cast or canceled) | ||||
|  | ||||
| 	/// initialize potential actions for spells that can be cast by active stack | ||||
| 	void enterCreatureCastingMode(); | ||||
|  | ||||
| 	SpellID selectedSpell(); | ||||
| 	bool spellcastingModeActive(); | ||||
| 	void castThisSpell(SpellID spellID); //called when player has chosen a spell from spellbook | ||||
| 	/// initialize potential actions for selected spell | ||||
| 	void castThisSpell(SpellID spellID); | ||||
|  | ||||
| 	/// ends casting spell (eg. when spell has been cast or canceled) | ||||
| 	void endCastingSpell(); | ||||
|  | ||||
| 	/// update UI (e.g. status bar/cursor) according to new active hex | ||||
| 	void handleHex(BattleHex myNumber, int eventType); | ||||
|  | ||||
| 	/// returns currently selected spell or SpellID::NONE on error | ||||
| 	SpellID selectedSpell() const; | ||||
|  | ||||
| 	/// returns true if UI is currently in target selection mode | ||||
| 	bool spellcastingModeActive() const; | ||||
|  | ||||
| }; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleAnimations.cpp, part of VCMI engine | ||||
|  * BattleAnimationClasses.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -855,7 +855,7 @@ CShootingAnimation::CShootingAnimation(BattleInterface * _owner, const CStack * | ||||
|  | ||||
| void CShootingAnimation::createProjectile(const Point & from, const Point & dest) const | ||||
| { | ||||
| 	owner->projectilesController->createProjectile(attackingStack, attackedStack, from, dest); | ||||
| 	owner->projectilesController->createProjectile(attackingStack, from, dest); | ||||
| } | ||||
|  | ||||
| uint32_t CShootingAnimation::getAttackClimaxFrame() const | ||||
| @@ -970,7 +970,7 @@ CCreatureAnim::EAnimType CCastAnimation::getDownwardsGroup() const | ||||
| void CCastAnimation::createProjectile(const Point & from, const Point & dest) const | ||||
| { | ||||
| 	if (!spell->animationInfo.projectile.empty()) | ||||
| 		owner->projectilesController->createSpellProjectile(attackingStack, attackedStack, from, dest, spell); | ||||
| 		owner->projectilesController->createSpellProjectile(attackingStack, from, dest, spell); | ||||
| } | ||||
|  | ||||
| uint32_t CCastAnimation::getAttackClimaxFrame() const | ||||
| @@ -1071,7 +1071,7 @@ bool CPointEffectAnimation::init() | ||||
| 		else | ||||
| 		{ | ||||
| 			const CStack * destStack = owner->getCurrentPlayerInterface()->cb->battleGetStackByPos(battlehexes[i], false); | ||||
| 			Rect tilePos = owner->fieldController->hexPosition(battlehexes[i]); | ||||
| 			Rect tilePos = owner->fieldController->hexPositionAbsolute(battlehexes[i]); | ||||
|  | ||||
| 			be.x = tilePos.x + tilePos.w/2 - first->width()/2; | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleAnimations.h, part of VCMI engine | ||||
|  * BattleAnimations.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleControlPanel.cpp, part of VCMI engine | ||||
|  * BattleControlPanel.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleControlPanel.h, part of VCMI engine | ||||
|  * BattleControlPanel.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -20,6 +20,7 @@ class CButton; | ||||
| class BattleInterface; | ||||
| class BattleConsole; | ||||
|  | ||||
| /// GUI object that handles functionality of panel at the bottom of combat screen | ||||
| class BattleControlPanel : public CIntObject | ||||
| { | ||||
| 	BattleInterface * owner; | ||||
| @@ -38,7 +39,7 @@ class BattleControlPanel : public CIntObject | ||||
| 	std::shared_ptr<CButton> btactNext; | ||||
| 	std::shared_ptr<CButton> btactEnd; | ||||
|  | ||||
| 	//button handle funcs: | ||||
| 	/// button press handling functions | ||||
| 	void bOptionsf(); | ||||
| 	void bSurrenderf(); | ||||
| 	void bFleef(); | ||||
| @@ -51,20 +52,23 @@ class BattleControlPanel : public CIntObject | ||||
| 	void bTacticNextStack(); | ||||
| 	void bTacticPhaseEnd(); | ||||
|  | ||||
| 	void reallyFlee(); //performs fleeing without asking player | ||||
| 	void reallySurrender(); //performs surrendering without asking player | ||||
| 	/// functions for handling actions after they were confirmed by popup window | ||||
| 	void reallyFlee(); | ||||
| 	void reallySurrender(); | ||||
|  | ||||
| public: | ||||
| 	std::shared_ptr<BattleConsole> console; | ||||
|  | ||||
| 	// block all UI elements, e.g. during enemy turn | ||||
| 	// unlike activate/deactivate this method will correctly grey-out all elements | ||||
| 	/// block all UI elements when player is not allowed to act, e.g. during enemy turn | ||||
| 	void blockUI(bool on); | ||||
|  | ||||
| 	void show(SDL_Surface * to) override; | ||||
| 	void showAll(SDL_Surface * to) override; | ||||
|  | ||||
| 	/// Toggle UI to displaying tactics phase | ||||
| 	void tacticPhaseStarted(); | ||||
|  | ||||
| 	/// Toggle UI to displaying battle log in place of tactics UI | ||||
| 	void tacticPhaseEnded(); | ||||
|  | ||||
| 	BattleControlPanel(BattleInterface * owner, const Point & position); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleEffectsController.cpp, part of VCMI engine | ||||
|  * BattleEffectsController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleEffectsController.h, part of VCMI engine | ||||
|  * BattleEffectsController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -57,6 +57,7 @@ struct BattleEffect | ||||
| 	BattleHex position; //Indicates if effect which hex the effect is drawn on | ||||
| }; | ||||
|  | ||||
| /// Controls rendering of effects in battle, e.g. from spells, abilities and various other actions like morale | ||||
| class BattleEffectsController | ||||
| { | ||||
| 	BattleInterface * owner; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleFieldController.cpp, part of VCMI engine | ||||
|  * BattleFieldController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -79,7 +79,7 @@ BattleFieldController::BattleFieldController(BattleInterface * owner): | ||||
| 	{ | ||||
| 		auto hex = std::make_shared<ClickableHex>(); | ||||
| 		hex->myNumber = h; | ||||
| 		hex->pos = hexPosition(h); | ||||
| 		hex->pos = hexPositionAbsolute(h); | ||||
| 		hex->myInterface = owner; | ||||
| 		bfield.push_back(hex); | ||||
| 	} | ||||
| @@ -162,7 +162,7 @@ void BattleFieldController::redrawBackgroundWithHexes() | ||||
|  | ||||
| void BattleFieldController::showHighlightedHex(Canvas & canvas, BattleHex hex, bool darkBorder) | ||||
| { | ||||
| 	Point hexPos = hexPosition(hex).topLeft(); | ||||
| 	Point hexPos = hexPositionAbsolute(hex).topLeft(); | ||||
|  | ||||
| 	canvas.draw(cellShade, hexPos); | ||||
| 	if(!darkBorder && settings["battle"]["cellBorders"].Bool()) | ||||
| @@ -278,7 +278,7 @@ Rect BattleFieldController::hexPositionLocal(BattleHex hex) const | ||||
| 	return Rect(x, y, w, h); | ||||
| } | ||||
|  | ||||
| Rect BattleFieldController::hexPosition(BattleHex hex) const | ||||
| Rect BattleFieldController::hexPositionAbsolute(BattleHex hex) const | ||||
| { | ||||
| 	return hexPositionLocal(hex) + owner->pos.topLeft(); | ||||
| } | ||||
| @@ -299,7 +299,7 @@ BattleHex BattleFieldController::getHoveredHex() | ||||
|  | ||||
| void BattleFieldController::setBattleCursor(BattleHex myNumber) | ||||
| { | ||||
| 	Rect hoveredHexPos = hexPosition(myNumber); | ||||
| 	Rect hoveredHexPos = hexPositionAbsolute(myNumber); | ||||
| 	CCursorHandler *cursor = CCS->curh; | ||||
|  | ||||
| 	const double subdividingAngle = 2.0*M_PI/6.0; // Divide a hex into six sectors. | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleFieldController.h, part of VCMI engine | ||||
|  * BattleFieldController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -27,6 +27,7 @@ class Canvas; | ||||
| class IImage; | ||||
| class BattleInterface; | ||||
|  | ||||
| /// Handles battlefield grid as well as rendering of background layer of battle interface | ||||
| class BattleFieldController : public CIntObject | ||||
| { | ||||
| 	BattleInterface * owner; | ||||
| @@ -35,19 +36,22 @@ class BattleFieldController : public CIntObject | ||||
| 	std::shared_ptr<IImage> cellBorder; | ||||
| 	std::shared_ptr<IImage> cellShade; | ||||
|  | ||||
| 	std::unique_ptr<Canvas> cellBorders; | ||||
|  | ||||
| 	/// Canvas that contains background, hex grid (if enabled), absolute obstacles and movement range of active stack | ||||
| 	std::unique_ptr<Canvas> backgroundWithHexes; | ||||
|  | ||||
| 	//BattleHex previouslyHoveredHex; //number of hex that was hovered by the cursor a while ago | ||||
| 	//BattleHex currentlyHoveredHex; //number of hex that is supposed to be hovered (for a while it may be inappropriately set, but will be renewed soon) | ||||
| 	BattleHex attackingHex; //hex from which the stack would perform attack with current cursor | ||||
| 	/// Canvas that contains cell borders of all tiles in the battlefield | ||||
| 	std::unique_ptr<Canvas> cellBorders; | ||||
|  | ||||
| 	std::vector<BattleHex> occupyableHexes; //hexes available for active stack | ||||
| 	std::array<bool, GameConstants::BFIELD_SIZE> stackCountOutsideHexes; // hexes that when in front of a unit cause it's amount box to move back | ||||
| 	/// hex from which the stack would perform attack with current cursor | ||||
| 	BattleHex attackingHex; | ||||
|  | ||||
| 	std::vector<std::shared_ptr<ClickableHex>> bfield; //11 lines, 17 hexes on each | ||||
| 	/// hexes to which currently active stack can move | ||||
| 	std::vector<BattleHex> occupyableHexes; | ||||
|  | ||||
| 	/// hexes that when in front of a unit cause it's amount box to move back | ||||
| 	std::array<bool, GameConstants::BFIELD_SIZE> stackCountOutsideHexes; | ||||
|  | ||||
| 	std::vector<std::shared_ptr<ClickableHex>> bfield; | ||||
|  | ||||
| 	void showHighlightedHex(Canvas & to, BattleHex hex, bool darkBorder); | ||||
|  | ||||
| @@ -65,14 +69,24 @@ public: | ||||
| 	void redrawBackgroundWithHexes(); | ||||
| 	void renderBattlefield(Canvas & canvas); | ||||
|  | ||||
| 	/// Returns position of hex relative to owner (BattleInterface) | ||||
| 	Rect hexPositionLocal(BattleHex hex) const; | ||||
| 	Rect hexPosition(BattleHex hex) const; | ||||
|  | ||||
| 	/// Returns position of hex relative to game window | ||||
| 	Rect hexPositionAbsolute(BattleHex hex) const; | ||||
|  | ||||
| 	/// Checks whether selected pixel is transparent, uses local coordinates of a hex | ||||
| 	bool isPixelInHex(Point const & position); | ||||
|  | ||||
| 	/// Returns ID of currently hovered hex or BattleHex::INVALID if none | ||||
| 	BattleHex getHoveredHex(); | ||||
|  | ||||
| 	/// returns true if selected tile can be attacked in melee by current stack | ||||
| 	bool isTileAttackable(const BattleHex & number) const; | ||||
|  | ||||
| 	/// returns true if stack should render its stack count image in default position - outside own hex | ||||
| 	bool stackCountOutsideHex(const BattleHex & number) const; | ||||
|  | ||||
| 	void setBattleCursor(BattleHex myNumber); | ||||
| 	BattleHex fromWhichHexAttack(BattleHex myNumber); | ||||
| 	bool isTileAttackable(const BattleHex & number) const; | ||||
| 	bool stackCountOutsideHex(const BattleHex & number) const; | ||||
| }; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleInterface.cpp, part of VCMI engine | ||||
|  * BattleInterface.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -514,7 +514,7 @@ void BattleInterface::spellCast(const BattleSpellCast * sc) | ||||
| 			Point destcoord = stacksController->getStackPositionAtHex(sc->tile, target); //position attacked by projectile | ||||
| 			destcoord += Point(250, 240); // FIXME: what are these constants? | ||||
|  | ||||
| 			projectilesController->createSpellProjectile( nullptr, target, srccoord, destcoord, spell); | ||||
| 			projectilesController->createSpellProjectile( nullptr, srccoord, destcoord, spell); | ||||
| 			projectilesController->emitStackProjectile( nullptr ); | ||||
|  | ||||
| 			// wait fo projectile to end | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleInterface.h, part of VCMI engine | ||||
|  * BattleInterface.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -182,6 +182,7 @@ public: | ||||
| 	const CGHeroInstance *currentHero() const; | ||||
| 	InfoAboutHero enemyHero() const; | ||||
|  | ||||
| 	// TODO: cleanup this list | ||||
| 	friend class CPlayerInterface; | ||||
| 	friend class CInGameConsole; | ||||
| 	friend class StackQueue; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleInterfaceClasses.cpp, part of VCMI engine | ||||
|  * BattleInterfaceClasses.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleInterfaceClasses.h, part of VCMI engine | ||||
|  * BattleInterfaceClasses.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleObstacleController.cpp, part of VCMI engine | ||||
|  * BattleObstacleController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -182,7 +182,7 @@ Point BattleObstacleController::getObstaclePosition(std::shared_ptr<IImage> imag | ||||
| { | ||||
| 	int offset = obstacle.getAnimationYOffset(image->height()); | ||||
|  | ||||
| 	Rect r = owner->fieldController->hexPosition(obstacle.pos); | ||||
| 	Rect r = owner->fieldController->hexPositionAbsolute(obstacle.pos); | ||||
| 	r.y += 42 - image->height() + offset; | ||||
|  | ||||
| 	return r.topLeft(); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleObstacleController.h, part of VCMI engine | ||||
|  * BattleObstacleController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -24,16 +24,20 @@ class BattleInterface; | ||||
| class BattleRenderer; | ||||
| struct Point; | ||||
|  | ||||
| /// Controls all currently active projectiles on the battlefield | ||||
| /// (with exception of moat, which is apparently handled by siege controller) | ||||
| class BattleObstacleController | ||||
| { | ||||
| 	std::map<std::string, std::shared_ptr<CAnimation>> animationsCache; | ||||
|  | ||||
| 	BattleInterface * owner; | ||||
|  | ||||
| 	/// cached animations of all obstacles in current battle | ||||
| 	std::map<std::string, std::shared_ptr<CAnimation>> animationsCache; | ||||
|  | ||||
| 	/// list of all obstacles that are currently being rendered | ||||
| 	std::map<si32, std::shared_ptr<CAnimation>> obstacleAnimations; | ||||
|  | ||||
| 	// semi-debug member, contains obstacles that should not yet be visible due to ongoing placement animation | ||||
| 	// used only for sanity checks to ensure that there are no invisible obstacles | ||||
| 	/// semi-debug member, contains obstacles that should not yet be visible due to ongoing placement animation | ||||
| 	/// used only for sanity checks to ensure that there are no invisible obstacles | ||||
| 	std::vector<si32> obstaclesBeingPlaced; | ||||
|  | ||||
| 	void loadObstacleImage(const CObstacleInstance & oi); | ||||
| @@ -44,9 +48,12 @@ class BattleObstacleController | ||||
| public: | ||||
| 	BattleObstacleController(BattleInterface * owner); | ||||
|  | ||||
| 	/// call-in from network pack, add newly placed obstacles with any required animations | ||||
| 	void obstaclePlaced(const std::vector<std::shared_ptr<const CObstacleInstance>> & oi); | ||||
| 	void showObstacles(SDL_Surface *to, std::vector<std::shared_ptr<const CObstacleInstance>> &obstacles); | ||||
|  | ||||
| 	/// renders all "absolute" obstacles | ||||
| 	void showAbsoluteObstacles(Canvas & canvas, const Point & offset); | ||||
|  | ||||
| 	/// adds all non-"absolute" visible obstacles for rendering | ||||
| 	void collectRenderableObjects(BattleRenderer & renderer); | ||||
| }; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleProjectileController.cpp, part of VCMI engine | ||||
|  * BattleProjectileController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -239,7 +239,7 @@ void BattleProjectileController::showProjectiles(Canvas & canvas) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| bool BattleProjectileController::hasActiveProjectile(const CStack * stack) | ||||
| bool BattleProjectileController::hasActiveProjectile(const CStack * stack) const | ||||
| { | ||||
| 	int stackID = stack ? stack->ID : -1; | ||||
|  | ||||
| @@ -312,10 +312,8 @@ void BattleProjectileController::createCatapultProjectile(const CStack * shooter | ||||
| 	projectiles.push_back(std::shared_ptr<ProjectileBase>(catapultProjectile)); | ||||
| } | ||||
|  | ||||
| void BattleProjectileController::createProjectile(const CStack * shooter, const CStack * target, Point from, Point dest) | ||||
| void BattleProjectileController::createProjectile(const CStack * shooter, Point from, Point dest) | ||||
| { | ||||
| 	assert(target); | ||||
|  | ||||
| 	const CCreature *shooterInfo = getShooter(shooter); | ||||
|  | ||||
| 	std::shared_ptr<ProjectileBase> projectile; | ||||
| @@ -351,7 +349,7 @@ void BattleProjectileController::createProjectile(const CStack * shooter, const | ||||
| 	projectiles.push_back(projectile); | ||||
| } | ||||
|  | ||||
| void BattleProjectileController::createSpellProjectile(const CStack * shooter, const CStack * target, Point from, Point dest, const CSpell * spell) | ||||
| void BattleProjectileController::createSpellProjectile(const CStack * shooter, Point from, Point dest, const CSpell * spell) | ||||
| { | ||||
| 	double projectileAngle = std::abs(atan2(dest.x - from.x, dest.y - from.y)); | ||||
| 	std::string animToDisplay = spell->animationInfo.selectProjectile(projectileAngle); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleSiegeController.h, part of VCMI engine | ||||
|  * BattleSiegeController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -25,7 +25,7 @@ class CAnimation; | ||||
| class Canvas; | ||||
| class BattleInterface; | ||||
|  | ||||
| /// Small struct which contains information about the position and the velocity of a projectile | ||||
| /// Base class for projectiles | ||||
| struct ProjectileBase | ||||
| { | ||||
| 	virtual ~ProjectileBase() = default; | ||||
| @@ -40,6 +40,7 @@ struct ProjectileBase | ||||
| 	bool playing;  // if set to true, projectile animation is playing, e.g. flying to target | ||||
| }; | ||||
|  | ||||
| /// Projectile for most shooters - render pre-selected frame moving in straight line from origin to destination | ||||
| struct ProjectileMissile : ProjectileBase | ||||
| { | ||||
| 	void show(Canvas & canvas) override; | ||||
| @@ -49,12 +50,14 @@ struct ProjectileMissile : ProjectileBase | ||||
| 	bool reverse;  // if true, projectile will be flipped by vertical axis | ||||
| }; | ||||
|  | ||||
| /// Projectile for spell - render animation moving in straight line from origin to destination | ||||
| struct ProjectileAnimatedMissile : ProjectileMissile | ||||
| { | ||||
| 	void show(Canvas & canvas) override; | ||||
| 	float frameProgress; | ||||
| }; | ||||
|  | ||||
| /// Projectile for catapult - render spinning projectile moving at parabolic trajectory to its destination | ||||
| struct ProjectileCatapult : ProjectileBase | ||||
| { | ||||
| 	void show(Canvas & canvas) override; | ||||
| @@ -63,6 +66,7 @@ struct ProjectileCatapult : ProjectileBase | ||||
| 	int frameNum;  // frame to display from projectile animation | ||||
| }; | ||||
|  | ||||
| /// Projectile for mages/evil eye - render ray expanding from origin position to destination | ||||
| struct ProjectileRay : ProjectileBase | ||||
| { | ||||
| 	void show(Canvas & canvas) override; | ||||
| @@ -70,6 +74,8 @@ struct ProjectileRay : ProjectileBase | ||||
| 	std::vector<CCreature::CreatureAnimation::RayColor> rayConfig; | ||||
| }; | ||||
|  | ||||
| /// Class that manages all ongoing projectiles in the game | ||||
| /// ... even though in H3 only 1 projectile can be on screen at any point of time | ||||
| class BattleProjectileController | ||||
| { | ||||
| 	BattleInterface * owner; | ||||
| @@ -77,9 +83,6 @@ class BattleProjectileController | ||||
| 	/// all projectiles loaded during current battle | ||||
| 	std::map<std::string, std::shared_ptr<CAnimation>> projectilesCache; | ||||
|  | ||||
| //	std::map<int, std::shared_ptr<CAnimation>> idToProjectile; | ||||
| //	std::map<int, std::vector<CCreature::CreatureAnimation::RayColor>> idToRay; | ||||
|  | ||||
| 	/// projectiles currently flying on battlefield | ||||
| 	std::vector<std::shared_ptr<ProjectileBase>> projectiles; | ||||
|  | ||||
| @@ -96,14 +99,21 @@ class BattleProjectileController | ||||
|  | ||||
| 	int computeProjectileFrameID( Point from, Point dest, const CStack * stack); | ||||
| 	int computeProjectileFlightTime( Point from, Point dest, double speed); | ||||
|  | ||||
| public: | ||||
| 	BattleProjectileController(BattleInterface * owner); | ||||
|  | ||||
| 	/// renders all currently active projectiles | ||||
| 	void showProjectiles(Canvas & canvas); | ||||
|  | ||||
| 	bool hasActiveProjectile(const CStack * stack); | ||||
| 	/// returns true if stack has projectile that is yet to hit target | ||||
| 	bool hasActiveProjectile(const CStack * stack) const; | ||||
|  | ||||
| 	/// starts rendering previously created projectile | ||||
| 	void emitStackProjectile(const CStack * stack); | ||||
| 	void createProjectile(const CStack * shooter, const CStack * target, Point from, Point dest); | ||||
| 	void createSpellProjectile(const CStack * shooter, const CStack * target, Point from, Point dest, const CSpell * spell); | ||||
|  | ||||
| 	/// creates (but not emits!) projectile and initializes it based on parameters | ||||
| 	void createProjectile(const CStack * shooter, Point from, Point dest); | ||||
| 	void createSpellProjectile(const CStack * shooter, Point from, Point dest, const CSpell * spell); | ||||
| 	void createCatapultProjectile(const CStack * shooter, Point from, Point dest); | ||||
| }; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleFieldController.cpp, part of VCMI engine | ||||
|  * BattleFieldController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleFieldController.h, part of VCMI engine | ||||
|  * BattleFieldController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -11,19 +11,7 @@ | ||||
|  | ||||
| #include "../../lib/battle/BattleHex.h" | ||||
|  | ||||
| VCMI_LIB_NAMESPACE_BEGIN | ||||
|  | ||||
| //class CStack; | ||||
|  | ||||
| VCMI_LIB_NAMESPACE_END | ||||
|  | ||||
| //struct SDL_Surface; | ||||
| //struct Rect; | ||||
| //struct Point; | ||||
| // | ||||
| //class CClickableHex; | ||||
| class Canvas; | ||||
| //class IImage; | ||||
| class BattleInterface; | ||||
|  | ||||
| enum class EBattleFieldLayer { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleSiegeController.cpp, part of VCMI engine | ||||
|  * BattleSiegeController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleObstacleController.h, part of VCMI engine | ||||
|  * BattleObstacleController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleStacksController.cpp, part of VCMI engine | ||||
|  * BattleStacksController.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -435,7 +435,7 @@ void BattleStacksController::stackAttacking( const CStack *attacker, BattleHex d | ||||
| 	//waitForAnims(); | ||||
| } | ||||
|  | ||||
| bool BattleStacksController::shouldRotate(const CStack * stack, const BattleHex & oldPos, const BattleHex & nextHex) | ||||
| bool BattleStacksController::shouldRotate(const CStack * stack, const BattleHex & oldPos, const BattleHex & nextHex) const | ||||
| { | ||||
| 	Point begPosition = getStackPositionAtHex(oldPos,stack); | ||||
| 	Point endPosition = getStackPositionAtHex(nextHex, stack); | ||||
| @@ -528,19 +528,19 @@ void BattleStacksController::setSelectedStack(const CStack *stack) | ||||
| 	selectedStack = stack; | ||||
| } | ||||
|  | ||||
| const CStack* BattleStacksController::getSelectedStack() | ||||
| const CStack* BattleStacksController::getSelectedStack() const | ||||
| { | ||||
| 	return selectedStack; | ||||
| } | ||||
|  | ||||
| const CStack* BattleStacksController::getActiveStack() | ||||
| const CStack* BattleStacksController::getActiveStack() const | ||||
| { | ||||
| 	return activeStack; | ||||
| } | ||||
|  | ||||
| bool BattleStacksController::facingRight(const CStack * stack) | ||||
| bool BattleStacksController::facingRight(const CStack * stack) const | ||||
| { | ||||
| 	return stackFacingRight[stack->ID]; | ||||
| 	return stackFacingRight.at(stack->ID); | ||||
| } | ||||
|  | ||||
| bool BattleStacksController::activeStackSpellcaster() | ||||
| @@ -555,7 +555,7 @@ SpellID BattleStacksController::activeStackSpellToCast() | ||||
| 	return SpellID(creatureSpellToCast); | ||||
| } | ||||
|  | ||||
| Point BattleStacksController::getStackPositionAtHex(BattleHex hexNum, const CStack * stack) | ||||
| Point BattleStacksController::getStackPositionAtHex(BattleHex hexNum, const CStack * stack) const | ||||
| { | ||||
| 	Point ret(-500, -500); //returned value | ||||
| 	if(stack && stack->initialPosition < 0) //creatures in turrets | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * CBattleStacksController.h, part of VCMI engine | ||||
|  * BattleStacksController.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
| @@ -31,6 +31,10 @@ class CBattleAnimation; | ||||
| class BattleRenderer; | ||||
| class IImage; | ||||
|  | ||||
| /// Class responsible for handling stacks in battle | ||||
| /// Handles ordering of stacks animation | ||||
| /// As well as rendering of stacks, their amount boxes | ||||
| /// And any other effect applied to stacks | ||||
| class BattleStacksController | ||||
| { | ||||
| 	BattleInterface * owner; | ||||
| @@ -40,19 +44,33 @@ class BattleStacksController | ||||
| 	std::shared_ptr<IImage> amountPositive; | ||||
| 	std::shared_ptr<IImage> amountEffNeutral; | ||||
|  | ||||
| 	std::vector<CBattleAnimation *> currentAnimations; //currently displayed animations <anim, initialized> | ||||
| 	std::map<int32_t, std::shared_ptr<CreatureAnimation>> stackAnimation; //animations of creatures from fighting armies (order by BattleInfo's stacks' ID) | ||||
| 	std::map<int, bool> stackFacingRight; // <creatureID, if false reverse creature's animation> //TODO: move it to battle callback | ||||
| 	/// currently displayed animations <anim, initialized> | ||||
| 	std::vector<CBattleAnimation *> currentAnimations; | ||||
|  | ||||
| 	const CStack *activeStack; //number of active stack; nullptr - no one | ||||
| 	const CStack *mouseHoveredStack; // stack below mouse pointer, used for border animation | ||||
| 	const CStack *stackToActivate; //when animation is playing, we should wait till the end to make the next stack active; nullptr of none | ||||
| 	const CStack *selectedStack; //for Teleport / Sacrifice | ||||
| 	/// animations of creatures from fighting armies (order by BattleInfo's stacks' ID) | ||||
| 	std::map<int32_t, std::shared_ptr<CreatureAnimation>> stackAnimation; | ||||
|  | ||||
| 	bool stackCanCastSpell; //if true, active stack could possibly cast some target spell | ||||
| 	/// <creatureID, if false reverse creature's animation> //TODO: move it to battle callback | ||||
| 	std::map<int, bool> stackFacingRight; | ||||
|  | ||||
| 	/// number of active stack; nullptr - no one | ||||
| 	const CStack *activeStack; | ||||
|  | ||||
| 	/// stack below mouse pointer, used for border animation | ||||
| 	const CStack *mouseHoveredStack; | ||||
|  | ||||
| 	///when animation is playing, we should wait till the end to make the next stack active; nullptr of none | ||||
| 	const CStack *stackToActivate; | ||||
|  | ||||
| 	/// stack that was selected for multi-target spells - Teleport / Sacrifice | ||||
| 	const CStack *selectedStack; | ||||
|  | ||||
| 	/// if true, active stack could possibly cast some target spell | ||||
| 	bool stackCanCastSpell; | ||||
| 	si32 creatureSpellToCast; | ||||
|  | ||||
| 	ui32 animIDhelper; //for giving IDs for animations | ||||
| 	/// for giving IDs for animations | ||||
| 	ui32 animIDhelper; | ||||
|  | ||||
| 	bool stackNeedsAmountBox(const CStack * stack); | ||||
| 	void showStackAmountBox(Canvas & canvas, const CStack * stack); | ||||
| @@ -63,8 +81,8 @@ class BattleStacksController | ||||
| public: | ||||
| 	BattleStacksController(BattleInterface * owner); | ||||
|  | ||||
| 	bool shouldRotate(const CStack * stack, const BattleHex & oldPos, const BattleHex & nextHex); | ||||
| 	bool facingRight(const CStack * stack); | ||||
| 	bool shouldRotate(const CStack * stack, const BattleHex & oldPos, const BattleHex & nextHex) const; | ||||
| 	bool facingRight(const CStack * stack) const; | ||||
|  | ||||
| 	void stackReset(const CStack * stack); | ||||
| 	void stackAdded(const CStack * stack); //new stack appeared on battlefield | ||||
| @@ -94,11 +112,11 @@ public: | ||||
| 	void addNewAnim(CBattleAnimation *anim); //adds new anim to pendingAnims | ||||
| 	void updateBattleAnimations(); | ||||
|  | ||||
| 	const CStack* getActiveStack(); | ||||
| 	const CStack* getSelectedStack(); | ||||
| 	const CStack* getActiveStack() const; | ||||
| 	const CStack* getSelectedStack() const; | ||||
|  | ||||
| 	/// returns position of animation needed to place stack in specific hex | ||||
| 	Point getStackPositionAtHex(BattleHex hexNum, const CStack * creature); | ||||
| 	Point getStackPositionAtHex(BattleHex hexNum, const CStack * creature) const; | ||||
|  | ||||
| 	friend class CBattleAnimation; // for exposing pendingAnims/creAnims/creDir to animations | ||||
| }; | ||||
|   | ||||
| @@ -57,37 +57,44 @@ public: | ||||
|  | ||||
| private: | ||||
| 	std::string name; | ||||
|  | ||||
| 	/// animation for rendering stack in default orientation - facing right | ||||
| 	std::shared_ptr<CAnimation> forward; | ||||
|  | ||||
| 	/// animation that has all its frames flipped for rendering stack facing left | ||||
| 	std::shared_ptr<CAnimation> reverse; | ||||
|  | ||||
| 	int fullWidth; | ||||
| 	int fullHeight; | ||||
|  | ||||
| 	// speed of animation, measure in frames per second | ||||
| 	/// speed of animation, measure in frames per second | ||||
| 	float speed; | ||||
|  | ||||
| 	// currently displayed frame. Float to allow H3-style animations where frames | ||||
| 	// don't display for integer number of frames | ||||
| 	/// currently displayed frame. Float to allow H3-style animations where frames | ||||
| 	/// don't display for integer number of frames | ||||
| 	float currentFrame; | ||||
| 	// cumulative, real-time duration of animation. Used for effects like selection border | ||||
| 	float elapsedTime; | ||||
| 	CCreatureAnim::EAnimType type; //type of animation being displayed | ||||
|  | ||||
| 	// border color, disabled if alpha = 0 | ||||
| 	/// cumulative, real-time duration of animation. Used for effects like selection border | ||||
| 	float elapsedTime; | ||||
|  | ||||
| 	///type of animation being displayed | ||||
| 	CCreatureAnim::EAnimType type; | ||||
|  | ||||
| 	/// border color, disabled if alpha = 0 | ||||
| 	SDL_Color border; | ||||
|  | ||||
| 	TSpeedController speedController; | ||||
|  | ||||
| 	bool once; // animation will be played once and the reset to idling | ||||
| 	/// animation will be played once and the reset to idling | ||||
| 	bool once; | ||||
|  | ||||
| 	void endAnimation(); | ||||
|  | ||||
|  | ||||
| 	void genBorderPalette(IImage::BorderPallete & target); | ||||
| public: | ||||
|  | ||||
| 	// function(s) that will be called when animation ends, after reset to 1st frame | ||||
| 	// NOTE that these function will be fired only once | ||||
| 	/// function(s) that will be called when animation ends, after reset to 1st frame | ||||
| 	/// NOTE that these functions will be fired only once | ||||
| 	CFunctionList<void()> onAnimationReset; | ||||
|  | ||||
| 	int getWidth() const; | ||||
| @@ -99,28 +106,35 @@ public: | ||||
| 	/// in specified group of animation should be played, measured in seconds | ||||
| 	CreatureAnimation(const std::string & name_, TSpeedController speedController); | ||||
|  | ||||
| 	void setType(CCreatureAnim::EAnimType type); //sets type of animation and cleares framecount | ||||
| 	CCreatureAnim::EAnimType getType() const; //returns type of animation | ||||
| 	/// sets type of animation and resets framecount | ||||
| 	void setType(CCreatureAnim::EAnimType type); | ||||
|  | ||||
| 	/// returns currently rendered type of animation | ||||
| 	CCreatureAnim::EAnimType getType() const; | ||||
|  | ||||
| 	void nextFrame(Canvas & canvas, bool facingRight); | ||||
|  | ||||
| 	// should be called every frame, return true when animation was reset to beginning | ||||
| 	/// should be called every frame, return true when animation was reset to beginning | ||||
| 	bool incrementFrame(float timePassed); | ||||
|  | ||||
| 	void setBorderColor(SDL_Color palette); | ||||
|  | ||||
| 	// tint color effect | ||||
| 	/// apply color tint effect | ||||
| 	void shiftColor(const ColorShifter * shifter); | ||||
|  | ||||
| 	float getCurrentFrame() const; // Gets the current frame ID relative to frame group. | ||||
| 	/// Gets the current frame ID within current group. | ||||
| 	float getCurrentFrame() const; | ||||
|  | ||||
| 	void playOnce(CCreatureAnim::EAnimType type); //plays once given stage of animation, then resets to 2 | ||||
| 	/// plays once given type of animation, then resets to idle | ||||
| 	void playOnce(CCreatureAnim::EAnimType type); | ||||
|  | ||||
| 	int framesInGroup(CCreatureAnim::EAnimType group) const; | ||||
| 	/// returns number of frames in selected animation type | ||||
| 	int framesInGroup(CCreatureAnim::EAnimType type) const; | ||||
|  | ||||
| 	void pause(); | ||||
| 	void play(); | ||||
|  | ||||
| 	//helpers. TODO: move them somewhere else | ||||
| 	/// helpers to classify current type of animation | ||||
| 	bool isDead() const; | ||||
| 	bool isDying() const; | ||||
| 	bool isDeadOrDying() const; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user