Browse Source

* enter can be used to open window with selected hero/town
* fixed slider behavior when showing less maps/games than available slots
* added a few missing sounds for creatures
* fixed problems with artifacts info caused by bug in serialization
* fixed bug in Scholar's serializetion
* all stacks features will be serialized (should fix problems with missing premies from artifacts)
* proper serialization of HeroBonus, fixes some problems/crashes
* resource silos won't give resources on the first day
* fixed problems with removing artifacts when all visiblebackpack slots are full

Michał W. Urbańczyk 16 years ago
parent
commit
cff70406f1

+ 10 - 0
client/CAdvmapInterface.cpp

@@ -1534,6 +1534,16 @@ void CAdvMapInt::keyPressed(const SDL_KeyboardEvent & key)
 			}
 			}
 		}
 		}
 		return;
 		return;
+	case SDLK_RETURN:
+		{
+			if(!active || !selection || key.state != SDL_PRESSED) 
+				return;
+			if(selection->ID == 34)
+				LOCPLINT->openHeroWindow(static_cast<const CGHeroInstance*>(selection));
+			else if(selection->ID == 98)
+				LOCPLINT->openTownWindow(static_cast<const CGTownInstance*>(selection));
+			return;
+		}
 	default: 
 	default: 
 		return;
 		return;
 	}
 	}

+ 5 - 1
client/CCastleInterface.cpp

@@ -127,6 +127,10 @@ void CBuildingRect::hover(bool on)
 		{
 		{
 			LOCPLINT->castleInt->hBuild = NULL;
 			LOCPLINT->castleInt->hBuild = NULL;
 			LOCPLINT->statusbar->clear();
 			LOCPLINT->statusbar->clear();
+
+			//call mouseMoved in other buildings, cursor might have been moved while they were inactive (eg. because of r-click popup)
+			for(size_t i = 0; i < LOCPLINT->castleInt->buildings.size(); i++)
+				LOCPLINT->castleInt->buildings[i]->mouseMoved(LOCPLINT->current->motion);
 		}
 		}
 	}
 	}
 }
 }
@@ -166,7 +170,7 @@ void CBuildingRect::clickRight (tribool down)
 }
 }
 void CBuildingRect::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 void CBuildingRect::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 {
-	if(area)
+	if(area && isItIn(&pos,sEvent.x, sEvent.y))
 	{
 	{
 		if(CSDL_Ext::SDL_GetPixel(area,sEvent.x-pos.x,sEvent.y-pos.y) == 0) //hovered pixel is inside this building
 		if(CSDL_Ext::SDL_GetPixel(area,sEvent.x-pos.x,sEvent.y-pos.y) == 0) //hovered pixel is inside this building
 		{
 		{

+ 8 - 33
client/CHeroWindow.cpp

@@ -710,7 +710,7 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
 	{
 	{
 		if(ourArt && ourArt->id == 0)
 		if(ourArt && ourArt->id == 0)
 			return; //this is handled separately
 			return; //this is handled separately
-		if(!ourWindow->activeArtPlace) //nothing has benn clicked
+		if(!ourWindow->activeArtPlace) //nothing has bewn clicked
 		{
 		{
 			if(ourArt) //to prevent selecting empty slots (bugfix to what GrayFace reported)
 			if(ourArt) //to prevent selecting empty slots (bugfix to what GrayFace reported)
 			{
 			{
@@ -720,47 +720,22 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
 		}
 		}
 		else //perform artifact substitution
 		else //perform artifact substitution
 		{
 		{
-			//chceck if swap is possible
-			if(this->fitsHere(ourWindow->activeArtPlace->ourArt) && ourWindow->activeArtPlace->fitsHere(this->ourArt))
+			if(slotID >= 19)	//we are an backpack slot - remove active artifact and put it to the last free pos in backpack
+			{					//TODO: putting artifacts in the middle of backpack (pushing following arts)
+				
+				LOCPLINT->cb->swapArtifacts(ourWindow->curHero,ourWindow->activeArtPlace->slotID,ourWindow->curHero,ourWindow->curHero->artifacts.size()+19);
+			}
+			//check if swap is possible
+			else if(this->fitsHere(ourWindow->activeArtPlace->ourArt) && ourWindow->activeArtPlace->fitsHere(this->ourArt))
 			{
 			{
 				int destSlot = slotID,
 				int destSlot = slotID,
 					srcSlot = ourWindow->activeArtPlace->slotID;
 					srcSlot = ourWindow->activeArtPlace->slotID;
 
 
 				LOCPLINT->cb->swapArtifacts(ourWindow->curHero,destSlot,ourWindow->curHero,srcSlot);
 				LOCPLINT->cb->swapArtifacts(ourWindow->curHero,destSlot,ourWindow->curHero,srcSlot);
 
 
-				//const CArtifact * pmh = ourArt;
-				//ourArt = ourWindow->activeArtPlace->ourArt;
-				//ourWindow->activeArtPlace->ourArt = pmh;
-
-				////set texts
-				//if(pmh)
-				//	ourWindow->activeArtPlace->text = pmh->Description();
-				//else
-				//	ourWindow->activeArtPlace->text = std::string();
-				//if(ourArt)
-				//	text = ourArt->Description();
-				//else
-				//	text = std::string();
-
 				ourWindow->activeArtPlace->clicked = false;
 				ourWindow->activeArtPlace->clicked = false;
 				ourWindow->activeArtPlace = NULL;
 				ourWindow->activeArtPlace = NULL;
 			}
 			}
-			else
-			{
-				int backID = -1;
-				for(size_t g=0; g<ourWindow->backpack.size(); ++g)
-				{
-					if(ourWindow->backpack[g]==this) //if user wants to put something to backpack
-					{
-						backID = g;
-						break;
-					}
-				}
-				if(backID>=0) //put to backpack
-				{
-					LOCPLINT->cb->swapArtifacts(ourWindow->curHero,ourWindow->activeArtPlace->slotID,ourWindow->curHero,ourWindow->curHero->artifacts.size()+19);
-				}
-			}
 		}
 		}
 	}
 	}
 	else if(!down && clicked)
 	else if(!down && clicked)

+ 6 - 2
client/CPreGame.cpp

@@ -189,7 +189,11 @@ void Button::select(bool on)
 
 
 void Slider::updateSlid()
 void Slider::updateSlid()
 {
 {
-	float perc = ((float)whereAreWe)/((float)positionsAmnt-capacity);
+	float perc = -1.0f;
+	if(positionsAmnt > capacity)
+		perc = ((float)whereAreWe)/((float)positionsAmnt-capacity);
+	else
+		perc = 0;
 	float myh;
 	float myh;
 	if (vertical)
 	if (vertical)
 	{
 	{
@@ -1570,7 +1574,7 @@ void CPreGame::printMapsFrom(int from)
 }
 }
 void CPreGame::showScenList()
 void CPreGame::showScenList()
 {
 {
-	if (currentTab!=&ourScenSel->mapsel)
+	if (currentTab != &ourScenSel->mapsel)
 	{
 	{
 		ourScenSel->listShowed=true;
 		ourScenSel->listShowed=true;
 		ourScenSel->mapsel.show();
 		ourScenSel->mapsel.show();

+ 3 - 14
config/cr_sounds.txt

@@ -100,6 +100,7 @@ Nosferatu NOSFATTK.wav NOSFDFND.wav NOSFKILL.wav NOSFMOVE.wav NOSFSHOT.wav NOSFW
 ObsidianGargoyle OGRGATTK.wav OGRGDFND.wav OGRGKILL.wav OGRGMOVE.wav invalid OGRGWNCE.wav
 ObsidianGargoyle OGRGATTK.wav OGRGDFND.wav OGRGKILL.wav OGRGMOVE.wav invalid OGRGWNCE.wav
 Ogre OGREATTK.wav OGREDFND.wav OGREKILL.wav OGREMOVE.wav invalid OGREWNCE.wav
 Ogre OGREATTK.wav OGREDFND.wav OGREKILL.wav OGREMOVE.wav invalid OGREWNCE.wav
 OgreMage OGRMATTK.wav OGRMDFND.wav OGRMKILL.wav OGRMMOVE.wav OGRMSHOT.wav OGRMWNCE.wav
 OgreMage OGRMATTK.wav OGRMDFND.wav OGRMKILL.wav OGRMMOVE.wav OGRMSHOT.wav OGRMWNCE.wav
+OgreShaman TRLLATTK.wav TRLLDFND.wav TRLLKILL.wav TRLLMOVE.wav invalid TRLLWNCE.wav
 Orc OORCATTK.wav OORCDFND.wav OORCKILL.wav OORCMOVE.wav OORCSHOT.wav OORCWNCE.wav
 Orc OORCATTK.wav OORCDFND.wav OORCKILL.wav OORCMOVE.wav OORCSHOT.wav OORCWNCE.wav
 OrcChieftain ORCCATTK.wav ORCCDFND.wav ORCCKILL.wav ORCCMOVE.wav ORCCSHOT.wav ORCCWNCE.wav
 OrcChieftain ORCCATTK.wav ORCCDFND.wav ORCCKILL.wav ORCCMOVE.wav ORCCSHOT.wav ORCCWNCE.wav
 Peasant PSNTATTK.wav PSNTDFND.wav PSNTKILL.wav PSNTMOVE.wav invalid PSNTWNCE.wav
 Peasant PSNTATTK.wav PSNTDFND.wav PSNTKILL.wav PSNTMOVE.wav invalid PSNTWNCE.wav
@@ -123,6 +124,7 @@ Single-HornedDemon SHDMATTK.wav SHDMDFND.wav SHDMKILL.wav SHDMMOVE.wav invalid S
 Skeleton SKELATTK.wav SKELDFND.wav SKELKILL.wav SKELMOVE.wav invalid SKELWNCE.wav
 Skeleton SKELATTK.wav SKELDFND.wav SKELKILL.wav SKELMOVE.wav invalid SKELWNCE.wav
 SkeletonWarrior SKLWATTK.wav SKLWDFND.wav SKLWKILL.wav SKLWMOVE.wav invalid SKLWWNCE.wav
 SkeletonWarrior SKLWATTK.wav SKLWDFND.wav SKLWKILL.wav SKLWMOVE.wav invalid SKLWWNCE.wav
 Sprite SPRTATTK.wav SPRTDFND.wav SPRTKILL.wav SPRTMOVE.wav invalid SPRTWNCE.wav
 Sprite SPRTATTK.wav SPRTDFND.wav SPRTKILL.wav SPRTMOVE.wav invalid SPRTWNCE.wav
+StoneElemental MAGMATTK.wav MAGMDFND.wav MAGMKILL.wav MAGMMOVE.wav invalid MAGMWNCE.wav
 StoneGargoyle SGRGATTK.wav SGRGDFND.wav SGRGKILL.wav SGRGMOVE.wav invalid SGRGWNCE.wav
 StoneGargoyle SGRGATTK.wav SGRGDFND.wav SGRGKILL.wav SGRGMOVE.wav invalid SGRGWNCE.wav
 StoneGolem SGLMATTK.wav SGLMDFND.wav SGLMKILL.wav SGLMMOVE.wav invalid SGLMWNCE.wav
 StoneGolem SGLMATTK.wav SGLMDFND.wav SGLMKILL.wav SGLMMOVE.wav invalid SGLMWNCE.wav
 StormElemental STORATTK.wav STORDFND.wav STORKILL.wav STORMOVE.wav STORSHOT.wav STORWNCE.wav
 StormElemental STORATTK.wav STORDFND.wav STORKILL.wav STORMOVE.wav STORSHOT.wav STORWNCE.wav
@@ -132,6 +134,7 @@ Treefolk TREEATTK.wav TREEDFND.wav TREEKILL.wav TREEMOVE.wav invalid TREEWNCE.wa
 Troglodyte TROGATTK.wav TROGDFND.wav TROGKILL.wav TROGMOVE.wav invalid TROGWNCE.wav
 Troglodyte TROGATTK.wav TROGDFND.wav TROGKILL.wav TROGMOVE.wav invalid TROGWNCE.wav
 Unicorn UNICATTK.wav UNICDFND.wav UNICKILL.wav UNICMOVE.wav invalid UNICWNCE.wav
 Unicorn UNICATTK.wav UNICDFND.wav UNICKILL.wav UNICMOVE.wav invalid UNICWNCE.wav
 Vampire VAMPATTK.wav VAMPDFND.wav VAMPKILL.wav VAMPMOVE.wav invalid VAMPWNCE.wav VAMPEXT1.wav VAMPEXT2.wav
 Vampire VAMPATTK.wav VAMPDFND.wav VAMPKILL.wav VAMPMOVE.wav invalid VAMPWNCE.wav VAMPEXT1.wav VAMPEXT2.wav
+warrior NMADATTK.wav NMADDFND.wav NMADKILL.wav NMADMOVE.wav invalid NMADWNCE.wav
 WarUnicorn WUNCATTK.wav WUNCDFND.wav WUNCKILL.wav WUNCMOVE.wav WUNCSHOT.wav WUNCWNCE.wav
 WarUnicorn WUNCATTK.wav WUNCDFND.wav WUNCKILL.wav WUNCMOVE.wav WUNCSHOT.wav WUNCWNCE.wav
 WaterElemental WELMATTK.wav WELMDFND.wav WELMKILL.wav WELMMOVE.wav invalid WELMWNCE.wav
 WaterElemental WELMATTK.wav WELMDFND.wav WELMKILL.wav WELMMOVE.wav invalid WELMWNCE.wav
 Wight WGHTATTK.wav WGHTDFND.wav WGHTKILL.wav WGHTMOVE.wav invalid WGHTWNCE.wav
 Wight WGHTATTK.wav WGHTDFND.wav WGHTKILL.wav WGHTMOVE.wav invalid WGHTWNCE.wav
@@ -144,23 +147,9 @@ Zealot ZELTATTK.wav ZELTDFND.wav ZELTKILL.wav ZELTMOVE.wav ZELTSHOT.wav ZELTWNCE
 Zombie ZOMBATTK.wav ZOMBDFND.wav ZOMBKILL.wav ZOMBMOVE.wav invalid ZOMBWNCE.wav
 Zombie ZOMBATTK.wav ZOMBDFND.wav ZOMBKILL.wav ZOMBMOVE.wav invalid ZOMBWNCE.wav
 ZombieLord ZMBLATTK.wav ZMBLDFND.wav ZMBLKILL.wav ZMBLMOVE.wav invalid ZMBLWNCE.wav
 ZombieLord ZMBLATTK.wav ZMBLDFND.wav ZMBLKILL.wav ZMBLMOVE.wav invalid ZMBLWNCE.wav
 
 
-# todo - troll ?
-# TRLLATTK.wav TRLLDFND.wav TRLLKILL.wav TRLLMOVE.wav invalid TRLLWNCE.wav
 
 
-# todo - nomad ?
-# NMADATTK.wav NMADDFND.wav NMADKILL.wav NMADMOVE.wav invalid NMADWNCE.wav
 
 
-# todo - magma ?
-# MAGMATTK.wav MAGMDFND.wav MAGMKILL.wav MAGMMOVE.wav invalid MAGMWNCE.wav
-
-
-# Missing entries
-# 125 StoneElemental
-# 128 FireElemental
-# 129 FireElemental
 # 137 Sharpshooter
 # 137 Sharpshooter
-# 142 warrior
-# 144 OgreShaman
 # 149 ArrowTower
 # 149 ArrowTower
 # 150 SupremeArchangel
 # 150 SupremeArchangel
 # 151 DiamondDragon
 # 151 DiamondDragon

+ 1 - 3
config/crerefnam.txt

@@ -131,10 +131,8 @@
 123	IceElemental
 123	IceElemental
 124	NOTUSED
 124	NOTUSED
 125	StoneElemental
 125	StoneElemental
-126	ElectricityElemental
 127	StormElemental
 127	StormElemental
-128	FireElemental
-129	FireElemental
+129	ElectricityElemental
 130	Firebird
 130	Firebird
 131	Pheonix
 131	Pheonix
 132	AzureDragon
 132	AzureDragon

+ 11 - 1
hch/CArtHandler.cpp

@@ -78,7 +78,8 @@ void CArtHandler::loadArtifacts(bool onlyTxt)
 			artifacts.push_back(nart);
 			artifacts.push_back(nart);
 	}
 	}
 	sortArts();
 	sortArts();
-	addBonuses();
+	if(!onlyTxt)
+		addBonuses();
 }
 }
 
 
 int CArtHandler::convertMachineID(int id, bool creToArt )
 int CArtHandler::convertMachineID(int id, bool creToArt )
@@ -319,3 +320,12 @@ void CArtHandler::addBonuses()
 	giveArtBonus(125,HeroBonus::ENEMY_CANT_ESCAPE,0); //Shackles of War
 	giveArtBonus(125,HeroBonus::ENEMY_CANT_ESCAPE,0); //Shackles of War
 	giveArtBonus(126,HeroBonus::BLOCK_SPELLS_ABOVE_LEVEL,0);//Orb of Inhibition
 	giveArtBonus(126,HeroBonus::BLOCK_SPELLS_ABOVE_LEVEL,0);//Orb of Inhibition
 }
 }
+
+void CArtHandler::clear()
+{
+	artifacts.clear();
+	treasures.clear();
+	minors.clear();
+	majors.clear();
+	relics.clear();
+}

+ 1 - 0
hch/CArtHandler.h

@@ -47,6 +47,7 @@ public:
 	void loadArtifacts(bool onlyTxt);
 	void loadArtifacts(bool onlyTxt);
 	void sortArts();
 	void sortArts();
 	void addBonuses();
 	void addBonuses();
+	void clear();
 	static int convertMachineID(int id, bool creToArt);
 	static int convertMachineID(int id, bool creToArt);
 	CArtHandler();
 	CArtHandler();
 
 

+ 11 - 1
hch/CMusicHandler.cpp

@@ -168,7 +168,17 @@ void CSoundHandler::initCreaturesSounds(std::vector<CCreature> &creatures)
 
 
 		if (str.good() || (str.eof() && wince != ""))
 		if (str.good() || (str.eof() && wince != ""))
 		{
 		{
-			int id = CGI->creh->nameToID[cname];
+			int id = -1;
+
+			std::map<std::string,int>::iterator i = CGI->creh->nameToID.find(cname);
+			if(i != CGI->creh->nameToID.end())
+				id = i->second;
+			else
+			{
+				tlog1 << "Sound info for an unknown creature: " << cname << std::endl;
+				continue;
+			}
+
 			CCreature &c = creatures[id];
 			CCreature &c = creatures[id];
 
 
 			if (c.sounds.killed != soundBase::invalid)
 			if (c.sounds.killed != soundBase::invalid)

+ 1 - 1
hch/CObjectHandler.h

@@ -504,7 +504,7 @@ public:
 	template <typename Handler> void serialize(Handler &h, const int version)
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 	{
 		h & static_cast<CGObjectInstance&>(*this);
 		h & static_cast<CGObjectInstance&>(*this);
-		h & bonusType & id;
+		h & bonusType & bonusID;
 	}
 	}
 };
 };
 
 

+ 2 - 5
lib/CGameState.h

@@ -154,9 +154,6 @@ public:
 	ui16 position; //position on battlefield
 	ui16 position; //position on battlefield
 	ui8 counterAttacks; //how many counter attacks can be performed more in this turn (by default set at the beginning of the round to 1)
 	ui8 counterAttacks; //how many counter attacks can be performed more in this turn (by default set at the beginning of the round to 1)
 	si16 shots; //how many shots left
 	si16 shots; //how many shots left
-	//ui8 speed; //speed of stack with hero bonus
-	//si32 attack; //attack of stack with hero bonus
-	//si32 defense; //defense of stack with hero bonus
 	si8 morale, luck; //base stack luck/morale
 	si8 morale, luck; //base stack luck/morale
 
 
 	std::vector<StackFeature> features;
 	std::vector<StackFeature> features;
@@ -195,12 +192,12 @@ public:
 		ui32 id;
 		ui32 id;
 		h & id;
 		h & id;
 		creature = &VLC->creh->creatures[id];
 		creature = &VLC->creh->creatures[id];
-		features = creature->abilities;
+		//features = creature->abilities;
 	}
 	}
 	template <typename Handler> void serialize(Handler &h, const int version)
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 	{
 		h & ID & amount & baseAmount & firstHPleft & owner & slot & attackerOwned & position & state & counterAttacks
 		h & ID & amount & baseAmount & firstHPleft & owner & slot & attackerOwned & position & state & counterAttacks
-			& shots & morale & luck;
+			& shots & morale & luck & features;
 		if(h.saving)
 		if(h.saving)
 			save(h,version);
 			save(h,version);
 		else
 		else

+ 1 - 1
lib/HeroBonus.h

@@ -66,7 +66,7 @@ struct DLL_EXPORT HeroBonus
 	}
 	}
 	template <typename Handler> void serialize(Handler &h, const int version)
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 	{
-		h & duration & type & source & val & id & description;
+		h & duration & type & subtype & source & val & id & description;
 	}
 	}
 
 
 	static bool OneDay(const HeroBonus &hb)
 	static bool OneDay(const HeroBonus &hb)

+ 3 - 3
lib/StackFeature.h

@@ -76,9 +76,9 @@ struct StackFeature
 		SPELL_EFFECT
 		SPELL_EFFECT
 	};
 	};
 
 
-	ECombatFeatures type;
-	EDuration duration;
-	ESource source;
+	ui8 type;//ECombatFeatures
+	ui8 duration;//EDuration
+	ui8 source;//ESource
 	ui16 turnsRemain; //if duration is N_TURNS it describes how long the effect will last
 	ui16 turnsRemain; //if duration is N_TURNS it describes how long the effect will last
 	si16 subtype; //subtype of bonus/feature
 	si16 subtype; //subtype of bonus/feature
 	si32 value;
 	si32 value;

+ 2 - 2
server/CGameHandler.cpp

@@ -690,7 +690,7 @@ void CGameHandler::newTurn()
 		}
 		}
 		for(std::vector<CGTownInstance *>::iterator j=i->second.towns.begin();j!=i->second.towns.end();j++)//handle towns
 		for(std::vector<CGTownInstance *>::iterator j=i->second.towns.begin();j!=i->second.towns.end();j++)//handle towns
 		{
 		{
-			if(vstd::contains((**j).builtBuildings,15)) //there is resource silo
+			if(gs->day && vstd::contains((**j).builtBuildings,15)) //not first day and there is resource silo
 			{
 			{
 				if((**j).town->primaryRes == 127) //we'll give wood and ore
 				if((**j).town->primaryRes == 127) //we'll give wood and ore
 				{
 				{
@@ -718,7 +718,7 @@ void CGameHandler::newTurn()
 				}
 				}
 				n.cres.push_back(sac);
 				n.cres.push_back(sac);
 			}
 			}
-			if((gs->day) && i->first<PLAYER_LIMIT)//not the first day and town not neutral
+			if(gs->day  &&  i->first<PLAYER_LIMIT)//not the first day and town not neutral
 				r.res[6] += (**j).dailyIncome();
 				r.res[6] += (**j).dailyIncome();
 		}
 		}
 		n.res.push_back(r);
 		n.res.push_back(r);