瀏覽代碼

Version set to 0.8. (not release yet, waiting for a few more fixes)
* fixed possible crash on visiting Obelisk
* fixed #394, #391, #395, #373

Michał W. Urbańczyk 15 年之前
父節點
當前提交
9e6d3a4453
共有 8 個文件被更改,包括 54 次插入11 次删除
  1. 3 1
      client/CPlayerInterface.cpp
  2. 25 5
      client/CPreGame.cpp
  3. 6 0
      client/NetPacksClient.cpp
  4. 4 3
      global.h
  5. 4 0
      lib/CGameState.cpp
  6. 1 1
      lib/NetPacks.h
  7. 4 0
      lib/map.cpp
  8. 7 1
      server/CGameHandler.cpp

+ 3 - 1
client/CPlayerInterface.cpp

@@ -418,7 +418,8 @@ void CPlayerInterface::heroManaPointsChanged(const CGHeroInstance * hero)
 void CPlayerInterface::heroMovePointsChanged(const CGHeroInstance * hero)
 {
 	boost::unique_lock<boost::recursive_mutex> un(*pim);
-	//adventureInt->heroList.draw();
+	if(makingTurn && hero->tempOwner == playerID)
+		adventureInt->heroList.redraw();
 }
 void CPlayerInterface::receivedResource(int type, int val)
 {
@@ -1797,6 +1798,7 @@ void CPlayerInterface::playerBonusChanged( const HeroBonus &bonus, bool gain )
 void CPlayerInterface::showPuzzleMap()
 {
 	waitWhileDialog();
+	boost::unique_lock<boost::recursive_mutex> un(*pim);
 
 	//TODO: interface should not know the real position of Grail...
 	float ratio = 0;

+ 25 - 5
client/CPreGame.cpp

@@ -109,8 +109,17 @@ void CMapInfo::mapInit(const std::string &fname, const unsigned char *map )
 	mapHeader = new CMapHeader();
 	mapHeader->version = CMapHeader::invalid;
 
-	mapHeader->initFromMemory(map, i);
-	countPlayers();
+	try
+	{
+		mapHeader->initFromMemory(map, i);
+		countPlayers();
+	}
+	catch (const std::string &e)
+	{
+		tlog1 << "\t\tWarning: evil map file: " << fname << ": " << e << std::endl; 
+		delete mapHeader;
+		mapHeader = NULL;
+	}
 }
 
 CMapInfo::~CMapInfo()
@@ -567,9 +576,20 @@ void SelectionTab::getFiles(std::vector<FileInfo> &out, const std::string &dirna
 		if(fs::is_regular_file(file->status())
 			&& boost::ends_with(file->path().filename(), ext))
 		{
-			out.resize(out.size()+1);
-			out.back().date = fs::last_write_time(file->path());
-			out.back().name = file->path().string();
+			std::time_t date = 0;
+			try
+			{
+				date = fs::last_write_time(file->path());
+
+				out.resize(out.size()+1);
+				out.back().date = date;
+				out.back().name = file->path().string();
+			}
+			catch(...)
+			{
+				tlog2 << "\t\tWarning: very corrupted map file: " << file->path().string() << std::endl; 
+			}
+
 		}
 	}
 

+ 6 - 0
client/NetPacksClient.cpp

@@ -87,6 +87,12 @@ void SetMana::applyCl( CClient *cl )
 void SetMovePoints::applyCl( CClient *cl )
 {
 	CGHeroInstance *h = GS(cl)->getHero(hid);
+
+	if (cl->IGameCallback::getSelectedHero(LOCPLINT->playerID) == h)//if we have selected that hero
+	{
+		GS(cl)->calculatePaths(h, *cl->pathInfo);
+	}
+
 	if(vstd::contains(cl->playerint,h->tempOwner))
 		cl->playerint[h->tempOwner]->heroMovePointsChanged(h);
 }

+ 4 - 3
global.h

@@ -2,6 +2,7 @@
 #define __GLOBAL_H__
 #include <iostream>
 #include <algorithm> //std::find
+#include <string> //std::find
 #include <boost/logic/tribool.hpp>
 using boost::logic::tribool;
 #include <boost/cstdint.hpp>
@@ -20,7 +21,7 @@ typedef boost::int8_t si8; //signed int 8 bits (1 byte)
 #define THC
 #endif
 
-#define NAME_VER ("VCMI 0.75e")
+#define NAME_VER ("VCMI 0.8")
 extern std::string NAME; //full name
 extern std::string NAME_AFFIX; //client / server
 #define CONSOLE_LOGGING_LEVEL 5
@@ -353,10 +354,10 @@ extern DLL_EXPORT CLogger<5> tlog5; //gray - minor log info
 		tlog1 << e.what() << std::endl;	\
 		throw;							\
 	}									\
-	catch (const std::exception * e)	\
+	catch (const std::string &e)	\
 	{									\
 		COMMAND;						\
-		tlog1 << e->what()<< std::endl;	\
+		tlog1 << e << std::endl;	\
 		throw;							\
 	}
 

+ 4 - 0
lib/CGameState.cpp

@@ -182,6 +182,10 @@ void MetaString::getLocalString(const std::pair<ui8,ui32> &txt, std::string &dst
 	{
 		dst = VLC->creh->creatures[ser].nameSing;
 	}
+	else if(type == ART_DESCR)
+	{
+		dst = VLC->arth->artifacts[ser].Description();
+	}
 	else
 	{
 		std::vector<std::string> *vec;

+ 1 - 1
lib/NetPacks.h

@@ -73,7 +73,7 @@ private:
 	enum EMessage {TEXACT_STRING, TLOCAL_STRING, TNUMBER, TREPLACE_ESTRING, TREPLACE_LSTRING, TREPLACE_NUMBER};
 public:
 	enum {GENERAL_TXT=1, XTRAINFO_TXT, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES, 
-		MINE_EVNTS, ADVOB_TXT, ART_EVNTS, SPELL_NAME, SEC_SKILL_NAME, CRE_SING_NAMES, CREGENS4, COLOR};
+		MINE_EVNTS, ADVOB_TXT, ART_EVNTS, SPELL_NAME, SEC_SKILL_NAME, CRE_SING_NAMES, CREGENS4, COLOR, ART_DESCR};
 
 	std::vector<ui8> message; //vector of EMessage
 

+ 4 - 0
lib/map.cpp

@@ -195,6 +195,10 @@ CMapHeader::CMapHeader()
 void CMapHeader::initFromMemory( const unsigned char *bufor, int &i )
 {
 	version = (Eformat)(readNormalNr(bufor,i)); i+=4; //map version
+	if(version != RoE && version != AB && version != SoD && version != WoG)
+	{
+		throw std::string("Invalid map format!");
+	}
 	areAnyPLayers = readChar(bufor,i); //invalid on some maps
 	height = width = (readNormalNr(bufor,i)); i+=4; // dimensions of map
 	twoLevel = readChar(bufor,i); //if there is underground

+ 7 - 1
server/CGameHandler.cpp

@@ -4059,15 +4059,21 @@ bool CGameHandler::dig( const CGHeroInstance *h )
 	if(gs->map->grailPos == h->getPosition())
 	{
 		iw.text.addTxt(MetaString::GENERAL_TXT, 58); //"Congratulations! After spending many hours digging here, your hero has uncovered the "
+		iw.text.addTxt(MetaString::ART_NAMES, 2);
 		iw.soundID = soundBase::ULTIMATEARTIFACT;
 		giveHeroArtifact(2, h->id, -1); //give grail
+		sendAndApply(&iw);
+
+		iw.text.clear();
+		iw.text.addTxt(MetaString::ART_DESCR, 2);
+		sendAndApply(&iw);
 	}
 	else
 	{
 		iw.text.addTxt(MetaString::GENERAL_TXT, 59); //"Nothing here. \n Where could it be?"
 		iw.soundID = soundBase::Dig;
+		sendAndApply(&iw);
 	}
-	sendAndApply(&iw);
 
 	return true;
 }