1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Merge pull request #1642 from IvanSavenko/map_render_regression_fix

Map render regression fix
This commit is contained in:
Ivan Savenko
2023-03-07 01:13:39 +02:00
committed by GitHub
22 changed files with 439 additions and 459 deletions

View File

@@ -109,7 +109,9 @@ const CGHeroInstance * HeroPtr::get(bool doWeExpectNull) const
}
else
{
assert(obj);
if (!obj)
logAi->error("Accessing no longer accessible hero %s!", h->getNameTranslated());
//assert(obj);
//assert(owned);
}
}

View File

@@ -211,7 +211,7 @@ void DefenceBehavior::evaluateDefence(Goals::TGoalVec & tasks, const CGTownInsta
if(path.turn() <= treat.turn - 2)
{
#if NKAI_TRACE_LEVEL >= 1
logAi->trace("Deffer defence of %s by %s because he has enough time to rich the town next trun",
logAi->trace("Defer defence of %s by %s because he has enough time to reach the town next trun",
town->name,
path.targetHero->name);
#endif

View File

@@ -161,7 +161,7 @@ void ExecuteHeroChain::accept(AIGateway * ai)
if(node.turns == 0)
{
logAi->error(
"Enable to complete chain. Expected hero %s to arive to %s but he is at %s",
"Unable to complete chain. Expected hero %s to arive to %s but he is at %s",
hero->getNameTranslated(),
node.coord.toString(),
hero->visitablePos().toString());
@@ -169,7 +169,7 @@ void ExecuteHeroChain::accept(AIGateway * ai)
return;
}
// no exception means we were not able to rich the tile
// no exception means we were not able to reach the tile
ai->nullkiller->lockHero(hero, HeroLockedReason::HERO_CHAIN);
blockedIndexes.insert(node.parentIndex);
}
@@ -177,7 +177,7 @@ void ExecuteHeroChain::accept(AIGateway * ai)
{
if(!heroPtr.validAndSet())
{
logAi->debug("Hero %s was killed while attempting to rich %s", heroPtr.name, node.coord.toString());
logAi->debug("Hero %s was killed while attempting to reach %s", heroPtr.name, node.coord.toString());
return;
}

View File

@@ -8,6 +8,7 @@
"author" : "VCMI-Team",
"modType" : "Grafik",
"skipValidation" : true,
"translations" : [
"config/vcmi/german.json"
]
@@ -19,6 +20,7 @@
"author" : "Zespół VCMI",
"modType" : "Graficzny",
"skipValidation" : true,
"translations" : [
"config/vcmi/polish.json"
]
@@ -30,6 +32,7 @@
"author" : "Команда VCMI",
"modType" : "Графический",
"skipValidation" : true,
"translations" : [
"config/vcmi/russian.json"
]

View File

@@ -613,7 +613,7 @@ bool MusicEntry::stop(int fade_ms)
assert(startTime != uint32_t(-1));
float playDuration = (endTime - startTime + startPosition) / 1000.f;
owner->trackPositions[currentName] = playDuration;
logGlobal->info("Stopping music file %s at %f", currentName, playDuration);
logGlobal->trace("Stopping music file %s at %f", currentName, playDuration);
Mix_FadeOutMusic(fade_ms);
return true;

View File

@@ -1963,7 +1963,8 @@ void CPlayerInterface::playerStartsTurn(PlayerColor player)
}
else
{
adventureInt->infoBar->showSelection();
if (player == playerID)
adventureInt->infoBar->showSelection();
while (GH.listInt.front() != adventureInt && !dynamic_cast<CInfoWindow*>(GH.listInt.front().get())) //don't remove dialogs that expect query answer
GH.popInts(1);
}

View File

@@ -617,7 +617,18 @@ void MapRendererDebug::renderTile(IMapRendererContext & context, Canvas & target
uint8_t MapRendererDebug::checksum(IMapRendererContext & context, const int3 & coordinates)
{
return 0;
uint8_t result = 0;
if (context.showVisitable())
result += 1;
if (context.showBlockable())
result += 2;
if (context.showGrid())
result += 4;
return result;
}
MapRendererPath::MapRendererPath()

View File

@@ -283,7 +283,7 @@ double MapRendererAdventureFadingContext::objectTransparency(ObjectInstanceID ob
if(objectID == target)
return progress;
return 1.0;
return MapRendererAdventureContext::objectTransparency(objectID, coordinates);
}
MapRendererAdventureMovingContext::MapRendererAdventureMovingContext(const MapRendererContextState & viewState)

View File

@@ -118,6 +118,12 @@ bool CMapHandler::compareObjectBlitOrder(const CGObjectInstance * a, const CGObj
if(a->pos.y != b->pos.y)
return a->pos.y < b->pos.y;
// heroes should appear on top of objects on the same tile
if(b->ID==Obj::HERO && a->ID!=Obj::HERO)
return true;
if(b->ID!=Obj::HERO && a->ID==Obj::HERO)
return false;
// or, if all other tests fail to determine priority - simply based on H3M order
return a->id < b->id;
}

View File

@@ -222,7 +222,7 @@
},
{
"message" : 152,
"appearChance" : { "min" : 67, "max" : 67 }
"appearChance" : { "min" : 67 }
}
],
"onVisitedMessage" : 147,

View File

@@ -26,6 +26,10 @@
"type":"string",
"description": "Author of the mod. Can be nickname, real name or name of team"
},
"skipValidation" : {
"type":"boolean",
"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",
@@ -87,7 +91,7 @@
"language" : {
"type":"string",
"description": "Base language of the mod, before applying localizations. By default vcmi assumes English",
"enum" : [ "english", "german", "polish", "russian", "ukrainian" ],
"enum" : [ "chinese", "english", "german", "polish", "russian", "ukrainian" ],
},
"depends": {
"type":"array",

View File

@@ -21,7 +21,6 @@
"playerName",
"music",
"sound",
"encoding",
"language",
"swipe",
"swipeDesktop",
@@ -46,10 +45,6 @@
"type" : "number",
"default" : 88
},
"encoding" : {
"type" : "string",
"default" : "auto"
},
"swipe" : {
"type" : "boolean",
"default" : true
@@ -68,7 +63,7 @@
},
"language" : {
"type":"string",
"enum" : [ "english", "german", "polish", "russian", "ukrainian" ],
"enum" : [ "chinese", "english", "german", "polish", "russian", "ukrainian" ],
"default" : "english"
},
"lastSave" : {

View File

@@ -31,26 +31,10 @@ QString resolutionToString(const QSize & resolution)
}
}
/// List of encoding which can be selected from Launcher.
/// Note that it is possible to specify enconding manually in settings.json
static const std::string knownEncodingsList[] = //TODO: remove hardcode
{
// Asks vcmi to automatically detect encoding
"auto",
// European Windows-125X encodings
"CP1250", // West European, covers mostly Slavic languages that use latin script
"CP1251", // Covers languages that use cyrillic scrypt
"CP1252", // Latin/East European, covers most of latin languages
// Chinese encodings
"GBK", // extension of GB2312, also known as CP936
"GB2312", // basic set for Simplified Chinese. Separate from GBK to allow proper detection of H3 fonts
// Korean encodings
"CP949" // extension of EUC-KR.
};
/// List of tags of languages that can be selected from Launcher (and have translation for Launcher)
static const std::string languageTagList[] =
{
"chinese",
"english",
"german",
"polish",
@@ -119,10 +103,6 @@ void CSettingsView::loadSettings()
ui->lineEditGameDir->setText(pathToQString(VCMIDirs::get().binaryPath()));
ui->lineEditTempDir->setText(pathToQString(VCMIDirs::get().userLogsPath()));
std::string encoding = settings["general"]["encoding"].String();
size_t encodingIndex = boost::range::find(knownEncodingsList, encoding) - knownEncodingsList;
if(encodingIndex < ui->comboBoxEncoding->count())
ui->comboBoxEncoding->setCurrentIndex((int)encodingIndex);
ui->comboBoxAutoSave->setCurrentIndex(settings["general"]["saveFrequency"].Integer() > 0 ? 1 : 0);
std::string language = settings["general"]["language"].String();
@@ -291,12 +271,6 @@ void CSettingsView::on_plainTextEditRepos_textChanged()
}
}
void CSettingsView::on_comboBoxEncoding_currentIndexChanged(int index)
{
Settings node = settings.write["general"]["encoding"];
node->String() = knownEncodingsList[index];
}
void CSettingsView::on_openTempDir_clicked()
{
QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(ui->lineEditTempDir->text()).absoluteFilePath()));

View File

@@ -49,8 +49,6 @@ private slots:
void on_plainTextEditRepos_textChanged();
void on_comboBoxEncoding_currentIndexChanged(int index);
void on_openTempDir_clicked();
void on_openUserDataDir_clicked();

View File

@@ -114,259 +114,159 @@
<x>0</x>
<y>0</y>
<width>620</width>
<height>762</height>
<height>731</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="3,3,1,1">
<item row="0" column="0">
<widget class="QLabel" name="labelGeneral">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
<layout class="QGridLayout" name="gridLayout" columnstretch="3,0,0,0">
<item row="22" column="0" colspan="4">
<widget class="QPlainTextEdit" name="plainTextEditRepos">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="text">
<string>General</string>
<property name="plainText">
<string notr="true">http://downloads.vcmi.eu/Mods/repository.json</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelLanguage">
<property name="text">
<string>VCMI Language</string>
<item row="12" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelEncoding">
<property name="text">
<string>Heroes III character set</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxEncoding">
<item>
<property name="text">
<string>Automatic detection</string>
<string notr="true">VCAI</string>
</property>
</item>
<item>
<property name="text">
<string>Central European (Windows 1250)</string>
<string notr="true">Nullkiller</string>
</property>
</item>
<item>
<property name="text">
<string>Cyrillic script (Windows 1251)</string>
</property>
</item>
<item>
<property name="text">
<string>Western European (Windows 1252)</string>
</property>
</item>
<item>
<property name="text">
<string>Simplified Chinese (GBK)</string>
</property>
</item>
<item>
<property name="text">
<string>Simplified Chinese (GB2312)</string>
</property>
</item>
<item>
<property name="text">
<string>Korean (Windows 949)</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelNetworkPort">
<property name="text">
<string>Network port</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelAutoSave">
<property name="text">
<string>Autosave</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelBuildVersionDesc">
<property name="text">
<string>Build version</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="labelVideo">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Video</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelResolution">
<property name="text">
<string>Resolution</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="labelFullScreen">
<property name="text">
<string>Fullscreen</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="labelShowIntro">
<property name="text">
<string>Show intro</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelDisplayIndex">
<property name="text">
<string>Display index</string>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="labelCursorType">
<property name="text">
<string>Cursor</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelArtificialIntelligence">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Artificial Intelligence</string>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="labelPlayerAI">
<property name="text">
<string>Adventure Map AI</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="labelNeutralAI">
<property name="text">
<string>Neutral AI</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="labelFriendlyAI">
<property name="text">
<string>Friendly AI</string>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="labelEnemyAI">
<property name="text">
<string>Enemy AI</string>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="labelDataDirs">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<item row="21" column="2" colspan="2">
<widget class="QPushButton" name="updatesButton">
<property name="text">
<string>Data Directories</string>
<string>Update now</string>
</property>
</widget>
</item>
<item row="18" column="0">
<widget class="QLabel" name="labelGameDir">
<item row="2" column="0">
<widget class="QLabel" name="labelNetworkPort">
<property name="text">
<string>Extra data directory</string>
<string>Network port</string>
</property>
</widget>
</item>
<item row="18" column="1">
<item row="14" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxFriendlyAI">
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="13" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxNeutralAI">
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelAutoSave">
<property name="text">
<string>Autosave</string>
</property>
</widget>
</item>
<item row="17" column="1">
<widget class="QLineEdit" name="lineEditGameDir">
<property name="text">
<string notr="true">/usr/share/vcmi</string>
</property>
</widget>
</item>
<item row="18" column="2">
<widget class="QPushButton" name="changeGameDataDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Change</string>
</property>
</widget>
</item>
<item row="18" column="3">
<widget class="QPushButton" name="openGameDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="labelUserDataDir">
<property name="text">
<string>User data directory</string>
</property>
</widget>
</item>
<item row="19" column="3">
<widget class="QPushButton" name="openUserDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="labelTempDir">
<property name="text">
<string>Log files directory</string>
</property>
</widget>
</item>
<item row="20" column="3">
<widget class="QPushButton" name="openTempDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="21" column="0">
<item row="8" column="0">
<widget class="QLabel" name="labelShowIntro">
<property name="text">
<string>Show intro</string>
</property>
</widget>
</item>
<item row="18" column="1" colspan="2">
<widget class="QLineEdit" name="lineEditUserDataDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxFullScreen">
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
<item>
<property name="text">
<string>Real</string>
</property>
</item>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="labelRepositories">
<property name="font">
<font>
@@ -379,15 +279,15 @@
</property>
</widget>
</item>
<item row="22" column="0">
<widget class="QLabel" name="labelAutoCheck">
<item row="9" column="0">
<widget class="QLabel" name="labelDisplayIndex">
<property name="text">
<string>Check on startup</string>
<string>Display index</string>
</property>
</widget>
</item>
<item row="22" column="1">
<widget class="QComboBox" name="comboBoxAutoCheck">
<item row="3" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxAutoSave">
<property name="currentIndex">
<number>1</number>
</property>
@@ -403,24 +303,122 @@
</item>
</widget>
</item>
<item row="22" column="2" colspan="2">
<widget class="QPushButton" name="updatesButton">
<item row="5" column="0">
<widget class="QLabel" name="labelVideo">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Update now</string>
<string>Video</string>
</property>
</widget>
</item>
<item row="23" column="0" colspan="4">
<widget class="QPlainTextEdit" name="plainTextEditRepos">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="plainText">
<string notr="true">http://downloads.vcmi.eu/Mods/repository.json</string>
<item row="19" column="0">
<widget class="QLabel" name="labelTempDir">
<property name="text">
<string>Log files directory</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="3">
<item row="15" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxEnemyAI">
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelBuildVersionDesc">
<property name="text">
<string>Build version</string>
</property>
</widget>
</item>
<item row="17" column="3">
<widget class="QPushButton" name="openGameDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="3">
<widget class="QLineEdit" name="lineEditBuildVersion">
<property name="text">
<string notr="true"/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="8" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxShowIntro">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="labelArtificialIntelligence">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Artificial Intelligence</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="labelResolution">
<property name="text">
<string>Resolution</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelCursorType">
<property name="text">
<string>Cursor</string>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="labelNeutralAI">
<property name="text">
<string>Neutral AI</string>
</property>
</widget>
</item>
<item row="10" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxCursorType">
<item>
<property name="text">
@@ -439,6 +437,77 @@
</item>
</widget>
</item>
<item row="21" column="0">
<widget class="QLabel" name="labelAutoCheck">
<property name="text">
<string>Check on startup</string>
</property>
</widget>
</item>
<item row="18" column="3">
<widget class="QPushButton" name="openUserDataDir">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelFullScreen">
<property name="text">
<string>Fullscreen</string>
</property>
</widget>
</item>
<item row="9" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxDisplayIndex"/>
</item>
<item row="6" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxResolution"/>
</item>
<item row="19" column="1" colspan="2">
<widget class="QLineEdit" name="lineEditTempDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelLanguage">
<property name="text">
<string>VCMI Language</string>
</property>
</widget>
</item>
<item row="21" column="1">
<widget class="QComboBox" name="comboBoxAutoCheck">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelPlayerAI">
<property name="text">
<string>Adventure Map AI</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxLanguage">
<item>
@@ -446,6 +515,11 @@
<string>English</string>
</property>
</item>
<item>
<property name="text">
<string>简体中文 (Simplified Chinese)</string>
</property>
</item>
<item>
<property name="text">
<string>Deutsch (German)</string>
@@ -468,7 +542,54 @@
</item>
</widget>
</item>
<item row="3" column="1" colspan="3">
<item row="16" column="0">
<widget class="QLabel" name="labelDataDirs">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Data Directories</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelGeneral">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>General</string>
</property>
</widget>
</item>
<item row="18" column="0">
<widget class="QLabel" name="labelUserDataDir">
<property name="text">
<string>User data directory</string>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="labelGameDir">
<property name="text">
<string>Extra data directory</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="labelFriendlyAI">
<property name="text">
<string>Friendly AI</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QSpinBox" name="spinBoxNetworkPort">
<property name="minimum">
<number>1024</number>
@@ -481,175 +602,13 @@
</property>
</widget>
</item>
<item row="4" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxAutoSave">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="7" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxResolution"/>
</item>
<item row="19" column="1" colspan="2">
<widget class="QLineEdit" name="lineEditUserDataDir">
<item row="17" column="2">
<widget class="QPushButton" name="changeGameDataDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="20" column="1" colspan="2">
<widget class="QLineEdit" name="lineEditTempDir">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">/home/user/.vcmi</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="16" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxEnemyAI">
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="15" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxFriendlyAI">
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="14" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxNeutralAI">
<property name="currentText">
<string notr="true">BattleAI</string>
</property>
<item>
<property name="text">
<string notr="true">BattleAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">StupidAI</string>
</property>
</item>
</widget>
</item>
<item row="13" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxPlayerAI">
<property name="currentText">
<string notr="true">VCAI</string>
</property>
<item>
<property name="text">
<string notr="true">VCAI</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Nullkiller</string>
</property>
</item>
</widget>
</item>
<item row="10" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxDisplayIndex"/>
</item>
<item row="9" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxShowIntro">
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
</widget>
</item>
<item row="8" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxFullScreen">
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>On</string>
</property>
</item>
<item>
<property name="text">
<string>Real</string>
</property>
</item>
</widget>
</item>
<item row="5" column="1" colspan="3">
<widget class="QLineEdit" name="lineEditBuildVersion">
<property name="text">
<string notr="true"/>
</property>
<property name="readOnly">
<bool>true</bool>
<string>Change</string>
</property>
</widget>
</item>

View File

@@ -25,8 +25,9 @@ void CGeneralTextHandler::detectInstallParameters()
{
using LanguageFootprint = std::array<double, 16>;
static const std::array<LanguageFootprint, 6> knownFootprints =
static const std::array<LanguageFootprint, 7> knownFootprints =
{ {
{ { 0.1602, 0.0000, 0.0357, 0.0054, 0.0038, 0.0017, 0.0077, 0.0214, 0.0000, 0.0000, 0.1264, 0.1947, 0.2012, 0.1406, 0.0480, 0.0532 } },
{ { 0.0559, 0.0000, 0.1983, 0.0051, 0.0222, 0.0183, 0.4596, 0.2405, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000 } },
{ { 0.0493, 0.0000, 0.1926, 0.0047, 0.0230, 0.0121, 0.4133, 0.2780, 0.0002, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0259, 0.0008 } },
{ { 0.0534, 0.0000, 0.1705, 0.0047, 0.0418, 0.0208, 0.4775, 0.2191, 0.0001, 0.0000, 0.0000, 0.0000, 0.0000, 0.0005, 0.0036, 0.0080 } },
@@ -35,8 +36,9 @@ void CGeneralTextHandler::detectInstallParameters()
{ { 0.0559, 0.0000, 0.1807, 0.0059, 0.0036, 0.0013, 0.0046, 0.0134, 0.0000, 0.0004, 0.0000, 0.0487, 0.0209, 0.0060, 0.4615, 0.1972 } },
} };
static const std::array<std::string, 6> knownLanguages =
static const std::array<std::string, 7> knownLanguages =
{ {
"chinese",
"english",
"french",
"german",
@@ -257,27 +259,35 @@ const std::string & CGeneralTextHandler::deserialize(const TextIdentifier & iden
void CGeneralTextHandler::registerString(const std::string & modContext, const TextIdentifier & UID, const std::string & localized)
{
assert(!modContext.empty());
assert(!getModLanguage(modContext).empty());
assert(UID.get().find("..") == std::string::npos); // invalid identifier - there is section that was evaluated to empty string
//assert(stringsLocalizations.count(UID.get()) == 0); // registering already registered string?
if (stringsLocalizations.count(UID.get()) > 0)
if(stringsLocalizations.count(UID.get()) > 0)
{
std::string oldValue = stringsLocalizations[UID.get()].baseValue;
auto & value = stringsLocalizations[UID.get()];
if (oldValue != localized)
logMod->warn("Duplicate registered string '%s' found! Old value: '%s', new value: '%s'", UID.get(), oldValue, localized);
return;
if(value.baseLanguage.empty())
{
value.baseLanguage = getModLanguage(modContext);
value.baseValue = localized;
}
else
{
if(value.baseValue != localized)
logMod->warn("Duplicate registered string '%s' found! Old value: '%s', new value: '%s'", UID.get(), value.baseValue, localized);
}
}
else
{
StringState result;
result.baseLanguage = getModLanguage(modContext);
result.baseValue = localized;
result.modContext = modContext;
assert(!modContext.empty());
assert(!getModLanguage(modContext).empty());
StringState result;
result.baseLanguage = getModLanguage(modContext);
result.baseValue = localized;
result.modContext = modContext;
stringsLocalizations[UID.get()] = result;
stringsLocalizations[UID.get()] = result;
}
}
void CGeneralTextHandler::registerStringOverride(const std::string & modContext, const std::string & language, const TextIdentifier & UID, const std::string & localized)
@@ -602,9 +612,6 @@ std::string CGeneralTextHandler::getInstalledLanguage()
std::string CGeneralTextHandler::getInstalledEncoding()
{
auto explicitSetting = settings["general"]["encoding"].String();
if (explicitSetting != "auto")
return explicitSetting;
return settings["session"]["encoding"].String();
}

View File

@@ -1156,6 +1156,9 @@ bool CModHandler::validateTranslations(TModID modName) const
if (mod.config[language.identifier].isNull())
continue;
if (mod.config[language.identifier]["skipValidation"].Bool())
continue;
auto fileList = mod.config[language.identifier]["translations"].convertTo<std::vector<std::string> >();
JsonNode json = JsonUtils::assembleFromFiles(fileList);
result |= VLC->generaltexth->validateTranslation(language.identifier, modName, json);

View File

@@ -14,6 +14,7 @@ namespace Languages
enum class ELanguages
{
CHINESE,
ENGLISH,
FRENCH,
GERMAN,
@@ -47,11 +48,13 @@ struct Options
inline auto const & getLanguageList( )
{
static const std::array<Options, 6> languages
static const std::array<Options, 7> languages
{ {
{ "chinese", "Chinese", "简体中文", "GBK", true, true },
{ "english", "English", "English", "CP1252", true, true },
{ "french", "French", "Français", "CP1252", true, false },
{ "french", "French", "Français", "CP1252", true, true },
{ "german", "German", "Deutsch", "CP1252", true, true },
//TODO: korean - CP949 encoding
{ "polish", "Polish", "Polski", "CP1250", true, true },
{ "russian", "Russian", "Русский", "CP1251", true, true },
{ "ukrainian", "Ukrainian", "Українська", "CP1251", true, true }

View File

@@ -404,7 +404,7 @@ void CObjectClassesHandler::afterLoadFinalization()
std::string CObjectClassesHandler::getObjectName(si32 type, si32 subtype) const
{
const auto handler = getHandlerFor(type, subtype);
if (handler->hasNameTextID())
if (handler && handler->hasNameTextID())
return handler->getNameTranslated();
else
return objects[type]->getNameTranslated();

View File

@@ -46,6 +46,11 @@ public:
void configureObject(CRewardableObject * object, CRandomGenerator & rng) const;
void init(const JsonNode & objectConfig);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & parameters;
}
};
class DLL_LINKAGE CRewardableConstructor : public AObjectTypeHandler
@@ -60,6 +65,14 @@ public:
void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const override;
std::unique_ptr<IObjectInfo> getObjectInfo(std::shared_ptr<const ObjectTemplate> tmpl) const override;
template <typename Handler> void serialize(Handler &h, const int version)
{
AObjectTypeHandler::serialize(h, version);
if (version >= 816)
h & objectInfo;
}
};
VCMI_LIB_NAMESPACE_END

View File

@@ -544,6 +544,7 @@ void CRewardableObject::newTurn(CRandomGenerator & rand) const
void CRewardableObject::initObj(CRandomGenerator & rand)
{
VLC->objtypeh->getHandlerFor(ID, subID)->configureObject(this, rand);
assert(!info.empty());
}
CRewardableObject::CRewardableObject():

View File

@@ -14,7 +14,7 @@
VCMI_LIB_NAMESPACE_BEGIN
const ui32 SERIALIZATION_VERSION = 815;
const ui32 SERIALIZATION_VERSION = 816;
const ui32 MINIMAL_SERIALIZATION_VERSION = 813;
const std::string SAVEGAME_MAGIC = "VCMISVG";