浏览代码

Development build 0.89b
* Updated changelog
* Some logging I did for #1066

Michał W. Urbańczyk 13 年之前
父节点
当前提交
529394a4e7
共有 2 个文件被更改,包括 36 次插入1 次删除
  1. 24 0
      ChangeLog
  2. 12 1
      client/CPlayerInterface.cpp

+ 24 - 0
ChangeLog

@@ -1,3 +1,27 @@
+0.89 -> 0.next
+GENERAL:
+* New filesystem allowing easier resource adding/replacing
+* Moved many hard-coded settings into text config files
+* Commander level-up dialog
+* New Quest Log window
+
+BATTLES
+* New graphics for Stack Queue
+* Death Stare works identically to H3
+* No explosion when catapult fails to damage the wall
+* Fixed crash when attacking stack dies before counterattack
+* Fixed Orb of Inhibition and Recanter's Cloak (they were incorrectly implemented)
+* Fleeing hero won't lose artifacts.
+* Spellbook won't be captured. 
+
+
+ADVENTURE AI
+* support for quests (Seer Huts, Quest Guardians, and so)
+* AI will now wander with all the heroes that have spare movement points. It should prevent stalling.
+* AI will now understand threat of Abandoned Mine.
+* AI can now exchange armies between heroes. By default, it will pass army to main hero.
+* Fixed strange case when AI found allied town extremely dangerous
+
 0.88 -> 0.89 (Jun 01 2012)
 GENERAL
 * Mostly implemented Commanders feature (missing level-up dialog)

+ 12 - 1
client/CPlayerInterface.cpp

@@ -1177,11 +1177,17 @@ void CPlayerInterface::serialize( CISer<CLoadFile> &h, const int version )
 
 bool CPlayerInterface::moveHero( const CGHeroInstance *h, CGPath path )
 {
+	tlog5 << __FUNCTION__ << std::endl;
 	if(!LOCPLINT->makingTurn)
 		return false;
 	if (!h)
 		return false; //can't find hero
 
+	//It shouldn't be possible to move hero with open dialog (or dialog waiting in bg)
+	if(showingDialog->get() || dialogs.size())
+		return false;
+
+
 	if (adventureInt && adventureInt->isHeroSleeping(h))
 	{
 		adventureInt->sleepWake.clickLeft(true, false);
@@ -1196,9 +1202,12 @@ bool CPlayerInterface::moveHero( const CGHeroInstance *h, CGPath path )
 	{
 		//evil...
 
+		tlog5 << "before [un]locks in " << __FUNCTION__ << std::endl;
 		auto unlockEvents = vstd::makeUnlockGuard(eventsM);
 		auto unlockGs = vstd::makeUnlockSharedGuard(cb->getGsMutex()); //GS mutex is above PIM because CClient::run thread first locks PIM and then GS -> so this way we avoid deadlocks
 		auto unlockPim = vstd::makeUnlockGuard(*pim);
+		tlog5 << "after [un]locks in " << __FUNCTION__ << std::endl;
+		//TODO the above combination works... but it should all be atomic (unlock all three or none)
 
 		{
 			path.convert(0);
@@ -1246,11 +1255,13 @@ bool CPlayerInterface::moveHero( const CGHeroInstance *h, CGPath path )
 				int3 endpos(path.nodes[i-1].coord.x, path.nodes[i-1].coord.y, h->pos.z);
 				bool guarded = CGI->mh->map->isInTheMap(cb->guardingCreaturePosition(endpos - int3(1, 0, 0)));
 
+				tlog5 << "Requesting hero movement to " << endpos << std::endl;
 				cb->moveHero(h,endpos);
 
 				while(stillMoveHero.data != STOP_MOVE  &&  stillMoveHero.data != CONTINUE_MOVE)
 					stillMoveHero.cond.wait(un);
 
+				tlog5 << "Resuming " << __FUNCTION__ << std::endl;
 				if (guarded) // Abort movement if a guard was fought.
 					break;
 			}
@@ -1336,7 +1347,7 @@ void CPlayerInterface::showArtifactAssemblyDialog (ui32 artifactID, ui32 assembl
 void CPlayerInterface::requestRealized( PackageApplied *pa )
 {
 	EVENT_HANDLER_CALLED_BY_CLIENT;
-	if(stillMoveHero.get() == DURING_MOVE)
+	if(pa->packType == typeList.getTypeID<MoveHero>()  &&  stillMoveHero.get() == DURING_MOVE)
 		stillMoveHero.setn(CONTINUE_MOVE);
 }