mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-10 22:31:40 +02:00
Merge branch 'develop' into develop
This commit is contained in:
1
.github/workflows/github.yml
vendored
1
.github/workflows/github.yml
vendored
@@ -17,6 +17,7 @@ env:
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- platform: linux-qt6
|
||||
|
@@ -394,7 +394,7 @@ BattleAction BattleEvaluator::goTowardsNearest(const CStack * stack, std::vector
|
||||
{
|
||||
std::set<BattleHex> obstacleHexes;
|
||||
|
||||
auto insertAffected = [](const CObstacleInstance & spellObst, std::set<BattleHex> obstacleHexes) {
|
||||
auto insertAffected = [](const CObstacleInstance & spellObst, std::set<BattleHex> & obstacleHexes) {
|
||||
auto affectedHexes = spellObst.getAffectedTiles();
|
||||
obstacleHexes.insert(affectedHexes.cbegin(), affectedHexes.cend());
|
||||
};
|
||||
|
@@ -531,44 +531,44 @@ vstd::RNG * HypotheticBattle::HypotheticServerCallback::getRNG()
|
||||
return &rngStub;
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(CPackForClient * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(CPackForClient & pack)
|
||||
{
|
||||
logAi->error("Package of type %s is not allowed in battle evaluation", typeid(pack).name());
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleLogMessage * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleLogMessage & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleStackMoved * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleStackMoved & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleUnitsChanged * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleUnitsChanged & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(SetStackEffect * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(SetStackEffect & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(StacksInjured * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(StacksInjured & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleObstaclesChanged * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(BattleObstaclesChanged & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(CatapultAttack * pack)
|
||||
void HypotheticBattle::HypotheticServerCallback::apply(CatapultAttack & pack)
|
||||
{
|
||||
pack->applyBattle(owner);
|
||||
pack.applyBattle(owner);
|
||||
}
|
||||
|
||||
HypotheticBattle::HypotheticEnvironment::HypotheticEnvironment(HypotheticBattle * owner_, const Environment * upperEnvironment)
|
||||
|
@@ -189,15 +189,15 @@ private:
|
||||
|
||||
vstd::RNG * getRNG() override;
|
||||
|
||||
void apply(CPackForClient * pack) override;
|
||||
void apply(CPackForClient & pack) override;
|
||||
|
||||
void apply(BattleLogMessage * pack) override;
|
||||
void apply(BattleStackMoved * pack) override;
|
||||
void apply(BattleUnitsChanged * pack) override;
|
||||
void apply(SetStackEffect * pack) override;
|
||||
void apply(StacksInjured * pack) override;
|
||||
void apply(BattleObstaclesChanged * pack) override;
|
||||
void apply(CatapultAttack * pack) override;
|
||||
void apply(BattleLogMessage & pack) override;
|
||||
void apply(BattleStackMoved & pack) override;
|
||||
void apply(BattleUnitsChanged & pack) override;
|
||||
void apply(SetStackEffect & pack) override;
|
||||
void apply(StacksInjured & pack) override;
|
||||
void apply(BattleObstaclesChanged & pack) override;
|
||||
void apply(CatapultAttack & pack) override;
|
||||
private:
|
||||
HypotheticBattle * owner;
|
||||
RNGStub rngStub;
|
||||
|
@@ -864,7 +864,7 @@ void AIGateway::makeTurn()
|
||||
|
||||
void AIGateway::performObjectInteraction(const CGObjectInstance * obj, HeroPtr h)
|
||||
{
|
||||
LOG_TRACE_PARAMS(logAi, "Hero %s and object %s at %s", h->getNameTranslated() % obj->getObjectName() % obj->pos.toString());
|
||||
LOG_TRACE_PARAMS(logAi, "Hero %s and object %s at %s", h->getNameTranslated() % obj->getObjectName() % obj->anchorPos().toString());
|
||||
switch(obj->ID)
|
||||
{
|
||||
case Obj::TOWN:
|
||||
@@ -1454,8 +1454,8 @@ bool AIGateway::moveHeroToTile(int3 dst, HeroPtr h)
|
||||
|
||||
void AIGateway::buildStructure(const CGTownInstance * t, BuildingID building)
|
||||
{
|
||||
auto name = t->town->buildings.at(building)->getNameTranslated();
|
||||
logAi->debug("Player %d will build %s in town of %s at %s", ai->playerID, name, t->getNameTranslated(), t->pos.toString());
|
||||
auto name = t->getTown()->buildings.at(building)->getNameTranslated();
|
||||
logAi->debug("Player %d will build %s in town of %s at %s", ai->playerID, name, t->getNameTranslated(), t->anchorPos().toString());
|
||||
cb->buildBuilding(t, building); //just do this;
|
||||
}
|
||||
|
||||
|
@@ -144,7 +144,7 @@ std::vector<SlotInfo> ArmyManager::getBestArmy(const IBonusBearer * armyCarrier,
|
||||
|
||||
for(auto & slot : sortedSlots)
|
||||
{
|
||||
alignmentMap[slot.creature->getFaction()] += slot.power;
|
||||
alignmentMap[slot.creature->getFactionID()] += slot.power;
|
||||
}
|
||||
|
||||
std::set<FactionID> allowedFactions;
|
||||
@@ -178,7 +178,7 @@ std::vector<SlotInfo> ArmyManager::getBestArmy(const IBonusBearer * armyCarrier,
|
||||
|
||||
for(auto & slot : sortedSlots)
|
||||
{
|
||||
if(vstd::contains(allowedFactions, slot.creature->getFaction()))
|
||||
if(vstd::contains(allowedFactions, slot.creature->getFactionID()))
|
||||
{
|
||||
auto slotID = newArmyInstance.getSlotFor(slot.creature->getId());
|
||||
|
||||
|
@@ -17,7 +17,7 @@ namespace NKAI
|
||||
|
||||
void BuildAnalyzer::updateTownDwellings(TownDevelopmentInfo & developmentInfo)
|
||||
{
|
||||
auto townInfo = developmentInfo.town->town;
|
||||
auto townInfo = developmentInfo.town->getTown();
|
||||
auto creatures = townInfo->creatures;
|
||||
auto buildings = townInfo->getAllBuildings();
|
||||
|
||||
@@ -31,7 +31,7 @@ void BuildAnalyzer::updateTownDwellings(TownDevelopmentInfo & developmentInfo)
|
||||
}
|
||||
}
|
||||
|
||||
for(int level = 0; level < developmentInfo.town->town->creatures.size(); level++)
|
||||
for(int level = 0; level < developmentInfo.town->getTown()->creatures.size(); level++)
|
||||
{
|
||||
logAi->trace("Checking dwelling level %d", level);
|
||||
BuildingInfo nextToBuild = BuildingInfo();
|
||||
@@ -82,7 +82,7 @@ void BuildAnalyzer::updateOtherBuildings(TownDevelopmentInfo & developmentInfo)
|
||||
{
|
||||
for(auto & buildingID : buildingSet)
|
||||
{
|
||||
if(!developmentInfo.town->hasBuilt(buildingID) && developmentInfo.town->town->buildings.count(buildingID))
|
||||
if(!developmentInfo.town->hasBuilt(buildingID) && developmentInfo.town->getTown()->buildings.count(buildingID))
|
||||
{
|
||||
developmentInfo.addBuildingToBuild(getBuildingOrPrerequisite(developmentInfo.town, buildingID));
|
||||
|
||||
@@ -198,7 +198,7 @@ BuildingInfo BuildAnalyzer::getBuildingOrPrerequisite(
|
||||
bool excludeDwellingDependencies) const
|
||||
{
|
||||
BuildingID building = toBuild;
|
||||
auto townInfo = town->town;
|
||||
auto townInfo = town->getTown();
|
||||
|
||||
const CBuilding * buildPtr = townInfo->buildings.at(building);
|
||||
const CCreature * creature = nullptr;
|
||||
@@ -327,7 +327,7 @@ bool BuildAnalyzer::hasAnyBuilding(int32_t alignment, BuildingID bid) const
|
||||
{
|
||||
for(auto tdi : developmentInfos)
|
||||
{
|
||||
if(tdi.town->getFaction() == alignment && tdi.town->hasBuilt(bid))
|
||||
if(tdi.town->getFactionID() == alignment && tdi.town->hasBuilt(bid))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -71,7 +71,7 @@ float HeroManager::evaluateSecSkill(SecondarySkill skill, const CGHeroInstance *
|
||||
|
||||
float HeroManager::evaluateSpeciality(const CGHeroInstance * hero) const
|
||||
{
|
||||
auto heroSpecial = Selector::source(BonusSource::HERO_SPECIAL, BonusSourceID(hero->type->getId()));
|
||||
auto heroSpecial = Selector::source(BonusSource::HERO_SPECIAL, BonusSourceID(hero->getHeroTypeID()));
|
||||
auto secondarySkillBonus = Selector::targetSourceType()(BonusSource::SECONDARY_SKILL);
|
||||
auto specialSecondarySkillBonuses = hero->getBonuses(heroSpecial.And(secondarySkillBonus));
|
||||
auto secondarySkillBonuses = hero->getBonuses(Selector::sourceTypeSel(BonusSource::SECONDARY_SKILL));
|
||||
|
@@ -1120,7 +1120,7 @@ public:
|
||||
|
||||
uint64_t RewardEvaluator::getUpgradeArmyReward(const CGTownInstance * town, const BuildingInfo & bi) const
|
||||
{
|
||||
if(ai->buildAnalyzer->hasAnyBuilding(town->getFaction(), bi.id))
|
||||
if(ai->buildAnalyzer->hasAnyBuilding(town->getFactionID(), bi.id))
|
||||
return 0;
|
||||
|
||||
auto creaturesToUpgrade = ai->armyManager->getTotalCreaturesAvailable(bi.baseCreatureID);
|
||||
|
@@ -23,7 +23,7 @@ BuildThis::BuildThis(BuildingID Bid, const CGTownInstance * tid)
|
||||
: ElementarGoal(Goals::BUILD_STRUCTURE)
|
||||
{
|
||||
buildingInfo = BuildingInfo(
|
||||
tid->town->buildings.at(Bid),
|
||||
tid->getTown()->buildings.at(Bid),
|
||||
nullptr,
|
||||
CreatureID::NONE,
|
||||
tid,
|
||||
@@ -52,7 +52,7 @@ void BuildThis::accept(AIGateway * ai)
|
||||
if(cb->canBuildStructure(town, b) == EBuildingState::ALLOWED)
|
||||
{
|
||||
logAi->debug("Player %d will build %s in town of %s at %s",
|
||||
ai->playerID, town->town->buildings.at(b)->getNameTranslated(), town->getNameTranslated(), town->pos.toString());
|
||||
ai->playerID, town->getTown()->buildings.at(b)->getNameTranslated(), town->getNameTranslated(), town->anchorPos().toString());
|
||||
cb->buildBuilding(town, b);
|
||||
|
||||
return;
|
||||
|
@@ -23,13 +23,13 @@ bool BuildingManager::tryBuildThisStructure(const CGTownInstance * t, BuildingID
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!vstd::contains(t->town->buildings, building))
|
||||
if (!vstd::contains(t->getTown()->buildings, building))
|
||||
return false; // no such building in town
|
||||
|
||||
if (t->hasBuilt(building)) //Already built? Shouldn't happen in general
|
||||
return true;
|
||||
|
||||
const CBuilding * buildPtr = t->town->buildings.at(building);
|
||||
const CBuilding * buildPtr = t->getTown()->buildings.at(building);
|
||||
|
||||
auto toBuild = buildPtr->requirements.getFulfillmentCandidates([&](const BuildingID & buildID)
|
||||
{
|
||||
@@ -51,7 +51,7 @@ bool BuildingManager::tryBuildThisStructure(const CGTownInstance * t, BuildingID
|
||||
|
||||
for (const auto & buildID : toBuild)
|
||||
{
|
||||
const CBuilding * b = t->town->buildings.at(buildID);
|
||||
const CBuilding * b = t->getTown()->buildings.at(buildID);
|
||||
|
||||
EBuildingState canBuild = cb->canBuildStructure(t, buildID);
|
||||
if (canBuild == EBuildingState::ALLOWED)
|
||||
@@ -220,7 +220,7 @@ bool BuildingManager::getBuildingOptions(const CGTownInstance * t)
|
||||
|
||||
//at the end, try to get and build any extra buildings with nonstandard slots (for example HotA 3rd level dwelling)
|
||||
std::vector<BuildingID> extraBuildings;
|
||||
for (auto buildingInfo : t->town->buildings)
|
||||
for (auto buildingInfo : t->getTown()->buildings)
|
||||
{
|
||||
if (buildingInfo.first > BuildingID::DWELL_UP2_FIRST)
|
||||
extraBuildings.push_back(buildingInfo.first);
|
||||
|
@@ -56,7 +56,7 @@ TSubgoal BuildThis::whatToDoToAchieve()
|
||||
case EBuildingState::ALLOWED:
|
||||
case EBuildingState::NO_RESOURCES:
|
||||
{
|
||||
auto res = town->town->buildings.at(BuildingID(bid))->resources;
|
||||
auto res = town->getTown()->buildings.at(BuildingID(bid))->resources;
|
||||
return ai->ah->whatToDo(res, iAmElementar()); //realize immediately or gather resources
|
||||
}
|
||||
break;
|
||||
|
@@ -46,7 +46,7 @@ TSubgoal FindObj::whatToDoToAchieve()
|
||||
}
|
||||
}
|
||||
}
|
||||
if(o && ai->isAccessible(o->pos)) //we don't use isAccessibleForHero as we don't know which hero it is
|
||||
if(o && ai->isAccessible(o->visitablePos())) //we don't use isAccessibleForHero as we don't know which hero it is
|
||||
return sptr(VisitObj(o->id.getNum()));
|
||||
else
|
||||
return sptr(Explore());
|
||||
|
@@ -88,13 +88,13 @@ TGoalVec GatherTroops::getAllPossibleSubgoals()
|
||||
}
|
||||
|
||||
auto creature = VLC->creatures()->getByIndex(objid);
|
||||
if(t->getFaction() == creature->getFaction()) //TODO: how to force AI to build unupgraded creatures? :O
|
||||
if(t->getFactionID() == creature->getFactionID()) //TODO: how to force AI to build unupgraded creatures? :O
|
||||
{
|
||||
auto tryFindCreature = [&]() -> std::optional<std::vector<CreatureID>>
|
||||
{
|
||||
if(vstd::isValidIndex(t->town->creatures, creature->getLevel() - 1))
|
||||
if(vstd::isValidIndex(t->getTown()->creatures, creature->getLevel() - 1))
|
||||
{
|
||||
auto itr = t->town->creatures.begin();
|
||||
auto itr = t->getTown()->creatures.begin();
|
||||
std::advance(itr, creature->getLevel() - 1);
|
||||
return make_optional(*itr);
|
||||
}
|
||||
@@ -109,7 +109,7 @@ TGoalVec GatherTroops::getAllPossibleSubgoals()
|
||||
if(upgradeNumber < 0)
|
||||
continue;
|
||||
|
||||
BuildingID bid(BuildingID::DWELL_FIRST + creature->getLevel() - 1 + upgradeNumber * t->town->creatures.size());
|
||||
BuildingID bid(BuildingID::DWELL_FIRST + creature->getLevel() - 1 + upgradeNumber * t->getTown()->creatures.size());
|
||||
if(t->hasBuilt(bid) && ai->ah->freeResources().canAfford(creature->getFullRecruitCost())) //this assumes only creatures with dwellings are assigned to faction
|
||||
{
|
||||
solutions.push_back(sptr(BuyArmy(t, creature->getAIValue() * this->value).setobjid(objid)));
|
||||
|
@@ -69,7 +69,7 @@ std::optional<int> MapObjectsEvaluator::getObjectValue(const CGObjectInstance *
|
||||
{
|
||||
//special case handling: in-game heroes have hero ID as object subID, but when reading configs available hero object subID's are hero classes
|
||||
auto hero = dynamic_cast<const CGHeroInstance*>(obj);
|
||||
return getObjectValue(obj->ID, hero->type->heroClass->getIndex());
|
||||
return getObjectValue(obj->ID, hero->getHeroClassID());
|
||||
}
|
||||
else if(obj->ID == Obj::PRISON)
|
||||
{
|
||||
|
@@ -1032,7 +1032,7 @@ void VCAI::mainLoop()
|
||||
|
||||
void VCAI::performObjectInteraction(const CGObjectInstance * obj, HeroPtr h)
|
||||
{
|
||||
LOG_TRACE_PARAMS(logAi, "Hero %s and object %s at %s", h->getNameTranslated() % obj->getObjectName() % obj->pos.toString());
|
||||
LOG_TRACE_PARAMS(logAi, "Hero %s and object %s at %s", h->getNameTranslated() % obj->getObjectName() % obj->anchorPos().toString());
|
||||
switch(obj->ID)
|
||||
{
|
||||
case Obj::TOWN:
|
||||
@@ -1417,11 +1417,11 @@ void VCAI::wander(HeroPtr h)
|
||||
//TODO pick the truly best
|
||||
const CGTownInstance * t = *boost::max_element(townsNotReachable, compareReinforcements);
|
||||
logAi->debug("%s can't reach any town, we'll try to make our way to %s at %s", h->getNameTranslated(), t->getNameTranslated(), t->visitablePos().toString());
|
||||
int3 pos1 = h->pos;
|
||||
int3 posBefore = h->visitablePos();
|
||||
striveToGoal(sptr(Goals::ClearWayTo(t->visitablePos()).sethero(h))); //TODO: drop "strive", add to mainLoop
|
||||
//if out hero is stuck, we may need to request another hero to clear the way we see
|
||||
|
||||
if(pos1 == h->pos && h == primaryHero()) //hero can't move
|
||||
if(posBefore == h->visitablePos() && h == primaryHero()) //hero can't move
|
||||
{
|
||||
if(canRecruitAnyHero(t))
|
||||
recruitHero(t);
|
||||
@@ -1471,7 +1471,7 @@ void VCAI::wander(HeroPtr h)
|
||||
{
|
||||
auto chosenObject = cb->getObjInstance(ObjectInstanceID(bestObjectGoal->objid));
|
||||
if(chosenObject != nullptr)
|
||||
logAi->debug("Of all %d destinations, object %s at pos=%s seems nice", dests.size(), chosenObject->getObjectName(), chosenObject->pos.toString());
|
||||
logAi->debug("Of all %d destinations, object %s at pos=%s seems nice", dests.size(), chosenObject->getObjectName(), chosenObject->anchorPos().toString());
|
||||
}
|
||||
else
|
||||
logAi->debug("Trying to realize goal of type %s as part of wandering.", bestObjectGoal->name());
|
||||
@@ -1994,8 +1994,8 @@ bool VCAI::moveHeroToTile(int3 dst, HeroPtr h)
|
||||
|
||||
void VCAI::buildStructure(const CGTownInstance * t, BuildingID building)
|
||||
{
|
||||
auto name = t->town->buildings.at(building)->getNameTranslated();
|
||||
logAi->debug("Player %d will build %s in town of %s at %s", ai->playerID, name, t->getNameTranslated(), t->pos.toString());
|
||||
auto name = t->getTown()->buildings.at(building)->getNameTranslated();
|
||||
logAi->debug("Player %d will build %s in town of %s at %s", ai->playerID, name, t->getNameTranslated(), t->anchorPos().toString());
|
||||
cb->buildBuilding(t, building); //just do this;
|
||||
}
|
||||
|
||||
@@ -2081,7 +2081,7 @@ void VCAI::tryRealize(Goals::BuildThis & g)
|
||||
if (cb->canBuildStructure(t, b) == EBuildingState::ALLOWED)
|
||||
{
|
||||
logAi->debug("Player %d will build %s in town of %s at %s",
|
||||
playerID, t->town->buildings.at(b)->getNameTranslated(), t->getNameTranslated(), t->pos.toString());
|
||||
playerID, t->getTown()->buildings.at(b)->getNameTranslated(), t->getNameTranslated(), t->anchorPos().toString());
|
||||
cb->buildBuilding(t, b);
|
||||
throw goalFulfilledException(sptr(g));
|
||||
}
|
||||
|
112
CCallback.cpp
112
CCallback.cpp
@@ -25,24 +25,25 @@
|
||||
#include "lib/UnlockGuard.h"
|
||||
#include "lib/battle/BattleInfo.h"
|
||||
#include "lib/networkPacks/PacksForServer.h"
|
||||
#include "lib/networkPacks/SaveLocalState.h"
|
||||
|
||||
bool CCallback::teleportHero(const CGHeroInstance *who, const CGTownInstance *where)
|
||||
{
|
||||
CastleTeleportHero pack(who->id, where->id, 1);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCallback::moveHero(const CGHeroInstance *h, const int3 & destination, bool transit)
|
||||
{
|
||||
MoveHero pack({destination}, h->id, transit);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::moveHero(const CGHeroInstance *h, const std::vector<int3> & path, bool transit)
|
||||
{
|
||||
MoveHero pack(path, h->id, transit);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
int CCallback::selectionMade(int selection, QueryID queryID)
|
||||
@@ -61,7 +62,7 @@ int CCallback::sendQueryReply(std::optional<int32_t> reply, QueryID queryID)
|
||||
|
||||
QueryReply pack(queryID, reply);
|
||||
pack.player = *player;
|
||||
return sendRequest(&pack);
|
||||
return sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::recruitCreatures(const CGDwelling * obj, const CArmedInstance * dst, CreatureID ID, ui32 amount, si32 level)
|
||||
@@ -71,7 +72,7 @@ void CCallback::recruitCreatures(const CGDwelling * obj, const CArmedInstance *
|
||||
return;
|
||||
|
||||
RecruitCreatures pack(obj->id, dst->id, ID, amount, level);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
bool CCallback::dismissCreature(const CArmedInstance *obj, SlotID stackPos)
|
||||
@@ -80,14 +81,14 @@ bool CCallback::dismissCreature(const CArmedInstance *obj, SlotID stackPos)
|
||||
return false;
|
||||
|
||||
DisbandCreature pack(stackPos,obj->id);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCallback::upgradeCreature(const CArmedInstance *obj, SlotID stackPos, CreatureID newID)
|
||||
{
|
||||
UpgradeCreature pack(stackPos,obj->id,newID);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -95,54 +96,54 @@ void CCallback::endTurn()
|
||||
{
|
||||
logGlobal->trace("Player %d ended his turn.", player->getNum());
|
||||
EndTurn pack;
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
int CCallback::swapCreatures(const CArmedInstance *s1, const CArmedInstance *s2, SlotID p1, SlotID p2)
|
||||
{
|
||||
ArrangeStacks pack(1,p1,p2,s1->id,s2->id,0);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CCallback::mergeStacks(const CArmedInstance *s1, const CArmedInstance *s2, SlotID p1, SlotID p2)
|
||||
{
|
||||
ArrangeStacks pack(2,p1,p2,s1->id,s2->id,0);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CCallback::splitStack(const CArmedInstance *s1, const CArmedInstance *s2, SlotID p1, SlotID p2, int val)
|
||||
{
|
||||
ArrangeStacks pack(3,p1,p2,s1->id,s2->id,val);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CCallback::bulkMoveArmy(ObjectInstanceID srcArmy, ObjectInstanceID destArmy, SlotID srcSlot)
|
||||
{
|
||||
BulkMoveArmy pack(srcArmy, destArmy, srcSlot);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CCallback::bulkSplitStack(ObjectInstanceID armyId, SlotID srcSlot, int howMany)
|
||||
{
|
||||
BulkSplitStack pack(armyId, srcSlot, howMany);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CCallback::bulkSmartSplitStack(ObjectInstanceID armyId, SlotID srcSlot)
|
||||
{
|
||||
BulkSmartSplitStack pack(armyId, srcSlot);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CCallback::bulkMergeStacks(ObjectInstanceID armyId, SlotID srcSlot)
|
||||
{
|
||||
BulkMergeStacks pack(armyId, srcSlot);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -151,7 +152,7 @@ bool CCallback::dismissHero(const CGHeroInstance *hero)
|
||||
if(player!=hero->tempOwner) return false;
|
||||
|
||||
DismissHero pack(hero->id);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -160,7 +161,7 @@ bool CCallback::swapArtifacts(const ArtifactLocation &l1, const ArtifactLocation
|
||||
ExchangeArtifacts ea;
|
||||
ea.src = l1;
|
||||
ea.dst = l2;
|
||||
sendRequest(&ea);
|
||||
sendRequest(ea);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -175,13 +176,13 @@ bool CCallback::swapArtifacts(const ArtifactLocation &l1, const ArtifactLocation
|
||||
void CCallback::assembleArtifacts(const ObjectInstanceID & heroID, ArtifactPosition artifactSlot, bool assemble, ArtifactID assembleTo)
|
||||
{
|
||||
AssembleArtifacts aa(heroID, artifactSlot, assemble, assembleTo);
|
||||
sendRequest(&aa);
|
||||
sendRequest(aa);
|
||||
}
|
||||
|
||||
void CCallback::bulkMoveArtifacts(ObjectInstanceID srcHero, ObjectInstanceID dstHero, bool swap, bool equipped, bool backpack)
|
||||
{
|
||||
BulkExchangeArtifacts bma(srcHero, dstHero, swap, equipped, backpack);
|
||||
sendRequest(&bma);
|
||||
sendRequest(bma);
|
||||
}
|
||||
|
||||
void CCallback::scrollBackpackArtifacts(ObjectInstanceID hero, bool left)
|
||||
@@ -189,19 +190,37 @@ void CCallback::scrollBackpackArtifacts(ObjectInstanceID hero, bool left)
|
||||
ManageBackpackArtifacts mba(hero, ManageBackpackArtifacts::ManageCmd::SCROLL_RIGHT);
|
||||
if(left)
|
||||
mba.cmd = ManageBackpackArtifacts::ManageCmd::SCROLL_LEFT;
|
||||
sendRequest(&mba);
|
||||
sendRequest(mba);
|
||||
}
|
||||
|
||||
void CCallback::sortBackpackArtifactsBySlot(const ObjectInstanceID hero)
|
||||
{
|
||||
ManageBackpackArtifacts mba(hero, ManageBackpackArtifacts::ManageCmd::SORT_BY_SLOT);
|
||||
sendRequest(mba);
|
||||
}
|
||||
|
||||
void CCallback::sortBackpackArtifactsByCost(const ObjectInstanceID hero)
|
||||
{
|
||||
ManageBackpackArtifacts mba(hero, ManageBackpackArtifacts::ManageCmd::SORT_BY_COST);
|
||||
sendRequest(mba);
|
||||
}
|
||||
|
||||
void CCallback::sortBackpackArtifactsByClass(const ObjectInstanceID hero)
|
||||
{
|
||||
ManageBackpackArtifacts mba(hero, ManageBackpackArtifacts::ManageCmd::SORT_BY_CLASS);
|
||||
sendRequest(mba);
|
||||
}
|
||||
|
||||
void CCallback::manageHeroCostume(ObjectInstanceID hero, size_t costumeIndex, bool saveCostume)
|
||||
{
|
||||
ManageEquippedArtifacts mea(hero, costumeIndex, saveCostume);
|
||||
sendRequest(&mea);
|
||||
sendRequest(mea);
|
||||
}
|
||||
|
||||
void CCallback::eraseArtifactByClient(const ArtifactLocation & al)
|
||||
{
|
||||
EraseArtifactByClient ea(al);
|
||||
sendRequest(&ea);
|
||||
sendRequest(ea);
|
||||
}
|
||||
|
||||
bool CCallback::buildBuilding(const CGTownInstance *town, BuildingID buildingID)
|
||||
@@ -213,7 +232,7 @@ bool CCallback::buildBuilding(const CGTownInstance *town, BuildingID buildingID)
|
||||
return false;
|
||||
|
||||
BuildStructure pack(town->id,buildingID);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -223,7 +242,7 @@ bool CCallback::visitTownBuilding(const CGTownInstance *town, BuildingID buildin
|
||||
return false;
|
||||
|
||||
VisitTownBuilding pack(town->id, buildingID);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -232,10 +251,10 @@ void CBattleCallback::battleMakeSpellAction(const BattleID & battleID, const Bat
|
||||
assert(action.actionType == EActionType::HERO_SPELL);
|
||||
MakeAction mca(action);
|
||||
mca.battleID = battleID;
|
||||
sendRequest(&mca);
|
||||
sendRequest(mca);
|
||||
}
|
||||
|
||||
int CBattleCallback::sendRequest(const CPackForServer * request)
|
||||
int CBattleCallback::sendRequest(const CPackForServer & request)
|
||||
{
|
||||
int requestID = cl->sendRequest(request, *getPlayerID());
|
||||
if(waitTillRealize)
|
||||
@@ -249,12 +268,18 @@ int CBattleCallback::sendRequest(const CPackForServer * request)
|
||||
return requestID;
|
||||
}
|
||||
|
||||
void CCallback::spellResearch( const CGTownInstance *town, SpellID spellAtSlot, bool accepted )
|
||||
{
|
||||
SpellResearch pack(town->id, spellAtSlot, accepted);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::swapGarrisonHero( const CGTownInstance *town )
|
||||
{
|
||||
if(town->tempOwner == *player || (town->garrisonHero && town->garrisonHero->tempOwner == *player ))
|
||||
{
|
||||
GarrisonHeroSwap pack(town->id);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,7 +288,7 @@ void CCallback::buyArtifact(const CGHeroInstance *hero, ArtifactID aid)
|
||||
if(hero->tempOwner != *player) return;
|
||||
|
||||
BuyArtifact pack(hero->id,aid);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero)
|
||||
@@ -280,13 +305,13 @@ void CCallback::trade(const ObjectInstanceID marketId, EMarketMode mode, const s
|
||||
pack.r1 = id1;
|
||||
pack.r2 = id2;
|
||||
pack.val = val1;
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::setFormation(const CGHeroInstance * hero, EArmyFormation mode)
|
||||
{
|
||||
SetFormation pack(hero->id, mode);
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::recruitHero(const CGObjectInstance *townOrTavern, const CGHeroInstance *hero, const HeroTypeID & nextHero)
|
||||
@@ -294,9 +319,18 @@ void CCallback::recruitHero(const CGObjectInstance *townOrTavern, const CGHeroIn
|
||||
assert(townOrTavern);
|
||||
assert(hero);
|
||||
|
||||
HireHero pack(hero->getHeroType(), townOrTavern->id, nextHero);
|
||||
HireHero pack(hero->getHeroTypeID(), townOrTavern->id, nextHero);
|
||||
pack.player = *player;
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
|
||||
void CCallback::saveLocalState(const JsonNode & data)
|
||||
{
|
||||
SaveLocalState state;
|
||||
state.data = data;
|
||||
state.player = *player;
|
||||
|
||||
sendRequest(state);
|
||||
}
|
||||
|
||||
void CCallback::save( const std::string &fname )
|
||||
@@ -310,7 +344,7 @@ void CCallback::gamePause(bool pause)
|
||||
{
|
||||
GamePause pack;
|
||||
pack.player = *player;
|
||||
sendRequest(&pack);
|
||||
sendRequest(pack);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -324,14 +358,14 @@ void CCallback::sendMessage(const std::string &mess, const CGObjectInstance * cu
|
||||
PlayerMessage pm(mess, currentObject? currentObject->id : ObjectInstanceID(-1));
|
||||
if(player)
|
||||
pm.player = *player;
|
||||
sendRequest(&pm);
|
||||
sendRequest(pm);
|
||||
}
|
||||
|
||||
void CCallback::buildBoat( const IShipyard *obj )
|
||||
{
|
||||
BuildBoat bb;
|
||||
bb.objid = dynamic_cast<const CGObjectInstance*>(obj)->id;
|
||||
sendRequest(&bb);
|
||||
sendRequest(bb);
|
||||
}
|
||||
|
||||
CCallback::CCallback(CGameState * GS, std::optional<PlayerColor> Player, CClient * C)
|
||||
@@ -373,7 +407,7 @@ void CCallback::dig( const CGObjectInstance *hero )
|
||||
{
|
||||
DigWithHero dwh;
|
||||
dwh.id = hero->id;
|
||||
sendRequest(&dwh);
|
||||
sendRequest(dwh);
|
||||
}
|
||||
|
||||
void CCallback::castSpell(const CGHeroInstance *hero, SpellID spellID, const int3 &pos)
|
||||
@@ -382,7 +416,7 @@ void CCallback::castSpell(const CGHeroInstance *hero, SpellID spellID, const int
|
||||
cas.hid = hero->id;
|
||||
cas.sid = spellID;
|
||||
cas.pos = pos;
|
||||
sendRequest(&cas);
|
||||
sendRequest(cas);
|
||||
}
|
||||
|
||||
int CCallback::mergeOrSwapStacks(const CArmedInstance *s1, const CArmedInstance *s2, SlotID p1, SlotID p2)
|
||||
@@ -415,7 +449,7 @@ void CBattleCallback::battleMakeUnitAction(const BattleID & battleID, const Batt
|
||||
MakeAction ma;
|
||||
ma.ba = action;
|
||||
ma.battleID = battleID;
|
||||
sendRequest(&ma);
|
||||
sendRequest(ma);
|
||||
}
|
||||
|
||||
void CBattleCallback::battleMakeTacticAction(const BattleID & battleID, const BattleAction & action )
|
||||
@@ -424,7 +458,7 @@ void CBattleCallback::battleMakeTacticAction(const BattleID & battleID, const Ba
|
||||
MakeAction ma;
|
||||
ma.ba = action;
|
||||
ma.battleID = battleID;
|
||||
sendRequest(&ma);
|
||||
sendRequest(ma);
|
||||
}
|
||||
|
||||
std::optional<BattleAction> CBattleCallback::makeSurrenderRetreatDecision(const BattleID & battleID, const BattleStateInfoForRetreat & battleState)
|
||||
|
12
CCallback.h
12
CCallback.h
@@ -78,6 +78,7 @@ public:
|
||||
virtual bool visitTownBuilding(const CGTownInstance *town, BuildingID buildingID)=0;
|
||||
virtual void recruitCreatures(const CGDwelling *obj, const CArmedInstance * dst, CreatureID ID, ui32 amount, si32 level=-1)=0;
|
||||
virtual bool upgradeCreature(const CArmedInstance *obj, SlotID stackPos, CreatureID newID=CreatureID::NONE)=0; //if newID==-1 then best possible upgrade will be made
|
||||
virtual void spellResearch(const CGTownInstance *town, SpellID spellAtSlot, bool accepted)=0;
|
||||
virtual void swapGarrisonHero(const CGTownInstance *town)=0;
|
||||
|
||||
virtual void trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce
|
||||
@@ -92,10 +93,14 @@ public:
|
||||
//virtual bool swapArtifacts(const CGHeroInstance * hero1, ui16 pos1, const CGHeroInstance * hero2, ui16 pos2)=0; //swaps artifacts between two given heroes
|
||||
virtual bool swapArtifacts(const ArtifactLocation &l1, const ArtifactLocation &l2)=0;
|
||||
virtual void scrollBackpackArtifacts(ObjectInstanceID hero, bool left) = 0;
|
||||
virtual void sortBackpackArtifactsBySlot(const ObjectInstanceID hero) = 0;
|
||||
virtual void sortBackpackArtifactsByCost(const ObjectInstanceID hero) = 0;
|
||||
virtual void sortBackpackArtifactsByClass(const ObjectInstanceID hero) = 0;
|
||||
virtual void manageHeroCostume(ObjectInstanceID hero, size_t costumeIndex, bool saveCostume) = 0;
|
||||
virtual void assembleArtifacts(const ObjectInstanceID & heroID, ArtifactPosition artifactSlot, bool assemble, ArtifactID assembleTo)=0;
|
||||
virtual void eraseArtifactByClient(const ArtifactLocation & al)=0;
|
||||
virtual bool dismissCreature(const CArmedInstance *obj, SlotID stackPos)=0;
|
||||
virtual void saveLocalState(const JsonNode & data)=0;
|
||||
virtual void endTurn()=0;
|
||||
virtual void buyArtifact(const CGHeroInstance *hero, ArtifactID aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith)
|
||||
virtual void setFormation(const CGHeroInstance * hero, EArmyFormation mode)=0;
|
||||
@@ -123,7 +128,7 @@ class CBattleCallback : public IBattleCallback
|
||||
std::optional<PlayerColor> player;
|
||||
|
||||
protected:
|
||||
int sendRequest(const CPackForServer * request); //returns requestID (that'll be matched to requestID in PackageApplied)
|
||||
int sendRequest(const CPackForServer & request); //returns requestID (that'll be matched to requestID in PackageApplied)
|
||||
CClient *cl;
|
||||
|
||||
public:
|
||||
@@ -179,6 +184,9 @@ public:
|
||||
void assembleArtifacts(const ObjectInstanceID & heroID, ArtifactPosition artifactSlot, bool assemble, ArtifactID assembleTo) override;
|
||||
void bulkMoveArtifacts(ObjectInstanceID srcHero, ObjectInstanceID dstHero, bool swap, bool equipped = true, bool backpack = true) override;
|
||||
void scrollBackpackArtifacts(ObjectInstanceID hero, bool left) override;
|
||||
void sortBackpackArtifactsBySlot(const ObjectInstanceID hero) override;
|
||||
void sortBackpackArtifactsByCost(const ObjectInstanceID hero) override;
|
||||
void sortBackpackArtifactsByClass(const ObjectInstanceID hero) override;
|
||||
void manageHeroCostume(ObjectInstanceID hero, size_t costumeIdx, bool saveCostume) override;
|
||||
void eraseArtifactByClient(const ArtifactLocation & al) override;
|
||||
bool buildBuilding(const CGTownInstance *town, BuildingID buildingID) override;
|
||||
@@ -186,7 +194,9 @@ public:
|
||||
void recruitCreatures(const CGDwelling * obj, const CArmedInstance * dst, CreatureID ID, ui32 amount, si32 level=-1) override;
|
||||
bool dismissCreature(const CArmedInstance *obj, SlotID stackPos) override;
|
||||
bool upgradeCreature(const CArmedInstance *obj, SlotID stackPos, CreatureID newID=CreatureID::NONE) override;
|
||||
void saveLocalState(const JsonNode & data) override;
|
||||
void endTurn() override;
|
||||
void spellResearch(const CGTownInstance *town, SpellID spellAtSlot, bool accepted) override;
|
||||
void swapGarrisonHero(const CGTownInstance *town) override;
|
||||
void buyArtifact(const CGHeroInstance *hero, ArtifactID aid) override;
|
||||
void trade(const ObjectInstanceID marketId, EMarketMode mode, TradeItemSell id1, TradeItemBuy id2, ui32 val1, const CGHeroInstance * hero = nullptr) override;
|
||||
|
@@ -486,11 +486,7 @@ if(NOT FORCE_BUNDLED_MINIZIP)
|
||||
endif()
|
||||
|
||||
if (ENABLE_CLIENT)
|
||||
set(FFMPEG_COMPONENTS avutil swscale avformat avcodec)
|
||||
if(APPLE_IOS AND NOT USING_CONAN)
|
||||
list(APPEND FFMPEG_COMPONENTS swresample)
|
||||
endif()
|
||||
find_package(ffmpeg COMPONENTS ${FFMPEG_COMPONENTS})
|
||||
find_package(ffmpeg COMPONENTS avutil swscale avformat avcodec swresample)
|
||||
|
||||
find_package(SDL2 REQUIRED)
|
||||
find_package(SDL2_image REQUIRED)
|
||||
@@ -666,6 +662,10 @@ if(NOT TARGET minizip::minizip)
|
||||
add_library(minizip::minizip ALIAS minizip)
|
||||
endif()
|
||||
|
||||
if(ENABLE_LAUNCHER OR ENABLE_EDITOR)
|
||||
add_subdirectory(vcmiqt)
|
||||
endif()
|
||||
|
||||
if(ENABLE_LAUNCHER)
|
||||
add_subdirectory(launcher)
|
||||
endif()
|
||||
|
BIN
Mods/vcmi/Data/spellResearch/accept.png
Normal file
BIN
Mods/vcmi/Data/spellResearch/accept.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 931 B |
BIN
Mods/vcmi/Data/spellResearch/close.png
Normal file
BIN
Mods/vcmi/Data/spellResearch/close.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 675 B |
BIN
Mods/vcmi/Data/spellResearch/reroll.png
Normal file
BIN
Mods/vcmi/Data/spellResearch/reroll.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
@@ -12,7 +12,9 @@
|
||||
"vcmi.adventureMap.monsterThreat.levels.9" : "压倒性的",
|
||||
"vcmi.adventureMap.monsterThreat.levels.10" : "致命的",
|
||||
"vcmi.adventureMap.monsterThreat.levels.11" : "无法取胜",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\n%TOWN%LEVEL级生物",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\n%TOWN%LEVEL级%ATTACK_TYPE生物",
|
||||
"vcmi.adventureMap.monsterMeleeType" : "近战",
|
||||
"vcmi.adventureMap.monsterRangedType" : "远程",
|
||||
|
||||
"vcmi.adventureMap.confirmRestartGame" : "你想要重新开始游戏吗?",
|
||||
"vcmi.adventureMap.noTownWithMarket" : "没有足够的市场。",
|
||||
@@ -579,7 +581,7 @@
|
||||
"core.bonus.GARGOYLE.description": "不能被复活或治疗",
|
||||
"core.bonus.GENERAL_DAMAGE_REDUCTION.name": "减少伤害 (${val}%)",
|
||||
"core.bonus.GENERAL_DAMAGE_REDUCTION.description": "减少从远程和近战中遭受的物理伤害",
|
||||
"core.bonus.HATE.name": "${subtype.creature}的死敌",
|
||||
"core.bonus.HATE.name": "憎恨${subtype.creature}",
|
||||
"core.bonus.HATE.description": "对${subtype.creature}造成额外${val}%伤害",
|
||||
"core.bonus.HEALER.name": "治疗者",
|
||||
"core.bonus.HEALER.description": "可以治疗友军单位",
|
||||
|
@@ -12,7 +12,9 @@
|
||||
"vcmi.adventureMap.monsterThreat.levels.9" : "Overpowering",
|
||||
"vcmi.adventureMap.monsterThreat.levels.10" : "Deadly",
|
||||
"vcmi.adventureMap.monsterThreat.levels.11" : "Impossible",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\nLevel %LEVEL %TOWN unit",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\nLevel %LEVEL %TOWN %ATTACK_TYPE unit",
|
||||
"vcmi.adventureMap.monsterMeleeType" : "melee",
|
||||
"vcmi.adventureMap.monsterRangedType" : "ranged",
|
||||
|
||||
"vcmi.adventureMap.confirmRestartGame" : "Are you sure you want to restart the game?",
|
||||
"vcmi.adventureMap.noTownWithMarket" : "There are no available marketplaces!",
|
||||
@@ -59,6 +61,13 @@
|
||||
|
||||
"vcmi.spellBook.search" : "search...",
|
||||
|
||||
"vcmi.spellResearch.canNotAfford" : "You can't afford to replace {%SPELL1} with {%SPELL2}. But you can still discard this spell and continue spell research.",
|
||||
"vcmi.spellResearch.comeAgain" : "Research has already been done today. Come back tomorrow.",
|
||||
"vcmi.spellResearch.pay" : "Would you like to replace {%SPELL1} with {%SPELL2}? Or discard this spell and continue spell research?",
|
||||
"vcmi.spellResearch.research" : "Research this Spell",
|
||||
"vcmi.spellResearch.skip" : "Skip this Spell",
|
||||
"vcmi.spellResearch.abort" : "Abort",
|
||||
|
||||
"vcmi.mainMenu.serverConnecting" : "Connecting...",
|
||||
"vcmi.mainMenu.serverAddressEnter" : "Enter address:",
|
||||
"vcmi.mainMenu.serverConnectionFailed" : "Failed to connect",
|
||||
@@ -143,6 +152,7 @@
|
||||
"vcmi.client.errors.invalidMap" : "{Invalid map or campaign}\n\nFailed to start game! Selected map or campaign might be invalid or corrupted. Reason:\n%s",
|
||||
"vcmi.client.errors.missingCampaigns" : "{Missing data files}\n\nCampaigns data files were not found! You may be using incomplete or corrupted Heroes 3 data files. Please reinstall game data.",
|
||||
"vcmi.server.errors.disconnected" : "{Network Error}\n\nConnection to game server has been lost!",
|
||||
"vcmi.server.errors.playerLeft" : "{Player Left}\n\n%s player have disconnected from the game!", //%s -> player color
|
||||
"vcmi.server.errors.existingProcess" : "Another VCMI server process is running. Please terminate it before starting a new game.",
|
||||
"vcmi.server.errors.modsToEnable" : "{Following mods are required}",
|
||||
"vcmi.server.errors.modsToDisable" : "{Following mods must be disabled}",
|
||||
@@ -340,6 +350,12 @@
|
||||
"vcmi.heroWindow.openCommander.help" : "Shows details about the commander of this hero.",
|
||||
"vcmi.heroWindow.openBackpack.hover" : "Open artifact backpack window",
|
||||
"vcmi.heroWindow.openBackpack.help" : "Opens window that allows easier artifact backpack management.",
|
||||
"vcmi.heroWindow.sortBackpackByCost.hover" : "Sort by cost",
|
||||
"vcmi.heroWindow.sortBackpackByCost.help" : "Sort artifacts in backpack by cost.",
|
||||
"vcmi.heroWindow.sortBackpackBySlot.hover" : "Sort by slot",
|
||||
"vcmi.heroWindow.sortBackpackBySlot.help" : "Sort artifacts in backpack by equipped slot.",
|
||||
"vcmi.heroWindow.sortBackpackByClass.hover" : "Sort by class",
|
||||
"vcmi.heroWindow.sortBackpackByClass.help" : "Sort artifacts in backpack by artifact class. Treasure, Minor, Major, Relic",
|
||||
|
||||
"vcmi.tavernWindow.inviteHero" : "Invite hero",
|
||||
|
||||
|
@@ -12,7 +12,9 @@
|
||||
"vcmi.adventureMap.monsterThreat.levels.9" : "Überwältigend",
|
||||
"vcmi.adventureMap.monsterThreat.levels.10" : "Tödlich",
|
||||
"vcmi.adventureMap.monsterThreat.levels.11" : "Unmöglich",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\nStufe %LEVEL %TOWN-Einheit",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\nStufe %LEVEL %TOWN-Einheit (%ATTACK_TYPE)",
|
||||
"vcmi.adventureMap.monsterMeleeType" : "Nahkampf",
|
||||
"vcmi.adventureMap.monsterRangedType" : "Fernkampf",
|
||||
|
||||
"vcmi.adventureMap.confirmRestartGame" : "Seid Ihr sicher, dass Ihr das Spiel neu starten wollt?",
|
||||
"vcmi.adventureMap.noTownWithMarket" : "Kein Marktplatz verfügbar!",
|
||||
@@ -58,6 +60,13 @@
|
||||
|
||||
"vcmi.spellBook.search" : "suchen...",
|
||||
|
||||
"vcmi.spellResearch.canNotAfford" : "Ihr könnt es Euch nicht leisten, {%SPELL1} durch {%SPELL2} zu ersetzen. Aber Ihr könnt diesen Zauberspruch trotzdem verwerfen und die Zauberspruchforschung fortsetzen.",
|
||||
"vcmi.spellResearch.comeAgain" : "Die Forschung wurde heute bereits abgeschlossen. Kommt morgen wieder.",
|
||||
"vcmi.spellResearch.pay" : "Möchtet Ihr {%SPELL1} durch {%SPELL2} ersetzen? Oder diesen Zauberspruch verwerfen und die Zauberspruchforschung fortsetzen?",
|
||||
"vcmi.spellResearch.research" : "Erforsche diesen Zauberspruch",
|
||||
"vcmi.spellResearch.skip" : "Überspringe diesen Zauberspruch",
|
||||
"vcmi.spellResearch.abort" : "Abbruch",
|
||||
|
||||
"vcmi.mainMenu.serverConnecting" : "Verbinde...",
|
||||
"vcmi.mainMenu.serverAddressEnter" : "Addresse eingeben:",
|
||||
"vcmi.mainMenu.serverConnectionFailed" : "Verbindung fehlgeschlagen",
|
||||
|
@@ -13,6 +13,8 @@
|
||||
"vcmi.adventureMap.monsterThreat.levels.10" : "Dödlig",
|
||||
"vcmi.adventureMap.monsterThreat.levels.11" : "Omöjlig",
|
||||
"vcmi.adventureMap.monsterLevel" : "\n\nNivå: %LEVEL - Faktion: %TOWN",
|
||||
"vcmi.adventureMap.monsterMeleeType" : "närstrid",
|
||||
"vcmi.adventureMap.monsterRangedType" : "fjärrstrid",
|
||||
|
||||
"vcmi.adventureMap.confirmRestartGame" : "Är du säker på att du vill starta om spelet?",
|
||||
"vcmi.adventureMap.noTownWithMarket" : "Det finns inga tillgängliga marknadsplatser!",
|
||||
@@ -21,7 +23,7 @@
|
||||
"vcmi.adventureMap.playerAttacked" : "Spelare har blivit attackerad: %s",
|
||||
"vcmi.adventureMap.moveCostDetails" : "Förflyttningspoängs-kostnad: %TURNS tur(er) + %POINTS poäng - Återstående poäng: %REMAINING",
|
||||
"vcmi.adventureMap.moveCostDetailsNoTurns" : "Förflyttningspoängs-kostnad: %POINTS poäng - Återstående poäng: %REMAINING",
|
||||
"vcmi.adventureMap.movementPointsHeroInfo" : "(Förflyttningspoäng: %REMAINING / %POINTS)",
|
||||
"vcmi.adventureMap.movementPointsHeroInfo" : "(Förflyttningspoäng: %REMAINING / %POINTS)",
|
||||
"vcmi.adventureMap.replayOpponentTurnNotImplemented" : "Tyvärr, att spela om motståndarens tur är inte implementerat ännu!",
|
||||
|
||||
"vcmi.capitalColors.0" : "Röd",
|
||||
@@ -135,14 +137,15 @@
|
||||
"vcmi.lobby.pvp.coin.hover" : "Mynt",
|
||||
"vcmi.lobby.pvp.coin.help" : "Singla slant",
|
||||
"vcmi.lobby.pvp.randomTown.hover" : "Slumpmässig stad",
|
||||
"vcmi.lobby.pvp.randomTown.help" : "Skriv en slumpmässig stad i chatten",
|
||||
"vcmi.lobby.pvp.randomTownVs.hover" : "Slumpmässig stad vs.",
|
||||
"vcmi.lobby.pvp.randomTownVs.help" : "Skriv två slumpmässiga städer i chatten",
|
||||
"vcmi.lobby.pvp.randomTown.help" : "Skriv en slumpad stad i chatten",
|
||||
"vcmi.lobby.pvp.randomTownVs.hover" : "Slumpad stad vs.",
|
||||
"vcmi.lobby.pvp.randomTownVs.help" : "Skriv två slumpade städer i chatten",
|
||||
"vcmi.lobby.pvp.versus" : "vs.",
|
||||
|
||||
"vcmi.client.errors.invalidMap" : "{Ogiltig karta eller kampanj}\n\nStartade inte spelet! Vald karta eller kampanj kan vara ogiltig eller skadad. Orsak:\n%s",
|
||||
"vcmi.client.errors.missingCampaigns" : "{Saknade datafiler}\n\nKampanjernas datafiler hittades inte! Du kanske använder ofullständiga eller skadade Heroes 3-datafiler. Vänligen installera om speldata.",
|
||||
"vcmi.server.errors.disconnected" : "{Nätverksfel}\n\nAnslutningen till spelservern har förlorats!",
|
||||
"vcmi.server.errors.playerLeft" : "{Spelare har lämnat}\n\n%s spelaren har kopplat bort sig från spelet!", //%s -> spelarens färg
|
||||
"vcmi.server.errors.existingProcess" : "En annan VCMI-serverprocess är igång. Vänligen avsluta den innan du startar ett nytt spel.",
|
||||
"vcmi.server.errors.modsToEnable" : "{Följande modd(ar) krävs}",
|
||||
"vcmi.server.errors.modsToDisable" : "{Följande modd(ar) måste inaktiveras}",
|
||||
@@ -221,8 +224,8 @@
|
||||
"vcmi.systemOptions.enableUiEnhancementsButton.help" : "{Gränssnittsförbättringar}\n\nVälj mellan olika förbättringar av användargränssnittet. Till exempel en lättåtkomlig ryggsäcksknapp med mera. Avaktivera för att få en mer klassisk spelupplevelse.",
|
||||
"vcmi.systemOptions.enableLargeSpellbookButton.hover" : "Stor trollformelsbok",
|
||||
"vcmi.systemOptions.enableLargeSpellbookButton.help" : "{Stor trollformelsbok}\n\nAktiverar en större trollformelsbok som rymmer fler trollformler per sida (animeringen av sidbyte i den större trollformelsboken fungerar inte).",
|
||||
"vcmi.systemOptions.audioMuteFocus.hover" : "Stänger av ljudet vid inaktivitet",
|
||||
"vcmi.systemOptions.audioMuteFocus.help" : "{Stäng av ljud vid inaktivitet}\n\nStänger av ljudet i spelet vid inaktivitet. Undantag är meddelanden i spelet och ljudet för ny tur/omgång.",
|
||||
"vcmi.systemOptions.audioMuteFocus.hover" : "Tyst vid inaktivitet",
|
||||
"vcmi.systemOptions.audioMuteFocus.help" : "{Tyst vid inaktivitet}\n\nStänger av ljudet i spelet vid inaktivitet. Undantag är meddelanden i spelet och ljudet för ny turomgång.",
|
||||
|
||||
"vcmi.adventureOptions.infoBarPick.hover" : "Visar textmeddelanden i infopanelen",
|
||||
"vcmi.adventureOptions.infoBarPick.help" : "{Infopanelsmeddelanden}\n\nNär det är möjligt kommer spelmeddelanden från besökande kartobjekt att visas i infopanelen istället för att dyka upp i ett separat fönster.",
|
||||
@@ -234,11 +237,11 @@
|
||||
"vcmi.adventureOptions.showGrid.help" : "{Visa rutnät}\n\nVisa rutnätsöverlägget som markerar gränserna mellan äventyrskartans brickor/rutor.",
|
||||
"vcmi.adventureOptions.borderScroll.hover" : "Kantrullning",
|
||||
"vcmi.adventureOptions.borderScroll.help" : "{Kantrullning}\n\nRullar äventyrskartan när markören är angränsande till fönsterkanten. Kan inaktiveras genom att hålla ned CTRL-tangenten.",
|
||||
"vcmi.adventureOptions.infoBarCreatureManagement.hover" : "Hantering av varelser i infopanelen i nedre högra hörnet",
|
||||
"vcmi.adventureOptions.infoBarCreatureManagement.hover" : "Hantera armén i nedre högra hörnet",
|
||||
"vcmi.adventureOptions.infoBarCreatureManagement.help" : "{Varelsehantering i infopanelen}\n\nTillåter omarrangering av varelser i infopanelen längst ner till höger på äventyrskartan istället för att bläddra mellan olika infopaneler.",
|
||||
"vcmi.adventureOptions.leftButtonDrag.hover" : "Dra kartan med vänster musknapp",
|
||||
"vcmi.adventureOptions.leftButtonDrag.hover" : "V.klicksdragning",
|
||||
"vcmi.adventureOptions.leftButtonDrag.help" : "{Vänsterklicksdragning}\n\nVid aktivering kan äventyrskartans kartvy dras genom att flytta musen med vänster musknapp nedtryckt.",
|
||||
"vcmi.adventureOptions.rightButtonDrag.hover" : "Dra kartan med höger musknapp",
|
||||
"vcmi.adventureOptions.rightButtonDrag.hover" : "H.klicksdragning",
|
||||
"vcmi.adventureOptions.rightButtonDrag.help" : "{Högerklicksdragning}\n\nVid aktivering kan äventyrskartans kartvy dras genom att flytta musen med höger musknapp nedtryckt.",
|
||||
"vcmi.adventureOptions.smoothDragging.hover" : "Mjuk kartdragning",
|
||||
"vcmi.adventureOptions.smoothDragging.help" : "{Mjuk kartdragning}\n\nVid aktivering så har kartdragningen en modern rullningseffekt.",
|
||||
@@ -268,16 +271,16 @@
|
||||
"vcmi.battleOptions.animationsSpeed1.help" : "Ställ in animationshastigheten till mycket långsam.",
|
||||
"vcmi.battleOptions.animationsSpeed5.help" : "Ställ in animationshastigheten till mycket snabb.",
|
||||
"vcmi.battleOptions.animationsSpeed6.help" : "Ställ in animationshastigheten till omedelbar.",
|
||||
"vcmi.battleOptions.movementHighlightOnHover.hover" : "Muspeka (hovra) för att avslöja förflyttningsräckvidd",
|
||||
"vcmi.battleOptions.movementHighlightOnHover.help" : "{Muspeka för att avslöja förflyttningsräckvidd}\n\nVisar enheters potentiella förflyttningsräckvidd över slagfältet när du håller muspekaren över dem.",
|
||||
"vcmi.battleOptions.movementHighlightOnHover.hover" : "Avslöja förflyttningsräckvidd",
|
||||
"vcmi.battleOptions.movementHighlightOnHover.help" : "{Muspeka (hovra) för att avslöja förflyttningsräckvidd}\n\nVisar enheters potentiella förflyttningsräckvidd över slagfältet när du håller muspekaren över dem.",
|
||||
"vcmi.battleOptions.rangeLimitHighlightOnHover.hover": "Avslöja skyttars räckvidd",
|
||||
"vcmi.battleOptions.rangeLimitHighlightOnHover.help" : "{Muspeka för att avslöja skyttars räckvidd}\n\nVisar hur långt en enhets distansattack sträcker sig över slagfältet när du håller muspekaren över dem.",
|
||||
"vcmi.battleOptions.showStickyHeroInfoWindows.hover" : "Visa fönster med hjältars primärförmågor",
|
||||
"vcmi.battleOptions.showStickyHeroInfoWindows.help" : "{Visa fönster med hjältars primärförmågor}\n\nKommer alltid att visa ett fönster där du kan se dina hjältars primärförmågor (anfall, försvar, trollkonst, kunskap och trollformelpoäng).",
|
||||
"vcmi.battleOptions.skipBattleIntroMusic.hover" : "Hoppa över intromusik",
|
||||
"vcmi.battleOptions.skipBattleIntroMusic.help" : "{Hoppa över intromusik}\n\nTillåt åtgärder under intromusiken som spelas i början av varje strid.",
|
||||
"vcmi.battleOptions.endWithAutocombat.hover" : "Slutför striden så fort som möjligt",
|
||||
"vcmi.battleOptions.endWithAutocombat.help" : "{Slutför strid}\n\nAuto-strid spelar striden åt dig för att striden ska slutföras så fort som möjligt.",
|
||||
"vcmi.battleOptions.endWithAutocombat.hover" : "Snabbstrid (AI)",
|
||||
"vcmi.battleOptions.endWithAutocombat.help" : "{Slutför striden så fort som möjligt}\n\nAI för auto-strid spelar striden åt dig för att striden ska slutföras så fort som möjligt.",
|
||||
"vcmi.battleOptions.showQuickSpell.hover" : "Snabb åtkomst till dina trollformler",
|
||||
"vcmi.battleOptions.showQuickSpell.help" : "{Visa snabbtrollformels-panelen}\n\nVisar en snabbvalspanel vid sidan av stridsfönstret där du har snabb åtkomst till några av dina trollformler",
|
||||
|
||||
@@ -365,15 +368,15 @@
|
||||
"vcmi.optionsTab.turnOptions.help" : "Välj alternativ för turomgångs-timer och simultana turer",
|
||||
|
||||
"vcmi.optionsTab.chessFieldBase.hover" : "Bas-timern",
|
||||
"vcmi.optionsTab.chessFieldTurn.hover" : "Turomgångs-timern",
|
||||
"vcmi.optionsTab.chessFieldTurn.hover" : "Tur-timern",
|
||||
"vcmi.optionsTab.chessFieldBattle.hover" : "Strids-timern",
|
||||
"vcmi.optionsTab.chessFieldUnit.hover" : "Enhets-timern",
|
||||
"vcmi.optionsTab.chessFieldBase.help" : "Används när {Turomgångs-timern} når '0'. Ställs in en gång i början av spelet. När den når '0' avslutas den aktuella turomgången (pågående strid avslutas med förlust).",
|
||||
"vcmi.optionsTab.chessFieldBase.help" : "Används när {Tur-timern} når '0'. Ställs in en gång i början av spelet. När den når '0' avslutas den aktuella turomgången (pågående strid avslutas med förlust).",
|
||||
"vcmi.optionsTab.chessFieldTurnAccumulate.help" : "Används utanför strid eller när {Strids-timern} tar slut. Återställs varje turomgång. Outnyttjad tid läggs till i {Bas-timern} till nästa turomgång.",
|
||||
"vcmi.optionsTab.chessFieldTurnDiscard.help" : "Används utanför strid eller när {Strids-timern} tar slut. Återställs varje turomgång. Outnyttjad tid går förlorad.",
|
||||
"vcmi.optionsTab.chessFieldBattle.help" : "Används i strider med AI eller i PVP-strid när {Enhets-timern} tar slut. Återställs i början av varje strid.",
|
||||
"vcmi.optionsTab.chessFieldUnitAccumulate.help" : "Används när du styr din enhet i PVP-strid. Outnyttjad tid läggs till i {Strids-timern} när enheten har avslutat sin turomgång.",
|
||||
"vcmi.optionsTab.chessFieldUnitDiscard.help" : "Används när du styr din enhet i PVP-strid. Återställs i början av varje enhets turomgång. Outnyttjad tid går förlorad.",
|
||||
"vcmi.optionsTab.chessFieldBattle.help" : "Används i strider med AI eller i PvP-strid när {Enhets-timern} tar slut. Återställs i början av varje strid.",
|
||||
"vcmi.optionsTab.chessFieldUnitAccumulate.help" : "Används när du styr din enhet i PvP-strid. Outnyttjad tid läggs till i {Strids-timern} när enheten har avslutat sin turomgång.",
|
||||
"vcmi.optionsTab.chessFieldUnitDiscard.help" : "Används när du styr din enhet i PvP-strid. Återställs i början av varje enhets turomgång. Outnyttjad tid går förlorad.",
|
||||
|
||||
"vcmi.optionsTab.accumulate" : "Ackumulera",
|
||||
|
||||
@@ -385,7 +388,7 @@
|
||||
"vcmi.optionsTab.simturnsMax.help" : "Spela samtidigt som andra spelare under ett angivet antal dagar eller tills en tillräckligt nära kontakt inträffar med en annan spelare",
|
||||
"vcmi.optionsTab.simturnsAI.help" : "{Simultana AI-turomgångar}\nExperimentellt alternativ. Tillåter AI-spelare att agera samtidigt som den mänskliga spelaren när simultana turomgångar är aktiverade.",
|
||||
|
||||
"vcmi.optionsTab.turnTime.select" : "Turtids-förinställningar",
|
||||
"vcmi.optionsTab.turnTime.select" : "Timer-inställningar för turomgångar",
|
||||
"vcmi.optionsTab.turnTime.unlimited" : "Obegränsat med tid",
|
||||
"vcmi.optionsTab.turnTime.classic.1" : "Klassisk timer: 1 minut",
|
||||
"vcmi.optionsTab.turnTime.classic.2" : "Klassisk timer: 2 minuter",
|
||||
@@ -393,22 +396,22 @@
|
||||
"vcmi.optionsTab.turnTime.classic.10" : "Klassisk timer: 10 minuter",
|
||||
"vcmi.optionsTab.turnTime.classic.20" : "Klassisk timer: 20 minuter",
|
||||
"vcmi.optionsTab.turnTime.classic.30" : "Klassisk timer: 30 minuter",
|
||||
"vcmi.optionsTab.turnTime.chess.20" : "Schack-timer: 20:00 + 10:00 + 02:00 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.16" : "Schack-timer: 16:00 + 08:00 + 01:30 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.8" : "Schack-timer: 08:00 + 04:00 + 01:00 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.4" : "Schack-timer: 04:00 + 02:00 + 00:30 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.2" : "Schack-timer: 02:00 + 01:00 + 00:15 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.1" : "Schack-timer: 01:00 + 01:00 + 00:00 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.20" : "Schack: 20:00 + 10:00 + 02:00 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.16" : "Schack: 16:00 + 08:00 + 01:30 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.8" : "Schack: 08:00 + 04:00 + 01:00 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.4" : "Schack: 04:00 + 02:00 + 00:30 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.2" : "Schack: 02:00 + 01:00 + 00:15 + 00:00",
|
||||
"vcmi.optionsTab.turnTime.chess.1" : "Schack: 01:00 + 01:00 + 00:00 + 00:00",
|
||||
|
||||
"vcmi.optionsTab.simturns.select" : "Välj förinställning för simultana/samtidiga turer",
|
||||
"vcmi.optionsTab.simturns.select" : "Simultana/samtidiga turomgångsinställningar",
|
||||
"vcmi.optionsTab.simturns.none" : "Inga simultana/samtidiga turer",
|
||||
"vcmi.optionsTab.simturns.tillContactMax" : "Simultantur: Fram till kontakt",
|
||||
"vcmi.optionsTab.simturns.tillContact1" : "Simultantur: 1 vecka, bryt vid kontakt",
|
||||
"vcmi.optionsTab.simturns.tillContact2" : "Simultantur: 2 veckor, bryt vid kontakt",
|
||||
"vcmi.optionsTab.simturns.tillContact4" : "Simultantur: 1 månad, bryt vid kontakt",
|
||||
"vcmi.optionsTab.simturns.blocked1" : "Simultantur: 1 vecka, kontakter blockerade",
|
||||
"vcmi.optionsTab.simturns.blocked2" : "Simultantur: 2 veckor, kontakter blockerade",
|
||||
"vcmi.optionsTab.simturns.blocked4" : "Simultantur: 1 månad, kontakter blockerade",
|
||||
"vcmi.optionsTab.simturns.tillContactMax" : "Sam-tur: Fram till kontakt",
|
||||
"vcmi.optionsTab.simturns.tillContact1" : "Sam-tur: 1 vecka, bryt vid kontakt",
|
||||
"vcmi.optionsTab.simturns.tillContact2" : "Sam-tur: 2 veckor, bryt vid kontakt",
|
||||
"vcmi.optionsTab.simturns.tillContact4" : "Sam-tur: 1 månad, bryt vid kontakt",
|
||||
"vcmi.optionsTab.simturns.blocked1" : "Sam-tur: 1 vecka, kontakter blockerade",
|
||||
"vcmi.optionsTab.simturns.blocked2" : "Sam-tur: 2 veckor, kontakter blockerade",
|
||||
"vcmi.optionsTab.simturns.blocked4" : "Sam-tur: 1 månad, kontakter blockerade",
|
||||
|
||||
// Translation note: translate strings below using form that is correct for "0 days", "1 day" and "2 days" in your language
|
||||
// Using this information, VCMI will automatically select correct plural form for every possible amount
|
||||
@@ -525,10 +528,10 @@
|
||||
"core.bonus.AIR_IMMUNITY.description" : "Immun mot alla trollformler från skolan för luftmagi",
|
||||
"core.bonus.ATTACKS_ALL_ADJACENT.name" : "Attackera runtomkring",
|
||||
"core.bonus.ATTACKS_ALL_ADJACENT.description" : "Attackerar alla angränsande fiender",
|
||||
"core.bonus.BLOCKS_RETALIATION.name" : "Ingen motattack",
|
||||
"core.bonus.BLOCKS_RETALIATION.name" : "Blockera närstrids-motattack",
|
||||
"core.bonus.BLOCKS_RETALIATION.description" : "Fienden kan inte slå tillbaka/retaliera",
|
||||
"core.bonus.BLOCKS_RANGED_RETALIATION.name" : "Ingen motattack på avstånd",
|
||||
"core.bonus.BLOCKS_RANGED_RETALIATION.description" : "Fienden kan inte göra en motattack/retaliering på avstånd genom att använda en distansattack",
|
||||
"core.bonus.BLOCKS_RANGED_RETALIATION.name" : "Blockera fjärrstrids-motattack",
|
||||
"core.bonus.BLOCKS_RANGED_RETALIATION.description" : "Fienden kan inte retaliera på avstånd genom att använda en distansattack",
|
||||
"core.bonus.CATAPULT.name" : "Katapult",
|
||||
"core.bonus.CATAPULT.description" : "Attackerar belägringsmurar",
|
||||
"core.bonus.CHANGES_SPELL_COST_FOR_ALLY.name" : "Minska trollformelkostnaden (${val})",
|
||||
@@ -538,21 +541,21 @@
|
||||
"core.bonus.CHARGE_IMMUNITY.name" : "Galoppanfalls-immunitet",
|
||||
"core.bonus.CHARGE_IMMUNITY.description" : "Immun mot ryttares och tornerares galopperande ridanfall",
|
||||
"core.bonus.DARKNESS.name" : "I skydd av mörkret",
|
||||
"core.bonus.DARKNESS.description" : "Skapar ett hölje av mörker med en ${val}-rutorsradie",
|
||||
"core.bonus.DARKNESS.description" : "Skapar ett mörkerhölje med en rut-radie på ${val} som gäckar dina fiender",
|
||||
"core.bonus.DEATH_STARE.name" : "Dödsblick (${val}%)",
|
||||
"core.bonus.DEATH_STARE.description" : "Varje förbandsenhet med 'Dödsblick' har ${val}% chans att döda den översta enheten i ett fiendeförband",
|
||||
"core.bonus.DEATH_STARE.description" : "Varje 'Dödsblick' har ${val}% chans att döda den översta fiendeenheten",
|
||||
"core.bonus.DEFENSIVE_STANCE.name" : "Försvarshållning",
|
||||
"core.bonus.DEFENSIVE_STANCE.description" : "Ger ytterligare +${val} till enhetens försvarsförmåga när du väljer att försvarar dig",
|
||||
"core.bonus.DEFENSIVE_STANCE.description" : "När du väljer att försvara en enhet så får den +${val} extra försvar",
|
||||
"core.bonus.DESTRUCTION.name" : "Förintelse",
|
||||
"core.bonus.DESTRUCTION.description" : "Har ${val}% chans att döda extra enheter efter attack",
|
||||
"core.bonus.DOUBLE_DAMAGE_CHANCE.name" : "Dödsstöt",
|
||||
"core.bonus.DOUBLE_DAMAGE_CHANCE.description" : "Har ${val}% chans att ge dubbel basskada vid attack",
|
||||
"core.bonus.DOUBLE_DAMAGE_CHANCE.description" : "Har ${val}% chans att utdela dubbel basskada vid attack",
|
||||
"core.bonus.DRAGON_NATURE.name" : "Drake",
|
||||
"core.bonus.DRAGON_NATURE.description" : "Varelsen har en draknatur",
|
||||
"core.bonus.EARTH_IMMUNITY.name" : "Jord-immunitet",
|
||||
"core.bonus.EARTH_IMMUNITY.description" : "Immun mot alla trollformler från skolan för jordmagi",
|
||||
"core.bonus.ENCHANTER.name" : "Förtrollare",
|
||||
"core.bonus.ENCHANTER.description" : "Kan kasta ${subtyp.spell} på alla varje tur/omgång",
|
||||
"core.bonus.ENCHANTER.description" : "Kan kasta ${subtyp.spell} på alla varje turomgång",
|
||||
"core.bonus.ENCHANTED.name" : "Förtrollad",
|
||||
"core.bonus.ENCHANTED.description" : "Påverkas av permanent ${subtype.spell}",
|
||||
"core.bonus.ENEMY_ATTACK_REDUCTION.name" : "Avfärda attack (${val}%)",
|
||||
@@ -578,15 +581,15 @@
|
||||
"core.bonus.GARGOYLE.name" : "Stenfigur",
|
||||
"core.bonus.GARGOYLE.description" : "Kan varken upplivas eller läkas",
|
||||
"core.bonus.GENERAL_DAMAGE_REDUCTION.name" : "Minska skada (${val}%)",
|
||||
"core.bonus.GENERAL_DAMAGE_REDUCTION.description" : "Reducerar fysisk skada från både distans- och närstridsattacker",
|
||||
"core.bonus.GENERAL_DAMAGE_REDUCTION.description" : "Reducerar skadan från distans- och närstrids-attacker",
|
||||
"core.bonus.HATE.name" : "Hatar ${subtyp.varelse}",
|
||||
"core.bonus.HATE.description" : "Gör ${val}% mer skada mot ${subtyp.varelse}",
|
||||
"core.bonus.HEALER.name" : "Helare",
|
||||
"core.bonus.HEALER.description" : "Helar/läker allierade enheter",
|
||||
"core.bonus.HP_REGENERATION.name" : "Självläkande",
|
||||
"core.bonus.HP_REGENERATION.description" : "Får tillbaka ${val} träffpoäng (hälsa) varje runda",
|
||||
"core.bonus.HP_REGENERATION.description" : "Får tillbaka ${val} hälsa (träffpoäng) varje runda",
|
||||
"core.bonus.JOUSTING.name" : "Galopperande ridanfall",
|
||||
"core.bonus.JOUSTING.description" : "Orsakar +${val}% extra skada för varje ruta som enheten förflyttas innan attack",
|
||||
"core.bonus.JOUSTING.description" : "Orsakar +${val}% mer skada för varje ruta som förflyttas innan attack",
|
||||
"core.bonus.KING.name" : "Kung",
|
||||
"core.bonus.KING.description" : "Sårbar för 'Dräpar'-nivå ${val} eller högre",
|
||||
"core.bonus.LEVEL_SPELL_IMMUNITY.name" : "Förtrollningsimmunitet 1-${val}",
|
||||
@@ -594,13 +597,13 @@
|
||||
"core.bonus.LIMITED_SHOOTING_RANGE.name" : "Begränsad räckvidd för skjutning",
|
||||
"core.bonus.LIMITED_SHOOTING_RANGE.description" : "Kan inte sikta på enheter längre bort än ${val} rutor",
|
||||
"core.bonus.LIFE_DRAIN.name" : "Dränerar livskraft (${val}%)",
|
||||
"core.bonus.LIFE_DRAIN.description" : "Dränerar ${val}% träffpoäng (hälsa) av utdelad skada",
|
||||
"core.bonus.LIFE_DRAIN.description" : "Dränerar ${val}% hälsa (träffpoäng) av utdelad skada",
|
||||
"core.bonus.MANA_CHANNELING.name" : "Kanalisera trollformelspoäng ${val}%",
|
||||
"core.bonus.MANA_CHANNELING.description" : "Ger din hjälte ${val}% av den mängd trollformelspoäng som fienden spenderar per trollformel i strid",
|
||||
"core.bonus.MANA_CHANNELING.description" : "Ger din hjälte ${val}% av fiendens spenderade trollformelspoäng i strid",
|
||||
"core.bonus.MANA_DRAIN.name" : "Dränera trollformelspoäng",
|
||||
"core.bonus.MANA_DRAIN.description" : "Dränerar ${val} trollformelspoäng varje tur",
|
||||
"core.bonus.MAGIC_MIRROR.name" : "Magisk spegel (${val}%)",
|
||||
"core.bonus.MAGIC_MIRROR.description" : "Har ${val}% chans att reflektera (omdirigera) en offensiv trollformel på en fiendeenhet",
|
||||
"core.bonus.MAGIC_MIRROR.description" : "${val}% chans att reflektera en offensiv trollformel på en fiendeenhet",
|
||||
"core.bonus.MAGIC_RESISTANCE.name" : "Magiskt motstånd (${val}%)",
|
||||
"core.bonus.MAGIC_RESISTANCE.description" : "Har en ${val}% chans att motstå en skadlig trollformel",
|
||||
"core.bonus.MIND_IMMUNITY.name" : "Immunitet mot sinnesförtrollningar",
|
||||
@@ -610,11 +613,11 @@
|
||||
"core.bonus.NO_MELEE_PENALTY.name" : "Ingen närstridsbestraffning",
|
||||
"core.bonus.NO_MELEE_PENALTY.description" : "Varelsen har ingen närstridsbestraffning",
|
||||
"core.bonus.NO_MORALE.name" : "Ingen Moralpåverkan",
|
||||
"core.bonus.NO_MORALE.description" : "Varelsen är immun mot moraliska effekter och har alltid neutral moral",
|
||||
"core.bonus.NO_MORALE.description" : "Är immun mot moraliska effekter och har alltid neutral moral",
|
||||
"core.bonus.NO_WALL_PENALTY.name" : "Ingen murbestraffning",
|
||||
"core.bonus.NO_WALL_PENALTY.description" : "Orsakar full skada mot fiender bakom en mur",
|
||||
"core.bonus.NON_LIVING.name" : "Icke levande",
|
||||
"core.bonus.NON_LIVING.description" : "Immunitet mot många effekter som annars bara påverkar levande och odöda varelser",
|
||||
"core.bonus.NON_LIVING.description" : "Påverkas inte av vissa effekter som levande/odöda gör",
|
||||
"core.bonus.RANDOM_SPELLCASTER.name" : "Slumpmässig besvärjare",
|
||||
"core.bonus.RANDOM_SPELLCASTER.description" : "Kan kasta trollformler som väljs slumpmässigt",
|
||||
"core.bonus.RANGED_RETALIATION.name" : "Motattacker på avstånd",
|
||||
@@ -624,21 +627,21 @@
|
||||
"core.bonus.REBIRTH.name" : "Återfödelse (${val}%)",
|
||||
"core.bonus.REBIRTH.description" : "${val}% av enheterna kommer att återuppväckas efter döden",
|
||||
"core.bonus.RETURN_AFTER_STRIKE.name" : "Återvänder efter närstrid",
|
||||
"core.bonus.RETURN_AFTER_STRIKE.description" : "Efter att ha attackerat en fiendeenhet i närstrid återvänder enheten till rutan som den var placerad på innan den utförde sin närstridsattack",
|
||||
"core.bonus.RETURN_AFTER_STRIKE.description" : "Efter närstridsattack återvänder den till sin ursprungliga ruta",
|
||||
"core.bonus.REVENGE.name" : "Hämnd",
|
||||
"core.bonus.REVENGE.description" : "Orsakar extra skada baserat på angriparens förlorade träffpoäng (hälsa) i strid",
|
||||
"core.bonus.REVENGE.description" : "Orsakar mer skada om den själv blivit skadad",
|
||||
"core.bonus.SHOOTER.name" : "Distans-attack",
|
||||
"core.bonus.SHOOTER.description" : "Varelsen kan skjuta/attackera på avstånd",
|
||||
"core.bonus.SHOOTS_ALL_ADJACENT.name" : "Skjuter alla i närheten",
|
||||
"core.bonus.SHOOTS_ALL_ADJACENT.description" : "Denna varelses distans-attacker drabbar alla mål i ett litet område",
|
||||
"core.bonus.SHOOTS_ALL_ADJACENT.description" : "Dess distans-attacker drabbar alla mål i ett litet område",
|
||||
"core.bonus.SOUL_STEAL.name" : "Själtjuv",
|
||||
"core.bonus.SOUL_STEAL.description" : "Återuppväcker ${val} av sina egna enheter för varje dödad fiendeenhet",
|
||||
"core.bonus.SOUL_STEAL.description" : "Återuppväcker ${val} av sina egna för varje dödad fiendeenhet",
|
||||
"core.bonus.SPELLCASTER.name" : "Besvärjare",
|
||||
"core.bonus.SPELLCASTER.description" : "Kan kasta ${subtype.spell}",
|
||||
"core.bonus.SPELL_AFTER_ATTACK.name" : "Besvärja efter attack",
|
||||
"core.bonus.SPELL_AFTER_ATTACK.description" : "Har en ${val}% chans att kasta ${subtype.spell} efter att den har attackerat",
|
||||
"core.bonus.SPELL_AFTER_ATTACK.description" : "Har ${val}% chans att kasta ${subtype.spell} efter anfall",
|
||||
"core.bonus.SPELL_BEFORE_ATTACK.name" : "Besvärja före attack",
|
||||
"core.bonus.SPELL_BEFORE_ATTACK.description" : "Har en ${val}% chans att kasta ${subtype.spell} innan den attackerar",
|
||||
"core.bonus.SPELL_BEFORE_ATTACK.description" : "Har ${val}% chans att kasta ${subtype.spell} före anfall",
|
||||
"core.bonus.SPELL_DAMAGE_REDUCTION.name" : "Trolldoms-resistens",
|
||||
"core.bonus.SPELL_DAMAGE_REDUCTION.description" : "Skadan från trollformler är reducet med ${val}%.",
|
||||
"core.bonus.SPELL_IMMUNITY.name" : "Trolldoms-immunitet",
|
||||
@@ -659,14 +662,14 @@
|
||||
"core.bonus.TRANSMUTATION.description" : "${val}% chans att förvandla angripen enhet till en annan typ",
|
||||
"core.bonus.UNDEAD.name" : "Odöd",
|
||||
"core.bonus.UNDEAD.description" : "Varelsen är odöd",
|
||||
"core.bonus.UNLIMITED_RETALIATIONS.name" : "Obegränsat antal motattacker",
|
||||
"core.bonus.UNLIMITED_RETALIATIONS.description" : "Kan slå tillbaka mot ett obegränsat antal attacker varje omgång",
|
||||
"core.bonus.UNLIMITED_RETALIATIONS.name" : "Slår tillbaka varje gång",
|
||||
"core.bonus.UNLIMITED_RETALIATIONS.description" : "Obegränsat antal motattacker",
|
||||
"core.bonus.WATER_IMMUNITY.name" : "Vatten-immunitet",
|
||||
"core.bonus.WATER_IMMUNITY.description" : "Immun mot alla trollformler från vattenmagi-skolan",
|
||||
"core.bonus.WATER_IMMUNITY.description" : "Immun mot alla trollformler från vattenmagiskolan",
|
||||
"core.bonus.WIDE_BREATH.name" : "Bred dödlig andedräkt",
|
||||
"core.bonus.WIDE_BREATH.description" : "Bred andningsattack (flera rutor)",
|
||||
"core.bonus.DISINTEGRATE.name" : "Desintegrerar",
|
||||
"core.bonus.DISINTEGRATE.description" : "Ingen fysisk kropp finns kvar efter att enheten blivit besegrad i strid",
|
||||
"core.bonus.DISINTEGRATE.description" : "Ingen kropp lämnas kvar efter dödsögonblicket",
|
||||
"core.bonus.INVINCIBLE.name" : "Oövervinnerlig",
|
||||
"core.bonus.INVINCIBLE.description" : "Kan inte påverkas av någonting"
|
||||
}
|
||||
|
@@ -1138,7 +1138,7 @@ void CPlayerInterface::showMapObjectSelectDialog(QueryID askID, const Component
|
||||
const CGTownInstance * t = dynamic_cast<const CGTownInstance *>(cb->getObj(obj));
|
||||
if(t)
|
||||
{
|
||||
auto image = GH.renderHandler().loadImage(AnimationPath::builtin("ITPA"), t->town->clientInfo.icons[t->hasFort()][false] + 2, 0, EImageBlitMode::OPAQUE);
|
||||
auto image = GH.renderHandler().loadImage(AnimationPath::builtin("ITPA"), t->getTown()->clientInfo.icons[t->hasFort()][false] + 2, 0, EImageBlitMode::OPAQUE);
|
||||
image->scaleTo(Point(35, 23));
|
||||
images.push_back(image);
|
||||
}
|
||||
@@ -1333,6 +1333,8 @@ void CPlayerInterface::initializeHeroTownList()
|
||||
localState->addOwnedTown(town);
|
||||
}
|
||||
|
||||
localState->deserialize(*cb->getPlayerState(playerID)->playerLocalSettings);
|
||||
|
||||
if(adventureInt)
|
||||
adventureInt->onHeroChanged(nullptr);
|
||||
}
|
||||
|
@@ -141,7 +141,12 @@ void CServerHandler::resetStateForLobby(EStartMode mode, ESelectionScreen screen
|
||||
if(!playerNames.empty()) //if have custom set of player names - use it
|
||||
localPlayerNames = playerNames;
|
||||
else
|
||||
localPlayerNames.push_back(settings["general"]["playerName"].String());
|
||||
{
|
||||
std::string playerName = settings["general"]["playerName"].String();
|
||||
if(playerName == "Player")
|
||||
playerName = CGI->generaltexth->translate("core.genrltxt.434");
|
||||
localPlayerNames.push_back(playerName);
|
||||
}
|
||||
|
||||
gameChat->resetMatchState();
|
||||
lobbyClient->resetMatchState();
|
||||
@@ -853,7 +858,7 @@ void CServerHandler::onPacketReceived(const std::shared_ptr<INetworkConnection>
|
||||
if(getState() == EClientState::DISCONNECTING)
|
||||
return;
|
||||
|
||||
CPack * pack = logicConnection->retrievePack(message);
|
||||
auto pack = logicConnection->retrievePack(message);
|
||||
ServerHandlerCPackVisitor visitor(*this);
|
||||
pack->visit(visitor);
|
||||
}
|
||||
@@ -938,14 +943,14 @@ void CServerHandler::visitForLobby(CPackForLobby & lobbyPack)
|
||||
|
||||
void CServerHandler::visitForClient(CPackForClient & clientPack)
|
||||
{
|
||||
client->handlePack(&clientPack);
|
||||
client->handlePack(clientPack);
|
||||
}
|
||||
|
||||
|
||||
void CServerHandler::sendLobbyPack(const CPackForLobby & pack) const
|
||||
{
|
||||
if(getState() != EClientState::STARTING)
|
||||
logicConnection->sendPack(&pack);
|
||||
logicConnection->sendPack(pack);
|
||||
}
|
||||
|
||||
bool CServerHandler::inLobbyRoom() const
|
||||
|
@@ -25,7 +25,6 @@ struct TurnTimerInfo;
|
||||
class CMapInfo;
|
||||
class CGameState;
|
||||
struct ClientPlayer;
|
||||
struct CPack;
|
||||
struct CPackForLobby;
|
||||
struct CPackForClient;
|
||||
|
||||
|
@@ -163,7 +163,7 @@ void CClient::save(const std::string & fname)
|
||||
}
|
||||
|
||||
SaveGame save_game(fname);
|
||||
sendRequest(&save_game, PlayerColor::NEUTRAL);
|
||||
sendRequest(save_game, PlayerColor::NEUTRAL);
|
||||
}
|
||||
|
||||
void CClient::endNetwork()
|
||||
@@ -348,37 +348,35 @@ void CClient::installNewBattleInterface(std::shared_ptr<CBattleGameInterface> ba
|
||||
}
|
||||
}
|
||||
|
||||
void CClient::handlePack(CPackForClient * pack)
|
||||
void CClient::handlePack(CPackForClient & pack)
|
||||
{
|
||||
ApplyClientNetPackVisitor afterVisitor(*this, *gameState());
|
||||
ApplyFirstClientNetPackVisitor beforeVisitor(*this, *gameState());
|
||||
|
||||
pack->visit(beforeVisitor);
|
||||
logNetwork->trace("\tMade first apply on cl: %s", typeid(*pack).name());
|
||||
pack.visit(beforeVisitor);
|
||||
logNetwork->trace("\tMade first apply on cl: %s", typeid(pack).name());
|
||||
{
|
||||
boost::unique_lock lock(CGameState::mutex);
|
||||
gs->apply(pack);
|
||||
}
|
||||
logNetwork->trace("\tApplied on gs: %s", typeid(*pack).name());
|
||||
pack->visit(afterVisitor);
|
||||
logNetwork->trace("\tMade second apply on cl: %s", typeid(*pack).name());
|
||||
|
||||
delete pack;
|
||||
logNetwork->trace("\tApplied on gs: %s", typeid(pack).name());
|
||||
pack.visit(afterVisitor);
|
||||
logNetwork->trace("\tMade second apply on cl: %s", typeid(pack).name());
|
||||
}
|
||||
|
||||
int CClient::sendRequest(const CPackForServer * request, PlayerColor player)
|
||||
int CClient::sendRequest(const CPackForServer & request, PlayerColor player)
|
||||
{
|
||||
static ui32 requestCounter = 1;
|
||||
|
||||
ui32 requestID = requestCounter++;
|
||||
logNetwork->trace("Sending a request \"%s\". It'll have an ID=%d.", typeid(*request).name(), requestID);
|
||||
logNetwork->trace("Sending a request \"%s\". It'll have an ID=%d.", typeid(request).name(), requestID);
|
||||
|
||||
waitingRequest.pushBack(requestID);
|
||||
request->requestID = requestID;
|
||||
request->player = player;
|
||||
request.requestID = requestID;
|
||||
request.player = player;
|
||||
CSH->logicConnection->sendPack(request);
|
||||
if(vstd::contains(playerint, player))
|
||||
playerint[player]->requestSent(request, requestID);
|
||||
playerint[player]->requestSent(&request, requestID);
|
||||
|
||||
return requestID;
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
struct CPack;
|
||||
struct CPackForServer;
|
||||
class IBattleEventsReceiver;
|
||||
class CBattleGameInterface;
|
||||
@@ -143,8 +142,8 @@ public:
|
||||
|
||||
static ThreadSafeVector<int> waitingRequest; //FIXME: make this normal field (need to join all threads before client destruction)
|
||||
|
||||
void handlePack(CPackForClient * pack); //applies the given pack and deletes it
|
||||
int sendRequest(const CPackForServer * request, PlayerColor player); //returns ID given to that request
|
||||
void handlePack(CPackForClient & pack); //applies the given pack and deletes it
|
||||
int sendRequest(const CPackForServer & request, PlayerColor player); //returns ID given to that request
|
||||
|
||||
void battleStarted(const BattleInfo * info);
|
||||
void battleFinished(const BattleID & battleID);
|
||||
@@ -159,6 +158,7 @@ public:
|
||||
friend class CBattleCallback; //handling players actions
|
||||
|
||||
void changeSpells(const CGHeroInstance * hero, bool give, const std::set<SpellID> & spells) override {};
|
||||
void setResearchedSpells(const CGTownInstance * town, int level, const std::vector<SpellID> spells, bool accepted) override {};
|
||||
bool removeObject(const CGObjectInstance * obj, const PlayerColor & initiator) override {return false;};
|
||||
void createBoat(const int3 & visitablePosition, BoatId type, PlayerColor initiator) override {};
|
||||
void setOwner(const CGObjectInstance * obj, PlayerColor owner) override {};
|
||||
@@ -204,7 +204,7 @@ public:
|
||||
void setManaPoints(ObjectInstanceID hid, int val) override {};
|
||||
void giveHero(ObjectInstanceID id, PlayerColor player, ObjectInstanceID boatId = ObjectInstanceID()) override {};
|
||||
void changeObjPos(ObjectInstanceID objid, int3 newPos, const PlayerColor & initiator) override {};
|
||||
void sendAndApply(CPackForClient * pack) override {};
|
||||
void sendAndApply(CPackForClient & pack) override {};
|
||||
void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2) override {};
|
||||
void castSpell(const spells::Caster * caster, SpellID spellID, const int3 &pos) override {};
|
||||
|
||||
|
@@ -453,7 +453,7 @@ void ClientCommandManager::handleTellCommand(std::istringstream& singleWordBuffe
|
||||
if(what == "hs")
|
||||
{
|
||||
for(const CGHeroInstance* h : LOCPLINT->cb->getHeroesInfo())
|
||||
if(h->type->getIndex() == id1)
|
||||
if(h->getHeroTypeID().getNum() == id1)
|
||||
if(const CArtifactInstance* a = h->getArt(ArtifactPosition(id2)))
|
||||
printCommandMessage(a->nodeName());
|
||||
}
|
||||
|
@@ -37,6 +37,7 @@ public:
|
||||
void visitHeroVisitCastle(HeroVisitCastle & pack) override;
|
||||
void visitSetMana(SetMana & pack) override;
|
||||
void visitSetMovePoints(SetMovePoints & pack) override;
|
||||
void visitSetResearchedSpells(SetResearchedSpells & pack) override;
|
||||
void visitFoWChange(FoWChange & pack) override;
|
||||
void visitChangeStackCount(ChangeStackCount & pack) override;
|
||||
void visitSetStackType(SetStackType & pack) override;
|
||||
|
@@ -375,7 +375,7 @@ void HeroMovementController::sendMovementRequest(const CGHeroInstance * h, const
|
||||
{
|
||||
updateMovementSound(h, currNode.coord, nextNode.coord, nextNode.action);
|
||||
|
||||
assert(h->pos.z == nextNode.coord.z); // Z should change only if it's movement via teleporter and in this case this code shouldn't be executed at all
|
||||
assert(h->anchorPos().z == nextNode.coord.z); // Z should change only if it's movement via teleporter and in this case this code shouldn't be executed at all
|
||||
|
||||
logGlobal->trace("Requesting hero movement to %s", nextNode.coord.toString());
|
||||
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include "CPlayerInterface.h"
|
||||
#include "CGameInfo.h"
|
||||
#include "windows/GUIClasses.h"
|
||||
#include "windows/CCastleInterface.h"
|
||||
#include "mapView/mapHandler.h"
|
||||
#include "adventureMap/AdventureMapInterface.h"
|
||||
#include "adventureMap/CInGameConsole.h"
|
||||
@@ -172,6 +173,12 @@ void ApplyClientNetPackVisitor::visitSetMovePoints(SetMovePoints & pack)
|
||||
callInterfaceIfPresent(cl, h->tempOwner, &IGameEventsReceiver::heroMovePointsChanged, h);
|
||||
}
|
||||
|
||||
void ApplyClientNetPackVisitor::visitSetResearchedSpells(SetResearchedSpells & pack)
|
||||
{
|
||||
for(const auto & win : GH.windows().findWindows<CMageGuildScreen>())
|
||||
win->updateSpells(pack.tid);
|
||||
}
|
||||
|
||||
void ApplyClientNetPackVisitor::visitFoWChange(FoWChange & pack)
|
||||
{
|
||||
for(auto &i : cl.playerint)
|
||||
@@ -664,7 +671,7 @@ void ApplyClientNetPackVisitor::visitSetHeroesInTown(SetHeroesInTown & pack)
|
||||
void ApplyClientNetPackVisitor::visitHeroRecruited(HeroRecruited & pack)
|
||||
{
|
||||
CGHeroInstance *h = gs.map->heroesOnMap.back();
|
||||
if(h->getHeroType() != pack.hid)
|
||||
if(h->getHeroTypeID() != pack.hid)
|
||||
{
|
||||
logNetwork->error("Something wrong with hero recruited!");
|
||||
}
|
||||
|
@@ -11,6 +11,7 @@
|
||||
#include "PlayerLocalState.h"
|
||||
|
||||
#include "../CCallback.h"
|
||||
#include "../lib/json/JsonNode.h"
|
||||
#include "../lib/mapObjects/CGHeroInstance.h"
|
||||
#include "../lib/mapObjects/CGTownInstance.h"
|
||||
#include "../lib/pathfinder/CGPathNode.h"
|
||||
@@ -23,34 +24,20 @@ PlayerLocalState::PlayerLocalState(CPlayerInterface & owner)
|
||||
{
|
||||
}
|
||||
|
||||
void PlayerLocalState::saveHeroPaths(std::map<const CGHeroInstance *, int3> & pathsMap)
|
||||
const PlayerSpellbookSetting & PlayerLocalState::getSpellbookSettings()
|
||||
{
|
||||
for(auto & p : paths)
|
||||
{
|
||||
if(p.second.nodes.size())
|
||||
pathsMap[p.first] = p.second.endPos();
|
||||
else
|
||||
logGlobal->debug("%s has assigned an empty path! Ignoring it...", p.first->getNameTranslated());
|
||||
}
|
||||
return spellbookSettings;
|
||||
}
|
||||
|
||||
void PlayerLocalState::loadHeroPaths(std::map<const CGHeroInstance *, int3> & pathsMap)
|
||||
void PlayerLocalState::setSpellbookSettings(const PlayerSpellbookSetting & newSettings)
|
||||
{
|
||||
if(owner.cb)
|
||||
{
|
||||
for(auto & p : pathsMap)
|
||||
{
|
||||
CGPath path;
|
||||
owner.cb->getPathsInfo(p.first)->getPath(path, p.second);
|
||||
paths[p.first] = path;
|
||||
logGlobal->trace("Restored path for hero %s leading to %s with %d nodes", p.first->nodeName(), p.second.toString(), path.nodes.size());
|
||||
}
|
||||
}
|
||||
spellbookSettings = newSettings;
|
||||
}
|
||||
|
||||
void PlayerLocalState::setPath(const CGHeroInstance * h, const CGPath & path)
|
||||
{
|
||||
paths[h] = path;
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
const CGPath & PlayerLocalState::getPath(const CGHeroInstance * h) const
|
||||
@@ -70,6 +57,7 @@ bool PlayerLocalState::setPath(const CGHeroInstance * h, const int3 & destinatio
|
||||
if(!owner.cb->getPathsInfo(h)->getPath(path, destination))
|
||||
{
|
||||
paths.erase(h); //invalidate previously possible path if selected (before other hero blocked only path / fly spell expired)
|
||||
syncronizeState();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -93,6 +81,7 @@ void PlayerLocalState::erasePath(const CGHeroInstance * h)
|
||||
{
|
||||
paths.erase(h);
|
||||
adventureInt->onHeroChanged(h);
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
void PlayerLocalState::verifyPath(const CGHeroInstance * h)
|
||||
@@ -170,6 +159,7 @@ void PlayerLocalState::setSelection(const CArmedInstance * selection)
|
||||
|
||||
if (adventureInt && selection)
|
||||
adventureInt->onSelectionChanged(selection);
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
bool PlayerLocalState::isHeroSleeping(const CGHeroInstance * hero) const
|
||||
@@ -184,6 +174,7 @@ void PlayerLocalState::setHeroAsleep(const CGHeroInstance * hero)
|
||||
assert(!vstd::contains(sleepingHeroes, hero));
|
||||
|
||||
sleepingHeroes.push_back(hero);
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
void PlayerLocalState::setHeroAwaken(const CGHeroInstance * hero)
|
||||
@@ -193,6 +184,7 @@ void PlayerLocalState::setHeroAwaken(const CGHeroInstance * hero)
|
||||
assert(vstd::contains(sleepingHeroes, hero));
|
||||
|
||||
vstd::erase(sleepingHeroes, hero);
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
const std::vector<const CGHeroInstance *> & PlayerLocalState::getWanderingHeroes()
|
||||
@@ -215,6 +207,8 @@ void PlayerLocalState::addWanderingHero(const CGHeroInstance * hero)
|
||||
|
||||
if (currentSelection == nullptr)
|
||||
setSelection(hero);
|
||||
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
void PlayerLocalState::removeWanderingHero(const CGHeroInstance * hero)
|
||||
@@ -225,7 +219,12 @@ void PlayerLocalState::removeWanderingHero(const CGHeroInstance * hero)
|
||||
if (hero == currentSelection)
|
||||
{
|
||||
auto const * nextHero = getNextWanderingHero(hero);
|
||||
setSelection(nextHero);
|
||||
if (nextHero)
|
||||
setSelection(nextHero);
|
||||
else if (!ownedTowns.empty())
|
||||
setSelection(ownedTowns.front());
|
||||
else
|
||||
setSelection(nullptr);
|
||||
}
|
||||
|
||||
vstd::erase(wanderingHeroes, hero);
|
||||
@@ -236,6 +235,8 @@ void PlayerLocalState::removeWanderingHero(const CGHeroInstance * hero)
|
||||
|
||||
if (currentSelection == nullptr && !ownedTowns.empty())
|
||||
setSelection(ownedTowns.front());
|
||||
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
void PlayerLocalState::swapWanderingHero(size_t pos1, size_t pos2)
|
||||
@@ -244,6 +245,8 @@ void PlayerLocalState::swapWanderingHero(size_t pos1, size_t pos2)
|
||||
std::swap(wanderingHeroes.at(pos1), wanderingHeroes.at(pos2));
|
||||
|
||||
adventureInt->onHeroOrderChanged();
|
||||
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
const std::vector<const CGTownInstance *> & PlayerLocalState::getOwnedTowns()
|
||||
@@ -266,6 +269,8 @@ void PlayerLocalState::addOwnedTown(const CGTownInstance * town)
|
||||
|
||||
if (currentSelection == nullptr)
|
||||
setSelection(town);
|
||||
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
void PlayerLocalState::removeOwnedTown(const CGTownInstance * town)
|
||||
@@ -282,6 +287,8 @@ void PlayerLocalState::removeOwnedTown(const CGTownInstance * town)
|
||||
|
||||
if (currentSelection == nullptr && !ownedTowns.empty())
|
||||
setSelection(ownedTowns.front());
|
||||
|
||||
syncronizeState();
|
||||
}
|
||||
|
||||
void PlayerLocalState::swapOwnedTowns(size_t pos1, size_t pos2)
|
||||
@@ -289,5 +296,120 @@ void PlayerLocalState::swapOwnedTowns(size_t pos1, size_t pos2)
|
||||
assert(ownedTowns[pos1] && ownedTowns[pos2]);
|
||||
std::swap(ownedTowns.at(pos1), ownedTowns.at(pos2));
|
||||
|
||||
syncronizeState();
|
||||
|
||||
adventureInt->onTownOrderChanged();
|
||||
}
|
||||
|
||||
void PlayerLocalState::syncronizeState()
|
||||
{
|
||||
JsonNode data;
|
||||
serialize(data);
|
||||
owner.cb->saveLocalState(data);
|
||||
}
|
||||
|
||||
void PlayerLocalState::serialize(JsonNode & dest) const
|
||||
{
|
||||
dest.clear();
|
||||
|
||||
for (auto const * town : ownedTowns)
|
||||
{
|
||||
JsonNode record;
|
||||
record["id"].Integer() = town->id;
|
||||
dest["towns"].Vector().push_back(record);
|
||||
}
|
||||
|
||||
for (auto const * hero : wanderingHeroes)
|
||||
{
|
||||
JsonNode record;
|
||||
record["id"].Integer() = hero->id;
|
||||
if (vstd::contains(sleepingHeroes, hero))
|
||||
record["sleeping"].Bool() = true;
|
||||
|
||||
if (paths.count(hero))
|
||||
{
|
||||
record["path"]["x"].Integer() = paths.at(hero).lastNode().coord.x;
|
||||
record["path"]["y"].Integer() = paths.at(hero).lastNode().coord.y;
|
||||
record["path"]["z"].Integer() = paths.at(hero).lastNode().coord.z;
|
||||
}
|
||||
dest["heroes"].Vector().push_back(record);
|
||||
}
|
||||
dest["spellbook"]["pageBattle"].Integer() = spellbookSettings.spellbookLastPageBattle;
|
||||
dest["spellbook"]["pageAdvmap"].Integer() = spellbookSettings.spellbookLastPageAdvmap;
|
||||
dest["spellbook"]["tabBattle"].Integer() = spellbookSettings.spellbookLastTabBattle;
|
||||
dest["spellbook"]["tabAdvmap"].Integer() = spellbookSettings.spellbookLastTabAdvmap;
|
||||
|
||||
if (currentSelection)
|
||||
dest["currentSelection"].Integer() = currentSelection->id;
|
||||
}
|
||||
|
||||
void PlayerLocalState::deserialize(const JsonNode & source)
|
||||
{
|
||||
// this method must be called after player state has been initialized
|
||||
assert(currentSelection != nullptr);
|
||||
assert(!ownedTowns.empty() || wanderingHeroes.empty());
|
||||
|
||||
auto oldHeroes = wanderingHeroes;
|
||||
auto oldTowns = ownedTowns;
|
||||
|
||||
paths.clear();
|
||||
sleepingHeroes.clear();
|
||||
wanderingHeroes.clear();
|
||||
ownedTowns.clear();
|
||||
|
||||
for (auto const & town : source["towns"].Vector())
|
||||
{
|
||||
ObjectInstanceID objID(town["id"].Integer());
|
||||
const CGTownInstance * townPtr = owner.cb->getTown(objID);
|
||||
|
||||
if (!townPtr)
|
||||
continue;
|
||||
|
||||
if (!vstd::contains(oldTowns, townPtr))
|
||||
continue;
|
||||
|
||||
ownedTowns.push_back(townPtr);
|
||||
vstd::erase(oldTowns, townPtr);
|
||||
}
|
||||
|
||||
for (auto const & hero : source["heroes"].Vector())
|
||||
{
|
||||
ObjectInstanceID objID(hero["id"].Integer());
|
||||
const CGHeroInstance * heroPtr = owner.cb->getHero(objID);
|
||||
|
||||
if (!heroPtr)
|
||||
continue;
|
||||
|
||||
if (!vstd::contains(oldHeroes, heroPtr))
|
||||
continue;
|
||||
|
||||
wanderingHeroes.push_back(heroPtr);
|
||||
vstd::erase(oldHeroes, heroPtr);
|
||||
|
||||
if (hero["sleeping"].Bool())
|
||||
sleepingHeroes.push_back(heroPtr);
|
||||
|
||||
if (hero["path"]["x"].isNumber() && hero["path"]["y"].isNumber() && hero["path"]["z"].isNumber())
|
||||
{
|
||||
int3 pathTarget(hero["path"]["x"].Integer(), hero["path"]["y"].Integer(), hero["path"]["z"].Integer());
|
||||
setPath(heroPtr, pathTarget);
|
||||
}
|
||||
}
|
||||
|
||||
spellbookSettings.spellbookLastPageBattle = source["spellbook"]["pageBattle"].Integer();
|
||||
spellbookSettings.spellbookLastPageAdvmap = source["spellbook"]["pageAdvmap"].Integer();
|
||||
spellbookSettings.spellbookLastTabBattle = source["spellbook"]["tabBattle"].Integer();
|
||||
spellbookSettings.spellbookLastTabAdvmap = source["spellbook"]["tabAdvmap"].Integer();
|
||||
|
||||
// append any owned heroes / towns that were not present in loaded state
|
||||
wanderingHeroes.insert(wanderingHeroes.end(), oldHeroes.begin(), oldHeroes.end());
|
||||
ownedTowns.insert(ownedTowns.end(), oldTowns.begin(), oldTowns.end());
|
||||
|
||||
//FIXME: broken, anything that is selected in here will be overwritten on NewTurn pack
|
||||
// ObjectInstanceID selectedObjectID(source["currentSelection"].Integer());
|
||||
// const CGObjectInstance * objectPtr = owner.cb->getObjInstance(selectedObjectID);
|
||||
// const CArmedInstance * armyPtr = dynamic_cast<const CArmedInstance*>(objectPtr);
|
||||
//
|
||||
// if (armyPtr)
|
||||
// setSelection(armyPtr);
|
||||
}
|
||||
|
@@ -14,6 +14,7 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
class CGHeroInstance;
|
||||
class CGTownInstance;
|
||||
class CArmedInstance;
|
||||
class JsonNode;
|
||||
struct CGPath;
|
||||
class int3;
|
||||
|
||||
@@ -21,6 +22,15 @@ VCMI_LIB_NAMESPACE_END
|
||||
|
||||
class CPlayerInterface;
|
||||
|
||||
struct PlayerSpellbookSetting
|
||||
{
|
||||
//on which page we left spellbook
|
||||
int spellbookLastPageBattle = 0;
|
||||
int spellbookLastPageAdvmap = 0;
|
||||
int spellbookLastTabBattle = 4;
|
||||
int spellbookLastTabAdvmap = 4;
|
||||
};
|
||||
|
||||
/// Class that contains potentially serializeable state of a local player
|
||||
class PlayerLocalState
|
||||
{
|
||||
@@ -34,18 +44,10 @@ class PlayerLocalState
|
||||
std::vector<const CGHeroInstance *> wanderingHeroes; //our heroes on the adventure map (not the garrisoned ones)
|
||||
std::vector<const CGTownInstance *> ownedTowns; //our towns on the adventure map
|
||||
|
||||
void saveHeroPaths(std::map<const CGHeroInstance *, int3> & paths);
|
||||
void loadHeroPaths(std::map<const CGHeroInstance *, int3> & paths);
|
||||
PlayerSpellbookSetting spellbookSettings;
|
||||
|
||||
void syncronizeState();
|
||||
public:
|
||||
struct SpellbookLastSetting
|
||||
{
|
||||
//on which page we left spellbook
|
||||
int spellbookLastPageBattle = 0;
|
||||
int spellbookLastPageAdvmap = 0;
|
||||
int spellbookLastTabBattle = 4;
|
||||
int spellbookLastTabAdvmap = 4;
|
||||
} spellbookSettings;
|
||||
|
||||
explicit PlayerLocalState(CPlayerInterface & owner);
|
||||
|
||||
@@ -53,6 +55,9 @@ public:
|
||||
void setHeroAsleep(const CGHeroInstance * hero);
|
||||
void setHeroAwaken(const CGHeroInstance * hero);
|
||||
|
||||
const PlayerSpellbookSetting & getSpellbookSettings();
|
||||
void setSpellbookSettings(const PlayerSpellbookSetting & newSettings);
|
||||
|
||||
const std::vector<const CGTownInstance *> & getOwnedTowns();
|
||||
const CGTownInstance * getOwnedTown(size_t index);
|
||||
void addOwnedTown(const CGTownInstance * hero);
|
||||
@@ -81,6 +86,9 @@ public:
|
||||
const CGTownInstance * getCurrentTown() const;
|
||||
const CArmedInstance * getCurrentArmy() const;
|
||||
|
||||
void serialize(JsonNode & dest) const;
|
||||
void deserialize(const JsonNode & source);
|
||||
|
||||
/// Changes currently selected object
|
||||
void setSelection(const CArmedInstance *sel);
|
||||
};
|
||||
|
@@ -432,7 +432,7 @@ std::shared_ptr<CIntObject> CTownList::CTownItem::genSelection()
|
||||
|
||||
void CTownList::CTownItem::update()
|
||||
{
|
||||
size_t iconIndex = town->town->clientInfo.icons[town->hasFort()][town->built >= LOCPLINT->cb->getSettings().getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
|
||||
size_t iconIndex = town->getTown()->clientInfo.icons[town->hasFort()][town->built >= LOCPLINT->cb->getSettings().getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
|
||||
|
||||
picture->setFrame(iconIndex + 2);
|
||||
redraw();
|
||||
|
@@ -81,9 +81,9 @@ void MapAudioPlayer::addObject(const CGObjectInstance * obj)
|
||||
{
|
||||
for(int fy = 0; fy < obj->getHeight(); ++fy)
|
||||
{
|
||||
int3 currTile(obj->pos.x - fx, obj->pos.y - fy, obj->pos.z);
|
||||
int3 currTile(obj->anchorPos().x - fx, obj->anchorPos().y - fy, obj->anchorPos().z);
|
||||
|
||||
if(LOCPLINT->cb->isInTheMap(currTile) && obj->coveringAt(currTile.x, currTile.y))
|
||||
if(LOCPLINT->cb->isInTheMap(currTile) && obj->coveringAt(currTile))
|
||||
objects[currTile.z][currTile.x][currTile.y].push_back(obj->id);
|
||||
}
|
||||
}
|
||||
@@ -108,7 +108,7 @@ void MapAudioPlayer::addObject(const CGObjectInstance * obj)
|
||||
|
||||
for(const auto & tile : tiles)
|
||||
{
|
||||
int3 currTile = obj->pos + tile;
|
||||
int3 currTile = obj->anchorPos() + tile;
|
||||
|
||||
if(LOCPLINT->cb->isInTheMap(currTile))
|
||||
objects[currTile.z][currTile.x][currTile.y].push_back(obj->id);
|
||||
|
@@ -389,13 +389,13 @@ BattleHero::BattleHero(const BattleInterface & owner, const CGHeroInstance * her
|
||||
{
|
||||
AnimationPath animationPath;
|
||||
|
||||
if(!hero->type->battleImage.empty())
|
||||
animationPath = hero->type->battleImage;
|
||||
if(!hero->getHeroType()->battleImage.empty())
|
||||
animationPath = hero->getHeroType()->battleImage;
|
||||
else
|
||||
if(hero->gender == EHeroGender::FEMALE)
|
||||
animationPath = hero->type->heroClass->imageBattleFemale;
|
||||
animationPath = hero->getHeroClass()->imageBattleFemale;
|
||||
else
|
||||
animationPath = hero->type->heroClass->imageBattleMale;
|
||||
animationPath = hero->getHeroClass()->imageBattleMale;
|
||||
|
||||
animation = GH.renderHandler().loadAnimation(animationPath, EImageBlitMode::ALPHA);
|
||||
|
||||
@@ -1027,7 +1027,7 @@ void StackQueue::update()
|
||||
|
||||
int32_t StackQueue::getSiegeShooterIconID()
|
||||
{
|
||||
return owner.siegeController->getSiegedTown()->town->faction->getIndex();
|
||||
return owner.siegeController->getSiegedTown()->getFactionID().getNum();
|
||||
}
|
||||
|
||||
std::optional<uint32_t> StackQueue::getHoveredUnitIdIfAny() const
|
||||
|
@@ -58,14 +58,14 @@ ImagePath BattleSiegeController::getWallPieceImageName(EWallVisual::EWallVisual
|
||||
};
|
||||
};
|
||||
|
||||
const std::string & prefix = town->town->clientInfo.siegePrefix;
|
||||
const std::string & prefix = town->getTown()->clientInfo.siegePrefix;
|
||||
std::string addit = std::to_string(getImageIndex());
|
||||
|
||||
switch(what)
|
||||
{
|
||||
case EWallVisual::BACKGROUND_WALL:
|
||||
{
|
||||
auto faction = town->town->faction->getIndex();
|
||||
auto faction = town->getFactionID();
|
||||
|
||||
if (faction == ETownType::RAMPART || faction == ETownType::NECROPOLIS || faction == ETownType::DUNGEON || faction == ETownType::STRONGHOLD)
|
||||
return ImagePath::builtinTODO(prefix + "TPW1.BMP");
|
||||
@@ -111,7 +111,7 @@ ImagePath BattleSiegeController::getWallPieceImageName(EWallVisual::EWallVisual
|
||||
|
||||
void BattleSiegeController::showWallPiece(Canvas & canvas, EWallVisual::EWallVisual what)
|
||||
{
|
||||
auto & ci = town->town->clientInfo;
|
||||
auto & ci = town->getTown()->clientInfo;
|
||||
auto const & pos = ci.siegePositions[what];
|
||||
|
||||
if ( wallPieceImages[what] && pos.isValid())
|
||||
@@ -120,7 +120,7 @@ void BattleSiegeController::showWallPiece(Canvas & canvas, EWallVisual::EWallVis
|
||||
|
||||
ImagePath BattleSiegeController::getBattleBackgroundName() const
|
||||
{
|
||||
const std::string & prefix = town->town->clientInfo.siegePrefix;
|
||||
const std::string & prefix = town->getTown()->clientInfo.siegePrefix;
|
||||
return ImagePath::builtinTODO(prefix + "BACK.BMP");
|
||||
}
|
||||
|
||||
@@ -130,8 +130,8 @@ bool BattleSiegeController::getWallPieceExistence(EWallVisual::EWallVisual what)
|
||||
|
||||
switch (what)
|
||||
{
|
||||
case EWallVisual::MOAT: return fortifications.hasMoat && town->town->clientInfo.siegePositions.at(EWallVisual::MOAT).isValid();
|
||||
case EWallVisual::MOAT_BANK: return fortifications.hasMoat && town->town->clientInfo.siegePositions.at(EWallVisual::MOAT_BANK).isValid();
|
||||
case EWallVisual::MOAT: return fortifications.hasMoat && town->getTown()->clientInfo.siegePositions.at(EWallVisual::MOAT).isValid();
|
||||
case EWallVisual::MOAT_BANK: return fortifications.hasMoat && town->getTown()->clientInfo.siegePositions.at(EWallVisual::MOAT_BANK).isValid();
|
||||
case EWallVisual::KEEP_BATTLEMENT: return fortifications.citadelHealth > 0 && owner.getBattle()->battleGetWallState(EWallPart::KEEP) != EWallState::DESTROYED;
|
||||
case EWallVisual::UPPER_BATTLEMENT: return fortifications.upperTowerHealth > 0 && owner.getBattle()->battleGetWallState(EWallPart::UPPER_TOWER) != EWallState::DESTROYED;
|
||||
case EWallVisual::BOTTOM_BATTLEMENT: return fortifications.lowerTowerHealth > 0 && owner.getBattle()->battleGetWallState(EWallPart::BOTTOM_TOWER) != EWallState::DESTROYED;
|
||||
@@ -218,8 +218,8 @@ Point BattleSiegeController::getTurretCreaturePosition( BattleHex position ) con
|
||||
if (posID != 0)
|
||||
{
|
||||
return {
|
||||
town->town->clientInfo.siegePositions[posID].x,
|
||||
town->town->clientInfo.siegePositions[posID].y
|
||||
town->getTown()->clientInfo.siegePositions[posID].x,
|
||||
town->getTown()->clientInfo.siegePositions[posID].y
|
||||
};
|
||||
}
|
||||
|
||||
|
@@ -250,8 +250,8 @@ void CGuiHandler::setStatusbar(std::shared_ptr<IStatusBar> newStatusBar)
|
||||
void CGuiHandler::onScreenResize(bool resolutionChanged)
|
||||
{
|
||||
if(resolutionChanged)
|
||||
{
|
||||
screenHandler().onScreenResize();
|
||||
}
|
||||
|
||||
windows().onScreenResize();
|
||||
CCS->curh->onScreenResize();
|
||||
}
|
||||
|
@@ -312,3 +312,8 @@ void CursorHandler::changeCursor(Cursor::ShowType newShowType)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CursorHandler::onScreenResize()
|
||||
{
|
||||
cursor->setImage(getCurrentImage(), getPivotOffset());
|
||||
}
|
||||
|
@@ -182,6 +182,7 @@ public:
|
||||
|
||||
void hide();
|
||||
void show();
|
||||
void onScreenResize();
|
||||
|
||||
/// change cursor's positions to (x, y)
|
||||
void cursorMove(const int & x, const int & y);
|
||||
|
@@ -835,9 +835,9 @@ OptionsTab::HandicapWindow::HandicapWindow()
|
||||
if(i == 0)
|
||||
{
|
||||
if(isIncome)
|
||||
labels.push_back(std::make_shared<CLabel>(xPos, 35, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->translate("core.jktext.32")));
|
||||
labels.push_back(std::make_shared<CLabel>(xPos, 38, FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->translate("core.jktext.32")));
|
||||
else if(isGrowth)
|
||||
labels.push_back(std::make_shared<CLabel>(xPos, 35, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.194")));
|
||||
labels.push_back(std::make_shared<CLabel>(xPos, 38, FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.194")));
|
||||
else
|
||||
anim.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), GameResID(resource), 0, 15 + xPos + (j == 0 ? 10 : 0), 35));
|
||||
}
|
||||
@@ -1035,14 +1035,13 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
|
||||
labelPlayerNameEdit = std::make_shared<CTextInput>(Rect(6, 3, 95, 15), EFonts::FONT_SMALL, ETextAlignment::CENTER, false);
|
||||
labelPlayerNameEdit->setText(name);
|
||||
}
|
||||
const auto & font = GH.renderHandler().loadFont(FONT_SMALL);
|
||||
|
||||
labelWhoCanPlay = std::make_shared<CMultiLineLabel>(Rect(6, 23, 45, font->getLineHeight()*2), EFonts::FONT_TINY, ETextAlignment::TOPCENTER, Colors::WHITE, CGI->generaltexth->arraytxt[206 + whoCanPlay]);
|
||||
labelWhoCanPlay = std::make_shared<CMultiLineLabel>(Rect(6, 21, 45, 26), EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->arraytxt[206 + whoCanPlay]);
|
||||
|
||||
auto hasHandicap = [this](){ return s->handicap.startBonus.empty() && s->handicap.percentIncome == 100 && s->handicap.percentGrowth == 100; };
|
||||
std::string labelHandicapText = hasHandicap() ? CGI->generaltexth->arraytxt[210] : MetaString::createFromTextID("vcmi.lobby.handicap").toString();
|
||||
labelHandicap = std::make_shared<CMultiLineLabel>(Rect(57, 24, 47, font->getLineHeight()*2), EFonts::FONT_TINY, ETextAlignment::TOPCENTER, Colors::WHITE, labelHandicapText);
|
||||
handicap = std::make_shared<LRClickableArea>(Rect(56, 24, 49, font->getLineHeight()*2), [](){
|
||||
labelHandicap = std::make_shared<CMultiLineLabel>(Rect(55, 23, 46, 24), EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, labelHandicapText);
|
||||
handicap = std::make_shared<LRClickableArea>(Rect(53, 23, 50, 24), [](){
|
||||
if(!CSH->isHost())
|
||||
return;
|
||||
|
||||
|
@@ -480,11 +480,11 @@ void SelectionTab::filter(int size, bool selectFirst)
|
||||
if((elem->mapHeader && (!size || elem->mapHeader->width == size)) || tabType == ESelectionScreen::campaignList)
|
||||
{
|
||||
if(showRandom)
|
||||
curFolder = "RANDOMMAPS/";
|
||||
curFolder = "RandomMaps/";
|
||||
|
||||
auto [folderName, baseFolder, parentExists, fileInFolder] = checkSubfolder(elem->originalFileURI);
|
||||
|
||||
if((showRandom && baseFolder != "RANDOMMAPS") || (!showRandom && baseFolder == "RANDOMMAPS"))
|
||||
if((showRandom && baseFolder != "RandomMaps") || (!showRandom && baseFolder == "RandomMaps"))
|
||||
continue;
|
||||
|
||||
if(parentExists && !showRandom)
|
||||
@@ -715,7 +715,7 @@ void SelectionTab::selectFileName(std::string fname)
|
||||
selectAbs(-1);
|
||||
|
||||
if(tabType == ESelectionScreen::saveGame && inputName->getText().empty())
|
||||
inputName->setText("NEWGAME");
|
||||
inputName->setText(CGI->generaltexth->translate("core.genrltxt.11"));
|
||||
}
|
||||
|
||||
void SelectionTab::selectNewestFile()
|
||||
@@ -808,7 +808,8 @@ void SelectionTab::parseMaps(const std::unordered_set<ResourcePath> & files)
|
||||
try
|
||||
{
|
||||
auto mapInfo = std::make_shared<ElementInfo>();
|
||||
mapInfo->mapInit(file.getName());
|
||||
mapInfo->mapInit(file.getOriginalName());
|
||||
mapInfo->name = mapInfo->getNameForList();
|
||||
|
||||
if (isMapSupported(*mapInfo))
|
||||
allItems.push_back(mapInfo);
|
||||
@@ -828,6 +829,7 @@ void SelectionTab::parseSaves(const std::unordered_set<ResourcePath> & files)
|
||||
{
|
||||
auto mapInfo = std::make_shared<ElementInfo>();
|
||||
mapInfo->saveInit(file);
|
||||
mapInfo->name = mapInfo->getNameForList();
|
||||
|
||||
// Filter out other game modes
|
||||
bool isCampaign = mapInfo->scenarioOptionsOfSave->mode == EStartMode::CAMPAIGN;
|
||||
@@ -872,9 +874,9 @@ void SelectionTab::parseCampaigns(const std::unordered_set<ResourcePath> & files
|
||||
for(auto & file : files)
|
||||
{
|
||||
auto info = std::make_shared<ElementInfo>();
|
||||
//allItems[i].date = std::asctime(std::localtime(&files[i].date));
|
||||
info->fileURI = file.getName();
|
||||
info->fileURI = file.getOriginalName();
|
||||
info->campaignInit();
|
||||
info->name = info->getNameForList();
|
||||
if(info->campaign)
|
||||
allItems.push_back(info);
|
||||
}
|
||||
@@ -988,6 +990,6 @@ void SelectionTab::ListItem::updateItem(std::shared_ptr<ElementInfo> info, bool
|
||||
iconLossCondition->setFrame(info->mapHeader->defeatIconIndex, 0);
|
||||
labelName->setMaxWidth(185);
|
||||
}
|
||||
labelName->setText(info->getNameForList());
|
||||
labelName->setText(info->name);
|
||||
labelName->setColor(color);
|
||||
}
|
||||
|
@@ -33,6 +33,7 @@ public:
|
||||
ElementInfo() : CMapInfo() { }
|
||||
~ElementInfo() { }
|
||||
std::string folderName = "";
|
||||
std::string name = "";
|
||||
bool isFolder = false;
|
||||
};
|
||||
|
||||
|
@@ -591,8 +591,8 @@ void MapRendererOverlay::renderTile(IMapRendererContext & context, Canvas & targ
|
||||
|
||||
if(context.objectTransparency(objectID, coordinates) > 0 && !context.isActiveHero(object))
|
||||
{
|
||||
visitable |= object->visitableAt(coordinates.x, coordinates.y);
|
||||
blocking |= object->blockingAt(coordinates.x, coordinates.y);
|
||||
visitable |= object->visitableAt(coordinates);
|
||||
blocking |= object->blockingAt(coordinates);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -120,7 +120,7 @@ size_t MapRendererBaseContext::objectGroupIndex(ObjectInstanceID objectID) const
|
||||
Point MapRendererBaseContext::objectImageOffset(ObjectInstanceID objectID, const int3 & coordinates) const
|
||||
{
|
||||
const CGObjectInstance * object = getObject(objectID);
|
||||
int3 offsetTiles(object->getPosition() - coordinates);
|
||||
int3 offsetTiles(object->anchorPos() - coordinates);
|
||||
return Point(offsetTiles) * Point(32, 32);
|
||||
}
|
||||
|
||||
@@ -498,7 +498,7 @@ size_t MapRendererWorldViewContext::overlayImageIndex(const int3 & coordinates)
|
||||
{
|
||||
const auto * object = getObject(objectID);
|
||||
|
||||
if(!object->visitableAt(coordinates.x, coordinates.y))
|
||||
if(!object->visitableAt(coordinates))
|
||||
continue;
|
||||
|
||||
ObjectPosInfo info(object);
|
||||
|
@@ -49,9 +49,9 @@ void MapRendererContextState::addObject(const CGObjectInstance * obj)
|
||||
{
|
||||
for(int fy = 0; fy < obj->getHeight(); ++fy)
|
||||
{
|
||||
int3 currTile(obj->pos.x - fx, obj->pos.y - fy, obj->pos.z);
|
||||
int3 currTile(obj->anchorPos().x - fx, obj->anchorPos().y - fy, obj->anchorPos().z);
|
||||
|
||||
if(LOCPLINT->cb->isInTheMap(currTile) && obj->coveringAt(currTile.x, currTile.y))
|
||||
if(LOCPLINT->cb->isInTheMap(currTile) && obj->coveringAt(currTile))
|
||||
{
|
||||
auto & container = objects[currTile.z][currTile.x][currTile.y];
|
||||
|
||||
@@ -73,7 +73,7 @@ void MapRendererContextState::addMovingObject(const CGObjectInstance * object, c
|
||||
{
|
||||
for(int y = yFrom; y <= yDest; ++y)
|
||||
{
|
||||
int3 currTile(x, y, object->pos.z);
|
||||
int3 currTile(x, y, object->anchorPos().z);
|
||||
|
||||
if(LOCPLINT->cb->isInTheMap(currTile))
|
||||
{
|
||||
|
@@ -317,7 +317,7 @@ bool MapViewController::isEventVisible(const CGObjectInstance * obj, const Playe
|
||||
if(obj->isVisitable())
|
||||
return context->isVisible(obj->visitablePos());
|
||||
else
|
||||
return context->isVisible(obj->pos);
|
||||
return context->isVisible(obj->anchorPos());
|
||||
}
|
||||
|
||||
bool MapViewController::isEventVisible(const CGHeroInstance * obj, const int3 & from, const int3 & dest)
|
||||
|
@@ -59,7 +59,7 @@ std::string CMapHandler::getTerrainDescr(const int3 & pos, bool rightClick) cons
|
||||
|
||||
for(const auto & object : map->objects)
|
||||
{
|
||||
if(object && object->coveringAt(pos.x, pos.y) && object->pos.z == pos.z && object->isTile2Terrain())
|
||||
if(object && object->coveringAt(pos) && object->isTile2Terrain())
|
||||
{
|
||||
result = object->getObjectName();
|
||||
break;
|
||||
@@ -103,15 +103,15 @@ bool CMapHandler::compareObjectBlitOrder(const CGObjectInstance * a, const CGObj
|
||||
|
||||
for(const auto & aOffset : a->getBlockedOffsets())
|
||||
{
|
||||
int3 testTarget = a->pos + aOffset + int3(0, 1, 0);
|
||||
if(b->blockingAt(testTarget.x, testTarget.y))
|
||||
int3 testTarget = a->anchorPos() + aOffset + int3(0, 1, 0);
|
||||
if(b->blockingAt(testTarget))
|
||||
bBlocksA += 1;
|
||||
}
|
||||
|
||||
for(const auto & bOffset : b->getBlockedOffsets())
|
||||
{
|
||||
int3 testTarget = b->pos + bOffset + int3(0, 1, 0);
|
||||
if(a->blockingAt(testTarget.x, testTarget.y))
|
||||
int3 testTarget = b->anchorPos() + bOffset + int3(0, 1, 0);
|
||||
if(a->blockingAt(testTarget))
|
||||
aBlocksB += 1;
|
||||
}
|
||||
|
||||
@@ -126,8 +126,8 @@ bool CMapHandler::compareObjectBlitOrder(const CGObjectInstance * a, const CGObj
|
||||
return aBlocksB < bBlocksA;
|
||||
|
||||
// object that don't have clear priority via tile blocking will appear based on their row
|
||||
if(a->pos.y != b->pos.y)
|
||||
return a->pos.y < b->pos.y;
|
||||
if(a->anchorPos().y != b->anchorPos().y)
|
||||
return a->anchorPos().y < b->anchorPos().y;
|
||||
|
||||
// heroes should appear on top of objects on the same tile
|
||||
if(b->ID==Obj::HERO && a->ID!=Obj::HERO)
|
||||
|
@@ -33,7 +33,9 @@ extern "C" {
|
||||
#include <libavformat/avformat.h>
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavutil/imgutils.h>
|
||||
#include <libavutil/opt.h>
|
||||
#include <libswscale/swscale.h>
|
||||
#include <libswresample/swresample.h>
|
||||
}
|
||||
|
||||
// Define a set of functions to read data
|
||||
@@ -501,32 +503,71 @@ std::pair<std::unique_ptr<ui8 []>, si64> CAudioInstance::extractAudio(const Vide
|
||||
int numChannels = codecpar->ch_layout.nb_channels;
|
||||
#endif
|
||||
|
||||
samples.reserve(44100 * 5); // arbitrary 5-second buffer
|
||||
samples.reserve(44100 * 5); // arbitrary 5-second buffer to reduce reallocations
|
||||
|
||||
for (;;)
|
||||
if (formatProperties.isPlanar && numChannels > 1)
|
||||
{
|
||||
decodeNextFrame();
|
||||
const AVFrame * frame = getCurrentFrame();
|
||||
// Format is 'planar', which is not supported by wav / SDL
|
||||
// Use swresample part of ffmpeg to deplanarize audio into format supported by wav / SDL
|
||||
|
||||
if (!frame)
|
||||
break;
|
||||
auto sourceFormat = static_cast<AVSampleFormat>(codecpar->format);
|
||||
auto targetFormat = av_get_alt_sample_fmt(sourceFormat, false);
|
||||
|
||||
int samplesToRead = frame->nb_samples * numChannels;
|
||||
int bytesToRead = samplesToRead * formatProperties.sampleSizeBytes;
|
||||
SwrContext * swr_ctx = swr_alloc();
|
||||
|
||||
if (formatProperties.isPlanar && numChannels > 1)
|
||||
#if (LIBAVUTIL_VERSION_MAJOR < 58)
|
||||
av_opt_set_channel_layout(swr_ctx, "in_chlayout", codecpar->channel_layout, 0);
|
||||
av_opt_set_channel_layout(swr_ctx, "out_chlayout", codecpar->channel_layout, 0);
|
||||
#else
|
||||
av_opt_set_chlayout(swr_ctx, "in_chlayout", &codecpar->ch_layout, 0);
|
||||
av_opt_set_chlayout(swr_ctx, "out_chlayout", &codecpar->ch_layout, 0);
|
||||
#endif
|
||||
av_opt_set_int(swr_ctx, "in_sample_rate", codecpar->sample_rate, 0);
|
||||
av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", sourceFormat, 0);
|
||||
av_opt_set_int(swr_ctx, "out_sample_rate", codecpar->sample_rate, 0);
|
||||
av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", targetFormat, 0);
|
||||
|
||||
int initResult = swr_init(swr_ctx);
|
||||
if (initResult < 0)
|
||||
throwFFmpegError(initResult);
|
||||
|
||||
std::vector<uint8_t> frameSamplesBuffer;
|
||||
for (;;)
|
||||
{
|
||||
// Workaround for lack of resampler
|
||||
// Currently, ffmpeg on conan systems is built without sws resampler
|
||||
// Because of that, and because wav format does not supports 'planar' formats from ffmpeg
|
||||
// we need to de-planarize it and convert to "normal" (non-planar / interleaved) stream
|
||||
samples.reserve(samples.size() + bytesToRead);
|
||||
for (int sm = 0; sm < frame->nb_samples; ++sm)
|
||||
for (int ch = 0; ch < numChannels; ++ch)
|
||||
samples.insert(samples.end(), frame->data[ch] + sm * formatProperties.sampleSizeBytes, frame->data[ch] + (sm+1) * formatProperties.sampleSizeBytes );
|
||||
decodeNextFrame();
|
||||
const AVFrame * frame = getCurrentFrame();
|
||||
|
||||
if (!frame)
|
||||
break;
|
||||
|
||||
size_t samplesToRead = frame->nb_samples * numChannels;
|
||||
size_t bytesToRead = samplesToRead * formatProperties.sampleSizeBytes;
|
||||
frameSamplesBuffer.resize(std::max(frameSamplesBuffer.size(), bytesToRead));
|
||||
uint8_t * frameSamplesPtr = frameSamplesBuffer.data();
|
||||
|
||||
int result = swr_convert(swr_ctx, &frameSamplesPtr, frame->nb_samples, (const uint8_t **)frame->data, frame->nb_samples);
|
||||
|
||||
if (result < 0)
|
||||
throwFFmpegError(result);
|
||||
|
||||
size_t samplesToCopy = result * numChannels;
|
||||
size_t bytesToCopy = samplesToCopy * formatProperties.sampleSizeBytes;
|
||||
samples.insert(samples.end(), frameSamplesBuffer.begin(), frameSamplesBuffer.begin() + bytesToCopy);
|
||||
}
|
||||
else
|
||||
swr_free(&swr_ctx);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
decodeNextFrame();
|
||||
const AVFrame * frame = getCurrentFrame();
|
||||
|
||||
if (!frame)
|
||||
break;
|
||||
|
||||
size_t samplesToRead = frame->nb_samples * numChannels;
|
||||
size_t bytesToRead = samplesToRead * formatProperties.sampleSizeBytes;
|
||||
samples.insert(samples.end(), frame->data[0], frame->data[0] + bytesToRead);
|
||||
}
|
||||
}
|
||||
@@ -567,9 +608,8 @@ std::pair<std::unique_ptr<ui8 []>, si64> CAudioInstance::extractAudio(const Vide
|
||||
bool CVideoPlayer::openAndPlayVideoImpl(const VideoPath & name, const Point & position, bool useOverlay, bool stopOnKey)
|
||||
{
|
||||
CVideoInstance instance;
|
||||
CAudioInstance audio;
|
||||
|
||||
auto extractedAudio = audio.extractAudio(name);
|
||||
auto extractedAudio = getAudio(name);
|
||||
int audioHandle = CCS->soundh->playSound(extractedAudio);
|
||||
|
||||
if (!instance.openInput(name))
|
||||
@@ -643,6 +683,15 @@ std::unique_ptr<IVideoInstance> CVideoPlayer::open(const VideoPath & name, float
|
||||
|
||||
std::pair<std::unique_ptr<ui8[]>, si64> CVideoPlayer::getAudio(const VideoPath & videoToOpen)
|
||||
{
|
||||
AudioPath audioPath = videoToOpen.toType<EResType::SOUND>();
|
||||
AudioPath audioPathVideoDir = audioPath.addPrefix("VIDEO/");
|
||||
|
||||
if(CResourceHandler::get()->existsResource(audioPath))
|
||||
return CResourceHandler::get()->load(audioPath)->readAll();
|
||||
|
||||
if(CResourceHandler::get()->existsResource(audioPathVideoDir))
|
||||
return CResourceHandler::get()->load(audioPathVideoDir)->readAll();
|
||||
|
||||
CAudioInstance audio;
|
||||
return audio.extractAudio(videoToOpen);
|
||||
}
|
||||
|
@@ -18,6 +18,10 @@
|
||||
#include "../render/IRenderHandler.h"
|
||||
|
||||
#include "../lib/filesystem/Filesystem.h"
|
||||
#include "../lib/GameSettings.h"
|
||||
#include "../lib/IGameSettings.h"
|
||||
#include "../lib/json/JsonNode.h"
|
||||
#include "../lib/VCMI_Lib.h"
|
||||
|
||||
void AssetGenerator::generateAll()
|
||||
{
|
||||
@@ -138,16 +142,17 @@ void AssetGenerator::createPlayerColoredBackground(const PlayerColor & player)
|
||||
|
||||
std::shared_ptr<IImage> texture = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
|
||||
|
||||
// Color transform to make color of brown DIBOX.PCX texture match color of specified player
|
||||
// transform to make color of brown DIBOX.PCX texture match color of specified player
|
||||
auto filterSettings = VLC->settingsHandler->getFullConfig()["interface"]["playerColoredBackground"];
|
||||
static const std::array<ColorFilter, PlayerColor::PLAYER_LIMIT_I> filters = {
|
||||
ColorFilter::genRangeShifter( 0.25, 0, 0, 1.25, 0.00, 0.00 ), // red
|
||||
ColorFilter::genRangeShifter( 0, 0, 0, 0.45, 1.20, 4.50 ), // blue
|
||||
ColorFilter::genRangeShifter( 0.40, 0.27, 0.23, 1.10, 1.20, 1.15 ), // tan
|
||||
ColorFilter::genRangeShifter( -0.27, 0.10, -0.27, 0.70, 1.70, 0.70 ), // green
|
||||
ColorFilter::genRangeShifter( 0.47, 0.17, -0.27, 1.60, 1.20, 0.70 ), // orange
|
||||
ColorFilter::genRangeShifter( 0.12, -0.1, 0.25, 1.15, 1.20, 2.20 ), // purple
|
||||
ColorFilter::genRangeShifter( -0.13, 0.23, 0.23, 0.90, 1.20, 2.20 ), // teal
|
||||
ColorFilter::genRangeShifter( 0.44, 0.15, 0.25, 1.00, 1.00, 1.75 ) // pink
|
||||
ColorFilter::genRangeShifter( filterSettings["red" ].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["blue" ].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["tan" ].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["green" ].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["orange"].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["purple"].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["teal" ].convertTo<std::vector<float>>() ),
|
||||
ColorFilter::genRangeShifter( filterSettings["pink" ].convertTo<std::vector<float>>() )
|
||||
};
|
||||
|
||||
assert(player.isValidPlayer());
|
||||
|
@@ -70,6 +70,13 @@ ColorFilter ColorFilter::genRangeShifter( float minR, float minG, float minB, fl
|
||||
1.f);
|
||||
}
|
||||
|
||||
ColorFilter ColorFilter::genRangeShifter( std::vector<float> parameters )
|
||||
{
|
||||
assert(std::size(parameters) == 6);
|
||||
|
||||
return genRangeShifter(parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], parameters[5]);
|
||||
}
|
||||
|
||||
ColorFilter ColorFilter::genMuxerShifter( ChannelMuxer r, ChannelMuxer g, ChannelMuxer b, float a )
|
||||
{
|
||||
return ColorFilter(r, g, b, a);
|
||||
|
@@ -44,6 +44,7 @@ public:
|
||||
|
||||
/// Generates object that transforms each channel independently
|
||||
static ColorFilter genRangeShifter( float minR, float minG, float minB, float maxR, float maxG, float maxB );
|
||||
static ColorFilter genRangeShifter( std::vector<float> parameters );
|
||||
|
||||
/// Generates object that performs arbitrary mixing between any channels
|
||||
static ColorFilter genMuxerShifter( ChannelMuxer r, ChannelMuxer g, ChannelMuxer b, float a );
|
||||
|
@@ -44,6 +44,8 @@ public:
|
||||
/// Dimensions of logical output. Can be different if scaling is used
|
||||
virtual Point getLogicalResolution() const = 0;
|
||||
|
||||
virtual int getInterfaceScalingPercentage() const = 0;
|
||||
|
||||
virtual int getScalingFactor() const = 0;
|
||||
|
||||
/// Window has focus
|
||||
|
@@ -11,11 +11,14 @@
|
||||
#include "StdInc.h"
|
||||
#include "CursorHardware.h"
|
||||
|
||||
#include "SDL_Extensions.h"
|
||||
|
||||
#include "../gui/CGuiHandler.h"
|
||||
#include "../render/IScreenHandler.h"
|
||||
#include "../render/Colors.h"
|
||||
#include "../render/IImage.h"
|
||||
#include "SDL_Extensions.h"
|
||||
|
||||
#include "../../lib/CConfigHandler.h"
|
||||
|
||||
#include <SDL_render.h>
|
||||
#include <SDL_events.h>
|
||||
@@ -45,19 +48,28 @@ void CursorHardware::setVisible(bool on)
|
||||
|
||||
void CursorHardware::setImage(std::shared_ptr<IImage> image, const Point & pivotOffset)
|
||||
{
|
||||
auto cursorSurface = CSDL_Ext::newSurface(image->dimensions() * GH.screenHandler().getScalingFactor());
|
||||
int videoScalingSettings = GH.screenHandler().getInterfaceScalingPercentage();
|
||||
float cursorScalingSettings = settings["video"]["cursorScalingFactor"].Float();
|
||||
int cursorScalingPercent = videoScalingSettings * cursorScalingSettings;
|
||||
Point cursorDimensions = image->dimensions() * GH.screenHandler().getScalingFactor();
|
||||
Point cursorDimensionsScaled = image->dimensions() * cursorScalingPercent / 100;
|
||||
Point pivotOffsetScaled = pivotOffset * cursorScalingPercent / 100 / GH.screenHandler().getScalingFactor();
|
||||
|
||||
auto cursorSurface = CSDL_Ext::newSurface(cursorDimensions);
|
||||
|
||||
CSDL_Ext::fillSurface(cursorSurface, CSDL_Ext::toSDL(Colors::TRANSPARENCY));
|
||||
|
||||
image->draw(cursorSurface, Point(0,0));
|
||||
auto cursorSurfaceScaled = CSDL_Ext::scaleSurface(cursorSurface, cursorDimensionsScaled.x, cursorDimensionsScaled.y );
|
||||
|
||||
auto oldCursor = cursor;
|
||||
cursor = SDL_CreateColorCursor(cursorSurface, pivotOffset.x, pivotOffset.y);
|
||||
cursor = SDL_CreateColorCursor(cursorSurfaceScaled, pivotOffsetScaled.x, pivotOffsetScaled.y);
|
||||
|
||||
if (!cursor)
|
||||
logGlobal->error("Failed to set cursor! SDL says %s", SDL_GetError());
|
||||
|
||||
SDL_FreeSurface(cursorSurface);
|
||||
SDL_FreeSurface(cursorSurfaceScaled);
|
||||
|
||||
GH.dispatchMainThread([this, oldCursor](){
|
||||
SDL_SetCursor(cursor);
|
||||
|
@@ -84,19 +84,39 @@ Rect ScreenHandler::convertLogicalPointsToWindow(const Rect & input) const
|
||||
return result;
|
||||
}
|
||||
|
||||
int ScreenHandler::getInterfaceScalingPercentage() const
|
||||
{
|
||||
auto [minimalScaling, maximalScaling] = getSupportedScalingRange();
|
||||
|
||||
int userScaling = settings["video"]["resolution"]["scaling"].Integer();
|
||||
|
||||
if (userScaling == 0) // autodetection
|
||||
{
|
||||
#ifdef VCMI_MOBILE
|
||||
// for mobiles - stay at maximum scaling unless we have large screen
|
||||
// might be better to check screen DPI / physical dimensions, but way more complex, and may result in different edge cases, e.g. chromebooks / tv's
|
||||
int preferredMinimalScaling = 200;
|
||||
#else
|
||||
// for PC - avoid downscaling if possible
|
||||
int preferredMinimalScaling = 100;
|
||||
#endif
|
||||
// prefer a little below maximum - to give space for extended UI
|
||||
int preferredMaximalScaling = maximalScaling * 10 / 12;
|
||||
userScaling = std::max(std::min(maximalScaling, preferredMinimalScaling), preferredMaximalScaling);
|
||||
}
|
||||
|
||||
int scaling = std::clamp(userScaling, minimalScaling, maximalScaling);
|
||||
return scaling;
|
||||
}
|
||||
|
||||
Point ScreenHandler::getPreferredLogicalResolution() const
|
||||
{
|
||||
Point renderResolution = getRenderResolution();
|
||||
double reservedAreaWidth = settings["video"]["reservedWidth"].Float();
|
||||
|
||||
int scaling = getInterfaceScalingPercentage();
|
||||
Point availableResolution = Point(renderResolution.x * (1 - reservedAreaWidth), renderResolution.y);
|
||||
|
||||
auto [minimalScaling, maximalScaling] = getSupportedScalingRange();
|
||||
|
||||
int userScaling = settings["video"]["resolution"]["scaling"].Integer();
|
||||
int scaling = std::clamp(userScaling, minimalScaling, maximalScaling);
|
||||
|
||||
Point logicalResolution = availableResolution * 100.0 / scaling;
|
||||
|
||||
return logicalResolution;
|
||||
}
|
||||
|
||||
@@ -335,25 +355,22 @@ EUpscalingFilter ScreenHandler::loadUpscalingFilter() const
|
||||
if (filter != EUpscalingFilter::AUTO)
|
||||
return filter;
|
||||
|
||||
// for now - always fallback to no filter
|
||||
return EUpscalingFilter::NONE;
|
||||
|
||||
// else - autoselect
|
||||
// Point outputResolution = getRenderResolution();
|
||||
// Point logicalResolution = getPreferredLogicalResolution();
|
||||
//
|
||||
// float scaleX = static_cast<float>(outputResolution.x) / logicalResolution.x;
|
||||
// float scaleY = static_cast<float>(outputResolution.x) / logicalResolution.x;
|
||||
// float scaling = std::min(scaleX, scaleY);
|
||||
//
|
||||
// if (scaling <= 1.0f)
|
||||
// return EUpscalingFilter::NONE;
|
||||
// if (scaling <= 2.0f)
|
||||
// return EUpscalingFilter::XBRZ_2;
|
||||
// if (scaling <= 3.0f)
|
||||
// return EUpscalingFilter::XBRZ_3;
|
||||
//
|
||||
// return EUpscalingFilter::XBRZ_4;
|
||||
Point outputResolution = getRenderResolution();
|
||||
Point logicalResolution = getPreferredLogicalResolution();
|
||||
|
||||
float scaleX = static_cast<float>(outputResolution.x) / logicalResolution.x;
|
||||
float scaleY = static_cast<float>(outputResolution.x) / logicalResolution.x;
|
||||
float scaling = std::min(scaleX, scaleY);
|
||||
|
||||
if (scaling <= 1.001f)
|
||||
return EUpscalingFilter::NONE; // running at original resolution or even lower than that - no need for xbrz
|
||||
if (scaling <= 2.001f)
|
||||
return EUpscalingFilter::XBRZ_2; // resolutions below 1200p (including 1080p / FullHD)
|
||||
if (scaling <= 3.001f)
|
||||
return EUpscalingFilter::XBRZ_3; // resolutions below 2400p (including 1440p and 2160p / 4K)
|
||||
|
||||
return EUpscalingFilter::XBRZ_4; // Only for massive displays, e.g. 8K
|
||||
}
|
||||
|
||||
void ScreenHandler::selectUpscalingFilter()
|
||||
|
@@ -112,6 +112,8 @@ public:
|
||||
|
||||
int getScalingFactor() const final;
|
||||
|
||||
int getInterfaceScalingPercentage() const final;
|
||||
|
||||
std::vector<Point> getSupportedResolutions() const final;
|
||||
std::vector<Point> getSupportedResolutions(int displayIndex) const;
|
||||
std::tuple<int, int> getSupportedScalingRange() const final;
|
||||
|
@@ -70,6 +70,7 @@ void CComponent::init(ComponentType Type, ComponentSubType Subtype, std::optiona
|
||||
customSubtitle = ValText;
|
||||
size = imageSize;
|
||||
font = fnt;
|
||||
newLine = false;
|
||||
|
||||
assert(size < sizeInvalid);
|
||||
|
||||
@@ -471,7 +472,8 @@ void CComponentBox::placeComponents(bool selectable)
|
||||
|
||||
//start next row
|
||||
if ((pos.w != 0 && rows.back().width + comp->pos.w + distance > pos.w) // row is full
|
||||
|| rows.back().comps >= componentsInRow)
|
||||
|| rows.back().comps >= componentsInRow
|
||||
|| (prevComp && prevComp->newLine))
|
||||
{
|
||||
prevComp = nullptr;
|
||||
rows.push_back (RowData (0,0,0));
|
||||
|
@@ -52,6 +52,7 @@ public:
|
||||
std::string customSubtitle;
|
||||
ESize size; //component size.
|
||||
EFonts font; //Font size of label
|
||||
bool newLine; //Line break after component
|
||||
|
||||
std::string getDescription() const;
|
||||
std::string getSubtitle() const;
|
||||
|
@@ -468,8 +468,8 @@ void CInteractableTownTooltip::init(const CGTownInstance * town)
|
||||
LOCPLINT->showTavernWindow(town, nullptr, QueryID::NONE);
|
||||
}
|
||||
}, [town]{
|
||||
if(!town->town->faction->getDescriptionTranslated().empty())
|
||||
CRClickPopup::createAndPush(town->town->faction->getDescriptionTranslated());
|
||||
if(!town->getFaction()->getDescriptionTranslated().empty())
|
||||
CRClickPopup::createAndPush(town->getFaction()->getDescriptionTranslated());
|
||||
});
|
||||
fastMarket = std::make_shared<LRClickableArea>(Rect(143, 31, 30, 34), []()
|
||||
{
|
||||
@@ -532,8 +532,7 @@ CreatureTooltip::CreatureTooltip(Point pos, const CGCreature * creature)
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
auto creatureID = creature->getCreature();
|
||||
int32_t creatureIconIndex = CGI->creatures()->getById(creatureID)->getIconIndex();
|
||||
int32_t creatureIconIndex = creature->getCreature()->getIconIndex();
|
||||
|
||||
creatureImage = std::make_shared<CAnimImage>(AnimationPath::builtin("TWCRPORT"), creatureIconIndex);
|
||||
creatureImage->center(Point(parent->pos.x + parent->pos.w / 2, parent->pos.y + creatureImage->pos.h / 2 + 11));
|
||||
@@ -633,7 +632,7 @@ CCreaturePic::CCreaturePic(int x, int y, const CCreature * cre, bool Big, bool A
|
||||
pos.x+=x;
|
||||
pos.y+=y;
|
||||
|
||||
auto faction = cre->getFaction();
|
||||
auto faction = cre->getFactionID();
|
||||
|
||||
assert(CGI->townh->size() > faction);
|
||||
|
||||
|
@@ -82,7 +82,7 @@ CBuildingRect::CBuildingRect(CCastleBuildings * Par, const CGTownInstance * Town
|
||||
|
||||
// special animation frame manipulation for castle shipyard with and without ship
|
||||
// done due to .def used in special way, not to animate building - first image is for shipyard without citadel moat, 2nd image is for including moat
|
||||
if(Town->town->faction->getId() == FactionID::CASTLE && Str->building &&
|
||||
if(Town->getFactionID() == FactionID::CASTLE && Str->building &&
|
||||
(Str->building->bid == BuildingID::SHIPYARD || Str->building->bid == BuildingID::SHIP))
|
||||
{
|
||||
if(Town->hasBuilt(BuildingID::CITADEL))
|
||||
@@ -107,7 +107,7 @@ const CBuilding * CBuildingRect::getBuilding()
|
||||
return nullptr;
|
||||
|
||||
if (str->hiddenUpgrade) // hidden upgrades, e.g. hordes - return base (dwelling for hordes)
|
||||
return town->town->buildings.at(str->building->getBase());
|
||||
return town->getTown()->buildings.at(str->building->getBase());
|
||||
|
||||
return str->building;
|
||||
}
|
||||
@@ -156,7 +156,7 @@ void CBuildingRect::showPopupWindow(const Point & cursorPosition)
|
||||
return;
|
||||
|
||||
BuildingID bid = getBuilding()->bid;
|
||||
const CBuilding *bld = town->town->buildings.at(bid);
|
||||
const CBuilding *bld = town->getTown()->buildings.at(bid);
|
||||
if (bid < BuildingID::DWELL_FIRST)
|
||||
{
|
||||
CRClickPopup::createAndPush(CInfoWindow::genText(bld->getNameTranslated(), bld->getDescriptionTranslated()),
|
||||
@@ -235,10 +235,10 @@ std::string CBuildingRect::getSubtitle()//hover text for building
|
||||
int bid = getBuilding()->bid;
|
||||
|
||||
if (bid<30)//non-dwellings - only building name
|
||||
return town->town->buildings.at(getBuilding()->bid)->getNameTranslated();
|
||||
return town->getTown()->buildings.at(getBuilding()->bid)->getNameTranslated();
|
||||
else//dwellings - recruit %creature%
|
||||
{
|
||||
auto & availableCreatures = town->creatures[(bid-30)%town->town->creatures.size()].second;
|
||||
auto & availableCreatures = town->creatures[(bid-30)%town->getTown()->creatures.size()].second;
|
||||
if(availableCreatures.size())
|
||||
{
|
||||
int creaID = availableCreatures.back();//taking last of available creatures
|
||||
@@ -566,7 +566,7 @@ CCastleBuildings::CCastleBuildings(const CGTownInstance* Town):
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
background = std::make_shared<CPicture>(town->town->clientInfo.townBackground);
|
||||
background = std::make_shared<CPicture>(town->getTown()->clientInfo.townBackground);
|
||||
background->needRefresh = true;
|
||||
background->getSurface()->setBlitMode(EImageBlitMode::OPAQUE);
|
||||
pos.w = background->pos.w;
|
||||
@@ -602,7 +602,7 @@ void CCastleBuildings::recreate()
|
||||
}
|
||||
}
|
||||
|
||||
for(const CStructure * structure : town->town->clientInfo.structures)
|
||||
for(const CStructure * structure : town->getTown()->clientInfo.structures)
|
||||
{
|
||||
if(!structure->building)
|
||||
{
|
||||
@@ -617,7 +617,7 @@ void CCastleBuildings::recreate()
|
||||
|
||||
for(auto & entry : groups)
|
||||
{
|
||||
const CBuilding * build = town->town->buildings.at(entry.first);
|
||||
const CBuilding * build = town->getTown()->buildings.at(entry.first);
|
||||
|
||||
const CStructure * toAdd = *boost::max_element(entry.second, [=](const CStructure * a, const CStructure * b)
|
||||
{
|
||||
@@ -648,7 +648,7 @@ void CCastleBuildings::recreate()
|
||||
void CCastleBuildings::addBuilding(BuildingID building)
|
||||
{
|
||||
//FIXME: implement faster method without complete recreation of town
|
||||
BuildingID base = town->town->buildings.at(building)->getBase();
|
||||
BuildingID base = town->getTown()->buildings.at(building)->getBase();
|
||||
|
||||
recreate();
|
||||
|
||||
@@ -687,7 +687,7 @@ void CCastleBuildings::buildingClicked(BuildingID building)
|
||||
BuildingID buildingToEnter = building;
|
||||
for(;;)
|
||||
{
|
||||
const CBuilding *b = town->town->buildings.find(buildingToEnter)->second;
|
||||
const CBuilding *b = town->getTown()->buildings.find(buildingToEnter)->second;
|
||||
|
||||
if (buildingTryActivateCustomUI(buildingToEnter, building))
|
||||
return;
|
||||
@@ -705,7 +705,7 @@ void CCastleBuildings::buildingClicked(BuildingID building)
|
||||
bool CCastleBuildings::buildingTryActivateCustomUI(BuildingID buildingToTest, BuildingID buildingTarget)
|
||||
{
|
||||
logGlobal->trace("You've clicked on %d", (int)buildingToTest.toEnum());
|
||||
const CBuilding *b = town->town->buildings.at(buildingToTest);
|
||||
const CBuilding *b = town->getTown()->buildings.at(buildingToTest);
|
||||
|
||||
if (town->getWarMachineInBuilding(buildingToTest).hasValue())
|
||||
{
|
||||
@@ -744,7 +744,7 @@ bool CCastleBuildings::buildingTryActivateCustomUI(BuildingID buildingToTest, Bu
|
||||
}
|
||||
}
|
||||
|
||||
if (town->rewardableBuildings.count(buildingToTest) && town->town->buildings.at(buildingToTest)->manualHeroVisit)
|
||||
if (town->rewardableBuildings.count(buildingToTest) && town->getTown()->buildings.at(buildingToTest)->manualHeroVisit)
|
||||
{
|
||||
enterRewardable(buildingToTest);
|
||||
return true;
|
||||
@@ -820,10 +820,10 @@ bool CCastleBuildings::buildingTryActivateCustomUI(BuildingID buildingToTest, Bu
|
||||
return false;
|
||||
|
||||
case BuildingSubID::PORTAL_OF_SUMMONING:
|
||||
if (town->creatures[town->town->creatures.size()].second.empty())//No creatures
|
||||
if (town->creatures[town->getTown()->creatures.size()].second.empty())//No creatures
|
||||
LOCPLINT->showInfoDialog(CGI->generaltexth->tcommands[30]);
|
||||
else
|
||||
enterDwelling(town->town->creatures.size());
|
||||
enterDwelling(town->getTown()->creatures.size());
|
||||
return true;
|
||||
|
||||
case BuildingSubID::BANK:
|
||||
@@ -850,7 +850,7 @@ void CCastleBuildings::enterRewardable(BuildingID building)
|
||||
{
|
||||
MetaString message;
|
||||
message.appendTextID("core.genrltxt.273"); // only visiting heroes may visit %s
|
||||
message.replaceTextID(town->town->buildings.at(building)->getNameTextID());
|
||||
message.replaceTextID(town->getTown()->buildings.at(building)->getNameTextID());
|
||||
|
||||
LOCPLINT->showInfoDialog(message.toString());
|
||||
}
|
||||
@@ -868,7 +868,7 @@ void CCastleBuildings::enterBlacksmith(BuildingID building, ArtifactID artifactI
|
||||
const CGHeroInstance *hero = town->visitingHero;
|
||||
if(!hero)
|
||||
{
|
||||
LOCPLINT->showInfoDialog(boost::str(boost::format(CGI->generaltexth->allTexts[273]) % town->town->buildings.find(building)->second->getNameTranslated()));
|
||||
LOCPLINT->showInfoDialog(boost::str(boost::format(CGI->generaltexth->allTexts[273]) % town->getTown()->buildings.find(building)->second->getNameTranslated()));
|
||||
return;
|
||||
}
|
||||
auto art = artifactID.toArtifact();
|
||||
@@ -897,8 +897,8 @@ void CCastleBuildings::enterBlacksmith(BuildingID building, ArtifactID artifactI
|
||||
|
||||
void CCastleBuildings::enterBuilding(BuildingID building)
|
||||
{
|
||||
std::vector<std::shared_ptr<CComponent>> comps(1, std::make_shared<CComponent>(ComponentType::BUILDING, BuildingTypeUniqueID(town->getFaction(), building)));
|
||||
LOCPLINT->showInfoDialog( town->town->buildings.find(building)->second->getDescriptionTranslated(), comps);
|
||||
std::vector<std::shared_ptr<CComponent>> comps(1, std::make_shared<CComponent>(ComponentType::BUILDING, BuildingTypeUniqueID(town->getFactionID(), building)));
|
||||
LOCPLINT->showInfoDialog( town->getTown()->buildings.find(building)->second->getDescriptionTranslated(), comps);
|
||||
}
|
||||
|
||||
void CCastleBuildings::enterCastleGate()
|
||||
@@ -915,20 +915,20 @@ void CCastleBuildings::enterCastleGate()
|
||||
{
|
||||
const CGTownInstance *t = Town;
|
||||
if (t->id != this->town->id && t->visitingHero == nullptr && //another town, empty and this is
|
||||
t->town->faction->getId() == town->town->faction->getId() && //the town of the same faction
|
||||
t->getFactionID() == town->getFactionID() && //the town of the same faction
|
||||
t->hasBuilt(BuildingSubID::CASTLE_GATE)) //and the town has a castle gate
|
||||
{
|
||||
availableTowns.push_back(t->id.getNum());//add to the list
|
||||
if(settings["general"]["enableUiEnhancements"].Bool())
|
||||
{
|
||||
auto image = GH.renderHandler().loadImage(AnimationPath::builtin("ITPA"), t->town->clientInfo.icons[t->hasFort()][false] + 2, 0, EImageBlitMode::OPAQUE);
|
||||
auto image = GH.renderHandler().loadImage(AnimationPath::builtin("ITPA"), t->getTown()->clientInfo.icons[t->hasFort()][false] + 2, 0, EImageBlitMode::OPAQUE);
|
||||
image->scaleTo(Point(35, 23));
|
||||
images.push_back(image);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto gateIcon = std::make_shared<CAnimImage>(town->town->clientInfo.buildingsIcons, BuildingID::CASTLE_GATE);//will be deleted by selection window
|
||||
auto gateIcon = std::make_shared<CAnimImage>(town->getTown()->clientInfo.buildingsIcons, BuildingID::CASTLE_GATE);//will be deleted by selection window
|
||||
auto wnd = std::make_shared<CObjectListWindow>(availableTowns, gateIcon, CGI->generaltexth->jktexts[40],
|
||||
CGI->generaltexth->jktexts[41], std::bind (&CCastleInterface::castleTeleport, LOCPLINT->castleInt, _1), 0, images);
|
||||
wnd->onPopup = [availableTowns](int index) { CRClickPopup::createAndPush(LOCPLINT->cb->getObjInstance(ObjectInstanceID(availableTowns[index])), GH.getCursorPosition()); };
|
||||
@@ -940,7 +940,7 @@ void CCastleBuildings::enterDwelling(int level)
|
||||
if (level < 0 || level >= town->creatures.size() || town->creatures[level].second.empty())
|
||||
{
|
||||
assert(0);
|
||||
logGlobal->error("Attempt to enter into invalid dwelling of level %d in town %s (%s)", level, town->getNameTranslated(), town->town->faction->getNameTranslated());
|
||||
logGlobal->error("Attempt to enter into invalid dwelling of level %d in town %s (%s)", level, town->getNameTranslated(), town->getFaction()->getNameTranslated());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -954,8 +954,8 @@ void CCastleBuildings::enterDwelling(int level)
|
||||
void CCastleBuildings::enterToTheQuickRecruitmentWindow()
|
||||
{
|
||||
const auto beginIt = town->creatures.cbegin();
|
||||
const auto afterLastIt = town->creatures.size() > town->town->creatures.size()
|
||||
? std::next(beginIt, town->town->creatures.size())
|
||||
const auto afterLastIt = town->creatures.size() > town->getTown()->creatures.size()
|
||||
? std::next(beginIt, town->getTown()->creatures.size())
|
||||
: town->creatures.cend();
|
||||
const auto hasSomeoneToRecruit = std::any_of(beginIt, afterLastIt,
|
||||
[](const auto & creatureInfo) { return creatureInfo.first > 0; });
|
||||
@@ -967,8 +967,8 @@ void CCastleBuildings::enterToTheQuickRecruitmentWindow()
|
||||
|
||||
void CCastleBuildings::enterFountain(const BuildingID & building, BuildingSubID::EBuildingSubID subID, BuildingID upgrades)
|
||||
{
|
||||
std::vector<std::shared_ptr<CComponent>> comps(1, std::make_shared<CComponent>(ComponentType::BUILDING, BuildingTypeUniqueID(town->getFaction(), building)));
|
||||
std::string descr = town->town->buildings.find(building)->second->getDescriptionTranslated();
|
||||
std::vector<std::shared_ptr<CComponent>> comps(1, std::make_shared<CComponent>(ComponentType::BUILDING, BuildingTypeUniqueID(town->getFactionID(), building)));
|
||||
std::string descr = town->getTown()->buildings.find(building)->second->getDescriptionTranslated();
|
||||
std::string hasNotProduced;
|
||||
std::string hasProduced;
|
||||
|
||||
@@ -977,10 +977,10 @@ void CCastleBuildings::enterFountain(const BuildingID & building, BuildingSubID:
|
||||
|
||||
bool isMysticPondOrItsUpgrade = subID == BuildingSubID::MYSTIC_POND
|
||||
|| (upgrades != BuildingID::NONE
|
||||
&& town->town->buildings.find(BuildingID(upgrades))->second->subId == BuildingSubID::MYSTIC_POND);
|
||||
&& town->getTown()->buildings.find(BuildingID(upgrades))->second->subId == BuildingSubID::MYSTIC_POND);
|
||||
|
||||
if(upgrades != BuildingID::NONE)
|
||||
descr += "\n\n"+town->town->buildings.find(BuildingID(upgrades))->second->getDescriptionTranslated();
|
||||
descr += "\n\n"+town->getTown()->buildings.find(BuildingID(upgrades))->second->getDescriptionTranslated();
|
||||
|
||||
if(isMysticPondOrItsUpgrade) //for vanila Rampart like towns
|
||||
{
|
||||
@@ -1056,7 +1056,7 @@ void CCastleBuildings::enterTownHall()
|
||||
|
||||
void CCastleBuildings::openMagesGuild()
|
||||
{
|
||||
auto mageGuildBackground = LOCPLINT->castleInt->town->town->clientInfo.guildBackground;
|
||||
auto mageGuildBackground = LOCPLINT->castleInt->town->getTown()->clientInfo.guildBackground;
|
||||
GH.windows().createAndPushWindow<CMageGuildScreen>(LOCPLINT->castleInt, mageGuildBackground);
|
||||
}
|
||||
|
||||
@@ -1247,7 +1247,7 @@ CTownInfo::CTownInfo(int posX, int posY, const CGTownInstance * Town, bool townH
|
||||
return;//FIXME: suspicious statement, fix or comment
|
||||
picture = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMCL.DEF"), town->fortLevel()-1);
|
||||
}
|
||||
building = town->town->buildings.at(BuildingID(buildID));
|
||||
building = town->getTown()->buildings.at(BuildingID(buildID));
|
||||
pos = picture->pos;
|
||||
}
|
||||
|
||||
@@ -1322,7 +1322,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
|
||||
recreateIcons();
|
||||
if (!from)
|
||||
adventureInt->onAudioPaused();
|
||||
CCS->musich->playMusicFromSet("faction", town->town->faction->getJsonKey(), true, false);
|
||||
CCS->musich->playMusicFromSet("faction", town->getFaction()->getJsonKey(), true, false);
|
||||
}
|
||||
|
||||
CCastleInterface::~CCastleInterface()
|
||||
@@ -1403,7 +1403,7 @@ void CCastleInterface::removeBuilding(BuildingID bid)
|
||||
void CCastleInterface::recreateIcons()
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
size_t iconIndex = town->town->clientInfo.icons[town->hasFort()][town->built >= LOCPLINT->cb->getSettings().getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
|
||||
size_t iconIndex = town->getTown()->clientInfo.icons[town->hasFort()][town->built >= LOCPLINT->cb->getSettings().getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
|
||||
|
||||
icon->setFrame(iconIndex);
|
||||
TResources townIncome = town->dailyIncome();
|
||||
@@ -1425,8 +1425,8 @@ void CCastleInterface::recreateIcons()
|
||||
if(town->hasBuilt(BuildingID::TAVERN))
|
||||
LOCPLINT->showTavernWindow(town, nullptr, QueryID::NONE);
|
||||
}, [this]{
|
||||
if(!town->town->faction->getDescriptionTranslated().empty())
|
||||
CRClickPopup::createAndPush(town->town->faction->getDescriptionTranslated());
|
||||
if(!town->getFaction()->getDescriptionTranslated().empty())
|
||||
CRClickPopup::createAndPush(town->getFaction()->getDescriptionTranslated());
|
||||
});
|
||||
|
||||
creainfo.clear();
|
||||
@@ -1527,7 +1527,7 @@ CHallInterface::CBuildingBox::CBuildingBox(int x, int y, const CGTownInstance *
|
||||
-1, -1, -1, 0, 0, 1, 2, -1, 1, 1, -1, -1
|
||||
};
|
||||
|
||||
icon = std::make_shared<CAnimImage>(town->town->clientInfo.buildingsIcons, building->bid, 0, 2, 2);
|
||||
icon = std::make_shared<CAnimImage>(town->getTown()->clientInfo.buildingsIcons, building->bid, 0, 2, 2);
|
||||
header = std::make_shared<CAnimImage>(AnimationPath::builtin("TPTHBAR"), panelIndex[static_cast<int>(state)], 0, 1, 73);
|
||||
if(iconIndex[static_cast<int>(state)] >=0)
|
||||
mark = std::make_shared<CAnimImage>(AnimationPath::builtin("TPTHCHK"), iconIndex[static_cast<int>(state)], 0, 136, 56);
|
||||
@@ -1569,7 +1569,7 @@ void CHallInterface::CBuildingBox::showPopupWindow(const Point & cursorPosition)
|
||||
}
|
||||
|
||||
CHallInterface::CHallInterface(const CGTownInstance * Town):
|
||||
CWindowObject(PLAYER_COLORED | BORDERED, Town->town->clientInfo.hallBackground),
|
||||
CWindowObject(PLAYER_COLORED | BORDERED, Town->getTown()->clientInfo.hallBackground),
|
||||
town(Town)
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
@@ -1581,10 +1581,10 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
|
||||
auto statusbarBackground = std::make_shared<CPicture>(background->getSurface(), barRect, 5, 556);
|
||||
statusbar = CGStatusBar::create(statusbarBackground);
|
||||
|
||||
title = std::make_shared<CLabel>(399, 12, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, town->town->buildings.at(BuildingID(town->hallLevel()+BuildingID::VILLAGE_HALL))->getNameTranslated());
|
||||
title = std::make_shared<CLabel>(399, 12, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, town->getTown()->buildings.at(BuildingID(town->hallLevel()+BuildingID::VILLAGE_HALL))->getNameTranslated());
|
||||
exit = std::make_shared<CButton>(Point(748, 556), AnimationPath::builtin("TPMAGE1.DEF"), CButton::tooltip(CGI->generaltexth->hcommands[8]), [&](){close();}, EShortcut::GLOBAL_RETURN);
|
||||
|
||||
auto & boxList = town->town->clientInfo.hallSlots;
|
||||
auto & boxList = town->getTown()->clientInfo.hallSlots;
|
||||
boxes.resize(boxList.size());
|
||||
for(size_t row=0; row<boxList.size(); row++) //for each row
|
||||
{
|
||||
@@ -1595,11 +1595,11 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
|
||||
{
|
||||
if (!buildingID.hasValue())
|
||||
{
|
||||
logMod->warn("Invalid building ID found in hallSlots of town '%s'", town->town->faction->getJsonKey() );
|
||||
logMod->warn("Invalid building ID found in hallSlots of town '%s'", town->getFaction()->getJsonKey() );
|
||||
continue;
|
||||
}
|
||||
|
||||
const CBuilding * current = town->town->buildings.at(buildingID);
|
||||
const CBuilding * current = town->getTown()->buildings.at(buildingID);
|
||||
if(town->hasBuilt(buildingID))
|
||||
{
|
||||
building = current;
|
||||
@@ -1629,7 +1629,7 @@ CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Buildin
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
icon = std::make_shared<CAnimImage>(town->town->clientInfo.buildingsIcons, building->bid, 0, 125, 50);
|
||||
icon = std::make_shared<CAnimImage>(town->getTown()->clientInfo.buildingsIcons, building->bid, 0, 125, 50);
|
||||
auto statusbarBackground = std::make_shared<CPicture>(background->getSurface(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26);
|
||||
statusbar = CGStatusBar::create(statusbarBackground);
|
||||
|
||||
@@ -1711,7 +1711,7 @@ std::string CBuildWindow::getTextForState(EBuildingState state)
|
||||
{
|
||||
auto toStr = [&](const BuildingID build) -> std::string
|
||||
{
|
||||
return town->town->buildings.at(build)->getNameTranslated();
|
||||
return town->getTown()->buildings.at(build)->getNameTranslated();
|
||||
};
|
||||
|
||||
ret = CGI->generaltexth->allTexts[52];
|
||||
@@ -1721,7 +1721,7 @@ std::string CBuildWindow::getTextForState(EBuildingState state)
|
||||
case EBuildingState::MISSING_BASE:
|
||||
{
|
||||
std::string msg = CGI->generaltexth->translate("vcmi.townHall.missingBase");
|
||||
ret = boost::str(boost::format(msg) % town->town->buildings.at(building->upgrade)->getNameTranslated());
|
||||
ret = boost::str(boost::format(msg) % town->getTown()->buildings.at(building->upgrade)->getNameTranslated());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1780,10 +1780,11 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
ui32 fortSize = static_cast<ui32>(town->creatures.size());
|
||||
if(fortSize > town->town->creatures.size() && town->creatures.back().second.empty())
|
||||
if(fortSize > town->getTown()->creatures.size() && town->creatures.back().second.empty())
|
||||
fortSize--;
|
||||
fortSize = std::min(fortSize, static_cast<ui32>(GameConstants::CREATURES_PER_TOWN)); // for 8 creatures + portal of summoning
|
||||
|
||||
const CBuilding * fortBuilding = town->town->buildings.at(BuildingID(town->fortLevel()+6));
|
||||
const CBuilding * fortBuilding = town->getTown()->buildings.at(BuildingID(town->fortLevel()+6));
|
||||
title = std::make_shared<CLabel>(400, 12, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE, fortBuilding->getNameTranslated());
|
||||
|
||||
std::string text = boost::str(boost::format(CGI->generaltexth->fcommands[6]) % fortBuilding->getNameTranslated());
|
||||
@@ -1809,7 +1810,7 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
|
||||
for(ui32 i=0; i<fortSize; i++)
|
||||
{
|
||||
BuildingID buildingID;
|
||||
if(fortSize == town->town->creatures.size())
|
||||
if(fortSize == town->getTown()->creatures.size())
|
||||
{
|
||||
BuildingID dwelling = BuildingID::getDwellingFromLevel(i, 1);
|
||||
|
||||
@@ -1838,8 +1839,9 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
|
||||
ImagePath CFortScreen::getBgName(const CGTownInstance * town)
|
||||
{
|
||||
ui32 fortSize = static_cast<ui32>(town->creatures.size());
|
||||
if(fortSize > town->town->creatures.size() && town->creatures.back().second.empty())
|
||||
if(fortSize > town->getTown()->creatures.size() && town->creatures.back().second.empty())
|
||||
fortSize--;
|
||||
fortSize = std::min(fortSize, static_cast<ui32>(GameConstants::CREATURES_PER_TOWN)); // for 8 creatures + portal of summoning
|
||||
|
||||
if(fortSize == GameConstants::CREATURES_PER_TOWN)
|
||||
return ImagePath::builtin("TPCASTL8");
|
||||
@@ -1875,7 +1877,7 @@ CFortScreen::RecruitArea::RecruitArea(int posX, int posY, const CGTownInstance *
|
||||
|
||||
if(getMyBuilding() != nullptr)
|
||||
{
|
||||
buildingIcon = std::make_shared<CAnimImage>(town->town->clientInfo.buildingsIcons, getMyBuilding()->bid, 0, 4, 21);
|
||||
buildingIcon = std::make_shared<CAnimImage>(town->getTown()->clientInfo.buildingsIcons, getMyBuilding()->bid, 0, 4, 21);
|
||||
buildingName = std::make_shared<CLabel>(78, 101, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, getMyBuilding()->getNameTranslated(), 152);
|
||||
|
||||
if(town->hasBuilt(getMyBuilding()->bid))
|
||||
@@ -1911,8 +1913,8 @@ const CCreature * CFortScreen::RecruitArea::getMyCreature()
|
||||
{
|
||||
if(!town->creatures.at(level).second.empty()) // built
|
||||
return town->creatures.at(level).second.back().toCreature();
|
||||
if(!town->town->creatures.at(level).empty()) // there are creatures on this level
|
||||
return town->town->creatures.at(level).front().toCreature();
|
||||
if(!town->getTown()->creatures.at(level).empty()) // there are creatures on this level
|
||||
return town->getTown()->creatures.at(level).front().toCreature();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -1920,17 +1922,17 @@ const CBuilding * CFortScreen::RecruitArea::getMyBuilding()
|
||||
{
|
||||
BuildingID myID = BuildingID(BuildingID::getDwellingFromLevel(level, 0));
|
||||
|
||||
if (level == town->town->creatures.size())
|
||||
return town->town->getSpecialBuilding(BuildingSubID::PORTAL_OF_SUMMONING);
|
||||
if (level == town->getTown()->creatures.size())
|
||||
return town->getTown()->getSpecialBuilding(BuildingSubID::PORTAL_OF_SUMMONING);
|
||||
|
||||
if (!town->town->buildings.count(myID))
|
||||
if (!town->getTown()->buildings.count(myID))
|
||||
return nullptr;
|
||||
|
||||
const CBuilding * build = town->town->buildings.at(myID);
|
||||
while (town->town->buildings.count(myID))
|
||||
const CBuilding * build = town->getTown()->buildings.at(myID);
|
||||
while (town->getTown()->buildings.count(myID))
|
||||
{
|
||||
if (town->hasBuilt(myID))
|
||||
build = town->town->buildings.at(myID);
|
||||
build = town->getTown()->buildings.at(myID);
|
||||
BuildingID::advanceDwelling(myID);
|
||||
}
|
||||
|
||||
@@ -1966,11 +1968,11 @@ void CFortScreen::RecruitArea::showPopupWindow(const Point & cursorPosition)
|
||||
}
|
||||
|
||||
CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & imagename)
|
||||
: CWindowObject(BORDERED, imagename)
|
||||
: CWindowObject(BORDERED, imagename), townId(owner->town->id)
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
window = std::make_shared<CPicture>(owner->town->town->clientInfo.guildWindow, 332, 76);
|
||||
window = std::make_shared<CPicture>(owner->town->getTown()->clientInfo.guildWindow, 332, 76);
|
||||
|
||||
resdatabar = std::make_shared<CMinorResDataBar>();
|
||||
resdatabar->moveBy(pos.topLeft(), true);
|
||||
@@ -1982,6 +1984,15 @@ CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & i
|
||||
|
||||
exit = std::make_shared<CButton>(Point(748, 556), AnimationPath::builtin("TPMAGE1.DEF"), CButton::tooltip(CGI->generaltexth->allTexts[593]), [&](){ close(); }, EShortcut::GLOBAL_RETURN);
|
||||
|
||||
updateSpells(townId);
|
||||
}
|
||||
|
||||
void CMageGuildScreen::updateSpells(ObjectInstanceID tID)
|
||||
{
|
||||
if(tID != townId)
|
||||
return;
|
||||
|
||||
OBJECT_CONSTRUCTION;
|
||||
static const std::vector<std::vector<Point> > positions =
|
||||
{
|
||||
{Point(222,445), Point(312,445), Point(402,445), Point(520,445), Point(610,445), Point(700,445)},
|
||||
@@ -1991,21 +2002,28 @@ CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & i
|
||||
{Point(491,325), Point(591,325)}
|
||||
};
|
||||
|
||||
for(size_t i=0; i<owner->town->town->mageLevel; i++)
|
||||
spells.clear();
|
||||
emptyScrolls.clear();
|
||||
|
||||
const CGTownInstance * town = LOCPLINT->cb->getTown(townId);
|
||||
|
||||
for(size_t i=0; i<town->getTown()->mageLevel; i++)
|
||||
{
|
||||
size_t spellCount = owner->town->spellsAtLevel((int)i+1,false); //spell at level with -1 hmmm?
|
||||
size_t spellCount = town->spellsAtLevel((int)i+1,false); //spell at level with -1 hmmm?
|
||||
for(size_t j=0; j<spellCount; j++)
|
||||
{
|
||||
if(i<owner->town->mageGuildLevel() && owner->town->spells[i].size()>j)
|
||||
spells.push_back(std::make_shared<Scroll>(positions[i][j], owner->town->spells[i][j].toSpell()));
|
||||
if(i<town->mageGuildLevel() && town->spells[i].size()>j)
|
||||
spells.push_back(std::make_shared<Scroll>(positions[i][j], town->spells[i][j].toSpell(), townId));
|
||||
else
|
||||
emptyScrolls.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("TPMAGES.DEF"), 1, 0, positions[i][j].x, positions[i][j].y));
|
||||
}
|
||||
}
|
||||
|
||||
redraw();
|
||||
}
|
||||
|
||||
CMageGuildScreen::Scroll::Scroll(Point position, const CSpell *Spell)
|
||||
: spell(Spell)
|
||||
CMageGuildScreen::Scroll::Scroll(Point position, const CSpell *Spell, ObjectInstanceID townId)
|
||||
: spell(Spell), townId(townId)
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
@@ -2017,7 +2035,61 @@ CMageGuildScreen::Scroll::Scroll(Point position, const CSpell *Spell)
|
||||
|
||||
void CMageGuildScreen::Scroll::clickPressed(const Point & cursorPosition)
|
||||
{
|
||||
LOCPLINT->showInfoDialog(spell->getDescriptionTranslated(0), std::make_shared<CComponent>(ComponentType::SPELL, spell->id));
|
||||
const CGTownInstance * town = LOCPLINT->cb->getTown(townId);
|
||||
if(LOCPLINT->cb->getSettings().getBoolean(EGameSettings::TOWNS_SPELL_RESEARCH) && town->spellResearchAllowed)
|
||||
{
|
||||
int level = -1;
|
||||
for(int i = 0; i < town->spells.size(); i++)
|
||||
if(vstd::find_pos(town->spells[i], spell->id) != -1)
|
||||
level = i;
|
||||
|
||||
if(town->spellResearchCounterDay >= LOCPLINT->cb->getSettings().getValue(EGameSettings::TOWNS_SPELL_RESEARCH_PER_DAY).Vector()[level].Float())
|
||||
{
|
||||
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("vcmi.spellResearch.comeAgain"));
|
||||
return;
|
||||
}
|
||||
|
||||
auto costBase = TResources(LOCPLINT->cb->getSettings().getValue(EGameSettings::TOWNS_SPELL_RESEARCH_COST).Vector()[level]);
|
||||
auto costExponent = LOCPLINT->cb->getSettings().getValue(EGameSettings::TOWNS_SPELL_RESEARCH_COST_EXPONENT_PER_RESEARCH).Vector()[level].Float();
|
||||
auto cost = costBase * std::pow(town->spellResearchAcceptedCounter + 1, costExponent);
|
||||
|
||||
std::vector<std::shared_ptr<CComponent>> resComps;
|
||||
auto newSpell = town->spells[level].at(town->spellsAtLevel(level, false));
|
||||
resComps.push_back(std::make_shared<CComponent>(ComponentType::SPELL, spell->id));
|
||||
resComps.push_back(std::make_shared<CComponent>(ComponentType::SPELL, newSpell));
|
||||
resComps.back()->newLine = true;
|
||||
for(TResources::nziterator i(cost); i.valid(); i++)
|
||||
{
|
||||
resComps.push_back(std::make_shared<CComponent>(ComponentType::RESOURCE, i->resType, i->resVal, CComponent::ESize::medium));
|
||||
}
|
||||
|
||||
auto showSpellResearchDialog = [this, resComps, town, cost, newSpell](){
|
||||
std::vector<std::pair<AnimationPath, CFunctionList<void()>>> pom;
|
||||
for(int i = 0; i < 3; i++)
|
||||
pom.emplace_back(AnimationPath::builtin("settingsWindow/button80"), nullptr);
|
||||
|
||||
auto text = CGI->generaltexth->translate(LOCPLINT->cb->getResourceAmount().canAfford(cost) ? "vcmi.spellResearch.pay" : "vcmi.spellResearch.canNotAfford");
|
||||
boost::replace_first(text, "%SPELL1", spell->id.toSpell()->getNameTranslated());
|
||||
boost::replace_first(text, "%SPELL2", newSpell.toSpell()->getNameTranslated());
|
||||
auto temp = std::make_shared<CInfoWindow>(text, LOCPLINT->playerID, resComps, pom);
|
||||
|
||||
temp->buttons[0]->setOverlay(std::make_shared<CPicture>(ImagePath::builtin("spellResearch/accept")));
|
||||
temp->buttons[0]->addCallback([this, town](){ LOCPLINT->cb->spellResearch(town, spell->id, true); });
|
||||
temp->buttons[0]->addPopupCallback([](){ CRClickPopup::createAndPush(CGI->generaltexth->translate("vcmi.spellResearch.research")); });
|
||||
temp->buttons[0]->setEnabled(LOCPLINT->cb->getResourceAmount().canAfford(cost));
|
||||
temp->buttons[1]->setOverlay(std::make_shared<CPicture>(ImagePath::builtin("spellResearch/reroll")));
|
||||
temp->buttons[1]->addCallback([this, town](){ LOCPLINT->cb->spellResearch(town, spell->id, false); });
|
||||
temp->buttons[1]->addPopupCallback([](){ CRClickPopup::createAndPush(CGI->generaltexth->translate("vcmi.spellResearch.skip")); });
|
||||
temp->buttons[2]->setOverlay(std::make_shared<CPicture>(ImagePath::builtin("spellResearch/close")));
|
||||
temp->buttons[2]->addPopupCallback([](){ CRClickPopup::createAndPush(CGI->generaltexth->translate("vcmi.spellResearch.abort")); });
|
||||
|
||||
GH.windows().pushWindow(temp);
|
||||
};
|
||||
|
||||
showSpellResearchDialog();
|
||||
}
|
||||
else
|
||||
LOCPLINT->showInfoDialog(spell->getDescriptionTranslated(0), std::make_shared<CComponent>(ComponentType::SPELL, spell->id));
|
||||
}
|
||||
|
||||
void CMageGuildScreen::Scroll::showPopupWindow(const Point & cursorPosition)
|
||||
|
@@ -379,9 +379,10 @@ class CMageGuildScreen : public CStatusbarWindow
|
||||
{
|
||||
const CSpell * spell;
|
||||
std::shared_ptr<CAnimImage> image;
|
||||
ObjectInstanceID townId;
|
||||
|
||||
public:
|
||||
Scroll(Point position, const CSpell *Spell);
|
||||
Scroll(Point position, const CSpell *Spell, ObjectInstanceID townId);
|
||||
void clickPressed(const Point & cursorPosition) override;
|
||||
void showPopupWindow(const Point & cursorPosition) override;
|
||||
void hover(bool on) override;
|
||||
@@ -393,8 +394,11 @@ class CMageGuildScreen : public CStatusbarWindow
|
||||
|
||||
std::shared_ptr<CMinorResDataBar> resdatabar;
|
||||
|
||||
ObjectInstanceID townId;
|
||||
|
||||
public:
|
||||
CMageGuildScreen(CCastleInterface * owner, const ImagePath & image);
|
||||
void updateSpells(ObjectInstanceID tID);
|
||||
};
|
||||
|
||||
/// The blacksmith window where you can buy available in town war machine
|
||||
|
@@ -84,7 +84,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
|
||||
for(int m=0; m < hero->secSkills.size(); ++m)
|
||||
secSkillIcons[leftRight].push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("SECSK32"), 0, 0, 32 + 36 * m + 454 * leftRight, qeLayout ? 83 : 88));
|
||||
|
||||
specImages[leftRight] = std::make_shared<CAnimImage>(AnimationPath::builtin("UN32"), hero->type->imageIndex, 0, 67 + 490 * leftRight, qeLayout ? 41 : 45);
|
||||
specImages[leftRight] = std::make_shared<CAnimImage>(AnimationPath::builtin("UN32"), hero->getHeroType()->imageIndex, 0, 67 + 490 * leftRight, qeLayout ? 41 : 45);
|
||||
|
||||
expImages[leftRight] = std::make_shared<CAnimImage>(AnimationPath::builtin("PSKIL32"), 4, 0, 103 + 490 * leftRight, qeLayout ? 41 : 45);
|
||||
expValues[leftRight] = std::make_shared<CLabel>(119 + 490 * leftRight, qeLayout ? 66 : 71, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);
|
||||
@@ -151,7 +151,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
|
||||
specialtyAreas[b] = std::make_shared<LRClickableAreaWText>();
|
||||
specialtyAreas[b]->pos = Rect(Point(pos.x + 69 + 490 * b, pos.y + (qeLayout ? 41 : 45)), Point(32, 32));
|
||||
specialtyAreas[b]->hoverText = CGI->generaltexth->heroscrn[27];
|
||||
specialtyAreas[b]->text = hero->type->getSpecialtyDescriptionTranslated();
|
||||
specialtyAreas[b]->text = hero->getHeroType()->getSpecialtyDescriptionTranslated();
|
||||
|
||||
experienceAreas[b] = std::make_shared<LRClickableAreaWText>();
|
||||
experienceAreas[b]->pos = Rect(Point(pos.x + 105 + 490 * b, pos.y + (qeLayout ? 41 : 45)), Point(32, 32));
|
||||
|
@@ -20,6 +20,8 @@
|
||||
#include "render/Canvas.h"
|
||||
#include "CPlayerInterface.h"
|
||||
|
||||
#include "../../CCallback.h"
|
||||
|
||||
#include "../../lib/mapObjects/CGHeroInstance.h"
|
||||
#include "../../lib/networkPacks/ArtifactLocation.h"
|
||||
|
||||
@@ -41,17 +43,38 @@ CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero, const std:
|
||||
};
|
||||
addSet(arts);
|
||||
arts->setHero(hero);
|
||||
quitButton = std::make_shared<CButton>(Point(), AnimationPath::builtin("IOKAY32.def"), CButton::tooltip(""),
|
||||
[this]() { WindowBase::close(); }, EShortcut::GLOBAL_RETURN);
|
||||
|
||||
buttons.emplace_back(std::make_unique<CButton>(Point(), AnimationPath::builtin("ALTFILL.DEF"),
|
||||
CButton::tooltipLocalized("vcmi.heroWindow.sortBackpackByCost"),
|
||||
[hero]() { LOCPLINT->cb->sortBackpackArtifactsByCost(hero->id); }));
|
||||
buttons.emplace_back(std::make_unique<CButton>(Point(), AnimationPath::builtin("ALTFILL.DEF"),
|
||||
CButton::tooltipLocalized("vcmi.heroWindow.sortBackpackBySlot"),
|
||||
[hero]() { LOCPLINT->cb->sortBackpackArtifactsBySlot(hero->id); }));
|
||||
buttons.emplace_back(std::make_unique<CButton>(Point(), AnimationPath::builtin("ALTFILL.DEF"),
|
||||
CButton::tooltipLocalized("vcmi.heroWindow.sortBackpackByClass"),
|
||||
[hero]() { LOCPLINT->cb->sortBackpackArtifactsByClass(hero->id); }));
|
||||
|
||||
pos.w = stretchedBackground->pos.w = arts->pos.w + 2 * windowMargin;
|
||||
pos.h = stretchedBackground->pos.h = arts->pos.h + quitButton->pos.h + 3 * windowMargin;
|
||||
quitButton->moveTo(Point(pos.x + pos.w / 2 - quitButton->pos.w / 2, pos.y + arts->pos.h + 2 * windowMargin));
|
||||
pos.h = stretchedBackground->pos.h = arts->pos.h + buttons.back()->pos.h + 3 * windowMargin;
|
||||
|
||||
auto buttonPos = Point(pos.x + windowMargin, pos.y + arts->pos.h + 2 * windowMargin);
|
||||
for(const auto & button : buttons)
|
||||
{
|
||||
button->moveTo(buttonPos);
|
||||
buttonPos += Point(button->pos.w + 10, 0);
|
||||
}
|
||||
|
||||
statusbar = CGStatusBar::create(0, pos.h, ImagePath::builtin("ADROLLVR.bmp"), pos.w);
|
||||
pos.h += statusbar->pos.h;
|
||||
|
||||
addUsedEvents(LCLICK);
|
||||
center();
|
||||
}
|
||||
|
||||
void CHeroBackpackWindow::notFocusedClick()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void CHeroBackpackWindow::showAll(Canvas & to)
|
||||
{
|
||||
CIntObject::showAll(to);
|
||||
|
@@ -17,10 +17,11 @@ class CHeroBackpackWindow : public CStatusbarWindow, public CWindowWithArtifacts
|
||||
{
|
||||
public:
|
||||
CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets);
|
||||
void notFocusedClick() override;
|
||||
|
||||
protected:
|
||||
std::shared_ptr<CArtifactsOfHeroBackpack> arts;
|
||||
std::shared_ptr<CButton> quitButton;
|
||||
std::vector<std::unique_ptr<CButton>> buttons;
|
||||
std::shared_ptr<CFilledTexture> stretchedBackground;
|
||||
const int windowMargin = 5;
|
||||
|
||||
|
@@ -184,9 +184,9 @@ void CHeroWindow::update()
|
||||
name->setText(curHero->getNameTranslated());
|
||||
title->setText((boost::format(CGI->generaltexth->allTexts[342]) % curHero->level % curHero->getClassNameTranslated()).str());
|
||||
|
||||
specArea->text = curHero->type->getSpecialtyDescriptionTranslated();
|
||||
specImage->setFrame(curHero->type->imageIndex);
|
||||
specName->setText(curHero->type->getSpecialtyNameTranslated());
|
||||
specArea->text = curHero->getHeroType()->getSpecialtyDescriptionTranslated();
|
||||
specImage->setFrame(curHero->getHeroType()->imageIndex);
|
||||
specName->setText(curHero->getHeroType()->getSpecialtyNameTranslated());
|
||||
|
||||
tacticsButton = std::make_shared<CToggleButton>(Point(539, 483), AnimationPath::builtin("hsbtns8.def"), std::make_pair(heroscrn[26], heroscrn[31]), 0, EShortcut::HERO_TOGGLE_TACTICS);
|
||||
tacticsButton->addHoverText(EButtonState::HIGHLIGHTED, CGI->generaltexth->heroscrn[25]);
|
||||
|
@@ -300,7 +300,7 @@ int InfoBoxHeroData::getSubID()
|
||||
else
|
||||
return 0;
|
||||
case HERO_SPECIAL:
|
||||
return hero->type->getIndex();
|
||||
return hero->getHeroTypeID().getNum();
|
||||
case HERO_MANA:
|
||||
case HERO_EXPERIENCE:
|
||||
return 0;
|
||||
@@ -473,7 +473,7 @@ CKingdomInterface::CKingdomInterface()
|
||||
generateButtons();
|
||||
|
||||
statusbar = CGStatusBar::create(std::make_shared<CPicture>(ImagePath::builtin("KSTATBAR"), 10,pos.h - 45));
|
||||
resdatabar = std::make_shared<CResDataBar>(ImagePath::builtin("KRESBAR"), 7, 111+footerPos, 29, 5, 76, 81);
|
||||
resdatabar = std::make_shared<CResDataBar>(ImagePath::builtin("KRESBAR"), 7, 111+footerPos, 29, 3, 76, 81);
|
||||
|
||||
activateTab(persistentStorage["gui"]["lastKindomInterface"].Integer());
|
||||
}
|
||||
@@ -800,12 +800,12 @@ CTownItem::CTownItem(const CGTownInstance * Town)
|
||||
garr = std::make_shared<CGarrisonInt>(Point(313, 3), 4, Point(232,0), town->getUpperArmy(), town->visitingHero, true, true, CGarrisonInt::ESlotsLayout::TWO_ROWS);
|
||||
heroes = std::make_shared<HeroSlots>(town, Point(244,6), Point(475,6), garr, false);
|
||||
|
||||
size_t iconIndex = town->town->clientInfo.icons[town->hasFort()][town->built >= LOCPLINT->cb->getSettings().getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
|
||||
size_t iconIndex = town->getTown()->clientInfo.icons[town->hasFort()][town->built >= LOCPLINT->cb->getSettings().getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
|
||||
|
||||
picture = std::make_shared<CAnimImage>(AnimationPath::builtin("ITPT"), iconIndex, 0, 5, 6);
|
||||
openTown = std::make_shared<LRClickableAreaOpenTown>(Rect(5, 6, 58, 64), town);
|
||||
|
||||
for(size_t i=0; i<town->creatures.size(); i++)
|
||||
for(size_t i=0; i<town->creatures.size() && i<GameConstants::CREATURES_PER_TOWN; i++)
|
||||
{
|
||||
growth.push_back(std::make_shared<CCreaInfo>(Point(401+37*(int)i, 78), town, (int)i, true, true));
|
||||
available.push_back(std::make_shared<CCreaInfo>(Point(48+37*(int)i, 78), town, (int)i, true, false));
|
||||
@@ -823,8 +823,8 @@ CTownItem::CTownItem(const CGTownInstance * Town)
|
||||
if(town->hasBuilt(BuildingID::TAVERN))
|
||||
LOCPLINT->showTavernWindow(town, nullptr, QueryID::NONE);
|
||||
}, [&]{
|
||||
if(!town->town->faction->getDescriptionTranslated().empty())
|
||||
CRClickPopup::createAndPush(town->town->faction->getDescriptionTranslated());
|
||||
if(!town->getTown()->faction->getDescriptionTranslated().empty())
|
||||
CRClickPopup::createAndPush(town->getFaction()->getDescriptionTranslated());
|
||||
});
|
||||
fastMarket = std::make_shared<LRClickableArea>(Rect(153, 6, 65, 64), []()
|
||||
{
|
||||
@@ -866,7 +866,7 @@ void CTownItem::update()
|
||||
|
||||
heroes->update();
|
||||
|
||||
for (size_t i=0; i<town->creatures.size(); i++)
|
||||
for (size_t i=0; i<std::min(static_cast<int>(town->creatures.size()), GameConstants::CREATURES_PER_TOWN); i++)
|
||||
{
|
||||
growth[i]->update();
|
||||
available[i]->update();
|
||||
|
@@ -192,7 +192,7 @@ std::string CMarketWindow::getMarketTitle(const ObjectInstanceID marketId, const
|
||||
{
|
||||
for(const auto & buildingId : town->getBuildings())
|
||||
{
|
||||
if(const auto building = town->town->buildings.at(buildingId); vstd::contains(building->marketModes, mode))
|
||||
if(const auto building = town->getTown()->buildings.at(buildingId); vstd::contains(building->marketModes, mode))
|
||||
return building->getNameTranslated();
|
||||
}
|
||||
}
|
||||
|
@@ -129,7 +129,7 @@ std::vector<std::string> CMessage::breakText(std::string text, size_t maxLineWid
|
||||
if(wordBreak != ui32(-1))
|
||||
{
|
||||
currPos = wordBreak;
|
||||
if(text.substr(0, currPos).find('{') == std::string::npos)
|
||||
if(boost::count(text.substr(0, currPos), '{') == boost::count(text.substr(0, currPos), '}'))
|
||||
{
|
||||
opened = false;
|
||||
color = "";
|
||||
|
@@ -78,7 +78,7 @@ void CQuestMinimap::addQuestMarks (const QuestInfo * q)
|
||||
|
||||
int3 tile;
|
||||
if (q->obj)
|
||||
tile = q->obj->pos;
|
||||
tile = q->obj->visitablePos();
|
||||
else
|
||||
tile = q->tile;
|
||||
|
||||
@@ -104,7 +104,7 @@ void CQuestMinimap::update()
|
||||
void CQuestMinimap::iconClicked()
|
||||
{
|
||||
if(currentQuest->obj)
|
||||
adventureInt->centerOnTile(currentQuest->obj->pos);
|
||||
adventureInt->centerOnTile(currentQuest->obj->visitablePos());
|
||||
//moveAdvMapSelection();
|
||||
}
|
||||
|
||||
|
@@ -205,9 +205,9 @@ CSpellWindow::CSpellWindow(const CGHeroInstance * _myHero, CPlayerInterface * _m
|
||||
}
|
||||
}
|
||||
|
||||
selectedTab = battleSpellsOnly ? myInt->localState->spellbookSettings.spellbookLastTabBattle : myInt->localState->spellbookSettings.spellbookLastTabAdvmap;
|
||||
selectedTab = battleSpellsOnly ? myInt->localState->getSpellbookSettings().spellbookLastTabBattle : myInt->localState->getSpellbookSettings().spellbookLastTabAdvmap;
|
||||
schoolTab->setFrame(selectedTab, 0);
|
||||
int cp = battleSpellsOnly ? myInt->localState->spellbookSettings.spellbookLastPageBattle : myInt->localState->spellbookSettings.spellbookLastPageAdvmap;
|
||||
int cp = battleSpellsOnly ? myInt->localState->getSpellbookSettings().spellbookLastPageBattle : myInt->localState->getSpellbookSettings().spellbookLastPageAdvmap;
|
||||
// spellbook last page battle index is not reset after battle, so this needs to stay here
|
||||
vstd::abetween(cp, 0, std::max(0, pagesWithinCurrentTab() - 1));
|
||||
setCurrentPage(cp);
|
||||
@@ -313,8 +313,18 @@ void CSpellWindow::processSpells()
|
||||
|
||||
void CSpellWindow::fexitb()
|
||||
{
|
||||
(myInt->battleInt ? myInt->localState->spellbookSettings.spellbookLastTabBattle : myInt->localState->spellbookSettings.spellbookLastTabAdvmap) = selectedTab;
|
||||
(myInt->battleInt ? myInt->localState->spellbookSettings.spellbookLastPageBattle : myInt->localState->spellbookSettings.spellbookLastPageAdvmap) = currentPage;
|
||||
auto spellBookState = myInt->localState->getSpellbookSettings();
|
||||
if(myInt->battleInt)
|
||||
{
|
||||
spellBookState.spellbookLastTabBattle = selectedTab;
|
||||
spellBookState.spellbookLastPageBattle = currentPage;
|
||||
}
|
||||
else
|
||||
{
|
||||
spellBookState.spellbookLastTabAdvmap = selectedTab;
|
||||
spellBookState.spellbookLastPageAdvmap = currentPage;
|
||||
}
|
||||
myInt->localState->setSpellbookSettings(spellBookState);
|
||||
|
||||
if(onSpellSelect)
|
||||
onSpellSelect(SpellID::NONE);
|
||||
@@ -619,8 +629,10 @@ void CSpellWindow::SpellArea::clickPressed(const Point & cursorPosition)
|
||||
|
||||
auto guard = vstd::makeScopeGuard([this]()
|
||||
{
|
||||
owner->myInt->localState->spellbookSettings.spellbookLastTabAdvmap = owner->selectedTab;
|
||||
owner->myInt->localState->spellbookSettings.spellbookLastPageAdvmap = owner->currentPage;
|
||||
auto spellBookState = owner->myInt->localState->getSpellbookSettings();
|
||||
spellBookState.spellbookLastTabAdvmap = owner->selectedTab;
|
||||
spellBookState.spellbookLastPageAdvmap = owner->currentPage;
|
||||
owner->myInt->localState->setSpellbookSettings(spellBookState);
|
||||
});
|
||||
|
||||
spells::detail::ProblemImpl problem;
|
||||
|
@@ -522,9 +522,9 @@ CTavernWindow::CTavernWindow(const CGObjectInstance * TavernObj, const std::func
|
||||
recruit->block(true);
|
||||
}
|
||||
if(LOCPLINT->castleInt)
|
||||
videoPlayer = std::make_shared<VideoWidget>(Point(70, 56), LOCPLINT->castleInt->town->town->clientInfo.tavernVideo, false);
|
||||
videoPlayer = std::make_shared<VideoWidget>(Point(70, 56), LOCPLINT->castleInt->town->getTown()->clientInfo.tavernVideo, false);
|
||||
else if(const auto * townObj = dynamic_cast<const CGTownInstance *>(TavernObj))
|
||||
videoPlayer = std::make_shared<VideoWidget>(Point(70, 56), townObj->town->clientInfo.tavernVideo, false);
|
||||
videoPlayer = std::make_shared<VideoWidget>(Point(70, 56), townObj->getTown()->clientInfo.tavernVideo, false);
|
||||
else
|
||||
videoPlayer = std::make_shared<VideoWidget>(Point(70, 56), VideoPath::builtin("TAVERN.BIK"), false);
|
||||
|
||||
@@ -548,11 +548,12 @@ void CTavernWindow::addInvite()
|
||||
|
||||
if(!inviteableHeroes.empty())
|
||||
{
|
||||
int imageIndex = heroToInvite ? heroToInvite->getIconIndex() : 156; // 156 => special id for random
|
||||
if(!heroToInvite)
|
||||
heroToInvite = (*RandomGeneratorUtil::nextItem(inviteableHeroes, CRandomGenerator::getDefault())).second;
|
||||
|
||||
inviteHero = std::make_shared<CLabel>(170, 444, EFonts::FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("vcmi.tavernWindow.inviteHero"));
|
||||
inviteHeroImage = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsSmall"), (*CGI->heroh)[heroToInvite->getHeroType()]->imageIndex, 0, 245, 428);
|
||||
inviteHeroImage = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsSmall"), imageIndex, 0, 245, 428);
|
||||
inviteHeroImageArea = std::make_shared<LRClickableArea>(Rect(245, 428, 48, 32), [this](){ GH.windows().createAndPushWindow<HeroSelector>(inviteableHeroes, [this](CGHeroInstance* h){ heroToInvite = h; addInvite(); }); }, [this](){ GH.windows().createAndPushWindow<CRClickPopupInt>(std::make_shared<CHeroWindow>(heroToInvite)); });
|
||||
}
|
||||
}
|
||||
@@ -562,7 +563,7 @@ void CTavernWindow::recruitb()
|
||||
const CGHeroInstance *toBuy = (selected ? h2 : h1)->h;
|
||||
const CGObjectInstance *obj = tavernObj;
|
||||
|
||||
LOCPLINT->cb->recruitHero(obj, toBuy, heroToInvite ? heroToInvite->getHeroType() : HeroTypeID::NONE);
|
||||
LOCPLINT->cb->recruitHero(obj, toBuy, heroToInvite ? heroToInvite->getHeroTypeID() : HeroTypeID::NONE);
|
||||
close();
|
||||
}
|
||||
|
||||
@@ -962,7 +963,7 @@ CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, BuildingID bu
|
||||
|
||||
if(auto town = dynamic_cast<const CGTownInstance *>(_market))
|
||||
{
|
||||
auto faction = town->town->faction->getId();
|
||||
auto faction = town->getTown()->faction->getId();
|
||||
titlePic = std::make_shared<CAnimImage>((*CGI->townh)[faction]->town->clientInfo.buildingsIcons, building);
|
||||
}
|
||||
else if(auto uni = dynamic_cast<const CGUniversity *>(_market); uni->appearance)
|
||||
|
@@ -51,9 +51,9 @@ void QuickRecruitmentWindow::setCreaturePurchaseCards()
|
||||
{
|
||||
int availableAmount = getAvailableCreatures();
|
||||
Point position = Point((pos.w - 100*availableAmount - 8*(availableAmount-1))/2,64);
|
||||
for (int i = 0; i < town->town->creatures.size(); i++)
|
||||
for (int i = 0; i < town->getTown()->creatures.size(); i++)
|
||||
{
|
||||
if(!town->town->creatures.at(i).empty() && !town->creatures.at(i).second.empty() && town->creatures[i].first)
|
||||
if(!town->getTown()->creatures.at(i).empty() && !town->creatures.at(i).second.empty() && town->creatures[i].first)
|
||||
{
|
||||
cards.push_back(std::make_shared<CreaturePurchaseCard>(town->creatures[i].second, position, town->creatures[i].first, this));
|
||||
position.x += 108;
|
||||
@@ -108,7 +108,7 @@ void QuickRecruitmentWindow::purchaseUnits()
|
||||
{
|
||||
int level = 0;
|
||||
int i = 0;
|
||||
for(auto c : town->town->creatures)
|
||||
for(auto c : town->getTown()->creatures)
|
||||
{
|
||||
for(auto c2 : c)
|
||||
if(c2 == selected->creatureOnTheCard->getId())
|
||||
@@ -129,8 +129,8 @@ void QuickRecruitmentWindow::purchaseUnits()
|
||||
int QuickRecruitmentWindow::getAvailableCreatures()
|
||||
{
|
||||
int creaturesAmount = 0;
|
||||
for (int i=0; i< town->town->creatures.size(); i++)
|
||||
if(!town->town->creatures.at(i).empty() && !town->creatures.at(i).second.empty() && town->creatures[i].first)
|
||||
for (int i=0; i< town->getTown()->creatures.size(); i++)
|
||||
if(!town->getTown()->creatures.at(i).empty() && !town->creatures.at(i).second.empty() && town->creatures[i].first)
|
||||
creaturesAmount++;
|
||||
return creaturesAmount;
|
||||
}
|
||||
@@ -166,4 +166,6 @@ QuickRecruitmentWindow::QuickRecruitmentWindow(const CGTownInstance * townd, Rec
|
||||
setButtons();
|
||||
setCreaturePurchaseCards();
|
||||
maxAllCards(cards);
|
||||
|
||||
center();
|
||||
}
|
||||
|
@@ -194,10 +194,8 @@ GeneralOptionsTab::GeneralOptionsTab()
|
||||
|
||||
build(config);
|
||||
|
||||
const auto & currentResolution = settings["video"]["resolution"];
|
||||
|
||||
std::shared_ptr<CLabel> scalingLabel = widget<CLabel>("scalingLabel");
|
||||
scalingLabel->setText(scalingToLabelString(currentResolution["scaling"].Integer()));
|
||||
scalingLabel->setText(scalingToLabelString(GH.screenHandler().getInterfaceScalingPercentage()));
|
||||
|
||||
std::shared_ptr<CLabel> longTouchLabel = widget<CLabel>("longTouchLabel");
|
||||
if (longTouchLabel)
|
||||
|
@@ -70,7 +70,7 @@
|
||||
//Playing with Fire
|
||||
"H3ABpf1.smk", //PlayingWithFire_a
|
||||
"H3ABpf2.smk", //PlayingWithFire_b
|
||||
"3ABpf3.smk", //PlayingWithFire_c
|
||||
"H3ABpf3.smk", //PlayingWithFire_c
|
||||
"H3ABpf4.smk", //PlayingWithFire_end
|
||||
//Shadow of Death Campaigns
|
||||
//Birth of a Barbarian
|
||||
|
@@ -302,7 +302,7 @@
|
||||
"backpackSize" : -1,
|
||||
// if heroes are invitable in tavern
|
||||
"tavernInvite" : false,
|
||||
// minimai primary skills for heroes
|
||||
// minimal primary skills for heroes
|
||||
"minimalPrimarySkills": [ 0, 0, 1, 1]
|
||||
},
|
||||
|
||||
@@ -311,7 +311,21 @@
|
||||
// How many new building can be built in a town per day
|
||||
"buildingsPerTurnCap" : 1,
|
||||
// Chances for a town with default buildings to receive corresponding dwelling level built in start
|
||||
"startingDwellingChances": [100, 50]
|
||||
"startingDwellingChances": [100, 50],
|
||||
// Enable spell research in mage guild
|
||||
"spellResearch": false,
|
||||
// Cost for an spell research (array index is spell tier)
|
||||
"spellResearchCost": [
|
||||
{ "gold": 1000, "wood" : 2, "mercury": 2, "ore": 2, "sulfur": 2, "crystal": 2, "gems": 2 },
|
||||
{ "gold": 1000, "wood" : 4, "mercury": 4, "ore": 4, "sulfur": 4, "crystal": 4, "gems": 4 },
|
||||
{ "gold": 1000, "wood" : 6, "mercury": 6, "ore": 6, "sulfur": 6, "crystal": 6, "gems": 6 },
|
||||
{ "gold": 1000, "wood" : 8, "mercury": 8, "ore": 8, "sulfur": 8, "crystal": 8, "gems": 8 },
|
||||
{ "gold": 1000, "wood" : 10, "mercury": 10, "ore": 10, "sulfur": 10, "crystal": 10, "gems": 10 }
|
||||
],
|
||||
// How much researchs/skips per day are possible? (array index is spell tier)
|
||||
"spellResearchPerDay": [ 2, 2, 2, 2, 1 ],
|
||||
// Exponent for increasing cost for each research (factor 1 disables this; array index is spell tier)
|
||||
"spellResearchCostExponentPerResearch": [ 1.25, 1.25, 1.25, 1.25, 1.25 ]
|
||||
},
|
||||
|
||||
"combat":
|
||||
@@ -555,6 +569,22 @@
|
||||
"valueType" : "BASE_NUMBER"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"interface" :
|
||||
{
|
||||
// Color transform to make color of brown DIBOX.PCX texture match color of specified player
|
||||
"playerColoredBackground" :
|
||||
{
|
||||
"red" : [ 0.25, 0, 0, 1.25, 0.00, 0.00 ],
|
||||
"blue" : [ 0, 0, 0, 0.45, 1.20, 4.50 ],
|
||||
"tan" : [ 0.40, 0.27, 0.23, 1.10, 1.20, 1.15 ],
|
||||
"green" : [ -0.27, 0.10, -0.27, 0.70, 1.70, 0.70 ],
|
||||
"orange" : [ 0.47, 0.17, -0.27, 1.60, 1.20, 0.70 ],
|
||||
"purple" : [ 0.12, -0.1, 0.25, 1.15, 1.20, 2.20 ],
|
||||
"teal" : [ -0.13, 0.23, 0.23, 0.90, 1.20, 2.20 ],
|
||||
"pink" : [ 0.44, 0.15, 0.25, 1.00, 1.00, 1.75 ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -51,8 +51,12 @@
|
||||
"type" : "object",
|
||||
"additionalProperties" : false,
|
||||
"properties" : {
|
||||
"buildingsPerTurnCap" : { "type" : "number" },
|
||||
"startingDwellingChances" : { "type" : "array" }
|
||||
"buildingsPerTurnCap" : { "type" : "number" },
|
||||
"startingDwellingChances" : { "type" : "array" },
|
||||
"spellResearch" : { "type" : "boolean" },
|
||||
"spellResearchCost" : { "type" : "array" },
|
||||
"spellResearchPerDay" : { "type" : "array" },
|
||||
"spellResearchCostExponentPerResearch" : { "type" : "array" }
|
||||
}
|
||||
},
|
||||
"combat": {
|
||||
@@ -148,5 +152,12 @@
|
||||
"perHero" : { "type" : "object" }
|
||||
}
|
||||
},
|
||||
"interface": {
|
||||
"type" : "object",
|
||||
"additionalProperties" : false,
|
||||
"properties" : {
|
||||
"playerColoredBackground" : { "type" : "object" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,6 +5,17 @@
|
||||
"description" : "Format used to define main mod file (mod.json) in VCMI",
|
||||
"required" : [ "name", "description", "modType", "version", "author", "contact" ],
|
||||
"definitions" : {
|
||||
"fileListOrObject" : {
|
||||
"oneOf" : [
|
||||
{
|
||||
"type" : "array",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
},
|
||||
{
|
||||
"type" : "object"
|
||||
}
|
||||
]
|
||||
},
|
||||
"localizable" : {
|
||||
"type" : "object",
|
||||
"additionalProperties" : false,
|
||||
@@ -35,9 +46,8 @@
|
||||
"description" : "If set to true, vcmi will skip validation of current translation json files"
|
||||
},
|
||||
"translations" : {
|
||||
"type" : "array",
|
||||
"description" : "List of files with translations for this language",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -122,9 +132,17 @@
|
||||
"description" : "If set to true, mod will not be enabled automatically on install"
|
||||
},
|
||||
"settings" : {
|
||||
"type" : "object",
|
||||
"description" : "List of changed game settings by mod",
|
||||
"$ref" : "gameSettings.json"
|
||||
"oneOf" : [
|
||||
{
|
||||
"type" : "object",
|
||||
"$ref" : "gameSettings.json"
|
||||
},
|
||||
{
|
||||
"type" : "array",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
},
|
||||
]
|
||||
},
|
||||
"filesystem" : {
|
||||
"type" : "object",
|
||||
@@ -206,94 +224,76 @@
|
||||
"$ref" : "#/definitions/localizable"
|
||||
},
|
||||
"translations" : {
|
||||
"type" : "array",
|
||||
"description" : "List of files with translations for this language",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"factions" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for towns/factions",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"heroClasses" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for hero classes",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"heroes" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for heroes",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"skills" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for skills",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"creatures" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for creatures",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"artifacts" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for artifacts",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"spells" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for spells",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"objects" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for objects",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"biomes" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for biomes",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"bonuses" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for bonuses",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"terrains" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for terrains",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"roads" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for roads",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"rivers" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for rivers",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"battlefields" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for battlefields",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"obstacles" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for obstacles",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"templates" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for RMG templates",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
},
|
||||
"scripts" : {
|
||||
"type" : "array",
|
||||
"description" : "List of configuration files for scripts",
|
||||
"items" : { "type" : "string", "format" : "textFile" }
|
||||
"$ref" : "#/definitions/fileListOrObject"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
{
|
||||
"type" : "object",
|
||||
"$schema" : "http://json-schema.org/draft-04/schema",
|
||||
"required" : [ "general", "video", "adventure", "battle", "input", "server", "logging", "launcher", "lobby", "gameTweaks" ],
|
||||
"required" : [ "general", "video", "adventure", "battle", "input", "server", "logging", "launcher", "lobby", "gameTweaks", "mods" ],
|
||||
"definitions" : {
|
||||
"logLevelEnum" : {
|
||||
"type" : "string",
|
||||
@@ -149,6 +149,23 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"mods" : {
|
||||
"type" : "object",
|
||||
"additionalProperties" : false,
|
||||
"default" : {},
|
||||
"required" : [
|
||||
"validation"
|
||||
],
|
||||
"properties" : {
|
||||
"validation" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "off", "basic", "full" ],
|
||||
"default" : "basic"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"video" : {
|
||||
"type" : "object",
|
||||
"additionalProperties" : false,
|
||||
@@ -167,6 +184,7 @@
|
||||
"targetfps",
|
||||
"vsync",
|
||||
"fontsType",
|
||||
"cursorScalingFactor",
|
||||
"fontScalingFactor",
|
||||
"upscalingFilter",
|
||||
"fontUpscalingFilter",
|
||||
@@ -178,22 +196,19 @@
|
||||
"additionalProperties" : false,
|
||||
"required" : [ "width", "height", "scaling" ],
|
||||
"properties" : {
|
||||
"width" : { "type" : "number" },
|
||||
"height" : { "type" : "number" },
|
||||
"scaling" : { "type" : "number" }
|
||||
},
|
||||
"defaultIOS" : {"width" : 800, "height" : 600, "scaling" : 200 },
|
||||
"defaultAndroid" : {"width" : 800, "height" : 600, "scaling" : 200 },
|
||||
"default" : {"width" : 800, "height" : 600, "scaling" : 100 }
|
||||
"width" : { "type" : "number", "default" : 1280 },
|
||||
"height" : { "type" : "number", "default" : 720 },
|
||||
"scaling" : { "type" : "number", "default" : 0 }
|
||||
}
|
||||
},
|
||||
"reservedWidth" : {
|
||||
"type" : "number",
|
||||
"defaultIOS" : 0.1, // iOS camera cutout / notch is excluded from available area by SDL
|
||||
"defaultIOS" : 0.1, // iOS camera cutout / notch is not excluded from available area by SDL, handle it this way
|
||||
"default" : 0
|
||||
},
|
||||
"fullscreen" : {
|
||||
"type" : "boolean",
|
||||
"default" : false
|
||||
"default" : true
|
||||
},
|
||||
"realFullscreen" : {
|
||||
"type" : "boolean",
|
||||
@@ -239,6 +254,10 @@
|
||||
"enum" : [ "auto", "original", "scalable" ],
|
||||
"default" : "auto"
|
||||
},
|
||||
"cursorScalingFactor" : {
|
||||
"type" : "number",
|
||||
"default" : 1
|
||||
},
|
||||
"fontScalingFactor" : {
|
||||
"type" : "number",
|
||||
"default" : 1
|
||||
|
@@ -90,8 +90,9 @@ These are fields that are present only in local mod.json file
|
||||
{
|
||||
// Following section describes configuration files with content added by mod
|
||||
// It can be split into several files in any way you want but recommended organization is
|
||||
// to keep one file per object (creature/hero/etc) and, if applicable, add separate file
|
||||
// with translatable strings for each type of content
|
||||
// to keep one file per object (creature/hero/etc)
|
||||
// Alternatively, for small changes you can embed changes to content directly in here, e.g.
|
||||
// "creatures" : { "core:imp" : { "health" : 5 }}
|
||||
|
||||
// list of factions/towns configuration files
|
||||
"factions" :
|
||||
|
@@ -26,7 +26,7 @@ class DLL_LINKAGE INativeTerrainProvider
|
||||
{
|
||||
public:
|
||||
virtual TerrainId getNativeTerrain() const = 0;
|
||||
virtual FactionID getFaction() const = 0;
|
||||
virtual FactionID getFactionID() const = 0;
|
||||
virtual bool isNativeTerrain(TerrainId terrain) const;
|
||||
};
|
||||
|
||||
|
@@ -36,15 +36,15 @@ public:
|
||||
|
||||
virtual vstd::RNG * getRNG() = 0;
|
||||
|
||||
virtual void apply(CPackForClient * pack) = 0;
|
||||
virtual void apply(CPackForClient & pack) = 0;
|
||||
|
||||
virtual void apply(BattleLogMessage * pack) = 0;
|
||||
virtual void apply(BattleStackMoved * pack) = 0;
|
||||
virtual void apply(BattleUnitsChanged * pack) = 0;
|
||||
virtual void apply(SetStackEffect * pack) = 0;
|
||||
virtual void apply(StacksInjured * pack) = 0;
|
||||
virtual void apply(BattleObstaclesChanged * pack) = 0;
|
||||
virtual void apply(CatapultAttack * pack) = 0;
|
||||
virtual void apply(BattleLogMessage & pack) = 0;
|
||||
virtual void apply(BattleStackMoved & pack) = 0;
|
||||
virtual void apply(BattleUnitsChanged & pack) = 0;
|
||||
virtual void apply(SetStackEffect & pack) = 0;
|
||||
virtual void apply(StacksInjured & pack) = 0;
|
||||
virtual void apply(BattleObstaclesChanged & pack) = 0;
|
||||
virtual void apply(CatapultAttack & pack) = 0;
|
||||
};
|
||||
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
|
@@ -20,8 +20,6 @@ set(launcher_SRCS
|
||||
innoextract.cpp
|
||||
mainwindow_moc.cpp
|
||||
languages.cpp
|
||||
launcherdirs.cpp
|
||||
jsonutils.cpp
|
||||
updatedialog_moc.cpp
|
||||
prepare.cpp
|
||||
)
|
||||
@@ -49,8 +47,6 @@ set(launcher_HEADERS
|
||||
firstLaunch/firstlaunch_moc.h
|
||||
mainwindow_moc.h
|
||||
languages.h
|
||||
launcherdirs.h
|
||||
jsonutils.h
|
||||
updatedialog_moc.h
|
||||
main.h
|
||||
helper.h
|
||||
@@ -206,7 +202,11 @@ elseif(NOT APPLE_IOS)
|
||||
target_link_libraries(vcmilauncher SDL2::SDL2)
|
||||
endif()
|
||||
|
||||
target_link_libraries(vcmilauncher vcmi Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network)
|
||||
if(ENABLE_STATIC_LIBS OR NOT (ENABLE_EDITOR AND ENABLE_LAUNCHER))
|
||||
target_compile_definitions(vcmilauncher PRIVATE VCMIQT_STATIC)
|
||||
endif()
|
||||
|
||||
target_link_libraries(vcmilauncher vcmi vcmiqt Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network)
|
||||
target_include_directories(vcmilauncher
|
||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
@@ -18,24 +18,8 @@
|
||||
#include <QList>
|
||||
#include <QString>
|
||||
#include <QFile>
|
||||
#include <QTemporaryDir>
|
||||
#include <QTemporaryDir>
|
||||
|
||||
#include "../vcmiqt/convpathqstring.h"
|
||||
|
||||
VCMI_LIB_USING_NAMESPACE
|
||||
|
||||
inline QString pathToQString(const boost::filesystem::path & path)
|
||||
{
|
||||
#ifdef VCMI_WINDOWS
|
||||
return QString::fromStdWString(path.wstring());
|
||||
#else
|
||||
return QString::fromStdString(path.string());
|
||||
#endif
|
||||
}
|
||||
|
||||
inline boost::filesystem::path qstringToPath(const QString & path)
|
||||
{
|
||||
#ifdef VCMI_WINDOWS
|
||||
return boost::filesystem::path(path.toStdWString());
|
||||
#else
|
||||
return boost::filesystem::path(path.toUtf8().data());
|
||||
#endif
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@
|
||||
#include "StdInc.h"
|
||||
#include "cdownloadmanager_moc.h"
|
||||
|
||||
#include "../launcherdirs.h"
|
||||
#include "../vcmiqt/launcherdirs.h"
|
||||
|
||||
#include "../../lib/CConfigHandler.h"
|
||||
|
||||
|
@@ -22,8 +22,8 @@
|
||||
#include "cdownloadmanager_moc.h"
|
||||
#include "chroniclesextractor.h"
|
||||
#include "../settingsView/csettingsview_moc.h"
|
||||
#include "../launcherdirs.h"
|
||||
#include "../jsonutils.h"
|
||||
#include "../vcmiqt/launcherdirs.h"
|
||||
#include "../vcmiqt/jsonutils.h"
|
||||
#include "../helper.h"
|
||||
|
||||
#include "../../lib/VCMIDirs.h"
|
||||
|
@@ -17,8 +17,8 @@
|
||||
#include "../../lib/modding/CModInfo.h"
|
||||
#include "../../lib/modding/IdentifierStorage.h"
|
||||
|
||||
#include "../jsonutils.h"
|
||||
#include "../launcherdirs.h"
|
||||
#include "../vcmiqt/jsonutils.h"
|
||||
#include "../vcmiqt/launcherdirs.h"
|
||||
|
||||
#include <future>
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
*/
|
||||
#include "StdInc.h"
|
||||
#include "prepare.h"
|
||||
#include "launcherdirs.h"
|
||||
#include "../vcmiqt/launcherdirs.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
|
@@ -15,7 +15,7 @@
|
||||
|
||||
#include "../modManager/cmodlistview_moc.h"
|
||||
#include "../helper.h"
|
||||
#include "../jsonutils.h"
|
||||
#include "../vcmiqt/jsonutils.h"
|
||||
#include "../languages.h"
|
||||
|
||||
#include <QFileInfo>
|
||||
@@ -127,7 +127,12 @@ void CSettingsView::loadSettings()
|
||||
#endif
|
||||
fillValidScalingRange();
|
||||
|
||||
ui->spinBoxInterfaceScaling->setValue(settings["video"]["resolution"]["scaling"].Float());
|
||||
ui->buttonScalingAuto->setChecked(settings["video"]["resolution"]["scaling"].Integer() == 0);
|
||||
if (settings["video"]["resolution"]["scaling"].Integer() == 0)
|
||||
ui->spinBoxInterfaceScaling->setValue(100);
|
||||
else
|
||||
ui->spinBoxInterfaceScaling->setValue(settings["video"]["resolution"]["scaling"].Float());
|
||||
|
||||
ui->spinBoxFramerateLimit->setValue(settings["video"]["targetfps"].Float());
|
||||
ui->spinBoxFramerateLimit->setDisabled(settings["video"]["vsync"].Bool());
|
||||
ui->sliderReservedArea->setValue(std::round(settings["video"]["reservedWidth"].Float() * 100));
|
||||
@@ -174,6 +179,7 @@ void CSettingsView::loadSettings()
|
||||
ui->sliderControllerSticksAcceleration->setValue(settings["input"]["controllerAxisScale"].Float() * 100);
|
||||
ui->lineEditGameLobbyHost->setText(QString::fromStdString(settings["lobby"]["hostname"].String()));
|
||||
ui->spinBoxNetworkPortLobby->setValue(settings["lobby"]["port"].Integer());
|
||||
ui->buttonVSync->setChecked(settings["video"]["vsync"].Bool());
|
||||
|
||||
if (settings["video"]["fontsType"].String() == "auto")
|
||||
ui->buttonFontAuto->setChecked(true);
|
||||
@@ -182,13 +188,19 @@ void CSettingsView::loadSettings()
|
||||
else
|
||||
ui->buttonFontScalable->setChecked(true);
|
||||
|
||||
if (settings["mods"]["validation"].String() == "off")
|
||||
ui->buttonValidationOff->setChecked(true);
|
||||
else if (settings["mods"]["validation"].String() == "basic")
|
||||
ui->buttonValidationBasic->setChecked(true);
|
||||
else
|
||||
ui->buttonValidationFull->setChecked(true);
|
||||
|
||||
loadToggleButtonSettings();
|
||||
}
|
||||
|
||||
void CSettingsView::loadToggleButtonSettings()
|
||||
{
|
||||
setCheckbuttonState(ui->buttonShowIntro, settings["video"]["showIntro"].Bool());
|
||||
setCheckbuttonState(ui->buttonVSync, settings["video"]["vsync"].Bool());
|
||||
setCheckbuttonState(ui->buttonAutoCheck, settings["launcher"]["autoCheckRepositories"].Bool());
|
||||
|
||||
setCheckbuttonState(ui->buttonRepositoryDefault, settings["launcher"]["defaultRepositoryEnabled"].Bool());
|
||||
@@ -205,10 +217,15 @@ void CSettingsView::loadToggleButtonSettings()
|
||||
std::string cursorType = settings["video"]["cursor"].String();
|
||||
int cursorTypeIndex = vstd::find_pos(cursorTypesList, cursorType);
|
||||
setCheckbuttonState(ui->buttonCursorType, cursorTypeIndex);
|
||||
ui->sliderScalingCursor->setDisabled(cursorType == "software"); // Not supported
|
||||
ui->labelScalingCursorValue->setDisabled(cursorType == "software"); // Not supported
|
||||
|
||||
int fontScalingPercentage = settings["video"]["fontScalingFactor"].Float() * 100;
|
||||
ui->sliderScalingFont->setValue(fontScalingPercentage / 5);
|
||||
|
||||
int cursorScalingPercentage = settings["video"]["cursorScalingFactor"].Float() * 100;
|
||||
ui->sliderScalingCursor->setValue(cursorScalingPercentage / 5);
|
||||
|
||||
}
|
||||
|
||||
void CSettingsView::fillValidResolutions()
|
||||
@@ -487,6 +504,8 @@ void CSettingsView::on_buttonCursorType_toggled(bool value)
|
||||
Settings node = settings.write["video"]["cursor"];
|
||||
node->String() = cursorTypesList[value ? 1 : 0];
|
||||
updateCheckbuttonText(ui->buttonCursorType);
|
||||
ui->sliderScalingCursor->setDisabled(value == 1); // Not supported
|
||||
ui->labelScalingCursorValue->setDisabled(value == 1); // Not supported
|
||||
}
|
||||
|
||||
void CSettingsView::loadTranslation()
|
||||
@@ -620,7 +639,6 @@ void CSettingsView::on_buttonVSync_toggled(bool value)
|
||||
Settings node = settings.write["video"]["vsync"];
|
||||
node->Bool() = value;
|
||||
ui->spinBoxFramerateLimit->setDisabled(settings["video"]["vsync"].Bool());
|
||||
updateCheckbuttonText(ui->buttonVSync);
|
||||
}
|
||||
|
||||
void CSettingsView::on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1)
|
||||
@@ -791,3 +809,39 @@ void CSettingsView::on_buttonFontOriginal_clicked(bool checked)
|
||||
Settings node = settings.write["video"]["fontsType"];
|
||||
node->String() = "original";
|
||||
}
|
||||
|
||||
void CSettingsView::on_buttonValidationOff_clicked(bool checked)
|
||||
{
|
||||
Settings node = settings.write["mods"]["validation"];
|
||||
node->String() = "off";
|
||||
}
|
||||
|
||||
void CSettingsView::on_buttonValidationBasic_clicked(bool checked)
|
||||
{
|
||||
Settings node = settings.write["mods"]["validation"];
|
||||
node->String() = "basic";
|
||||
}
|
||||
|
||||
void CSettingsView::on_buttonValidationFull_clicked(bool checked)
|
||||
{
|
||||
Settings node = settings.write["mods"]["validation"];
|
||||
node->String() = "full";
|
||||
}
|
||||
|
||||
void CSettingsView::on_sliderScalingCursor_valueChanged(int value)
|
||||
{
|
||||
int actualValuePercentage = value * 5;
|
||||
ui->labelScalingCursorValue->setText(QString("%1%").arg(actualValuePercentage));
|
||||
Settings node = settings.write["video"]["cursorScalingFactor"];
|
||||
node->Float() = actualValuePercentage / 100.0;
|
||||
}
|
||||
|
||||
void CSettingsView::on_buttonScalingAuto_toggled(bool checked)
|
||||
{
|
||||
ui->spinBoxInterfaceScaling->setDisabled(checked);
|
||||
ui->spinBoxInterfaceScaling->setValue(100);
|
||||
|
||||
Settings node = settings.write["video"]["resolution"]["scaling"];
|
||||
node->Integer() = checked ? 0 : 100;
|
||||
}
|
||||
|
||||
|
@@ -83,19 +83,24 @@ private slots:
|
||||
void on_sliderToleranceDistanceController_valueChanged(int value);
|
||||
void on_lineEditGameLobbyHost_textChanged(const QString &arg1);
|
||||
void on_spinBoxNetworkPortLobby_valueChanged(int arg1);
|
||||
|
||||
void on_sliderControllerSticksAcceleration_valueChanged(int value);
|
||||
|
||||
void on_sliderControllerSticksSensitivity_valueChanged(int value);
|
||||
|
||||
//void on_buttonTtfFont_toggled(bool value);
|
||||
|
||||
void on_sliderScalingFont_valueChanged(int value);
|
||||
|
||||
void on_buttonFontAuto_clicked(bool checked);
|
||||
void on_buttonFontScalable_clicked(bool checked);
|
||||
void on_buttonFontOriginal_clicked(bool checked);
|
||||
|
||||
|
||||
void on_buttonValidationOff_clicked(bool checked);
|
||||
|
||||
void on_buttonValidationBasic_clicked(bool checked);
|
||||
|
||||
void on_buttonValidationFull_clicked(bool checked);
|
||||
|
||||
void on_sliderScalingCursor_valueChanged(int value);
|
||||
|
||||
void on_buttonScalingAuto_toggled(bool checked);
|
||||
|
||||
private:
|
||||
Ui::CSettingsView * ui;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -639,267 +639,310 @@ Install successfully downloaded?</source>
|
||||
<context>
|
||||
<name>CSettingsView</name>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="682"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="98"/>
|
||||
<source>Off</source>
|
||||
<translation>关闭</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="307"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="441"/>
|
||||
<source>Artificial Intelligence</source>
|
||||
<translation>人工智能</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1072"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1038"/>
|
||||
<source>Interface Scaling</source>
|
||||
<translation>界面缩放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="924"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="604"/>
|
||||
<source>Neutral AI in battles</source>
|
||||
<translation>战场中立生物AI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="738"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="996"/>
|
||||
<source>Enemy AI in battles</source>
|
||||
<translation>战场敌方玩家AI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="821"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="751"/>
|
||||
<source>Additional repository</source>
|
||||
<translation>额外仓库</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="893"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="484"/>
|
||||
<source>Downscaling Filter</source>
|
||||
<translation>图像缩小过滤器</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="931"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
|
||||
<source>Adventure Map Allies</source>
|
||||
<translation>冒险地图友方玩家</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="490"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="866"/>
|
||||
<source>Online Lobby port</source>
|
||||
<translation>在线大厅端口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="331"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="666"/>
|
||||
<source>Autocombat AI in battles</source>
|
||||
<translation>自动战斗AI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="352"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1399"/>
|
||||
<source>Sticks Sensitivity</source>
|
||||
<translation>摇杆灵敏度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="618"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="908"/>
|
||||
<source>Automatic (Linear)</source>
|
||||
<translation>自动(线性)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="798"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="274"/>
|
||||
<source>Haptic Feedback</source>
|
||||
<translation>触觉反馈</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="835"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="378"/>
|
||||
<source>Software Cursor</source>
|
||||
<translation>软件指针</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1166"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="83"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="539"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1389"/>
|
||||
<source>Automatic</source>
|
||||
<translation>自动</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1171"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="75"/>
|
||||
<source>Mods Validation</source>
|
||||
<translation>模组验证</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="88"/>
|
||||
<source>None</source>
|
||||
<translation>无</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1176"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="93"/>
|
||||
<source>xBRZ x2</source>
|
||||
<translation>xBRZ x2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1181"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="98"/>
|
||||
<source>xBRZ x3</source>
|
||||
<translation>xBRZ x3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1186"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="103"/>
|
||||
<source>xBRZ x4</source>
|
||||
<translation>xBRZ x4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1194"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="316"/>
|
||||
<source>Full</source>
|
||||
<translation>完备</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="788"/>
|
||||
<source>Use scalable fonts</source>
|
||||
<translation>使用可缩放字体</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="138"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="859"/>
|
||||
<source>Online Lobby address</source>
|
||||
<translation>在线大厅地址</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1158"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<source>Cursor Scaling</source>
|
||||
<translation>指针缩放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1108"/>
|
||||
<source>Scalable</source>
|
||||
<translation>可缩放字体</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<source>Miscellaneous</source>
|
||||
<translation>杂项</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1303"/>
|
||||
<source>Font Scaling (experimental)</source>
|
||||
<translation>字体缩放(测试中)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1367"/>
|
||||
<source>Original</source>
|
||||
<translation>原始字体</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1406"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<translation>图像放大过滤器</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="317"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1439"/>
|
||||
<source>Basic</source>
|
||||
<translation>基本</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="656"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation>使用相对指针模式</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="608"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="898"/>
|
||||
<source>Nearest</source>
|
||||
<translation>最邻近</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="613"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="903"/>
|
||||
<source>Linear</source>
|
||||
<translation>线性</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="750"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="807"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation>输入 - 触屏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="900"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="774"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<translation>冒险地图敌方玩家</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="926"/>
|
||||
<source>Show Tutorial again</source>
|
||||
<translation>重新显示教程</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1151"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="139"/>
|
||||
<source>Reset</source>
|
||||
<translation>重置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="854"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1129"/>
|
||||
<source>Network</source>
|
||||
<translation>网络</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="741"/>
|
||||
<source>Audio</source>
|
||||
<translation>音频</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="842"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="477"/>
|
||||
<source>Relative Pointer Speed</source>
|
||||
<translation>相对指针速度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1137"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1045"/>
|
||||
<source>Music Volume</source>
|
||||
<translation>音乐音量</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="767"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="916"/>
|
||||
<source>Ignore SSL errors</source>
|
||||
<translation>忽略SSL错误</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="943"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="703"/>
|
||||
<source>Input - Mouse</source>
|
||||
<translation>输入 - 鼠标</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="345"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1226"/>
|
||||
<source>Long Touch Duration</source>
|
||||
<translation>长按触屏间隔</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="115"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="461"/>
|
||||
<source>%</source>
|
||||
<translation>%</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1037"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="873"/>
|
||||
<source>Controller Click Tolerance</source>
|
||||
<translation>控制器按键灵敏度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="359"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="281"/>
|
||||
<source>Touch Tap Tolerance</source>
|
||||
<translation>触屏点击灵敏度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1020"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="337"/>
|
||||
<source>Input - Controller</source>
|
||||
<translation>输入 - 控制器</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1086"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="267"/>
|
||||
<source>Sound Volume</source>
|
||||
<translation>音效音量</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="402"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1195"/>
|
||||
<source>Windowed</source>
|
||||
<translation>窗口化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="407"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1200"/>
|
||||
<source>Borderless fullscreen</source>
|
||||
<translation>无边框全屏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="412"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1205"/>
|
||||
<source>Exclusive fullscreen</source>
|
||||
<translation>独占全屏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="777"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1003"/>
|
||||
<source>Autosave limit (0 = off)</source>
|
||||
<translation>自动保存限制 (0 = 不限制)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1030"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="781"/>
|
||||
<source>Framerate Limit</source>
|
||||
<translation>帧率限制</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="760"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1413"/>
|
||||
<source>Autosave prefix</source>
|
||||
<translation>自动保存文件名前缀</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="828"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="989"/>
|
||||
<source>Mouse Click Tolerance</source>
|
||||
<translation>鼠标点击灵敏度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="94"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="933"/>
|
||||
<source>Sticks Acceleration</source>
|
||||
<translation>摇杆加速度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1008"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1354"/>
|
||||
<source>empty = map name prefix</source>
|
||||
<translation>空 = 地图名称前缀</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="101"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
|
||||
<source>Refresh now</source>
|
||||
<translation>立即刷新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="249"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="451"/>
|
||||
<source>Default repository</source>
|
||||
<translation>默认仓库</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="295"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="795"/>
|
||||
<source>Renderer</source>
|
||||
<translation>渲染器</translation>
|
||||
</message>
|
||||
@@ -909,7 +952,7 @@ Install successfully downloaded?</source>
|
||||
<translation>开启</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="389"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1182"/>
|
||||
<source>Select display mode for game
|
||||
|
||||
Windowed - game will run inside a window that covers part of your screen
|
||||
@@ -926,93 +969,93 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
|
||||
独占全屏模式 - 游戏会运行在一个覆盖全部屏幕的窗口,使用和你选择的分辨率。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="131"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="200"/>
|
||||
<source>Reserved screen area</source>
|
||||
<translation>保留屏幕区域</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="269"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
|
||||
<source>Heroes III Translation</source>
|
||||
<translatorcomment>发布版本里找不到这个项,不太清楚意义</translatorcomment>
|
||||
<translation>英雄无敌3翻译</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="646"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1233"/>
|
||||
<source>Check on startup</source>
|
||||
<translation>启动时检查更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="324"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="982"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>全屏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="64"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="212"/>
|
||||
<source>General</source>
|
||||
<translation>通用设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="210"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="852"/>
|
||||
<source>VCMI Language</source>
|
||||
<translation>VCMI语言</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1420"/>
|
||||
<source>Resolution</source>
|
||||
<translation>分辨率</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="791"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="222"/>
|
||||
<source>Autosave</source>
|
||||
<translation>自动存档</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="593"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="764"/>
|
||||
<source>VSync</source>
|
||||
<translation>垂直同步</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="338"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="649"/>
|
||||
<source>Display index</source>
|
||||
<translation>显示器序号</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="864"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="713"/>
|
||||
<source>Network port</source>
|
||||
<translation>网络端口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="521"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="945"/>
|
||||
<source>Video</source>
|
||||
<translation>视频设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="452"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="526"/>
|
||||
<source>Show intro</source>
|
||||
<translation>显示开场动画</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="525"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="540"/>
|
||||
<source>Active</source>
|
||||
<translation>激活</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="530"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="545"/>
|
||||
<source>Disabled</source>
|
||||
<translation>禁用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="531"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="546"/>
|
||||
<source>Enable</source>
|
||||
<translation>启用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="551"/>
|
||||
<source>Not Installed</source>
|
||||
<translation>未安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="537"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="552"/>
|
||||
<source>Install</source>
|
||||
<translation>安装</translation>
|
||||
</message>
|
||||
|
@@ -634,267 +634,310 @@ Nainstalovat úspěšně stažené?</translation>
|
||||
<context>
|
||||
<name>CSettingsView</name>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="682"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="98"/>
|
||||
<source>Off</source>
|
||||
<translation>Vypnuto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="307"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="441"/>
|
||||
<source>Artificial Intelligence</source>
|
||||
<translation>Umělá inteligence</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1072"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1038"/>
|
||||
<source>Interface Scaling</source>
|
||||
<translation>Škálování rozhraní</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="924"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="604"/>
|
||||
<source>Neutral AI in battles</source>
|
||||
<translation>Neutrální AI v bitvách</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="738"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="996"/>
|
||||
<source>Enemy AI in battles</source>
|
||||
<translation>Nepřátelská AI v bitvách</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="821"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="751"/>
|
||||
<source>Additional repository</source>
|
||||
<translation>Další repozitáře</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="893"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="484"/>
|
||||
<source>Downscaling Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="931"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
|
||||
<source>Adventure Map Allies</source>
|
||||
<translation>Spojenci na mapě světa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="490"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="866"/>
|
||||
<source>Online Lobby port</source>
|
||||
<translation>Port online předsíně</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="331"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="666"/>
|
||||
<source>Autocombat AI in battles</source>
|
||||
<translation>AI automatického boje v bitvách</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="352"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1399"/>
|
||||
<source>Sticks Sensitivity</source>
|
||||
<translation>Citlivost páček</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="618"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="908"/>
|
||||
<source>Automatic (Linear)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="798"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="274"/>
|
||||
<source>Haptic Feedback</source>
|
||||
<translation>Zpětná odezva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="835"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="378"/>
|
||||
<source>Software Cursor</source>
|
||||
<translation>Softwarový kurzor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1166"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="83"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="539"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1389"/>
|
||||
<source>Automatic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1171"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="75"/>
|
||||
<source>Mods Validation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="88"/>
|
||||
<source>None</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1176"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="93"/>
|
||||
<source>xBRZ x2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1181"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="98"/>
|
||||
<source>xBRZ x3</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1186"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="103"/>
|
||||
<source>xBRZ x4</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1194"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="316"/>
|
||||
<source>Full</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="788"/>
|
||||
<source>Use scalable fonts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="138"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="859"/>
|
||||
<source>Online Lobby address</source>
|
||||
<translation>Adresa online předsíně</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1158"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<source>Cursor Scaling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1108"/>
|
||||
<source>Scalable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<source>Miscellaneous</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1303"/>
|
||||
<source>Font Scaling (experimental)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1367"/>
|
||||
<source>Original</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1406"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<translation>Filtr škálování</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="317"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1439"/>
|
||||
<source>Basic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="656"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation>Použít režim relativního ukazatele</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="608"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="898"/>
|
||||
<source>Nearest</source>
|
||||
<translation>Nejbližší</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="613"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="903"/>
|
||||
<source>Linear</source>
|
||||
<translation>Lineární</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="750"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="807"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation>Vstup - dotyková obrazovka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="900"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="774"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<translation>Nepřátelé na mapě světa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="926"/>
|
||||
<source>Show Tutorial again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1151"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="139"/>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="854"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1129"/>
|
||||
<source>Network</source>
|
||||
<translation>Síť</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="741"/>
|
||||
<source>Audio</source>
|
||||
<translation>Zvuk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="842"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="477"/>
|
||||
<source>Relative Pointer Speed</source>
|
||||
<translation>Relativní rychlost myši</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1137"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1045"/>
|
||||
<source>Music Volume</source>
|
||||
<translation>Hlasitost hudby</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="767"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="916"/>
|
||||
<source>Ignore SSL errors</source>
|
||||
<translation>Ignorovat chyby SSL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="943"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="703"/>
|
||||
<source>Input - Mouse</source>
|
||||
<translation>Vstup - Myš</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="345"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1226"/>
|
||||
<source>Long Touch Duration</source>
|
||||
<translation>Doba dlouhého podržení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="115"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="461"/>
|
||||
<source>%</source>
|
||||
<translation>%</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1037"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="873"/>
|
||||
<source>Controller Click Tolerance</source>
|
||||
<translation>Odchylka klepnutí ovladače</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="359"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="281"/>
|
||||
<source>Touch Tap Tolerance</source>
|
||||
<translation>Odchylka klepnutí dotykem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1020"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="337"/>
|
||||
<source>Input - Controller</source>
|
||||
<translation>Vstup - ovladač</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1086"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="267"/>
|
||||
<source>Sound Volume</source>
|
||||
<translation>Hlasitost zvuků</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="402"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1195"/>
|
||||
<source>Windowed</source>
|
||||
<translation>V okně</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="407"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1200"/>
|
||||
<source>Borderless fullscreen</source>
|
||||
<translation>Celá obrazovka bez okrajů</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="412"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1205"/>
|
||||
<source>Exclusive fullscreen</source>
|
||||
<translation>Exkluzivní celá obrazovka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="777"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1003"/>
|
||||
<source>Autosave limit (0 = off)</source>
|
||||
<translation>Limit aut. uložení (0=vypnuto)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1030"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="781"/>
|
||||
<source>Framerate Limit</source>
|
||||
<translation>Omezení snímků za sekundu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="760"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1413"/>
|
||||
<source>Autosave prefix</source>
|
||||
<translation>Předpona aut. uložení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="828"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="989"/>
|
||||
<source>Mouse Click Tolerance</source>
|
||||
<translation>Odchylka klepnutí myší</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="94"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="933"/>
|
||||
<source>Sticks Acceleration</source>
|
||||
<translation>Zrychlení páček</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1008"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1354"/>
|
||||
<source>empty = map name prefix</source>
|
||||
<translation>prázná = předpona - název mapy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="101"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
|
||||
<source>Refresh now</source>
|
||||
<translation>Obnovit nyní</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="249"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="451"/>
|
||||
<source>Default repository</source>
|
||||
<translation>Výchozí repozitář</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="295"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="795"/>
|
||||
<source>Renderer</source>
|
||||
<translation>Vykreslovač</translation>
|
||||
</message>
|
||||
@@ -904,7 +947,7 @@ Nainstalovat úspěšně stažené?</translation>
|
||||
<translation>Zapnuto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="389"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1182"/>
|
||||
<source>Select display mode for game
|
||||
|
||||
Windowed - game will run inside a window that covers part of your screen
|
||||
@@ -921,92 +964,92 @@ Celá obrazovka bez okrajů- hra poběží v okně, které zakryje vaši celou
|
||||
Exkluzivní celá obrazovka - hra zakryje vaši celou obrazovku a použije vybrané rozlišení.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="131"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="200"/>
|
||||
<source>Reserved screen area</source>
|
||||
<translation>Vyhrazená část obrazovky</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="269"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
|
||||
<source>Heroes III Translation</source>
|
||||
<translation>Překlad Heroes III</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="646"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1233"/>
|
||||
<source>Check on startup</source>
|
||||
<translation>Zkontrolovat při zapnutí</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="324"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="982"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>Celá obrazovka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="64"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="212"/>
|
||||
<source>General</source>
|
||||
<translation>Všeobecné</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="210"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="852"/>
|
||||
<source>VCMI Language</source>
|
||||
<translation>Jazyk VCMI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1420"/>
|
||||
<source>Resolution</source>
|
||||
<translation>Rozlišení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="791"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="222"/>
|
||||
<source>Autosave</source>
|
||||
<translation>Automatické uložení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="593"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="764"/>
|
||||
<source>VSync</source>
|
||||
<translation>VSync</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="338"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="649"/>
|
||||
<source>Display index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="864"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="713"/>
|
||||
<source>Network port</source>
|
||||
<translation>Síťový port</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="521"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="945"/>
|
||||
<source>Video</source>
|
||||
<translation>Zobrazení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="452"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="526"/>
|
||||
<source>Show intro</source>
|
||||
<translation>Zobrazit intro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="525"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="540"/>
|
||||
<source>Active</source>
|
||||
<translation>Aktivní</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="530"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="545"/>
|
||||
<source>Disabled</source>
|
||||
<translation>Zakázáno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="531"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="546"/>
|
||||
<source>Enable</source>
|
||||
<translation>Povolit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="551"/>
|
||||
<source>Not Installed</source>
|
||||
<translation>Nenainstalováno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="537"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="552"/>
|
||||
<source>Install</source>
|
||||
<translation>Instalovat</translation>
|
||||
</message>
|
||||
|
@@ -626,267 +626,310 @@ Install successfully downloaded?</source>
|
||||
<context>
|
||||
<name>CSettingsView</name>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="682"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="98"/>
|
||||
<source>Off</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="307"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="441"/>
|
||||
<source>Artificial Intelligence</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1072"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1038"/>
|
||||
<source>Interface Scaling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="924"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="604"/>
|
||||
<source>Neutral AI in battles</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="738"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="996"/>
|
||||
<source>Enemy AI in battles</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="821"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="751"/>
|
||||
<source>Additional repository</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="931"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
|
||||
<source>Adventure Map Allies</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="490"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="866"/>
|
||||
<source>Online Lobby port</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="331"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="666"/>
|
||||
<source>Autocombat AI in battles</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="352"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1399"/>
|
||||
<source>Sticks Sensitivity</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="618"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="908"/>
|
||||
<source>Automatic (Linear)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="798"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="274"/>
|
||||
<source>Haptic Feedback</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="835"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="378"/>
|
||||
<source>Software Cursor</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1166"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="83"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="539"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1389"/>
|
||||
<source>Automatic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1171"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="75"/>
|
||||
<source>Mods Validation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="88"/>
|
||||
<source>None</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1176"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="93"/>
|
||||
<source>xBRZ x2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1181"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="98"/>
|
||||
<source>xBRZ x3</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1186"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="103"/>
|
||||
<source>xBRZ x4</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1194"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="316"/>
|
||||
<source>Full</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="788"/>
|
||||
<source>Use scalable fonts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="138"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="859"/>
|
||||
<source>Online Lobby address</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1158"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<source>Cursor Scaling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="317"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="608"/>
|
||||
<source>Nearest</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="613"/>
|
||||
<source>Linear</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="750"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="900"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1108"/>
|
||||
<source>Scalable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<source>Miscellaneous</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1303"/>
|
||||
<source>Font Scaling (experimental)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1367"/>
|
||||
<source>Original</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1406"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1439"/>
|
||||
<source>Basic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="656"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="898"/>
|
||||
<source>Nearest</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="903"/>
|
||||
<source>Linear</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="807"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="774"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="926"/>
|
||||
<source>Show Tutorial again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1151"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="139"/>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="854"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1129"/>
|
||||
<source>Network</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="741"/>
|
||||
<source>Audio</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="842"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="477"/>
|
||||
<source>Relative Pointer Speed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1137"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1045"/>
|
||||
<source>Music Volume</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="767"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="916"/>
|
||||
<source>Ignore SSL errors</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="943"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="703"/>
|
||||
<source>Input - Mouse</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="345"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1226"/>
|
||||
<source>Long Touch Duration</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="115"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="461"/>
|
||||
<source>%</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1037"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="873"/>
|
||||
<source>Controller Click Tolerance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="359"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="281"/>
|
||||
<source>Touch Tap Tolerance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1020"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="337"/>
|
||||
<source>Input - Controller</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1086"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="267"/>
|
||||
<source>Sound Volume</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="402"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1195"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="407"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1200"/>
|
||||
<source>Borderless fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="412"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1205"/>
|
||||
<source>Exclusive fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="777"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1003"/>
|
||||
<source>Autosave limit (0 = off)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="893"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="484"/>
|
||||
<source>Downscaling Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1030"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="781"/>
|
||||
<source>Framerate Limit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="760"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1413"/>
|
||||
<source>Autosave prefix</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="828"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="989"/>
|
||||
<source>Mouse Click Tolerance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="94"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="933"/>
|
||||
<source>Sticks Acceleration</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1008"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1354"/>
|
||||
<source>empty = map name prefix</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="101"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
|
||||
<source>Refresh now</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="249"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="451"/>
|
||||
<source>Default repository</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="295"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="795"/>
|
||||
<source>Renderer</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -896,7 +939,7 @@ Install successfully downloaded?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="389"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1182"/>
|
||||
<source>Select display mode for game
|
||||
|
||||
Windowed - game will run inside a window that covers part of your screen
|
||||
@@ -907,92 +950,92 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="131"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="200"/>
|
||||
<source>Reserved screen area</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="269"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
|
||||
<source>Heroes III Translation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="646"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1233"/>
|
||||
<source>Check on startup</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="324"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="982"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="64"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="212"/>
|
||||
<source>General</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="210"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="852"/>
|
||||
<source>VCMI Language</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1420"/>
|
||||
<source>Resolution</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="791"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="222"/>
|
||||
<source>Autosave</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="593"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="764"/>
|
||||
<source>VSync</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="338"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="649"/>
|
||||
<source>Display index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="864"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="713"/>
|
||||
<source>Network port</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="521"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="945"/>
|
||||
<source>Video</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="452"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="526"/>
|
||||
<source>Show intro</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="525"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="540"/>
|
||||
<source>Active</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="530"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="545"/>
|
||||
<source>Disabled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="531"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="546"/>
|
||||
<source>Enable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="551"/>
|
||||
<source>Not Installed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="537"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="552"/>
|
||||
<source>Install</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@@ -639,12 +639,13 @@ Installer les téchargements réussis?</translation>
|
||||
<context>
|
||||
<name>CSettingsView</name>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="682"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="98"/>
|
||||
<source>Off</source>
|
||||
<translation>Désactivé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="307"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="441"/>
|
||||
<source>Artificial Intelligence</source>
|
||||
<translation>Intelligence Artificielle</translation>
|
||||
</message>
|
||||
@@ -654,187 +655,229 @@ Installer les téchargements réussis?</translation>
|
||||
<translation>Activé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="738"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="996"/>
|
||||
<source>Enemy AI in battles</source>
|
||||
<translation>IA ennemie dans les batailles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="249"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="451"/>
|
||||
<source>Default repository</source>
|
||||
<translation>Dépôt par défaut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="593"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="764"/>
|
||||
<source>VSync</source>
|
||||
<translation>Synchronisation verticalle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="490"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="866"/>
|
||||
<source>Online Lobby port</source>
|
||||
<translation>Port de la salle d'attente en ligne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="331"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="666"/>
|
||||
<source>Autocombat AI in battles</source>
|
||||
<translation>IA de combat automatique dans les batailles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="352"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1399"/>
|
||||
<source>Sticks Sensitivity</source>
|
||||
<translation>Sensibilité au batons</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="618"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="908"/>
|
||||
<source>Automatic (Linear)</source>
|
||||
<translation>Automatique (Linéaire)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="798"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="274"/>
|
||||
<source>Haptic Feedback</source>
|
||||
<translation>Retour Tactile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="835"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="378"/>
|
||||
<source>Software Cursor</source>
|
||||
<translation>Curseur Logiciel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1166"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="83"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="539"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1389"/>
|
||||
<source>Automatic</source>
|
||||
<translation>Automatique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1171"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="75"/>
|
||||
<source>Mods Validation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="88"/>
|
||||
<source>None</source>
|
||||
<translation>Aucun</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1176"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="93"/>
|
||||
<source>xBRZ x2</source>
|
||||
<translation>xBRZ x2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1181"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="98"/>
|
||||
<source>xBRZ x3</source>
|
||||
<translation>xBRZ x3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1186"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="103"/>
|
||||
<source>xBRZ x4</source>
|
||||
<translation>xBRZ x4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1194"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="316"/>
|
||||
<source>Full</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="788"/>
|
||||
<source>Use scalable fonts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="138"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="859"/>
|
||||
<source>Online Lobby address</source>
|
||||
<translation>Adresse de la salle d'attente en ligne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1158"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<source>Cursor Scaling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1108"/>
|
||||
<source>Scalable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<source>Miscellaneous</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1303"/>
|
||||
<source>Font Scaling (experimental)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1367"/>
|
||||
<source>Original</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1406"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<translation>Filtre d'Agrandissement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="317"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1439"/>
|
||||
<source>Basic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="656"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation>Utiliser le Mode de Pointeur Relatif</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="608"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="898"/>
|
||||
<source>Nearest</source>
|
||||
<translation>Le plus Proche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="613"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="903"/>
|
||||
<source>Linear</source>
|
||||
<translation>Linéaire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="750"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="807"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation>Entrée - Écran tactile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="854"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1129"/>
|
||||
<source>Network</source>
|
||||
<translation>Réseau</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="893"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="484"/>
|
||||
<source>Downscaling Filter</source>
|
||||
<translation>Filtre de Rétrécissement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="926"/>
|
||||
<source>Show Tutorial again</source>
|
||||
<translation>Remontrer le Didacticiel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1151"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="139"/>
|
||||
<source>Reset</source>
|
||||
<translation>Réinitialiser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="741"/>
|
||||
<source>Audio</source>
|
||||
<translation>Audio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="842"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="477"/>
|
||||
<source>Relative Pointer Speed</source>
|
||||
<translation>Vitesse de Pointeur Relatif</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1137"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1045"/>
|
||||
<source>Music Volume</source>
|
||||
<translation>Volume de la Musique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="767"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="916"/>
|
||||
<source>Ignore SSL errors</source>
|
||||
<translation>Ignorer les erreurs SSL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="943"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="703"/>
|
||||
<source>Input - Mouse</source>
|
||||
<translation>Entrée - Sourie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="345"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1226"/>
|
||||
<source>Long Touch Duration</source>
|
||||
<translation>Durée de Touche Prolongée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="115"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="461"/>
|
||||
<source>%</source>
|
||||
<translation>%</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1037"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="873"/>
|
||||
<source>Controller Click Tolerance</source>
|
||||
<translation>Tolérance au Clic de Contrôleur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="359"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="281"/>
|
||||
<source>Touch Tap Tolerance</source>
|
||||
<translation>Tolérance à la Frappe de Touche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1020"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="337"/>
|
||||
<source>Input - Controller</source>
|
||||
<translation>Entrée - Contrôleur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1086"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="267"/>
|
||||
<source>Sound Volume</source>
|
||||
<translation>Volume du Son</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="389"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1182"/>
|
||||
<source>Select display mode for game
|
||||
|
||||
Windowed - game will run inside a window that covers part of your screen
|
||||
@@ -851,167 +894,167 @@ Mode fenêtré sans bord - le jeu s"exécutera dans une fenêtre qui couvre
|
||||
Mode exclusif plein écran - le jeu couvrira l"intégralité de votre écran et utilisera la résolution sélectionnée.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="402"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1195"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Fenêtré</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="407"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1200"/>
|
||||
<source>Borderless fullscreen</source>
|
||||
<translation>Fenêtré sans bord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="412"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1205"/>
|
||||
<source>Exclusive fullscreen</source>
|
||||
<translation>Plein écran exclusif</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="131"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="200"/>
|
||||
<source>Reserved screen area</source>
|
||||
<translation>Zone d'écran réservée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="924"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="604"/>
|
||||
<source>Neutral AI in battles</source>
|
||||
<translation>IA neutre dans les batailles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="777"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1003"/>
|
||||
<source>Autosave limit (0 = off)</source>
|
||||
<translation>Limite de sauvegarde auto (0 = désactivé)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="900"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="774"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<translation>Ennemis de la carte d"aventure</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="760"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1413"/>
|
||||
<source>Autosave prefix</source>
|
||||
<translation>Préfix de sauvegarde auto.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1008"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1354"/>
|
||||
<source>empty = map name prefix</source>
|
||||
<translation>vide = prefix du nom de carte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1072"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1038"/>
|
||||
<source>Interface Scaling</source>
|
||||
<translation>Mise à l"échelle de l"interface</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1030"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="781"/>
|
||||
<source>Framerate Limit</source>
|
||||
<translation>Limite de fréquence d"images</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="295"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="795"/>
|
||||
<source>Renderer</source>
|
||||
<translation>Moteur de rendu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="269"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
|
||||
<source>Heroes III Translation</source>
|
||||
<translation>Traduction de Heroes III</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="931"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
|
||||
<source>Adventure Map Allies</source>
|
||||
<translation>Alliés de la carte d"aventure</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="821"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="751"/>
|
||||
<source>Additional repository</source>
|
||||
<translation>Dépôt supplémentaire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="646"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1233"/>
|
||||
<source>Check on startup</source>
|
||||
<translation>Vérifier au démarrage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="828"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="989"/>
|
||||
<source>Mouse Click Tolerance</source>
|
||||
<translation>Tolérance au Clic de Sourie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="94"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="933"/>
|
||||
<source>Sticks Acceleration</source>
|
||||
<translation>Accelération de Bâton</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="101"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
|
||||
<source>Refresh now</source>
|
||||
<translation>Actualiser maintenant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="324"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="982"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>Plein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="64"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="212"/>
|
||||
<source>General</source>
|
||||
<translation>Général</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="210"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="852"/>
|
||||
<source>VCMI Language</source>
|
||||
<translation>Langue de VCMI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1420"/>
|
||||
<source>Resolution</source>
|
||||
<translation>Résolution</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="791"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="222"/>
|
||||
<source>Autosave</source>
|
||||
<translation>Sauvegarde automatique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="338"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="649"/>
|
||||
<source>Display index</source>
|
||||
<translation>Index d'affichage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="864"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="713"/>
|
||||
<source>Network port</source>
|
||||
<translation>Port de réseau</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="521"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="945"/>
|
||||
<source>Video</source>
|
||||
<translation>Vidéo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="452"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="526"/>
|
||||
<source>Show intro</source>
|
||||
<translation>Montrer l'intro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="525"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="540"/>
|
||||
<source>Active</source>
|
||||
<translation>Actif</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="530"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="545"/>
|
||||
<source>Disabled</source>
|
||||
<translation>Désactivé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="531"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="546"/>
|
||||
<source>Enable</source>
|
||||
<translation>Activé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="551"/>
|
||||
<source>Not Installed</source>
|
||||
<translation>Pas Installé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="537"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="552"/>
|
||||
<source>Install</source>
|
||||
<translation>Installer</translation>
|
||||
</message>
|
||||
|
@@ -634,267 +634,310 @@ Installation erfolgreich heruntergeladen?</translation>
|
||||
<context>
|
||||
<name>CSettingsView</name>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="682"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="98"/>
|
||||
<source>Off</source>
|
||||
<translation>Aus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="307"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="441"/>
|
||||
<source>Artificial Intelligence</source>
|
||||
<translation>Künstliche Intelligenz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1072"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1038"/>
|
||||
<source>Interface Scaling</source>
|
||||
<translation>Skalierung der Benutzeroberfläche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="924"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="604"/>
|
||||
<source>Neutral AI in battles</source>
|
||||
<translation>Neutrale KI in Kämpfen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="738"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="996"/>
|
||||
<source>Enemy AI in battles</source>
|
||||
<translation>Gegnerische KI in Kämpfen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="821"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="751"/>
|
||||
<source>Additional repository</source>
|
||||
<translation>Zusätzliches Repository</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="893"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="484"/>
|
||||
<source>Downscaling Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="931"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
|
||||
<source>Adventure Map Allies</source>
|
||||
<translation>Abenteuerkarte Verbündete</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="490"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="866"/>
|
||||
<source>Online Lobby port</source>
|
||||
<translation>Online-Lobby-Port</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="331"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="666"/>
|
||||
<source>Autocombat AI in battles</source>
|
||||
<translation>Autokampf-KI in Kämpfen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="352"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1399"/>
|
||||
<source>Sticks Sensitivity</source>
|
||||
<translation>Sticks Empfindlichkeit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="618"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="908"/>
|
||||
<source>Automatic (Linear)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="798"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="274"/>
|
||||
<source>Haptic Feedback</source>
|
||||
<translation>Haptisches Feedback</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="835"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="378"/>
|
||||
<source>Software Cursor</source>
|
||||
<translation>Software-Cursor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1166"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="83"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="539"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1389"/>
|
||||
<source>Automatic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1171"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="75"/>
|
||||
<source>Mods Validation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="88"/>
|
||||
<source>None</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1176"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="93"/>
|
||||
<source>xBRZ x2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1181"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="98"/>
|
||||
<source>xBRZ x3</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1186"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="103"/>
|
||||
<source>xBRZ x4</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1194"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="316"/>
|
||||
<source>Full</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="788"/>
|
||||
<source>Use scalable fonts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="138"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="859"/>
|
||||
<source>Online Lobby address</source>
|
||||
<translation>Adresse der Online-Lobby</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1158"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<source>Cursor Scaling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1108"/>
|
||||
<source>Scalable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<source>Miscellaneous</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1303"/>
|
||||
<source>Font Scaling (experimental)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1367"/>
|
||||
<source>Original</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1406"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<translation>Hochskalierungsfilter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="317"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1439"/>
|
||||
<source>Basic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="656"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation>Relativen Zeigermodus verwenden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="608"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="898"/>
|
||||
<source>Nearest</source>
|
||||
<translation>Nearest</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="613"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="903"/>
|
||||
<source>Linear</source>
|
||||
<translation>Linear</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="750"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="807"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation>Eingabe - Touchscreen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="900"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="774"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<translation>Abenteuerkarte Feinde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="926"/>
|
||||
<source>Show Tutorial again</source>
|
||||
<translation>Zeige Tutorial erneut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1151"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="139"/>
|
||||
<source>Reset</source>
|
||||
<translation>Zurücksetzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="854"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1129"/>
|
||||
<source>Network</source>
|
||||
<translation>Netzwerk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="741"/>
|
||||
<source>Audio</source>
|
||||
<translation>Audio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="842"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="477"/>
|
||||
<source>Relative Pointer Speed</source>
|
||||
<translation>Relative Zeigergeschwindigkeit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1137"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1045"/>
|
||||
<source>Music Volume</source>
|
||||
<translation>Musik Lautstärke</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="767"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="916"/>
|
||||
<source>Ignore SSL errors</source>
|
||||
<translation>SSL-Fehler ignorieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="943"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="703"/>
|
||||
<source>Input - Mouse</source>
|
||||
<translation>Eingabe - Maus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="345"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1226"/>
|
||||
<source>Long Touch Duration</source>
|
||||
<translation>Dauer der Berührung für "lange Berührung"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="115"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="461"/>
|
||||
<source>%</source>
|
||||
<translation>%</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1037"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="873"/>
|
||||
<source>Controller Click Tolerance</source>
|
||||
<translation>Toleranz bei Controller Klick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="359"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="281"/>
|
||||
<source>Touch Tap Tolerance</source>
|
||||
<translation>Toleranz bei Berührungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1020"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="337"/>
|
||||
<source>Input - Controller</source>
|
||||
<translation>Eingabe - Controller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1086"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="267"/>
|
||||
<source>Sound Volume</source>
|
||||
<translation>Sound-Lautstärke</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="402"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1195"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Fenstermodus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="407"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1200"/>
|
||||
<source>Borderless fullscreen</source>
|
||||
<translation>Randloser Vollbildmodus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="412"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1205"/>
|
||||
<source>Exclusive fullscreen</source>
|
||||
<translation>Exklusiver Vollbildmodus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="777"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1003"/>
|
||||
<source>Autosave limit (0 = off)</source>
|
||||
<translation>Limit für Autospeicherung (0 = aus)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1030"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="781"/>
|
||||
<source>Framerate Limit</source>
|
||||
<translation>Limit der Bildrate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="760"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1413"/>
|
||||
<source>Autosave prefix</source>
|
||||
<translation>Präfix für Autospeicherung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="828"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="989"/>
|
||||
<source>Mouse Click Tolerance</source>
|
||||
<translation>Toleranz bei Mausklick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="94"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="933"/>
|
||||
<source>Sticks Acceleration</source>
|
||||
<translation>Sticks Beschleunigung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1008"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1354"/>
|
||||
<source>empty = map name prefix</source>
|
||||
<translation>leer = Kartenname als Präfix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="101"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
|
||||
<source>Refresh now</source>
|
||||
<translation>Jetzt aktualisieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="249"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="451"/>
|
||||
<source>Default repository</source>
|
||||
<translation>Standard Repository</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="295"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="795"/>
|
||||
<source>Renderer</source>
|
||||
<translation>Renderer</translation>
|
||||
</message>
|
||||
@@ -904,7 +947,7 @@ Installation erfolgreich heruntergeladen?</translation>
|
||||
<translation>An</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="389"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1182"/>
|
||||
<source>Select display mode for game
|
||||
|
||||
Windowed - game will run inside a window that covers part of your screen
|
||||
@@ -921,92 +964,92 @@ Randloser Fenstermodus - das Spiel läuft in einem Fenster, das den gesamten Bil
|
||||
Exklusiver Vollbildmodus - das Spiel bedeckt den gesamten Bildschirm und verwendet die gewählte Auflösung.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="131"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="200"/>
|
||||
<source>Reserved screen area</source>
|
||||
<translation>Reservierter Bildschirmbereich</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="269"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
|
||||
<source>Heroes III Translation</source>
|
||||
<translation>Heroes III Übersetzung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="646"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1233"/>
|
||||
<source>Check on startup</source>
|
||||
<translation>Beim Start prüfen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="324"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="982"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>Vollbild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="64"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="212"/>
|
||||
<source>General</source>
|
||||
<translation>Allgemein</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="210"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="852"/>
|
||||
<source>VCMI Language</source>
|
||||
<translation>VCMI-Sprache</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1420"/>
|
||||
<source>Resolution</source>
|
||||
<translation>Auflösung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="791"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="222"/>
|
||||
<source>Autosave</source>
|
||||
<translation>Autospeichern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="593"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="764"/>
|
||||
<source>VSync</source>
|
||||
<translation>VSync</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="338"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="649"/>
|
||||
<source>Display index</source>
|
||||
<translation>Anzeige-Index</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="864"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="713"/>
|
||||
<source>Network port</source>
|
||||
<translation>Netzwerk-Port</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="521"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="945"/>
|
||||
<source>Video</source>
|
||||
<translation>Video</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="452"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="526"/>
|
||||
<source>Show intro</source>
|
||||
<translation>Intro anzeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="525"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="540"/>
|
||||
<source>Active</source>
|
||||
<translation>Aktiv</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="530"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="545"/>
|
||||
<source>Disabled</source>
|
||||
<translation>Deaktiviert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="531"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="546"/>
|
||||
<source>Enable</source>
|
||||
<translation>Aktivieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="551"/>
|
||||
<source>Not Installed</source>
|
||||
<translation>Nicht installiert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="537"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="552"/>
|
||||
<source>Install</source>
|
||||
<translation>Installieren</translation>
|
||||
</message>
|
||||
|
@@ -634,267 +634,310 @@ Zainstalować pomyślnie pobrane?</translation>
|
||||
<context>
|
||||
<name>CSettingsView</name>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="682"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="98"/>
|
||||
<source>Off</source>
|
||||
<translation>Wyłączony</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="307"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="441"/>
|
||||
<source>Artificial Intelligence</source>
|
||||
<translation>Sztuczna Inteligencja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1072"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1038"/>
|
||||
<source>Interface Scaling</source>
|
||||
<translation>Skala interfejsu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="924"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="604"/>
|
||||
<source>Neutral AI in battles</source>
|
||||
<translation>AI bitewne jednostek neutralnych</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="738"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="996"/>
|
||||
<source>Enemy AI in battles</source>
|
||||
<translation>AI bitewne wrogów</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="821"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="751"/>
|
||||
<source>Additional repository</source>
|
||||
<translation>Dodatkowe repozytorium</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="893"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="484"/>
|
||||
<source>Downscaling Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="931"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="597"/>
|
||||
<source>Adventure Map Allies</source>
|
||||
<translation>AI sojuszników mapy przygody</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="490"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="866"/>
|
||||
<source>Online Lobby port</source>
|
||||
<translation>Port lobby online</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="331"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="666"/>
|
||||
<source>Autocombat AI in battles</source>
|
||||
<translation>AI szybkiej walki</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="352"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1399"/>
|
||||
<source>Sticks Sensitivity</source>
|
||||
<translation>Czułość gałek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="618"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="908"/>
|
||||
<source>Automatic (Linear)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="798"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="274"/>
|
||||
<source>Haptic Feedback</source>
|
||||
<translation>Wibracje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="835"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="378"/>
|
||||
<source>Software Cursor</source>
|
||||
<translation>Kursor programowy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1166"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="83"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="539"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1389"/>
|
||||
<source>Automatic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1171"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="75"/>
|
||||
<source>Mods Validation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="88"/>
|
||||
<source>None</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1176"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="93"/>
|
||||
<source>xBRZ x2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1181"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="98"/>
|
||||
<source>xBRZ x3</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1186"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="103"/>
|
||||
<source>xBRZ x4</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1194"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="316"/>
|
||||
<source>Full</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="788"/>
|
||||
<source>Use scalable fonts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="138"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="859"/>
|
||||
<source>Online Lobby address</source>
|
||||
<translation>Adres lobby online</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1158"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<source>Cursor Scaling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1108"/>
|
||||
<source>Scalable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<source>Miscellaneous</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1303"/>
|
||||
<source>Font Scaling (experimental)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1367"/>
|
||||
<source>Original</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1406"/>
|
||||
<source>Upscaling Filter</source>
|
||||
<translation>Filtr wyostrzający</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="317"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1439"/>
|
||||
<source>Basic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="656"/>
|
||||
<source>Use Relative Pointer Mode</source>
|
||||
<translation>Użyj relatywnego trybu kursora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="608"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="898"/>
|
||||
<source>Nearest</source>
|
||||
<translation>Najbliższych</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="613"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="903"/>
|
||||
<source>Linear</source>
|
||||
<translation>Liniowy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="750"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="807"/>
|
||||
<source>Input - Touchscreen</source>
|
||||
<translation>Sterowanie - Ekran dotykowy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="900"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="774"/>
|
||||
<source>Adventure Map Enemies</source>
|
||||
<translation>AI wrogów mapy przygody</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1144"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="926"/>
|
||||
<source>Show Tutorial again</source>
|
||||
<translation>Pokaż ponownie samouczek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1151"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="139"/>
|
||||
<source>Reset</source>
|
||||
<translation>Zresetuj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="854"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1129"/>
|
||||
<source>Network</source>
|
||||
<translation>Sieć</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="741"/>
|
||||
<source>Audio</source>
|
||||
<translation>Dźwięk i muzyka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="842"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="477"/>
|
||||
<source>Relative Pointer Speed</source>
|
||||
<translation>Prędkość kursora w trybie relatywnym</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1137"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1045"/>
|
||||
<source>Music Volume</source>
|
||||
<translation>Głośność muzyki</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="767"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="916"/>
|
||||
<source>Ignore SSL errors</source>
|
||||
<translation>Ignoruj błędy SSL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="943"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="703"/>
|
||||
<source>Input - Mouse</source>
|
||||
<translation>Sterowanie - Mysz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="345"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1226"/>
|
||||
<source>Long Touch Duration</source>
|
||||
<translation>Czas do długiego dotyku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="115"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="461"/>
|
||||
<source>%</source>
|
||||
<translation>%</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1037"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="873"/>
|
||||
<source>Controller Click Tolerance</source>
|
||||
<translation>Tolerancja na kliknięcia poza elementami (kontroler)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="359"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="281"/>
|
||||
<source>Touch Tap Tolerance</source>
|
||||
<translation>Tolerancja na nietrafianie dotykiem w elementy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1020"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="337"/>
|
||||
<source>Input - Controller</source>
|
||||
<translation>Sterowanie - Kontroler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1086"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="267"/>
|
||||
<source>Sound Volume</source>
|
||||
<translation>Głośność dźwięku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="402"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1195"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Okno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="407"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1200"/>
|
||||
<source>Borderless fullscreen</source>
|
||||
<translation>Pełny ekran (tryb okna)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="412"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1205"/>
|
||||
<source>Exclusive fullscreen</source>
|
||||
<translation>Pełny ekran klasyczny</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="777"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1003"/>
|
||||
<source>Autosave limit (0 = off)</source>
|
||||
<translation>Limit autozapisów (0 = brak)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1030"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="781"/>
|
||||
<source>Framerate Limit</source>
|
||||
<translation>Limit FPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="760"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1413"/>
|
||||
<source>Autosave prefix</source>
|
||||
<translation>Przedrostek autozapisu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="828"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="989"/>
|
||||
<source>Mouse Click Tolerance</source>
|
||||
<translation>Tolerancja na kliknięcia poza elementami (mysz)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="94"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="933"/>
|
||||
<source>Sticks Acceleration</source>
|
||||
<translation>Przyspieszenie gałek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1008"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1354"/>
|
||||
<source>empty = map name prefix</source>
|
||||
<translation>puste = przedrostek z nazwy mapy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="101"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="590"/>
|
||||
<source>Refresh now</source>
|
||||
<translation>Odśwież</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="249"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="451"/>
|
||||
<source>Default repository</source>
|
||||
<translation>Domyślne repozytorium</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="295"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="795"/>
|
||||
<source>Renderer</source>
|
||||
<translation>Renderer</translation>
|
||||
</message>
|
||||
@@ -904,7 +947,7 @@ Zainstalować pomyślnie pobrane?</translation>
|
||||
<translation>Włączony</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="389"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1182"/>
|
||||
<source>Select display mode for game
|
||||
|
||||
Windowed - game will run inside a window that covers part of your screen
|
||||
@@ -921,92 +964,92 @@ Pełny ekran w trybie okna - gra uruchomi się w oknie przysłaniającym cały e
|
||||
Pełny ekran klasyczny - gra przysłoni cały ekran uruchamiając się w wybranej przez ciebie rozdzielczości ekranu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="131"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="200"/>
|
||||
<source>Reserved screen area</source>
|
||||
<translation>Zarezerwowany obszar ekranu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="269"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="429"/>
|
||||
<source>Heroes III Translation</source>
|
||||
<translation>Tłumaczenie Heroes III</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="646"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1233"/>
|
||||
<source>Check on startup</source>
|
||||
<translation>Sprawdzaj przy uruchomieniu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="324"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="982"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>Pełny ekran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="64"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="212"/>
|
||||
<source>General</source>
|
||||
<translation>Ogólne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="210"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="852"/>
|
||||
<source>VCMI Language</source>
|
||||
<translation>Język VCMI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1079"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="1420"/>
|
||||
<source>Resolution</source>
|
||||
<translation>Rozdzielczość</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="791"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="222"/>
|
||||
<source>Autosave</source>
|
||||
<translation>Autozapis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="593"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="764"/>
|
||||
<source>VSync</source>
|
||||
<translation>Synchronizacja pionowa (VSync)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="338"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="649"/>
|
||||
<source>Display index</source>
|
||||
<translation>Numer wyświetlacza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="864"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="713"/>
|
||||
<source>Network port</source>
|
||||
<translation>Port sieciowy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="521"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="945"/>
|
||||
<source>Video</source>
|
||||
<translation>Obraz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="452"/>
|
||||
<location filename="../settingsView/csettingsview_moc.ui" line="526"/>
|
||||
<source>Show intro</source>
|
||||
<translation>Pokaż intro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="525"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="540"/>
|
||||
<source>Active</source>
|
||||
<translation>Aktywny</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="530"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="545"/>
|
||||
<source>Disabled</source>
|
||||
<translation>Wyłączone</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="531"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="546"/>
|
||||
<source>Enable</source>
|
||||
<translation>Włącz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="536"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="551"/>
|
||||
<source>Not Installed</source>
|
||||
<translation>Nie zainstalowano</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="537"/>
|
||||
<location filename="../settingsView/csettingsview_moc.cpp" line="552"/>
|
||||
<source>Install</source>
|
||||
<translation>Zainstaluj</translation>
|
||||
</message>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user