Changeset 24 for src/map/battle.c
- Timestamp:
- 07/07/08 22:48:26 (17 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
src/map/battle.c
r19 r24 73 73 return 1; 74 74 } 75 return 0; 75 return 0; 76 76 } 77 77 … … 123 123 return 1; 124 124 } 125 return 0; 125 return 0; 126 126 } 127 127 … … 205 205 amotion = 1000; //Aegis places a damage-delay cap of 1 sec to non player attacks. [Skotlex] 206 206 add_timer(tick+amotion, battle_delay_damage_sub, src->id, (int)dat); 207 207 208 208 return 0; 209 209 } … … 211 211 int battle_attr_ratio(int atk_elem,int def_type, int def_lv) 212 212 { 213 213 214 214 if (atk_elem < 0 || atk_elem >= ELE_MAX) 215 215 return 100; … … 222 222 223 223 /*========================================== 224 * Does attribute fix modifiers. 224 * Does attribute fix modifiers. 225 225 * Added passing of the chars so that the status changes can affect it. [Skotlex] 226 226 * Note: Passing src/target == NULL is perfectly valid, it skips SC_ checks. … … 230 230 struct status_change *sc=NULL, *tsc=NULL; 231 231 int ratio; 232 232 233 233 if (src) sc = status_get_sc(src); 234 234 if (target) tsc = status_get_sc(target); 235 235 236 236 if (atk_elem < 0 || atk_elem >= ELE_MAX) 237 237 atk_elem = rand()%ELE_MAX; … … 277 277 if (!damage) 278 278 return 0; 279 279 280 280 if( mob_ksprotected(src, bl) ) 281 281 return 0; … … 295 295 if(!damage) return 0; 296 296 } 297 297 298 298 if (skill_num == PA_PRESSURE) 299 299 return damage; //This skill bypass everything else. … … 344 344 return 0; 345 345 } 346 346 347 347 if(sc->data[SC_DODGE] && !sc->opt1 && 348 348 (flag&BF_LONG || sc->data[SC_SPURT]) … … 372 372 return 0; 373 373 } 374 375 //Display red flashing aura effect of Adept Blood Lust [Brain] 376 if(sc->data[SC_LUST] && damage > 0){ 377 clif_specialeffect(bl, 548, AREA); 378 if(rand()%100 < 10) clif_specialeffect(bl, 455, AREA); //Red Lightnings, 1/10 attacks will show to prevent spam 379 }; 380 //Display blue flashing aura effect of Warlock Overwhelming Evil [Brain] 381 if(sc->data[SC_OVERWHELMING] && damage > 0) 382 clif_specialeffect(bl, 73, AREA); 383 384 // AT-Field [Brainstorm] 385 if(sc->data[SC_ATFIELD] && 386 rand()%100 < sc->data[SC_ATFIELD]->val2) 387 { //Blocks all skills. 388 clif_specialeffect(bl, 438, AREA); 389 //Shouldn't end until Breaker's non-weapon part connects. 390 if (skill_num == ASC_BREAKER || 391 skill_num == LK_SPIRALPIERCE || 392 skill_num == CG_ARROWVULCAN || 393 skill_num == SN_SHARPSHOOTING) 394 if (--sc->data[SC_ATFIELD]->val3 <= 0) //We make it work like Safety Wall 395 status_change_end(bl, SC_ATFIELD, -1); 396 return 0; 397 } 398 374 375 //Display red flashing aura effect of Adept Blood Lust [Brain] 376 if(sc->data[SC_LUST] && damage > 0){ 377 clif_specialeffect(bl, 548, AREA); 378 if(rand()%100 < 10) clif_specialeffect(bl, 455, AREA); //Red Lightnings, 1/10 attacks will show to prevent spam 379 }; 380 //Display blue flashing aura effect of Warlock Overwhelming Evil [Brain] 381 if(sc->data[SC_OVERWHELMING] && damage > 0) 382 clif_specialeffect(bl, 73, AREA); 383 //AT Field is Irrelevant, I believe. 384 // AT-Field [Brainstorm] 385 if(sc->data[SC_ATFIELD] && 386 rand()%100 < sc->data[SC_ATFIELD]->val2) 387 { //Blocks all skills. 388 clif_specialeffect(bl, 438, AREA); 389 //Shouldn't end until Breaker's non-weapon part connects. 390 if (skill_num == ASC_BREAKER || 391 skill_num == LK_SPIRALPIERCE || 392 skill_num == CG_ARROWVULCAN || 393 skill_num == SN_SHARPSHOOTING) 394 if (--sc->data[SC_ATFIELD]->val3 <= 0) //We make it work like Safety Wall 395 status_change_end(bl, SC_ATFIELD, -1); 396 return 0; 397 } 399 398 400 399 if (((sce=sc->data[SC_UTSUSEMI]) || sc->data[SC_BUNSINJYUTSU]) 401 && 400 && 402 401 flag&BF_WEAPON && !(skill_get_nk(skill_num)&NK_NO_CARDFIX_ATK)) 403 402 { … … 501 500 } 502 501 //SC effects from caster side. Currently none. 503 /* 502 /* 504 503 sc = status_get_sc(src); 505 504 if (sc && sc->count) { 506 505 } 507 */ 506 */ 508 507 if (battle_config.pk_mode && sd && bl->type == BL_PC && damage) 509 508 { … … 553 552 if (!damage) //No reductions to make. 554 553 return 0; 555 554 556 555 class_ = status_get_class(bl); 557 556 558 557 if (bl->type == BL_MOB) 559 558 md=(struct mob_data *)bl; 560 559 561 560 if(md && md->guardian_data) { 562 561 if(class_ == MOBID_EMPERIUM && flag&BF_SKILL) … … 640 639 641 640 if((skill = pc_checkskill(sd,AL_DEMONBANE)) > 0 && 642 (status->race==RC_UNDEAD || status->race==RC_DEMON) ) 641 target->type == BL_MOB && //This bonus doesnt work against players. 642 (battle_check_undead(status->race,status->def_ele) || status->race==RC_DEMON) ) 643 643 damage += (skill*(int)(3+(sd->status.base_level+1)*0.05)); // submitted by orn 644 644 //damage += (skill * 3); … … 649 649 damage += sd->status.str; 650 650 } 651 651 //AMIDOINITRITE?! V seems okay. 652 652 //Warlock Touch of Corruption (Mage-Monster Killer passive skill) [Brainstorm] 653 653 if((skill = pc_checkskill(sd,WL_CORRUPTION)) > 0 && target->type==BL_MOB ) 654 damage += (skill * (status->int_/10));654 damage += (skill * (status->int_/10)); 655 655 656 656 if(type == 0) … … 737 737 { //Mobs/Pets 738 738 if(flag&4) 739 { 739 { 740 740 atkmin = status->matk_min; 741 741 atkmax = status->matk_max; … … 753 753 { //Normal attacks 754 754 atkmin = status->dex; 755 755 756 756 if (sd->equip_index[type] >= 0 && sd->inventory_data[sd->equip_index[type]]) 757 757 atkmin = atkmin*(80 + sd->inventory_data[sd->equip_index[type]]->wlv*20)/100; … … 759 759 if (atkmin > atkmax) 760 760 atkmin = atkmax; 761 761 762 762 if(flag&2 && !(flag&16)) 763 763 { //Bows … … 768 768 } 769 769 } 770 770 771 771 if (sc && sc->data[SC_MAXIMIZEPOWER]) 772 772 atkmin = atkmax; 773 773 774 774 //Weapon Damage calculation 775 775 if (!(flag&1)) 776 776 damage = (atkmax>atkmin? rand()%(atkmax-atkmin):0)+atkmin; 777 else 777 else 778 778 damage = atkmax; 779 779 780 780 if (sd) 781 781 { … … 790 790 sd->right_weapon.atkmods[t_size])/100; 791 791 } 792 792 793 793 //Finally, add baseatk 794 794 if(flag&4) … … 796 796 else 797 797 damage += status->batk; 798 798 799 799 //rodatazone says that Overrefine bonuses are part of baseatk 800 800 //Here we also apply the weapon_atk_rate bonus so it is correctly applied on left/right hands. … … 823 823 if (!battle_config.arrow_decrement) 824 824 return; 825 825 826 826 if (skill) 827 827 { … … 891 891 unsigned idef2 : 1; //Ignore defense (left weapon) 892 892 unsigned pdef : 2; //Pierces defense (Investigate/Ice Pick) 893 unsigned pdef2 : 2; //1: Use def+def2/100, 2: Use def+def2/50 893 unsigned pdef2 : 2; //1: Use def+def2/100, 2: Use def+def2/50 894 894 unsigned infdef : 1; //Infinite defense (plants) 895 895 unsigned arrow : 1; //Attack is arrow-based … … 897 897 unsigned lh : 1; //Attack considers left hand (wd.damage2) 898 898 unsigned weapon : 1; //It's a weapon attack (consider VVS, and all that) 899 } flag; 899 } flag; 900 900 901 901 memset(&wd,0,sizeof(wd)); … … 944 944 ) 945 945 flag.arrow = 1; 946 946 947 947 if(skill_num){ 948 948 wd.flag |= battle_range_type(src, target, skill_num, skill_lv); … … 975 975 wd.type = 0x08; 976 976 break; 977 977 978 978 case GS_GROUNDDRIFT: 979 979 case KN_SPEARSTAB: … … 994 994 } else //Range for normal attacks. 995 995 wd.flag |= flag.arrow?BF_LONG:BF_SHORT; 996 996 997 997 if (!skill_num && tstatus->flee2 && rand()%1000 < tstatus->flee2) 998 998 { //Check for Lucky Dodge … … 1046 1046 //Therefore, we use the old value 3 on cases when an sd gets attacked by a mob 1047 1047 cri -= tstatus->luk*(!sd&&tsd?3:2); 1048 1048 1049 1049 if(tsc) 1050 1050 { … … 1114 1114 if(battle_config.agi_penalty_type && 1115 1115 battle_config.agi_penalty_target&target->type) 1116 { 1116 { 1117 1117 unsigned char attacker_count; //256 max targets should be a sane max 1118 1118 attacker_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv); … … 1172 1172 hitrate += hitrate * ( 2 * skill ) / 100; 1173 1173 1174 hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); 1174 hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); 1175 1175 1176 1176 if(rand()%100 >= hitrate) … … 1323 1323 ) 1324 1324 skillratio += sd->random_attack_increase_add; 1325 1325 1326 1326 ATK_RATE(skillratio); 1327 1327 } else { //Skills … … 1329 1329 { 1330 1330 case NC_DEATHHAND: // Necro Death Hand [Brain] 1331 skillratio += -25+25*skill_lv; 1331 skillratio += -25+25*skill_lv; //I wonder if it will accept that? 1332 1332 break; 1333 1333 case SM_BASH: … … 1335 1335 break; 1336 1336 case SM_MAGNUM: 1337 skillratio += 20*skill_lv; 1337 skillratio += 20*skill_lv; 1338 1338 break; 1339 1339 case MC_MAMMONITE: … … 1592 1592 int k = (wflag-1)/3; //+100% every 3 cells of distance 1593 1593 if( k > 2 ) k = 2; // ...but hard-limited to 300%. 1594 skillratio += 100 * k; 1594 skillratio += 100 * k; 1595 1595 } 1596 1596 break; … … 1607 1607 skillratio += 100 *(skill_lv-1); 1608 1608 break; 1609 /*Mercenary Skills [Brainstorm]1610 case MS_BASH:1611 skillratio += 30*skill_lv;1612 break;1613 case MER_CRASH:1614 skillratio += 10*skill_lv;1615 break;*/1616 1609 } 1617 1610 … … 1675 1668 break; 1676 1669 } 1677 1670 1678 1671 if(sd) 1679 1672 { … … 1747 1740 if(def2 < 1) def2 = 1; 1748 1741 } 1749 //Vitality reduction from rodatazone: http://rodatazone.simgaming.net/mechanics/substats.php#def 1742 //Vitality reduction from rodatazone: http://rodatazone.simgaming.net/mechanics/substats.php#def 1750 1743 if (tsd) //Sd vit-eq 1751 1744 { //[VIT*0.5] + rnd([VIT*0.3], max([VIT*0.3],[VIT^2/150]-1)) 1752 1745 vit_def = def2*(def2-15)/150; 1753 1746 vit_def = def2/2 + (vit_def>0?rand()%vit_def:0); 1754 1755 if(( sstatus->race==RC_UNDEAD || sstatus->race==RC_DEMON) &&1747 1748 if((battle_check_undead(sstatus->race,sstatus->def_ele) || sstatus->race==RC_DEMON) && //This bonus already doesnt work vs players 1756 1749 src->type == BL_MOB && (skill=pc_checkskill(tsd,AL_DP)) > 0) 1757 1750 vit_def += skill*(int)(3 +(tsd->status.base_level+1)*0.04); // submitted by orn … … 1761 1754 vit_def = def2 + (vit_def>0?rand()%vit_def:0); 1762 1755 } 1763 1756 1764 1757 if (battle_config.weapon_defense_type) { 1765 1758 vit_def += def1*battle_config.weapon_defense_type; … … 1784 1777 if (sc && skill_num != LK_SPIRALPIERCE) 1785 1778 { //SC skill damages 1786 if(sc->data[SC_AURABLADE]) 1779 if(sc->data[SC_AURABLADE]) 1787 1780 ATK_ADD(20*sc->data[SC_AURABLADE]->val1); 1788 1781 } … … 1821 1814 else 1822 1815 ARR_FIND(0, 3, i, t_class == sd->hate_mob[i]); 1823 if (i < 3 && (skill=pc_checkskill(sd,sg_info[i].anger_id))) 1816 if (i < 3 && (skill=pc_checkskill(sd,sg_info[i].anger_id))) 1824 1817 { 1825 1818 skillratio = sd->status.base_level + sstatus->dex + sstatus->luk; … … 1836 1829 } //Here ends flag.hit section, the rest of the function applies to both hitting and missing attacks 1837 1830 else if(wd.div_ < 0) //Since the attack missed... 1838 wd.div_ *= -1; 1831 wd.div_ *= -1; 1839 1832 1840 1833 if(skill_num == CR_GRANDCROSS || skill_num == NPC_GRANDDARKNESS) 1841 1834 return wd; //Enough, rest is not needed. 1842 1835 1843 if(sd && (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) 1836 if(sd && (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) 1844 1837 ATK_ADD(skill*2); 1845 1838 … … 1883 1876 { 1884 1877 int cardfix = 1000, cardfix_ = 1000; 1885 int t_race2 = status_get_race2(target); 1878 int t_race2 = status_get_race2(target); 1886 1879 if(sd->state.arrow_atk) 1887 1880 { … … 1943 1936 ATK_RATE2(cardfix/10, cardfix_/10); //What happens if you use right-to-left and there's no right weapon, only left? 1944 1937 } 1945 1938 1946 1939 if (skill_num == CR_SHIELDBOOMERANG || skill_num == PA_SHIELDCHAIN) { //Refine bonus applies after cards and elements. 1947 1940 short index= sd->equip_index[EQI_HAND_L]; … … 1997 1990 if (flag.lh && (flag.hit || wd.damage2>0)) 1998 1991 wd.damage2 = 1; 1999 if (!(battle_config.skill_min_damage&1)) 1992 if (!(battle_config.skill_min_damage&1)) 2000 1993 //Do not return if you are supposed to deal greater damage to plants than 1. [Skotlex] 2001 1994 return wd; … … 2027 2020 if (sd) 2028 2021 { 2029 if (!flag.rh && flag.lh) 2022 if (!flag.rh && flag.lh) 2030 2023 { //Move lh damage to the rh 2031 2024 wd.damage = wd.damage2; … … 2118 2111 breakrate[1] += sc->data[SC_MELTDOWN]->val3; 2119 2112 } 2120 } 2113 } 2121 2114 if (breakrate[0]) 2122 2115 skill_break_equip(target, EQP_WEAPON, breakrate[0], BCT_ENEMY); … … 2189 2182 else if (s_ele == -2) //Use status element 2190 2183 s_ele = status_get_attack_sc_element(src,status_get_sc(src)); 2191 2184 2192 2185 //Set miscellaneous data that needs be filled 2193 2186 if(sd) { … … 2199 2192 ad.flag |= battle_range_type(src, target, skill_num, skill_lv); 2200 2193 flag.infdef=(tstatus->mode&MD_PLANT?1:0); 2201 2194 2202 2195 switch(skill_num) 2203 2196 { … … 2226 2219 { //Calc base damage according to skill 2227 2220 case AL_HEAL: 2228 case PR_BENEDICTIO: 2221 case PR_BENEDICTIO: //Accidentally deleted the :, replaced it. No difference, so dont worry about this. 2229 2222 case AD_DARKHEAL: // Adept Dark Heal 2223 //Is this a good place for dark heal, i wonder? Seems fine though. 2230 2224 ad.damage = skill_calc_heal(src, target, skill_lv)/2; 2231 2225 break; … … 2346 2340 skillratio += 100 +100*skill_lv +100*(skill_lv/2); 2347 2341 break; 2348 case NC_DRAINLIFE: // Necro Drain Life [Brain] 2349 skillratio += 25*skill_lv; 2350 break; 2351 case WL_HELLFIRE: // Warlock Hellfire [Brain] 2352 skillratio += 25*skill_lv; 2353 break; 2354 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2355 skillratio += 20*skill_lv; 2356 break; 2357 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2358 skillratio += 400 + 300*skill_lv; //max 20*matk dmg after 60 seconds 2359 break; 2360 case WL_SEARING: // Warlock Searing Pain [Brain] 2361 if(status_get_sc(target)->data[SC_SEARING]) 2362 skillratio = 10*pc_checkskill(sd,WL_SEARING);//10% * skilllv 2363 break; //Else 100% Matk 2364 case WL_IMMOLATE: // Warlock Immolate [Brain] 2365 if(status_get_sc(target)->data[SC_IMMOLATE]) 2366 skillratio += 10*pc_checkskill(sd,WL_SEARING);//100% +10 * searing lv 2367 else skillratio += -20 + 20*skill_lv;// Else 80% + 20% * skill lv 2368 break; 2369 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2370 skillratio += 100 + 60*skill_lv + //damage bonus from other fire skills 2371 10*pc_checkskill(sd,WL_SEARING) + 10*pc_checkskill(sd,WL_IMMOLATE); 2372 break; 2342 2343 //NOTE: All the skills below here did NOT work before, may have been a stupid mistake but this is for reference. 2344 case NC_DRAINLIFE: // Necro Drain Life [Brain] 2345 skillratio += 25*skill_lv; 2346 break; 2347 case WL_HELLFIRE: // Warlock Hellfire [Brain] 2348 skillratio += 25*skill_lv; 2349 break; 2350 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2351 skillratio += 20*skill_lv; 2352 break; 2353 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2354 skillratio += 400 + 300*skill_lv; //max 20*matk dmg after 60 seconds 2355 break; 2356 case WL_SEARING: // Warlock Searing Pain [Brain] 2357 if(status_get_sc(target)->data[SC_SEARING]) 2358 skillratio = 10*pc_checkskill(sd,WL_SEARING);//10% * skilllv 2359 break; //Else 100% Matk 2360 case WL_IMMOLATE: // Warlock Immolate [Brain] 2361 if(status_get_sc(target)->data[SC_IMMOLATE]) 2362 skillratio += 10*pc_checkskill(sd,WL_SEARING);//100% +10 * searing lv 2363 else skillratio += -20 + 20*skill_lv;// Else 80% + 20% * skill lv 2364 break; 2365 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2366 skillratio += 100 + 60*skill_lv + //damage bonus from other fire skills 2367 10*pc_checkskill(sd,WL_SEARING) + 10*pc_checkskill(sd,WL_IMMOLATE); 2368 break; 2369 2373 2370 } 2374 2371 2375 2372 MATK_RATE(skillratio); 2376 2373 2377 2374 //Constant/misc additions from skills 2378 2375 if (skill_num == WZ_FIREPILLAR) … … 2426 2423 } 2427 2424 } 2428 2425 2429 2426 if (skill_num == NPC_EARTHQUAKE) 2430 2427 { //Adds atk2 to the damage, should be influenced by number of hits and skill-ratio, but not mdef reductions. [Skotlex] … … 2441 2438 if (!(nk&NK_NO_ELEFIX)) 2442 2439 ad.damage=battle_attr_fix(src, target, ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv); 2443 2444 2445 if(skill_num == WL_SHADOWBURN) { // Warlock Shadow Burn [Brain] 2446 // This is where we calculate the secondary damage 2447 if(ad.damage<1) ad.damage=1; 2448 struct Damage md = battle_calc_misc_attack(src,target,skill_num,skill_lv, mflag); 2449 if(md.damage<1) md.damage=1; //Changed MD = WD 2450 ad.damage += md.damage; // Same as above 2451 } 2452 2440 //Take this into account for errors. It looks out of place/outdated but I will not look further into it until I know. 2441 if(skill_num == WL_SHADOWBURN) { // Warlock Shadow Burn [Brain] 2442 // This is where we calculate the secondary damage 2443 if(ad.damage<1) ad.damage=1; 2444 struct Damage md = battle_calc_misc_attack(src,target,skill_num,skill_lv, mflag); 2445 if(md.damage<1) md.damage=1; 2446 ad.damage += md.damage; 2447 } 2453 2448 if (sd && !(nk&NK_NO_CARDFIX_ATK)) { 2454 2449 short t_class = status_get_class(target); … … 2505 2500 2506 2501 damage_div_fix(ad.damage, ad.div_); 2507 2502 2508 2503 if (flag.infdef && ad.damage) 2509 2504 ad.damage = ad.damage>0?1:-1; 2510 2505 2511 2506 ad.damage=battle_calc_damage(src,target,ad.damage,ad.div_,skill_num,skill_lv,ad.flag); 2512 2507 if (map_flag_gvg2(target->m)) … … 2545 2540 2546 2541 nk = skill_get_nk(skill_num); 2547 2542 2548 2543 sd = BL_CAST(BL_PC, src); 2549 2544 tsd = BL_CAST(BL_PC, target); 2550 2545 2551 2546 if(sd) { 2552 2547 sd->state.arrow_atk = 0; … … 2579 2574 if(mflag > 1) //Autocasted Blitz. 2580 2575 nk|=NK_SPLASHSPLIT; 2581 2576 2582 2577 if (skill_num == SN_FALCONASSAULT) 2583 2578 { 2584 2579 //Div fix of Blitzbeat 2585 2580 skill = skill_get_num(HT_BLITZBEAT, 5); 2586 damage_div_fix(md.damage, skill); 2581 damage_div_fix(md.damage, skill); 2587 2582 2588 2583 //Falcon Assault Modifier … … 2650 2645 case NPC_EVILLAND: 2651 2646 md.damage = (skill_lv>6)?666:skill_lv*100; 2652 //break; 2647 //Why the hell is this supposed to be above the break? 2653 2648 case WL_SHADOWBURN: // Warlock ShadowBurn dark element damage [Brain] 2654 2649 s_ele = ELE_DARK; 2655 2650 md.damage = ((300 + 20*skill_lv)/100)*((sstatus->int_*(rand()%300+500))/100); //Fixed between min and max matk for now 2656 2651 break; 2652 2653 // Wouldn't this work better? 2654 2655 /* case WL_SHADOWBURN: // Warlock ShadowBurn dark element damage [Brain] 2656 s_ele = ELE_DARK; 2657 md.damage = ((300 + 20*skill_lv)/100)*((sstatus->int_*(rand()%300+500))/100); //Fixed between min and max matk for now 2658 break;*/ 2657 2659 } 2658 2660 … … 2665 2667 2666 2668 damage_div_fix(md.damage, md.div_); 2667 2669 2668 2670 if (!(nk&NK_IGNORE_FLEE)) 2669 2671 { … … 2677 2679 hitrate=80; //Default hitrate 2678 2680 2679 if(battle_config.agi_penalty_type && 2681 if(battle_config.agi_penalty_type && 2680 2682 battle_config.agi_penalty_target&target->type) 2681 { 2683 { 2682 2684 unsigned char attacker_count; //256 max targets should be a sane max 2683 2685 attacker_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv); … … 2814 2816 if (*damage <= 0) continue; 2815 2817 //First and Third iterations: race, other two boss/nonboss state 2816 if (i == 0 || i == 2) 2818 if (i == 0 || i == 2) 2817 2819 type = race; 2818 2820 else 2819 2821 type = boss?RC_BOSS:RC_NONBOSS; 2820 2822 2821 2823 hp = wd->hp_drain[type].value; 2822 2824 if (wd->hp_drain[type].rate) … … 2841 2843 if (sd->sp_vanish_rate && rand()%1000 < sd->sp_vanish_rate) 2842 2844 status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->sp_vanish_per, false); 2843 // Adept Blood Pact drains 5% damage per hit [FlavioJS/Brain] 2845 //I don't know about this. But it looks like it fits fine 2846 // Adept Blood Pact drains 5% damage per hit [FlavioJS/Brain] 2844 2847 if( pc_checkskill(sd, AD_BLOODPACT) > 0 ) 2845 thp += battle_calc_drain(rdamage,1000,5);2848 thp += battle_calc_drain(rdamage,1000,5); 2846 2849 2847 2850 // Warlock Soul Steal drains 1%*skilllv damage per hit [Brain] 2848 2851 if( pc_checkskill(sd, WL_SOULSTEAL) > 0 ) 2849 tsp += battle_calc_drain(rdamage,1000,pc_checkskill(sd,WL_SOULSTEAL));2852 tsp += battle_calc_drain(rdamage,1000,pc_checkskill(sd,WL_SOULSTEAL)); 2850 2853 // Warlock Touch of Corruption burns 1%*skilllv damage as SP per hit [Brain] 2851 if( pc_checkskill(sd, WL_CORRUPTION) > 0 ) { 2852 int corrupt_sp; 2853 corrupt_sp = battle_calc_drain(rdamage,1000,pc_checkskill(sd,WL_CORRUPTION)); 2854 if(status_damage(NULL, tbl, 0, corrupt_sp, 0, 3)) 2855 rhp += corrupt_sp;//If SP damage was caused, increase HP damage too 2856 } 2854 if( pc_checkskill(sd, WL_CORRUPTION) > 0 ) {// This is the opener, whoops lol. 2855 int corrupt_sp; 2856 corrupt_sp = battle_calc_drain(rdamage,1000,pc_checkskill(sd,WL_CORRUPTION)); 2857 if(status_damage(NULL, tbl, 0, corrupt_sp, 0, 3)) 2858 rhp += corrupt_sp;//If SP damage was caused, increase HP damage too 2859 }// Where does this bracket open? 2860 2857 2861 if (!thp && !tsp) return; 2858 2862 2859 2863 status_heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain?3:1); 2860 2864 2861 2865 if (rhp || rsp) 2862 2866 status_zap(tbl, rhp, rsp); … … 2894 2898 if (tsc && !tsc->count) 2895 2899 tsc = NULL; 2896 2900 2897 2901 if (sd) 2898 2902 { … … 3057 3061 3058 3062 if (tsc) { 3059 if (tsc->data[SC_POISONREACT] && 3063 if (tsc->data[SC_POISONREACT] && 3060 3064 (rand()%100 < tsc->data[SC_POISONREACT]->val3 3061 3065 || sstatus->def_ele == ELE_POISON) && … … 3078 3082 return wd.dmg_lv; 3079 3083 } 3080 3084 //new battle check code, i speculate it. But it looks like it just calls other races and elements into one big one. 3081 3085 int battle_check_living(int race,int element)// Living creature check [Brain] 3082 3086 { 3083 3087 if(element == ELE_UNDEAD || race == RC_UNDEAD // Undead element and race check 3084 || race == RC_DEMON// Demon race check3085 || race == RC_FORMLESS// Formless race check3086 || element == ELE_GHOST){// Ghost element check3087 return 0;3088 || race == RC_DEMON // Demon race check 3089 || race == RC_FORMLESS // Formless race check 3090 || element == ELE_GHOST){ // Ghost element check 3091 return 0; 3088 3092 } 3089 3093 else { … … 3091 3095 } 3092 3096 } 3093 3094 3097 int battle_check_undead(int race,int element) 3095 3098 { … … 3219 3222 break; 3220 3223 //All else not specified is an invalid target. 3221 default: 3224 default: 3222 3225 return 0; 3223 3226 } … … 3336 3339 break; 3337 3340 } 3338 3339 if ((flag&BCT_ALL) == BCT_ALL) { //All actually stands for all attackable chars 3341 3342 if ((flag&BCT_ALL) == BCT_ALL) { //All actually stands for all attackable chars 3340 3343 if (target->type&BL_CHAR) 3341 3344 return 1; … … 3345 3348 if (flag == BCT_NOONE) //Why would someone use this? no clue. 3346 3349 return -1; 3347 3350 3348 3351 if (t_bl == s_bl) 3349 3352 { //No need for further testing. … … 3353 3356 return (flag&state)?1:-1; 3354 3357 } 3355 3358 3356 3359 if (map_flag_vs(m)) { //Check rivalry settings. 3357 3360 if (flag&(BCT_PARTY|BCT_ENEMY)) { … … 3403 3406 } 3404 3407 } 3405 3408 3406 3409 if (!state) //If not an enemy, nor a guild, nor party, nor yourself, it's neutral. 3407 3410 state = BCT_NEUTRAL; … … 3733 3736 { "require_glory_guild", &battle_config.require_glory_guild, 0, 0, 1, }, 3734 3737 { "idle_no_share", &battle_config.idle_no_share, 0, 0, INT_MAX, }, 3735 { "party_even_share_bonus", &battle_config.party_even_share_bonus, 0, 0, INT_MAX, }, 3738 { "party_even_share_bonus", &battle_config.party_even_share_bonus, 0, 0, INT_MAX, }, 3736 3739 { "delay_battle_damage", &battle_config.delay_battle_damage, 1, 0, 1, }, 3737 3740 { "hide_woe_damage", &battle_config.hide_woe_damage, 0, 0, 1, }, … … 3806 3809 { "auction_feeperhour", &battle_config.auction_feeperhour, 12000, 0, INT_MAX, }, 3807 3810 { "auction_maximumprice", &battle_config.auction_maximumprice, 500000000, 0, MAX_ZENY, }, 3811 //battle conf declarations, does this mean we add new lines to battle.conf? 3808 3812 //Vanaheim battle settings [Brainstorm] 3809 { "necro_retaliation", &battle_config.necro_retaliation, 1, 0, 1, }, 3810 { "disp_summon_stats", &battle_config.disp_summon_stats, 0, 0, 1, }, 3811 3813 { "necro_retaliation", &battle_config.necro_retaliation, 1, 0, 1, }, 3814 { "disp_summon_stats", &battle_config.disp_summon_stats, 0, 0, 1, }, 3812 3815 { "gm_viewequip_min_lv", &battle_config.gm_viewequip_min_lv, 0, 0, 99, }, 3816 { "homunculus_auto_vapor", &battle_config.homunculus_auto_vapor, 0, 0, 1, }, 3813 3817 }; 3814 3818 … … 3854 3858 battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10; 3855 3859 battle_config.max_aspd = 2000 - battle_config.max_aspd*10; 3856 battle_config.max_walk_speed = 100*DEFAULT_WALK_SPEED/battle_config.max_walk_speed; 3860 battle_config.max_walk_speed = 100*DEFAULT_WALK_SPEED/battle_config.max_walk_speed; 3857 3861 battle_config.max_cart_weight *= 10; 3858 3862 3859 3863 if(battle_config.max_def > 100 && !battle_config.weapon_defense_type) // added by [Skotlex] 3860 3864 battle_config.max_def = 100; … … 3862 3866 if(battle_config.min_hitrate > battle_config.max_hitrate) 3863 3867 battle_config.min_hitrate = battle_config.max_hitrate; 3864 3868 3865 3869 if(battle_config.pet_max_atk1 > battle_config.pet_max_atk2) //Skotlex 3866 3870 battle_config.pet_max_atk1 = battle_config.pet_max_atk2; 3867 3871 3868 3872 if (battle_config.day_duration && battle_config.day_duration < 60000) // added by [Yor] 3869 3873 battle_config.day_duration = 60000; 3870 3874 if (battle_config.night_duration && battle_config.night_duration < 60000) // added by [Yor] 3871 3875 battle_config.night_duration = 60000; 3872 3876 3873 3877 #ifndef CELL_NOSTACK 3874 3878 if (battle_config.cell_stack_limit != 1)