1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-12 02:28:11 +02:00

* Map size can be any integer value * Changed new_*; to new_*(); for zero-parameter c-tors (=code convention; stack allocated objects without parantheses as ever to avoid c++ most vexing parse)

This commit is contained in:
beegee1 2012-11-13 18:01:31 +00:00
parent f5ddc44827
commit e08db9790b
6 changed files with 142 additions and 103 deletions

View File

@ -1077,25 +1077,30 @@ void SelectionTab::parseGames(const std::vector<ResourceID> &files, bool multi)
ui8 sign[8];
lf >> sign;
if(std::memcmp(sign,"VCMISVG",7))
throw std::runtime_error("not a correct savefile!");
allItems.resize(allItems.size() + 1);
allItems[i].mapHeader = std::shared_ptr<CMapHeader>(new CMapHeader);
allItems[i].scenarioOpts = new StartInfo;
lf >> *(allItems[i].mapHeader.get()) >> allItems[i].scenarioOpts;
allItems[i].fileURI = files[i].getName();
allItems[i].countPlayers();
std::time_t time = CFileInfo(CResourceHandler::get()->getResourceName(files[i])).getDate();
allItems[i].date = std::asctime(std::localtime(&time));
if((allItems[i].actualHumanPlayers > 1) != multi) //if multi mode then only multi games, otherwise single
{
allItems[i].mapHeader.reset();
throw std::runtime_error("not a correct savefile!");
}
// Create the map info object
CMapInfo mapInfo;
mapInfo.mapHeader = std::shared_ptr<CMapHeader>(new CMapHeader);
mapInfo.scenarioOpts = new StartInfo;
lf >> *(mapInfo.mapHeader.get()) >> mapInfo.scenarioOpts;
mapInfo.fileURI = files[i].getName();
mapInfo.countPlayers();
std::time_t time = CFileInfo(CResourceHandler::get()->getResourceName(files[i])).getDate();
mapInfo.date = std::asctime(std::localtime(&time));
// If multi mode then only multi games, otherwise single
if((mapInfo.actualHumanPlayers > 1) != multi)
{
mapInfo.mapHeader.reset();
}
allItems.push_back(mapInfo);
}
catch(std::exception &e)
catch(std::exception & e)
{
allItems.pop_back();
tlog3 << "Failed to process " << files[i].getName() <<": " << e.what() << std::endl;
}
}
@ -1550,7 +1555,9 @@ RandomMapTab::RandomMapTab()
mapSizeBtnGroup->select(1, false);
mapSizeBtnGroup->onChange = [&](int btnId)
{
options.setMapSize(static_cast<EMapSize::EMapSize>(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]);
};
// Two levels

View File

@ -50,6 +50,8 @@ set(lib_SRCS
)
set(lib_HEADERS
Filesystem/CInputStream.h
Filesystem/ISimpleResourceLoader.h
AI_Base.h
CondSh.h
ConstTransitivePtr.h

View File

@ -14,7 +14,7 @@
/**
* Abstract class which provides method definitions for reading from a stream.
*/
class DLL_LINKAGE CInputStream : public boost::noncopyable
class DLL_LINKAGE CInputStream : private boost::noncopyable
{
public:
/**

View File

@ -99,7 +99,7 @@ void CMapLoaderH3M::initBuffer(CInputStream * stream)
std::unique_ptr<CMap> CMapLoaderH3M::loadMap()
{
// Init map object by parsing the input buffer
map = new CMap;
map = new CMap();
mapHeader = std::unique_ptr<CMapHeader>(dynamic_cast<CMapHeader *>(map));
init();
@ -672,7 +672,7 @@ void CMapLoaderH3M::readPredefinedHeroes()
int custom = buffer[pos++];
if(!custom) continue;
CGHeroInstance * hero = new CGHeroInstance;
CGHeroInstance * hero = new CGHeroInstance();
hero->ID = Obj::HERO;
hero->subID = z;
@ -851,7 +851,7 @@ CArtifactInstance * CMapLoaderH3M::createArtifact(int aid, int spellID /*= -1*/)
}
else
{
a = new CArtifactInstance;
a = new CArtifactInstance();
}
addNewArtifactInstance(a);
@ -923,7 +923,7 @@ void CMapLoaderH3M::readDefInfo()
// Read custom defs
for(int idd = 0; idd < defAmount; ++idd)
{
CGDefInfo * defInfo = new CGDefInfo;
CGDefInfo * defInfo = new CGDefInfo();
// Read name
int nameLength = read_le_u32(buffer + pos);
@ -1140,14 +1140,14 @@ void CMapLoaderH3M::readObjects()
case 47: //School of Magic
case 107: //School of War
{
nobj = new CGVisitableOPH;
nobj = new CGVisitableOPH();
break;
}
case 55: //mystical garden
case 112://windmill
case 109://water wheel
{
nobj = new CGVisitableOPW;
nobj = new CGVisitableOPW();
break;
}
case 43: //teleport
@ -1156,7 +1156,7 @@ void CMapLoaderH3M::readObjects()
case 103://subterranean gate
case 111://Whirlpool
{
nobj = new CGTeleport;
nobj = new CGTeleport();
break;
}
case 12: //campfire
@ -1165,14 +1165,14 @@ void CMapLoaderH3M::readObjects()
case 86: //Shipwreck Survivor
case 101://treasure chest
{
nobj = new CGPickable;
nobj = new CGPickable();
break;
}
case 54: //Monster
case 71: case 72: case 73: case 74: case 75: // Random Monster 1 - 4
case 162: case 163: case 164: // Random Monster 5 - 7
{
CGCreature * cre = new CGCreature;
CGCreature * cre = new CGCreature();
nobj = cre;
if(map->version > EMapFormat::ROE)
@ -1182,7 +1182,7 @@ void CMapLoaderH3M::readObjects()
map->questIdentifierToId[cre->identifier] = idToBeGiven;
}
CStackInstance * hlp = new CStackInstance;
CStackInstance * hlp = new CStackInstance();
hlp->count = read_le_u16(buffer + pos);
pos += 2;
@ -1247,7 +1247,7 @@ void CMapLoaderH3M::readObjects()
}
case 59: case 91: //ocean bottle and sign
{
CGSignBottle * sb = new CGSignBottle;
CGSignBottle * sb = new CGSignBottle();
nobj = sb;
sb->message = readString(buffer, pos);
pos += 4;
@ -1261,7 +1261,7 @@ void CMapLoaderH3M::readObjects()
}
case 113: //witch hut
{
CGWitchHut * wh = new CGWitchHut;
CGWitchHut * wh = new CGWitchHut();
nobj = wh;
// in reo we cannot specify it - all are allowed (I hope)
@ -1295,7 +1295,7 @@ void CMapLoaderH3M::readObjects()
}
case 81: //scholar
{
CGScholar * sch = new CGScholar;
CGScholar * sch = new CGScholar();
nobj = sch;
sch->bonusType = buffer[pos++];
sch->bonusID = buffer[pos++];
@ -1304,7 +1304,7 @@ void CMapLoaderH3M::readObjects()
}
case 33: case 219: //garrison
{
CGGarrison * gar = new CGGarrison;
CGGarrison * gar = new CGGarrison();
nobj = gar;
nobj->setOwner(buffer[pos++]);
pos += 3;
@ -1327,7 +1327,7 @@ void CMapLoaderH3M::readObjects()
{
int artID = -1;
int spellID = -1;
CGArtifact * art = new CGArtifact;
CGArtifact * art = new CGArtifact();
nobj = art;
bool areSettings = buffer[pos++];
@ -1359,7 +1359,7 @@ void CMapLoaderH3M::readObjects()
}
case 76: case 79: //random resource; resource
{
CGResource * res = new CGResource;
CGResource * res = new CGResource();
nobj = res;
bool isMessGuard = buffer[pos];
@ -1392,14 +1392,14 @@ void CMapLoaderH3M::readObjects()
case 53:
case 220://mine (?)
{
nobj = new CGMine;
nobj = new CGMine();
nobj->setOwner(buffer[pos++]);
pos += 3;
break;
}
case 17: case 18: case 19: case 20: //dwellings
{
nobj = new CGDwelling;
nobj = new CGDwelling();
nobj->setOwner(buffer[pos++]);
pos += 3;
break;
@ -1407,12 +1407,12 @@ void CMapLoaderH3M::readObjects()
case 78: //Refugee Camp
case 106: //War Machine Factory
{
nobj = new CGDwelling;
nobj = new CGDwelling();
break;
}
case 88: case 89: case 90: //spell shrine
{
CGShrine * shr = new CGShrine;
CGShrine * shr = new CGShrine();
nobj = shr;
shr->spell = buffer[pos];
pos += 4;
@ -1420,7 +1420,7 @@ void CMapLoaderH3M::readObjects()
}
case 6: //pandora's box
{
CGPandoraBox * box = new CGPandoraBox;
CGPandoraBox * box = new CGPandoraBox();
nobj = box;
bool messg = buffer[pos];
++pos;
@ -1507,13 +1507,13 @@ void CMapLoaderH3M::readObjects()
case 217: //same as castle
case 218: //level range
{
nobj = new CGDwelling;
nobj = new CGDwelling();
CSpecObjInfo * spec = nullptr;
switch(defInfo->id)
{
break; case 216: spec = new CCreGenLeveledCastleInfo;
break; case 217: spec = new CCreGenAsCastleInfo;
break; case 218: spec = new CCreGenLeveledInfo;
break; case 216: spec = new CCreGenLeveledCastleInfo();
break; case 217: spec = new CCreGenAsCastleInfo();
break; case 218: spec = new CCreGenLeveledInfo();
}
spec->player = read_le_u32(buffer + pos);
@ -1552,7 +1552,7 @@ void CMapLoaderH3M::readObjects()
}
case 215:
{
CGQuestGuard * guard = new CGQuestGuard;
CGQuestGuard * guard = new CGQuestGuard();
addQuest(guard);
readQuest(guard);
nobj = guard;
@ -1571,19 +1571,19 @@ void CMapLoaderH3M::readObjects()
case 52: //Mermaid
case 94: //Stables
{
nobj = new CGBonusingObject;
nobj = new CGBonusingObject();
break;
}
case 49: //Magic Well
{
nobj = new CGMagicWell;
nobj = new CGMagicWell();
break;
}
case 15: //Cover of darkness
case 58: //Redwood Observatory
case 60: //Pillar of Fire
{
nobj = new CGObservatory;
nobj = new CGObservatory();
break;
}
case 22: //Corpse
@ -1591,29 +1591,29 @@ void CMapLoaderH3M::readObjects()
case 105://Wagon
case 108://Warrior's Tomb
{
nobj = new CGOnceVisitable;
nobj = new CGOnceVisitable();
break;
}
case 8: //Boat
{
nobj = new CGBoat;
nobj = new CGBoat();
break;
}
case 92: //Sirens
{
nobj = new CGSirens;
nobj = new CGSirens();
break;
}
case 87: //Shipyard
{
nobj = new CGShipyard;
nobj = new CGShipyard();
nobj->setOwner(read_le_u32(buffer + pos));
pos += 4;
break;
}
case 214: //hero placeholder
{
CGHeroPlaceholder * hp = new CGHeroPlaceholder;
CGHeroPlaceholder * hp = new CGHeroPlaceholder();
nobj = hp;
int a = buffer[pos++]; //unknown byte, seems to be always 0 (if not - scream!)
@ -1635,59 +1635,59 @@ void CMapLoaderH3M::readObjects()
}
case 10: //Keymaster
{
nobj = new CGKeymasterTent;
nobj = new CGKeymasterTent();
break;
}
case 9: //Border Guard
{
nobj = new CGBorderGuard;
nobj = new CGBorderGuard();
addQuest(nobj);
break;
}
case 212: //Border Gate
{
nobj = new CGBorderGate;
nobj = new CGBorderGate();
addQuest (nobj);
break;
}
case 27: case 37: //Eye and Hut of Magi
{
nobj = new CGMagi;
nobj = new CGMagi();
break;
}
case 16: case 24: case 25: case 84: case 85: //treasure bank
{
nobj = new CBank;
nobj = new CBank();
break;
}
case 63: //Pyramid
{
nobj = new CGPyramid;
nobj = new CGPyramid();
break;
}
case 13: //Cartographer
{
nobj = new CCartographer;
nobj = new CCartographer();
break;
}
case 48: //Magic Spring
{
nobj = new CGMagicSpring;
nobj = new CGMagicSpring();
break;
}
case 97: //den of thieves
{
nobj = new CGDenOfthieves;
nobj = new CGDenOfthieves();
break;
}
case 57: //Obelisk
{
nobj = new CGObelisk;
nobj = new CGObelisk();
break;
}
case 42: //Lighthouse
{
nobj = new CGLighthouse;
nobj = new CGLighthouse();
nobj->tempOwner = read_le_u32(buffer + pos);
pos += 4;
break;
@ -1697,22 +1697,22 @@ void CMapLoaderH3M::readObjects()
case 213: //Freelancer's Guild
case 221: //Trading Post (snow)
{
nobj = new CGMarket;
nobj = new CGMarket();
break;
}
case 104: //University
{
nobj = new CGUniversity;
nobj = new CGUniversity();
break;
}
case 7: //Black Market
{
nobj = new CGBlackMarket;
nobj = new CGBlackMarket();
break;
}
default: //any other object
{
nobj = new CGObjectInstance;
nobj = new CGObjectInstance();
break;
}
}
@ -1767,7 +1767,7 @@ void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number, bool version
// Empty slot
if(creID == maxID) continue;
CStackInstance * hlp = new CStackInstance;
CStackInstance * hlp = new CStackInstance();
hlp->count = count;
if(creID > maxID - 0xf)
@ -1790,7 +1790,7 @@ void CMapLoaderH3M::readCreatureSet(CCreatureSet * out, int number, bool version
CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven)
{
CGHeroInstance * nhi = new CGHeroInstance;
CGHeroInstance * nhi = new CGHeroInstance();
int identifier = 0;
if(map->version > EMapFormat::ROE)
@ -1977,7 +1977,7 @@ CGObjectInstance * CMapLoaderH3M::readHero(int idToBeGiven)
CGSeerHut * CMapLoaderH3M::readSeerHut()
{
CGSeerHut * hut = new CGSeerHut;
CGSeerHut * hut = new CGSeerHut();
if(map->version > EMapFormat::ROE)
{
@ -2208,7 +2208,7 @@ void CMapLoaderH3M::addQuest(CGObjectInstance * quest)
CGTownInstance * CMapLoaderH3M::readTown(int castleID)
{
CGTownInstance * nt = new CGTownInstance;
CGTownInstance * nt = new CGTownInstance();
nt->identifier = 0;
if(map->version > EMapFormat::ROE)
{
@ -2316,7 +2316,7 @@ CGTownInstance * CMapLoaderH3M::readTown(int castleID)
for(int gh = 0; gh < numberOfEvent; ++gh)
{
CCastleEvent * nce = new CCastleEvent;
CCastleEvent * nce = new CCastleEvent();
nce->town = nt;
nce->name = readString(buffer, pos);
nce->message = readString(buffer, pos);
@ -2456,7 +2456,7 @@ void CMapLoaderH3M::readEvents()
pos += 4;
for(int yyoo = 0; yyoo < numberOfEvents; ++yyoo)
{
CMapEvent * ne = new CMapEvent;
CMapEvent * ne = new CMapEvent();
ne->name = std::string();
ne->message = std::string();
int nameLen = read_le_u32(buffer + pos);

View File

@ -1,21 +1,45 @@
#include "StdInc.h"
#include "CMapGenOptions.h"
CMapGenOptions::CMapGenOptions() : mapSize(EMapSize::MEDIUM), hasTwoLevels(true),
CMapGenOptions::CMapGenOptions() : width(72), height(72), hasTwoLevels(true),
playersCnt(-1), teamsCnt(-1), compOnlyPlayersCnt(-1), compOnlyTeamsCnt(-1),
waterContent(EWaterContent::NORMAL), monsterStrength(EMonsterStrength::NORMAL)
{
}
EMapSize::EMapSize CMapGenOptions::getMapSize() const
int CMapGenOptions::getWidth() const
{
return mapSize;
return width;
}
void CMapGenOptions::setMapSize(EMapSize::EMapSize value)
void CMapGenOptions::setWidth(int value)
{
mapSize = value;
if(value > 0)
{
width = value;
}
else
{
throw std::runtime_error("Map width lower than 1 not allowed.");
}
}
int CMapGenOptions::getHeight() const
{
return height;
}
void CMapGenOptions::setHeight(int value)
{
if(value > 0)
{
height = value;
}
else
{
throw std::runtime_error("Map height lower than 1 not allowed.");
}
}
bool CMapGenOptions::getHasTwoLevels() const

View File

@ -11,17 +11,6 @@
#pragma once
namespace EMapSize
{
enum EMapSize
{
SMALL,
MEDIUM,
LARGE,
EXTRA_LARGE
};
}
namespace EWaterContent
{
enum EWaterContent
@ -57,23 +46,37 @@ public:
CMapGenOptions();
/**
* Gets the size of the map.
* Gets the width of the map.
*
* @return size of the map
* @return width of the map in tiles, default is 72
*/
EMapSize::EMapSize getMapSize() const;
int getWidth() const;
/**
* Sets the size of the map.
* Sets the width of the map.
*
* @param value the size of the map
* @param value the width of the map in tiles, any values higher than 0 are allowed
*/
void setMapSize(EMapSize::EMapSize value);
void setWidth(int value);
/**
* Gets the height of the map.
*
* @return height of the map in tiles, default is 72
*/
int 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);
/**
* Gets the flag whether the map should be generated with two levels.
*
* @return true for two level map
* @return true for two level map, default is true
*/
bool getHasTwoLevels() const;
@ -87,7 +90,7 @@ public:
/**
* Gets the count of the players.
*
* @return the count of the players ranging from 1 to 8, -1 for random
* @return the count of the players ranging from 1 to 8, -1 for random, default is -1
*/
int getPlayersCnt() const;
@ -101,7 +104,7 @@ public:
/**
* Gets the count of the teams.
*
* @return the count of the teams ranging from 0 to <players count - 1>, -1 for random
* @return the count of the teams ranging from 0 to <players count - 1>, -1 for random, default is -1
*/
int getTeamsCnt() const;
@ -115,7 +118,7 @@ public:
/**
* Gets the count of the computer only players.
*
* @return the count of the computer only players ranging from 0 to <8 - players count>, -1 for random
* @return the count of the computer only players ranging from 0 to <8 - players count>, -1 for random, default is -1
*/
int getCompOnlyPlayersCnt() const;
@ -129,7 +132,7 @@ public:
/**
* Gets the count of the computer only teams.
*
* @return the count of the computer only teams ranging from 0 to <comp only players - 1>, -1 for random
* @return the count of the computer only teams ranging from 0 to <comp only players - 1>, -1 for random, default is -1
*/
int getCompOnlyTeamsCnt() const;
@ -143,7 +146,7 @@ public:
/**
* Gets the water content.
*
* @return the water content
* @return the water content, default is normal
*/
EWaterContent::EWaterContent getWaterContent() const;
@ -157,7 +160,7 @@ public:
/**
* Gets the strength of the monsters.
*
* @return the strenght of the monsters
* @return the strenght of the monsters, default is normal
*/
EMonsterStrength::EMonsterStrength getMonsterStrength() const;
@ -169,8 +172,11 @@ public:
void setMonsterStrength(EMonsterStrength::EMonsterStrength value);
private:
/** the size of the map */
EMapSize::EMapSize mapSize;
/** the width of the map in tiles */
int width;
/** the height of the map in tiles */
int height;
/** true if the map has two levels/underground */
bool hasTwoLevels;