mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-22 22:13:35 +02:00
Do not check for guards when teleporting using means other than DD
This commit is contained in:
parent
6a1477838d
commit
8b861fc58f
@ -199,7 +199,7 @@ public:
|
|||||||
void startBattlePrimary(const CArmedInstance * army1, const CArmedInstance * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool creatureBank = false, const CGTownInstance * town = nullptr) override {}; //use hero=nullptr for no hero
|
void startBattlePrimary(const CArmedInstance * army1, const CArmedInstance * army2, int3 tile, const CGHeroInstance * hero1, const CGHeroInstance * hero2, bool creatureBank = false, const CGTownInstance * town = nullptr) override {}; //use hero=nullptr for no hero
|
||||||
void startBattleI(const CArmedInstance * army1, const CArmedInstance * army2, int3 tile, bool creatureBank = false) override {}; //if any of armies is hero, hero will be used
|
void startBattleI(const CArmedInstance * army1, const CArmedInstance * army2, int3 tile, bool creatureBank = false) override {}; //if any of armies is hero, hero will be used
|
||||||
void startBattleI(const CArmedInstance * army1, const CArmedInstance * army2, bool creatureBank = false) override {}; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
void startBattleI(const CArmedInstance * army1, const CArmedInstance * army2, bool creatureBank = false) override {}; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
||||||
bool moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL) override {return false;};
|
bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode movementMode, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL) override {return false;};
|
||||||
void giveHeroBonus(GiveBonus * bonus) override {};
|
void giveHeroBonus(GiveBonus * bonus) override {};
|
||||||
void setMovePoints(SetMovePoints * smp) override {};
|
void setMovePoints(SetMovePoints * smp) override {};
|
||||||
void setMovePoints(ObjectInstanceID hid, int val, bool absolute) override {};
|
void setMovePoints(ObjectInstanceID hid, int val, bool absolute) override {};
|
||||||
|
@ -117,7 +117,7 @@ public:
|
|||||||
virtual void startBattlePrimary(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, const CGTownInstance *town = nullptr)=0; //use hero=nullptr for no hero
|
virtual void startBattlePrimary(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, const CGTownInstance *town = nullptr)=0; //use hero=nullptr for no hero
|
||||||
virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank = false)=0; //if any of armies is hero, hero will be used
|
virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank = false)=0; //if any of armies is hero, hero will be used
|
||||||
virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, bool creatureBank = false)=0; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
virtual void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, bool creatureBank = false)=0; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
||||||
virtual bool moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL)=0;
|
virtual bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode moveMove, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL)=0;
|
||||||
virtual bool swapGarrisonOnSiege(ObjectInstanceID tid)=0;
|
virtual bool swapGarrisonOnSiege(ObjectInstanceID tid)=0;
|
||||||
virtual void giveHeroBonus(GiveBonus * bonus)=0;
|
virtual void giveHeroBonus(GiveBonus * bonus)=0;
|
||||||
virtual void setMovePoints(SetMovePoints * smp)=0;
|
virtual void setMovePoints(SetMovePoints * smp)=0;
|
||||||
|
@ -253,4 +253,13 @@ enum class EArmyFormation : int8_t
|
|||||||
TIGHT
|
TIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class EMovementMode : int8_t
|
||||||
|
{
|
||||||
|
STANDARD,
|
||||||
|
DIMENSION_DOOR,
|
||||||
|
MONOLITH,
|
||||||
|
CASTLE_GATE,
|
||||||
|
TOWN_PORTAL,
|
||||||
|
};
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -524,7 +524,7 @@ void CGMonolith::teleportDialogAnswered(const CGHeroInstance *hero, ui32 answer,
|
|||||||
else
|
else
|
||||||
dPos = hero->convertFromVisitablePos(cb->getObj(randomExit)->visitablePos());
|
dPos = hero->convertFromVisitablePos(cb->getObj(randomExit)->visitablePos());
|
||||||
|
|
||||||
cb->moveHero(hero->id, dPos, true);
|
cb->moveHero(hero->id, dPos, EMovementMode::MONOLITH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGMonolith::initObj(CRandomGenerator & rand)
|
void CGMonolith::initObj(CRandomGenerator & rand)
|
||||||
@ -703,7 +703,7 @@ void CGWhirlpool::teleportDialogAnswered(const CGHeroInstance *hero, ui32 answer
|
|||||||
dPos = hero->convertFromVisitablePos(*RandomGeneratorUtil::nextItem(tiles, CRandomGenerator::getDefault()));
|
dPos = hero->convertFromVisitablePos(*RandomGeneratorUtil::nextItem(tiles, CRandomGenerator::getDefault()));
|
||||||
}
|
}
|
||||||
|
|
||||||
cb->moveHero(hero->id, dPos, true);
|
cb->moveHero(hero->id, dPos, EMovementMode::MONOLITH);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGWhirlpool::isProtected(const CGHeroInstance * h)
|
bool CGWhirlpool::isProtected(const CGHeroInstance * h)
|
||||||
|
@ -439,7 +439,7 @@ void DimensionDoorMechanics::endCast(SpellCastEnvironment * env, const Adventure
|
|||||||
const TerrainTile * curr = env->getCb()->getTile(casterPosition);
|
const TerrainTile * curr = env->getCb()->getTile(casterPosition);
|
||||||
|
|
||||||
if(dest->isClear(curr))
|
if(dest->isClear(curr))
|
||||||
env->moveHero(ObjectInstanceID(parameters.caster->getCasterUnitId()), parameters.caster->getHeroCaster()->convertFromVisitablePos(parameters.pos), true);
|
env->moveHero(ObjectInstanceID(parameters.caster->getCasterUnitId()), parameters.caster->getHeroCaster()->convertFromVisitablePos(parameters.pos), EMovementMode::DIMENSION_DOOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
///TownPortalMechanics
|
///TownPortalMechanics
|
||||||
@ -567,7 +567,7 @@ void TownPortalMechanics::endCast(SpellCastEnvironment * env, const AdventureSpe
|
|||||||
destination = dynamic_cast<const CGTownInstance*>(topObj);
|
destination = dynamic_cast<const CGTownInstance*>(topObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(env->moveHero(ObjectInstanceID(parameters.caster->getCasterUnitId()), parameters.caster->getHeroCaster()->convertFromVisitablePos(destination->visitablePos()), true))
|
if(env->moveHero(ObjectInstanceID(parameters.caster->getCasterUnitId()), parameters.caster->getHeroCaster()->convertFromVisitablePos(destination->visitablePos()), EMovementMode::TOWN_PORTAL))
|
||||||
{
|
{
|
||||||
SetMovePoints smp;
|
SetMovePoints smp;
|
||||||
smp.hid = ObjectInstanceID(parameters.caster->getCasterUnitId());
|
smp.hid = ObjectInstanceID(parameters.caster->getCasterUnitId());
|
||||||
|
@ -59,7 +59,7 @@ public:
|
|||||||
virtual const CMap * getMap() const = 0;
|
virtual const CMap * getMap() const = 0;
|
||||||
virtual const CGameInfoCallback * getCb() const = 0;
|
virtual const CGameInfoCallback * getCb() const = 0;
|
||||||
|
|
||||||
virtual bool moveHero(ObjectInstanceID hid, int3 dst, bool teleporting) = 0; //TODO: remove
|
virtual bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode mode) = 0; //TODO: remove
|
||||||
|
|
||||||
virtual void genericQuery(Query * request, PlayerColor color, std::function<void(std::optional<int32_t>)> callback) = 0;//TODO: type safety on query, use generic query packet when implemented
|
virtual void genericQuery(Query * request, PlayerColor color, std::function<void(std::optional<int32_t>)> callback) = 0;//TODO: type safety on query, use generic query packet when implemented
|
||||||
};
|
};
|
||||||
|
@ -1073,11 +1073,11 @@ bool CGameHandler::removeObject(const CGObjectInstance * obj, const PlayerColor
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, bool transit, PlayerColor asker)
|
bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, EMovementMode movementMode, bool transit, PlayerColor asker)
|
||||||
{
|
{
|
||||||
const CGHeroInstance *h = getHero(hid);
|
const CGHeroInstance *h = getHero(hid);
|
||||||
// not turn of that hero or player can't simply teleport hero (at least not with this function)
|
// not turn of that hero or player can't simply teleport hero (at least not with this function)
|
||||||
if(!h || (asker != PlayerColor::NEUTRAL && teleporting))
|
if(!h || (asker != PlayerColor::NEUTRAL && movementMode != EMovementMode::STANDARD))
|
||||||
{
|
{
|
||||||
if(h && getStartInfo()->turnTimerInfo.isEnabled() && gs->players[h->getOwner()].turnTimer.turnTimer == 0)
|
if(h && getStartInfo()->turnTimerInfo.isEnabled() && gs->players[h->getOwner()].turnTimer.turnTimer == 0)
|
||||||
return true; //timer expired, no error
|
return true; //timer expired, no error
|
||||||
@ -1164,13 +1164,13 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo
|
|||||||
if(h->boat && h->boat->layer == EPathfindingLayer::SAIL && t.terType->isLand() && t.blocked)
|
if(h->boat && h->boat->layer == EPathfindingLayer::SAIL && t.terType->isLand() && t.blocked)
|
||||||
return complainRet("Cannot disembark hero, tile is blocked!");
|
return complainRet("Cannot disembark hero, tile is blocked!");
|
||||||
|
|
||||||
if(distance(h->pos, dst) >= 1.5 && !teleporting)
|
if(distance(h->pos, dst) >= 1.5 && movementMode == EMovementMode::STANDARD)
|
||||||
return complainRet("Tiles are not neighboring!");
|
return complainRet("Tiles are not neighboring!");
|
||||||
|
|
||||||
if(h->inTownGarrison)
|
if(h->inTownGarrison)
|
||||||
return complainRet("Can not move garrisoned hero!");
|
return complainRet("Can not move garrisoned hero!");
|
||||||
|
|
||||||
if(h->movementPointsRemaining() < cost && dst != h->pos && !teleporting)
|
if(h->movementPointsRemaining() < cost && dst != h->pos && movementMode == EMovementMode::STANDARD)
|
||||||
return complainRet("Hero doesn't have any movement points left!");
|
return complainRet("Hero doesn't have any movement points left!");
|
||||||
|
|
||||||
if (transit && !canFly && !(canWalkOnSea && t.terType->isWater()) && !CGTeleport::isTeleport(objectToVisit))
|
if (transit && !canFly && !(canWalkOnSea && t.terType->isWater()) && !CGTeleport::isTeleport(objectToVisit))
|
||||||
@ -1259,12 +1259,12 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo
|
|||||||
return doMove(TryMoveHero::DISEMBARK, CHECK_FOR_GUARDS, VISIT_DEST, LEAVING_TILE);
|
return doMove(TryMoveHero::DISEMBARK, CHECK_FOR_GUARDS, VISIT_DEST, LEAVING_TILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (teleporting)
|
if (movementMode != EMovementMode::STANDARD)
|
||||||
{
|
{
|
||||||
if (blockingVisit()) // e.g. hero on the other side of teleporter
|
if (blockingVisit()) // e.g. hero on the other side of teleporter
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
EGuardLook guardsCheck = VLC->settings()->getBoolean(EGameSettings::DIMENSION_DOOR_TRIGGERS_GUARDS)
|
EGuardLook guardsCheck = (VLC->settings()->getBoolean(EGameSettings::DIMENSION_DOOR_TRIGGERS_GUARDS) && movementMode == EMovementMode::DIMENSION_DOOR)
|
||||||
? CHECK_FOR_GUARDS
|
? CHECK_FOR_GUARDS
|
||||||
: IGNORE_GUARDS;
|
: IGNORE_GUARDS;
|
||||||
|
|
||||||
@ -1337,7 +1337,7 @@ bool CGameHandler::teleportHero(ObjectInstanceID hid, ObjectInstanceID dstid, ui
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
int3 pos = h->convertFromVisitablePos(t->visitablePos());
|
int3 pos = h->convertFromVisitablePos(t->visitablePos());
|
||||||
moveHero(hid,pos,1);
|
moveHero(hid,pos,EMovementMode::CASTLE_GATE);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ public:
|
|||||||
void startBattlePrimary(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, const CGTownInstance *town = nullptr) override; //use hero=nullptr for no hero
|
void startBattlePrimary(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, const CGTownInstance *town = nullptr) override; //use hero=nullptr for no hero
|
||||||
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank = false) override; //if any of armies is hero, hero will be used
|
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank = false) override; //if any of armies is hero, hero will be used
|
||||||
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, bool creatureBank = false) override; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, bool creatureBank = false) override; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
||||||
bool moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL) override;
|
bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode movementMode, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL) override;
|
||||||
void giveHeroBonus(GiveBonus * bonus) override;
|
void giveHeroBonus(GiveBonus * bonus) override;
|
||||||
void setMovePoints(SetMovePoints * smp) override;
|
void setMovePoints(SetMovePoints * smp) override;
|
||||||
void setMovePoints(ObjectInstanceID hid, int val, bool absolute) override;
|
void setMovePoints(ObjectInstanceID hid, int val, bool absolute) override;
|
||||||
|
@ -65,7 +65,7 @@ void ApplyGhNetPackVisitor::visitMoveHero(MoveHero & pack)
|
|||||||
|
|
||||||
for (auto const & dest : pack.path)
|
for (auto const & dest : pack.path)
|
||||||
{
|
{
|
||||||
if (!gh.moveHero(pack.hid, dest, 0, pack.transit, pack.player))
|
if (!gh.moveHero(pack.hid, dest, EMovementMode::STANDARD, pack.transit, pack.player))
|
||||||
{
|
{
|
||||||
result = false;
|
result = false;
|
||||||
return;
|
return;
|
||||||
|
@ -89,9 +89,9 @@ const CMap * ServerSpellCastEnvironment::getMap() const
|
|||||||
return gh->gameState()->map;
|
return gh->gameState()->map;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ServerSpellCastEnvironment::moveHero(ObjectInstanceID hid, int3 dst, bool teleporting)
|
bool ServerSpellCastEnvironment::moveHero(ObjectInstanceID hid, int3 dst, EMovementMode mode)
|
||||||
{
|
{
|
||||||
return gh->moveHero(hid, dst, teleporting, false);
|
return gh->moveHero(hid, dst, mode, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSpellCastEnvironment::genericQuery(Query * request, PlayerColor color, std::function<void(std::optional<int32_t>)> callback)
|
void ServerSpellCastEnvironment::genericQuery(Query * request, PlayerColor color, std::function<void(std::optional<int32_t>)> callback)
|
||||||
|
@ -36,7 +36,7 @@ public:
|
|||||||
|
|
||||||
const CMap * getMap() const override;
|
const CMap * getMap() const override;
|
||||||
const CGameInfoCallback * getCb() const override;
|
const CGameInfoCallback * getCb() const override;
|
||||||
bool moveHero(ObjectInstanceID hid, int3 dst, bool teleporting) override;
|
bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode mode) override;
|
||||||
void genericQuery(Query * request, PlayerColor color, std::function<void(std::optional<int32_t>)> callback) override;
|
void genericQuery(Query * request, PlayerColor color, std::function<void(std::optional<int32_t>)> callback) override;
|
||||||
private:
|
private:
|
||||||
CGameHandler * gh;
|
CGameHandler * gh;
|
||||||
|
@ -121,7 +121,7 @@ public:
|
|||||||
return gameState.get();
|
return gameState.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool moveHero(ObjectInstanceID hid, int3 dst, bool teleporting) override
|
bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode movementMode) override
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ public:
|
|||||||
void startBattlePrimary(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, const CGTownInstance *town = nullptr) override {} //use hero=nullptr for no hero
|
void startBattlePrimary(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2, bool creatureBank = false, const CGTownInstance *town = nullptr) override {} //use hero=nullptr for no hero
|
||||||
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank = false) override {} //if any of armies is hero, hero will be used
|
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, int3 tile, bool creatureBank = false) override {} //if any of armies is hero, hero will be used
|
||||||
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, bool creatureBank = false) override {} //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
void startBattleI(const CArmedInstance *army1, const CArmedInstance *army2, bool creatureBank = false) override {} //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
|
||||||
bool moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL) override {return false;}
|
bool moveHero(ObjectInstanceID hid, int3 dst, EMovementMode movementMode, bool transit = false, PlayerColor asker = PlayerColor::NEUTRAL) override {return false;}
|
||||||
bool swapGarrisonOnSiege(ObjectInstanceID tid) override {return false;}
|
bool swapGarrisonOnSiege(ObjectInstanceID tid) override {return false;}
|
||||||
void giveHeroBonus(GiveBonus * bonus) override {}
|
void giveHeroBonus(GiveBonus * bonus) override {}
|
||||||
void setMovePoints(SetMovePoints * smp) override {}
|
void setMovePoints(SetMovePoints * smp) override {}
|
||||||
|
Loading…
Reference in New Issue
Block a user