瀏覽代碼

* saving and resuming games should work!
(loading from the main menu, saving using "save [NAME]" command)

Michał W. Urbańczyk 17 年之前
父節點
當前提交
b895fa35cb
共有 15 個文件被更改,包括 81 次插入29 次删除
  1. 22 6
      CAdvmapInterface.cpp
  2. 2 0
      CAdvmapInterface.h
  3. 8 0
      CPlayerInterface.cpp
  4. 16 3
      CPreGame.cpp
  5. 1 1
      CPreGame.h
  6. 2 1
      client/Client.cpp
  7. 3 2
      hch/CArtHandler.cpp
  8. 1 1
      hch/CArtHandler.h
  9. 3 3
      hch/CObjectHandler.cpp
  10. 1 1
      hch/CObjectHandler.h
  11. 1 1
      lib/VCMI_Lib.cpp
  12. 2 1
      lib/VCMI_Lib.h
  13. 2 0
      map.h
  14. 16 8
      mapHandler.cpp
  15. 1 1
      server/CGameHandler.cpp

+ 22 - 6
CAdvmapInterface.cpp

@@ -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()
 {
 }

+ 2 - 0
CAdvmapInterface.h

@@ -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();

+ 8 - 0
CPlayerInterface.cpp

@@ -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)
 {

+ 16 - 3
CPreGame.cpp

@@ -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"))

+ 1 - 1
CPreGame.h

@@ -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;

+ 2 - 1
client/Client.cpp

@@ -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;

+ 3 - 2
hch/CArtHandler.cpp

@@ -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();
 }

+ 1 - 1
hch/CArtHandler.h

@@ -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();

+ 3 - 3
hch/CObjectHandler.cpp

@@ -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));

+ 1 - 1
hch/CObjectHandler.h

@@ -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)

+ 1 - 1
lib/VCMI_Lib.cpp

@@ -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();

+ 2 - 1
lib/VCMI_Lib.h

@@ -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 - 0
map.h

@@ -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

+ 16 - 8
mapHandler.cpp

@@ -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()

+ 1 - 1
server/CGameHandler.cpp

@@ -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();