Browse Source

Converted all h3 banks to rewardable, remove most of hardcoded checks

Ivan Savenko 1 năm trước cách đây
mục cha
commit
503b87561e

+ 0 - 6
AI/Nullkiller/Engine/FuzzyEngines.cpp

@@ -208,12 +208,6 @@ float TacticalAdvantageEngine::getTacticalAdvantage(const CArmedInstance * we, c
 		enemyFlyers->setValue(enemyStructure.flyers);
 		enemySpeed->setValue(enemyStructure.maxSpeed);
 
-		bool bank = dynamic_cast<const CBank *>(enemy);
-		if(bank)
-			bankPresent->setValue(1);
-		else
-			bankPresent->setValue(0);
-
 		const CGTownInstance * fort = dynamic_cast<const CGTownInstance *>(enemy);
 		if(fort)
 			castleWalls->setValue(fort->fortLevel());

+ 1 - 23
AI/Nullkiller/Engine/FuzzyHelper.cpp

@@ -20,25 +20,6 @@
 namespace NKAI
 {
 
-ui64 FuzzyHelper::estimateBankDanger(const CBank * bank)
-{
-	//this one is not fuzzy anymore, just calculate weighted average
-
-	auto objectInfo = bank->getObjectHandler()->getObjectInfo(bank->appearance);
-
-	CBankInfo * bankInfo = dynamic_cast<CBankInfo *>(objectInfo.get());
-
-	ui64 totalStrength = 0;
-	ui8 totalChance = 0;
-	for(auto config : bankInfo->getPossibleGuards(bank->cb))
-	{
-		totalStrength += config.second.totalStrength * config.first;
-		totalChance += config.first;
-	}
-	return totalStrength / std::max<ui8>(totalChance, 1); //avoid division by zero
-
-}
-
 ui64 FuzzyHelper::evaluateDanger(const int3 & tile, const CGHeroInstance * visitor, bool checkGuards)
 {
 	auto cb = ai->cb.get();
@@ -171,14 +152,11 @@ ui64 FuzzyHelper::evaluateDanger(const CGObjectInstance * obj)
 	case Obj::DRAGON_UTOPIA:
 	case Obj::SHIPWRECK: //shipwreck
 	case Obj::DERELICT_SHIP: //derelict ship
+	case Obj::PYRAMID:
 	{
 		const CArmedInstance * a = dynamic_cast<const CArmedInstance *>(obj);
 		return a->getArmyStrength();
 	}
-	case Obj::PYRAMID:
-	{
-		return estimateBankDanger(dynamic_cast<const CBank *>(obj));
-	}
 	default:
 		return 0;
 	}

+ 0 - 8
AI/Nullkiller/Engine/FuzzyHelper.h

@@ -10,12 +10,6 @@
 #pragma once
 #include "FuzzyEngines.h"
 
-VCMI_LIB_NAMESPACE_BEGIN
-
-class CBank;
-
-VCMI_LIB_NAMESPACE_END
-
 namespace NKAI
 {
 
@@ -30,8 +24,6 @@ private:
 public:
 	FuzzyHelper(const Nullkiller * ai): ai(ai) {}
 
-	ui64 estimateBankDanger(const CBank * bank); //TODO: move to another class?
-
 	ui64 evaluateDanger(const CGObjectInstance * obj);
 	ui64 evaluateDanger(const int3 & tile, const CGHeroInstance * visitor, bool checkGuards = true);
 };

+ 0 - 1
AI/VCAI/AIUtility.cpp

@@ -16,7 +16,6 @@
 #include "../../lib/UnlockGuard.h"
 #include "../../lib/CConfigHandler.h"
 #include "../../lib/CHeroHandler.h"
-#include "../../lib/mapObjects/CBank.h"
 #include "../../lib/mapObjects/CGTownInstance.h"
 #include "../../lib/mapObjects/CQuest.h"
 #include "../../lib/mapping/CMapDefines.h"

+ 0 - 6
AI/VCAI/FuzzyEngines.cpp

@@ -219,12 +219,6 @@ float TacticalAdvantageEngine::getTacticalAdvantage(const CArmedInstance * we, c
 		enemyFlyers->setValue(enemyStructure.flyers);
 		enemySpeed->setValue(enemyStructure.maxSpeed);
 
-		bool bank = dynamic_cast<const CBank *>(enemy);
-		if(bank)
-			bankPresent->setValue(1);
-		else
-			bankPresent->setValue(0);
-
 		const CGTownInstance * fort = dynamic_cast<const CGTownInstance *>(enemy);
 		if(fort)
 			castleWalls->setValue(fort->fortLevel());

+ 5 - 22
AI/VCAI/FuzzyHelper.cpp

@@ -16,7 +16,6 @@
 #include "../../lib/mapObjectConstructors/AObjectTypeHandler.h"
 #include "../../lib/mapObjectConstructors/CObjectClassesHandler.h"
 #include "../../lib/mapObjectConstructors/CBankInstanceConstructor.h"
-#include "../../lib/mapObjects/CBank.h"
 #include "../../lib/mapObjects/CGCreature.h"
 #include "../../lib/mapObjects/CGDwelling.h"
 #include "../../lib/gameState/InfoAboutArmy.h"
@@ -62,25 +61,6 @@ Goals::TSubgoal FuzzyHelper::chooseSolution(Goals::TGoalVec vec)
 	return result;
 }
 
-ui64 FuzzyHelper::estimateBankDanger(const CBank * bank)
-{
-	//this one is not fuzzy anymore, just calculate weighted average
-
-	auto objectInfo = bank->getObjectHandler()->getObjectInfo(bank->appearance);
-
-	CBankInfo * bankInfo = dynamic_cast<CBankInfo *>(objectInfo.get());
-
-	ui64 totalStrength = 0;
-	ui8 totalChance = 0;
-	for(auto config : bankInfo->getPossibleGuards(bank->cb))
-	{
-		totalStrength += config.second.totalStrength * config.first;
-		totalChance += config.first;
-	}
-	return totalStrength / std::max<ui8>(totalChance, 1); //avoid division by zero
-
-}
-
 float FuzzyHelper::evaluate(Goals::VisitTile & g)
 {
 	if(g.parent)
@@ -302,7 +282,6 @@ ui64 FuzzyHelper::evaluateDanger(const CGObjectInstance * obj, const VCAI * ai)
 		return iat.army.getStrength();
 	}
 	case Obj::MONSTER:
-	case Obj::CRYPT:
 	{
 		//TODO!!!!!!!!
 		const CGCreature * cre = dynamic_cast<const CGCreature *>(obj);
@@ -320,12 +299,16 @@ ui64 FuzzyHelper::evaluateDanger(const CGObjectInstance * obj, const VCAI * ai)
 		const CArmedInstance * a = dynamic_cast<const CArmedInstance *>(obj);
 		return a->getArmyStrength();
 	}
+	case Obj::CRYPT:
 	case Obj::CREATURE_BANK: //crebank
 	case Obj::DRAGON_UTOPIA:
 	case Obj::SHIPWRECK: //shipwreck
 	case Obj::DERELICT_SHIP: //derelict ship
 	case Obj::PYRAMID:
-		return estimateBankDanger(dynamic_cast<const CBank *>(obj));
+	{
+		const CArmedInstance * a = dynamic_cast<const CArmedInstance *>(obj);
+		return a->getArmyStrength();
+	}
 	default:
 		return 0;
 	}

+ 0 - 8
AI/VCAI/FuzzyHelper.h

@@ -10,12 +10,6 @@
 #pragma once
 #include "FuzzyEngines.h"
 
-VCMI_LIB_NAMESPACE_BEGIN
-
-class CBank;
-
-VCMI_LIB_NAMESPACE_END
-
 class DLL_EXPORT FuzzyHelper
 {
 public:
@@ -42,8 +36,6 @@ public:
 	float evaluate(Goals::AbstractGoal & g);
 	void setPriority(Goals::TSubgoal & g);
 
-	ui64 estimateBankDanger(const CBank * bank); //TODO: move to another class?
-
 	Goals::TSubgoal chooseSolution(Goals::TGoalVec vec);
 	//std::shared_ptr<AbstractGoal> chooseSolution (std::vector<std::shared_ptr<AbstractGoal>> & vec);
 

+ 0 - 2
AI/VCAI/VCAI.cpp

@@ -2750,8 +2750,6 @@ bool isWeeklyRevisitable(const CGObjectInstance * obj)
 
 	if(dynamic_cast<const CGDwelling *>(obj))
 		return true;
-	if(dynamic_cast<const CBank *>(obj)) //banks tend to respawn often in mods
-		return true;
 
 	switch(obj->ID)
 	{

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 385 - 447
config/objects/creatureBanks.json


+ 6 - 0
config/schemas/rewardable.json

@@ -98,6 +98,9 @@
 						"max" : { "type" : "number", "exclusiveMinimum" : 0, "maximum" : 100 }
 					}
 				},
+
+				"guards"  : {}, //TODO
+				
 				"limiter" : { "$ref" : "#/definitions/limiter" },
 				"message" : { "$ref" : "#/definitions/message" },
 				"description" : { "$ref" : "#/definitions/message" },
@@ -256,6 +259,9 @@
 			},
 		},
 
+		"onGuardedMessage" : {
+			"$ref" : "#/definitions/message"
+		},
 		"onSelectMessage" : {
 			"$ref" : "#/definitions/message"
 		},

+ 0 - 1
lib/mapObjectConstructors/CommonConstructors.h

@@ -26,7 +26,6 @@ class CGHeroInstance;
 class CGMarket;
 class CHeroClass;
 class CGCreature;
-class CBank;
 class CGBoat;
 class CFaction;
 class CStackBasicDescriptor;

+ 13 - 109
lib/mapObjects/CBank.cpp

@@ -140,119 +140,28 @@ void CBank::onHeroVisit(const CGHeroInstance * h) const
 	ChangeObjectVisitors cov(ChangeObjectVisitors::VISITOR_ADD_PLAYER, id, h->id);
 	cb->sendAndApply(&cov);
 
-	if(!bankConfig && (ID.toEnum() == Obj::CREATURE_BANK || ID.toEnum() == Obj::DRAGON_UTOPIA))
-	{
-		blockingDialogAnswered(h, 1);
-		return;
-	}
-
-	int banktext = 0;
-	switch (ID.toEnum())
-	{
-	case Obj::DERELICT_SHIP:
-		banktext = 41;
-		break;
-	case Obj::DRAGON_UTOPIA:
-		banktext = 47;
-		break;
-	case Obj::SHIPWRECK:
-		banktext = 122;
-		break;
-	case Obj::PYRAMID:
-		banktext = 105;
-		break;
-	default:
-		banktext = 32;
-		break;
-	}
 	BlockingDialog bd(true, false);
 	bd.player = h->getOwner();
-	bd.text.appendLocalString(EMetaText::ADVOB_TXT, banktext);
+	bd.text.appendLocalString(EMetaText::ADVOB_TXT, 32);
 	bd.components = getPopupComponents(h->getOwner());
-	if (banktext == 32)
-		bd.text.replaceRawString(getObjectName());
-
+	bd.text.replaceRawString(getObjectName());
 	cb->showBlockingDialog(this, &bd);
 }
 
 void CBank::doVisit(const CGHeroInstance * hero) const
 {
-	int textID = -1;
 	InfoWindow iw;
 	iw.type = EInfoWindowMode::AUTO;
 	iw.player = hero->getOwner();
 	MetaString loot;
 
-	if (bankConfig)
-	{
-		switch (ID.toEnum())
-		{
-		case Obj::DERELICT_SHIP:
-			textID = 43;
-			break;
-		case Obj::SHIPWRECK:
-			textID = 124;
-			break;
-		case Obj::PYRAMID:
-			textID = 106;
-			break;
-		default:
-			textID = 34;
-			break;
-		}
-	}
-	else
+	if (!bankConfig)
 	{
-		switch (ID.toEnum())
-		{
-		case Obj::SHIPWRECK:
-		case Obj::DERELICT_SHIP:
-		{
-			GiveBonus gbonus;
-			gbonus.id = hero->id;
-			gbonus.bonus.duration = BonusDuration::ONE_BATTLE;
-			gbonus.bonus.source = BonusSource::OBJECT_TYPE;
-			gbonus.bonus.sid = BonusSourceID(ID);
-			gbonus.bonus.type = BonusType::MORALE;
-			gbonus.bonus.val = -1;
-			switch (ID.toEnum())
-			{
-			case Obj::SHIPWRECK:
-				textID = 123;
-				gbonus.bonus.description = MetaString::createFromTextID("core.arraytxt.99");
-				break;
-			case Obj::DERELICT_SHIP:
-				textID = 42;
-				gbonus.bonus.description = MetaString::createFromTextID("core.arraytxt.101");
-				break;
-			}
-			cb->giveHeroBonus(&gbonus);
-			iw.components.emplace_back(ComponentType::MORALE, -1);
-			break;
-		}
-		case Obj::PYRAMID:
-		{
-			GiveBonus gb;
-			gb.bonus = Bonus(BonusDuration::ONE_BATTLE, BonusType::LUCK, BonusSource::OBJECT_INSTANCE, -2, BonusSourceID(id));
-			gb.bonus.description = MetaString::createFromTextID("core.arraytxt.70");
-			gb.id = hero->id;
-			cb->giveHeroBonus(&gb);
-			textID = 107;
-			iw.components.emplace_back(ComponentType::LUCK, -2);
-			break;
-		}
-		default:
-			iw.text.appendRawString(VLC->generaltexth->advobtxt[33]);// This was X, now is completely empty
-			iw.text.replaceRawString(getObjectName());
-		}
-		if(textID != -1)
-		{
-			iw.text.appendLocalString(EMetaText::ADVOB_TXT, textID);
-		}
+		iw.text.appendRawString(VLC->generaltexth->advobtxt[33]);// This was X, now is completely empty
+		iw.text.replaceRawString(getObjectName());
 		cb->showInfoDialog(&iw);
 	}
 
-
 	//grant resources
 	if (bankConfig)
 	{
@@ -278,17 +187,15 @@ void CBank::doVisit(const CGHeroInstance * hero) const
 		//display loot
 		if (!iw.components.empty())
 		{
-			iw.text.appendLocalString(EMetaText::ADVOB_TXT, textID);
-			if (textID == 34)
+			iw.text.appendLocalString(EMetaText::ADVOB_TXT, 34);
+			const auto * strongest = boost::range::max_element(bankConfig->guards, [](const CStackBasicDescriptor & a, const CStackBasicDescriptor & b)
 			{
-				const auto * strongest = boost::range::max_element(bankConfig->guards, [](const CStackBasicDescriptor & a, const CStackBasicDescriptor & b)
-				{
-					return a.type->getFightValue() < b.type->getFightValue();
-				})->type;
+				return a.type->getFightValue() < b.type->getFightValue();
+			})->type;
+
+			iw.text.replaceNamePlural(strongest->getId());
+			iw.text.replaceRawString(loot.buildList());
 
-				iw.text.replaceNamePlural(strongest->getId());
-				iw.text.replaceRawString(loot.buildList());
-			}
 			cb->showInfoDialog(&iw);
 		}
 
@@ -301,10 +208,7 @@ void CBank::doVisit(const CGHeroInstance * hero) const
 			std::set<SpellID> spells;
 
 			bool noWisdom = false;
-			if(textID == 106)
-			{
-				iw.text.appendLocalString(EMetaText::ADVOB_TXT, textID); //pyramid
-			}
+
 			for(const SpellID & spellId : bankConfig->spells)
 			{
 				const auto * spell = spellId.toEntity(VLC);

+ 0 - 7
lib/mapObjects/CRewardableObject.h

@@ -100,13 +100,6 @@ public:
 };
 
 //TODO:
-
-// MAX
-// class DLL_LINKAGE CBank : public CArmedInstance
-// class DLL_LINKAGE CGPyramid : public CBank
-
-// EXTRA
-// class DLL_LINKAGE CTownBonus : public CGTownBuilding
 // class DLL_LINKAGE CGKeys : public CGObjectInstance //Base class for Keymaster and guards
 // class DLL_LINKAGE CGKeymasterTent : public CGKeys
 // class DLL_LINKAGE CGBorderGuard : public CGKeys, public IQuestObject

+ 0 - 1
lib/mapObjects/MapObjects.h

@@ -14,7 +14,6 @@
 #include "CObjectHandler.h"
 
 #include "CArmedInstance.h"
-#include "CBank.h"
 #include "CGDwelling.h"
 #include "CGHeroInstance.h"
 #include "CGMarket.h"

+ 1 - 1
lib/mapping/MapFormatH3M.cpp

@@ -1459,7 +1459,7 @@ CGObjectInstance * CMapLoaderH3M::readGeneric(const int3 & mapPosition, std::sha
 CGObjectInstance * CMapLoaderH3M::readPyramid(const int3 & mapPosition, std::shared_ptr<const ObjectTemplate> objectTemplate)
 {
 	if(objectTemplate->subid == 0)
-		return new CBank(map->cb);
+		return readGeneric(mapPosition, objectTemplate);
 
 	return new CGObjectInstance(map->cb);
 }

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác