mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	* Mutare's special ability
* implemented vial of dragon blood * problems with teams discovered: maps with noncontinuous player occupancy (e.g. only red and teal) crash on loading. hideTiles has obvious bugs - loop goes through teams and team numbers, but fw.player is set to team number, as is the 4th argument to getTielsInRange.
This commit is contained in:
		| @@ -25,8 +25,10 @@ | ||||
| +  25 SPELL_RESISTANCE_AURA 0 55 0 	//war unicorn | ||||
| +  26 LEVEL_SPELL_IMMUNITY 3 0 0 	//green dragon's spell immunity | ||||
| +  26 TWO_HEX_ATTACK_BREATH 0 0 0  	//green dragon's breath | ||||
| +  26 DRAGON_NATURE 0 0 0			//green dragon is a dragon | ||||
| +  27 LEVEL_SPELL_IMMUNITY 4 0 0 	//gold dragon's spell immunity | ||||
| +  27 TWO_HEX_ATTACK_BREATH 0 0 0  	//gold dragon's breath | ||||
| +  27 DRAGON_NATURE 0 0 0			//gold dragon is a dragon | ||||
| +  30 NON_LIVING 0 0 0  	  		//stone gargoyles are non-living | ||||
| +  31 NON_LIVING 0 0 0  			//obsidian gargoyles are non-living | ||||
| +  32 NON_LIVING 0 0 0  			//stone golems are non-living | ||||
| @@ -88,8 +90,10 @@ | ||||
| +  67 DOUBLE_DAMAGE_CHANCE 20 0 0	//vampire lords | ||||
| +  67 SPELL_AFTER_ATTACK 0 42 20 	//dread knights | ||||
| +  68 ENEMY_MORALE_DECREASING -1 0 0		//bone dragon | ||||
| +  68 DRAGON_NATURE 0 0 0			//bone dragon is a dragon | ||||
| +  69 ENEMY_MORALE_DECREASING -1 0 0 		//ghost dragon | ||||
| +  69 SPELL_AFTER_ATTACK 0 75 20   	//ghost dragon | ||||
| +  69 DRAGON_NATURE 0 0 0			//ghost dragon is a dragon | ||||
| +  70 SPELL_IMMUNITY 0 62 0	  	   	//troglodytes are immune to blind | ||||
| +  71 SPELL_IMMUNITY 0 62 0		   	//infernal troglodytes are immune to blind | ||||
| +  72 RETURN_AFTER_STRIKE 0 0 0	   	//Harpies return after attack | ||||
| @@ -101,7 +105,9 @@ | ||||
| +  79 SELF_MORALE 0 0 0			   	//minotaur kings | ||||
| +  81 SPELL_AFTER_ATTACK 0 74 20   	//scorpicore | ||||
| +  82 LEVEL_SPELL_IMMUNITY 3 0 0   	//red dragon's spell immunity | ||||
| +  82 DRAGON_NATURE 0 0 0			//red dragon is a dragon | ||||
| +  83 LEVEL_SPELL_IMMUNITY 5 0 0   	//black dragon's spell immunity | ||||
| +  83 DRAGON_NATURE 0 0 0			//black dragon is a dragon | ||||
| +  87 ADDITIONAL_ATTACK 1 0 0		//wolf raider | ||||
| +  91 SPELLCASTER 2 43 6   	   	   	//ogre magi cast bloodlust | ||||
| +  93 SPELL_AFTER_ATTACK 0 77 20   	//thunderbirds | ||||
| @@ -166,13 +172,20 @@ | ||||
| + 125 NON_LIVING 0 0 0				//magma elementals shouldn't get morale | ||||
| + 127 NON_LIVING 0 0 0				//storm elementals shouldn't get morale | ||||
| + 129 NON_LIVING 0 0 0				//energy elementals shouldn't get morale | ||||
| + 132 DRAGON_NATURE 0 0 0			//azure dragon is a dragon | ||||
| - 133 FLYING						//Crystal Dragons do not fly | ||||
| + 133 DRAGON_NATURE 0 0 0			//crystal dragon is a dragon | ||||
| + 134 DRAGON_NATURE 0 0 0			//faerie dragon is a dragon | ||||
| + 135 DRAGON_NATURE 0 0 0			//rust dragon is a dragon | ||||
| + 140 DOUBLE_WIDE 0 0 0 			//boar should be treated as double-wide | ||||
| + 142 DOUBLE_WIDE 0 0 0 			//nomads should be treated as double-wide | ||||
| + 144 FULL_HP_REGENERATION 0 0 0 			//troll | ||||
| + 147 HEALER 0 0 0					//first aid tent can heal | ||||
| + 148 NOT_ACTIVE 0 0 0				//Ammo Cart | ||||
| + 149 SHOOTER 0 0 0					//arrow turret | ||||
| + 151 DRAGON_NATURE 0 0 0			//diamond dragon is a dragon | ||||
| + 154 DRAGON_NATURE 0 0 0			//blood dragon is a dragon | ||||
| + 155 DRAGON_NATURE 0 0 0			//darkness dragon is a dragon | ||||
| -  46 FLYING		  				//hell hound doesn't fly | ||||
| -  47 FLYING			  			//cerberus doesn't fly | ||||
| - 120 DOUBLE_WIDE					//psychic elemental | ||||
|   | ||||
| @@ -4,7 +4,7 @@ clientSettings | ||||
| { | ||||
| 	port=3030; | ||||
| 	resolution=800x600; // format: WxH | ||||
| 	bpp=24; // bytes per pixels: 24 or 32 | ||||
| 	bpp=24; // bits per pixels: 16, 24 or 32 | ||||
| 	fullscreen=0; //0 - windowed mode, 1 - fullscreen | ||||
| 	server=127.0.0.1; //use 127.0.0.1 for localhost | ||||
| 	localInformation=2; //0 - *all* information sent from server (safest and slowest); 1 - map information sent from server; 2 - all information local-storaged | ||||
|   | ||||
| @@ -165,8 +165,8 @@ | ||||
| 150	4	5	1	66 | ||||
| 150	4	5	2	66 | ||||
| 150	4	10	3	66 | ||||
| 151	13	1	1	5 | ||||
| 151	13	1	2	5 | ||||
| 151	13	5	1	0 | ||||
| 151	13	5	2	0 | ||||
| 152	1	0	0	4 | ||||
| 153	13	1	1	5 | ||||
| 153	13	1	1	5 | ||||
|   | ||||
| @@ -448,10 +448,11 @@ void CArtHandler::getAllowedArts(std::vector<CArtifact*> &out, std::vector<CArti | ||||
| 		out.push_back(art); | ||||
| 	} | ||||
| } | ||||
| void CArtHandler::giveArtBonus( int aid, Bonus::BonusType type, int val, int subtype, int valType ) | ||||
| void CArtHandler::giveArtBonus( int aid, Bonus::BonusType type, int val, int subtype, int valType, ILimiter * limiter ) | ||||
| { | ||||
| 	Bonus added(Bonus::PERMANENT,type,Bonus::ARTIFACT,val,aid,subtype); | ||||
| 	added.valType = valType; | ||||
| 	added.limiter = limiter; | ||||
| 	if(type == Bonus::MORALE || Bonus::LUCK) | ||||
| 		added.description = "\n" + artifacts[aid]->Name()  + (val > 0 ? " +" : " ") + boost::lexical_cast<std::string>(val); | ||||
| 	artifacts[aid]->bonuses.push_back(added); | ||||
| @@ -643,6 +644,10 @@ void CArtHandler::addBonuses() | ||||
| 	giveArtBonus(125,Bonus::ENEMY_CANT_ESCAPE,0); //Shackles of War | ||||
| 	giveArtBonus(126,Bonus::BLOCK_SPELLS_ABOVE_LEVEL,0);//Orb of Inhibition | ||||
|  | ||||
| 	//vial of dragon blood | ||||
| 	giveArtBonus(127, Bonus::PRIMARY_SKILL, +5, PrimarySkill::ATTACK, Bonus::BASE_NUMBER, new HasAnotherBonusLimiter(Bonus::DRAGON_NATURE)); | ||||
| 	giveArtBonus(127, Bonus::PRIMARY_SKILL, +5, PrimarySkill::DEFENSE, Bonus::BASE_NUMBER, new HasAnotherBonusLimiter(Bonus::DRAGON_NATURE)); | ||||
|  | ||||
| 	//Armageddon's Blade | ||||
| 	giveArtBonus(128, Bonus::SPELL, 3, 26, Bonus::INDEPENDENT_MAX); | ||||
| 	giveArtBonus(128, Bonus::SPELL_IMMUNITY,0, 26); | ||||
|   | ||||
| @@ -54,7 +54,7 @@ public: | ||||
|  | ||||
| class DLL_EXPORT CArtHandler //handles artifacts | ||||
| { | ||||
| 	void giveArtBonus(int aid, Bonus::BonusType type, int val, int subtype = -1, int valType = Bonus::BASE_NUMBER); | ||||
| 	void giveArtBonus(int aid, Bonus::BonusType type, int val, int subtype = -1, int valType = Bonus::BASE_NUMBER, ILimiter * limiter = NULL); | ||||
| public: | ||||
| 	std::vector<CArtifact*> treasures, minors, majors, relics; | ||||
| 	std::vector<CArtifact *> artifacts; | ||||
|   | ||||
| @@ -1130,14 +1130,16 @@ void CGHeroInstance::initObj() | ||||
| 						bonus.subtype = PrimarySkill::DEFENSE; | ||||
| 						break; | ||||
| 				} | ||||
| 				for (std::vector<CCreature*>::iterator i = VLC->creh->creatures.begin(); i != VLC->creh->creatures.end(); i++) | ||||
| 				{ //TODO: what if creature changes type during the game (Dragon Eye Ring?) | ||||
| 					if ((*i)->hasBonusOfType(Bonus::DRAGON_NATURE)) //TODO: implement it! | ||||
| 					{ | ||||
| 						bonus.limiter = new CCreatureTypeLimiter (**i, false); | ||||
| 						speciality.bonuses.push_back (bonus); | ||||
| 					} | ||||
| 				} | ||||
| // 				for (std::vector<CCreature*>::iterator i = VLC->creh->creatures.begin(); i != VLC->creh->creatures.end(); i++) | ||||
| // 				{ //TODO: what if creature changes type during the game (Dragon Eye Ring?) | ||||
| // 					if ((*i)->hasBonusOfType(Bonus::DRAGON_NATURE)) //TODO: implement it! | ||||
| // 					{ | ||||
| // 						bonus.limiter = new CCreatureTypeLimiter (**i, false); | ||||
| // 						speciality.bonuses.push_back (bonus); | ||||
| // 					} | ||||
| // 				} | ||||
| 				bonus.limiter = new HasAnotherBonusLimiter(Bonus::DRAGON_NATURE); | ||||
| 				speciality.bonuses.push_back (bonus); | ||||
| 				break; | ||||
| 			default: | ||||
| 				tlog2 << "Unexpected hero speciality " << type <<'\n'; | ||||
|   | ||||
| @@ -3255,10 +3255,10 @@ ui32 BattleInfo::calculateSpellDmg( const CSpell * sp, const CGHeroInstance * ca | ||||
| 	ret = usedSpellPower * dmgMultipliers[sp->id]; | ||||
| 	ret += sp->powers[spellSchoolLevel]; | ||||
| 	 | ||||
| 	//applying sorcerery secondary skill | ||||
| 	//applying sorcery secondary skill | ||||
| 	if(caster) | ||||
| 	{ | ||||
| 		ret *= (100.f + caster->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 25)) / 100.0f; //mysticism | ||||
| 		ret *= (100.f + caster->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, 25)) / 100.0f; //sorcery | ||||
| 		ret *= (100.f + caster->valOfBonuses(Bonus::SPELL_DAMAGE) + caster->valOfBonuses(Bonus::SPECIFIC_SPELL_DAMAGE, sp->id)) / 100.0f; | ||||
|  | ||||
| 		if(sp->air) | ||||
|   | ||||
| @@ -498,4 +498,26 @@ CCreatureTypeLimiter::CCreatureTypeLimiter() | ||||
| { | ||||
| 	creature = NULL; | ||||
| 	includeUpgrades = false; | ||||
| } | ||||
| } | ||||
|  | ||||
| HasAnotherBonusLimiter::HasAnotherBonusLimiter( TBonusType bonus ) | ||||
| 	: type(bonus), subtype(0), isSubtypeRelevant(false) | ||||
| { | ||||
| } | ||||
|  | ||||
| HasAnotherBonusLimiter::HasAnotherBonusLimiter( TBonusType bonus, TBonusSubtype _subtype ) | ||||
| 	: type(bonus), subtype(_subtype), isSubtypeRelevant(true) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool HasAnotherBonusLimiter::limit( const Bonus &b, const CBonusSystemNode &node ) const | ||||
| { | ||||
| 	if(isSubtypeRelevant) | ||||
| 	{ | ||||
| 		return !node.hasBonusOfType(static_cast<Bonus::BonusType>(type), subtype); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		return !node.hasBonusOfType(static_cast<Bonus::BonusType>(type)); | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -479,6 +479,25 @@ public: | ||||
| 		h & creature & includeUpgrades; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| class HasAnotherBonusLimiter : public ILimiter //applies only to nodes that have another bonus working | ||||
| { | ||||
| public: | ||||
| 	TBonusType type; | ||||
| 	TBonusSubtype subtype; | ||||
| 	ui8 isSubtypeRelevant; //check for subtype only if this is true | ||||
|  | ||||
| 	HasAnotherBonusLimiter(TBonusType bonus); | ||||
| 	HasAnotherBonusLimiter(TBonusType bonus, TBonusSubtype _subtype); | ||||
|  | ||||
| 	bool limit(const Bonus &b, const CBonusSystemNode &node) const; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler &h, const int version) | ||||
| 	{ | ||||
| 		h & type & subtype & isSubtypeRelevant; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| namespace Selector | ||||
| { | ||||
| 	extern DLL_EXPORT CSelectFieldEqual<TBonusType> type; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user