Index: src/map/battleutils.cpp =================================================================== --- src/map/battleutils.cpp (revision 3778) +++ src/map/battleutils.cpp (working copy) @@ -1216,6 +1216,7 @@ void HandleRangedAdditionalEffect(CCharEntity* PAttacker, CBattleEntity* PDefender,apAction_t* Action){ CItemWeapon* PAmmo = (CItemWeapon*)PAttacker->getStorage(LOC_INVENTORY)->GetItem(PAttacker->equip[SLOT_AMMO]); + CItemWeapon* PRanged = (CItemWeapon*)PAttacker->getStorage(LOC_INVENTORY)->GetItem(PAttacker->equip[SLOT_RANGED]); //add effects dont have 100% proc, presume level dependant. 95% chance but -5% for each level diff. //capped at 5% proc when mob is 18 (!!!) levels higher than you. uint8 chance = 95; @@ -1223,9 +1224,113 @@ chance -= 5*(PDefender->GetMLevel() - PAttacker->GetMLevel()); chance = dsp_cap(chance,5,95); } - if(rand()%100 >= chance || PAmmo==NULL){return;} + + if(rand()%100 >= chance) + { + if(PAmmo->getID() == 18168 || PAmmo->getID() == 18168) + { + } + else + { + return; + } + } + if(PRanged==NULL && PAmmo==NULL){return;} + + switch(PRanged->getID()){ + case 19261:{ // Jinx Discus + + //check curse resistance + if(rand()%100 >= PDefender->getMod(MOD_CURSERES)){return;} + { + // if(PDefender->hasImmunity(?) == false) // Curse immunity unknown + + if(PDefender->StatusEffectContainer->AddStatusEffect( + new CStatusEffect(EFFECT_CURSE,EFFECT_CURSE,1,0,20))) + { + Action->subeffect = SUBEFFECT_CURSE; + Action->subparam = EFFECT_CURSE; + Action->submessageID = 160; + Action->flag = 3; + } + + } + } + break; + case 18708: // Snakeeye + case 18709: // Snakeeye +1 + { + if(!PAttacker->StatusEffectContainer->HasStatusEffect(EFFECT_POISON)) + { + if(rand()%100 >= PDefender->getMod(MOD_POISONRES)) + { + if(PDefender->hasImmunity(256) == false) + { + if(PDefender->StatusEffectContainer->AddStatusEffect( + new CStatusEffect(EFFECT_POISON,EFFECT_POISON,1,3,30))) + { + Action->subeffect = SUBEFFECT_POISON; + Action->subparam = EFFECT_POISON; + Action->submessageID = 160; + Action->flag = 1; + } + } + } + } + } + break; + case 17293:{ // Yagudo Freezer + + if((((CMobEntity*)PDefender)->m_Family == 250) || ((CMobEntity*)PDefender)->m_Family == 270) + { + //check ice resistance + Action->subeffect = SUBEFFECT_ICE_DAMAGE; + Action->submessageID = 163; + Action->flag = 1; + //calculate damage + uint8 damage = (PAttacker->INT() - PDefender->INT())/2; + damage = dsp_cap(damage,0,50); + damage += 10; //10~60 + damage += rand()%8; //10~67 randomised + //set damage TODO: handle resist/staff/day + damage += (float)damage * ((float)PDefender->getMod(MOD_ICERES)/-100); + Action->subparam = damage; + PDefender->addHP(-damage); + } + } + break; + case 17291:{ // Flame Boomberang + + //check Fire resistance + Action->subeffect = SUBEFFECT_FIRE_DAMAGE; + Action->submessageID = 163; + Action->flag = 3; + //calculate damage + uint8 damage = (PAttacker->INT() - PDefender->INT())/2; + damage = dsp_cap(damage,0,50); + damage += 10; //10~60 + damage += rand()%8; //10~67 randomised + //set damage TODO: handle resist/staff/day + damage += (float)damage * ((float)PDefender->getMod(MOD_FIRERES)/-100); + Action->subparam = damage; + PDefender->addHP(-damage); + } + break; + } + + if(PAmmo==NULL){return;} + switch(PAmmo->getID()){ + case 18168: // Imperial Egg + case 18169:{ // Tzar's Egg + ((CMobEntity*)PDefender)->PEnmityContainer->UpdateEnmity(PAttacker, 1800, 1); + Action->subeffect = SUBEFFECT_NONE; + Action->subparam = EFFECT_PROVOKE; + Action->submessageID = 164; + Action->flag = 3; + } + break; case 17325:{ // kabura_arrow //check wind resistance @@ -1268,7 +1373,8 @@ } } break; - case 17329: // patriarch_protectors_arrow + case 18740: // Combat Caster Arrow + case 17329: // Patriarch Protectors Arrow case 18696:{ // Paralysis Arrow //check ice resistance if(rand()%100 <= PDefender->getMod(MOD_ICERES)){return;} @@ -1327,6 +1433,26 @@ PDefender->addHP(-damage); } break; + case 18729: // Djinn Arm + case 19196:{ //Darkling Bolt + //damage doesn't exceed ~67 unless wearing light staff/iceday/weather + //there isn't a formula, but INT affects damage, so this is guesstimated. It seems to be level + //invarient since its used on harder monsters for damage occasionally. Assuming the modifier + //is simply INT with a degree of randomisation + Action->subeffect = SUBEFFECT_DARKNESS_DAMAGE; + Action->submessageID = 163; + Action->flag = 1; + //calculate damage + uint8 damage = (PAttacker->INT() - PDefender->INT())/2; + damage = dsp_cap(damage,0,50); + damage += 10; //10~60 + damage += rand()%8; //10~67 randomised + //set damage TODO: handle resist/staff/day + damage += (float)damage * ((float)PDefender->getMod(MOD_DARKRES)/-100); + Action->subparam = damage; + PDefender->addHP(-damage); + } + break; case 18698:{ //Water Arrow //damage doesn't exceed ~67 unless wearing light staff/iceday/weather //there isn't a formula, but INT affects damage, so this is guesstimated. It seems to be level @@ -1429,6 +1555,27 @@ charutils::UpdateHealth(PAttacker); } break; + case 18140:{ // Phantom Tathlum + //10 % chance to drain, will restore MP 10% of damage done + if (rand()%100 <= PDefender->getMod(MOD_DARKRES)){return;} + + Action->subeffect = SUBEFFECT_MP_DRAIN; + Action->submessageID = 162; + Action->flag = 3; + int damage = (PAttacker->INT() - PDefender->INT())/2; + damage += (PAttacker->GetMLevel() - PDefender->GetMLevel()); + damage = dsp_cap(damage,0,50); + damage += PAttacker->GetMLevel()/2; + damage += rand()%20; //At 75 -> 37~56 low or 87~106 high + + damage += (float)damage * ((float)PDefender->getMod(MOD_DARKRES)/-100); + + Action->subparam = damage; + PDefender->addMP(-damage); + PAttacker->addMP(damage); + charutils::UpdateHealth(PAttacker); + } + break; case 18152:{ //Venom Bolt if(PDefender->hasImmunity(256) == false){ //check water resistance @@ -1485,6 +1632,7 @@ } } break; + case 21323: // Oxidant Bolt case 18148:{ //Acid Bolt //check wind resistance @@ -1500,6 +1648,7 @@ } break; + case 17315: // Riot Grenade case 17324:{ //Lightning Arrow //damage doesn't exceed ~67 //there isn't a formula. It seems to be level @@ -1519,6 +1668,7 @@ PDefender->addHP(-damage); } break; + case 17306: // Snoll Arm case 17323:{ //Ice Arrow //damage doesn't exceed ~67 unless wearing ice staff/iceday/weather //there isn't a formula, but INT affects damage, so this is guesstimated. It seems to be level @@ -1538,6 +1688,11 @@ PDefender->addHP(-damage); } break; + case 19202: // Smart Grenade + case 17314: // Quake Grenade + case 17313: // Grenade + case 17305: // Cluster Arm + case 17316: // Bomb Arm case 17327: // Grand knights Arrow case 17322:{ //Fire Arrow //damage doesn't exceed ~67 unless wearing ice staff/iceday/weather