Index: src/map/utils/battleutils.cpp =================================================================== --- src/map/utils/battleutils.cpp (revision 4208) +++ src/map/utils/battleutils.cpp (working copy) @@ -441,7 +441,10 @@ } } + //damage bonus/penalty based on target's elemental resistance //matching day 10% bonus, matching weather 10% or 25% for double weather + //opposing day/weather 10/10/25 penalties + //TODO: randomise day and weather bonuses (33%/100% with elemental obi) float dBonus = 1.0; uint8 WeekDay = (uint8)CVanaTime::getInstance()->getWeekday(); WEATHER weather = GetWeather(PAttacker, false); @@ -448,79 +451,141 @@ switch(element){ case FIRE: + dBonus += (float)PDefender->getMod(MOD_FIRERES)/-100; if(WeekDay == FIRESDAY) dBonus += 0.1; + else if(WeekDay == WATERSDAY) + dBonus -= 0.1; if(weather == WEATHER_HOT_SPELL) dBonus += 0.1; else if(weather == WEATHER_HEAT_WAVE) dBonus += 0.25; + else if(weather == WEATHER_RAIN) + dBonus -= 0.1; + else if(weather == WEATHER_SQUALL) + dBonus -= 0.25; break; case EARTH: + dBonus += (float)PDefender->getMod(MOD_EARTHRES)/-100; if(WeekDay == EARTHSDAY) dBonus += 0.1; + else if(WeekDay == WINDSDAY) + dBonus -= 0.1; if(weather == WEATHER_DUST_STORM) dBonus += 0.1; else if(weather == WEATHER_SAND_STORM) dBonus += 0.25; + else if(weather == WEATHER_WIND) + dBonus -= 0.1; + else if(weather == WEATHER_GALES) + dBonus -= 0.25; break; case WATER: + dBonus += (float)PDefender->getMod(MOD_WATERRES)/-100; if(WeekDay == WATERSDAY) dBonus += 0.1; + else if(WeekDay == LIGHTNINGDAY) + dBonus -= 0.1; if(weather == WEATHER_RAIN) dBonus += 0.1; else if(weather == WEATHER_SQUALL) dBonus += 0.25; + else if(weather == WEATHER_THUNDER) + dBonus -= 0.1; + else if(weather == WEATHER_THUNDERSTORMS) + dBonus -= 0.25; break; case WIND: + dBonus += (float)PDefender->getMod(MOD_WINDRES)/-100; if(WeekDay == WINDSDAY) dBonus += 0.1; + else if(WeekDay == ICEDAY) + dBonus -= 0.1; if(weather == WEATHER_WIND) dBonus += 0.1; else if(weather == WEATHER_GALES) dBonus += 0.25; + else if(weather == WEATHER_SNOW) + dBonus -= 0.1; + else if(weather == WEATHER_BLIZZARDS) + dBonus -= 0.25; break; case ICE: + dBonus += (float)PDefender->getMod(MOD_ICERES)/-100; if(WeekDay == ICEDAY) dBonus += 0.1; + else if(WeekDay == FIRESDAY) + dBonus -= 0.1; if(weather == WEATHER_SNOW) dBonus += 0.1; else if(weather == WEATHER_BLIZZARDS) dBonus += 0.25; + else if(weather == WEATHER_HOT_SPELL) + dBonus -= 0.1; + else if(weather == WEATHER_HEAT_WAVE) + dBonus -= 0.25; break; case THUNDER: + dBonus += (float)PDefender->getMod(MOD_THUNDERRES)/-100; if(WeekDay == LIGHTNINGDAY) dBonus += 0.1; + else if(WeekDay == EARTHSDAY) + dBonus -= 0.1; if(weather == WEATHER_THUNDER) dBonus += 0.1; else if(weather == WEATHER_THUNDERSTORMS) dBonus += 0.25; + else if(weather == WEATHER_DUST_STORM) + dBonus -= 0.1; + else if(weather == WEATHER_SAND_STORM) + dBonus -= 0.25; break; case LIGHT: + dBonus += (float)PDefender->getMod(MOD_LIGHTRES)/-100; if(WeekDay == LIGHTSDAY) dBonus += 0.1; + else if(WeekDay == DARKSDAY) + dBonus -= 0.1; if(weather == WEATHER_AURORAS) dBonus += 0.1; else if(weather == WEATHER_STELLAR_GLARE) dBonus += 0.25; + else if(weather == WEATHER_GLOOM) + dBonus -= 0.1; + else if(weather == WEATHER_DARKNESS) + dBonus -= 0.25; break; case DARK: + dBonus += (float)PDefender->getMod(MOD_DARKRES)/-100; if(WeekDay == DARKSDAY) dBonus += 0.1; + else if(WeekDay == LIGHTSDAY) + dBonus -= 0.1; if(weather == WEATHER_GLOOM) dBonus += 0.1; else if(weather == WEATHER_DARKNESS) dBonus += 0.25; + else if(weather == WEATHER_AURORAS) + dBonus -= 0.1; + else if(weather == WEATHER_STELLAR_GLARE) + dBonus -= 0.25; break; } damage = (damage * (float)dBonus); + + damage = DmgTaken(PDefender, damage); + damage = MagicDmgTaken(PDefender, damage); + damage = damage - PDefender->getMod(MOD_PHALANX); + if(damage <= 0) + return 0; return HandleStoneskin(PDefender, damage); } @@ -1241,6 +1306,25 @@ return; + //Sirocco Kukri - base wind damage caps at 10, can be resisted and subject to dmgtaken, magicdmgtaken, phalanx and SS + //TODO: add day/weather + case 18018: + uint16 WDmg = 10; + WDmg += ((float)PDefender->getMod(MOD_WINDRES)/-10); + if(WDmg > 10) + WDmg = 10; + WDmg = DmgTaken(PDefender, WDmg); + WDmg = MagicDmgTaken(PDefender, WDmg); + WDmg = WDmg - PDefender->getMod(MOD_PHALANX); + if(WDmg < 0) + WDmg = 0; + Action->additionalEffect = SUBEFFECT_WIND_DAMAGE; + Action->addEffectMessage = 163; + Action->addEffectParam = HandleStoneskin(PDefender, WDmg); + PDefender->addHP(-Action->addEffectParam); + return; + + //Additional Effect: Dispel Weapons (10% chance needs verifying) case 16942: case 16944: