Selaa lähdekoodia

function to set palyer's color on flags, small improvements in CHeroHandler (e.g. removing nodrze and initializing hero's classes)

mateuszb 18 vuotta sitten
vanhempi
sitoutus
b65f1dae0f
5 muutettua tiedostoa jossa 80 lisäystä ja 26 poistoa
  1. 5 5
      CAmbarCendamo.cpp
  2. 58 18
      CHeroHandler.cpp
  3. 6 3
      CHeroHandler.h
  4. 10 0
      SDL_Extensions.cpp
  5. 1 0
      SDL_Extensions.h

+ 5 - 5
CAmbarCendamo.cpp

@@ -293,9 +293,9 @@ void CAmbarCendamo::deh3m()
 			if((i-ist)*8+yy < CGameInfo::mainObj->heroh->heroes.size())
 			{
 				if(c == (c|((unsigned char)intPow(2, yy))))
-					CGameInfo::mainObj->heroh->heroes[(i-ist)*8+yy].isAllowed = true;
+					CGameInfo::mainObj->heroh->heroes[(i-ist)*8+yy]->isAllowed = true;
 				else
-					CGameInfo::mainObj->heroh->heroes[(i-ist)*8+yy].isAllowed = false;
+					CGameInfo::mainObj->heroh->heroes[(i-ist)*8+yy]->isAllowed = false;
 			}
 		}
 	}
@@ -564,7 +564,7 @@ void CAmbarCendamo::deh3m()
 				spec->bytes[2] = bufor[i]; ++i;
 				spec->bytes[3] = bufor[i]; ++i;
 				spec->player = bufor[i]; ++i;
-				spec->type = &(CGameInfo::mainObj->heroh->heroes[readNormalNr(i, 1)]); ++i;
+				spec->type = CGameInfo::mainObj->heroh->heroes[readNormalNr(i, 1)]; ++i;
 				bool isName = bufor[i]; ++i; //true if hero has nonstandard name
 				if(isName)
 				{
@@ -978,7 +978,7 @@ void CAmbarCendamo::deh3m()
 				case 8:
 					{
 						int heroType = bufor[i]; ++i;
-						spec->m8hero = &(CGameInfo::mainObj->heroh->heroes[heroType]);
+						spec->m8hero = CGameInfo::mainObj->heroh->heroes[heroType];
 						int limit = readNormalNr(i); i+=4;
 						if(limit == ((int)0xffffffff))
 						{
@@ -1629,7 +1629,7 @@ void CAmbarCendamo::deh3m()
 				case 8:
 					{
 						int heroType = bufor[i]; ++i;
-						spec->m8hero = &(CGameInfo::mainObj->heroh->heroes[heroType]);
+						spec->m8hero = CGameInfo::mainObj->heroh->heroes[heroType];
 						int limit = readNormalNr(i); i+=4;
 						if(limit == ((int)0xffffffff))
 						{

+ 58 - 18
CHeroHandler.cpp

@@ -14,9 +14,40 @@ void CHeroHandler::loadHeroes()
 		inp>>dump;
 	}
 	inp.ignore();
+	int numberOfCurrentClassHeroes = 0;
+	int currentClass = 0;
+	int additHero = 0;
+	EHeroClasses addTab[12];
+	addTab[0] = HERO_KNIGHT;
+	addTab[1] = HERO_WITCH;
+	addTab[2] = HERO_KNIGHT;
+	addTab[3] = HERO_WIZARD;
+	addTab[4] = HERO_RANGER;
+	addTab[5] = HERO_BARBARIAN;
+	addTab[6] = HERO_DEATHKNIGHT;
+	addTab[7] = HERO_WARLOCK;
+	addTab[8] = HERO_KNIGHT;
+	addTab[9] = HERO_WARLOCK;
+	addTab[10] = HERO_BARBARIAN;
+	addTab[11] = HERO_DEMONIAC;
+
 	while(!inp.eof())
 	{
-		CHero nher;
+		CHero * nher = new CHero;
+		if(currentClass<18)
+		{
+			nher->heroType = (EHeroClasses)currentClass;
+			++numberOfCurrentClassHeroes;
+			if(numberOfCurrentClassHeroes==8)
+			{
+				numberOfCurrentClassHeroes = 0;
+				++currentClass;
+			}
+		}
+		else
+		{
+			nher->heroType = addTab[additHero++];
+		}
 		std::string base;
 		char * tab = new char[500];
 		int iit = 0;
@@ -27,6 +58,7 @@ void CHeroHandler::loadHeroes()
 			loadSpecialAbilities();
 			loadBiographies();
 			loadHeroClasses();
+			initHeroClasses();
 			inp.close();
 			return;
 		}
@@ -34,13 +66,13 @@ void CHeroHandler::loadHeroes()
 		{
 			++iit;
 		}
-		nher.name = base.substr(0, iit);
+		nher->name = base.substr(0, iit);
 		++iit;
 		for(int i=iit; i<iit+100; ++i)
 		{
 			if(base[i]==(char)(10) || base[i]==(char)(9))
 			{
-				nher.low1stack = atoi(base.substr(iit, i).c_str());
+				nher->low1stack = atoi(base.substr(iit, i).c_str());
 				iit=i+1;
 				break;
 			}
@@ -49,7 +81,7 @@ void CHeroHandler::loadHeroes()
 		{
 			if(base[i]==(char)(10) || base[i]==(char)(9))
 			{
-				nher.high1stack = atoi(base.substr(iit, i).c_str());
+				nher->high1stack = atoi(base.substr(iit, i).c_str());
 				iit=i+1;
 				break;
 			}
@@ -59,13 +91,13 @@ void CHeroHandler::loadHeroes()
 		{
 			++ipom;
 		}
-		nher.refType1stack = base.substr(iit, ipom-iit);
+		nher->refType1stack = base.substr(iit, ipom-iit);
 		iit=ipom+1;
 		for(int i=iit; i<iit+100; ++i)
 		{
 			if(base[i]==(char)(10) || base[i]==(char)(9))
 			{
-				nher.low2stack = atoi(base.substr(iit, i-iit).c_str());
+				nher->low2stack = atoi(base.substr(iit, i-iit).c_str());
 				iit=i+1;
 				break;
 			}
@@ -74,7 +106,7 @@ void CHeroHandler::loadHeroes()
 		{
 			if(base[i]==(char)(10) || base[i]==(char)(9))
 			{
-				nher.high2stack = atoi(base.substr(iit, i-iit).c_str());
+				nher->high2stack = atoi(base.substr(iit, i-iit).c_str());
 				iit=i+1;
 				break;
 			}
@@ -84,13 +116,13 @@ void CHeroHandler::loadHeroes()
 		{
 			++ipom;
 		}
-		nher.refType2stack = base.substr(iit, ipom-iit);
+		nher->refType2stack = base.substr(iit, ipom-iit);
 		iit=ipom+1;
 		for(int i=iit; i<iit+100; ++i)
 		{
 			if(base[i]==(char)(10) || base[i]==(char)(9))
 			{
-				nher.low3stack = atoi(base.substr(iit, i-iit).c_str());
+				nher->low3stack = atoi(base.substr(iit, i-iit).c_str());
 				iit=i+1;
 				break;
 			}
@@ -99,13 +131,13 @@ void CHeroHandler::loadHeroes()
 		{
 			if(base[i]==(char)(10) || base[i]==(char)(9))
 			{
-				nher.high3stack = atoi(base.substr(iit, i-iit).c_str());
+				nher->high3stack = atoi(base.substr(iit, i-iit).c_str());
 				iit=i+1;
 				break;
 			}
 		}
-		nher.refType3stack = base.substr(iit, base.size()-iit);
-		nher.ID=ID++;
+		nher->refType3stack = base.substr(iit, base.size()-iit);
+		nher->ID=ID++;
 		heroes.push_back(nher);
 		delete[500] tab;
 	}
@@ -138,11 +170,11 @@ void CHeroHandler::loadSpecialAbilities()
 		{
 			++iit;
 		}
-		heroes[whHero].bonusName = base.substr(0, iit);
+		heroes[whHero]->bonusName = base.substr(0, iit);
 		++iit;
 		iitBef=iit;
 
-		if(heroes[whHero].bonusName == std::string("Ogry"))
+		if(heroes[whHero]->bonusName == std::string("Ogry"))
 		{
 			char * tab2 = new char[500];
 			inp.getline(tab2, 500);
@@ -154,7 +186,7 @@ void CHeroHandler::loadSpecialAbilities()
 		{
 			++iit;
 		}
-		heroes[whHero].shortBonus = base.substr(iitBef, iit-iitBef);
+		heroes[whHero]->shortBonus = base.substr(iitBef, iit-iitBef);
 		++iit;
 		iitBef=iit;
 
@@ -162,7 +194,7 @@ void CHeroHandler::loadSpecialAbilities()
 		{
 			++iit;
 		}
-		heroes[whHero].longBonus = base.substr(iitBef, iit-iitBef);
+		heroes[whHero]->longBonus = base.substr(iitBef, iit-iitBef);
 		++whHero;
 		delete [500] tab;
 	}
@@ -189,7 +221,7 @@ void CHeroHandler::loadBiographies()
 			if(buf[i]=='\r')
 				break;
 		}
-		heroes[q].biography = buf.substr(befi, i-befi);
+		heroes[q]->biography = buf.substr(befi, i-befi);
 		i+=2;
 	}
 }
@@ -344,7 +376,7 @@ void CHeroHandler::loadHeroClasses()
 		hc->proKnowledge[1] = atoi(buf.substr(befi, i-befi).c_str());
 		++i;
 
-		CHero kkk = heroes[0];
+		//CHero kkk = heroes[0];
 
 		for(int dd=0; dd<CGameInfo::mainObj->abilh->abilities.size(); ++dd)
 		{
@@ -374,3 +406,11 @@ void CHeroHandler::loadHeroClasses()
 		heroClasses.push_back(hc);
 	}
 }
+
+void CHeroHandler::initHeroClasses()
+{
+	for(int gg=0; gg<heroes.size(); ++gg)
+	{
+		heroes[gg]->heroClass = heroClasses[heroes[gg]->heroType];
+	}
+}

+ 6 - 3
CHeroHandler.h

@@ -4,10 +4,11 @@
 #include <string>
 #include <vector>
 #include "CCreatureHandler.h"
-#include "nodrze.h"
 
 class CHeroClass;
 
+enum EHeroClasses {HERO_KNIGHT, HERO_CLERIC, HERO_RANGER, HERO_DRUID, HREO_ALCHEMIST, HERO_WIZARD, HERO_DEMONIAC, HERO_HERETIC, HERO_DEATHKNIGHT, HERO_NECROMANCER, HERO_WARLOCK, HERO_OVERLORD, HERO_BARBARIAN, HERO_BATTLEMAGE, HERO_BEASTMASTER, HERO_WITCH, HERO_PLANESWALKER, HERO_ELEMENTALIST};
+
 class CHero
 {
 public:
@@ -19,7 +20,8 @@ public:
 	std::string biography; //biography, of course
 	bool isAllowed; //true if we can play with this hero (depends on map)
 	CHeroClass * heroClass;
-	bool operator<(CHero& drugi){if (ID < drugi.ID) return true; else return false;}
+	EHeroClasses heroType; //hero class
+	//bool operator<(CHero& drugi){if (ID < drugi.ID) return true; else return false;}
 };
 
 class CHeroClass
@@ -48,12 +50,13 @@ public:
 class CHeroHandler
 {
 public:
-	nodrze<CHero> heroes; //by³o nodrze
+	std::vector<CHero*> heroes; //by³o nodrze
 	std::vector<CHeroClass *> heroClasses;
 	void loadHeroes();
 	void loadSpecialAbilities();
 	void loadBiographies();
 	void loadHeroClasses();
+	void initHeroClasses();
 };
 
 

+ 10 - 0
SDL_Extensions.cpp

@@ -581,3 +581,13 @@ void CSDL_Ext::blueToPlayersAdv(SDL_Surface * sur, int player)
 	}
 }
 
+void CSDL_Ext::setPlayerColor(SDL_Surface * sur, int player)
+{
+	if(sur->format->BitsPerPixel==8)
+	{
+		if(player != -1) 
+			*(sur->format->palette->colors+5) = CGameInfo::mainObj->playerColors[player];
+		else
+			*(sur->format->palette->colors+5) = CGameInfo::mainObj->neutralColor;
+	}
+}

+ 1 - 0
SDL_Extensions.h

@@ -24,6 +24,7 @@ namespace CSDL_Ext
 	void update(SDL_Surface * what = ekran); //updates whole surface (default - main screen)
 	void blueToPlayers(SDL_Surface * sur, int player); //simple color substitution
 	void blueToPlayersAdv(SDL_Surface * sur, int player); //substitute blue color by another one, makes it nicer keeping nuances
+	void setPlayerColor(SDL_Surface * sur, int player); //sets correct color of flags; -1 for neutral
 };
 
 #endif // SDL_EXTENSIONS_H