1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

- moved ParseBonus to JsonNode.cpp (linkage errors)

- fixes to CMakeLists - vcmi can be compiled and started with cmake
- gcc\clang warnings fixes
This commit is contained in:
Ivan Savenko
2012-07-19 18:52:44 +00:00
parent 4c0537c420
commit e4c88d5088
13 changed files with 246 additions and 264 deletions

View File

@ -8,5 +8,5 @@ set(emptyAI_SRCS
exp_funcs.cpp exp_funcs.cpp
) )
add_library(emptyAI SHARED ${emptyAI_SRCS}) add_library(EmptyAI SHARED ${emptyAI_SRCS})
target_link_libraries(emptyAI vcmi) target_link_libraries(EmptyAI vcmi)

View File

@ -464,7 +464,7 @@ void VCAI::heroMoved(const TryMoveHero & details)
LOG_ENTRY; LOG_ENTRY;
if(details.result == TryMoveHero::TELEPORTATION) if(details.result == TryMoveHero::TELEPORTATION)
{ {
const int3 from = CGHeroInstance::convertPosition(details.start, false), const int3 from = CGHeroInstance::convertPosition(details.start, false),
to = CGHeroInstance::convertPosition(details.end, false); to = CGHeroInstance::convertPosition(details.end, false);
const CGObjectInstance *o1 = frontOrNull(cb->getVisitableObjs(from)), const CGObjectInstance *o1 = frontOrNull(cb->getVisitableObjs(from)),
*o2 = frontOrNull(cb->getVisitableObjs(to)); *o2 = frontOrNull(cb->getVisitableObjs(to));
@ -699,7 +699,7 @@ void VCAI::objectRemoved(const CGObjectInstance *obj)
//TODO //TODO
//there are other places where CGObjectinstance ptrs are stored... //there are other places where CGObjectinstance ptrs are stored...
// //
if(obj->ID == GameConstants::HEROI_TYPE && obj->tempOwner == playerID) if(obj->ID == GameConstants::HEROI_TYPE && obj->tempOwner == playerID)
{ {
@ -873,7 +873,7 @@ void VCAI::showBlockingDialog(const std::string &text, const std::vector<Compone
NET_EVENT_HANDLER; NET_EVENT_HANDLER;
LOG_ENTRY; LOG_ENTRY;
int sel = 0; int sel = 0;
status.addQuery(askID, boost::str(boost::format("Blocking dialog query with %d components - %s") status.addQuery(askID, boost::str(boost::format("Blocking dialog query with %d components - %s")
% components.size() % text)); % components.size() % text));
if(selection) //select from multiple components -> take the last one (they're indexed [1-size]) if(selection) //select from multiple components -> take the last one (they're indexed [1-size])
@ -956,7 +956,7 @@ void VCAI::makeTurn()
BOOST_FOREACH(const CGObjectInstance *obj, objs) BOOST_FOREACH(const CGObjectInstance *obj, objs)
{ {
if (isWeeklyRevisitable(obj)) if (isWeeklyRevisitable(obj))
{ {
if (!vstd::contains(visitableObjs, obj)) if (!vstd::contains(visitableObjs, obj))
visitableObjs.push_back(obj); visitableObjs.push_back(obj);
auto o = std::find (alreadyVisited.begin(), alreadyVisited.end(), obj); auto o = std::find (alreadyVisited.begin(), alreadyVisited.end(), obj);
@ -1052,7 +1052,7 @@ void VCAI::makeTurnInternal()
auto quests = myCb->getMyQuests(); auto quests = myCb->getMyQuests();
BOOST_FOREACH (auto quest, quests) BOOST_FOREACH (auto quest, quests)
{ {
striveToQuest (quest); striveToQuest (quest);
} }
striveToGoal(CGoal(BUILD)); //TODO: smarter building management striveToGoal(CGoal(BUILD)); //TODO: smarter building management
@ -1109,7 +1109,7 @@ void VCAI::pickBestCreatures(const CArmedInstance * army, const CArmedInstance *
std::map<const CCreature*, int> creToPower; std::map<const CCreature*, int> creToPower;
BOOST_FOREACH(auto armyPtr, armies) BOOST_FOREACH(auto armyPtr, armies)
BOOST_FOREACH(auto &i, armyPtr->Slots()) BOOST_FOREACH(auto &i, armyPtr->Slots())
creToPower[i.second->type] += i.second->getPower(); creToPower[i.second->type] += i.second->getPower();
//TODO - consider more than just power (ie morale penalty, hero specialty in certain stacks, etc) //TODO - consider more than just power (ie morale penalty, hero specialty in certain stacks, etc)
std::vector<const CCreature *> bestArmy; //types that'll be in final dst army std::vector<const CCreature *> bestArmy; //types that'll be in final dst army
@ -1125,10 +1125,10 @@ void VCAI::pickBestCreatures(const CArmedInstance * army, const CArmedInstance *
if(creToPower.empty()) if(creToPower.empty())
break; break;
} }
//foreach best type -> iterate over slots in both armies and if it's the appropriate type, send it to the slot where it belongs //foreach best type -> iterate over slots in both armies and if it's the appropriate type, send it to the slot where it belongs
for (int i = 0; i < bestArmy.size(); i++) //i-th strongest creature type will go to i-th slot for (int i = 0; i < bestArmy.size(); i++) //i-th strongest creature type will go to i-th slot
BOOST_FOREACH(auto armyPtr, armies) BOOST_FOREACH(auto armyPtr, armies)
for (int j = 0; j < GameConstants::ARMY_SIZE; j++) for (int j = 0; j < GameConstants::ARMY_SIZE; j++)
if(armyPtr->getCreature(j) == bestArmy[i] && (i != j || armyPtr != army)) //it's a searched creature not in dst slot if(armyPtr->getCreature(j) == bestArmy[i] && (i != j || armyPtr != army)) //it's a searched creature not in dst slot
cb->mergeOrSwapStacks(armyPtr, army, j, i); cb->mergeOrSwapStacks(armyPtr, army, j, i);
@ -1341,7 +1341,7 @@ std::vector<const CGObjectInstance *> VCAI::getPossibleDestinations(HeroPtr h)
if (!shouldVisit(h, obj)) if (!shouldVisit(h, obj))
return true; return true;
if (vstd::contains(reservedObjs, obj)) //does checking for our own reserved objects make sense? here? if (vstd::contains(reservedObjs, obj)) //does checking for our own reserved objects make sense? here?
return true; return true;
@ -1372,7 +1372,7 @@ void VCAI::wander(HeroPtr h)
{ {
return howManyReinforcementsCanGet(h, lhs) < howManyReinforcementsCanGet(h, rhs); return howManyReinforcementsCanGet(h, lhs) < howManyReinforcementsCanGet(h, rhs);
}; };
std::vector<const CGTownInstance *> townsReachable; std::vector<const CGTownInstance *> townsReachable;
std::vector<const CGTownInstance *> townsNotReachable; std::vector<const CGTownInstance *> townsNotReachable;
BOOST_FOREACH(const CGTownInstance *t, cb->getTownsInfo()) BOOST_FOREACH(const CGTownInstance *t, cb->getTownsInfo())
@ -1713,7 +1713,7 @@ bool VCAI::moveHeroToTile(int3 dst, HeroPtr h)
{ {
lostHero(h); lostHero(h);
//we need to throw, otherwise hero will be assigned to sth again //we need to throw, otherwise hero will be assigned to sth again
throw std::runtime_error("Hero was lost!"); throw std::runtime_error("Hero was lost!");
break; break;
} }
@ -1996,7 +1996,7 @@ void VCAI::striveToGoal(const CGoal &ultimateGoal)
} }
} }
if (goal.isAbstract) if (goal.isAbstract)
{ {
abstractGoal = goal; //allow only one abstract goal per call abstractGoal = goal; //allow only one abstract goal per call
BNLOG("Choosing abstract goal %s", goalName(goal.goalType)); BNLOG("Choosing abstract goal %s", goalName(goal.goalType));
@ -2391,7 +2391,7 @@ void VCAI::answerQuery(int queryID, int selection)
BNLOG("I'll answer the query %d giving the choice %d", queryID % selection); BNLOG("I'll answer the query %d giving the choice %d", queryID % selection);
if(queryID != -1) if(queryID != -1)
{ {
int requestID = cb->selectionMade(selection, queryID); cb->selectionMade(selection, queryID);
} }
else else
{ {
@ -2774,9 +2774,9 @@ TSubgoal CGoal::whatToDoToAchieve()
erase(hs, [](const CGHeroInstance *h) erase(hs, [](const CGHeroInstance *h)
{ {
return contains(ai->lockedHeroes, h); return contains(ai->lockedHeroes, h);
}); });
if(hs.empty()) //all heroes are busy. buy new one if(hs.empty()) //all heroes are busy. buy new one
{ {
if (howManyHeroes < 3 && ai->findTownWithTavern()) //we may want to recruit second hero. TODO: make it smart finally if (howManyHeroes < 3 && ai->findTownWithTavern()) //we may want to recruit second hero. TODO: make it smart finally
return CGoal(RECRUIT_HERO); return CGoal(RECRUIT_HERO);
@ -2946,9 +2946,9 @@ TSubgoal CGoal::whatToDoToAchieve()
erase(hs, [](const CGHeroInstance *h) erase(hs, [](const CGHeroInstance *h)
{ {
return contains(ai->lockedHeroes, h); return contains(ai->lockedHeroes, h);
}); });
if(hs.empty()) //all heroes are busy. buy new one if(hs.empty()) //all heroes are busy. buy new one
{ {
if (howManyHeroes < 3 && ai->findTownWithTavern()) //we may want to recruit second hero. TODO: make it smart finally if (howManyHeroes < 3 && ai->findTownWithTavern()) //we may want to recruit second hero. TODO: make it smart finally
return CGoal(RECRUIT_HERO); return CGoal(RECRUIT_HERO);
@ -3216,7 +3216,7 @@ bool isWeeklyRevisitable (const CGObjectInstance * obj)
return true; return true;
case Obj::BORDER_GATE: case Obj::BORDER_GATE:
case Obj::BORDERGUARD: case Obj::BORDERGUARD:
return (dynamic_cast <const CGKeys *>(obj))->wasMyColorVisited (ai->playerID); //FIXME: they could be revisited sooner than in a week return (dynamic_cast <const CGKeys *>(obj))->wasMyColorVisited (ai->playerID); //FIXME: they could be revisited sooner than in a week
break; break;
} }
return false; return false;
@ -3556,7 +3556,7 @@ bool HeroPtr::operator<(const HeroPtr &rhs) const
const CGHeroInstance * HeroPtr::get(bool doWeExpectNull /*= false*/) const const CGHeroInstance * HeroPtr::get(bool doWeExpectNull /*= false*/) const
{ {
//TODO? check if these all assertions every time we get info about hero affect efficiency //TODO? check if these all assertions every time we get info about hero affect efficiency
// //
//behave terribly when attempting unauthorised access to hero that is not ours (or was lost) //behave terribly when attempting unauthorised access to hero that is not ours (or was lost)
assert(doWeExpectNull || h); assert(doWeExpectNull || h);
if(h) if(h)

View File

@ -7,9 +7,12 @@ INCLUDE(CheckLibraryExists)
# where to look for cmake modules # where to look for cmake modules
set(CMAKE_MODULE_PATH ${CMAKE_HOME_DIRECTORY}/cmake_modules) set(CMAKE_MODULE_PATH ${CMAKE_HOME_DIRECTORY}/cmake_modules)
set(CMAKE_BUILD_TYPE Debug) # enable Release mode but only if it was not set
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
find_package(Boost COMPONENTS program_options filesystem system thread iostreams REQUIRED) find_package(Boost 1.46.0 COMPONENTS program_options filesystem system thread iostreams REQUIRED)
find_package(SDL REQUIRED) find_package(SDL REQUIRED)
find_package(SDL_image REQUIRED) find_package(SDL_image REQUIRED)
find_package(SDL_mixer REQUIRED) find_package(SDL_mixer REQUIRED)
@ -29,7 +32,7 @@ if(HAVE_DL_LIB)
endif() endif()
if(CMAKE_CXX_COMPILER MATCHES ".*clang") if(CMAKE_CXX_COMPILER MATCHES ".*clang")
set(CMAKE_COMPILER_IS_CLANGXX 1) set(CMAKE_COMPILER_IS_CLANGXX ON)
endif() endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX)
@ -37,12 +40,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX)
endif() endif()
#define required constants #define required constants
add_definitions(-DM_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share") add_definitions(-DM_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/vcmi")
add_definitions(-DM_BIN_DIR="${CMAKE_INSTALL_PREFIX}/lib/vcmi") add_definitions(-DM_BIN_DIR="${CMAKE_INSTALL_PREFIX}/bin")
add_definitions(-DM_LIB_DIR="${CMAKE_INSTALL_PREFIX}/bin") add_definitions(-DM_LIB_DIR="${CMAKE_INSTALL_PREFIX}/lib/vcmi")
add_subdirectory(lib) add_subdirectory(lib)
add_subdirectory(client) add_subdirectory(client)
add_subdirectory(server) add_subdirectory(server)
add_subdirectory(AI) add_subdirectory(AI)
add_subdirectory(Scripting/ERM) add_subdirectory(Scripting/ERM)

View File

@ -6,7 +6,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/BattleInterface ${CMAKE_CURRENT_
include_directories(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLMIXER_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR}) include_directories(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLMIXER_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR})
include_directories(${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIR}) include_directories(${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIR})
set(client_SRCS set(client_SRCS
../CCallback.cpp ../CCallback.cpp
BattleInterface/CBattleAnimations.cpp BattleInterface/CBattleAnimations.cpp
@ -44,7 +43,6 @@ set(client_SRCS
GUIClasses.cpp GUIClasses.cpp
mapHandler.cpp mapHandler.cpp
NetPacksClient.cpp NetPacksClient.cpp
SDL_framerate.cpp
) )
IF(UNIX) IF(UNIX)
@ -53,4 +51,4 @@ ELSEIF(WIN32)
add_executable(vcmiclient WIN32 ${client_SRCS}) add_executable(vcmiclient WIN32 ${client_SRCS})
ENDIF() ENDIF()
target_link_libraries(vcmiclient vcmi ${Boost_LIBRARIES} ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${SDLMIXER_LIBRARY} ${SDLTTF_LIBRARY} ${ZLIB_LIBRARIES} ${FFMPEG_LIBRARIES}) target_link_libraries(vcmiclient vcmi ${Boost_LIBRARIES} ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${SDLMIXER_LIBRARY} ${SDLTTF_LIBRARY} ${ZLIB_LIBRARIES} ${FFMPEG_LIBRARIES} ${RT_LIB} ${DL_LIB})

View File

@ -141,8 +141,10 @@ void CQuestMinimap::showAll(SDL_Surface * to)
CQuestLog::CQuestLog (const std::vector<QuestInfo> & Quests) : CQuestLog::CQuestLog (const std::vector<QuestInfo> & Quests) :
CWindowObject(PLAYER_COLORED, "QuestLog.pcx"), CWindowObject(PLAYER_COLORED, "QuestLog.pcx"),
quests (Quests), slider (NULL), questIndex(0),
questIndex(0), currentQuest(NULL) currentQuest(NULL),
quests (Quests),
slider(NULL)
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL; OBJ_CONSTRUCTION_CAPTURING_ALL;
init(); init();
@ -229,4 +231,4 @@ void CQuestLog::sliderMoved (int newpos)
{ {
recreateQuestList (newpos); //move components recreateQuestList (newpos); //move components
redraw(); redraw();
} }

View File

@ -3323,7 +3323,7 @@ CSystemOptionsWindow::CSystemOptionsWindow():
save->swappedImages = true; save->swappedImages = true;
save->update(); save->update();
restart = new CAdventureMapButton (CGI->generaltexth->zelp[323].first, CGI->generaltexth->zelp[323].second, restart = new CAdventureMapButton (CGI->generaltexth->zelp[323].first, CGI->generaltexth->zelp[323].second,
boost::bind(&CSystemOptionsWindow::brestartf, this), 246, 357, "SORSTRT", SDLK_r); boost::bind(&CSystemOptionsWindow::brestartf, this), 246, 357, "SORSTRT", SDLK_r);
restart->swappedImages = true; restart->swappedImages = true;
restart->update(); restart->update();
@ -3633,7 +3633,7 @@ void CInGameConsole::show(SDL_Surface * to)
std::vector<std::list< std::pair< std::string, int > >::iterator> toDel; std::vector<std::list< std::pair< std::string, int > >::iterator> toDel;
boost::unique_lock<boost::mutex> lock(texts_mx); boost::unique_lock<boost::mutex> lock(texts_mx);
for(std::list< std::pair< std::string, int > >::iterator it = texts.begin(); it != texts.end(); ++it, ++number) for(std::list< std::pair< std::string, int > >::iterator it = texts.begin(); it != texts.end(); ++it, ++number)
{ {
SDL_Color green = {0,0xff,0,0}; SDL_Color green = {0,0xff,0,0};
@ -3657,7 +3657,7 @@ void CInGameConsole::show(SDL_Surface * to)
void CInGameConsole::print(const std::string &txt) void CInGameConsole::print(const std::string &txt)
{ {
boost::unique_lock<boost::mutex> lock(texts_mx); boost::unique_lock<boost::mutex> lock(texts_mx);
int lineLen = conf.go()->ac.outputLineLength; int lineLen = conf.go()->ac.outputLineLength;
if(txt.size() < lineLen) if(txt.size() < lineLen)
@ -5664,7 +5664,7 @@ void MoraleLuckBox::set(const IBonusBearer *node)
text += "\n" + mrl[it].second; text += "\n" + mrl[it].second;
} }
} }
std::string imageName; std::string imageName;
if (small) if (small)
imageName = morale ? "IMRL30": "ILCK30"; imageName = morale ? "IMRL30": "ILCK30";
@ -5787,8 +5787,7 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGTownInstance * town):
CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "TOWNQVBK", toScreen(position)) CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "TOWNQVBK", toScreen(position))
{ {
InfoAboutTown iah; InfoAboutTown iah;
bool gotInfo = LOCPLINT->cb->getTownInfo(town, iah); LOCPLINT->cb->getTownInfo(town, iah);
assert(gotInfo);
OBJ_CONSTRUCTION_CAPTURING_ALL; OBJ_CONSTRUCTION_CAPTURING_ALL;
new CTownTooltip(Point(9, 10), iah); new CTownTooltip(Point(9, 10), iah);
@ -5798,8 +5797,7 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGHeroInstance * hero):
CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "HEROQVBK", toScreen(position)) CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "HEROQVBK", toScreen(position))
{ {
InfoAboutHero iah; InfoAboutHero iah;
bool gotInfo = LOCPLINT->cb->getHeroInfo(hero, iah); LOCPLINT->cb->getHeroInfo(hero, iah);
assert(gotInfo);
OBJ_CONSTRUCTION_CAPTURING_ALL; OBJ_CONSTRUCTION_CAPTURING_ALL;
new CHeroTooltip(Point(9, 10), iah); new CHeroTooltip(Point(9, 10), iah);
@ -5809,8 +5807,7 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGGarrison * garr):
CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "TOWNQVBK", toScreen(position)) CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "TOWNQVBK", toScreen(position))
{ {
InfoAboutTown iah; InfoAboutTown iah;
bool gotInfo = LOCPLINT->cb->getTownInfo(garr, iah); LOCPLINT->cb->getTownInfo(garr, iah);
assert(gotInfo);
OBJ_CONSTRUCTION_CAPTURING_ALL; OBJ_CONSTRUCTION_CAPTURING_ALL;
new CArmyTooltip(Point(9, 10), iah); new CArmyTooltip(Point(9, 10), iah);

View File

@ -51,39 +51,20 @@ namespace Colors
template<typename IntType> template<typename IntType>
std::string makeNumberShort(IntType number) //the output is a string containing at most 5 characters [4 if positive] (eg. intead 10000 it gives 10k) std::string makeNumberShort(IntType number) //the output is a string containing at most 5 characters [4 if positive] (eg. intead 10000 it gives 10k)
{ {
int initialLength; if (abs(number) < 1000)
bool negative = (number < 0); return boost::lexical_cast<std::string>(number);
std::ostringstream ost, rets;
ost<<number;
initialLength = ost.str().size();
if(negative) std::string symbols = "kMGTPE";
auto iter = symbols.begin();
while (number >= 1000)
{ {
if(initialLength <= 4) number /= 1000;
return ost.str(); iter++;
assert(iter != symbols.end());//should be enough even for int64
} }
else return boost::lexical_cast<std::string>(number) + *iter;
{
if(initialLength <= 5)
return ost.str();
}
//make the number int
char symbol[] = {'G', 'M', 'k'};
if(negative) number = (-number); //absolute value
for(int divisor = 1000000000, it = 0; divisor > 1; divisor /= 1000, ++it)
{
if(number >= divisor)
{
if(negative) rets <<'-';
rets << (number / divisor) << symbol[it];
return rets.str();
}
}
throw std::runtime_error("We shouldn't be here - makeNumberShort");
} }
typedef void (*TColorPutter)(Uint8 *&ptr, const Uint8 & R, const Uint8 & G, const Uint8 & B); typedef void (*TColorPutter)(Uint8 *&ptr, const Uint8 & R, const Uint8 & G, const Uint8 & B);

View File

@ -53,10 +53,10 @@ std::map<ui8, ui8> CGObelisk::visited; //map: team_id => how many obelisks has b
std::vector<const CArtifact *> CGTownInstance::merchantArtifacts; std::vector<const CArtifact *> CGTownInstance::merchantArtifacts;
std::vector<int> CGTownInstance::universitySkills; std::vector<int> CGTownInstance::universitySkills;
void IObjectInterface::onHeroVisit(const CGHeroInstance * h) const void IObjectInterface::onHeroVisit(const CGHeroInstance * h) const
{}; {};
void IObjectInterface::onHeroLeave(const CGHeroInstance * h) const void IObjectInterface::onHeroLeave(const CGHeroInstance * h) const
{}; {};
void IObjectInterface::newTurn () const void IObjectInterface::newTurn () const
@ -289,7 +289,7 @@ bool CGObjectInstance::coveringAt(int x, int y) const
y = -y; y = -y;
#if USE_COVERAGE_MAP #if USE_COVERAGE_MAP
//NOTE: this code may be broken //NOTE: this code may be broken
if((defInfo->coverageMap[y] >> (7-(x) )) & 1 if((defInfo->coverageMap[y] >> (7-(x) )) & 1
|| (defInfo->shadowCoverage[y] >> (7-(x) )) & 1) || (defInfo->shadowCoverage[y] >> (7-(x) )) & 1)
return true; return true;
return false; return false;
@ -432,7 +432,7 @@ void CGObjectInstance::getNameVis( std::string &hname ) const
{ {
const CGHeroInstance *h = cb->getSelectedHero(cb->getCurrentPlayer()); const CGHeroInstance *h = cb->getSelectedHero(cb->getCurrentPlayer());
hname = VLC->generaltexth->names[ID]; hname = VLC->generaltexth->names[ID];
if(h) if(h)
{ {
if(!h->hasBonusFrom(Bonus::OBJECT,ID)) if(!h->hasBonusFrom(Bonus::OBJECT,ID))
hname += " " + VLC->generaltexth->allTexts[353]; //not visited hname += " " + VLC->generaltexth->allTexts[353]; //not visited
@ -531,9 +531,9 @@ ui32 CGHeroInstance::getTileCost(const TerrainTile &dest, const TerrainTile &fro
//base move cost //base move cost
unsigned ret = 100; unsigned ret = 100;
//if there is road both on dest and src tiles - use road movement cost //if there is road both on dest and src tiles - use road movement cost
if(dest.malle && from.malle) if(dest.malle && from.malle)
{ {
int road = std::min(dest.malle,from.malle); //used road ID int road = std::min(dest.malle,from.malle); //used road ID
switch(road) switch(road)
@ -552,7 +552,7 @@ ui32 CGHeroInstance::getTileCost(const TerrainTile &dest, const TerrainTile &fro
break; break;
} }
} }
else else
{ {
ret = type->heroClass->terrCosts[from.tertype]; ret = type->heroClass->terrCosts[from.tertype];
ret = std::max(ret - 25*unsigned(getSecSkillLevel(CGHeroInstance::PATHFINDING)), 100u); //reduce 25% of terrain penalty for each pathfinding level ret = std::max(ret - 25*unsigned(getSecSkillLevel(CGHeroInstance::PATHFINDING)), 100u); //reduce 25% of terrain penalty for each pathfinding level
@ -560,7 +560,7 @@ ui32 CGHeroInstance::getTileCost(const TerrainTile &dest, const TerrainTile &fro
return ret; return ret;
} }
#if 0 #if 0
// Unused and buggy method. // Unused and buggy method.
// - for loop is wrong. will not find all creatures. must use iterator instead. // - for loop is wrong. will not find all creatures. must use iterator instead.
// - -> is the slot number. use second->first for creature index // - -> is the slot number. use second->first for creature index
// Is lowestSpeed() the correct equivalent ? // Is lowestSpeed() the correct equivalent ?
@ -657,7 +657,7 @@ int CGHeroInstance::maxMovePoints(bool onLand) const
{ {
base = 1500; //on water base movement is always 1500 (speed of army doesn't matter) base = 1500; //on water base movement is always 1500 (speed of army doesn't matter)
} }
int bonus = valOfBonuses(Bonus::MOVEMENT) + (onLand ? valOfBonuses(Bonus::LAND_MOVEMENT) : valOfBonuses(Bonus::SEA_MOVEMENT)); int bonus = valOfBonuses(Bonus::MOVEMENT) + (onLand ? valOfBonuses(Bonus::LAND_MOVEMENT) : valOfBonuses(Bonus::SEA_MOVEMENT));
double modifier = 0; double modifier = 0;
@ -741,7 +741,7 @@ void CGHeroInstance::initHero()
if(!getArt(ArtifactPosition::MACH4)) if(!getArt(ArtifactPosition::MACH4))
putArtifact(ArtifactPosition::MACH4, CArtifactInstance::createNewArtifactInstance(3)); //everyone has a catapult putArtifact(ArtifactPosition::MACH4, CArtifactInstance::createNewArtifactInstance(3)); //everyone has a catapult
if(portrait < 0 || portrait == 255) if(portrait < 0 || portrait == 255)
portrait = subID; portrait = subID;
if(!hasBonus(Selector::sourceType(Bonus::HERO_BASE_SKILL))) if(!hasBonus(Selector::sourceType(Bonus::HERO_BASE_SKILL)))
@ -927,7 +927,7 @@ const std::string & CGHeroInstance::getBiography() const
if (biography.length()) if (biography.length())
return biography; return biography;
else else
return VLC->generaltexth->hTxts[subID].biography; return VLC->generaltexth->hTxts[subID].biography;
} }
void CGHeroInstance::initObj() void CGHeroInstance::initObj()
{ {
@ -965,7 +965,7 @@ void CGHeroInstance::initObj()
} }
bonus->limiter.reset(new CCreatureTypeLimiter (specCreature, true)); //with upgrades bonus->limiter.reset(new CCreatureTypeLimiter (specCreature, true)); //with upgrades
bonus->type = Bonus::PRIMARY_SKILL; bonus->type = Bonus::PRIMARY_SKILL;
bonus->additionalInfo = it->additionalinfo; bonus->additionalInfo = it->additionalinfo;
bonus->valType = Bonus::ADDITIVE_VALUE; bonus->valType = Bonus::ADDITIVE_VALUE;
@ -1182,7 +1182,7 @@ void CGHeroInstance::updateSkill(int which, int val)
} }
else if(which == DIPLOMACY) //surrender discount: 20% per level else if(which == DIPLOMACY) //surrender discount: 20% per level
{ {
if(Bonus *b = getBonus(Selector::type(Bonus::SURRENDER_DISCOUNT) && Selector::sourceType(Bonus::SECONDARY_SKILL))) if(Bonus *b = getBonus(Selector::type(Bonus::SURRENDER_DISCOUNT) && Selector::sourceType(Bonus::SECONDARY_SKILL)))
b->val = +val; b->val = +val;
else else
@ -1230,7 +1230,7 @@ void CGHeroInstance::updateSkill(int which, int val)
case ESTATES: case ESTATES:
skillVal = 125 << (val-1); break; skillVal = 125 << (val-1); break;
} }
int skillValType = skillVal ? Bonus::BASE_NUMBER : Bonus::INDEPENDENT_MIN; int skillValType = skillVal ? Bonus::BASE_NUMBER : Bonus::INDEPENDENT_MIN;
if(Bonus * b = getBonusList().getFirst(Selector::typeSubtype(Bonus::SECONDARY_SKILL_PREMY, which) && Selector::sourceType(Bonus::SECONDARY_SKILL))) //only local hero bonus if(Bonus * b = getBonusList().getFirst(Selector::typeSubtype(Bonus::SECONDARY_SKILL_PREMY, which) && Selector::sourceType(Bonus::SECONDARY_SKILL))) //only local hero bonus
@ -1244,7 +1244,7 @@ void CGHeroInstance::updateSkill(int which, int val)
bonus->source = Bonus::SECONDARY_SKILL; bonus->source = Bonus::SECONDARY_SKILL;
addNewBonus(bonus); addNewBonus(bonus);
} }
} }
void CGHeroInstance::setPropertyDer( ui8 what, ui32 val ) void CGHeroInstance::setPropertyDer( ui8 what, ui32 val )
{ {
@ -1331,7 +1331,7 @@ CStackBasicDescriptor CGHeroInstance::calculateNecromancy (const BattleResult &b
const ui8 necromancyLevel = getSecSkillLevel(CGHeroInstance::NECROMANCY); const ui8 necromancyLevel = getSecSkillLevel(CGHeroInstance::NECROMANCY);
// Hero knows necromancy. // Hero knows necromancy.
if (necromancyLevel > 0) if (necromancyLevel > 0)
{ {
double necromancySkill = valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, NECROMANCY)/100.0; double necromancySkill = valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, NECROMANCY)/100.0;
vstd::amin(necromancySkill, 1.0); //it's impossible to raise more creatures than all... vstd::amin(necromancySkill, 1.0); //it's impossible to raise more creatures than all...
@ -1358,7 +1358,7 @@ CStackBasicDescriptor CGHeroInstance::calculateNecromancy (const BattleResult &b
// Make room for new units. // Make room for new units.
int slot = getSlotFor(raisedUnitType->idNumber); int slot = getSlotFor(raisedUnitType->idNumber);
if (slot == -1) if (slot == -1)
{ {
// If there's no room for unit, try it's upgraded version 2/3rds the size. // If there's no room for unit, try it's upgraded version 2/3rds the size.
raisedUnitType = VLC->creh->creatures[*raisedUnitType->upgrades.begin()]; raisedUnitType = VLC->creh->creatures[*raisedUnitType->upgrades.begin()];
@ -1388,13 +1388,13 @@ void CGHeroInstance::showNecromancyDialog(const CStackBasicDescriptor &raisedSta
iw.components.push_back(Component(raisedStack)); iw.components.push_back(Component(raisedStack));
if (raisedStack.count > 1) // Practicing the dark arts of necromancy, ... (plural) if (raisedStack.count > 1) // Practicing the dark arts of necromancy, ... (plural)
{ {
iw.text.addTxt(MetaString::GENERAL_TXT, 145); iw.text.addTxt(MetaString::GENERAL_TXT, 145);
iw.text.addReplacement(raisedStack.count); iw.text.addReplacement(raisedStack.count);
iw.text.addReplacement(MetaString::CRE_PL_NAMES, raisedStack.type->idNumber); iw.text.addReplacement(MetaString::CRE_PL_NAMES, raisedStack.type->idNumber);
} }
else // Practicing the dark arts of necromancy, ... (singular) else // Practicing the dark arts of necromancy, ... (singular)
{ {
iw.text.addTxt(MetaString::GENERAL_TXT, 146); iw.text.addTxt(MetaString::GENERAL_TXT, 146);
iw.text.addReplacement(MetaString::CRE_SING_NAMES, raisedStack.type->idNumber); iw.text.addReplacement(MetaString::CRE_SING_NAMES, raisedStack.type->idNumber);
} }
@ -1417,7 +1417,7 @@ si32 CGHeroInstance::manaRegain() const
if (hasBonusOfType(Bonus::FULL_MANA_REGENERATION)) if (hasBonusOfType(Bonus::FULL_MANA_REGENERATION))
return manaLimit(); return manaLimit();
return 1 + valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 8) + valOfBonuses(Bonus::MANA_REGENERATION); //1 + Mysticism level return 1 + valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 8) + valOfBonuses(Bonus::MANA_REGENERATION); //1 + Mysticism level
} }
// /** // /**
@ -1433,7 +1433,7 @@ si32 CGHeroInstance::manaRegain() const
int CGHeroInstance::getBoatType() const int CGHeroInstance::getBoatType() const
{ {
int alignment = type->heroType / 6; int alignment = type->heroType / 6;
switch(alignment) switch(alignment)
{ {
case 0: case 0:
@ -1570,14 +1570,14 @@ void CGDwelling::initObj()
if(subID == 1) //Golem Factory if(subID == 1) //Golem Factory
{ {
creatures[0].second.push_back(32); //Stone Golem creatures[0].second.push_back(32); //Stone Golem
creatures[1].second.push_back(33); //Iron Golem creatures[1].second.push_back(33); //Iron Golem
creatures[2].second.push_back(116); //Gold Golem creatures[2].second.push_back(116); //Gold Golem
creatures[3].second.push_back(117); //Diamond Golem creatures[3].second.push_back(117); //Diamond Golem
//guards //guards
putStack(0, new CStackInstance(116, 9)); putStack(0, new CStackInstance(116, 9));
putStack(1, new CStackInstance(117, 6)); putStack(1, new CStackInstance(117, 6));
} }
else if(subID == 0) // Elemental Conflux else if(subID == 0) // Elemental Conflux
{ {
creatures[0].second.push_back(112); //Air Elemental creatures[0].second.push_back(112); //Air Elemental
creatures[1].second.push_back(114); //Fire Elemental creatures[1].second.push_back(114); //Fire Elemental
@ -1595,11 +1595,11 @@ void CGDwelling::initObj()
case 78: //Refugee Camp case 78: //Refugee Camp
//is handled within newturn func //is handled within newturn func
break; break;
case 106: //War Machine Factory case 106: //War Machine Factory
creatures.resize(3); creatures.resize(3);
creatures[0].second.push_back(146); //Ballista creatures[0].second.push_back(146); //Ballista
creatures[1].second.push_back(147); //First Aid Tent creatures[1].second.push_back(147); //First Aid Tent
creatures[2].second.push_back(148); //Ammo Cart creatures[2].second.push_back(148); //Ammo Cart
break; break;
@ -1647,10 +1647,10 @@ void CGDwelling::onHeroVisit( const CGHeroInstance * h ) const
} }
int relations = cb->gameState()->getPlayerRelations( h->tempOwner, tempOwner ); int relations = cb->gameState()->getPlayerRelations( h->tempOwner, tempOwner );
if ( relations == 1 )//ally if ( relations == 1 )//ally
return;//do not allow recruiting or capturing return;//do not allow recruiting or capturing
if( !relations && stacksCount() > 0) //object is guarded, owned by enemy if( !relations && stacksCount() > 0) //object is guarded, owned by enemy
{ {
BlockingDialog bd; BlockingDialog bd;
@ -1799,7 +1799,7 @@ void CGDwelling::heroAcceptsCreatures( const CGHeroInstance *h, ui32 answer ) co
ow.id1 = id; ow.id1 = id;
ow.id2 = h->id; ow.id2 = h->id;
ow.window = (ID == 17 || ID == 78) ow.window = (ID == 17 || ID == 78)
? OpenWindow::RECRUITMENT_FIRST ? OpenWindow::RECRUITMENT_FIRST
: OpenWindow::RECRUITMENT_ALL; : OpenWindow::RECRUITMENT_ALL;
cb->sendAndApply(&ow); cb->sendAndApply(&ow);
} }
@ -1850,7 +1850,7 @@ void CGTownInstance::setPropertyDer(ui8 what, ui32 val)
break; break;
case 15: case 15:
bonusValue.second = val; bonusValue.second = val;
break; break;
} }
} }
CGTownInstance::EFortLevel CGTownInstance::fortLevel() const //0 - none, 1 - fort, 2 - citadel, 3 - castle CGTownInstance::EFortLevel CGTownInstance::fortLevel() const //0 - none, 1 - fort, 2 - citadel, 3 - castle
@ -1943,7 +1943,7 @@ GrowthInfo CGTownInstance::getGrowthInfo(int level) const
if(dwellingBonus) if(dwellingBonus)
ret.entries.push_back(GrowthInfo::Entry(VLC->generaltexth->allTexts[591], dwellingBonus));// \nExternal dwellings %+d ret.entries.push_back(GrowthInfo::Entry(VLC->generaltexth->allTexts[591], dwellingBonus));// \nExternal dwellings %+d
//other *-of-legion-like bonuses (%d to growth cumulative with grail) //other *-of-legion-like bonuses (%d to growth cumulative with grail)
TBonusListPtr bonuses = getBonuses(Selector::type(Bonus::CREATURE_GROWTH) && Selector::subtype(level)); TBonusListPtr bonuses = getBonuses(Selector::type(Bonus::CREATURE_GROWTH) && Selector::subtype(level));
BOOST_FOREACH(const Bonus *b, *bonuses) BOOST_FOREACH(const Bonus *b, *bonuses)
@ -1993,7 +1993,7 @@ CGTownInstance::CGTownInstance()
CGTownInstance::~CGTownInstance() CGTownInstance::~CGTownInstance()
{ {
for (std::vector<CGTownBuilding*>::const_iterator i = bonusingBuildings.begin(); i != bonusingBuildings.end(); i++) for (std::vector<CGTownBuilding*>::const_iterator i = bonusingBuildings.begin(); i != bonusingBuildings.end(); i++)
delete *i; delete *i;
} }
@ -2003,7 +2003,7 @@ int CGTownInstance::spellsAtLevel(int level, bool checkGuild) const
return 0; return 0;
int ret = 6 - level; //how many spells are available at this level int ret = 6 - level; //how many spells are available at this level
if(subID == 2 && vstd::contains(builtBuildings,22)) //magic library in Tower if(subID == 2 && vstd::contains(builtBuildings,22)) //magic library in Tower
ret++; ret++;
return ret; return ret;
} }
@ -2033,8 +2033,8 @@ void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const
bool outsideTown = (defendingHero == visitingHero && garrisonHero); bool outsideTown = (defendingHero == visitingHero && garrisonHero);
//TODO //TODO
//"borrowing" army from garrison to visiting hero //"borrowing" army from garrison to visiting hero
cb->startBattleI(h, defendingArmy, getSightCenter(), h, defendingHero, false, boost::bind(&CGTownInstance::fightOver, this, h, _1), (outsideTown ? NULL : this)); cb->startBattleI(h, defendingArmy, getSightCenter(), h, defendingHero, false, boost::bind(&CGTownInstance::fightOver, this, h, _1), (outsideTown ? NULL : this));
} }
@ -2152,7 +2152,7 @@ void CGTownInstance::newTurn() const
int i = rand() % std::min (GameConstants::ARMY_SIZE, cb->getDate(3)<<1); int i = rand() % std::min (GameConstants::ARMY_SIZE, cb->getDate(3)<<1);
TCreature c = town->basicCreatures[i]; TCreature c = town->basicCreatures[i];
TSlot n = -1; TSlot n = -1;
TQuantity count = creatureGrowth(i); TQuantity count = creatureGrowth(i);
if (!count) // no dwelling if (!count) // no dwelling
count = VLC->creh->creatures[c]->growth; count = VLC->creh->creatures[c]->growth;
@ -2160,7 +2160,7 @@ void CGTownInstance::newTurn() const
{//no lower tiers or above current month {//no lower tiers or above current month
if ((n = getSlotFor(c))>=0) if ((n = getSlotFor(c))>=0)
{ {
StackLocation sl(this, n); StackLocation sl(this, n);
if (slotEmpty(n)) if (slotEmpty(n))
cb->insertNewStack(sl, VLC->creh->creatures[c], count); cb->insertNewStack(sl, VLC->creh->creatures[c], count);
@ -2168,7 +2168,7 @@ void CGTownInstance::newTurn() const
cb->changeStackCount(sl, count); cb->changeStackCount(sl, count);
} }
} }
} }
} }
} }
} }
@ -2184,12 +2184,12 @@ ui8 CGTownInstance::getPassableness() const
return GameConstants::ALL_PLAYERS; return GameConstants::ALL_PLAYERS;
if ( tempOwner == 255 )//neutral guarded - no one can visit if ( tempOwner == 255 )//neutral guarded - no one can visit
return 0; return 0;
ui8 mask = 0; ui8 mask = 0;
TeamState * ts = cb->gameState()->getPlayerTeam(tempOwner); TeamState * ts = cb->gameState()->getPlayerTeam(tempOwner);
BOOST_FOREACH(ui8 it, ts->players) BOOST_FOREACH(ui8 it, ts->players)
mask |= 1<<it;//allies - add to possible visitors mask |= 1<<it;//allies - add to possible visitors
return mask; return mask;
} }
@ -2213,24 +2213,24 @@ void CGTownInstance::fightOver( const CGHeroInstance *h, BattleResult *result )
} }
void CGTownInstance::removeCapitols (ui8 owner) const void CGTownInstance::removeCapitols (ui8 owner) const
{ {
if (hasCapitol()) // search if there's an older capitol if (hasCapitol()) // search if there's an older capitol
{ {
PlayerState* state = cb->gameState()->getPlayer (owner); //get all towns owned by player PlayerState* state = cb->gameState()->getPlayer (owner); //get all towns owned by player
for (std::vector<ConstTransitivePtr<CGTownInstance> >::const_iterator i = state->towns.begin(); i < state->towns.end(); ++i) for (std::vector<ConstTransitivePtr<CGTownInstance> >::const_iterator i = state->towns.begin(); i < state->towns.end(); ++i)
{ {
if (*i != this && (*i)->hasCapitol()) if (*i != this && (*i)->hasCapitol())
{ {
RazeStructures rs; RazeStructures rs;
rs.tid = id; rs.tid = id;
rs.bid.insert(13); rs.bid.insert(13);
rs.destroyed = destroyed; rs.destroyed = destroyed;
cb->sendAndApply(&rs); cb->sendAndApply(&rs);
return; return;
} }
} }
} }
} }
int CGTownInstance::getBoatType() const int CGTownInstance::getBoatType() const
{ {
@ -2245,7 +2245,7 @@ int CGTownInstance::getBoatType() const
int CGTownInstance::getMarketEfficiency() const int CGTownInstance::getMarketEfficiency() const
{ {
if(!vstd::contains(builtBuildings, 14)) if(!vstd::contains(builtBuildings, 14))
return 0; return 0;
const PlayerState *p = cb->getPlayer(tempOwner); const PlayerState *p = cb->getPlayer(tempOwner);
@ -2325,7 +2325,7 @@ void CGTownInstance::recreateBuildingsBonuses()
if(subID != 0 || !addBonusIfBuilt(22, Bonus::MORALE, +2)) //tricky! -> checks tavern only if no bratherhood of sword or not a castle if(subID != 0 || !addBonusIfBuilt(22, Bonus::MORALE, +2)) //tricky! -> checks tavern only if no bratherhood of sword or not a castle
addBonusIfBuilt(5, Bonus::MORALE, +1); addBonusIfBuilt(5, Bonus::MORALE, +1);
if(subID == 0) //castle if(subID == 0) //castle
{ {
addBonusIfBuilt(17, Bonus::SEA_MOVEMENT, +500, make_shared<CPropagatorNodeType>(PLAYER)); //lighthouses addBonusIfBuilt(17, Bonus::SEA_MOVEMENT, +500, make_shared<CPropagatorNodeType>(PLAYER)); //lighthouses
@ -2737,19 +2737,19 @@ const std::string & CGVisitableOPH::getHoverText() const
pom = -1; pom = -1;
break; break;
case 51: case 51:
pom = 8; pom = 8;
break; break;
case 23: case 23:
pom = 7; pom = 7;
break; break;
case 61: case 61:
pom = 11; pom = 11;
break; break;
case 32: case 32:
pom = 4; pom = 4;
break; break;
case 100: case 100:
pom = 5; pom = 5;
break; break;
case 102: case 102:
pom = 18; pom = 18;
@ -2772,7 +2772,7 @@ const std::string & CGVisitableOPH::getHoverText() const
if(h) if(h)
{ {
hoverName += "\n\n"; hoverName += "\n\n";
hoverName += (vstd::contains(visitors,h->id)) hoverName += (vstd::contains(visitors,h->id))
? (VLC->generaltexth->allTexts[352]) //visited ? (VLC->generaltexth->allTexts[352]) //visited
: ( VLC->generaltexth->allTexts[353]); //not visited : ( VLC->generaltexth->allTexts[353]); //not visited
} }
@ -2843,7 +2843,7 @@ void COPWBonus::onHeroVisit (const CGHeroInstance * h) const
case 5: //Mana Vortex case 5: //Mana Vortex
if (visitors.empty() && h->mana <= h->manaLimit() * 2) if (visitors.empty() && h->mana <= h->manaLimit() * 2)
{ {
cb->setManaPoints (heroID, 2 * h->manaLimit()); cb->setManaPoints (heroID, 2 * h->manaLimit());
cb->setObjProperty (id, ObjProperty::VISITED, true); cb->setObjProperty (id, ObjProperty::VISITED, true);
iw.text << VLC->generaltexth->allTexts[579]; iw.text << VLC->generaltexth->allTexts[579];
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -2973,7 +2973,7 @@ void CGCreature::onHeroVisit( const CGHeroInstance * h ) const
{ {
BlockingDialog ynd(true,false); BlockingDialog ynd(true,false);
ynd.player = h->tempOwner; ynd.player = h->tempOwner;
ynd.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT, 86); ynd.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT, 86);
ynd.text.addReplacement(MetaString::CRE_PL_NAMES, subID); ynd.text.addReplacement(MetaString::CRE_PL_NAMES, subID);
cb->showBlockingDialog(&ynd,boost::bind(&CGCreature::joinDecision,this,h,0,_1)); cb->showBlockingDialog(&ynd,boost::bind(&CGCreature::joinDecision,this,h,0,_1));
break; break;
@ -3009,7 +3009,7 @@ void CGCreature::endBattle( BattleResult *result ) const
//for(std::set<std::pair<ui32,si32> >::iterator i=result->casualties[1].begin(); i!=result->casualties[1].end(); i++) //for(std::set<std::pair<ui32,si32> >::iterator i=result->casualties[1].begin(); i!=result->casualties[1].end(); i++)
// if(i->first == subID) // if(i->first == subID)
// killedAmount += i->second; // killedAmount += i->second;
//cb->setAmount(id, slots.find(0)->second.second - killedAmount); //cb->setAmount(id, slots.find(0)->second.second - killedAmount);
/* /*
MetaString ms; MetaString ms;
@ -3139,7 +3139,7 @@ int CGCreature::takenAction(const CGHeroInstance *h, bool allowJoin) const
std::set<ui32> myKindCres; //what creatures are the same kind as we std::set<ui32> myKindCres; //what creatures are the same kind as we
myKindCres.insert(subID); //we myKindCres.insert(subID); //we
myKindCres.insert(VLC->creh->creatures[subID]->upgrades.begin(),VLC->creh->creatures[subID]->upgrades.end()); //our upgrades myKindCres.insert(VLC->creh->creatures[subID]->upgrades.begin(),VLC->creh->creatures[subID]->upgrades.end()); //our upgrades
BOOST_FOREACH(ConstTransitivePtr<CCreature> &crea, VLC->creh->creatures) BOOST_FOREACH(ConstTransitivePtr<CCreature> &crea, VLC->creh->creatures)
{ {
if(vstd::contains(crea->upgrades, (ui32) id)) //it's our base creatures if(vstd::contains(crea->upgrades, (ui32) id)) //it's our base creatures
@ -3309,7 +3309,7 @@ void CGCreature::flee( const CGHeroInstance * h ) const
{ {
BlockingDialog ynd(true,false); BlockingDialog ynd(true,false);
ynd.player = h->tempOwner; ynd.player = h->tempOwner;
ynd.text << std::pair<ui8,ui32>(11,91); ynd.text << std::pair<ui8,ui32>(11,91);
ynd.text.addReplacement(MetaString::CRE_PL_NAMES, subID); ynd.text.addReplacement(MetaString::CRE_PL_NAMES, subID);
cb->showBlockingDialog(&ynd,boost::bind(&CGCreature::fleeDecision,this,h,_1)); cb->showBlockingDialog(&ynd,boost::bind(&CGCreature::fleeDecision,this,h,_1));
} }
@ -3317,11 +3317,11 @@ void CGCreature::flee( const CGHeroInstance * h ) const
void CGMine::onHeroVisit( const CGHeroInstance * h ) const void CGMine::onHeroVisit( const CGHeroInstance * h ) const
{ {
int relations = cb->gameState()->getPlayerRelations(h->tempOwner, tempOwner); int relations = cb->gameState()->getPlayerRelations(h->tempOwner, tempOwner);
if(relations == 2) //we're visiting our mine if(relations == 2) //we're visiting our mine
{ {
cb->showGarrisonDialog(id,h->id,true,0); cb->showGarrisonDialog(id,h->id,true,0);
return; return;
} }
else if (relations == 1)//ally else if (relations == 1)//ally
return; return;
@ -3330,7 +3330,7 @@ void CGMine::onHeroVisit( const CGHeroInstance * h ) const
{ {
BlockingDialog ynd(true,false); BlockingDialog ynd(true,false);
ynd.player = h->tempOwner; ynd.player = h->tempOwner;
ynd.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT, subID == 7 ? 84 : 187); ynd.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT, subID == 7 ? 84 : 187);
cb->showBlockingDialog(&ynd,boost::bind(&CGMine::fight, this, _1, h)); cb->showBlockingDialog(&ynd,boost::bind(&CGMine::fight, this, _1, h));
return; return;
} }
@ -3377,7 +3377,7 @@ void CGMine::initObj()
MetaString ms; MetaString ms;
ms << std::pair<ui8,ui32>(9,producedResource); ms << std::pair<ui8,ui32>(9,producedResource);
if(tempOwner >= GameConstants::PLAYER_LIMIT) if(tempOwner >= GameConstants::PLAYER_LIMIT)
tempOwner = GameConstants::NEUTRAL_PLAYER; tempOwner = GameConstants::NEUTRAL_PLAYER;
else else
ms << " (" << std::pair<ui8,ui32>(6,23+tempOwner) << ")"; ms << " (" << std::pair<ui8,ui32>(6,23+tempOwner) << ")";
ms.toString(hoverName); ms.toString(hoverName);
@ -3557,7 +3557,7 @@ void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const
{ {
if (ID!=112) if (ID!=112)
mid++; mid++;
else else
mid--; mid--;
InfoWindow iw; InfoWindow iw;
@ -4015,7 +4015,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
if (subID) //not OH3 treasure chest if (subID) //not OH3 treasure chest
{ {
tlog2 << "Not supported WoG treasure chest!\n"; tlog2 << "Not supported WoG treasure chest!\n";
return; return;
} }
if(type) //there is an artifact if(type) //there is an artifact
@ -4115,7 +4115,7 @@ bool CQuest::checkQuest (const CGHeroInstance * h) const
case MISSION_RESOURCES: case MISSION_RESOURCES:
for (int i = 0; i < 7; ++i) //including Mithril ? for (int i = 0; i < 7; ++i) //including Mithril ?
{ //Quest has no direct access to callback { //Quest has no direct access to callback
if (h->cb->getResource (h->tempOwner, i) < m7resources[i]) if (h->cb->getResource (h->tempOwner, i) < m7resources[i])
return false; return false;
} }
return true; return true;
@ -4136,7 +4136,7 @@ void CQuest::getVisitText (MetaString &iwText, std::vector<Component> &component
std::string text; std::string text;
bool failRequirements = (h ? !checkQuest(h) : true); bool failRequirements = (h ? !checkQuest(h) : true);
if (firstVisit) if (firstVisit)
{ {
isCustom = isCustomFirst; isCustom = isCustomFirst;
iwText << firstVisitText; iwText << firstVisitText;
@ -4164,7 +4164,7 @@ void CQuest::getVisitText (MetaString &iwText, std::vector<Component> &component
loot << "%d %s"; loot << "%d %s";
loot.addReplacement(m2stats[i]); loot.addReplacement(m2stats[i]);
loot.addReplacement(VLC->generaltexth->primarySkillNames[i]); loot.addReplacement(VLC->generaltexth->primarySkillNames[i]);
} }
} }
if (!isCustom) if (!isCustom)
iwText.addReplacement(loot.buildList()); iwText.addReplacement(loot.buildList());
@ -4259,7 +4259,7 @@ void CQuest::getRolloverText (MetaString &ms, bool onHover) const
loot << "%d %s"; loot << "%d %s";
loot.addReplacement(m2stats[i]); loot.addReplacement(m2stats[i]);
loot.addReplacement(VLC->generaltexth->primarySkillNames[i]); loot.addReplacement(VLC->generaltexth->primarySkillNames[i]);
} }
} }
ms.addReplacement(loot.buildList()); ms.addReplacement(loot.buildList());
} }
@ -4422,9 +4422,9 @@ void CGSeerHut::initObj()
if (missionType) if (missionType)
{ {
if (!isCustomFirst) if (!isCustomFirst)
firstVisitText = VLC->generaltexth->quests[missionType-1][0][textOption]; firstVisitText = VLC->generaltexth->quests[missionType-1][0][textOption];
if (!isCustomNext) if (!isCustomNext)
nextVisitText = VLC->generaltexth->quests[missionType-1][1][textOption]; nextVisitText = VLC->generaltexth->quests[missionType-1][1][textOption];
if (!isCustomComplete) if (!isCustomComplete)
completedText = VLC->generaltexth->quests[missionType-1][2][textOption]; completedText = VLC->generaltexth->quests[missionType-1][2][textOption];
} }
@ -4457,7 +4457,7 @@ const std::string & CGSeerHut::getHoverText() const
if (progress & missionType) //rollover when the quest is active if (progress & missionType) //rollover when the quest is active
{ {
MetaString ms; MetaString ms;
getRolloverText (ms, true); getRolloverText (ms, true);
hoverName += ms.toString(); hoverName += ms.toString();
} }
return hoverName; return hoverName;
@ -4539,7 +4539,7 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
bool failRequirements = !checkQuest(h); bool failRequirements = !checkQuest(h);
bool isCustom=false; bool isCustom=false;
if (firstVisit) if (firstVisit)
{ {
isCustom = isCustomFirst; isCustom = isCustomFirst;
cb->setObjProperty (id, 10, IN_PROGRESS); cb->setObjProperty (id, 10, IN_PROGRESS);
@ -4565,9 +4565,9 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
BlockingDialog bd (true, false); BlockingDialog bd (true, false);
bd.player = h->getOwner(); bd.player = h->getOwner();
bd.soundID = soundBase::QUEST; bd.soundID = soundBase::QUEST;
getCompletionText (bd.text, bd.components, isCustom, h); getCompletionText (bd.text, bd.components, isCustom, h);
cb->showBlockingDialog (&bd, boost::bind (&CGSeerHut::finishQuest, this, h, _1)); cb->showBlockingDialog (&bd, boost::bind (&CGSeerHut::finishQuest, this, h, _1));
return; return;
} }
@ -4637,7 +4637,7 @@ void CGSeerHut::finishQuest(const CGHeroInstance * h, ui32 accept) const
} }
cb->setObjProperty (id, 10, COMPLETE); //mission complete - for AI cb->setObjProperty (id, 10, COMPLETE); //mission complete - for AI
cb->setObjProperty (id, 11, 0); //no more mission available - redundant? cb->setObjProperty (id, 11, 0); //no more mission available - redundant?
completeQuest(h); //make sure to remove QuestQuard at the very end completeQuest(h); //make sure to remove QuestQuard at the very end
} }
} }
void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward
@ -4977,7 +4977,7 @@ const std::string & CGBonusingObject::getHoverText() const
{ {
const CGHeroInstance *h = cb->getSelectedHero(cb->getCurrentPlayer()); const CGHeroInstance *h = cb->getSelectedHero(cb->getCurrentPlayer());
hoverName = VLC->generaltexth->names[ID]; hoverName = VLC->generaltexth->names[ID];
if(h) if(h)
{ {
if(!h->hasBonusFrom(Bonus::OBJECT,ID)) if(!h->hasBonusFrom(Bonus::OBJECT,ID))
hoverName += " " + VLC->generaltexth->allTexts[353]; //not visited hoverName += " " + VLC->generaltexth->allTexts[353]; //not visited
@ -4995,38 +4995,38 @@ void CGBonusingObject::initObj()
} }
} }
void CGMagicSpring::onHeroVisit(const CGHeroInstance * h) const void CGMagicSpring::onHeroVisit(const CGHeroInstance * h) const
{ {
int messageID; int messageID;
InfoWindow iw; InfoWindow iw;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.soundID = soundBase::GENIE; iw.soundID = soundBase::GENIE;
if (!visited) if (!visited)
{ {
if (h->mana > h->manaLimit()) if (h->mana > h->manaLimit())
messageID = 76; messageID = 76;
else else
{ {
messageID = 74; messageID = 74;
cb->setManaPoints (h->id, 2 * h->manaLimit()); cb->setManaPoints (h->id, 2 * h->manaLimit());
cb->setObjProperty (id, ObjProperty::VISITED, true); cb->setObjProperty (id, ObjProperty::VISITED, true);
} }
} }
else else
messageID = 75; messageID = 75;
iw.text << std::pair<ui8,ui32>(11,messageID); iw.text << std::pair<ui8,ui32>(11,messageID);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
} }
const std::string & CGMagicSpring::getHoverText() const const std::string & CGMagicSpring::getHoverText() const
{ {
hoverName = VLC->generaltexth->names[ID]; hoverName = VLC->generaltexth->names[ID];
if(!visited) if(!visited)
hoverName += " " + VLC->generaltexth->allTexts[353]; //not visited hoverName += " " + VLC->generaltexth->allTexts[353]; //not visited
else else
hoverName += " " + VLC->generaltexth->allTexts[352]; //visited hoverName += " " + VLC->generaltexth->allTexts[352]; //visited
return hoverName; return hoverName;
} }
void CGMagicWell::onHeroVisit( const CGHeroInstance * h ) const void CGMagicWell::onHeroVisit( const CGHeroInstance * h ) const
{ {
@ -5069,7 +5069,7 @@ void CGPandoraBox::onHeroVisit(const CGHeroInstance * h) const
bd.player = h->getOwner(); bd.player = h->getOwner();
bd.soundID = soundBase::QUEST; bd.soundID = soundBase::QUEST;
bd.text.addTxt (MetaString::ADVOB_TXT, 14); bd.text.addTxt (MetaString::ADVOB_TXT, 14);
cb->showBlockingDialog (&bd, boost::bind (&CGPandoraBox::open, this, h, _1)); cb->showBlockingDialog (&bd, boost::bind (&CGPandoraBox::open, this, h, _1));
} }
void CGPandoraBox::open( const CGHeroInstance * h, ui32 accept ) const void CGPandoraBox::open( const CGHeroInstance * h, ui32 accept ) const
@ -5284,7 +5284,7 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con
if (creatures.Slots().size()) if (creatures.Slots().size())
{ //this part is taken straight from creature bank { //this part is taken straight from creature bank
MetaString loot; MetaString loot;
for(TSlots::const_iterator i = creatures.Slots().begin(); i != creatures.Slots().end(); i++) for(TSlots::const_iterator i = creatures.Slots().begin(); i != creatures.Slots().end(); i++)
{ //build list of joined creatures { //build list of joined creatures
iw.components.push_back(Component(*i->second)); iw.components.push_back(Component(*i->second));
@ -5344,7 +5344,7 @@ void CGPandoraBox::getText( InfoWindow &iw, bool &afterBattle, int val, int nega
void CGEvent::onHeroVisit( const CGHeroInstance * h ) const void CGEvent::onHeroVisit( const CGHeroInstance * h ) const
{ {
if(!(availableFor & (1 << h->tempOwner))) if(!(availableFor & (1 << h->tempOwner)))
return; return;
if(cb->getPlayerSettings(h->tempOwner)->human) if(cb->getPlayerSettings(h->tempOwner)->human)
{ {
@ -5608,12 +5608,12 @@ ui8 CGGarrison::getPassableness() const
return GameConstants::ALL_PLAYERS; return GameConstants::ALL_PLAYERS;
if ( tempOwner == 255 )//neutral guarded - no one can visit if ( tempOwner == 255 )//neutral guarded - no one can visit
return 0; return 0;
ui8 mask = 0; ui8 mask = 0;
TeamState * ts = cb->gameState()->getPlayerTeam(tempOwner); TeamState * ts = cb->gameState()->getPlayerTeam(tempOwner);
BOOST_FOREACH(ui8 it, ts->players) BOOST_FOREACH(ui8 it, ts->players)
mask |= 1<<it;//allies - add to possible visitors mask |= 1<<it;//allies - add to possible visitors
return mask; return mask;
} }
@ -5625,7 +5625,7 @@ void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const
switch(ID) switch(ID)
{ {
case 22: //Corpse case 22: //Corpse
txtid = 37; txtid = 37;
sound = soundBase::MYSTERY; sound = soundBase::MYSTERY;
break; break;
case 39: //Lean To case 39: //Lean To
@ -5690,7 +5690,7 @@ void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const
cb->giveResource(h->getOwner(), bonusType, bonusVal); cb->giveResource(h->getOwner(), bonusType, bonusVal);
break; break;
} }
if(ID == 105 && artOrRes == 1) if(ID == 105 && artOrRes == 1)
{ {
iw.text.localStrings.back().second++; iw.text.localStrings.back().second++;
iw.text.addReplacement(MetaString::ART_NAMES, bonusType); iw.text.addReplacement(MetaString::ART_NAMES, bonusType);
@ -5799,11 +5799,11 @@ void CGOnceVisitable::searchTomb(const CGHeroInstance *h, ui32 accept) const
iw.text.addReplacement(MetaString::ART_NAMES, bonusType); iw.text.addReplacement(MetaString::ART_NAMES, bonusType);
cb->giveHeroNewArtifact(h, VLC->arth->artifacts[bonusType],-2); cb->giveHeroNewArtifact(h, VLC->arth->artifacts[bonusType],-2);
} }
if(!h->hasBonusFrom(Bonus::OBJECT,ID)) //we don't have modifier from this object yet if(!h->hasBonusFrom(Bonus::OBJECT,ID)) //we don't have modifier from this object yet
{ {
//ruin morale //ruin morale
GiveBonus gb; GiveBonus gb;
gb.id = h->id; gb.id = h->id;
gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::MORALE,Bonus::OBJECT,-3,id,""); gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::MORALE,Bonus::OBJECT,-3,id,"");
@ -5835,7 +5835,7 @@ void CBank::reset(ui16 var1) //prevents desync
{ {
ui8 chance = 0; ui8 chance = 0;
for (ui8 i = 0; i < VLC->objh->banksInfo[index].size(); i++) for (ui8 i = 0; i < VLC->objh->banksInfo[index].size(); i++)
{ {
if (var1 < (chance += VLC->objh->banksInfo[index][i]->chance)) if (var1 < (chance += VLC->objh->banksInfo[index][i]->chance))
{ {
bc = VLC->objh->banksInfo[index][i]; bc = VLC->objh->banksInfo[index][i];
@ -5851,7 +5851,7 @@ void CBank::initialize() const
for (ui8 i = 0; i <= 3; i++) for (ui8 i = 0; i <= 3; i++)
{ {
for (ui8 n = 0; n < bc->artifacts[i]; n++) //new function using proper randomization algorithm for (ui8 n = 0; n < bc->artifacts[i]; n++) //new function using proper randomization algorithm
{ {
cb->setObjProperty (id, 18 + i, ran()); //synchronic artifacts cb->setObjProperty (id, 18 + i, ran()); //synchronic artifacts
} }
} }
@ -5960,7 +5960,7 @@ void CBank::setPropertyDer (ui8 what, ui32 val)
} }
} }
void CBank::newTurn() const void CBank::newTurn() const
{ {
if (bc == NULL) if (bc == NULL)
{ {
@ -6043,7 +6043,7 @@ void CBank::onHeroVisit (const CGHeroInstance * h) const
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
} }
} }
void CBank::fightGuards (const CGHeroInstance * h, ui32 accept) const void CBank::fightGuards (const CGHeroInstance * h, ui32 accept) const
{ {
if (accept) if (accept)
{ {
@ -6105,7 +6105,7 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons
if (bc->resources.size()) if (bc->resources.size())
textID = 124; textID = 124;
else else
textID = 123; textID = 123;
break; break;
} }
@ -6113,7 +6113,7 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons
if (textID != 42) //empty derelict ship gives no cash if (textID != 42) //empty derelict ship gives no cash
{ {
for (int it = 0; it < bc->resources.size(); it++) for (int it = 0; it < bc->resources.size(); it++)
{ {
if (bc->resources[it] != 0) if (bc->resources[it] != 0)
{ {
iw.components.push_back (Component (Component::RESOURCE, it, bc->resources[it], 0)); iw.components.push_back (Component (Component::RESOURCE, it, bc->resources[it], 0));
@ -6121,7 +6121,7 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons
loot.addReplacement(iw.components.back().val); loot.addReplacement(iw.components.back().val);
loot.addReplacement(MetaString::RES_NAMES, iw.components.back().subtype); loot.addReplacement(MetaString::RES_NAMES, iw.components.back().subtype);
cb->giveResource (h->getOwner(), it, bc->resources[it]); cb->giveResource (h->getOwner(), it, bc->resources[it]);
} }
} }
} }
//grant artifacts //grant artifacts
@ -6212,7 +6212,7 @@ void CGPyramid::onHeroVisit (const CGHeroInstance * h) const
bd.player = h->getOwner(); bd.player = h->getOwner();
bd.soundID = soundBase::MYSTERY; bd.soundID = soundBase::MYSTERY;
bd.text << VLC->generaltexth->advobtxt[105]; bd.text << VLC->generaltexth->advobtxt[105];
cb->showBlockingDialog (&bd, boost::bind (&CBank::fightGuards, this, h, _1)); cb->showBlockingDialog (&bd, boost::bind (&CBank::fightGuards, this, h, _1));
} }
else else
{ {
@ -6236,9 +6236,9 @@ void CGPyramid::endBattle (const CGHeroInstance *h, const BattleResult *result)
iw.player = h->getOwner(); iw.player = h->getOwner();
iw.text.addTxt (MetaString::ADVOB_TXT, 106); iw.text.addTxt (MetaString::ADVOB_TXT, 106);
iw.text.addTxt (MetaString::SPELL_NAME, spell); iw.text.addTxt (MetaString::SPELL_NAME, spell);
if (!h->getArt(17)) if (!h->getArt(17))
iw.text.addTxt (MetaString::ADVOB_TXT, 109); //no spellbook iw.text.addTxt (MetaString::ADVOB_TXT, 109); //no spellbook
else if (h->getSecSkillLevel(CGHeroInstance::WISDOM) < 3) else if (h->getSecSkillLevel(CGHeroInstance::WISDOM) < 3)
iw.text.addTxt (MetaString::ADVOB_TXT, 108); //no expert Wisdom iw.text.addTxt (MetaString::ADVOB_TXT, 108); //no expert Wisdom
else else
{ {
@ -6304,7 +6304,7 @@ void CGKeymasterTent::onHeroVisit( const CGHeroInstance * h ) const
void CGBorderGuard::initObj() void CGBorderGuard::initObj()
{ {
ui32 m13489val = subID; //store color as quest info //ui32 m13489val = subID; //store color as quest info
blockVisit = true; blockVisit = true;
} }
@ -6334,7 +6334,7 @@ bool CGBorderGuard::checkQuest (const CGHeroInstance * h) const
return wasMyColorVisited (h->tempOwner); return wasMyColorVisited (h->tempOwner);
} }
void CGBorderGuard::onHeroVisit( const CGHeroInstance * h ) const void CGBorderGuard::onHeroVisit( const CGHeroInstance * h ) const
{ {
if (wasMyColorVisited (h->getOwner()) ) if (wasMyColorVisited (h->getOwner()) )
{ {
@ -6342,8 +6342,8 @@ void CGBorderGuard::onHeroVisit( const CGHeroInstance * h ) const
bd.player = h->getOwner(); bd.player = h->getOwner();
bd.soundID = soundBase::QUEST; bd.soundID = soundBase::QUEST;
bd.text.addTxt (MetaString::ADVOB_TXT, 17); bd.text.addTxt (MetaString::ADVOB_TXT, 17);
cb->showBlockingDialog (&bd, boost::bind (&CGBorderGuard::openGate, this, h, _1)); cb->showBlockingDialog (&bd, boost::bind (&CGBorderGuard::openGate, this, h, _1));
} }
else else
{ {
InfoWindow iw; InfoWindow iw;
@ -6366,7 +6366,7 @@ void CGBorderGuard::openGate(const CGHeroInstance *h, ui32 accept) const
cb->removeObject(id); cb->removeObject(id);
} }
void CGBorderGate::onHeroVisit( const CGHeroInstance * h ) const //TODO: passability void CGBorderGate::onHeroVisit( const CGHeroInstance * h ) const //TODO: passability
{ {
if (!wasMyColorVisited (h->getOwner()) ) if (!wasMyColorVisited (h->getOwner()) )
{ {
@ -6423,9 +6423,9 @@ void CGMagi::onHeroVisit(const CGHeroInstance * h) const
cv.pos = eye->pos; cv.pos = eye->pos;
cv.focusTime = 2000; cv.focusTime = 2000;
cb->sendAndApply(&cv); cb->sendAndApply(&cv);
} }
cv.pos = h->getPosition(false); cv.pos = h->getPosition(false);
cb->sendAndApply(&cv); cb->sendAndApply(&cv);
} }
else if (ID == 27) else if (ID == 27)
{ {
@ -6541,7 +6541,7 @@ int IBoatGenerator::getBoatType() const
} }
IBoatGenerator::IBoatGenerator(const CGObjectInstance *O) IBoatGenerator::IBoatGenerator(const CGObjectInstance *O)
: o(O) : o(O)
{ {
} }
@ -6550,7 +6550,7 @@ void IBoatGenerator::getProblemText(MetaString &out, const CGHeroInstance *visit
{ {
switch(state()) switch(state())
{ {
case 1: case 1:
out.addTxt(MetaString::GENERAL_TXT, 51); out.addTxt(MetaString::GENERAL_TXT, 51);
break; break;
case 2: case 2:
@ -6575,7 +6575,7 @@ void IShipyard::getBoatCost( std::vector<si32> &cost ) const
cost[6] = 1000; cost[6] = 1000;
} }
IShipyard::IShipyard(const CGObjectInstance *O) IShipyard::IShipyard(const CGObjectInstance *O)
: IBoatGenerator(O) : IBoatGenerator(O)
{ {
} }
@ -6643,7 +6643,7 @@ void CGShipyard::onHeroVisit( const CGHeroInstance * h ) const
} }
} }
void CCartographer::onHeroVisit( const CGHeroInstance * h ) const void CCartographer::onHeroVisit( const CGHeroInstance * h ) const
{ {
if (!wasVisited (h->getOwner()) ) //if hero has not visited yet this cartographer if (!wasVisited (h->getOwner()) ) //if hero has not visited yet this cartographer
{ {
@ -6662,7 +6662,7 @@ void CCartographer::onHeroVisit( const CGHeroInstance * h ) const
case 2: case 2:
text = 27; text = 27;
break; break;
default: default:
tlog2 << "Unrecognized subtype of cartographer" << std::endl; tlog2 << "Unrecognized subtype of cartographer" << std::endl;
} }
assert(text); assert(text);
@ -6680,7 +6680,7 @@ void CCartographer::onHeroVisit( const CGHeroInstance * h ) const
iw.text << std::pair<ui8,ui32>(11,28); iw.text << std::pair<ui8,ui32>(11,28);
cb->showInfoDialog (&iw); cb->showInfoDialog (&iw);
} }
} }
else //if he already visited carographer else //if he already visited carographer
{ {
InfoWindow iw; InfoWindow iw;
@ -6720,7 +6720,7 @@ void CGObelisk::onHeroVisit( const CGHeroInstance * h ) const
TeamState *ts = cb->gameState()->getPlayerTeam(h->tempOwner); TeamState *ts = cb->gameState()->getPlayerTeam(h->tempOwner);
assert(ts); assert(ts);
int team = ts->id; int team = ts->id;
if(!wasVisited(team)) if(!wasVisited(team))
{ {
iw.text.addTxt(MetaString::ADVOB_TXT, 96); iw.text.addTxt(MetaString::ADVOB_TXT, 96);
@ -6892,7 +6892,7 @@ void CArmedInstance::updateMoraleBonusFromArmy()
factions.insert(faction); factions.insert(faction);
} }
} }
if(factions.size() == 1) if(factions.size() == 1)
{ {
b->val = +1; b->val = +1;
@ -6904,7 +6904,7 @@ void CArmedInstance::updateMoraleBonusFromArmy()
b->description = boost::str(boost::format(VLC->generaltexth->arraytxt[114]) % factions.size() % b->val); //Troops of %d alignments %d b->description = boost::str(boost::format(VLC->generaltexth->arraytxt[114]) % factions.size() % b->val); //Troops of %d alignments %d
} }
boost::algorithm::trim(b->description); boost::algorithm::trim(b->description);
//-1 modifier for any Necropolis unit in army //-1 modifier for any Necropolis unit in army
const ui8 UNDEAD_MODIFIER_ID = -2; const ui8 UNDEAD_MODIFIER_ID = -2;
Bonus *undeadModifier = getBonusList().getFirst(Selector::source(Bonus::ARMY, UNDEAD_MODIFIER_ID)); Bonus *undeadModifier = getBonusList().getFirst(Selector::source(Bonus::ARMY, UNDEAD_MODIFIER_ID));
@ -6915,7 +6915,7 @@ void CArmedInstance::updateMoraleBonusFromArmy()
} }
else if(undeadModifier) else if(undeadModifier)
removeBonus(undeadModifier); removeBonus(undeadModifier);
} }
void CArmedInstance::armyChanged() void CArmedInstance::armyChanged()
@ -6988,9 +6988,9 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode::EMar
double effectiveness = std::min((getMarketEfficiency() + 3.0) / 20.0, 0.6); double effectiveness = std::min((getMarketEfficiency() + 3.0) / 20.0, 0.6);
double r = VLC->objh->resVals[id1], //value of offered resource double r = VLC->objh->resVals[id1], //value of offered resource
g = VLC->arth->artifacts[id2]->price / effectiveness; //value of bought artifact in gold g = VLC->arth->artifacts[id2]->price / effectiveness; //value of bought artifact in gold
if(id1 != 6) //non-gold prices are doubled if(id1 != 6) //non-gold prices are doubled
r /= 2; r /= 2;
val1 = std::max(1, (int)((g / r) + 0.5)); //don't sell arts for less than 1 resource val1 = std::max(1, (int)((g / r) + 0.5)); //don't sell arts for less than 1 resource
val2 = 1; val2 = 1;
@ -7000,10 +7000,10 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode::EMar
{ {
double effectiveness = std::min((getMarketEfficiency() + 3.0) / 20.0, 0.6); double effectiveness = std::min((getMarketEfficiency() + 3.0) / 20.0, 0.6);
double r = VLC->arth->artifacts[id1]->price * effectiveness, double r = VLC->arth->artifacts[id1]->price * effectiveness,
g = VLC->objh->resVals[id2]; g = VLC->objh->resVals[id2];
// if(id2 != 6) //non-gold prices are doubled // if(id2 != 6) //non-gold prices are doubled
// r /= 2; // r /= 2;
val1 = 1; val1 = 1;
val2 = std::max(1, (int)((r / g) + 0.5)); //at least one resource is given in return val2 = std::max(1, (int)((r / g) + 0.5)); //at least one resource is given in return
@ -7217,7 +7217,7 @@ void CGUniversity::initObj()
tlog0<<"Warning: less then 4 available skills was found by University initializer!\n"; tlog0<<"Warning: less then 4 available skills was found by University initializer!\n";
return; return;
} }
for (int i=0; i<4; i++)//get 4 skills for (int i=0; i<4; i++)//get 4 skills
{ {
int skillPos = ran()%toChoose.size(); int skillPos = ran()%toChoose.size();
@ -7232,7 +7232,7 @@ std::vector<int> CGUniversity::availableItemsIds(EMarketMode::EMarketMode mode)
{ {
case EMarketMode::RESOURCE_SKILL: case EMarketMode::RESOURCE_SKILL:
return skills; return skills;
default: default:
return std::vector <int> (); return std::vector <int> ();
} }

View File

@ -53,6 +53,7 @@ std::vector<BattleHex> CObstacleInstance::getAffectedTiles() const
return getInfo().getBlocked(pos); return getInfo().getBlocked(pos);
default: default:
assert(0); assert(0);
return std::vector<BattleHex>();
} }
} }
@ -60,7 +61,7 @@ std::vector<BattleHex> CObstacleInstance::getAffectedTiles() const
// { // {
// if(obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE) // if(obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE)
// return false; // return false;
// //
// return true; // return true;
// } // }
@ -105,6 +106,7 @@ bool SpellCreatedObstacle::visibleForSide(ui8 side, bool hasNativeStack) const
return casterSide == side || visibleForAnotherSide || hasNativeStack; return casterSide == side || visibleForAnotherSide || hasNativeStack;
default: default:
assert(0); assert(0);
return false;
} }
} }
@ -121,6 +123,7 @@ std::vector<BattleHex> SpellCreatedObstacle::getAffectedTiles() const
//TODO Fire Wall //TODO Fire Wall
default: default:
assert(0); assert(0);
return std::vector<BattleHex>();
} }
} }
@ -135,4 +138,4 @@ std::vector<BattleHex> MoatObstacle::getAffectedTiles() const
//rrr... need initializer lists //rrr... need initializer lists
static const BattleHex moatHexes[] = {11, 28, 44, 61, 77, 111, 129, 146, 164, 181}; static const BattleHex moatHexes[] = {11, 28, 44, 61, 77, 111, 129, 146, 164, 181};
return std::vector<BattleHex>(moatHexes, moatHexes + ARRAY_COUNT(moatHexes)); return std::vector<BattleHex>(moatHexes, moatHexes + ARRAY_COUNT(moatHexes));
} }

View File

@ -12,7 +12,7 @@ struct DLL_LINKAGE CObstacleInstance
enum EObstacleType enum EObstacleType
{ {
//ABSOLUTE needs an underscore because it's a Win //ABSOLUTE needs an underscore because it's a Win
USUAL, ABSOLUTE_OBSTACLE, QUICKSAND, LAND_MINE, FORCE_FIELD, FIRE_WALL, MOAT USUAL, ABSOLUTE_OBSTACLE, QUICKSAND, LAND_MINE, FORCE_FIELD, FIRE_WALL, MOAT
}; };
@ -32,7 +32,7 @@ struct DLL_LINKAGE CObstacleInstance
//additional effects (like hurting stack or disappearing) are hardcoded for appropriate obstacleTypes //additional effects (like hurting stack or disappearing) are hardcoded for appropriate obstacleTypes
bool blocksTiles() const; bool blocksTiles() const;
bool stopsMovement() const; //if unit stepping onto obstacle, can't continue movement (in general, doesn't checks for the side) bool stopsMovement() const; //if unit stepping onto obstacle, can't continue movement (in general, doesn't checks for the side)
virtual std::vector<BattleHex> getAffectedTiles() const; virtual std::vector<BattleHex> getAffectedTiles() const;
virtual bool visibleForSide(ui8 side, bool hasNativeStack) const; //0 attacker virtual bool visibleForSide(ui8 side, bool hasNativeStack) const; //0 attacker
@ -56,12 +56,12 @@ struct DLL_LINKAGE SpellCreatedObstacle : CObstacleInstance
si8 spellLevel; si8 spellLevel;
si8 casterSide; //0 - obstacle created by attacker; 1 - by defender si8 casterSide; //0 - obstacle created by attacker; 1 - by defender
si8 visibleForAnotherSide; si8 visibleForAnotherSide;
SpellCreatedObstacle(); SpellCreatedObstacle();
virtual std::vector<BattleHex> getAffectedTiles() const OVERRIDE; //for special effects (not blocking) virtual std::vector<BattleHex> getAffectedTiles() const OVERRIDE; //for special effects (not blocking)
virtual bool visibleForSide(ui8 side, bool hasNativeStack) const OVERRIDE; //0 attacker virtual bool visibleForSide(ui8 side, bool hasNativeStack) const OVERRIDE; //0 attacker
virtual void battleTurnPassed() OVERRIDE; virtual void battleTurnPassed() OVERRIDE;
template <typename Handler> void serialize(Handler &h, const int version) template <typename Handler> void serialize(Handler &h, const int version)

View File

@ -1,8 +1,7 @@
#include "StdInc.h" #include "StdInc.h"
#include "JsonNode.h" #include "JsonNode.h"
#include "HeroBonus.h"
class Bonus;
const JsonNode JsonNode::nullNode; const JsonNode JsonNode::nullNode;
@ -243,7 +242,7 @@ void JsonWriter::writeContainer(Iterator begin, Iterator end)
{ {
if (begin == end) if (begin == end)
return; return;
prefix += '\t'; prefix += '\t';
end--; end--;
while (begin != end) while (begin != end)
@ -251,7 +250,7 @@ void JsonWriter::writeContainer(Iterator begin, Iterator end)
writeEntry(begin++); writeEntry(begin++);
out<<",\n"; out<<",\n";
} }
writeEntry(begin); writeEntry(begin);
out<<"\n"; out<<"\n";
prefix.resize(prefix.size()-1); prefix.resize(prefix.size()-1);
@ -280,7 +279,7 @@ void JsonWriter::writeString(const std::string &string)
for (; pos<string.size(); pos++) for (; pos<string.size(); pos++)
{ {
size_t escapedChar = escaped.find(string[pos]); size_t escapedChar = escaped.find(string[pos]);
if (escapedChar != std::string::npos) if (escapedChar != std::string::npos)
{ {
out.write(string.data()+start, pos - start); out.write(string.data()+start, pos - start);
@ -872,4 +871,23 @@ JsonValidator::JsonValidator(JsonNode &root, const JsonNode &schema, bool Minimi
if (schema.isNull()) if (schema.isNull())
addMessage("Schema not found!"); addMessage("Schema not found!");
tlog3<<errors; tlog3<<errors;
} }
Bonus * ParseBonus (const JsonVector &ability_vec) //TODO: merge with AddAbility, create universal parser for all bonus properties
{
Bonus * b = new Bonus();
std::string type = ability_vec[0].String();
auto it = bonusNameMap.find(type);
if (it == bonusNameMap.end())
{
tlog1 << "Error: invalid ability type " << type << " in creatures.txt" << std::endl;
return b;
}
b->type = it->second;
b->val = ability_vec[1].Float();
b->subtype = ability_vec[2].Float();
b->additionalInfo = ability_vec[3].Float();
b->duration = Bonus::PERMANENT;
b->turnsRemain = 0;
return b;
}

View File

@ -1,12 +1,10 @@
#pragma once #pragma once
#include "HeroBonus.h"
class JsonNode; class JsonNode;
typedef std::map <std::string, JsonNode> JsonMap; typedef std::map <std::string, JsonNode> JsonMap;
typedef std::vector <JsonNode> JsonVector; typedef std::vector <JsonNode> JsonVector;
class Bonus; struct Bonus;
class DLL_LINKAGE JsonNode class DLL_LINKAGE JsonNode
{ {
@ -199,23 +197,4 @@ public:
JsonValidator(JsonNode &root, const JsonNode &schema, bool minimize=false); JsonValidator(JsonNode &root, const JsonNode &schema, bool minimize=false);
}; };
//Bonus * ParseBonus (const JsonVector &ability_vec); DLL_LINKAGE Bonus * ParseBonus (const JsonVector &ability_vec);
static Bonus * ParseBonus (const JsonVector &ability_vec) //TODO: merge with AddAbility, create universal parser for all bonus properties
{
Bonus * b = new Bonus();
std::string type = ability_vec[0].String();
auto it = bonusNameMap.find(type);
if (it == bonusNameMap.end())
{
tlog1 << "Error: invalid ability type " << type << " in creatures.txt" << std::endl;
return b;
}
b->type = it->second;
b->val = ability_vec[1].Float();
b->subtype = ability_vec[2].Float();
b->additionalInfo = ability_vec[3].Float();
b->duration = Bonus::PERMANENT;
b->turnsRemain = 0;
return b;
}

View File

@ -16,4 +16,4 @@ ELSEIF(WIN32)
add_executable(vcmiserver WIN32 ${server_SRCS}) add_executable(vcmiserver WIN32 ${server_SRCS})
ENDIF() ENDIF()
target_link_libraries(vcmiserver vcmi ${Boost_LIBRARIES}) target_link_libraries(vcmiserver vcmi ${Boost_LIBRARIES} ${RT_LIB} ${DL_LIB})