Browse Source

Further support for specialities - fixed creature bonuses. Minor fixes.

DjWarmonger 15 years ago
parent
commit
23d2dec3e5
4 changed files with 22 additions and 12 deletions
  1. 2 2
      config/specials.txt
  2. 1 1
      hch/CHeroHandler.cpp
  3. 16 6
      hch/CObjectHandler.cpp
  4. 3 3
      lib/HeroBonus.h

+ 2 - 2
config/specials.txt

@@ -129,7 +129,7 @@
 128	4	3	1	120
 128	4	3	2	120
 129	4	2	1	113
-129	4	1	1	113
+129	4	1	2	113
 129	4	5	4	113
 130	4	1	1	114
 130	4	2	1	114
@@ -138,7 +138,7 @@
 132	4	3	1	120
 132	4	3	2	120
 133	4	2	1	113
-133	4	1	1	113
+133	4	1	2	113
 133	4	5	4	113
 134	4	1	1	114
 134	4	2	1	114

+ 1 - 1
hch/CHeroHandler.cpp

@@ -416,7 +416,7 @@ void CHeroHandler::loadHeroes()
 		specialInfo dummy;
 		si32 hid;
 		inp.ignore(100, '\n');
-		for (int i = 0; i < 174; ++i)
+		for (int i = 0; i < 175; ++i)
 		{
 			inp >> hid;
 			inp >> dummy.type;

+ 16 - 6
hch/CObjectHandler.cpp

@@ -766,6 +766,7 @@ CGHeroInstance::CGHeroInstance()
 	type = NULL;
 	boat = NULL;
 	secSkills.push_back(std::make_pair(-1, -1));
+	speciality.nodeType = CBonusSystemNode::SPECIALITY;
 }
 
 void CGHeroInstance::initHero(int SUBID)
@@ -1021,7 +1022,7 @@ void CGHeroInstance::initObj()
 						break;
 				}
 				speciality.bonuses.push_back (bonus);
-				bonus.val = valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, it->subtype) * it->val/100; //TODO: limit range to hero only
+				bonus.val = valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, it->subtype) * it->val; //TODO: limit range to hero only
 				speciality.bonuses.push_back(bonus);
 				break;
 			case 3://spell damage bonus, level dependant
@@ -1035,19 +1036,28 @@ void CGHeroInstance::initObj()
 				switch (it->subtype)
 				{
 					case 1://attack
+						bonus.type = Bonus::PRIMARY_SKILL;
+						bonus.subtype = PrimarySkill::ATTACK;
+						break;
 					case 2://defense
 						bonus.type = Bonus::PRIMARY_SKILL;
-						bonus.subtype = it->subtype;
+						bonus.subtype = PrimarySkill::DEFENSE;
+						break;
+					case 3://damage, TODO: handle it!
+						bonus.type = Bonus::CREATURE_DAMAGE;
+						bonus.subtype = 0; //both min and max
+						break;
+					case 4://hp
+						bonus.type = Bonus::STACK_HEALTH;
 						break;
 					case 5:
 						bonus.type = Bonus::STACKS_SPEED;
-						bonus.subtype = 0;
 						break;
 					default:
-						continue; //TODO: damage, hp
+						continue;
 				}
 				bonus.valType = Bonus::ADDITIVE_VALUE;
-				bonus.additionalInfo = it->additionalinfo;
+				bonus.limiter = new CCreatureTypeLimiter (*VLC->creh->creatures[it->additionalinfo], true);
 				speciality.bonuses.push_back (bonus);
 				break;
 			case 5://spell damage bonus in percent
@@ -1127,7 +1137,7 @@ void CGHeroInstance::UpdateSpeciality()
 			{
 				case Bonus::SECONDARY_SKILL_PREMY:
 					it->val = (speciality.valOfBonuses(Bonus::SPECIAL_SECONDARY_SKILL, it->subtype) *
-						valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, it->subtype) * level)/100;
+						valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, it->subtype) * level); //TODO: use only skills as bonuses
 					break;
 				case Bonus::PRIMARY_SKILL: //for crearures, that is
 					int creLevel = (*creatures)[it->additionalInfo]->level;

+ 3 - 3
lib/HeroBonus.h

@@ -155,7 +155,8 @@ namespace PrimarySkill
 	BONUS_NAME(MAXED_SPELL) /*val = id*/\
 	BONUS_NAME(SPECIAL_PECULIAR_ENCHANT) /*blesses and curses with id = val dependent on unit's level, subtype = 0 or 1 for Coronius*/\
 	BONUS_NAME(SPECIAL_UPGRADE) /*val = base, additionalInfo = target */\
-	BONUS_NAME(DRAGON_NATURE) /*TODO: implement it!*/
+	BONUS_NAME(DRAGON_NATURE) /*TODO: implement it!*/\
+	BONUS_NAME(CREATURE_DAMAGE)/*subtype 0 = both, 1 = min, 2 = max*/
 
 struct DLL_EXPORT Bonus
 {
@@ -373,7 +374,7 @@ public:
 
 	enum ENodeTypes
 	{
-		UNKNOWN, STACK
+		UNKNOWN, STACK, SPECIALITY
 	};
 };
 
@@ -473,7 +474,6 @@ public:
 		h & creature & includeUpgrades;
 	}
 };
-
 namespace Selector
 {
 	extern DLL_EXPORT CSelectFieldEqual<TBonusType> type;