1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-10-31 00:07:39 +02:00

- Foundation for starting a random map is done - Moved StdInc.h to header file in some /Map and /RMG compilation units(better syntax highlighting, should have no negative impact)

This commit is contained in:
beegee1
2012-11-20 17:53:45 +00:00
parent 8eba824ada
commit 53169abea7
32 changed files with 520 additions and 302 deletions

View File

@@ -314,7 +314,7 @@ CBattleResultWindow::CBattleResultWindow(const BattleResult &br, const SDL_Rect
bg->colorize(owner->curInt->playerID);
exit = new CAdventureMapButton ("", "", boost::bind(&CBattleResultWindow::bExitf,this), 384, 505, "iok6432.def", SDLK_RETURN);
exit->borderColor = Colors::MetallicGold;
exit->borderColor = Colors::METALLIC_GOLD;
exit->borderEnabled = true;
if(br.winner==0) //attacker won

View File

@@ -1392,12 +1392,12 @@ CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Buildin
{ //normal window
buy = new CAdventureMapButton(boost::str(boost::format(CGI->generaltexth->allTexts[595]) % building->Name()),
"", boost::bind(&CBuildWindow::buyFunc,this), 45, 446,"IBUY30", SDLK_RETURN);
buy->borderColor = Colors::MetallicGold;
buy->borderColor = Colors::METALLIC_GOLD;
buy->borderEnabled = true;
cancel = new CAdventureMapButton(boost::str(boost::format(CGI->generaltexth->allTexts[596]) % building->Name()),
"", boost::bind(&CBuildWindow::close,this), 290, 445, "ICANCEL", SDLK_ESCAPE);
cancel->borderColor = Colors::MetallicGold;
cancel->borderColor = Colors::METALLIC_GOLD;
cancel->borderEnabled = true;
buy->block(state!=7 || LOCPLINT->playerID != town->tempOwner);
}

View File

@@ -556,7 +556,7 @@ void CCreatureWindow::showAll(SDL_Surface * to)
if (type == COMMANDER_LEVEL_UP && upgradeOptions[selectedOption] >= 100) //add frame to selected skill
{
int index = selectedOption - selectableSkills.size(); //this is screwed
CSDL_Ext::drawBorder(to, Rect::around(selectableBonuses[index]->pos), int3(Colors::MetallicGold.r, Colors::MetallicGold.g, Colors::MetallicGold.b));
CSDL_Ext::drawBorder(to, Rect::around(selectableBonuses[index]->pos), int3(Colors::METALLIC_GOLD.r, Colors::METALLIC_GOLD.g, Colors::METALLIC_GOLD.b));
}
}

View File

@@ -68,8 +68,15 @@ ISelectionScreenInfo *SEL;
static int playerColor; //if more than one player - applies to the first
static std::string selectedName; //set when game is started/loaded
/**
* Stores the current name of the savegame.
*
* TODO better solution for auto-selection when saving already saved games.
* -> CSelectionScreen should be divided into CLoadGameScreen, CSaveGameScreen,...
* The name of the savegame can then be stored non-statically in CGameState and
* passed separately to CSaveGameScreen.
*/
static std::string saveGameName;
struct EvilHlpStruct
{
@@ -137,16 +144,17 @@ void setPlayer(PlayerSettings &pset, TPlayerColor player, const std::map<TPlayer
void updateStartInfo(std::string filename, StartInfo & sInfo, const CMapHeader * mapHeader, const std::map<TPlayerColor, std::string> &playerNames)
{
sInfo.playerInfos.clear();
if(!filename.size())
if(!mapHeader)
{
return;
}
/*sInfo.playerInfos.resize(to->playerAmnt);*/
sInfo.mapname = filename;
playerColor = -1;
auto namesIt = playerNames.cbegin();
for (int i = 0; i < GameConstants::PLAYER_LIMIT; i++)
for (int i = 0; i < mapHeader->players.size(); i++)
{
const PlayerInfo &pinfo = mapHeader->players[i];
@@ -597,6 +605,7 @@ CSelectionScreen::CSelectionScreen(CMenuScreen::EState Type, CMenuScreen::EMulti
opt->recActions = DISPOSE;
randMapTab = new RandomMapTab();
randMapTab->getMapInfoChanged() += bind(&CSelectionScreen::changeSelection, this, _1);
randMapTab->recActions = DISPOSE;
}
sel = new SelectionTab(screenType, bind(&CSelectionScreen::changeSelection, this, _1), multiPlayer); //scenario selection tab
@@ -608,7 +617,12 @@ CSelectionScreen::CSelectionScreen(CMenuScreen::EState Type, CMenuScreen::EMulti
{
card->difficulty->onChange = bind(&CSelectionScreen::difficultyChange, this, _1);
card->difficulty->select(1, 0);
CAdventureMapButton *select = new CAdventureMapButton(CGI->generaltexth->zelp[45], bind(&CSelectionScreen::toggleTab, this, sel), 411, 80, "GSPBUTT.DEF", SDLK_s);
CAdventureMapButton * select = new CAdventureMapButton(CGI->generaltexth->zelp[45], 0, 411, 80, "GSPBUTT.DEF", SDLK_s);
select->callback = [&]()
{
toggleTab(sel);
changeSelection(sel->getSelectedMapInfo());
};
select->addTextOverlay(CGI->generaltexth->allTexts[500], FONT_SMALL);
CAdventureMapButton *opts = new CAdventureMapButton(CGI->generaltexth->zelp[46], bind(&CSelectionScreen::toggleTab, this, opt), 411, 510, "GSPBUTT.DEF", SDLK_a);
@@ -618,7 +632,11 @@ CSelectionScreen::CSelectionScreen(CMenuScreen::EState Type, CMenuScreen::EMulti
randomBtn->addTextOverlay(CGI->generaltexth->allTexts[740], FONT_SMALL);
if(settings["general"]["enableRMG"].Bool())
{
randomBtn->callback = bind(&CSelectionScreen::toggleTab, this, randMapTab);
randomBtn->callback = [&]()
{
toggleTab(randMapTab);
changeSelection(&randMapTab->getMapInfo());
};
}
start = new CAdventureMapButton(CGI->generaltexth->zelp[103], bind(&CSelectionScreen::startGame, this), 411, 535, "SCNRBEG.DEF", SDLK_b);
@@ -766,7 +784,7 @@ void CSelectionScreen::toggleTab(CIntObject *tab)
GH.totalRedraw();
}
void CSelectionScreen::changeSelection( const CMapInfo *to )
void CSelectionScreen::changeSelection(const CMapInfo * to)
{
if(multiPlayer == CMenuScreen::MULTI_NETWORK_GUEST)
{
@@ -781,6 +799,19 @@ void CSelectionScreen::changeSelection( const CMapInfo *to )
if(screenType != CMenuScreen::campaignList)
{
updateStartInfo(to ? to->fileURI : "", sInfo, to ? to->mapHeader.get() : NULL);
if(screenType == CMenuScreen::newGame)
{
sInfo.createRandomMap = to->isRandomMap;
if(to->isRandomMap)
{
sInfo.mapGenOptions = std::shared_ptr<CMapGenOptions>(new CMapGenOptions(randMapTab->getMapGenOptions()));
}
else
{
sInfo.mapGenOptions = nullptr;
}
}
}
card->changeSelection(to);
if(screenType != CMenuScreen::campaignList)
@@ -837,11 +868,19 @@ void CSelectionScreen::startGame()
if(!current)
return;
selectedName = sInfo.mapname;
StartInfo *si = new StartInfo(sInfo);
saveGameName.clear();
if(screenType == CMenuScreen::loadGame)
{
saveGameName = sInfo.mapname;
}
if(sInfo.createRandomMap)
{
// Random map generation fails for now, so don't start game...
return;
}
StartInfo * si = new StartInfo(sInfo);
CGP->removeFromGui();
//SEL->current = NULL;
//curOpts = NULL;
::startGame(si);
}
else
@@ -849,13 +888,13 @@ void CSelectionScreen::startGame()
if(!(sel && sel->txt && sel->txt->text.size()))
return;
selectedName = "Saves/" + sel->txt->text;
saveGameName = "Saves/" + sel->txt->text;
CFunctionList<void()> overWrite;
overWrite += boost::bind(&CCallback::save, LOCPLINT->cb, selectedName);
overWrite += boost::bind(&CCallback::save, LOCPLINT->cb, saveGameName);
overWrite += bind(&CGuiHandler::popIntTotally, &GH, this);
if(CResourceHandler::get()->existsResource(ResourceID(selectedName, EResType::LIB_SAVEGAME)))
if(CResourceHandler::get()->existsResource(ResourceID(saveGameName, EResType::LIB_SAVEGAME)))
{
std::string hlp = CGI->generaltexth->allTexts[493]; //%s exists. Overwrite?
boost::algorithm::replace_first(hlp, "%s", sel->txt->text);
@@ -1228,12 +1267,13 @@ SelectionTab::SelectionTab(CMenuScreen::EState Type, const boost::function<void(
select(0);
break;
case CMenuScreen::saveGame:;
if(selectedName.size())
if(saveGameName.empty())
{
if(selectedName[2] == 'M') //name starts with ./Maps instead of ./Games => there was nothing to select
txt->setTxt("NEWGAME");
else
selectFName(selectedName);
txt->setTxt("NEWGAME");
}
else
{
selectFName(saveGameName);
}
}
}
@@ -1541,6 +1581,11 @@ void SelectionTab::selectFName( std::string fname )
selectAbs(0);
}
const CMapInfo * SelectionTab::getSelectedMapInfo() const
{
return curItems.empty() ? nullptr : curItems[selectionPos];
}
RandomMapTab::RandomMapTab()
{
OBJ_CONSTRUCTION;
@@ -1556,16 +1601,17 @@ RandomMapTab::RandomMapTab()
mapSizeBtnGroup->onChange = [&](int btnId)
{
const std::vector<int> mapSizeVal = boost::assign::list_of(36)(72)(108)(144); // Map sizes in this order: S, M, L, XL
options.setWidth(mapSizeVal[btnId]);
options.setHeight(mapSizeVal[btnId]);
mapGenOptions.setWidth(mapSizeVal[btnId]);
mapGenOptions.setHeight(mapSizeVal[btnId]);
updateMapInfo();
};
// Two levels
twoLevelsBtn = new CHighlightableButton(0, 0, std::map<int,std::string>(),
CGI->generaltexth->zelp[202].second, false, "RANUNDR", nullptr, 346, 81);
twoLevelsBtn->callback = [&]() { options.setHasTwoLevels(true); };
twoLevelsBtn->callback2 = [&]() { options.setHasTwoLevels(false); };
twoLevelsBtn->select(true);
twoLevelsBtn->callback = [&]() { mapGenOptions.setHasTwoLevels(true); updateMapInfo(); };
twoLevelsBtn->callback2 = [&]() { mapGenOptions.setHasTwoLevels(false); updateMapInfo(); };
// Create number defs list
std::vector<std::string> numberDefs;
@@ -1583,10 +1629,11 @@ RandomMapTab::RandomMapTab()
addButtonsWithRandToGroup(playersCntGroup, numberDefs, 1, 8, NUMBERS_WIDTH, 204, 212);
playersCntGroup->onChange = [&](int btnId)
{
options.setPlayersCnt(btnId);
mapGenOptions.setPlayersCnt(btnId);
deactivateButtonsFrom(teamsCntGroup, btnId);
deactivateButtonsFrom(compOnlyPlayersCntGroup, 8 - btnId + 1);
validatePlayersCnt(btnId);
updateMapInfo();
};
// Amount of teams
@@ -1596,7 +1643,8 @@ RandomMapTab::RandomMapTab()
addButtonsWithRandToGroup(teamsCntGroup, numberDefs, 0, 7, NUMBERS_WIDTH, 214, 222);
teamsCntGroup->onChange = [&](int btnId)
{
options.setTeamsCnt(btnId);
mapGenOptions.setTeamsCnt(btnId);
updateMapInfo();
};
// Computer only players
@@ -1604,11 +1652,13 @@ RandomMapTab::RandomMapTab()
compOnlyPlayersCntGroup->pos.y = 285;
compOnlyPlayersCntGroup->pos.x = BTNS_GROUP_LEFT_MARGIN;
addButtonsWithRandToGroup(compOnlyPlayersCntGroup, numberDefs, 0, 7, NUMBERS_WIDTH, 224, 232);
compOnlyPlayersCntGroup->select(0, true);
compOnlyPlayersCntGroup->onChange = [&](int btnId)
{
options.setCompOnlyPlayersCnt(btnId);
mapGenOptions.setCompOnlyPlayersCnt(btnId);
deactivateButtonsFrom(compOnlyTeamsCntGroup, btnId);
validateCompOnlyPlayersCnt(btnId);
updateMapInfo();
};
// Computer only teams
@@ -1616,9 +1666,11 @@ RandomMapTab::RandomMapTab()
compOnlyTeamsCntGroup->pos.y = 351;
compOnlyTeamsCntGroup->pos.x = BTNS_GROUP_LEFT_MARGIN;
addButtonsWithRandToGroup(compOnlyTeamsCntGroup, numberDefs, 0, 6, NUMBERS_WIDTH, 234, 241);
deactivateButtonsFrom(compOnlyTeamsCntGroup, 0);
compOnlyTeamsCntGroup->onChange = [&](int btnId)
{
options.setCompOnlyTeamsCnt(btnId);
mapGenOptions.setCompOnlyTeamsCnt(btnId);
updateMapInfo();
};
const int WIDE_BTN_WIDTH = 85;
@@ -1630,7 +1682,7 @@ RandomMapTab::RandomMapTab()
addButtonsWithRandToGroup(waterContentGroup, waterContentBtns, 0, 2, WIDE_BTN_WIDTH, 243, 246);
waterContentGroup->onChange = [&](int btnId)
{
options.setWaterContent(static_cast<EWaterContent::EWaterContent>(btnId));
mapGenOptions.setWaterContent(static_cast<EWaterContent::EWaterContent>(btnId));
};
// Monster strength
@@ -1641,37 +1693,39 @@ RandomMapTab::RandomMapTab()
addButtonsWithRandToGroup(monsterStrengthGroup, monsterStrengthBtns, 0, 2, WIDE_BTN_WIDTH, 248, 251);
monsterStrengthGroup->onChange = [&](int btnId)
{
options.setMonsterStrength(static_cast<EMonsterStrength::EMonsterStrength>(btnId));
mapGenOptions.setMonsterStrength(static_cast<EMonsterStrength::EMonsterStrength>(btnId));
};
// Show random maps btn
showRandMaps = new CAdventureMapButton("", CGI->generaltexth->zelp[252].second, 0, 54, 535, "RANSHOW");
// Initialize map info object
mapInfo.isRandomMap = true;
shared_ptr<CMapHeader> mapHeader(new CMapHeader());
mapHeader->version = EMapFormat::SOD;
mapHeader->name = CGI->generaltexth->allTexts[740];
mapHeader->description = CGI->generaltexth->allTexts[741];
mapHeader->difficulty = 1; // Normal
mapInfo.mapHeader = mapHeader;
updateMapInfo();
}
void RandomMapTab::addButtonsWithRandToGroup(CHighlightableButtonsGroup * group, const std::vector<std::string> & defs, int nStart, int nEnd, int btnWidth, int helpStartIndex, int helpRandIndex) const
{
addButtonsToGroup(group, defs, nStart, nEnd, btnWidth, helpStartIndex);
// Add rand button and select rand if help text index is given
const std::string randomDef = "RANRAND";
if (helpRandIndex != -1)
{
// Buttons are relative to button group, TODO better solution?
SObjectConstruction obj__i(group);
group->addButton(new CHighlightableButton("", CGI->generaltexth->zelp[helpRandIndex].second, 0, 256, 0, randomDef, -1));
group->select(-1, true);
}
// Buttons are relative to button group, TODO better solution?
SObjectConstruction obj__i(group);
const std::string RANDOM_DEF = "RANRAND";
group->addButton(new CHighlightableButton("", CGI->generaltexth->zelp[helpRandIndex].second, 0, 256, 0, RANDOM_DEF, CMapGenOptions::RANDOM_SIZE));
group->select(CMapGenOptions::RANDOM_SIZE, true);
}
void RandomMapTab::addButtonsToGroup(CHighlightableButtonsGroup * group, const std::vector<std::string> & defs, int nStart, int nEnd, int btnWidth, int helpStartIndex) const
{
// Buttons are relative to button group, TODO better solution?
SObjectConstruction obj__i(group);
const int cnt = nEnd - nStart + 1;
// Buttons
int cnt = nEnd - nStart + 1;
for(int i = 0; i < cnt; ++i)
{
group->addButton(new CHighlightableButton("", CGI->generaltexth->zelp[helpStartIndex + i].second, 0, i * btnWidth, 0, defs[i + nStart], i + nStart));
@@ -1682,7 +1736,7 @@ void RandomMapTab::deactivateButtonsFrom(CHighlightableButtonsGroup * group, int
{
BOOST_FOREACH(CHighlightableButton * btn, group->buttons)
{
if(startId == -1 || btn->ID < startId)
if(startId == CMapGenOptions::RANDOM_SIZE || btn->ID < startId)
{
if(btn->isBlocked())
{
@@ -1701,36 +1755,36 @@ void RandomMapTab::deactivateButtonsFrom(CHighlightableButtonsGroup * group, int
void RandomMapTab::validatePlayersCnt(int playersCnt)
{
if(playersCnt == -1)
if(playersCnt == CMapGenOptions::RANDOM_SIZE)
{
return;
}
if(options.getTeamsCnt() >= playersCnt)
if(mapGenOptions.getTeamsCnt() >= playersCnt)
{
options.setTeamsCnt(playersCnt - 1);
teamsCntGroup->select(options.getTeamsCnt(), true);
mapGenOptions.setTeamsCnt(playersCnt - 1);
teamsCntGroup->select(mapGenOptions.getTeamsCnt(), true);
}
if(options.getCompOnlyPlayersCnt() > 8 - playersCnt)
if(mapGenOptions.getCompOnlyPlayersCnt() > 8 - playersCnt)
{
options.setCompOnlyPlayersCnt(8 - playersCnt);
compOnlyPlayersCntGroup->select(options.getCompOnlyPlayersCnt(), true);
mapGenOptions.setCompOnlyPlayersCnt(8 - playersCnt);
compOnlyPlayersCntGroup->select(mapGenOptions.getCompOnlyPlayersCnt(), true);
}
validateCompOnlyPlayersCnt(options.getCompOnlyPlayersCnt());
validateCompOnlyPlayersCnt(mapGenOptions.getCompOnlyPlayersCnt());
}
void RandomMapTab::validateCompOnlyPlayersCnt(int compOnlyPlayersCnt)
{
if(compOnlyPlayersCnt == -1)
if(compOnlyPlayersCnt == CMapGenOptions::RANDOM_SIZE)
{
return;
}
if(options.getCompOnlyTeamsCnt() >= compOnlyPlayersCnt)
if(mapGenOptions.getCompOnlyTeamsCnt() >= compOnlyPlayersCnt)
{
options.setCompOnlyTeamsCnt(compOnlyPlayersCnt - 1);
compOnlyTeamsCntGroup->select(options.getCompOnlyTeamsCnt(), true);
mapGenOptions.setCompOnlyTeamsCnt(compOnlyPlayersCnt - 1);
compOnlyTeamsCntGroup->select(mapGenOptions.getCompOnlyTeamsCnt(), true);
}
}
@@ -1764,6 +1818,53 @@ void RandomMapTab::showAll(SDL_Surface * to)
printAtLoc(CGI->generaltexth->allTexts[758], 68, 465, FONT_SMALL, Colors::WHITE, to);
}
void RandomMapTab::updateMapInfo()
{
mapInfo.mapHeader->height = mapGenOptions.getHeight();
mapInfo.mapHeader->width = mapGenOptions.getWidth();
mapInfo.mapHeader->twoLevel = mapGenOptions.getHasTwoLevels();
// Generate player information
mapInfo.mapHeader->players.clear();
int playersToGen = (mapGenOptions.getPlayersCnt() == CMapGenOptions::RANDOM_SIZE
|| mapGenOptions.getCompOnlyPlayersCnt() == CMapGenOptions::RANDOM_SIZE)
? 8 : mapGenOptions.getPlayersCnt() + mapGenOptions.getCompOnlyPlayersCnt();
mapInfo.mapHeader->howManyTeams = playersToGen;
for(int i = 0; i < playersToGen; ++i)
{
PlayerInfo player;
player.canComputerPlay = true;
if(i >= mapGenOptions.getPlayersCnt() && mapGenOptions.getPlayersCnt() != CMapGenOptions::RANDOM_SIZE)
{
player.canHumanPlay = false;
}
else
{
player.canHumanPlay = true;
}
player.team = i;
mapInfo.mapHeader->players.push_back(player);
}
mapInfoChanged(&mapInfo);
}
CFunctionList<void(const CMapInfo *)> & RandomMapTab::getMapInfoChanged()
{
return mapInfoChanged;
}
const CMapInfo & RandomMapTab::getMapInfo() const
{
return mapInfo;
}
const CMapGenOptions & RandomMapTab::getMapGenOptions() const
{
return mapGenOptions;
}
CChatBox::CChatBox(const Rect &rect)
{
OBJ_CONSTRUCTION;
@@ -3435,7 +3536,8 @@ void CBonusSelection::updateBonusSelection()
CAnimation * anim = new CAnimation();
anim->setCustom(picName, 0);
bonusButton->setImage(anim);
bonusButton->borderColor = Colors::Maize; // yellow border
const SDL_Color brightYellow = { 242, 226, 110, 0 };
bonusButton->borderColor = brightYellow;
bonuses->addButton(bonusButton);
}
}
@@ -3784,7 +3886,7 @@ void StartWithCurrentSettings::apply(CSelectionScreen *selScreen)
selScreen->serv = NULL; //hide it so it won't be deleted
vstd::clear_pointer(selScreen->serverHandlingThread); //detach us
selectedName = selScreen->sInfo.mapname;
saveGameName.clear();
CGP->removeFromGui();

View File

@@ -175,6 +175,7 @@ public:
void printMaps(SDL_Surface *to);
int getLine();
void selectFName(std::string fname);
const CMapInfo * getSelectedMapInfo() const;
void showAll(SDL_Surface * to);
void clickLeft(tribool down, bool previousState);
@@ -270,6 +271,34 @@ public:
*/
void showAll(SDL_Surface * to);
/**
* Updates the map info object and fires the associated callback method.
*/
void updateMapInfo();
/**
* Gets the map info changed callback method list object. This event
* occurs when the updateMapInfo method has been called or the options
* of this tab have been changed.
*
* @return the map info changed callback method list object
*/
CFunctionList<void (const CMapInfo *)> & getMapInfoChanged();
/**
* Gets the created map info object.
*
* @return the created map info object
*/
const CMapInfo & getMapInfo() const;
/**
* Gets the map generation options.
*
* @return the map generation options
*/
const CMapGenOptions & getMapGenOptions() const;
private:
/**
* Adds buttons specified by the defs list to the given buttons group.
@@ -347,10 +376,17 @@ private:
/** the monster strength group */
CHighlightableButtonsGroup * monsterStrengthGroup;
/** show previously created random maps button */
CAdventureMapButton * showRandMaps;
/** the map options selected by the user */
CMapGenOptions options;
CMapGenOptions mapGenOptions;
/** map info object describing a randomly created map */
CMapInfo mapInfo;
/** callback method which gets called when the random options have been changed */
CFunctionList<void(const CMapInfo *)> mapInfoChanged;
};
/// Interface for selecting a map.

View File

@@ -160,7 +160,7 @@ void CQuestLog::showAll(SDL_Surface * to)
}
if (labels.size() && labels[questIndex]->active)
{
CSDL_Ext::drawBorder(to, Rect::around(labels[questIndex]->pos), int3(Colors::MetallicGold.r, Colors::MetallicGold.g, Colors::MetallicGold.b));
CSDL_Ext::drawBorder(to, Rect::around(labels[questIndex]->pos), int3(Colors::METALLIC_GOLD.r, Colors::METALLIC_GOLD.g, Colors::METALLIC_GOLD.b));
}
description->show(to);
minimap->update();

View File

@@ -250,7 +250,7 @@ void CClient::loadGame( const std::string & fname )
const_cast<CGameInfo*>(CGI)->state = gs;
const_cast<CGameInfo*>(CGI)->mh->map = gs->map;
pathInfo = new CPathsInfo(int3(gs->map->width, gs->map->height, gs->map->twoLevel+1));
pathInfo = new CPathsInfo(int3(gs->map->width, gs->map->height, gs->map->twoLevel ? 2 : 1));
CGI->mh->init();
tlog0 <<"Initing maphandler: "<<tmh.getDiff()<<std::endl;
@@ -351,7 +351,7 @@ void CClient::newGame( CConnection *con, StartInfo *si )
CGI->mh->map = gs->map;
tlog0 <<"Creating mapHandler: "<<tmh.getDiff()<<std::endl;
CGI->mh->init();
pathInfo = new CPathsInfo(int3(gs->map->width, gs->map->height, gs->map->twoLevel+1));
pathInfo = new CPathsInfo(int3(gs->map->width, gs->map->height, gs->map->twoLevel ? 2 : 1));
tlog0 <<"Initializing mapHandler (together): "<<tmh.getDiff()<<std::endl;
}

View File

@@ -602,7 +602,7 @@ CInfoWindow::CInfoWindow(std::string Text, int player, const TCompsInfo &comps,
for(int i=0;i<Buttons.size();i++)
{
CAdventureMapButton *button = new CAdventureMapButton("","",boost::bind(&CInfoWindow::close,this),0,0,Buttons[i].first);
button->borderColor = Colors::MetallicGold;
button->borderColor = Colors::METALLIC_GOLD;
button->borderEnabled = true;
button->callback.add(Buttons[i].second); //each button will close the window apart from call-defined actions
buttons.push_back(button);
@@ -5026,7 +5026,7 @@ CPuzzleWindow::CPuzzleWindow(const int3 &GrailPos, double discoveredRatio):
quitb = new CAdventureMapButton(CGI->generaltexth->allTexts[599], "", boost::bind(&CPuzzleWindow::close, this), 670, 538, "IOK6432.DEF", SDLK_RETURN);
quitb->assignedKeys.insert(SDLK_ESCAPE);
quitb->borderColor = Colors::MetallicGold;
quitb->borderColor = Colors::METALLIC_GOLD;
quitb->borderEnabled = true;
new CPicture("PUZZLOGO", 607, 3);

View File

@@ -375,7 +375,7 @@ void CGuiHandler::run()
inGuiThread.reset(new bool(true));
try
{
if (settings["video"]["fullscreen"].Bool())
if(settings["video"]["fullscreen"].Bool())
CCS->curh->centerCursor();
mainFPSmng->init(); // resets internal clock, needed for FPS manager
@@ -386,7 +386,12 @@ void CGuiHandler::run()
mainFPSmng->framerateDelay(); // holds a constant FPS
}
} HANDLE_EXCEPTION
}
catch(const std::exception & ex)
{
tlog1 << "Error: " << ex.what() << std::endl;
exit(EXIT_FAILURE);
}
}
CGuiHandler::CGuiHandler()
@@ -521,4 +526,4 @@ void CFramerateManager::framerateDelay()
//recalculate timeElapsed for external calls via getElapsed()
timeElapsed = currentTicks - lastticks;
lastticks = SDL_GetTicks();
}
}

View File

@@ -8,26 +8,9 @@
#include "../CDefHandler.h"
#include "../Graphics.h"
/*
* SDL_Extensions.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
SDL_Color Colors::createColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a /*= 0*/)
{
SDL_Color temp = {r, g, b, a};
return temp;
}
const SDL_Color Colors::YELLOW = createColor(229, 215, 123, 0);
const SDL_Color Colors::WHITE = createColor(255, 243, 222, 0);
const SDL_Color Colors::MetallicGold = createColor(173, 142, 66);
const SDL_Color Colors::Maize = createColor(242, 226, 110);
const SDL_Color Colors::YELLOW = { 229, 215, 123, 0 };
const SDL_Color Colors::WHITE = { 255, 243, 222, 0 };
const SDL_Color Colors::METALLIC_GOLD = { 173, 142, 66, 0 };
SDL_Surface * CSDL_Ext::newSurface(int w, int h, SDL_Surface * mod) //creates new surface, with flags/format same as in surface given
{

View File

@@ -16,7 +16,6 @@
*
*/
//A macro to force inlining some of our functions. Compiler (at least MSVC) is not so smart here-> without that displaying is MUCH slower
#ifdef _MSC_VER
#define STRONG_INLINE __forceinline
@@ -50,20 +49,8 @@ public:
/** the standard h3 white color */
static const SDL_Color WHITE;
static const SDL_Color MetallicGold;
static const SDL_Color Maize;
private:
/**
* Creates a SDL_Color object.
*
* @param r the red value ranging from 0 to 255
* @param g the green value ranging from 0 to 255
* @param b the blue value ranging from 0 to 255
* @param a the alpha value ranging from 0(opaque) to 255(transparent)
* @return the created SDL_Color object
*/
static SDL_Color createColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a = 0);
/** the metallic gold color used mostly as a border around buttons */
static const SDL_Color METALLIC_GOLD;
};
//MSVC gives an error when calling abs with ui64 -> we add template that will match calls with unsigned arg and return it

View File

@@ -349,7 +349,7 @@ void CMapHandler::init()
//sizes of terrain
sizes.x = map->width;
sizes.y = map->height;
sizes.z = map->twoLevel+1;
sizes.z = map->twoLevel ? 2 : 1;
// Total number of visible tiles. Subtract the center tile, then
// compute the number of tiles on each side, and reassemble.

View File

@@ -49,7 +49,7 @@ rett * createAny(std::string dllname, std::string methodName)
if (!dll)
{
tlog1 << "Cannot open dynamic library ("<<dllname<<"). Throwing..."<<std::endl;
throw new std::string("Cannot open dynamic library");
throw std::runtime_error("Cannot open dynamic library");
}
getName(temp);

View File

@@ -25,6 +25,7 @@
#include "JsonNode.h"
#include "Filesystem/CResourceLoader.h"
#include "GameConstants.h"
#include "RMG/CMapGenOptions.h"
DLL_LINKAGE boost::rand48 ran;
class CGObjectInstance;
@@ -863,8 +864,18 @@ void CGameState::init(StartInfo * si)
switch(scenarioOps->mode)
{
case StartInfo::NEW_GAME:
tlog0 << "Open map file: " << scenarioOps->mapname << std::endl;
map = CMapService::loadMap(scenarioOps->mapname).release();
{
if(scenarioOps->createRandomMap)
{
tlog0 << "Create random map." << std::endl;
//TODO random map
}
else
{
tlog0 << "Open map file: " << scenarioOps->mapname << std::endl;
map = CMapService::loadMap(scenarioOps->mapname).release();
}
}
break;
case StartInfo::CAMPAIGN:
{
@@ -920,7 +931,7 @@ void CGameState::init(StartInfo * si)
{
for (int j = 0; j < map->height ; j++)
{
for (int k = 0; k <= map->twoLevel ; k++)
for (int k = 0; k < (map->twoLevel ? 2 : 1); k++)
{
const TerrainTile &t = map->terrain[i][j][k];
if(!t.blocked
@@ -1266,11 +1277,11 @@ void CGameState::init(StartInfo * si)
for(int g=-0; g<map->width; ++g)
for(int h=0; h<map->height; ++h)
k->second.fogOfWarMap[g][h].resize(map->twoLevel+1, 0);
k->second.fogOfWarMap[g][h].resize(map->twoLevel ? 2 : 1, 0);
for(int g=0; g<map->width; ++g)
for(int h=0; h<map->height; ++h)
for(int v=0; v<map->twoLevel+1; ++v)
for(int v = 0; v < (map->twoLevel ? 2 : 1); ++v)
k->second.fogOfWarMap[g][h][v] = 0;
BOOST_FOREACH(CGObjectInstance *obj, map->objects)

View File

@@ -323,6 +323,20 @@ void CHeroHandler::loadTerrains()
terrCosts.push_back(config[name].Float());
}
std::vector<ui8> CHeroHandler::getDefaultAllowedHeroes() const
{
// Look Data/HOTRAITS.txt for reference
std::vector<ui8> allowedHeroes;
allowedHeroes.resize(156, 1);
for(int i = 145; i < 156; ++i)
{
allowedHeroes[i] = 0;
}
allowedHeroes[4] = 0;
allowedHeroes[25] = 0;
return allowedHeroes;
}
CHero::CHero()
{
startingSpell = -1;

View File

@@ -141,6 +141,17 @@ public:
CHeroHandler(); //c-tor
~CHeroHandler(); //d-tor
/**
* Gets a list of default allowed heroes.
*
* TODO Proposal for hero modding: Replace hero id with a unique machine readable hero name and
* create a JSON config file or merge it with a existing config file which describes which heroes can be used for
* random map generation / map editor(default map settings). (Gelu, ... should be excluded)
*
* @return a list of allowed heroes, the index is the hero id and the value either 0 for not allowed and 1 for allowed
*/
std::vector<ui8> getDefaultAllowedHeroes() const;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & heroClasses & heroes & expPerLevel & ballistics & terrCosts;

View File

@@ -522,3 +522,13 @@ void CTownHandler::load()
}
load(buildingsConf);
}
std::set<ui32> CTownHandler::getDefaultAllowedFactions() const
{
std::set<ui32> allowedFactions;
for(int i = 0; i <= 8; ++i)
{
allowedFactions.insert(i);
}
return allowedFactions;
}

View File

@@ -216,6 +216,17 @@ public:
/// and loads resulting structure to game using loadTowns method
void load();
/**
* Gets a list of default allowed factions. OH3 factions are in the range of 0 to 8.
*
* TODO Proposal for town modding: Replace faction id with a unique machine readable town name
* and create a JSON config file or merge it with other configs which describes which
* towns can be used for random map generation / map editor(default map settings).
*
* @return a list of allowed factions, the index which is unique is the faction id
*/
std::set<ui32> getDefaultAllowedFactions() const;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & towns & factions;

View File

@@ -21,6 +21,7 @@
#include "CTownHandler.h"
#include "Map/CCampaignHandler.h"
#include "NetPacks.h"
#include "CDefObjInfoHandler.h"
#include <boost/asio.hpp>
@@ -199,11 +200,11 @@ CConnection::~CConnection(void)
template<class T>
CConnection & CConnection::operator&(const T &t) {
throw new std::exception();
throw std::exception();
//XXX this is temporaly ? solution to fix gcc (4.3.3, other?) compilation
// problem for more details contact t0@czlug.icis.pcz.pl or impono@gmail.com
// do not remove this exception it shoudnt be called
return *this;
return *this;
}
void CConnection::close()

View File

@@ -1,5 +1,15 @@
#pragma once
/*
* Connection.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
#include <typeinfo> //XXX this is in namespace std if you want w/o use typeinfo.h?
@@ -12,7 +22,6 @@
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/variant.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/equal_to.hpp>
@@ -39,16 +48,6 @@ struct CPack;
extern DLL_LINKAGE LibClasses * VLC;
namespace mpl = boost::mpl;
/*
* Connection.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
namespace boost
{
namespace asio

View File

@@ -116,9 +116,7 @@ void CPrivilagedInfoCallback::getAllTiles (boost::unordered_set<int3, ShashInt3>
std::vector<int> floors;
if(level == -1)
{
for (int xd = 0; xd <= gs->map->width - 1; xd++)
for(int b=0; b<gs->map->twoLevel + 1; ++b) //if gs->map->twoLevel is false then false (0) + 1 is 1, if it's true (1) then we have 2
for(int b = 0; b < (gs->map->twoLevel ? 2 : 1); ++b)
{
floors.push_back(b);
}
@@ -144,7 +142,7 @@ void CPrivilagedInfoCallback::getAllTiles (boost::unordered_set<int3, ShashInt3>
void CPrivilagedInfoCallback::getFreeTiles (std::vector<int3> &tiles) const
{
std::vector<int> floors;
for (int b=0; b<gs->map->twoLevel + 1; ++b) //if gs->map->twoLevel is false then false (0) + 1 is 1, if it's true (1) then we have 2
for (int b = 0; b < (gs->map->twoLevel ? 2 : 1); ++b)
{
floors.push_back(b);
}
@@ -529,7 +527,7 @@ std::vector < const CGObjectInstance * > CGameInfoCallback::getFlaggableObjects(
int3 CGameInfoCallback::getMapSize() const
{
return int3(gs->map->width, gs->map->height, gs->map->twoLevel+1);
return int3(gs->map->width, gs->map->height, gs->map->twoLevel ? 2 : 1);
}
std::vector<const CGHeroInstance *> CGameInfoCallback::getAvailableHeroes(const CGObjectInstance * townOrTavern) const

View File

@@ -1,8 +1,9 @@
#include "StdInc.h"
#include "CMap.h"
#include "../CObjectHandler.h"
#include "../CArtHandler.h"
#include "../VCMI_Lib.h"
#include "../CTownHandler.h"
#include "../CHeroHandler.h"
#include "../CDefObjInfoHandler.h"
SHeroName::SHeroName() : heroId(-1)
@@ -10,18 +11,15 @@ SHeroName::SHeroName() : heroId(-1)
}
PlayerInfo::PlayerInfo(): p7(0), p8(0), p9(0), powerPlaceholders(-1),
canHumanPlay(false), canComputerPlay(false),
aiTactic(EAiTactic::RANDOM), isFactionRandom(false), mainHeroPortrait(0), hasMainTown(false),
generateHeroAtMainTown(false), team(255), generateHero(false)
PlayerInfo::PlayerInfo(): canHumanPlay(false), canComputerPlay(false),
aiTactic(EAiTactic::RANDOM), isFactionRandom(false), mainHeroPortrait(255), hasMainTown(true),
generateHeroAtMainTown(true), team(255), generateHero(false), p7(0), p8(0), p9(0), powerPlaceholders(-1)
{
allowedFactions = VLC->townh->getDefaultAllowedFactions();
}
si8 PlayerInfo::defaultCastle() const
{
assert(!allowedFactions.empty()); // impossible?
if(allowedFactions.size() == 1)
{
// only one faction is available - pick it
@@ -126,11 +124,10 @@ bool TerrainTile::isWater() const
return terType == ETerrainType::WATER;
}
CMapHeader::CMapHeader() : version(EMapFormat::INVALID), areAnyPlayers(false),
height(-1), width(-1), twoLevel(-1), difficulty(0), levelLimit(0),
howManyTeams(0)
CMapHeader::CMapHeader() : version(EMapFormat::SOD), height(72), width(72),
twoLevel(true), difficulty(1), levelLimit(0), howManyTeams(0), areAnyPlayers(false)
{
allowedHeroes = VLC->heroh->getDefaultAllowedHeroes();
}
CMapHeader::~CMapHeader()
@@ -225,9 +222,15 @@ CGHeroInstance * CMap::getHero(int heroID)
bool CMap::isInTheMap(const int3 &pos) const
{
if(pos.x<0 || pos.y<0 || pos.z<0 || pos.x >= width || pos.y >= height || pos.z > twoLevel)
if(pos.x < 0 || pos.y < 0 || pos.z < 0 || pos.x >= width || pos.y >= height
|| pos.z > (twoLevel ? 1 : 0))
{
return false;
else return true;
}
else
{
return true;
}
}
TerrainTile & CMap::getTile( const int3 & tile )
@@ -245,9 +248,9 @@ bool CMap::isWaterTile(const int3 &pos) const
return isInTheMap(pos) && getTile(pos).terType == ETerrainType::WATER;
}
const CGObjectInstance *CMap::getObjectiveObjectFrom(int3 pos, bool lookForHero)
const CGObjectInstance * CMap::getObjectiveObjectFrom(int3 pos, bool lookForHero)
{
const std::vector <CGObjectInstance *> & objs = getTile(pos).visitableObjects;
const std::vector<CGObjectInstance *> & objs = getTile(pos).visitableObjects;
assert(objs.size());
if(objs.size() > 1 && lookForHero && objs.front()->ID != Obj::HERO)
{
@@ -261,19 +264,23 @@ const CGObjectInstance *CMap::getObjectiveObjectFrom(int3 pos, bool lookForHero)
void CMap::checkForObjectives()
{
if(isInTheMap(victoryCondition.pos))
{
victoryCondition.obj = getObjectiveObjectFrom(victoryCondition.pos, victoryCondition.condition == EVictoryConditionType::BEATHERO);
}
if(isInTheMap(lossCondition.pos))
{
lossCondition.obj = getObjectiveObjectFrom(lossCondition.pos, lossCondition.typeOfLossCon == ELossConditionType::LOSSHERO);
}
}
void CMap::addNewArtifactInstance( CArtifactInstance *art )
void CMap::addNewArtifactInstance(CArtifactInstance * art)
{
art->id = artInstances.size();
artInstances.push_back(art);
}
void CMap::eraseArtifactInstance(CArtifactInstance *art)
void CMap::eraseArtifactInstance(CArtifactInstance * art)
{
assert(artInstances[art->id] == art);
artInstances[art->id].dellNull();

View File

@@ -11,12 +11,10 @@
#pragma once
#ifndef _MSC_VER
#include "../CObjectHandler.h"
#include "../CDefObjInfoHandler.h"
#endif
#include "StdInc.h"
#include "../ConstTransitivePtr.h"
#include "../CObjectHandler.h"
#include "../ResourceSet.h"
#include "../int3.h"
#include "../GameConstants.h"
@@ -96,7 +94,46 @@ struct DLL_LINKAGE PlayerInfo
*/
si8 defaultHero() const;
/** unknown, unused */
/** True if the player can be played by a human. */
bool canHumanPlay;
/** True if th player can be played by the computer */
bool canComputerPlay;
/** Defines the tactical setting of the AI. The default value is EAiTactic::RANDOM. */
EAiTactic::EAiTactic aiTactic;
/** A list of unique IDs of allowed factions. */
std::set<ui32> allowedFactions;
/** Unused. True if the faction should be chosen randomly. */
bool isFactionRandom;
/** Specifies the ID of the main hero with chosen portrait. The default value is 255. */
ui32 mainHeroPortrait;
/** The name of the main hero. */
std::string mainHeroName;
/** The list of renamed heroes. */
std::vector<SHeroName> heroesNames;
/** True if the player has a main town. The default value is true. */
bool hasMainTown;
/** True if the main hero should be generated at the main town. The default value is true. */
bool generateHeroAtMainTown;
/** The position of the main town. */
int3 posOfMainTown;
/** The team id to which the player belongs to. The default value is 255 representing that the player belongs to no team. */
ui8 team;
/** Unused. True if a hero should be generated. */
bool generateHero;
/** Unknown and unused. */
si32 p7;
/** TODO ? */
@@ -105,48 +142,13 @@ struct DLL_LINKAGE PlayerInfo
/** TODO ? */
si32 p9;
/** TODO unused, q-ty of hero placeholders containing hero type, WARNING: powerPlaceholders sometimes gives false 0 (eg. even if there is one placeholder), maybe different meaning??? */
/**
* Unused. Count of hero placeholders containing hero type.
* WARNING: powerPlaceholders sometimes gives false 0 (eg. even if there is one placeholder),
* maybe different meaning ???
*/
ui8 powerPlaceholders;
/** true if player can be played by a human */
bool canHumanPlay;
/** true if player can be played by the computer */
bool canComputerPlay;
/** defines the tactical setting of the AI */
EAiTactic::EAiTactic aiTactic;
/** IDs of allowed factions */
std::set<ui32> allowedFactions;
/** unused. is the faction random */
bool isFactionRandom;
/** specifies the ID of hero with chosen portrait; 255 if standard */
ui32 mainHeroPortrait;
/** the name of the main hero */
std::string mainHeroName;
/** list of available heroes */
std::vector<SHeroName> heroesNames;
/** true if the player has a main town */
bool hasMainTown;
/** true if the hero should be generated at the main town */
bool generateHeroAtMainTown;
/** the position of the main town */
int3 posOfMainTown;
/** the team id to which the player belongs to */
ui8 team;
/** unused. true if a hero should be generated */
bool generateHero;
/**
* Serialize method.
*/
@@ -548,51 +550,60 @@ public:
*/
virtual ~CMapHeader();
/** the version of the map */
/** The version of the map. The default value is EMapFormat::SOD. */
EMapFormat::EMapFormat version;
/** unused. if there are any playable players on the map */
bool areAnyPlayers;
/** the height of the map */
/** The height of the map. The default value is 72. */
si32 height;
/** the width of the map */
/** The width of the map. The default value is 72. */
si32 width;
/** specifies if the map has two levels */
si32 twoLevel;
/** Specifies if the map has two levels. The default value is true. */
bool twoLevel;
/** the name of the map */
/** The name of the map. */
std::string name;
/** the description of the map */
/** The description of the map. */
std::string description;
/** specifies the difficulty of the map ranging from 0 easy to 4 impossible */
/**
* Specifies the difficulty of the map ranging from 0 easy to 4 impossible.
* The default value is 1 representing a normal map difficulty.
*/
ui8 difficulty;
/** specifies the maximum level to reach for a hero */
/**
* Specifies the maximum level to reach for a hero. A value of 0 states that there is no
* maximum level for heroes.
*/
ui8 levelLimit;
/** the loss condition */
/** Specifies the loss condition. The default value is lose all your towns and heroes. */
LossCondition lossCondition;
/** the victory condition */
/** Specifies the victory condition. The default value is defeat all enemies. */
VictoryCondition victoryCondition;
/** list of player information */
/** A list containing information about players. */
std::vector<PlayerInfo> players;
/** number of teams */
/** The number of teams. */
ui8 howManyTeams;
/** list of allowed heroes, index is hero id */
/**
* A list of allowed heroes. The index is the hero id and the value is either 0 for not allowed or 1 for allowed.
* The default value is a list of default allowed heroes. See CHeroHandler::getDefaultAllowedHeroes for more info.
*/
std::vector<ui8> allowedHeroes;
/** list of placeholded heroes, index is id of heroes types */
/** A list of placeholded heroes. The index is the id of a hero type. */
std::vector<ui16> placeholdedHeroes;
/** Unused. True if there are any playable players on the map. */
bool areAnyPlayers;
/**
* Serialize method.
*/
@@ -778,7 +789,7 @@ public:
{
for(int j = 0; j < height ; ++j)
{
for(int k = 0; k <= twoLevel; ++k)
for(int k = 0; k < (twoLevel ? 2 : 1); ++k)
{
h & terrain[i][j][k];
}
@@ -794,14 +805,14 @@ public:
terrain[ii] = new TerrainTile*[height];
for(int jj = 0; jj < height; ++jj)
{
terrain[ii][jj] = new TerrainTile[twoLevel + 1];
terrain[ii][jj] = new TerrainTile[twoLevel ? 2 : 1];
}
}
for(int i = 0; i < width ; ++i)
{
for(int j = 0; j < height ; ++j)
{
for(int k = 0; k <= twoLevel ; ++k)
for(int k = 0; k < (twoLevel ? 2 : 1); ++k)
{
h & terrain[i][j][k];
}

View File

@@ -1,4 +1,3 @@
#include "StdInc.h"
#include "CMapInfo.h"
#include "../StartInfo.h"
@@ -29,8 +28,8 @@ void CMapInfo::countPlayers()
actualHumanPlayers++;
}
CMapInfo::CMapInfo() :
scenarioOpts(nullptr)
CMapInfo::CMapInfo() : scenarioOpts(nullptr), playerAmnt(0), humanPlayers(0),
actualHumanPlayers(0), isRandomMap(false)
{
}

View File

@@ -1,5 +1,7 @@
#pragma once
#include "StdInc.h"
// Forward class declarations aren't enough here. The compiler
// generated CMapInfo d-tor, generates the unique_ptr d-tor as well here
// as a inline method. The unique_ptr d-tor requires a complete type. Defining
@@ -30,6 +32,7 @@ public:
int playerAmnt; //players in map
int humanPlayers; //players ALLOWED to be controlled by human
int actualHumanPlayers; // >1 if multiplayer game
bool isRandomMap; // true if the map will be created randomly, false if not
CMapInfo();
void mapInit(const std::string & fname);

View File

@@ -1,5 +1,5 @@
#include "StdInc.h"
#include "CMapService.h"
#include "../Filesystem/CResourceLoader.h"
#include "../Filesystem/CBinaryReader.h"
#include "../Filesystem/CCompressedStream.h"
@@ -208,7 +208,7 @@ void CMapLoaderH3M::readHeader()
mapHeader->areAnyPlayers = static_cast<bool>(readChar(buffer, pos));
mapHeader->height = mapHeader->width = (read_le_u32(buffer + pos));
pos += 4;
mapHeader->twoLevel = readChar(buffer, pos);
mapHeader->twoLevel = static_cast<bool>(readChar(buffer, pos));
mapHeader->name = readString(buffer, pos);
mapHeader->description = readString(buffer, pos);
mapHeader->difficulty = readChar(buffer, pos);
@@ -272,6 +272,7 @@ void CMapLoaderH3M::readPlayerInfo()
allowedFactions += (buffer[pos++]) * 256;
}
mapHeader->players[i].allowedFactions.clear();
for(int fact = 0; fact < 16; ++fact)
{
if(allowedFactions & (1 << fact))
@@ -884,7 +885,7 @@ void CMapLoaderH3M::readTerrain()
map->terrain[ii] = new TerrainTile*[map->height];
for(int jj = 0; jj < map->height; jj++)
{
map->terrain[ii][jj] = new TerrainTile[map->twoLevel + 1];
map->terrain[ii][jj] = new TerrainTile[map->twoLevel ? 2 : 1];
}
}

View File

@@ -11,6 +11,8 @@
#pragma once
#include "StdInc.h"
class CMap;
class CMapHeader;
class CInputStream;

View File

@@ -1,14 +1,13 @@
#include "StdInc.h"
#include "CMapGenOptions.h"
CMapGenOptions::CMapGenOptions() : width(72), height(72), hasTwoLevels(true),
playersCnt(-1), teamsCnt(-1), compOnlyPlayersCnt(-1), compOnlyTeamsCnt(-1),
waterContent(EWaterContent::NORMAL), monsterStrength(EMonsterStrength::NORMAL)
playersCnt(-1), teamsCnt(-1), compOnlyPlayersCnt(0), compOnlyTeamsCnt(-1),
waterContent(EWaterContent::RANDOM), monsterStrength(EMonsterStrength::RANDOM)
{
}
int CMapGenOptions::getWidth() const
si32 CMapGenOptions::getWidth() const
{
return width;
}
@@ -25,12 +24,12 @@ void CMapGenOptions::setWidth(int value)
}
}
int CMapGenOptions::getHeight() const
si32 CMapGenOptions::getHeight() const
{
return height;
}
void CMapGenOptions::setHeight(int value)
void CMapGenOptions::setHeight(si32 value)
{
if(value > 0)
{
@@ -52,14 +51,14 @@ void CMapGenOptions::setHasTwoLevels(bool value)
hasTwoLevels = value;
}
int CMapGenOptions::getPlayersCnt() const
si8 CMapGenOptions::getPlayersCnt() const
{
return playersCnt;
}
void CMapGenOptions::setPlayersCnt(int value)
void CMapGenOptions::setPlayersCnt(si8 value)
{
if((value >= 1 && value <= 8) || value == -1)
if((value >= 1 && value <= 8) || value == RANDOM_SIZE)
{
playersCnt = value;
}
@@ -69,14 +68,14 @@ void CMapGenOptions::setPlayersCnt(int value)
}
}
int CMapGenOptions::getTeamsCnt() const
si8 CMapGenOptions::getTeamsCnt() const
{
return teamsCnt;
}
void CMapGenOptions::setTeamsCnt(int value)
void CMapGenOptions::setTeamsCnt(si8 value)
{
if(playersCnt == -1 || (value >= 0 && value < playersCnt) || value == -1)
if(playersCnt == RANDOM_SIZE || (value >= 0 && value < playersCnt) || value == RANDOM_SIZE)
{
teamsCnt = value;
}
@@ -87,14 +86,14 @@ void CMapGenOptions::setTeamsCnt(int value)
}
}
int CMapGenOptions::getCompOnlyPlayersCnt() const
si8 CMapGenOptions::getCompOnlyPlayersCnt() const
{
return compOnlyPlayersCnt;
}
void CMapGenOptions::setCompOnlyPlayersCnt(int value)
void CMapGenOptions::setCompOnlyPlayersCnt(si8 value)
{
if(value == -1 || (value >= 0 && value <= 8 - playersCnt))
if(value == RANDOM_SIZE || (value >= 0 && value <= 8 - playersCnt))
{
compOnlyPlayersCnt = value;
}
@@ -106,14 +105,14 @@ void CMapGenOptions::setCompOnlyPlayersCnt(int value)
}
}
int CMapGenOptions::getCompOnlyTeamsCnt() const
si8 CMapGenOptions::getCompOnlyTeamsCnt() const
{
return compOnlyTeamsCnt;
}
void CMapGenOptions::setCompOnlyTeamsCnt(int value)
void CMapGenOptions::setCompOnlyTeamsCnt(si8 value)
{
if(value == -1 || compOnlyPlayersCnt == -1 || (value >= 0 && value <= compOnlyPlayersCnt - 1))
if(value == RANDOM_SIZE || compOnlyPlayersCnt == RANDOM_SIZE || (value >= 0 && value <= compOnlyPlayersCnt - 1))
{
compOnlyTeamsCnt = value;
}

View File

@@ -11,6 +11,8 @@
#pragma once
#include "StdInc.h"
namespace EWaterContent
{
enum EWaterContent
@@ -46,37 +48,38 @@ public:
CMapGenOptions();
/**
* Gets the width of the map.
* Gets the width of the map. The default value is 72.
*
* @return width of the map in tiles, default is 72
* @return width of the map in tiles
*/
int getWidth() const;
si32 getWidth() const;
/**
* Sets the width of the map.
*
* @param value the width of the map in tiles, any values higher than 0 are allowed
*/
void setWidth(int value);
void setWidth(si32 value);
/**
* Gets the height of the map.
* Gets the height of the map. The default value is 72.
*
* @return height of the map in tiles, default is 72
* @return height of the map in tiles
*/
int getHeight() const;
si32 getHeight() const;
/**
* Sets the height of the map.
*
* @param value the height of the map in tiles, any values higher than 0 are allowed
*/
void setHeight(int value);
void setHeight(si32 value);
/**
* Gets the flag whether the map should be generated with two levels.
* Gets the flag whether the map should be generated with two levels. The
* default value is true.
*
* @return true for two level map, default is true
* @return true for two level map
*/
bool getHasTwoLevels() const;
@@ -88,65 +91,68 @@ public:
void setHasTwoLevels(bool value);
/**
* Gets the count of the players.
* Gets the count of the players. The default value is -1 representing a random
* player count.
*
* @return the count of the players ranging from 1 to 8, -1 for random, default is -1
* @return the count of the players ranging from 1 to 8 or -1 for random
*/
int getPlayersCnt() const;
si8 getPlayersCnt() const;
/**
* Sets the count of the players.
*
* @param value the count of the players ranging from 1 to 8, -1 for random
*/
void setPlayersCnt(int value);
void setPlayersCnt(si8 value);
/**
* Gets the count of the teams.
* Gets the count of the teams. The default value is -1 representing a random
* team count.
*
* @return the count of the teams ranging from 0 to <players count - 1>, -1 for random, default is -1
* @return the count of the teams ranging from 0 to <players count - 1> or -1 for random
*/
int getTeamsCnt() const;
si8 getTeamsCnt() const;
/**
* Sets the count of the teams
*
* @param value the count of the teams ranging from 0 to <players count - 1>, -1 for random
*/
void setTeamsCnt(int value);
void setTeamsCnt(si8 value);
/**
* Gets the count of the computer only players.
* Gets the count of the computer only players. The default value is 0.
*
* @return the count of the computer only players ranging from 0 to <8 - players count>, -1 for random, default is -1
* @return the count of the computer only players ranging from 0 to <8 - players count> or -1 for random
*/
int getCompOnlyPlayersCnt() const;
si8 getCompOnlyPlayersCnt() const;
/**
* Sets the count of the computer only players.
*
* @param value the count of the computer only players ranging from 0 to <8 - players count>, -1 for random
*/
void setCompOnlyPlayersCnt(int value);
void setCompOnlyPlayersCnt(si8 value);
/**
* Gets the count of the computer only teams.
* Gets the count of the computer only teams. The default value is -1 representing
* a random computer only team count.
*
* @return the count of the computer only teams ranging from 0 to <comp only players - 1>, -1 for random, default is -1
* @return the count of the computer only teams ranging from 0 to <comp only players - 1> or -1 for random
*/
int getCompOnlyTeamsCnt() const;
si8 getCompOnlyTeamsCnt() const;
/**
* Sets the count of the computer only teams.
*
* @param value the count of the computer only teams ranging from 0 to <comp only players - 1>, -1 for random
*/
void setCompOnlyTeamsCnt(int value);
void setCompOnlyTeamsCnt(si8 value);
/**
* Gets the water content.
* Gets the water content. The default value is random.
*
* @return the water content, default is normal
* @return the water content
*/
EWaterContent::EWaterContent getWaterContent() const;
@@ -158,9 +164,9 @@ public:
void setWaterContent(EWaterContent::EWaterContent value);
/**
* Gets the strength of the monsters.
* Gets the strength of the monsters. The default value is random.
*
* @return the strenght of the monsters, default is normal
* @return the strenght of the monsters
*/
EMonsterStrength::EMonsterStrength getMonsterStrength() const;
@@ -171,31 +177,45 @@ public:
*/
void setMonsterStrength(EMonsterStrength::EMonsterStrength value);
/** The constant for specifying a random number of sth. */
static const si8 RANDOM_SIZE = -1;
private:
/** the width of the map in tiles */
int width;
/** The width of the map in tiles. */
si32 width;
/** the height of the map in tiles */
int height;
/** The height of the map in tiles. */
si32 height;
/** true if the map has two levels/underground */
/** True if the map has two levels that means an underground. */
bool hasTwoLevels;
/** the count of the players(human + computer); -1 if random */
int playersCnt;
/** The count of the players(human + computer). */
si8 playersCnt;
/** the count of the teams; -1 if random */
int teamsCnt;
/** The count of the teams. */
si8 teamsCnt;
/** the count of computer only players; -1 if random */
int compOnlyPlayersCnt;
/** The count of computer only players. */
si8 compOnlyPlayersCnt;
/** the count of computer only teams; -1 if random */
int compOnlyTeamsCnt;
/** The count of computer only teams. */
si8 compOnlyTeamsCnt;
/** the water content, -1 if random */
/** The amount of water content. */
EWaterContent::EWaterContent waterContent;
/** the strength of the monsters, -1 if random */
/** The strength of the monsters. */
EMonsterStrength::EMonsterStrength monsterStrength;
public:
/**
* Serialize method.
*/
template <typename Handler>
void serialize(Handler & h, const int version)
{
h & width & height & hasTwoLevels & playersCnt & teamsCnt & compOnlyPlayersCnt;
h & compOnlyTeamsCnt & waterContent & monsterStrength;
}
};

View File

@@ -12,6 +12,8 @@
*
*/
#include "RMG/CMapGenOptions.h"
class CCampaignState;
/// Struct which describes the name, the color, the starting bonus of a player
@@ -66,7 +68,9 @@ struct StartInfo
ui32 seedPostInit; //so we know that game is correctly synced at the start; 0 if not known yet
ui32 mapfileChecksum; //0 if not relevant
ui8 turnTime; //in minutes, 0=unlimited
std::string mapname;
std::string mapname; // empty for random map, otherwise name of the map or savegame
bool createRandomMap; // true if a random map should be created
shared_ptr<CMapGenOptions> mapGenOptions; // needs to be not nullptr if createRandomMap=true
shared_ptr<CCampaignState> campState;
@@ -96,12 +100,14 @@ struct StartInfo
h & mapfileChecksum;
h & turnTime;
h & mapname;
h & createRandomMap;
h & mapGenOptions;
h & campState;
}
StartInfo()
StartInfo() : mode(INVALID), difficulty(0), seedToBeUsed(0), seedPostInit(0),
mapfileChecksum(0), turnTime(0), createRandomMap(false)
{
mapfileChecksum = seedPostInit = seedToBeUsed = 0;
mode = INVALID;
}
};

View File

@@ -3822,11 +3822,11 @@ void CGameHandler::playerMessage( ui8 player, const std::string &message )
FoWChange fc;
fc.mode = 1;
fc.player = player;
int3 * hlp_tab = new int3[gs->map->width * gs->map->height * (gs->map->twoLevel + 1)];
int3 * hlp_tab = new int3[gs->map->width * gs->map->height * (gs->map->twoLevel ? 2 : 1)];
int lastUnc = 0;
for(int i=0;i<gs->map->width;i++)
for(int j=0;j<gs->map->height;j++)
for(int k=0;k<gs->map->twoLevel+1;k++)
for(int k = 0; k < (gs->map->twoLevel ? 2 : 1); k++)
if(!gs->getPlayerTeam(fc.player)->fogOfWarMap[i][j][k])
hlp_tab[lastUnc++] = int3(i,j,k);
fc.tiles.insert(hlp_tab, hlp_tab + lastUnc);

View File

@@ -315,18 +315,20 @@ CGameHandler * CVCMIServer::initGhFromHostingConnection(CConnection &c)
StartInfo si;
c >> si; //get start options
bool mapFound = CResourceHandler::get()->existsResource(ResourceID(si.mapname, EResType::MAP));
if(!si.createRandomMap)
{
bool mapFound = CResourceHandler::get()->existsResource(ResourceID(si.mapname, EResType::MAP));
if(!mapFound && si.mode == StartInfo::NEW_GAME) //TODO some checking for campaigns
{
c << ui8(1); //WRONG!
return NULL;
}
else
{
c << ui8(0); //OK!
//TODO some checking for campaigns
if(!mapFound && si.mode == StartInfo::NEW_GAME)
{
c << ui8(1); //WRONG!
return nullptr;
}
}
c << ui8(0); //OK!
gh->init(&si);
gh->conns.insert(&c);