Michał W. Urbańczyk 13 年之前
父节点
当前提交
a975805ae8
共有 6 个文件被更改,包括 30 次插入22 次删除
  1. 0 6
      lib/CArtHandler.cpp
  2. 13 5
      lib/CGameState.cpp
  3. 2 0
      lib/CGameState.h
  4. 10 10
      lib/CObjectHandler.cpp
  5. 1 1
      lib/CObjectHandler.h
  6. 4 0
      lib/NetPacksLib.cpp

+ 0 - 6
lib/CArtHandler.cpp

@@ -1027,17 +1027,11 @@ void CArtifactInstance::move(ArtifactLocation &src, ArtifactLocation &dst)
 		tlog1 << "No source for moved artifact found!\n";
 
 	if (dst.hero)
-	{
 		putAt(dst.hero, dst.slot);
-		if (artType->id == 135 && dst.slot == ArtifactPosition::RIGHT_HAND && !dst.hero->hasSpellbook()) //Titan's Thunder creates new spellbook on equip
-			dst.hero->giveArtifact(0);
-	}
 	else if (dst.stack)
 		putAt(dst.stack, dst.slot);
 	else
 		tlog1 << "No destination for moved artifact found!\n";
-
-
 }
 
 CArtifactInstance * CArtifactInstance::createNewArtifactInstance(CArtifact *Art)

+ 13 - 5
lib/CGameState.cpp

@@ -820,7 +820,7 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
 	struct HLP
 	{
 		//it's assumed that given hero should receive the bonus
-		static void giveCampaignBonusToHero(CGHeroInstance * hero, const StartInfo * si, const CScenarioTravel & st )
+		static void giveCampaignBonusToHero(CGHeroInstance * hero, const StartInfo * si, const CScenarioTravel & st, CGameState *gs )
 		{
 			const CScenarioTravel::STravelBonus & curBonus = st.bonusesToChoose[si->choosenCampaignBonus];
 			if(curBonus.isBonusForHero())
@@ -844,7 +844,7 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
 					}
 					break;
 				case 3: //artifact
-					hero->giveArtifact(curBonus.info2);
+					gs->giveHeroArtifact(hero, curBonus.info2);
 					break;
 				case 4: //spell scroll
 					{
@@ -1325,7 +1325,7 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
 				if(maxB < 0)
 					tlog2 << "Warning - cannot give bonus to hero cause there are no heroes!\n";
 				else
-					HLP::giveCampaignBonusToHero(heroes[maxB], scenarioOps, campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions);
+					HLP::giveCampaignBonusToHero(heroes[maxB], scenarioOps, campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions, this);
 			}
 			else //specific hero
 			{
@@ -1333,7 +1333,7 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
 				{
 					if (heroes[b]->subID == chosenBonus.info1)
 					{
-						HLP::giveCampaignBonusToHero(heroes[b], scenarioOps, campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions);
+						HLP::giveCampaignBonusToHero(heroes[b], scenarioOps, campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions, this);
 						break;
 					}
 				}
@@ -1405,7 +1405,7 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
  				toGive = VLC->arth->artifacts[VLC->arth->getRandomArt (CArtifact::ART_TREASURE)];
 
 				CGHeroInstance *hero = k->second.heroes[0];
- 				hero->giveArtifact(toGive->id);
+ 				giveHeroArtifact(hero, toGive->id);
 			}
 			break;
 		}
@@ -2456,6 +2456,14 @@ void CGameState::attachArmedObjects()
 	}
 }
 
+void CGameState::giveHeroArtifact(CGHeroInstance *h, int aid)
+{
+	 CArtifact * const artifact = VLC->arth->artifacts[aid]; //pointer to constant object
+	 CArtifactInstance *ai = CArtifactInstance::createNewArtifactInstance(artifact);
+	 map->addNewArtifactInstance(ai);
+	 ai->putAt(h, ai->firstAvailableSlot(h));
+}
+
 int3 CPath::startPos() const
 {
 	return nodes[nodes.size()-1].coord;

+ 2 - 0
lib/CGameState.h

@@ -378,6 +378,8 @@ public:
 	void randomizeObject(CGObjectInstance *cur);
 	std::pair<int,int> pickObject(CGObjectInstance *obj); //chooses type of object to be randomized, returns <type, subtype>
 	int pickHero(int owner);
+	void giveHeroArtifact(CGHeroInstance *h, int aid);
+
 	void apply(CPack *pack);
 	int battleGetBattlefieldType(int3 tile = int3());//   1. sand/shore   2. sand/mesas   3. dirt/birches   4. dirt/hills   5. dirt/pines   6. grass/hills   7. grass/pines   8. lava   9. magic plains   10. snow/mountains   11. snow/trees   12. subterranean   13. swamp/trees   14. fiery fields   15. rock lands   16. magic clouds   17. lucid pools   18. holy ground   19. clover field   20. evil fog   21. "favourable winds" text on magic plains background   22. cursed ground   23. rough   24. ship to ship   25. ship
 	UpgradeInfo getUpgradeInfo(const CStackInstance &stack);

+ 10 - 10
lib/CObjectHandler.cpp

@@ -1356,16 +1356,16 @@ si32 CGHeroInstance::manaRegain() const
 	return 1 + valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 8) + valOfBonuses(Bonus::MANA_REGENERATION); //1 + Mysticism level 
 }
 
-/**
- * Places an artifact in hero's backpack. If it's a big artifact equips it
- * or discards it if it cannot be equipped.
- */
-void CGHeroInstance::giveArtifact (ui32 aid) //use only for fixed artifacts
-{
-	CArtifact * const artifact = VLC->arth->artifacts[aid]; //pointer to constant object
-	CArtifactInstance *ai = CArtifactInstance::createNewArtifactInstance(artifact);
-	ai->putAt(this, ai->firstAvailableSlot(this));
-}
+// /**
+//  * Places an artifact in hero's backpack. If it's a big artifact equips it
+//  * or discards it if it cannot be equipped.
+//  */
+// void CGHeroInstance::giveArtifact (ui32 aid) //use only for fixed artifacts
+// {
+// 	CArtifact * const artifact = VLC->arth->artifacts[aid]; //pointer to constant object
+// 	CArtifactInstance *ai = CArtifactInstance::createNewArtifactInstance(artifact);
+// 	ai->putAt(this, ai->firstAvailableSlot(this));
+// }
 
 int CGHeroInstance::getBoatType() const
 {

+ 1 - 1
lib/CObjectHandler.h

@@ -381,7 +381,7 @@ public:
 	void putInBackpack(CArtifactInstance *art);
 	void initExp();
 	void initArmy(IArmyDescriptor *dst = NULL);
-	void giveArtifact (ui32 aid);
+	//void giveArtifact (ui32 aid);
 	void initHeroDefInfo();
 	void pushPrimSkill(int which, int val);
 	void UpdateSpeciality();

+ 4 - 0
lib/NetPacksLib.cpp

@@ -677,6 +677,10 @@ DLL_LINKAGE void MoveArtifact::applyGs( CGameState *gs )
 		assert(!dst.getArt());
 
 	a->move(src, dst);
+
+	//TODO what'll happen if Titan's thunder is equiped by pickin git up or the start of game?
+	if (a->artType->id == 135 && dst.hero && dst.slot == ArtifactPosition::RIGHT_HAND && !dst.hero->hasSpellbook()) //Titan's Thunder creates new spellbook on equip
+		gs->giveHeroArtifact(dst.hero, 0);
 }
 
 DLL_LINKAGE void AssembledArtifact::applyGs( CGameState *gs )