1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-15 01:24:45 +02:00

Minor cleanup of hero movemen code

This commit is contained in:
Ivan Savenko
2023-09-08 18:02:36 +03:00
parent 347ce01dbe
commit 80b80a0ae6
7 changed files with 81 additions and 33 deletions

View File

@ -30,6 +30,20 @@
#include "../lib/NetPacks.h"
#include "../lib/CondSh.h"
// Code flow of movement process:
// - Player requests movement (e.g. press "move" button)
// -> calls doMoveHero (GUI thread)
// -> -> sends LOCPLINT->cb->moveHero
// - Server sends reply
// -> calls heroMoved (NETWORK thread)
// -> -> animation starts, sound starts
// -> -> waits for animation to finish
// -> -> if player have requested stop and path is not finished, calls doMoveHero again
//
// - Players requests movement stop (e.g. mouse click during movement)
// -> calls movementStopRequested
// -> -> sets flag that movement should be aborted
HeroMovementController::HeroMovementController()
{
destinationTeleport = ObjectInstanceID();
@ -41,19 +55,23 @@ void HeroMovementController::setMovementStatus(bool value)
{
duringMovement = value;
if (value)
{
CCS->curh->hide();
}
else
{
CCS->curh->show();
}
}
bool HeroMovementController::isHeroMovingThroughGarrison(const CGHeroInstance * hero) const
bool HeroMovementController::isHeroMovingThroughGarrison(const CGHeroInstance * hero, const CArmedInstance * garrison) const
{
//to ignore calls on passing through garrisons
return (movementState == EMoveState::DURING_MOVE && LOCPLINT->localState->hasPath(hero) && LOCPLINT->localState->getPath(hero).nodes.size() > 1);
assert(LOCPLINT->localState->hasPath(hero));
assert(movementState == EMoveState::DURING_MOVE);
if (!LOCPLINT->localState->hasPath(hero))
return false;
if (garrison->visitableAt(*LOCPLINT->localState->getLastTile(hero)))
return false; // hero want to enter garrison, not pass through it
return true;
}
bool HeroMovementController::isHeroMoving() const
@ -94,6 +112,7 @@ void HeroMovementController::onPlayerTurnStarted()
void HeroMovementController::onBattleStarted()
{
assert(movementState == EMoveState::STOP_MOVE);
// when battle starts, game will send battleStart pack *before* movement confirmation
// and since network thread wait for battle intro to play, movement confirmation will only happen after intro
// leading to several bugs, such as blocked input during intro
@ -102,11 +121,12 @@ void HeroMovementController::onBattleStarted()
void HeroMovementController::showTeleportDialog(TeleportChannelID channel, TTeleportExitsList exits, bool impassable, QueryID askID)
{
int choosenExit = -1;
auto neededExit = std::make_pair(destinationTeleport, destinationTeleportPos);
if (destinationTeleport != ObjectInstanceID() && vstd::contains(exits, neededExit))
choosenExit = vstd::find_pos(exits, neededExit);
assert(destinationTeleport != ObjectInstanceID::NONE);
auto neededExit = std::make_pair(destinationTeleport, destinationTeleportPos);
assert(vstd::contains(exits, neededExit));
int choosenExit = vstd::find_pos(exits, neededExit);
LOCPLINT->cb->selectionMade(choosenExit, askID);
}
@ -206,7 +226,7 @@ void HeroMovementController::movementStopRequested()
movementState = EMoveState::STOP_MOVE;
}
void HeroMovementController::doMoveHero(const CGHeroInstance * h, const CGPath & path)
void HeroMovementController::movementStartRequested(const CGHeroInstance * h, const CGPath & path)
{
setMovementStatus(true);