AlexVinS %!s(int64=10) %!d(string=hai) anos
pai
achega
36cdb2968b

+ 8 - 4
client/windows/InfoWindows.cpp

@@ -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:

+ 5 - 0
config/bonuses.json

@@ -525,6 +525,11 @@
 			"icon":  "zvs/Lib1.res/E_RETAIL1"
 		}
 	},
+	
+	"VISIONS":
+	{
+		"hidden": true
+	},
 	"WATER_IMMUNITY":
 	{
 		"graphics":

+ 71 - 4
config/spells/adventure.json

@@ -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" : {

+ 0 - 31
lib/spells/AdventureSpellMechanics.cpp

@@ -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
 {

+ 0 - 31
lib/spells/AdventureSpellMechanics.h

@@ -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:

+ 24 - 3
lib/spells/CDefaultSpellMechanics.cpp

@@ -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;				
+	}	
 }
 
 

+ 0 - 2
lib/spells/CSpellHandler.cpp

@@ -358,8 +358,6 @@ const std::string& CSpell::getCastSound() const
 	return castSound;
 }
 
-
-
 si32 CSpell::getCost(const int skillLevel) const
 {
 	return getLevelInfo(skillLevel).cost;

+ 3 - 6
lib/spells/ISpellMechanics.cpp

@@ -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);