mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Tweaks
This commit is contained in:
		| @@ -262,13 +262,19 @@ void DefaultSpellMechanics::battleCast(const SpellCastEnvironment * env, const B | |||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	std::vector <const CStack*> reflected, reflectedIgnore;//for magic mirror | 	std::vector <const CStack*> reflected;//for magic mirror | ||||||
|  |  | ||||||
| 	cast(env, parameters, reflected); | 	cast(env, parameters, reflected); | ||||||
|  |  | ||||||
| 	//Magic Mirror effect | 	//Magic Mirror effect | ||||||
| 	for(auto & attackedCre : reflected) | 	for(auto & attackedCre : reflected) | ||||||
| 	{ | 	{ | ||||||
|  | 		if(parameters.mode == ECastingMode::MAGIC_MIRROR) | ||||||
|  | 		{ | ||||||
|  | 			logGlobal->error("Magic mirror recurrence!"); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		TStacks mirrorTargets = parameters.cb->battleGetStacksIf([this, parameters](const CStack * battleStack) | 		TStacks mirrorTargets = parameters.cb->battleGetStacksIf([this, parameters](const CStack * battleStack) | ||||||
| 		{ | 		{ | ||||||
| 			//Get all enemy stacks. Magic mirror can reflect to immune creature (with no effect) | 			//Get all enemy stacks. Magic mirror can reflect to immune creature (with no effect) | ||||||
| @@ -287,7 +293,7 @@ void DefaultSpellMechanics::battleCast(const SpellCastEnvironment * env, const B | |||||||
| 			mirrorParameters.effectPower = parameters.effectPower; | 			mirrorParameters.effectPower = parameters.effectPower; | ||||||
| 			mirrorParameters.effectValue = parameters.effectValue; | 			mirrorParameters.effectValue = parameters.effectValue; | ||||||
| 			mirrorParameters.enchantPower = parameters.enchantPower; | 			mirrorParameters.enchantPower = parameters.enchantPower; | ||||||
| 			cast(env, mirrorParameters, reflectedIgnore); | 			mirrorParameters.cast(env); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -34,15 +34,26 @@ BattleSpellCastParameters::Destination::Destination(const BattleHex & destinatio | |||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| BattleSpellCastParameters::BattleSpellCastParameters(const BattleInfo * cb, const ISpellCaster * caster, const CSpell * spell) | BattleSpellCastParameters::BattleSpellCastParameters(const BattleInfo * cb, const ISpellCaster * caster, const CSpell * spell_) | ||||||
| 	: cb(cb), caster(caster), casterColor(caster->getOwner()), casterSide(cb->whatSide(casterColor)), | 	: spell(spell_), cb(cb), caster(caster), casterColor(caster->getOwner()), casterSide(cb->whatSide(casterColor)), | ||||||
| 	casterHero(nullptr), | 	casterHero(nullptr), | ||||||
| 	mode(ECastingMode::HERO_CASTING), casterStack(nullptr), | 	mode(ECastingMode::HERO_CASTING), casterStack(nullptr), | ||||||
| 	spellLvl(-1),  effectLevel(-1), effectPower(0), enchantPower(0), effectValue(0) | 	spellLvl(-1),  effectLevel(-1), effectPower(0), enchantPower(0), effectValue(0) | ||||||
| { | { | ||||||
| 	casterStack = dynamic_cast<const CStack *>(caster); | 	casterStack = dynamic_cast<const CStack *>(caster); | ||||||
| 	casterHero = dynamic_cast<const CGHeroInstance *>(caster); | 	casterHero = dynamic_cast<const CGHeroInstance *>(caster); | ||||||
| 	prepare(spell); |  | ||||||
|  | 	spellLvl = caster->getSpellSchoolLevel(spell); | ||||||
|  | 	effectLevel = caster->getEffectLevel(spell); | ||||||
|  | 	effectPower = caster->getEffectPower(spell); | ||||||
|  | 	effectValue = caster->getEffectValue(spell); | ||||||
|  | 	enchantPower = caster->getEnchantPower(spell); | ||||||
|  |  | ||||||
|  | 	vstd::amax(spellLvl, 0); | ||||||
|  | 	vstd::amax(effectLevel, 0); | ||||||
|  | 	vstd::amax(enchantPower, 0); | ||||||
|  | 	vstd::amax(enchantPower, 0); | ||||||
|  | 	vstd::amax(effectValue, 0); | ||||||
| } | } | ||||||
|  |  | ||||||
| void BattleSpellCastParameters::aimToHex(const BattleHex& destination) | void BattleSpellCastParameters::aimToHex(const BattleHex& destination) | ||||||
| @@ -58,26 +69,16 @@ void BattleSpellCastParameters::aimToStack(const CStack * destination) | |||||||
| 		destinations.push_back(Destination(destination)); | 		destinations.push_back(Destination(destination)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void BattleSpellCastParameters::cast(const SpellCastEnvironment * env) | ||||||
|  | { | ||||||
|  | 	spell->battleCast(env, *this); | ||||||
|  | } | ||||||
|  |  | ||||||
| BattleHex BattleSpellCastParameters::getFirstDestinationHex() const | BattleHex BattleSpellCastParameters::getFirstDestinationHex() const | ||||||
| { | { | ||||||
| 	return destinations.at(0).hexValue; | 	return destinations.at(0).hexValue; | ||||||
| } | } | ||||||
|  |  | ||||||
| void BattleSpellCastParameters::prepare(const CSpell * spell) |  | ||||||
| { |  | ||||||
| 	spellLvl = caster->getSpellSchoolLevel(spell); |  | ||||||
| 	effectLevel = caster->getEffectLevel(spell); |  | ||||||
| 	effectPower = caster->getEffectPower(spell); |  | ||||||
| 	effectValue = caster->getEffectValue(spell); |  | ||||||
| 	enchantPower = caster->getEnchantPower(spell); |  | ||||||
|  |  | ||||||
| 	vstd::amax(spellLvl, 0); |  | ||||||
| 	vstd::amax(effectLevel, 0); |  | ||||||
| 	vstd::amax(enchantPower, 0); |  | ||||||
| 	vstd::amax(enchantPower, 0); |  | ||||||
| 	vstd::amax(effectValue, 0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ///ISpellMechanics | ///ISpellMechanics | ||||||
| ISpellMechanics::ISpellMechanics(CSpell * s): | ISpellMechanics::ISpellMechanics(CSpell * s): | ||||||
| 	owner(s) | 	owner(s) | ||||||
|   | |||||||
| @@ -45,11 +45,15 @@ public: | |||||||
| 		const BattleHex hexValue; | 		const BattleHex hexValue; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	BattleSpellCastParameters(const BattleInfo * cb, const ISpellCaster * caster, const CSpell * spell); | 	BattleSpellCastParameters(const BattleInfo * cb, const ISpellCaster * caster, const CSpell * spell_); | ||||||
| 	void aimToHex(const BattleHex & destination); | 	void aimToHex(const BattleHex & destination); | ||||||
| 	void aimToStack(const CStack * destination); | 	void aimToStack(const CStack * destination); | ||||||
|  |  | ||||||
|  | 	void cast(const SpellCastEnvironment * env); | ||||||
|  |  | ||||||
| 	BattleHex getFirstDestinationHex() const; | 	BattleHex getFirstDestinationHex() const; | ||||||
|  |  | ||||||
|  | 	const CSpell * spell; | ||||||
| 	const BattleInfo * cb; | 	const BattleInfo * cb; | ||||||
| 	const ISpellCaster * caster; | 	const ISpellCaster * caster; | ||||||
| 	const PlayerColor casterColor; | 	const PlayerColor casterColor; | ||||||
| @@ -71,8 +75,6 @@ public: | |||||||
| 	int enchantPower; | 	int enchantPower; | ||||||
| 	///for Archangel-like casting | 	///for Archangel-like casting | ||||||
| 	int effectValue; | 	int effectValue; | ||||||
| private: |  | ||||||
| 	void prepare(const CSpell * spell); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct DLL_LINKAGE SpellTargetingContext | struct DLL_LINKAGE SpellTargetingContext | ||||||
|   | |||||||
| @@ -4171,7 +4171,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba ) | |||||||
| 				parameters.effectLevel = parameters.spellLvl; | 				parameters.effectLevel = parameters.spellLvl; | ||||||
| 				parameters.mode = ECastingMode::CREATURE_ACTIVE_CASTING; | 				parameters.mode = ECastingMode::CREATURE_ACTIVE_CASTING; | ||||||
| 				parameters.aimToHex(destination);//todo: allow multiple destinations | 				parameters.aimToHex(destination);//todo: allow multiple destinations | ||||||
| 				spell->battleCast(spellEnv, parameters); | 				parameters.cast(spellEnv); | ||||||
| 			} | 			} | ||||||
| 			sendAndApply(&end_action); | 			sendAndApply(&end_action); | ||||||
| 			break; | 			break; | ||||||
| @@ -4382,7 +4382,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba ) | |||||||
| 			StartAction start_action(ba); | 			StartAction start_action(ba); | ||||||
| 			sendAndApply(&start_action); //start spell casting | 			sendAndApply(&start_action); //start spell casting | ||||||
|  |  | ||||||
| 			s->battleCast(spellEnv, parameters); | 			parameters.cast(spellEnv); | ||||||
|  |  | ||||||
| 			sendAndApply(&end_action); | 			sendAndApply(&end_action); | ||||||
| 			if( !gs->curB->battleGetStackByID(gs->curB->activeStack)) | 			if( !gs->curB->battleGetStackByID(gs->curB->activeStack)) | ||||||
| @@ -4523,7 +4523,7 @@ void CGameHandler::stackTurnTrigger(const CStack * st) | |||||||
| 					parameters.aimToHex(BattleHex::INVALID); | 					parameters.aimToHex(BattleHex::INVALID); | ||||||
| 					parameters.mode = ECastingMode::ENCHANTER_CASTING; | 					parameters.mode = ECastingMode::ENCHANTER_CASTING; | ||||||
|  |  | ||||||
| 					spell->battleCast(spellEnv, parameters); | 					parameters.cast(spellEnv); | ||||||
|  |  | ||||||
| 					//todo: move to mechanics | 					//todo: move to mechanics | ||||||
| 					BattleSetStackProperty ssp; | 					BattleSetStackProperty ssp; | ||||||
| @@ -5233,7 +5233,7 @@ void CGameHandler::attackCasting(const BattleAttack & bat, Bonus::BonusType atta | |||||||
| 				parameters.aimToStack(oneOfAttacked); | 				parameters.aimToStack(oneOfAttacked); | ||||||
| 				parameters.mode = ECastingMode::AFTER_ATTACK_CASTING; | 				parameters.mode = ECastingMode::AFTER_ATTACK_CASTING; | ||||||
|  |  | ||||||
| 				spell->battleCast(spellEnv, parameters); | 				parameters.cast(spellEnv); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -5262,7 +5262,7 @@ void CGameHandler::handleAfterAttackCasting( const BattleAttack & bat ) | |||||||
| 		parameters.effectPower = power; | 		parameters.effectPower = power; | ||||||
| 		parameters.mode = ECastingMode::AFTER_ATTACK_CASTING; | 		parameters.mode = ECastingMode::AFTER_ATTACK_CASTING; | ||||||
|  |  | ||||||
| 		spell->battleCast(this->spellEnv, parameters); | 		parameters.cast(spellEnv); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	attackCasting(bat, Bonus::SPELL_AFTER_ATTACK, attacker); | 	attackCasting(bat, Bonus::SPELL_AFTER_ATTACK, attacker); | ||||||
| @@ -5568,7 +5568,7 @@ void CGameHandler::runBattle() | |||||||
| 				parameters.aimToHex(BattleHex::INVALID); | 				parameters.aimToHex(BattleHex::INVALID); | ||||||
| 				parameters.mode = ECastingMode::PASSIVE_CASTING; | 				parameters.mode = ECastingMode::PASSIVE_CASTING; | ||||||
| 				parameters.enchantPower = b->val; | 				parameters.enchantPower = b->val; | ||||||
| 				spell->battleCast(spellEnv, parameters); | 				parameters.cast(spellEnv); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user