1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

- reordered files in cmake so files with long compile times will be

compiled first.
- changed format of modSettings.json, VCMI should properly update file
on the first run.
- implemented property "defaultTavern" that acts as default value for
"tavern" entry in hero class and town formats.
This commit is contained in:
Ivan Savenko 2013-11-03 12:07:23 +00:00
parent aa1c193b88
commit c4716d0a9a
28 changed files with 132 additions and 41 deletions

View File

@ -4,10 +4,10 @@ cmake_minimum_required(VERSION 2.6)
include_directories(${Boost_INCLUDE_DIRS} ${CMAKE_HOME_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_HOME_DIRECTORY}/lib ${CMAKE_HOME_DIRECTORY}/AI/FuzzyLite)
set(VCAI_SRCS
AIUtility.cpp
Goals.cpp
main.cpp
VCAI.cpp
Goals.cpp
AIUtility.cpp
main.cpp
Fuzzy.cpp
)

View File

@ -136,14 +136,14 @@ add_definitions(-DM_LIB_DIR="${CMAKE_INSTALL_PREFIX}/${LIB_DIR}")
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/vcmi")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
if (ENABLE_ERM)
add_subdirectory(scripting/erm)
endif()
add_subdirectory(lib)
add_subdirectory(lib/minizip)
add_subdirectory(client)
add_subdirectory(lib/minizip)
add_subdirectory(server)
add_subdirectory(AI)
if (ENABLE_ERM)
add_subdirectory(scripting/erm)
endif()
if (ENABLE_EDITOR)
add_subdirectory(editor)
endif()

View File

@ -716,7 +716,6 @@
"defend": "BGORDFND.wav",
"killed": "BGORKILL.wav",
"move": "BGORMOVE.wav",
"shoot": "BGORSHOT.wav",
"wince": "BGORWNCE.wav"
}
},
@ -1488,7 +1487,6 @@
"defend": "BGORDFND.wav",
"killed": "BGORKILL.wav",
"move": "BGORMOVE.wav",
"shoot": "BGORSHOT.wav",
"wince": "BGORWNCE.wav"
}
},

View File

@ -6,9 +6,15 @@ include_directories(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLMIXER_INCLUD
include_directories(${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS})
set(client_SRCS
CPreGame.cpp
Client.cpp
CPlayerInterface.cpp
CMT.cpp
GUIClasses.cpp
battle/CBattleInterface.cpp
../CCallback.cpp
battle/CBattleAnimations.cpp
battle/CBattleInterface.cpp
battle/CBattleInterfaceClasses.cpp
battle/CCreatureAnimation.cpp
gui/CGuiHandler.cpp
@ -28,17 +34,12 @@ set(client_SRCS
CGameInfo.cpp
CHeroWindow.cpp
CKingdomInterface.cpp
Client.cpp
CMessage.cpp
CMT.cpp
CMusicHandler.cpp
CPlayerInterface.cpp
CPreGame.cpp
CSpellWindow.cpp
CVideoHandler.cpp
CQuestLog.cpp
Graphics.cpp
GUIClasses.cpp
mapHandler.cpp
NetPacksClient.cpp
)

View File

@ -116,6 +116,7 @@
},
"musicTheme" : "music/CstleTown",
"defaultTavern" : 5,
"townBackground": "TBCSBACK.bmp",
"guildWindow": "TPMAGECS.bmp",

View File

@ -120,6 +120,7 @@
},
"musicTheme" : "music/ElemTown",
"defaultTavern" : 5,
"townBackground": "TBELBACK.bmp",
"guildWindow": "TPMAGEEL.bmp",

View File

@ -115,6 +115,7 @@
},
"musicTheme" : "music/Dungeon",
"defaultTavern" : 5,
"townBackground": "TBDNBACK.bmp",
"guildWindow": "TPMAGEDN.bmp",

View File

@ -116,6 +116,7 @@
},
"musicTheme" : "music/FortressTown",
"defaultTavern" : 5,
"townBackground": "TBFRBACK.bmp",
"guildWindow": "TPMAGEFR.bmp",

View File

@ -116,6 +116,7 @@
},
"musicTheme" : "music/InfernoTown",
"defaultTavern" : 5,
"townBackground": "TBINBACK.bmp",
"guildWindow": "TPMAGEIN.bmp",

View File

@ -120,6 +120,7 @@
},
"musicTheme" : "music/NecroTown",
"defaultTavern" : 5,
"townBackground": "TBNCBACK.bmp",
"guildWindow": "TPMAGENC.bmp",

View File

@ -120,6 +120,7 @@
},
"musicTheme" : "music/Rampart",
"defaultTavern" : 5,
"townBackground": "TBRMBACK.bmp",
"guildWindow": "TPMAGERM.bmp",

View File

@ -114,6 +114,7 @@
},
"musicTheme" : "music/Stronghold",
"defaultTavern" : 5,
"townBackground": "TBSTBACK.bmp",
"guildWindow": "TPMAGEST.bmp",

View File

@ -115,6 +115,7 @@
},
"musicTheme" : "music/TowerTown",
"defaultTavern" : 5,
"townBackground": "TBTWBACK.bmp",
"guildWindow": "TPMAGETW.bmp",

View File

@ -3,6 +3,7 @@
{
"index": 0,
"faction" : "castle",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH00.DEF", "female" : "CH01.DEF" },
@ -13,6 +14,7 @@
{
"index": 1,
"faction" : "castle",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH00.DEF", "female" : "CH01.DEF" },
@ -23,6 +25,7 @@
{
"index": 2,
"faction" : "rampart",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH02.DEF", "female" : "CH03.DEF" },
@ -33,6 +36,7 @@
{
"index": 3,
"faction" : "rampart",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH02.DEF", "female" : "CH03.DEF" },
@ -43,6 +47,7 @@
{
"index": 4,
"faction" : "tower",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH05.DEF", "female" : "CH04.DEF" },
@ -53,6 +58,7 @@
{
"index": 5,
"faction" : "tower",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH05.DEF", "female" : "CH04.DEF" },
@ -63,6 +69,7 @@
{
"index": 6,
"faction" : "inferno",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH06.DEF", "female" : "CH07.DEF" },
@ -73,6 +80,7 @@
{
"index": 7,
"faction" : "inferno",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH06.DEF", "female" : "CH07.DEF" },
@ -83,6 +91,7 @@
{
"index": 8,
"faction" : "necropolis",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH08.DEF", "female" : "CH09.DEF" },
@ -93,6 +102,7 @@
{
"index": 9,
"faction" : "necropolis",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH08.DEF", "female" : "CH09.DEF" },
@ -103,6 +113,7 @@
{
"index": 10,
"faction" : "dungeon",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH010.DEF", "female" : "CH11.DEF" },
@ -113,6 +124,7 @@
{
"index": 11,
"faction" : "dungeon",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH010.DEF", "female" : "CH11.DEF" },
@ -123,6 +135,7 @@
{
"index": 12,
"faction" : "stronghold",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH013.DEF", "female" : "CH012.DEF" },
@ -133,6 +146,7 @@
{
"index": 13,
"faction" : "stronghold",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH013.DEF", "female" : "CH012.DEF" },
@ -143,6 +157,7 @@
{
"index": 14,
"faction" : "fortress",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH014.DEF", "female" : "CH015.DEF" },
@ -153,6 +168,7 @@
{
"index": 15,
"faction" : "fortress",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH014.DEF", "female" : "CH015.DEF" },
@ -163,6 +179,7 @@
{
"index": 16,
"faction" : "conflux",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH16.DEF", "female" : "CH17.DEF" },
@ -173,6 +190,7 @@
{
"index": 17,
"faction" : "conflux",
"defaultTavern" : 5,
"animation":
{
"battle" : { "male" : "CH16.DEF", "female" : "CH17.DEF" },

View File

@ -109,7 +109,7 @@
"additionalProperties" : false,
"required" : [
"adventureMap", "buildingsIcons", "buildings", "creatures", "guildWindow", "names",
"hallBackground", "hallSlots", "horde", "mageGuild", "moatDamage",
"hallBackground", "hallSlots", "horde", "mageGuild", "moatDamage", "defaultTavern",
"musicTheme", "siege", "structures", "townBackground", "warMachine"
],
"description": "town",
@ -159,11 +159,17 @@
"type" : "number"
}
},
"defaultTavern" : {
"type" : "number",
"description" : "Default chance for hero to appear in tavern, used only when value vas not set in tavern field",
"minimum" : 0
},
"tavern" : {
"type" : "object",
"description" : "Hero classes available in tavern. Value indicates chance for hero of this class to appear",
"additionalProperties" : {
"type" : "number"
"type" : "number",
"minimum" : 0
}
},
"names" : {

View File

@ -5,7 +5,7 @@
"description" : "Format used to define classes of heroes in VCMI",
"required" : [
"animation", "faction", "highLevelChance", "lowLevelChance",
"name", "primarySkills", "secondarySkills", "tavern"
"name", "primarySkills", "secondarySkills", "tavern", "defaultTavern"
],
"additionalProperties" : false,
@ -94,11 +94,18 @@
"type":"number"
}
},
"defaultTavern" : {
"type" : "number",
"description" : "Default chance for hero to appear in tavern, used only when value vas not set in tavern field",
"minimum" : 0
},
"tavern": {
"type":"object",
"description": "Chance for this hero to appear in tavern of this factions. Reversed version of field \"tavern\" from town format",
"additionalProperties":{
"type":"number"
"type":"number",
"minimum" : 0
}
}
}

2
debian/control vendored
View File

@ -2,7 +2,7 @@ Source: vcmi
Section: games
Priority: optional
Maintainer: Ivan Savenko <saven.ivan@gmail.com>
Build-Depends: debhelper (>= 8), cmake, libsdl-image1.2-dev, libsdl-ttf2.0-dev, libsdl-mixer1.2-dev (>= 1.2.8), zlib1g-dev, libavformat-dev, libswscale-dev, libboost-dev (>=1.46), libboost-program-options-dev (>=1.46), libboost-filesystem-dev (>=1.46), libboost-system-dev (>=1.46), libboost-thread-dev (>=1.46)
Build-Depends: debhelper (>= 8), cmake, libsdl-image1.2-dev, libsdl-ttf2.0-dev, libsdl-mixer1.2-dev (>= 1.2.8), zlib1g-dev, libavformat-dev, libswscale-dev, libboost-dev (>=1.48), libboost-program-options-dev (>=1.48), libboost-filesystem-dev (>=1.48), libboost-system-dev (>=1.48), libboost-locale-dev (>=1.48), libboost-thread-dev (>=1.48)
Standards-Version: 3.9.1
Homepage: http://vcmi.eu

View File

@ -28,7 +28,7 @@ bool CModEntry::compareVersions(QString lesser, QString greater)
return false;
}
CModEntry::CModEntry(QVariantMap repository, QVariantMap localData, QVariant modSettings, QString modname):
CModEntry::CModEntry(QVariantMap repository, QVariantMap localData, QVariantMap modSettings, QString modname):
repository(repository),
localData(localData),
modSettings(modSettings),
@ -41,7 +41,7 @@ bool CModEntry::isEnabled() const
if (!isInstalled())
return false;
return modSettings.toBool();
return modSettings["active"].toBool();
}
bool CModEntry::isDisabled() const
@ -140,7 +140,13 @@ CModEntry CModList::getMod(QString modname) const
QVariantMap repo;
QVariantMap local = localModList[modname].toMap();
QVariant settings = modSettings[modname];
QVariantMap settings;
QVariant conf = modSettings[modname];
if (conf.canConvert<QVariantMap>())
settings = modSettings[modname].toMap();
else
settings.insert("active", conf);
for (auto entry : repositories)
{

View File

@ -22,11 +22,11 @@ class CModEntry
// repository contains newest version only (if multiple are available)
QVariantMap repository;
QVariantMap localData;
QVariant modSettings;
QVariantMap modSettings;
QString modname;
public:
CModEntry(QVariantMap repository, QVariantMap localData, QVariant modSettings, QString modname);
CModEntry(QVariantMap repository, QVariantMap localData, QVariantMap modSettings, QString modname);
// installed and enabled
bool isEnabled() const;

View File

@ -192,8 +192,10 @@ bool CModManager::doEnableMod(QString mod, bool on)
{
QVariant value(on);
QVariantMap list = modSettings["activeMods"].toMap();
QVariantMap modData = list[mod].toMap();
list.insert(mod, value);
modData.insert("active", value);
list.insert(mod, modData);
modSettings.insert("activeMods", list);
modList->setModSettings(modSettings["activeMods"]);

View File

@ -108,6 +108,7 @@ CHeroClass *CHeroClassHandler::loadFromJson(const JsonNode & node)
heroClass->secSkillProbability.push_back(node["secondarySkills"][secSkill].Float());
}
heroClass->defaultTavernChance = node["defaultTavern"].Float();
for(auto & tavern : node["tavern"].Struct())
{
int value = tavern.second.Float();
@ -189,6 +190,24 @@ void CHeroClassHandler::loadObject(std::string scope, std::string name, const Js
VLC->modh->identifiers.registerObject(scope, "heroClass", name, object->id);
}
void CHeroClassHandler::afterLoadFinalization()
{
// for each pair <class, town> set selection probability if it was not set before in tavern entries
for (CHeroClass * heroClass : heroClasses)
{
for (CFaction * faction : VLC->townh->factions)
{
if (!faction->town)
continue;
if (heroClass->selectionProbability.count(faction->index))
continue;
float chance = heroClass->defaultTavernChance * faction->town->defaultTavernChance;
heroClass->selectionProbability[faction->index] = round(sqrt(chance));
}
}
}
std::vector<bool> CHeroClassHandler::getDefaultAllowed() const
{
return std::vector<bool>(heroClasses.size(), true);

View File

@ -103,6 +103,10 @@ public:
TFaction faction;
ui8 id;
// default chance for hero of specific class to appear in tavern, if field "tavern" was not set
// resulting chance = sqrt(town.chance * heroClass.chance)
ui32 defaultTavernChance;
std::vector<int> primarySkillInitial; // initial primary skills
std::vector<int> primarySkillLowLevel; // probability (%) of getting point of primary skill when getting level
std::vector<int> primarySkillHighLevel;// same for high levels (> 10)
@ -121,7 +125,7 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & identifier & name & faction & id;// & aggression;
h & identifier & name & faction & id & defaultTavernChance;// & aggression;
h & primarySkillInitial & primarySkillLowLevel;
h & primarySkillHighLevel & secSkillProbability;
h & selectionProbability;
@ -162,6 +166,8 @@ public:
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
void afterLoadFinalization();
std::vector<bool> getDefaultAllowed() const;
~CHeroClassHandler();

View File

@ -5,6 +5,13 @@ include_directories(${CMAKE_HOME_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIRECTORY} ${
include_directories(${Boost_INCLUDE_DIRS} ${SDL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
set(lib_SRCS
RegisterTypes.cpp
IGameCallback.cpp
CGameState.cpp
CObjectHandler.cpp
Connection.cpp
NetPacksLib.cpp
filesystem/AdapterLoaders.cpp
filesystem/CCompressedStream.cpp
filesystem/CFilesystemLoader.cpp
@ -47,24 +54,18 @@ set(lib_SRCS
CCreatureSet.cpp
CDefObjInfoHandler.cpp
CGameInterface.cpp
CGameState.cpp
CGeneralTextHandler.cpp
CHeroHandler.cpp
CModHandler.cpp
CObjectHandler.cpp
CObstacleInstance.cpp
Connection.cpp
CSpellHandler.cpp
CThreadHelper.cpp
CTownHandler.cpp
GameConstants.cpp
HeroBonus.cpp
IGameCallback.cpp
JsonDetail.cpp
JsonNode.cpp
NetPacksLib.cpp
ResourceSet.cpp
RegisterTypes.cpp
VCMI_Lib.cpp
VCMIDirs.cpp
)

View File

@ -445,17 +445,31 @@ std::vector <TModID> CModHandler::resolveDependencies(std::vector <TModID> input
return output;
}
static void updateModSettingsFormat(JsonNode & config)
{
for (auto & entry : config.Struct())
{
if (entry.second.getType() == JsonNode::DATA_BOOL)
{
entry.second["active"].Bool() = entry.second.Bool();
}
}
}
void CModHandler::initialize(std::vector<std::string> availableMods)
{
std::string confName = "config/modSettings.json";
JsonNode modConfig;
// Porbably new install. Create initial configuration
// Probably new install. Create initial configuration
if (!CResourceHandler::get()->existsResource(ResourceID(confName)))
CResourceHandler::get()->createResource(confName);
else
modConfig = JsonNode(ResourceID(confName));
// mod compatibility: check if modSettings has old, 0.94 format
updateModSettingsFormat(modConfig["activeMods"]);
const JsonNode & modList = modConfig["activeMods"];
JsonNode resultingList;
@ -473,12 +487,12 @@ void CModHandler::initialize(std::vector<std::string> availableMods)
if (config.isNull())
continue;
if (!modList[name].isNull() && modList[name].Bool() == false )
if (!modList[name].isNull() && modList[name]["active"].Bool() == false )
{
resultingList[name].Bool() = false;
resultingList[name]["active"].Bool() = false;
continue; // disabled mod
}
resultingList[name].Bool() = true;
resultingList[name]["active"].Bool() = true;
CModInfo & mod = allMods[name];

View File

@ -503,6 +503,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source)
}
}
town.defaultTavernChance = source["defaultTavern"].Float();
/// set chance of specific hero class to appear in this town
for(auto &node : source["tavern"].Struct())
{

View File

@ -148,6 +148,9 @@ public:
ui16 primaryRes;
ArtifactID warMachine;
si32 moatDamage;
// default chance for hero of specific class to appear in tavern, if field "tavern" was not set
// resulting chance = sqrt(town.chance * heroClass.chance)
ui32 defaultTavernChance;
// Client-only data. Should be moved away from lib
struct ClientInfo
@ -197,7 +200,7 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & names & faction & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel
& primaryRes & warMachine & clientInfo & moatDamage;
& primaryRes & warMachine & clientInfo & moatDamage & defaultTavernChance;
auto findNull = [](const std::pair<BuildingID, ConstTransitivePtr<CBuilding>> &building)
{ return building.second == nullptr; };

View File

@ -4,8 +4,8 @@ cmake_minimum_required(VERSION 2.6)
include_directories(${CMAKE_HOME_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIRECTORY})
set(lib_SRCS
ERMInterpreter.cpp
ERMParser.cpp
ERMInterpreter.cpp
ERMScriptModule.cpp
)

View File

@ -6,8 +6,8 @@ include_directories(${Boost_INCLUDE_DIRS})
set(server_SRCS
CGameHandler.cpp
CQuery.cpp
CVCMIServer.cpp
CQuery.cpp
NetPacksServer.cpp
)