mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Refactoring
This commit is contained in:
		| @@ -439,11 +439,15 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGGarrison * garr): | ||||
|  | ||||
| CIntObject * CRClickPopup::createInfoWin(Point position, const CGObjectInstance * specific) //specific=0 => draws info about selected town/hero | ||||
| { | ||||
| 	if(!specific) | ||||
| 	if(nullptr == specific) | ||||
| 		specific = adventureInt->selection; | ||||
|  | ||||
| 	assert(specific); | ||||
|  | ||||
| 	 | ||||
| 	if(nullptr == specific) | ||||
| 	{ | ||||
| 		logGlobal->error("createInfoWin: no object to describe"); | ||||
| 		return nullptr; | ||||
| 	}	 | ||||
| 	 | ||||
| 	switch(specific->ID) | ||||
| 	{ | ||||
| 	case Obj::HERO: | ||||
|   | ||||
| @@ -525,6 +525,11 @@ | ||||
| 			"icon":  "zvs/Lib1.res/E_RETAIL1" | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	"VISIONS": | ||||
| 	{ | ||||
| 		"hidden": true | ||||
| 	}, | ||||
| 	"WATER_IMMUNITY": | ||||
| 	{ | ||||
| 		"graphics": | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
| 	}, | ||||
| 	"scuttleBoat" : { | ||||
| 		"index" : 1, | ||||
| 		"targetType": "LOCATION", | ||||
| 		"targetType": "NO_TARGET", | ||||
| 		 | ||||
| 		"sounds": { | ||||
| 			"cast": "SCUTBOAT" | ||||
| @@ -40,7 +40,30 @@ | ||||
| 		}, | ||||
| 		"levels" : { | ||||
| 			"base":{ | ||||
| 				"range" : "X" | ||||
| 				"range" : "0", | ||||
| 				"effects" : { | ||||
| 					"visionsMonsters" : { | ||||
| 						"type" : "VISIONS", | ||||
| 						"subtype" : 0, | ||||
| 						"duration" : "ONE_DAY", | ||||
| 						"val" : 1, | ||||
| 						"valueType" : "INDEPENDENT_MAX" | ||||
| 					} | ||||
| 				}				 | ||||
| 			}, | ||||
| 			"advanced":{ | ||||
| 				"effects" : { | ||||
| 					"visionsMonsters" : { | ||||
| 						"val" : 2 | ||||
| 					} | ||||
| 				}			 | ||||
| 			}, | ||||
| 			"expert":{ | ||||
| 				"effects" : { | ||||
| 					"visionsMonsters" : { | ||||
| 						"val" : 3 | ||||
| 					} | ||||
| 				}			 | ||||
| 			} | ||||
| 		}, | ||||
| 		"flags" : { | ||||
| @@ -104,7 +127,29 @@ | ||||
| 		}, | ||||
| 		"levels" : { | ||||
| 			"base":{ | ||||
| 				"range" : "X" | ||||
| 				"range" : "0", | ||||
| 				"effects" : { | ||||
| 					"fly" : { | ||||
| 						"type" : "FLYING_MOVEMENT", | ||||
| 						"subtype" : 2, | ||||
| 						"duration" : "ONE_DAY", | ||||
| 						"val" : 0 //in fact unused  | ||||
| 					} | ||||
| 				}				 | ||||
| 			}, | ||||
| 			"advanced":{ | ||||
| 				"effects" : { | ||||
| 					"fly" : { | ||||
| 						"subtype" : 1 | ||||
| 					} | ||||
| 				}			 | ||||
| 			}, | ||||
| 			"expert":{ | ||||
| 				"effects" : { | ||||
| 					"fly" : { | ||||
| 						"subtype" : 1 | ||||
| 					} | ||||
| 				}			 | ||||
| 			} | ||||
| 		}, | ||||
| 		"flags" : { | ||||
| @@ -120,7 +165,29 @@ | ||||
| 		}, | ||||
| 		"levels" : { | ||||
| 			"base":{ | ||||
| 				"range" : "X" | ||||
| 				"range" : "0", | ||||
| 				"effects" : { | ||||
| 					"waterWalk" : { | ||||
| 						"type" : "WATER_WALKING", | ||||
| 						"subtype" : 2, | ||||
| 						"duration" : "ONE_DAY", | ||||
| 						"val" : 0 //in fact unused | ||||
| 					} | ||||
| 				}				 | ||||
| 			}, | ||||
| 			"advanced":{ | ||||
| 				"effects" : { | ||||
| 					"waterWalk" : { | ||||
| 						"subtype" : 1 | ||||
| 					} | ||||
| 				}			 | ||||
| 			}, | ||||
| 			"expert":{ | ||||
| 				"effects" : { | ||||
| 					"waterWalk" : { | ||||
| 						"subtype" : 1 | ||||
| 					} | ||||
| 				}			 | ||||
| 			} | ||||
| 		}, | ||||
| 		"flags" : { | ||||
|   | ||||
| @@ -19,37 +19,6 @@ | ||||
| #include "../CGameState.h" | ||||
| #include "../CGameInfoCallback.h" | ||||
|  | ||||
|  | ||||
| ///AdventureBonusingMechanics | ||||
| bool AdventureBonusingMechanics::applyAdventureEffects(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const | ||||
| { | ||||
| 	const int schoolLevel = parameters.caster->getSpellSchoolLevel(owner);	 | ||||
| 	const int subtype = spellLevelToSubtype(schoolLevel); | ||||
|  | ||||
| 	GiveBonus gb; | ||||
| 	gb.id = parameters.caster->id.getNum(); | ||||
| 	gb.bonus = Bonus(Bonus::ONE_DAY, bonusTypeID, Bonus::SPELL_EFFECT, 0, owner->id, subtype); | ||||
| 	env->sendAndApply(&gb);	 | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| int FlyMechanics::spellLevelToSubtype(const int schoolLevel) const | ||||
| { | ||||
| 	return schoolLevel >= 2 ? 1 : 2; //adv or expert | ||||
| } | ||||
|  | ||||
| int VisionsMechanics::spellLevelToSubtype(const int schoolLevel) const | ||||
| { | ||||
| 	//0,1 schoolLevel => 0 subtype | ||||
| 	//2 schoolLevel  => 1 subtype  | ||||
| 	//3 schoolLevel  => 2 subtype  | ||||
| 	int result = schoolLevel - 1; | ||||
| 	vstd::amin(result, 0); | ||||
| 	vstd::amax(result, 2); | ||||
| 	return result; //adv or expert | ||||
| } | ||||
|  | ||||
|  | ||||
| ///SummonBoatMechanics | ||||
| bool SummonBoatMechanics::applyAdventureEffects(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const | ||||
| { | ||||
|   | ||||
| @@ -13,37 +13,6 @@ | ||||
|  #include "CDefaultSpellMechanics.h" | ||||
|  | ||||
|  | ||||
| //todo: make configurable | ||||
| class AdventureBonusingMechanics: public DefaultSpellMechanics  | ||||
| { | ||||
| public:	 | ||||
| 	AdventureBonusingMechanics(CSpell * s, Bonus::BonusType _bonusTypeID): DefaultSpellMechanics(s), bonusTypeID(_bonusTypeID){};	 | ||||
| protected: | ||||
| 	bool applyAdventureEffects(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const override;	 | ||||
| 	 | ||||
| 	virtual int spellLevelToSubtype(const int schoolLevel) const = 0; | ||||
| private: | ||||
| 	Bonus::BonusType bonusTypeID; | ||||
| }; | ||||
|  | ||||
| //FLY & WATER_WALK | ||||
| class FlyMechanics: public AdventureBonusingMechanics | ||||
| { | ||||
| public:	 | ||||
| 	FlyMechanics(CSpell * s, Bonus::BonusType _bonusTypeID): AdventureBonusingMechanics(s, _bonusTypeID){}; | ||||
| protected: | ||||
| 	int spellLevelToSubtype(const int schoolLevel) const override; | ||||
| }; | ||||
|  | ||||
| //VISIONS & DISGUISE | ||||
| class VisionsMechanics: public AdventureBonusingMechanics | ||||
| { | ||||
| public:	 | ||||
| 	VisionsMechanics(CSpell * s, Bonus::BonusType _bonusTypeID): AdventureBonusingMechanics(s, _bonusTypeID){}; | ||||
| protected: | ||||
| 	int spellLevelToSubtype(const int schoolLevel) const override; | ||||
| }; | ||||
|  | ||||
| class SummonBoatMechanics: public DefaultSpellMechanics  | ||||
| { | ||||
| public: | ||||
|   | ||||
| @@ -191,9 +191,30 @@ bool DefaultSpellMechanics::adventureCast(const SpellCastEnvironment * env, Adve | ||||
|  | ||||
| bool DefaultSpellMechanics::applyAdventureEffects(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const | ||||
| { | ||||
| 	//There is no generic algorithm of adventure cast | ||||
| 	env->complain("Unimplemented adventure spell"); | ||||
| 	return false;		 | ||||
| 	if(owner->hasEffects()) | ||||
| 	{ | ||||
| 		const int schoolLevel = parameters.caster->getSpellSchoolLevel(owner); | ||||
| 		 | ||||
| 		std::vector<Bonus> bonuses; | ||||
| 		 | ||||
| 		owner->getEffects(bonuses, schoolLevel); | ||||
| 		 | ||||
| 		for(Bonus b : bonuses) | ||||
| 		{ | ||||
| 			GiveBonus gb; | ||||
| 			gb.id = parameters.caster->id.getNum(); | ||||
| 			gb.bonus = b; | ||||
| 			env->sendAndApply(&gb);			 | ||||
| 		} | ||||
| 		 | ||||
| 		return true; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		//There is no generic algorithm of adventure cast | ||||
| 		env->complain("Unimplemented adventure spell"); | ||||
| 		return false;				 | ||||
| 	}	 | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -358,8 +358,6 @@ const std::string& CSpell::getCastSound() const | ||||
| 	return castSound; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| si32 CSpell::getCost(const int skillLevel) const | ||||
| { | ||||
| 	return getLevelInfo(skillLevel).cost; | ||||
|   | ||||
| @@ -69,19 +69,16 @@ ISpellMechanics * ISpellMechanics::createMechanics(CSpell * s) | ||||
| 	case SpellID::DIMENSION_DOOR: | ||||
| 		return new DimensionDoorMechanics(s); | ||||
| 	case SpellID::FLY: | ||||
| 		return new FlyMechanics(s, Bonus::FLYING_MOVEMENT); //temporary | ||||
| 	case SpellID::WATER_WALK: | ||||
| 		return new FlyMechanics(s, Bonus::WATER_WALKING); //temporary | ||||
| 	case SpellID::VISIONS: | ||||
| 	case SpellID::DISGUISE: | ||||
| 		return new DefaultSpellMechanics(s); //implemented using bonus system | ||||
| 	case SpellID::TOWN_PORTAL: | ||||
| 		return new TownPortalMechanics(s); | ||||
| 	case SpellID::VIEW_EARTH: | ||||
| 		return new ViewEarthMechanics(s); | ||||
| 	case SpellID::VIEW_AIR:			 | ||||
| 		return new ViewAirMechanics(s); | ||||
| 	case SpellID::VISIONS: | ||||
| 		return new VisionsMechanics(s, Bonus::VISIONS); //temporary | ||||
| 	case SpellID::DISGUISE: | ||||
| 		return new VisionsMechanics(s, Bonus::DISGUISED); //temporary | ||||
| 	default:		 | ||||
| 		if(s->isRisingSpell()) | ||||
| 			return new SpecialRisingSpellMechanics(s); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user