mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-15 01:24:45 +02:00
[programming challenge, SSN] today's changes
This commit is contained in:
@ -68,6 +68,7 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<OutDir>$(SolutionDir)</OutDir>
|
<OutDir>$(SolutionDir)</OutDir>
|
||||||
<IntDir>$(Configuration)\</IntDir>
|
<IntDir>$(Configuration)\</IntDir>
|
||||||
|
<LibraryPath>$(SolutionDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<OutDir>$(SolutionDir)</OutDir>
|
<OutDir>$(SolutionDir)</OutDir>
|
||||||
@ -76,6 +77,7 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RD|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RD|Win32'">
|
||||||
<OutDir>$(SolutionDir)$(Configuration)\bin\</OutDir>
|
<OutDir>$(SolutionDir)$(Configuration)\bin\</OutDir>
|
||||||
<IntDir>$(Configuration)\</IntDir>
|
<IntDir>$(Configuration)\</IntDir>
|
||||||
|
<LibraryPath>$(SolutionDir)$(SolutionDir)..\libs;\$(PlatformShortName);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RD|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RD|x64'">
|
||||||
<OutDir>$(SolutionDir)$(Configuration)\bin\</OutDir>
|
<OutDir>$(SolutionDir)$(Configuration)\bin\</OutDir>
|
||||||
@ -85,18 +87,24 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>StdInc.h</PrecompiledHeaderFile>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>VCMI_lib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>StdInc.h</PrecompiledHeaderFile>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>VCMI_lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='RD|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='RD|Win32'">
|
||||||
@ -105,11 +113,14 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>StdInc.h</PrecompiledHeaderFile>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>VCMI_lib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='RD|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='RD|x64'">
|
||||||
@ -118,15 +129,27 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>StdInc.h</PrecompiledHeaderFile>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>VCMI_lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
|
<ClCompile Include="StdInc.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='RD|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='RD|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="StdInc.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
//#include "../global.h"
|
//#include "../global.h"
|
||||||
#include <boost/thread.hpp>
|
#include "StdInc.h"
|
||||||
#include <boost/bind.hpp>
|
#include "../lib/VCMI_Lib.h"
|
||||||
#include <boost/program_options.hpp>
|
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
|
|
||||||
|
std::string leftAI, rightAI, battle, results, logsDir;
|
||||||
|
bool withVisualization = false;
|
||||||
|
std::string servername;
|
||||||
|
std::string runnername;
|
||||||
|
extern DLL_EXPORT LibClasses * VLC;
|
||||||
|
|
||||||
std::string addQuotesIfNeeded(const std::string &s)
|
std::string addQuotesIfNeeded(const std::string &s)
|
||||||
{
|
{
|
||||||
if(s.find_first_of(' ') != std::string::npos)
|
if(s.find_first_of(' ') != std::string::npos)
|
||||||
@ -33,6 +38,84 @@ void runCommand(const std::string &command, const std::string &name, const std::
|
|||||||
boost::thread tt(boost::bind(std::system, cmd.c_str()));
|
boost::thread tt(boost::bind(std::system, cmd.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double playBattle(const DuelParameters &dp)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
CSaveFile out("pliczek.ssnb");
|
||||||
|
out << dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string serverCommand = servername + " " + addQuotesIfNeeded(battle) + " " + addQuotesIfNeeded(leftAI) + " " + addQuotesIfNeeded(rightAI) + " " + addQuotesIfNeeded(results) + " " + addQuotesIfNeeded(logsDir) + " " + (withVisualization ? " v" : "");
|
||||||
|
std::string runnerCommand = runnername + " " + addQuotesIfNeeded(logsDir);
|
||||||
|
std::cout <<"Server command: " << serverCommand << std::endl << "Runner command: " << runnerCommand << std::endl;
|
||||||
|
|
||||||
|
int code = 0;
|
||||||
|
boost::thread t([&]
|
||||||
|
{
|
||||||
|
code = std::system(serverCommand.c_str());
|
||||||
|
});
|
||||||
|
|
||||||
|
runCommand(runnerCommand, "first_runner", logsDir);
|
||||||
|
runCommand(runnerCommand, "second_runner", logsDir);
|
||||||
|
runCommand(runnerCommand, "third_runner", logsDir);
|
||||||
|
if(withVisualization)
|
||||||
|
{
|
||||||
|
//boost::this_thread::sleep(boost::posix_time::millisec(500)); //FIXME
|
||||||
|
boost::thread tttt(boost::bind(std::system, "VCMI_Client.exe -battle"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//boost::this_thread::sleep(boost::posix_time::seconds(5));
|
||||||
|
t.join();
|
||||||
|
return code / 1000000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSNRun()
|
||||||
|
{
|
||||||
|
CArtifact *nowy = new CArtifact();
|
||||||
|
nowy->description = "Cudowny miecz Towa gwarantuje zwyciestwo";
|
||||||
|
nowy->name = "Cudowny miecz";
|
||||||
|
nowy->constituentOf = nowy->constituents = NULL;
|
||||||
|
nowy->possibleSlots.push_back(Arts::LEFT_HAND);
|
||||||
|
|
||||||
|
CArtifactInstance *artinst = new CArtifactInstance(nowy);
|
||||||
|
auto &arts = VLC->arth->artifacts;
|
||||||
|
CArtifactInstance *inny = new CArtifactInstance(VLC->arth->artifacts[15]);
|
||||||
|
|
||||||
|
artinst->addNewBonus(new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::ARTIFACT_INSTANCE, +25, nowy->id, PrimarySkill::ATTACK));
|
||||||
|
artinst->addNewBonus(new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::ARTIFACT_INSTANCE, +25, nowy->id, PrimarySkill::DEFENSE));
|
||||||
|
|
||||||
|
DuelParameters dp;
|
||||||
|
dp.bfieldType = 1;
|
||||||
|
dp.terType = 1;
|
||||||
|
|
||||||
|
for(int i = 0; i < 2 ; i++)
|
||||||
|
{
|
||||||
|
auto &side = dp.sides[i];
|
||||||
|
side.heroId = i;
|
||||||
|
side.heroPrimSkills.resize(4,0);
|
||||||
|
side.stacks[0] = DuelParameters::SideSettings::StackSettings(10+i, 40+i);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto bonuses = artinst->getBonuses([](const Bonus *){ return true; });
|
||||||
|
BOOST_FOREACH(Bonus *b, *bonuses)
|
||||||
|
{
|
||||||
|
std::cout << format("%s (%d) value:%d, description: %s\n") % bonusTypeToString(b->type) % b->subtype % b->val % b->Description();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//lewa strona z art 0.9
|
||||||
|
//bez artefaktow -0.41
|
||||||
|
//prawa strona z art. -0.926
|
||||||
|
|
||||||
|
dp.sides[0].artifacts[Arts::LEFT_HAND] = artinst;
|
||||||
|
|
||||||
|
auto battleOutcome = playBattle(dp);
|
||||||
|
int g = 4;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
std::cout << "VCMI Odpalarka\nMy path: " << argv[0] << std::endl;
|
std::cout << "VCMI Odpalarka\nMy path: " << argv[0] << std::endl;
|
||||||
@ -42,13 +125,11 @@ int main(int argc, char **argv)
|
|||||||
("help,h", "Display help and exit")
|
("help,h", "Display help and exit")
|
||||||
("aiLeft,l", po::value<std::string>()->default_value("StupidAI"), "Left AI path")
|
("aiLeft,l", po::value<std::string>()->default_value("StupidAI"), "Left AI path")
|
||||||
("aiRight,r", po::value<std::string>()->default_value("StupidAI"), "Right AI path")
|
("aiRight,r", po::value<std::string>()->default_value("StupidAI"), "Right AI path")
|
||||||
("battle,b", po::value<std::string>()->default_value("b1.json"), "Duel file path")
|
("battle,b", po::value<std::string>()->default_value("pliczek.ssnb"), "Duel file path")
|
||||||
("resultsOut,o", po::value<std::string>()->default_value("./results.txt"), "Output file when results will be appended")
|
("resultsOut,o", po::value<std::string>()->default_value("./results.txt"), "Output file when results will be appended")
|
||||||
("logsDir,d", po::value<std::string>()->default_value("."), "Directory where log files will be created")
|
("logsDir,d", po::value<std::string>()->default_value("."), "Directory where log files will be created")
|
||||||
("visualization,v", "Runs a client to display a visualization of battle");
|
("visualization,v", "Runs a client to display a visualization of battle");
|
||||||
|
|
||||||
std::string leftAI, rightAI, battle, results, logsDir;
|
|
||||||
bool withVisualization = false;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -86,14 +167,14 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string runnername =
|
runnername =
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
"VCMI_BattleAiHost.exe"
|
"VCMI_BattleAiHost.exe"
|
||||||
#else
|
#else
|
||||||
"./vcmirunner"
|
"./vcmirunner"
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
std::string servername =
|
servername =
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
"VCMI_server.exe"
|
"VCMI_server.exe"
|
||||||
#else
|
#else
|
||||||
@ -101,22 +182,11 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
std::string serverCommand = servername + " " + addQuotesIfNeeded(battle) + " " + addQuotesIfNeeded(leftAI) + " " + addQuotesIfNeeded(rightAI) + " " + addQuotesIfNeeded(results) + " " + addQuotesIfNeeded(logsDir) + " " + (withVisualization ? " v" : "");
|
|
||||||
std::string runnerCommand = runnername + " " + addQuotesIfNeeded(logsDir);
|
VLC = new LibClasses();
|
||||||
std::cout <<"Server command: " << serverCommand << std::endl << "Runner command: " << runnerCommand << std::endl;
|
VLC->init();
|
||||||
|
|
||||||
boost::thread t(boost::bind(std::system, serverCommand.c_str()));
|
SSNRun();
|
||||||
runCommand(runnerCommand, "first_runner", logsDir);
|
|
||||||
runCommand(runnerCommand, "second_runner", logsDir);
|
|
||||||
runCommand(runnerCommand, "third_runner", logsDir);
|
|
||||||
if(withVisualization)
|
|
||||||
{
|
|
||||||
//boost::this_thread::sleep(boost::posix_time::millisec(500)); //FIXME
|
|
||||||
boost::thread tttt(boost::bind(std::system, "VCMI_Client.exe -battle"));
|
|
||||||
}
|
|
||||||
|
|
||||||
//boost::this_thread::sleep(boost::posix_time::seconds(5));
|
|
||||||
|
|
||||||
t.join();
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
@ -59,7 +59,7 @@ struct CheckTime
|
|||||||
//all ms
|
//all ms
|
||||||
const int PROCESS_INFO_TIME = 5;
|
const int PROCESS_INFO_TIME = 5;
|
||||||
const int MAKE_DECIDION_TIME = 150;
|
const int MAKE_DECIDION_TIME = 150;
|
||||||
const int MEASURE_MARGIN = 3;
|
const int MEASURE_MARGIN = 3000000;
|
||||||
const int HANGUP_TIME = 250;
|
const int HANGUP_TIME = 250;
|
||||||
const int CONSTRUCT_TIME = 50;
|
const int CONSTRUCT_TIME = 50;
|
||||||
const int STARTUP_TIME = 100;
|
const int STARTUP_TIME = 100;
|
||||||
|
@ -23,9 +23,8 @@ struct ArtifactLocation;
|
|||||||
|
|
||||||
class DLL_EXPORT CArtifact : public CBonusSystemNode //container for artifacts
|
class DLL_EXPORT CArtifact : public CBonusSystemNode //container for artifacts
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
std::string name, description; //set if custom
|
|
||||||
public:
|
public:
|
||||||
|
std::string name, description; //set if custom
|
||||||
enum EartClass {ART_SPECIAL=1, ART_TREASURE=2, ART_MINOR=4, ART_MAJOR=8, ART_RELIC=16}; //artifact classes
|
enum EartClass {ART_SPECIAL=1, ART_TREASURE=2, ART_MINOR=4, ART_MAJOR=8, ART_RELIC=16}; //artifact classes
|
||||||
const std::string &Name() const; //getter
|
const std::string &Name() const; //getter
|
||||||
const std::string &Description() const; //getter
|
const std::string &Description() const; //getter
|
||||||
@ -56,10 +55,9 @@ public:
|
|||||||
|
|
||||||
class DLL_EXPORT CArtifactInstance : public CBonusSystemNode
|
class DLL_EXPORT CArtifactInstance : public CBonusSystemNode
|
||||||
{
|
{
|
||||||
protected:
|
public:
|
||||||
void init();
|
void init();
|
||||||
CArtifactInstance(CArtifact *Art);
|
CArtifactInstance(CArtifact *Art);
|
||||||
public:
|
|
||||||
CArtifactInstance();
|
CArtifactInstance();
|
||||||
|
|
||||||
ConstTransitivePtr<CArtifact> artType;
|
ConstTransitivePtr<CArtifact> artType;
|
||||||
|
@ -983,6 +983,11 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
|
|||||||
h->spells.insert(spell);
|
h->spells.insert(spell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_FOREACH(auto &parka, ss.artifacts)
|
||||||
|
{
|
||||||
|
h->putArtifact(parka.first, parka.second);
|
||||||
|
}
|
||||||
|
|
||||||
typedef const std::pair<si32, si8> &TSecSKill;
|
typedef const std::pair<si32, si8> &TSecSKill;
|
||||||
BOOST_FOREACH(TSecSKill secSkill, ss.heroSecSkills)
|
BOOST_FOREACH(TSecSKill secSkill, ss.heroSecSkills)
|
||||||
h->setSecSkillLevel((CGHeroInstance::SecondarySkill)secSkill.first, secSkill.second, 1);
|
h->setSecSkillLevel((CGHeroInstance::SecondarySkill)secSkill.first, secSkill.second, 1);
|
||||||
|
@ -281,9 +281,9 @@ struct DLL_EXPORT CPathsInfo
|
|||||||
struct DLL_EXPORT DuelParameters
|
struct DLL_EXPORT DuelParameters
|
||||||
{
|
{
|
||||||
si32 terType, bfieldType;
|
si32 terType, bfieldType;
|
||||||
struct SideSettings
|
struct DLL_EXPORT SideSettings
|
||||||
{
|
{
|
||||||
struct StackSettings
|
struct DLL_EXPORT StackSettings
|
||||||
{
|
{
|
||||||
si32 type;
|
si32 type;
|
||||||
si32 count;
|
si32 count;
|
||||||
@ -298,13 +298,14 @@ struct DLL_EXPORT DuelParameters
|
|||||||
|
|
||||||
si32 heroId; //-1 if none
|
si32 heroId; //-1 if none
|
||||||
std::vector<si32> heroPrimSkills; //may be empty
|
std::vector<si32> heroPrimSkills; //may be empty
|
||||||
|
std::map<int, CArtifactInstance*> artifacts;
|
||||||
std::vector<std::pair<si32, si8> > heroSecSkills; //may be empty; pairs <id, level>, level [0-3]
|
std::vector<std::pair<si32, si8> > heroSecSkills; //may be empty; pairs <id, level>, level [0-3]
|
||||||
std::set<si32> spells;
|
std::set<si32> spells;
|
||||||
|
|
||||||
SideSettings();
|
SideSettings();
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & stacks & heroId & heroPrimSkills & spells;
|
h & stacks & heroId & heroPrimSkills & artifacts & heroSecSkills & spells;
|
||||||
}
|
}
|
||||||
} sides[2];
|
} sides[2];
|
||||||
|
|
||||||
|
@ -28,6 +28,17 @@
|
|||||||
int CBonusSystemNode::treeChanged = 1;
|
int CBonusSystemNode::treeChanged = 1;
|
||||||
const bool CBonusSystemNode::cachingEnabled = false;
|
const bool CBonusSystemNode::cachingEnabled = false;
|
||||||
|
|
||||||
|
DLL_EXPORT std::string bonusTypeToString(int type)
|
||||||
|
{
|
||||||
|
BOOST_FOREACH(auto &p, bonusNameMap)
|
||||||
|
{
|
||||||
|
if(p.second == type)
|
||||||
|
return p.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "UNKNOWN BONUS";
|
||||||
|
}
|
||||||
|
|
||||||
BonusList::BonusList(bool BelongsToTree /* =false */) : belongsToTree(BelongsToTree)
|
BonusList::BonusList(bool BelongsToTree /* =false */) : belongsToTree(BelongsToTree)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -833,6 +833,7 @@ namespace Selector
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern DLL_EXPORT const std::map<std::string, int> bonusNameMap;
|
extern DLL_EXPORT const std::map<std::string, int> bonusNameMap;
|
||||||
|
DLL_EXPORT std::string bonusTypeToString(int type);
|
||||||
|
|
||||||
// BonusList template that requires full interface of CBonusSystemNode
|
// BonusList template that requires full interface of CBonusSystemNode
|
||||||
template <class InputIterator>
|
template <class InputIterator>
|
||||||
@ -859,3 +860,5 @@ namespace boost
|
|||||||
typedef std::vector<Bonus*>::const_iterator type;
|
typedef std::vector<Bonus*>::const_iterator type;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ void CGameHandler::startBattle( const CArmedInstance *armies[2], int3 tile, cons
|
|||||||
runBattle();
|
runBattle();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2)
|
int CGameHandler::endBattle( int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2 )
|
||||||
{
|
{
|
||||||
bool duel = gs->initialOpts->mode == StartInfo::DUEL;
|
bool duel = gs->initialOpts->mode == StartInfo::DUEL;
|
||||||
BattleResultsApplied resultsApplied;
|
BattleResultsApplied resultsApplied;
|
||||||
@ -381,8 +381,20 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CArmedInstance *armed = gs->curB->belligerents[battleResult.data->winner];
|
||||||
|
|
||||||
|
int winnerArmyAfterBattle = 0;
|
||||||
|
int winnerArmyBeforeBattle = 0;
|
||||||
|
BOOST_FOREACH(auto &slot, armed->Slots())
|
||||||
|
{
|
||||||
|
winnerArmyBeforeBattle += slot.second->type->AIValue * slot.second->count;
|
||||||
|
assert(winnerArmyBeforeBattle >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
sendAndApply(battleResult.data);
|
sendAndApply(battleResult.data);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Eagle Eye secondary skill handling
|
//Eagle Eye secondary skill handling
|
||||||
if(cs.spells.size())
|
if(cs.spells.size())
|
||||||
{
|
{
|
||||||
@ -459,12 +471,12 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
|||||||
addToSlot(StackLocation(winnerHero, necroSlot), raisedStack.type, raisedStack.count);
|
addToSlot(StackLocation(winnerHero, necroSlot), raisedStack.type, raisedStack.count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int casualtiesPoints = 0;
|
||||||
if(duel)
|
if(duel)
|
||||||
{
|
{
|
||||||
CSaveFile resultFile(LOGS_DIR + "/result.vdrst");
|
CSaveFile resultFile(LOGS_DIR + "/result.vdrst");
|
||||||
resultFile << *battleResult.data;
|
resultFile << *battleResult.data;
|
||||||
|
|
||||||
int casualtiesPoints = 0;
|
|
||||||
tlog0 << boost::format("Winner side %d\nWinner casualties:\n") % (int)battleResult.data->winner;
|
tlog0 << boost::format("Winner side %d\nWinner casualties:\n") % (int)battleResult.data->winner;
|
||||||
for(std::map<ui32,si32>::const_iterator i = battleResult.data->casualties[battleResult.data->winner].begin(); i != battleResult.data->casualties[battleResult.data->winner].end(); i++)
|
for(std::map<ui32,si32>::const_iterator i = battleResult.data->casualties[battleResult.data->winner].begin(); i != battleResult.data->casualties[battleResult.data->winner].end(); i++)
|
||||||
{
|
{
|
||||||
@ -487,8 +499,18 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
|||||||
|
|
||||||
sendAndApply(&resultsApplied);
|
sendAndApply(&resultsApplied);
|
||||||
|
|
||||||
|
winnerArmyAfterBattle = winnerArmyBeforeBattle - casualtiesPoints;
|
||||||
|
|
||||||
if(duel)
|
if(duel)
|
||||||
return;
|
{
|
||||||
|
double ratioKept = (double)winnerArmyAfterBattle / (double)winnerArmyBeforeBattle;
|
||||||
|
|
||||||
|
int ret = ratioKept * 1000000;
|
||||||
|
if(battleResult.data->winner)
|
||||||
|
ret *= -1;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if(visitObjectAfterVictory && winnerHero == hero1)
|
if(visitObjectAfterVictory && winnerHero == hero1)
|
||||||
{
|
{
|
||||||
@ -517,6 +539,8 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
|||||||
|
|
||||||
sendAndApply(&sah);
|
sendAndApply(&sah);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::afterBattleCallback() //object interaction after leveling up is done
|
void CGameHandler::afterBattleCallback() //object interaction after leveling up is done
|
||||||
@ -4984,7 +5008,7 @@ bool CGameHandler::swapStacks(const StackLocation &sl1, const StackLocation &sl2
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::runBattle()
|
int CGameHandler::runBattle()
|
||||||
{
|
{
|
||||||
assert(gs->curB);
|
assert(gs->curB);
|
||||||
//TODO: pre-tactic stuff, call scripts etc.
|
//TODO: pre-tactic stuff, call scripts etc.
|
||||||
@ -5203,7 +5227,7 @@ void CGameHandler::runBattle()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
endBattle(gs->curB->tile, gs->curB->heroes[0], gs->curB->heroes[1]);
|
return endBattle(gs->curB->tile, gs->curB->heroes[0], gs->curB->heroes[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::giveHeroArtifact(const CGHeroInstance *h, const CArtifactInstance *a, int pos)
|
void CGameHandler::giveHeroArtifact(const CGHeroInstance *h, const CArtifactInstance *a, int pos)
|
||||||
|
@ -113,7 +113,7 @@ public:
|
|||||||
void giveSpells(const CGTownInstance *t, const CGHeroInstance *h);
|
void giveSpells(const CGTownInstance *t, const CGHeroInstance *h);
|
||||||
int moveStack(int stack, THex dest); //returned value - travelled distance
|
int moveStack(int stack, THex dest); //returned value - travelled distance
|
||||||
void startBattle(const CArmedInstance *armies[2], int3 tile, const CGHeroInstance *heroes[2], bool creatureBank, boost::function<void(BattleResult*)> cb, const CGTownInstance *town = NULL); //use hero=NULL for no hero
|
void startBattle(const CArmedInstance *armies[2], int3 tile, const CGHeroInstance *heroes[2], bool creatureBank, boost::function<void(BattleResult*)> cb, const CGTownInstance *town = NULL); //use hero=NULL for no hero
|
||||||
void runBattle();
|
int runBattle();
|
||||||
void checkLossVictory(ui8 player);
|
void checkLossVictory(ui8 player);
|
||||||
void winLoseHandle(ui8 players=255); //players: bit field - colours of players to be checked; default: all
|
void winLoseHandle(ui8 players=255); //players: bit field - colours of players to be checked; default: all
|
||||||
void getLossVicMessage(ui8 player, ui8 standard, bool victory, InfoWindow &out) const;
|
void getLossVicMessage(ui8 player, ui8 standard, bool victory, InfoWindow &out) const;
|
||||||
@ -125,7 +125,7 @@ public:
|
|||||||
//
|
//
|
||||||
|
|
||||||
void disqualifyPlayer(int side);
|
void disqualifyPlayer(int side);
|
||||||
void endBattle(int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2); //ends battle
|
int endBattle(int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2); //ends battle
|
||||||
void prepareAttack(BattleAttack &bat, const CStack *att, const CStack *def, int distance, int targetHex); //distance - number of hexes travelled before attacking
|
void prepareAttack(BattleAttack &bat, const CStack *att, const CStack *def, int distance, int targetHex); //distance - number of hexes travelled before attacking
|
||||||
void applyBattleEffects(BattleAttack &bat, const CStack *att, const CStack *def, int distance, bool secondary); //damage, drain life & fire shield
|
void applyBattleEffects(BattleAttack &bat, const CStack *att, const CStack *def, int distance, bool secondary); //damage, drain life & fire shield
|
||||||
void checkForBattleEnd( std::vector<CStack*> &stacks );
|
void checkForBattleEnd( std::vector<CStack*> &stacks );
|
||||||
|
@ -668,7 +668,7 @@ void CVCMIServer::startDuel(const std::string &battle, const std::string &leftAI
|
|||||||
*gh->gameLog << battle << leftAI << rightAI << ui8('$');
|
*gh->gameLog << battle << leftAI << rightAI << ui8('$');
|
||||||
|
|
||||||
tlog0 << "Starting battle!\n";
|
tlog0 << "Starting battle!\n";
|
||||||
gh->runBattle();
|
auto battleOut = gh->runBattle();
|
||||||
tlog0 << "Battle over!\n";
|
tlog0 << "Battle over!\n";
|
||||||
tlog0 << "Waiting for connections to close\n";
|
tlog0 << "Waiting for connections to close\n";
|
||||||
|
|
||||||
@ -687,7 +687,8 @@ void CVCMIServer::startDuel(const std::string &battle, const std::string &leftAI
|
|||||||
tlog0 << "Removed gh!\n";
|
tlog0 << "Removed gh!\n";
|
||||||
|
|
||||||
tlog0 << "Dying...\n";
|
tlog0 << "Dying...\n";
|
||||||
exit(0);
|
|
||||||
|
exit(battleOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __GNUC__
|
#ifndef __GNUC__
|
||||||
@ -711,15 +712,18 @@ int main(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
io_service io_service;
|
io_service io_service;
|
||||||
CVCMIServer server;
|
CVCMIServer server;
|
||||||
if(argc == 6 || argc == 7)
|
if(argc != 2)
|
||||||
{
|
{
|
||||||
RESULTS_PATH = argv[4];
|
if(argc == 6 || argc == 7)
|
||||||
tlog1 << "Results path: " << RESULTS_PATH << std::endl;
|
{
|
||||||
tlog1 << "Logs path: " << RESULTS_PATH << std::endl;
|
RESULTS_PATH = argv[4];
|
||||||
server.startDuel(argv[1], argv[2], argv[3], argc-3);
|
tlog1 << "Results path: " << RESULTS_PATH << std::endl;
|
||||||
|
tlog1 << "Logs path: " << RESULTS_PATH << std::endl;
|
||||||
|
server.startDuel(argv[1], argv[2], argv[3], argc-3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
server.startDuel("b1.json", "StupidAI", "StupidAI", 2);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
server.startDuel("b1.json", "StupidAI", "StupidAI", 2);
|
|
||||||
|
|
||||||
while(!end2)
|
while(!end2)
|
||||||
{
|
{
|
||||||
|
@ -243,8 +243,8 @@ bool MakeAction::applyGh( CGameHandler *gh )
|
|||||||
if(gh->connections[b->sides[b->tacticsSide]] != c)
|
if(gh->connections[b->sides[b->tacticsSide]] != c)
|
||||||
ERROR_AND_RETURN;
|
ERROR_AND_RETURN;
|
||||||
}
|
}
|
||||||
else if(gh->connections[b->getStack(b->activeStack)->owner] != c)
|
// else if(gh->connections[b->getStack(b->activeStack)->owner] != c)
|
||||||
ERROR_AND_RETURN;
|
// ERROR_AND_RETURN;
|
||||||
|
|
||||||
return gh->makeBattleAction(ba);
|
return gh->makeBattleAction(ba);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user