mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Merge pull request #2384 from IvanSavenko/bugfixing_beta
Bugfixing iteration
This commit is contained in:
@@ -251,7 +251,7 @@ BattleAction CBattleAI::selectStackAction(const CStack * stack)
|
|||||||
|
|
||||||
void CBattleAI::yourTacticPhase(int distance)
|
void CBattleAI::yourTacticPhase(int distance)
|
||||||
{
|
{
|
||||||
cb->battleMakeUnitAction(BattleAction::makeEndOFTacticPhase(cb->battleGetTacticsSide()));
|
cb->battleMakeTacticAction(BattleAction::makeEndOFTacticPhase(cb->battleGetTacticsSide()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBattleAI::activeStack( const CStack * stack )
|
void CBattleAI::activeStack( const CStack * stack )
|
||||||
|
@@ -41,7 +41,7 @@ void CEmptyAI::activeStack(const CStack * stack)
|
|||||||
|
|
||||||
void CEmptyAI::yourTacticPhase(int distance)
|
void CEmptyAI::yourTacticPhase(int distance)
|
||||||
{
|
{
|
||||||
cb->battleMakeUnitAction(BattleAction::makeEndOFTacticPhase(cb->battleGetTacticsSide()));
|
cb->battleMakeTacticAction(BattleAction::makeEndOFTacticPhase(cb->battleGetTacticsSide()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, PrimarySkill::PrimarySkill pskill, std::vector<SecondarySkill> &skills, QueryID queryID)
|
void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, PrimarySkill::PrimarySkill pskill, std::vector<SecondarySkill> &skills, QueryID queryID)
|
||||||
|
@@ -90,7 +90,7 @@ static bool willSecondHexBlockMoreEnemyShooters(const BattleHex &h1, const Battl
|
|||||||
|
|
||||||
void CStupidAI::yourTacticPhase(int distance)
|
void CStupidAI::yourTacticPhase(int distance)
|
||||||
{
|
{
|
||||||
cb->battleMakeUnitAction(BattleAction::makeEndOFTacticPhase(cb->battleGetTacticsSide()));
|
cb->battleMakeTacticAction(BattleAction::makeEndOFTacticPhase(cb->battleGetTacticsSide()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CStupidAI::activeStack( const CStack * stack )
|
void CStupidAI::activeStack( const CStack * stack )
|
||||||
|
@@ -1907,8 +1907,9 @@ bool CPlayerInterface::capturedAllEvents()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool needToLockAdventureMap = adventureInt && adventureInt->isActive() && CGI->mh->hasOngoingAnimations();
|
bool needToLockAdventureMap = adventureInt && adventureInt->isActive() && CGI->mh->hasOngoingAnimations();
|
||||||
|
bool quickCombatOngoing = isAutoFightOn && !battleInt;
|
||||||
|
|
||||||
if (ignoreEvents || needToLockAdventureMap || isAutoFightOn)
|
if (ignoreEvents || needToLockAdventureMap || quickCombatOngoing )
|
||||||
{
|
{
|
||||||
GH.input().ignoreEventsUntilInput();
|
GH.input().ignoreEventsUntilInput();
|
||||||
return true;
|
return true;
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#include "../lib/gameState/CGameState.h"
|
#include "../lib/gameState/CGameState.h"
|
||||||
#include "../lib/CThreadHelper.h"
|
#include "../lib/CThreadHelper.h"
|
||||||
#include "../lib/VCMIDirs.h"
|
#include "../lib/VCMIDirs.h"
|
||||||
|
#include "../lib/UnlockGuard.h"
|
||||||
#include "../lib/battle/BattleInfo.h"
|
#include "../lib/battle/BattleInfo.h"
|
||||||
#include "../lib/serializer/BinaryDeserializer.h"
|
#include "../lib/serializer/BinaryDeserializer.h"
|
||||||
#include "../lib/mapping/CMapService.h"
|
#include "../lib/mapping/CMapService.h"
|
||||||
@@ -624,6 +625,14 @@ void CClient::battleStarted(const BattleInfo * info)
|
|||||||
CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def, spectratorInt);
|
CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def, spectratorInt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(info->tacticDistance)
|
||||||
|
{
|
||||||
|
auto tacticianColor = info->sides[info->tacticsSide].color;
|
||||||
|
|
||||||
|
if (vstd::contains(battleints, tacticianColor))
|
||||||
|
battleints[tacticianColor]->yourTacticPhase(info->tacticDistance);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CClient::battleFinished()
|
void CClient::battleFinished()
|
||||||
@@ -645,6 +654,9 @@ void CClient::startPlayerBattleAction(PlayerColor color)
|
|||||||
|
|
||||||
if(vstd::contains(battleints, color))
|
if(vstd::contains(battleints, color))
|
||||||
{
|
{
|
||||||
|
// we want to avoid locking gamestate and causing UI to freeze while AI is making turn
|
||||||
|
auto unlock = vstd::makeUnlockGuardIf(*CPlayerInterface::pim, !battleints[color]->human);
|
||||||
|
|
||||||
assert(vstd::contains(battleints, color));
|
assert(vstd::contains(battleints, color));
|
||||||
battleints[color]->activeStack(gs->curB->battleGetStackByID(gs->curB->activeStack, false));
|
battleints[color]->activeStack(gs->curB->battleGetStackByID(gs->curB->activeStack, false));
|
||||||
}
|
}
|
||||||
|
@@ -330,8 +330,6 @@ bool BattleSiegeController::isAttackableByCatapult(BattleHex hex) const
|
|||||||
|
|
||||||
void BattleSiegeController::stackIsCatapulting(const CatapultAttack & ca)
|
void BattleSiegeController::stackIsCatapulting(const CatapultAttack & ca)
|
||||||
{
|
{
|
||||||
owner.checkForAnimations();
|
|
||||||
|
|
||||||
if (ca.attacker != -1)
|
if (ca.attacker != -1)
|
||||||
{
|
{
|
||||||
const CStack *stack = owner.curInt->cb->battleGetStackByID(ca.attacker);
|
const CStack *stack = owner.curInt->cb->battleGetStackByID(ca.attacker);
|
||||||
|
@@ -154,11 +154,6 @@ void BattleStacksController::collectRenderableObjects(BattleRenderer & renderer)
|
|||||||
|
|
||||||
void BattleStacksController::stackReset(const CStack * stack)
|
void BattleStacksController::stackReset(const CStack * stack)
|
||||||
{
|
{
|
||||||
owner.checkForAnimations();
|
|
||||||
|
|
||||||
//reset orientation?
|
|
||||||
//stackFacingRight[stack->unitId()] = stack->unitSide() == BattleSide::ATTACKER;
|
|
||||||
|
|
||||||
auto iter = stackAnimation.find(stack->unitId());
|
auto iter = stackAnimation.find(stack->unitId());
|
||||||
|
|
||||||
if(iter == stackAnimation.end())
|
if(iter == stackAnimation.end())
|
||||||
@@ -240,6 +235,9 @@ void BattleStacksController::setActiveStack(const CStack *stack)
|
|||||||
stackAnimation[activeStack->unitId()]->setBorderColor(AnimationControls::getGoldBorder());
|
stackAnimation[activeStack->unitId()]->setBorderColor(AnimationControls::getGoldBorder());
|
||||||
|
|
||||||
owner.windowObject->blockUI(activeStack == nullptr);
|
owner.windowObject->blockUI(activeStack == nullptr);
|
||||||
|
|
||||||
|
if (activeStack)
|
||||||
|
stackAmountBoxHidden.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BattleStacksController::stackNeedsAmountBox(const CStack * stack) const
|
bool BattleStacksController::stackNeedsAmountBox(const CStack * stack) const
|
||||||
|
@@ -81,7 +81,10 @@ void InputSourceTouch::handleEventFingerMotion(const SDL_TouchFingerEvent & tfin
|
|||||||
{
|
{
|
||||||
Point distance = convertTouchToMouse(tfinger) - lastTapPosition;
|
Point distance = convertTouchToMouse(tfinger) - lastTapPosition;
|
||||||
if ( std::abs(distance.x) > params.panningSensitivityThreshold || std::abs(distance.y) > params.panningSensitivityThreshold)
|
if ( std::abs(distance.x) > params.panningSensitivityThreshold || std::abs(distance.y) > params.panningSensitivityThreshold)
|
||||||
|
{
|
||||||
state = TouchState::TAP_DOWN_PANNING;
|
state = TouchState::TAP_DOWN_PANNING;
|
||||||
|
GH.events().dispatchGesturePanningStarted(lastTapPosition);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TouchState::TAP_DOWN_PANNING:
|
case TouchState::TAP_DOWN_PANNING:
|
||||||
@@ -128,11 +131,16 @@ void InputSourceTouch::handleEventFingerDown(const SDL_TouchFingerEvent & tfinge
|
|||||||
{
|
{
|
||||||
lastTapPosition = convertTouchToMouse(tfinger);
|
lastTapPosition = convertTouchToMouse(tfinger);
|
||||||
GH.input().setCursorPosition(lastTapPosition);
|
GH.input().setCursorPosition(lastTapPosition);
|
||||||
GH.events().dispatchGesturePanningStarted(lastTapPosition);
|
|
||||||
state = TouchState::TAP_DOWN_SHORT;
|
state = TouchState::TAP_DOWN_SHORT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TouchState::TAP_DOWN_SHORT:
|
case TouchState::TAP_DOWN_SHORT:
|
||||||
|
{
|
||||||
|
GH.input().setCursorPosition(convertTouchToMouse(tfinger));
|
||||||
|
GH.events().dispatchGesturePanningStarted(lastTapPosition);
|
||||||
|
state = TouchState::TAP_DOWN_DOUBLE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case TouchState::TAP_DOWN_PANNING:
|
case TouchState::TAP_DOWN_PANNING:
|
||||||
{
|
{
|
||||||
GH.input().setCursorPosition(convertTouchToMouse(tfinger));
|
GH.input().setCursorPosition(convertTouchToMouse(tfinger));
|
||||||
|
@@ -90,6 +90,15 @@ CSelWindow::CSelWindow(const std::string &Text, PlayerColor player, int charperl
|
|||||||
//buttons.back()->addCallback(std::bind(&CCallback::selectionMade, LOCPLINT->cb.get(), 0, askID));
|
//buttons.back()->addCallback(std::bind(&CCallback::selectionMade, LOCPLINT->cb.get(), 0, askID));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(buttons.size() == 1)
|
||||||
|
buttons.front()->assignedKey = EShortcut::GLOBAL_RETURN;
|
||||||
|
|
||||||
|
if(buttons.size() == 2)
|
||||||
|
{
|
||||||
|
buttons.front()->assignedKey = EShortcut::GLOBAL_ACCEPT;
|
||||||
|
buttons.back()->assignedKey = EShortcut::GLOBAL_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
for(int i=0;i<comps.size();i++)
|
for(int i=0;i<comps.size();i++)
|
||||||
{
|
{
|
||||||
comps[i]->recActions = 255-DISPOSE;
|
comps[i]->recActions = 255-DISPOSE;
|
||||||
|
@@ -280,7 +280,7 @@ CModEntry CModList::getMod(QString modname) const
|
|||||||
|
|
||||||
if(conf.isNull())
|
if(conf.isNull())
|
||||||
{
|
{
|
||||||
settings["active"] = true; // default
|
settings["active"] = !local.value("keepDisabled").toBool();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -288,7 +288,7 @@ CModEntry CModList::getMod(QString modname) const
|
|||||||
{
|
{
|
||||||
settings = conf.toMap();
|
settings = conf.toMap();
|
||||||
if(settings.value("active").isNull())
|
if(settings.value("active").isNull())
|
||||||
settings["active"] = true; // default
|
settings["active"] = !local.value("keepDisabled").toBool();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
settings.insert("active", conf);
|
settings.insert("active", conf);
|
||||||
|
@@ -1390,18 +1390,7 @@ void HeroRecruited::applyGs(CGameState * gs) const
|
|||||||
|
|
||||||
h->setOwner(player);
|
h->setOwner(player);
|
||||||
h->pos = tile;
|
h->pos = tile;
|
||||||
bool fresh = !h->isInitialized();
|
h->initObj(gs->getRandomGenerator());
|
||||||
if(fresh)
|
|
||||||
{ // this is a fresh hero who hasn't appeared yet
|
|
||||||
if (boatId >= 0) //Hero spawns on water
|
|
||||||
{
|
|
||||||
h->setMovementPoints(h->movementPointsLimit(false));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
h->setMovementPoints(h->movementPointsLimit(true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(h->id == ObjectInstanceID())
|
if(h->id == ObjectInstanceID())
|
||||||
{
|
{
|
||||||
@@ -1414,16 +1403,10 @@ void HeroRecruited::applyGs(CGameState * gs) const
|
|||||||
gs->map->heroesOnMap.emplace_back(h);
|
gs->map->heroesOnMap.emplace_back(h);
|
||||||
p->heroes.emplace_back(h);
|
p->heroes.emplace_back(h);
|
||||||
h->attachTo(*p);
|
h->attachTo(*p);
|
||||||
if(fresh)
|
|
||||||
{
|
|
||||||
h->initObj(gs->getRandomGenerator());
|
|
||||||
}
|
|
||||||
gs->map->addBlockVisTiles(h);
|
gs->map->addBlockVisTiles(h);
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
{
|
|
||||||
t->setVisitingHero(h);
|
t->setVisitingHero(h);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GiveHero::applyGs(CGameState * gs) const
|
void GiveHero::applyGs(CGameState * gs) const
|
||||||
@@ -2208,19 +2191,25 @@ void BattleResultAccepted::applyGs(CGameState * gs) const
|
|||||||
res.hero->removeBonusesRecursive(Bonus::OneBattle);
|
res.hero->removeBonusesRecursive(Bonus::OneBattle);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grow up growing artifacts
|
if(winnerSide != 2)
|
||||||
if(const auto hero = heroResult[winnerSide].hero)
|
|
||||||
{
|
{
|
||||||
if(hero->commander && hero->commander->alive)
|
// Grow up growing artifacts
|
||||||
|
const auto hero = heroResult[winnerSide].hero;
|
||||||
|
|
||||||
|
if (hero)
|
||||||
{
|
{
|
||||||
for(auto & art : hero->commander->artifactsWorn)
|
if(hero->commander && hero->commander->alive)
|
||||||
|
{
|
||||||
|
for(auto & art : hero->commander->artifactsWorn)
|
||||||
|
art.second.artifact->growingUp();
|
||||||
|
}
|
||||||
|
for(auto & art : hero->artifactsWorn)
|
||||||
|
{
|
||||||
art.second.artifact->growingUp();
|
art.second.artifact->growingUp();
|
||||||
}
|
}
|
||||||
for(auto & art : hero->artifactsWorn)
|
|
||||||
{
|
|
||||||
art.second.artifact->growingUp();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(VLC->settings()->getBoolean(EGameSettings::MODULE_STACK_EXPERIENCE))
|
if(VLC->settings()->getBoolean(EGameSettings::MODULE_STACK_EXPERIENCE))
|
||||||
{
|
{
|
||||||
if(heroResult[0].army)
|
if(heroResult[0].army)
|
||||||
|
@@ -255,6 +255,7 @@ CGHeroInstance::CGHeroInstance():
|
|||||||
setNodeType(HERO);
|
setNodeType(HERO);
|
||||||
ID = Obj::HERO;
|
ID = Obj::HERO;
|
||||||
secSkills.emplace_back(SecondarySkill::DEFAULT, -1);
|
secSkills.emplace_back(SecondarySkill::DEFAULT, -1);
|
||||||
|
blockVisit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerColor CGHeroInstance::getOwner() const
|
PlayerColor CGHeroInstance::getOwner() const
|
||||||
@@ -364,8 +365,19 @@ void CGHeroInstance::initHero(CRandomGenerator & rand)
|
|||||||
commander->giveStackExp (exp); //after our exp is set
|
commander->giveStackExp (exp); //after our exp is set
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mana < 0)
|
skillsInfo.rand.setSeed(rand.nextInt());
|
||||||
mana = manaLimit();
|
skillsInfo.resetMagicSchoolCounter();
|
||||||
|
skillsInfo.resetWisdomCounter();
|
||||||
|
|
||||||
|
//copy active (probably growing) bonuses from hero prototype to hero object
|
||||||
|
for(const std::shared_ptr<Bonus> & b : type->specialty)
|
||||||
|
addNewBonus(b);
|
||||||
|
|
||||||
|
//initialize bonuses
|
||||||
|
recreateSecondarySkillsBonuses();
|
||||||
|
|
||||||
|
movement = movementPointsLimit(true);
|
||||||
|
mana = manaLimit(); //after all bonuses are taken into account, make sure this line is the last one
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGHeroInstance::initArmy(CRandomGenerator & rand, IArmyDescriptor * dst)
|
void CGHeroInstance::initArmy(CRandomGenerator & rand, IArmyDescriptor * dst)
|
||||||
@@ -533,15 +545,9 @@ void CGHeroInstance::SecondarySkillsInfo::resetWisdomCounter()
|
|||||||
|
|
||||||
void CGHeroInstance::initObj(CRandomGenerator & rand)
|
void CGHeroInstance::initObj(CRandomGenerator & rand)
|
||||||
{
|
{
|
||||||
blockVisit = true;
|
|
||||||
|
|
||||||
if(!type)
|
if(!type)
|
||||||
initHero(rand); //TODO: set up everything for prison before specialties are configured
|
initHero(rand); //TODO: set up everything for prison before specialties are configured
|
||||||
|
|
||||||
skillsInfo.rand.setSeed(rand.nextInt());
|
|
||||||
skillsInfo.resetMagicSchoolCounter();
|
|
||||||
skillsInfo.resetWisdomCounter();
|
|
||||||
|
|
||||||
if (ID != Obj::PRISON)
|
if (ID != Obj::PRISON)
|
||||||
{
|
{
|
||||||
auto terrain = cb->gameState()->getTile(visitablePos())->terType->getId();
|
auto terrain = cb->gameState()->getTile(visitablePos())->terType->getId();
|
||||||
@@ -549,15 +555,6 @@ void CGHeroInstance::initObj(CRandomGenerator & rand)
|
|||||||
if (customApp)
|
if (customApp)
|
||||||
appearance = customApp;
|
appearance = customApp;
|
||||||
}
|
}
|
||||||
|
|
||||||
//copy active (probably growing) bonuses from hero prototype to hero object
|
|
||||||
for(const std::shared_ptr<Bonus> & b : type->specialty)
|
|
||||||
addNewBonus(b);
|
|
||||||
|
|
||||||
//initialize bonuses
|
|
||||||
recreateSecondarySkillsBonuses();
|
|
||||||
|
|
||||||
mana = manaLimit(); //after all bonuses are taken into account, make sure this line is the last one
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGHeroInstance::recreateSecondarySkillsBonuses()
|
void CGHeroInstance::recreateSecondarySkillsBonuses()
|
||||||
|
Reference in New Issue
Block a user