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

* saving and resuming games should work!

(loading from the main menu, saving using "save [NAME]" command)
This commit is contained in:
Michał W. Urbańczyk 2009-01-12 20:05:56 +00:00
parent 3474fdaf05
commit b895fa35cb
15 changed files with 81 additions and 29 deletions

View File

@ -38,11 +38,6 @@ extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX; //fonts
using namespace boost::logic;
using namespace boost::assign;
using namespace CSDL_Ext;
CAdvMapInt::~CAdvMapInt()
{
SDL_FreeSurface(bg);
delete heroWindow;
}
CMinimap::CMinimap(bool draw)
{
int3 mapSizes = LOCPLINT->cb->getMapSize();
@ -107,6 +102,11 @@ CMinimap::CMinimap(bool draw)
if (draw)
redraw();
}
CMinimap::~CMinimap()
{
SDL_FreeSurface(radar);
SDL_FreeSurface(temps);
}
void CMinimap::draw()
{
int3 mapSizes = LOCPLINT->cb->getMapSize();
@ -297,7 +297,9 @@ void CMinimap::showTile(const int3 &pos)
void CMinimap::hideTile(const int3 &pos)
{
}
CTerrainRect::CTerrainRect():currentPath(NULL)
CTerrainRect::CTerrainRect()
:currentPath(NULL)
{
tilesw=ADVOPT.tilesW;
tilesh=ADVOPT.tilesH;
@ -312,6 +314,10 @@ CTerrainRect::CTerrainRect():currentPath(NULL)
arrows->ourImages[y].bitmap = CSDL_Ext::alphaTransform(arrows->ourImages[y].bitmap);
}
}
CTerrainRect::~CTerrainRect()
{
delete arrows;
}
void CTerrainRect::activate()
{
ClickableL::activate();
@ -805,6 +811,7 @@ int3 CTerrainRect::whichTileIsIt()
{
return whichTileIsIt(LOCPLINT->current->motion.x,LOCPLINT->current->motion.y);
}
void CResDataBar::clickRight (tribool down)
{
}
@ -1111,6 +1118,15 @@ townList(ADVOPT.tlistSize,ADVOPT.tlistX,ADVOPT.tlistY,ADVOPT.tlistAU,ADVOPT.tlis
gems.push_back(CDefHandler::giveDef(ADVOPT.gemG[3]));
}
CAdvMapInt::~CAdvMapInt()
{
SDL_FreeSurface(bg);
delete heroWindow;
for(int i=0; i<gems.size(); i++)
delete gems[i];
}
void CAdvMapInt::fshowOverview()
{
}

View File

@ -26,6 +26,7 @@ public:
std::string statusbarTxt, rcText;
CMinimap(bool draw=true);
~CMinimap();
void draw();
void redraw(int level=-1);// (level==-1) => redraw all levels
void updateRadar();
@ -49,6 +50,7 @@ public:
CDefHandler * arrows;
CTerrainRect();
~CTerrainRect();
CPath * currentPath;
void activate();
void deactivate();

View File

@ -1032,6 +1032,7 @@ CPlayerInterface::CPlayerInterface(int Player, int serial)
playerID=Player;
serialID=serial;
human=true;
adventureInt = NULL;
pim = new boost::recursive_mutex;
showingDialog = new CondSh<bool>(false);
heroMoveSpeed = 2;
@ -1046,6 +1047,13 @@ CPlayerInterface::~CPlayerInterface()
{
delete pim;
delete showingDialog;
delete mainFPSmng;
delete adventureInt;
for(std::map<int,SDL_Surface*>::iterator i=graphics->heroWins.begin(); i!= graphics->heroWins.end(); i++)
SDL_FreeSurface(i->second);
for(std::map<int,SDL_Surface*>::iterator i=graphics->townWins.begin(); i!= graphics->townWins.end(); i++)
SDL_FreeSurface(i->second);
}
void CPlayerInterface::init(ICallback * CB)
{

View File

@ -1,6 +1,7 @@
#include "stdafx.h"
#include "CPreGame.h"
#include "hch/CDefHandler.h"
#include <ctime>
#include <SDL.h>
#include <boost/filesystem.hpp> // includes all needed Boost.Filesystem declarations
#include <boost/algorithm/string.hpp>
@ -992,7 +993,7 @@ void MapSel::show()
//blit bg
blitAt(bg,3,6);
CSDL_Ext::printAt("Map Sizes",55,60,GEOR13);
CSDL_Ext::printAt("Select a Scenario to Play",110,25,TNRB16);
CSDL_Ext::printAt(CGI->generaltexth->arraytxt[CPG->fromnewgame ? 229 : 230],110,25,TNRB16); //Select a Scenario to Play : Load a Saved Game
//size buttons
small.show();
medium.show();
@ -1172,16 +1173,25 @@ void MapSel::init()
group.join_all();
pliczkiTemp.clear();
std::vector<std::string> datestemp;
tie = fs::path( (fs::initial_path<fs::path>())/"/Games" );
for ( fs::directory_iterator dir (tie); dir!=end_iter; ++dir )
{
if (fs::is_regular_file(dir->status()));
{
if (boost::ends_with(dir->path().filename(),".vlgm1"))
{
pliczkiTemp.push_back("Games/"+(dir->path().leaf()));
std::time_t time = fs::last_write_time(dir->path());
datestemp.push_back(std::asctime(std::gmtime(&time)));
}
}
}
processGames(pliczkiTemp,mapInd);
for (int i = 0; i < ourGames.size(); i++)
{
ourGames[i].date = datestemp[i];
}
}
void MapSel::moveByOne(bool up)
{
@ -1374,6 +1384,8 @@ void MapSel::printSelectedInfo()
blitAt(Dloss->ourImages[temp].bitmap,420,366); //l
CSDL_Ext::printAtMiddle(diff,458,477,GEOR13,zwykly);
CSDL_Ext::printTo(selMap.date,704,40,GEOR13,zwykly);
//SDL_Flip(screen);
printFlags();
CSDL_Ext::update(screen);
@ -1539,7 +1551,7 @@ void CPreGame::showScenSel()
SDL_BlitSurface(ourScenSel->bHard.imgs->ourImages[0].bitmap,NULL,screen,&ourScenSel->bHard.pos);
SDL_BlitSurface(ourScenSel->bExpert.imgs->ourImages[0].bitmap,NULL,screen,&ourScenSel->bExpert.pos);
SDL_BlitSurface(ourScenSel->bImpossible.imgs->ourImages[0].bitmap,NULL,screen,&ourScenSel->bImpossible.pos);
SDL_BlitSurface(ourScenSel->bBegin.imgs->ourImages[0].bitmap,NULL,screen,&ourScenSel->bBegin.pos);
SDL_BlitSurface((fromnewgame ? ourScenSel->bBegin : ourScenSel->bLoad).imgs->ourImages[0].bitmap,NULL,screen,&ourScenSel->bBegin.pos);
SDL_BlitSurface(ourScenSel->bBack.imgs->ourImages[0].bitmap,NULL,screen,&ourScenSel->bBack.pos);
//blitAt(ourScenSel->bScens.imgs->ourImages[0].bitmap,ourScenSel->bScens.pos.x,ourScenSel->bScens.pos.y);
//blitAt(ourScenSel->bRandom.imgs->ourImages[0].bitmap,414,105);
@ -1563,7 +1575,7 @@ void CPreGame::showScenSel()
}
else
ourScenSel->mapsel.show();
btns.push_back(&ourScenSel->bBegin);
btns.push_back(&(fromnewgame ? ourScenSel->bBegin : ourScenSel->bLoad));
btns.push_back(&ourScenSel->bBack);
ourScenSel->selectedDiff=1;
@ -2403,6 +2415,7 @@ ScenSel::ScenSel()
bImpossible(genRect(0,0,634,456),NULL,CDefHandler::giveDef("GSPBUT7.DEF"),true,difficulty,4),
bBack(genRect(0,0,584,535),boost::bind(&CPreGame::showNewMenu,CPG),CDefHandler::giveDef("SCNRBACK.DEF")),
bBegin(genRect(0,0,414,535),boost::bind(&CPreGame::begin,CPG),CDefHandler::giveDef("SCNRBEG.DEF")),
bLoad(genRect(0,0,414,535),boost::bind(&CPreGame::begin,CPG),CDefHandler::giveDef("SCNRLOD.DEF")),
bScens(genRect(0,0,414,81),boost::bind(&CPreGame::showScenList,CPG),CDefHandler::giveDef("GSPBUTT.DEF")),
bRandom(genRect(0,0,414,105),boost::bind(&CPreGame::showScenList,CPG),CDefHandler::giveDef("GSPBUTT.DEF")),
bOptions(genRect(0,0,414,509),boost::bind(&CPreGame::showOptions,CPG),CDefHandler::giveDef("GSPBUTT.DEF"))

View File

@ -221,7 +221,7 @@ public:
//RanSel ransel;
MapSel mapsel;
SDL_Surface * background, *scenInf, *scenList, *randMap, *options ;
Button bScens, bOptions, bRandom, bBegin, bBack;
Button bScens, bOptions, bRandom, bBegin, bLoad, bBack;
IntSelBut bEasy, bNormal, bHard, bExpert, bImpossible;
Button * pressed;
std::vector<Mapa> maps;

View File

@ -32,12 +32,14 @@ SharedMem sm;
CClient::CClient(void)
{
IObjectInterface::cb = this;
serv = NULL;
gs = NULL;
cb = NULL;
}
CClient::CClient(CConnection *con, StartInfo *si)
{
IObjectInterface::cb = this;
newGame(con,si);
}
CClient::~CClient(void)
@ -703,7 +705,6 @@ int CClient::getSelectedHero()
void CClient::newGame( CConnection *con, StartInfo *si )
{
timeHandler tmh;
IObjectInterface::cb = this;
CGI->state = new CGameState();
tlog0 <<"\tGamestate: "<<tmh.getDif()<<std::endl;
serv = con;

View File

@ -12,7 +12,7 @@ CArtHandler::CArtHandler()
{
VLC->arth = this;
}
void CArtHandler::loadArtifacts()
void CArtHandler::loadArtifacts(bool onlyTxt)
{
std::vector<ui16> slots;
slots += 17, 16, 15,14,13, 18, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0;
@ -42,7 +42,8 @@ void CArtHandler::loadArtifacts()
nart.aClass = classes[pom[0]];
loadToIt(VLC->generaltexth->artifDescriptions[i],buf,it,3);
nart.id=i;
artifacts.push_back(nart);
if(!onlyTxt)
artifacts.push_back(nart);
}
sortArts();
}

View File

@ -33,7 +33,7 @@ public:
std::vector<CArtifact*> treasures, minors, majors, relics;
std::vector<CArtifact> artifacts;
void loadArtifacts();
void loadArtifacts(bool onlyTxt);
void sortArts();
static int convertMachineID(int id, bool creToArt);
CArtHandler();

View File

@ -1088,7 +1088,7 @@ void CGResource::onHeroVisit( const CGHeroInstance * h ) const
}
else
{
fightForRes(1,h);
fightForRes(0,h);
}
}
else
@ -1116,9 +1116,9 @@ void CGResource::collectRes( int player ) const
cb->removeObject(id);
}
void CGResource::fightForRes(ui32 wantToFight, const CGHeroInstance *h) const
void CGResource::fightForRes(ui32 refusedFight, const CGHeroInstance *h) const
{
if(wantToFight)
if(refusedFight)
return;
cb->startBattleI(h->id,army,pos,boost::bind(&CGResource::endBattle,this,_1,h));

View File

@ -464,7 +464,7 @@ public:
void onHeroVisit(const CGHeroInstance * h) const;
void collectRes(int player) const;
void initObj();
void fightForRes(ui32 wantToFight, const CGHeroInstance *h) const;
void fightForRes(ui32 refusedFight, const CGHeroInstance *h) const;
void endBattle(BattleResult *result, const CGHeroInstance *h) const;
template <typename Handler> void serialize(Handler &h, const int version)

View File

@ -158,7 +158,7 @@ void LibClasses::init()
tlog0 <<"\tHero handler: "<<pomtime.getDif()<<std::endl;
arth = new CArtHandler;
arth->loadArtifacts();
arth->loadArtifacts(false);
tlog0<<"\tArtifact handler: "<<pomtime.getDif()<<std::endl;
creh = new CCreatureHandler();

View File

@ -39,12 +39,13 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & heroh & arth & creh & townh & objh & dobjinfo & buildh & spellh;
if(!h.saving)
{
generaltexth = new CGeneralTextHandler;
generaltexth->load();
arth->loadArtifacts(true);
}
h & heroh & arth & creh & townh & objh & dobjinfo & buildh & spellh;
}
};

2
map.h
View File

@ -226,6 +226,7 @@ class DLL_EXPORT CMapInfo : public CMapHeader
{
public:
std::string filename;
std::string date;
int playerAmnt, humenPlayers;
CMapInfo(){};
void countPlayers();
@ -409,6 +410,7 @@ struct DLL_EXPORT Mapa : public CMapHeader
case 26: //for event objects
SERIALIZE(CGEvent);
break;
case 4: //arena
case 51: //Mercenary Camp
case 23: //Marletto Tower
case 61: // Star Axis

View File

@ -376,7 +376,11 @@ void CMapHandler::initObjectRects()
cr.y = fy<<5; //fy*32
std::pair<CGObjectInstance*,SDL_Rect> toAdd = std::make_pair(map->objects[f],cr);
if((map->objects[f]->pos.x + fx - curd->ourImages[0].bitmap->w/32+1)>=0 && (map->objects[f]->pos.x + fx - curd->ourImages[0].bitmap->w/32+1)<ttiles.size()-Woff && (map->objects[f]->pos.y + fy - curd->ourImages[0].bitmap->h/32+1)>=0 && (map->objects[f]->pos.y + fy - curd->ourImages[0].bitmap->h/32+1)<ttiles[0].size()-Hoff)
if( (map->objects[f]->pos.x + fx - curd->ourImages[0].bitmap->w/32+1) >= 0
&& (map->objects[f]->pos.x + fx - curd->ourImages[0].bitmap->w/32+1) < ttiles.size() - Woff
&& (map->objects[f]->pos.y + fy - curd->ourImages[0].bitmap->h/32+1) >= 0
&& (map->objects[f]->pos.y + fy - curd->ourImages[0].bitmap->h/32+1) < ttiles[0].size() - Hoff
)
{
//TerrainTile2 & curt =
// ttiles
@ -474,14 +478,7 @@ void CMapHandler::init()
}
}
//for(int i=0; i<map->defy.size(); i++)
//{
// map->defy[i]->serial = i;
// processDef(map->defy[i]);
//}
std::for_each(map->defy.begin(),map->defy.end(),processDef); //load h3m defs
//std::for_each(map->defs.begin(),map->defs.end(),processDef); //and non-h3m defs
tlog0<<"\tUnpacking and handling defs: "<<th.getDif()<<std::endl;
for(int i=0;i<PLAYER_LIMIT;i++)
@ -1550,6 +1547,17 @@ CMapHandler::~CMapHandler()
{
delete fullHide;
delete partialHide;
for(int i=0; i < map->defy.size(); i++)
delete map->defy[i];
for(int i=0; i < roadDefs.size(); i++)
delete delete roadDefs[i];
for(int i=0; i < staticRiverDefs.size(); i++)
delete delete staticRiverDefs[i];
//TODO: delete border graphics
}
CMapHandler::CMapHandler()

View File

@ -1512,6 +1512,7 @@ void CGameHandler::moveStack(int stack, int dest)
CGameHandler::CGameHandler(void)
{
gs = NULL;
IObjectInterface::cb = this;
}
CGameHandler::~CGameHandler(void)
@ -1520,7 +1521,6 @@ CGameHandler::~CGameHandler(void)
}
void CGameHandler::init(StartInfo *si, int Seed)
{
IObjectInterface::cb = this;
Mapa *map = new Mapa(si->mapname);
tlog0 << "Map loaded!" << std::endl;
gs = new CGameState();