浏览代码

- first sketch of Commanders
- accumulateBonus should make mechanics simpler

DjWarmonger 13 年之前
父节点
当前提交
038d105bcc
共有 7 个文件被更改,包括 64 次插入7 次删除
  1. 15 4
      client/VCMI_client.vcxproj.filters
  2. 7 0
      lib/CCreatureHandler.h
  3. 22 2
      lib/CCreatureSet.h
  4. 2 0
      lib/CObjectHandler.h
  5. 5 0
      lib/GameConstants.h
  6. 9 0
      lib/HeroBonus.cpp
  7. 4 1
      lib/HeroBonus.h

+ 15 - 4
client/VCMI_client.vcxproj.filters

@@ -175,9 +175,6 @@
     <ClInclude Include="resource.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="mapHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="CAnimation.h">
       <Filter>Header Files</Filter>
     </ClInclude>
@@ -235,11 +232,25 @@
     <ClInclude Include="UIFramework\SDL_Extensions.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\hch\CArtHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hch\CBuildingHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hch\CHeroHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hch\CObjectHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hch\CVideoHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\ChangeLog" />
     <None Include="vcmi.ico" />
-    <None Include="ClassDiagram21.cd" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="VCMI_client.rc" />

+ 7 - 0
lib/CCreatureHandler.h

@@ -109,11 +109,17 @@ public:
 	std::vector<si8> factionAlignments; //1 for good, 0 for neutral and -1 for evil with faction ID as index
 	int factionToTurretCreature[GameConstants::F_NUMBER]; //which creature's animation should be used to dispaly creature in turret while siege
 
+	//stack exp
 	std::map<TBonusType, std::pair<std::string, std::string> > stackBonuses; // bonus => name, description
 	std::vector<std::vector<ui32> > expRanks; // stack experience needed for certain rank, index 0 for other tiers (?)
 	std::vector<ui32> maxExpPerBattle; //%, tiers same as above
 	si8 expAfterUpgrade;//multiplier in %
 
+	//Commanders
+	std::map <ui8, ui32> factionCommanders;
+	std::vector< std::vector <ui8> > skillLevels; //how much of a bonus will be given to commander with every level. We assume that number of casts equals skill level
+	std::vector <std::pair <Bonus, std::pair <ui8, ui8> > > skillRequirements; // first - Bonus, second - which two skills are needed to use it
+	BonusList commanderLevelPremy; //bonus values added with each level-up
 
 	void deserializationFix();
 	void loadCreatures();
@@ -138,6 +144,7 @@ public:
 		//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)
 		h & notUsedMonsters & creatures & nameToID & idToProjectile & idToProjectileSpin & factionToTurretCreature;
 		h & stackBonuses & expRanks & maxExpPerBattle & expAfterUpgrade;
+		h & factionCommanders & skillLevels & skillRequirements & commanderLevelPremy;
 		h & allCreatures;
 		h & creaturesOfLevel;
 		BONUS_TREE_DESERIALIZATION_FIX

+ 22 - 2
lib/CCreatureSet.h

@@ -49,10 +49,10 @@ public:
 	std::string bonusToString(Bonus *bonus, bool description) const; // how would bonus description look for this particular type of node
 	std::string bonusToGraphics(Bonus *bonus) const; //file name of graphics from StackSkills , in future possibly others
 
-	ui64 getPower() const;
+	virtual ui64 getPower() const;
 	int getQuantityID() const;
 	std::string getQuantityTXT(bool capitalized = true) const;
-	int getExpRank() const;
+	virtual int getExpRank() const;
 	si32 magicResistance() const;
 	int getCreatureID() const; //-1 if not available
 	std::string getName() const; //plural or singular
@@ -71,6 +71,26 @@ public:
 	void deserializationFix();
 };
 
+class DLL_LINKAGE CCommanderInstance : public CStackInstance
+{
+	//TODO: what if Commander is not a part of creature set?
+
+	//commander class is determined by its base creature
+	ui8 alive;
+	std::string name; // each Commander has different name
+	std::vector <std::pair <ui8, ui8> > secondarySkills; //ID, level
+	//std::vector <CArtifactInstance *> arts;
+
+	ui64 getPower() const {return 0;};
+	int getExpRank() const {return 0;};
+
+	template <typename Handler> void serialize(Handler &h, const int version)
+	{
+		h & static_cast<CStackInstance&>(*this);
+		h & alive & name & secondarySkills;
+	}
+};
+
 DLL_LINKAGE std::ostream & operator<<(std::ostream & str, const CStackInstance & sth);
 
 typedef std::map<TSlot, CStackInstance*> TSlots;

+ 2 - 0
lib/CObjectHandler.h

@@ -51,6 +51,7 @@ struct UpdateHeroSpeciality;
 struct NewArtifact;
 class CGBoat;
 class CArtifactSet;
+class CCommanderInstance;
 
 class DLL_LINKAGE CQuest
 {
@@ -285,6 +286,7 @@ public:
 	ui8 sex;
 	ui8 inTownGarrison; // if hero is in town garrison 
 	ConstTransitivePtr<CGTownInstance> visitedTown; //set if hero is visiting town or in the town garrison
+	ConstTransitivePtr<CCommanderInstance> commander;
 	const CGBoat *boat; //set to CGBoat when sailing
 	
 

+ 5 - 0
lib/GameConstants.h

@@ -170,6 +170,11 @@ namespace EBattleStackState
 	enum EBattleStackState{ALIVE = 180, SUMMONED, CLONED, HAD_MORALE, WAITING, MOVED, DEFENDING, FEAR};
 }
 
+namespace ECommander
+{
+	enum SecondarySkills {ATTACK, DEFENSE, HEALTH, DAMAGE, SPEED, SPELL_POWER};
+}
+
 namespace Obj
 {
 	enum

+ 9 - 0
lib/HeroBonus.cpp

@@ -654,6 +654,15 @@ void CBonusSystemNode::addNewBonus(Bonus *b)
 	CBonusSystemNode::treeChanged++;
 }
 
+void CBonusSystemNode::accumulateBonus(Bonus *b)
+{
+	Bonus *bonus = bonuses.getFirst(Selector::typeSubtype(b->type, b->subtype)); //only local bonuses are interesting //TODO: what about value type?
+	if(bonus)
+		bonus += b->val;
+	else
+		addNewBonus(b);
+}
+
 void CBonusSystemNode::removeBonus(Bonus *b)
 {
 	exportedBonuses -= b;

+ 4 - 1
lib/HeroBonus.h

@@ -175,7 +175,9 @@ namespace PrimarySkill
 	BONUS_NAME(SPECIFIC_SPELL_POWER) /* value used for Thunderbolt and Resurrection casted by units, subtype - spell id */\
 	BONUS_NAME(CREATURE_SPELL_POWER) /* value per unit, divided by 100 (so faerie Dragons have 800)*/ \
 	BONUS_NAME(CREATURE_ENCHANT_POWER) /* total duration of spells casted by creature */ \
-	BONUS_NAME(REBIRTH) /* val - percent of life restored, subtype = 0 - regular, 1 - at least one unit (sacred Phoenix) */
+	BONUS_NAME(REBIRTH) /* val - percent of life restored, subtype = 0 - regular, 1 - at least one unit (sacred Phoenix) */\
+	BONUS_NAME(ADDITIONAL_UNITS) /*val of units with id = subtype will be added to hero's army at the beginning of battle */\
+	BONUS_NAME(SPOILS_OF_WAR) /*val * 10^-6 * gained exp resources of subtype will be given to hero after battle*/
 
 /// Struct for handling bonuses of several types. Can be transferred to any hero
 struct DLL_LINKAGE Bonus
@@ -564,6 +566,7 @@ public:
 	void detachFrom(CBonusSystemNode *parent);
 	void detachFromAll();
 	void addNewBonus(Bonus *b); //b will be deleted with destruction of node
+	void accumulateBonus(Bonus *b); //add value of bonus with same type/subtype or create new
 
 	void newChildAttached(CBonusSystemNode *child);
 	void childDetached(CBonusSystemNode *child);