Bläddra i källkod

Heroes start with appropriate spells.
Starting spells list has been prepared by Dru. Thanks!

Michał W. Urbańczyk 16 år sedan
förälder
incheckning
38f8745777
4 ändrade filer med 163 tillägg och 24 borttagningar
  1. 105 0
      config/hero_spells.txt
  2. 49 20
      hch/CHeroHandler.cpp
  3. 7 3
      hch/CHeroHandler.h
  4. 2 1
      hch/CObjectHandler.cpp

+ 105 - 0
config/hero_spells.txt

@@ -0,0 +1,105 @@
+------------------------------
+--Starting spells for heroes-- 
+--        File format:      --
+--      HERO_ID SPELL_ID    --
+------------------------------
+----- Death Knights
+67 15
+70 15
+71 27
+69 15
+66 54
+64 53
+68 15
+65 46
+----- Necromancers
+73 23
+79 30
+75 27
+74 54
+72 24
+76 39
+78 42
+77 46
+----- Battle Mages
+106 46
+104 43
+109 54
+110 30
+111 43
+107 53
+105 15
+108 44
+----- Druids
+31 30
+30 16
+25 37
+24 55
+26 42
+27 0
+28 15
+29 51
+----- Alchemists
+37 53
+39 15
+35 27
+32 27
+34 53
+38 15
+33 15
+36 15
+----- Wizards
+47 42
+40 60
+46 53
+43 51
+41 46
+42 35
+45 19
+44 27
+----- Witches
+126 35
+124 46
+120 45
+121 15
+125 27
+127 46
+123 31
+122 54
+----- Clerics
+9 41
+10 45
+15 37
+11 20
+12 42
+14 48
+8 46
+13 35
+----- Warlocks
+88 38
+95 46
+93 23
+92 54
+89 27
+91 38
+90 43
+94 30
+----- Heretics
+61 43
+58 30
+56 3
+60 53
+59 45
+57 22
+63 21
+62 46
+----- Elementalists
+136 13
+137 53
+138 15
+139 46
+140 43
+141 47
+142 35
+143 54
+----- The End;)

+ 49 - 20
hch/CHeroHandler.cpp

@@ -219,34 +219,53 @@ void CHeroHandler::loadHeroes()
 		heroes.push_back(nher);
 		heroes.push_back(nher);
 	}
 	}
 	//loading initial secondary skills
 	//loading initial secondary skills
-	std::ifstream inp;
-	inp.open("config" PATHSEPARATOR "heroes_sec_skills.txt", std::ios_base::in|std::ios_base::binary);
-	if(!inp.is_open())
-	{
-		tlog1<<"missing file: config/heroes_sec_skills.txt"<<std::endl;
-	}
-	else
 	{
 	{
-		inp>>dump;
-		int hid; //ID of currently read hero
-		int secQ; //number of secondary abilities
-		while(true)
+		std::ifstream inp;
+		inp.open("config" PATHSEPARATOR "heroes_sec_skills.txt", std::ios_base::in|std::ios_base::binary);
+		if(!inp.is_open())
 		{
 		{
-			inp>>hid;
-			if(hid == -1)
-				break;
-			inp>>secQ;
-			for(int g=0; g<secQ; ++g)
+			tlog1<<"missing file: config/heroes_sec_skills.txt"<<std::endl;
+		}
+		else
+		{
+			inp>>dump;
+			int hid; //ID of currently read hero
+			int secQ; //number of secondary abilities
+			while(true)
 			{
 			{
-				int a, b;
-				inp>>a; inp>>b;
-				heroes[hid]->secSkillsInit.push_back(std::make_pair(a, b));
+				inp>>hid;
+				if(hid == -1)
+					break;
+				inp>>secQ;
+				for(int g=0; g<secQ; ++g)
+				{
+					int a, b;
+					inp>>a; inp>>b;
+					heroes[hid]->secSkillsInit.push_back(std::make_pair(a, b));
+				}
 			}
 			}
+			inp.close();
 		}
 		}
-		inp.close();
 	}
 	}
 	//initial skills loaded
 	//initial skills loaded
 
 
+	{
+		std::ifstream inp;
+		std::istringstream iss;
+		dump.clear();
+		inp.open("config" PATHSEPARATOR "hero_spells.txt");
+		while(inp)
+		{
+			getline(inp, dump);
+			if(!dump.size()  ||  dump[0] == '-')
+				continue;
+			iss.clear();
+			iss.str(dump);
+			int hid, sid;
+			iss >> hid >> sid;
+			heroes[hid]->startingSpell = sid;
+		}
+	}
 	loadHeroClasses();
 	loadHeroClasses();
 	initHeroClasses();
 	initHeroClasses();
 	expPerLevel.push_back(0);
 	expPerLevel.push_back(0);
@@ -526,3 +545,13 @@ void CHeroHandler::loadNativeTerrains()
 	}
 	}
 	inp.close();
 	inp.close();
 }
 }
+
+CHero::CHero()
+{
+	startingSpell = -1;
+}
+
+CHero::~CHero()
+{
+
+}

+ 7 - 3
hch/CHeroHandler.h

@@ -27,17 +27,21 @@ public:
 		BARBARIAN, BATTLEMAGE, BEASTMASTER, WITCH, PLANESWALKER, ELEMENTALIST};
 		BARBARIAN, BATTLEMAGE, BEASTMASTER, WITCH, PLANESWALKER, ELEMENTALIST};
 
 
 	std::string name; //name of hero
 	std::string name; //name of hero
-	int ID;
-	int lowStack[3], highStack[3]; //amount of units; described below
+	ui16 ID;
+	ui32 lowStack[3], highStack[3]; //amount of units; described below
 	std::string refTypeStack[3]; //reference names of units appearing in hero's army if he is recruited in tavern
 	std::string refTypeStack[3]; //reference names of units appearing in hero's army if he is recruited in tavern
 	CHeroClass * heroClass;
 	CHeroClass * heroClass;
 	EHeroClasses heroType; //hero class
 	EHeroClasses heroType; //hero class
 	std::vector<std::pair<ui8,ui8> > secSkillsInit; //initial secondary skills; first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert)
 	std::vector<std::pair<ui8,ui8> > secSkillsInit; //initial secondary skills; first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert)
+	si32 startingSpell; //-1 if none
 	//bool operator<(CHero& drugi){if (ID < drugi.ID) return true; else return false;}
 	//bool operator<(CHero& drugi){if (ID < drugi.ID) return true; else return false;}
 
 
+	CHero();
+	~CHero();
+
 	template <typename Handler> void serialize(Handler &h, const int version)
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 	{
-		h & name & ID & lowStack & highStack & refTypeStack	& heroType & ID;
+		h & name & ID & lowStack & highStack & refTypeStack	& heroType & ID & startingSpell;
 		//hero class pointer is restored by herohandler
 		//hero class pointer is restored by herohandler
 	}
 	}
 };
 };

+ 2 - 1
hch/CObjectHandler.cpp

@@ -496,9 +496,10 @@ void CGHeroInstance::initHero()
 	if(!type)
 	if(!type)
 		type = VLC->heroh->heroes[subID];
 		type = VLC->heroh->heroes[subID];
 	artifWorn[16] = 3;
 	artifWorn[16] = 3;
-	if(type->heroType % 2 == 1) //it's a magical hero
+	if(type->startingSpell >= 0) //hero starts with a spell
 	{
 	{
 		artifWorn[17] = 0; //give him spellbook
 		artifWorn[17] = 0; //give him spellbook
+		spells.insert(type->startingSpell);
 	}
 	}
 
 
 	if(portrait < 0 || portrait == 255)
 	if(portrait < 0 || portrait == 255)