- Timestamp:
- 07/07/08 22:48:26 (17 years ago)
- Location:
- src
- Files:
-
- 20 modified
Legend:
- Unmodified
- Added
- Removed
-
src/common/mmo.h
r23 r24 11 11 12 12 //Remove/Comment this line to disable sc_data saving. [Skotlex] 13 #define ENABLE_SC_SAVING 13 #define ENABLE_SC_SAVING 14 14 //Remove/Comment this line to disable server-side hot-key saving support [Skotlex] 15 15 //Note that newer clients no longer save hotkeys in the registry! … … 31 31 #define MAX_FAME 1000000000 32 32 #define MAX_CART 100 33 #define MAX_SKILL 1 600 //1600 now, for necromancer skills overstepping bounds.33 #define MAX_SKILL 1100 // Bumped to 1100 for new quest skills, will need to further increase one day... [DracoRPG] 34 34 #define GLOBAL_REG_NUM 96 35 35 #define ACCOUNT_REG_NUM 64 … … 117 117 IT_AMMO, //10 118 118 IT_DELAYCONSUME,//11 119 IT_MAX 119 IT_MAX 120 120 }; 121 121 … … 309 309 int buyer_id; 310 310 char buyer_name[NAME_LENGTH]; 311 311 312 312 struct item item; 313 313 // This data is required for searching, as itemdb is not read by char server … … 526 526 JOB_XMAS, 527 527 JOB_SUMMER, 528 JOB_ADEPT = 30, // [Brain] 528 JOB_ADEPT = 30, // [Brain] 529 529 JOB_NECROMANCER, // [Brain] 530 JOB_WARLOCK, 531 530 JOB_WARLOCK, // Warlock [Brain] 532 531 JOB_MAX_BASIC, 533 532 … … 583 582 JOB_STAR_GLADIATOR2, 584 583 JOB_SOUL_LINKER, 585 586 584 JOB_MAX, 587 585 }; -
src/map/atcommand.c
r19 r24 1263 1263 { "supernovice", 23 }, 1264 1264 { "gunslinger", 24 }, 1265 { "gunner", 24 }, 1266 { "ninja", 25 }, 1265 1267 { "adept", 30 },//New job classes [Brainstorm] 1266 1268 { "necromancer", 31 }, 1267 1269 { "necro", 31 }, 1268 1270 { "warlock", 32 }, 1269 { "gunner", 24 },1270 { "ninja", 25 },1271 1271 { "high novice", 4001 }, 1272 1272 { "swordsman high", 4002 }, … … 7818 7818 { 7819 7819 if (sd->state.showsummon) { 7820 sd->state.showsummon = 0;7821 clif_displaymessage(fd, "Summon Stats will not be shown.");7822 return 0;7820 sd->state.showsummon = 0; 7821 clif_displaymessage(fd, "Summon Stats will not be shown."); 7822 return 0; 7823 7823 } 7824 7824 7825 7825 sd->state.showsummon = 1; 7826 clif_displaymessage(fd, "Summon Stats are now shown."); 7827 return 0; 7828 } 7829 7830 7826 clif_displaymessage(fd, "Summon Stats is now shown."); 7827 return 0; 7828 } 7831 7829 /*========================================== 7832 7830 * Barricade Build … … 8592 8590 { "killbarricade", 60, atcommand_barricade_destroy }, 8593 8591 //Vanaheim Commands 8594 { "showsummon", 8592 { "showsummon", 0, atcommand_showsummon}, //Brainstorm 8595 8593 }; 8596 8594 -
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) -
src/map/battle.h
r19 r24 88 88 89 89 int battle_check_undead(int race,int element); 90 // seems fine. 90 91 int battle_check_living(int race,int element); //Living Creature Check [Brain] 91 92 int battle_check_target(struct block_list *src, struct block_list *target,int flag); … … 453 454 int auction_feeperhour; 454 455 int auction_maximumprice; 456 //Declares the conf reader should check for these 455 457 //Vanaheim battle settings [Brainstorm] 456 458 int necro_retaliation; //Battle flag to force monsters to attack adept/necro/warlock summons [Brain] 457 459 int disp_summon_stats; //Battle Flag to show summoned monster stats [Brain] 458 460 int gm_viewequip_min_lv; 461 int homunculus_auto_vapor; //Keep Homunculus from Vaporizing when master dies. [L0ne_W0lf] 459 462 } battle_config; 460 463 -
src/map/chrif.c
r1 r24 18 18 #include "pc.h" 19 19 #include "pet.h" 20 #include "skill.h" 20 21 #include "status.h" 21 22 #include "mercenary.h" … … 911 912 { 912 913 sd->status.child = 0; 913 sd->status.skill[ 410].id = 0;914 sd->status.skill[ 410].lv = 0;915 sd->status.skill[ 410].flag = 0;914 sd->status.skill[WE_CALLBABY].id = 0; 915 sd->status.skill[WE_CALLBABY].lv = 0; 916 sd->status.skill[WE_CALLBABY].flag = 0; 916 917 clif_skillinfoblock(sd); 917 918 } … … 920 921 { 921 922 sd->status.child = 0; 922 sd->status.skill[ 410].id = 0;923 sd->status.skill[ 410].lv = 0;924 sd->status.skill[ 410].flag = 0;923 sd->status.skill[WE_CALLBABY].id = 0; 924 sd->status.skill[WE_CALLBABY].lv = 0; 925 sd->status.skill[WE_CALLBABY].flag = 0; 925 926 clif_skillinfoblock(sd); 926 927 } -
src/map/clif.c
r1 r24 7062 7062 clif_weather_check(sd); 7063 7063 if( pc_issit(sd) ) 7064 clif_sitting(&sd->bl); 7064 clif_sitting(&sd->bl); // FIXME: just send to self, not area 7065 7065 if( pc_isdead(sd) ) //When you refresh, resend the death packet. 7066 clif_clearunit_ area(&sd->bl,1);7066 clif_clearunit_single(sd->bl.id,1,sd->fd); 7067 7067 7068 7068 #ifndef TXT_ONLY -
src/map/clif.h
r1 r24 176 176 void clif_divorced(struct map_session_data* sd, const char* name); 177 177 //void clif_callpartner(struct map_session_data *sd); 178 void clif_adopt_process(struct map_session_data *sd);179 178 void clif_soundeffect(struct map_session_data* sd, struct block_list* bl, const char* name, int type); 180 179 int clif_soundeffectall(struct block_list* bl, const char *name, int type, enum send_target coverage); -
src/map/itemdb.c
r19 r24 242 242 if (jobmask & 1<<JOB_NINJA) 243 243 bclass[0] |= 1<<MAPID_NINJA; 244 //why does it have job masks as 26 27 28? wasnt it 29 30 31 or something? 244 245 //Custom Classes 245 246 if (jobmask & 1<<26) // Adept [Brain] 246 bclass[0] |= 1<<MAPID_ADEPT;247 bclass[0] |= 1<<MAPID_ADEPT; 247 248 if (jobmask & 1<<27) // Necromancer [Brain] 248 bclass[1] |= 1<<MAPID_ADEPT;249 bclass[1] |= 1<<MAPID_ADEPT; 249 250 if (jobmask & 1<<28) // Warlock [Brain] 250 bclass[2] |= 1<<MAPID_ADEPT;251 bclass[2] |= 1<<MAPID_ADEPT; 251 252 } 252 253 -
src/map/mail.c
r1 r24 56 56 57 57 if (flag && sd->mail.zeny > 0) 58 { //Zeny send 59 if(log_config.zeny) 60 log_zeny(sd, "E", sd, -sd->mail.zeny); 61 58 62 sd->status.zeny -= sd->mail.zeny; 59 63 } 60 64 sd->mail.zeny = 0; 61 65 clif_updatestatus(sd, SP_ZENY); … … 147 151 148 152 if( zeny > 0 ) 153 { //Zeny recieve 154 if(log_config.zeny) 155 log_zeny(sd, "E", sd, zeny); 149 156 pc_getzeny(sd, zeny); 157 } 150 158 } 151 159 … … 166 174 nullpo_retv(sd); 167 175 nullpo_retv(msg); 176 177 // Item recieve (due to failure) 178 if(log_config.enable_logs&0x2000) 179 log_pick_pc(sd, "E", msg->item.nameid, msg->item.amount, &msg->item); 168 180 169 181 pc_additem(sd, &msg->item, msg->item.amount); … … 171 183 if( msg->zeny > 0 ) 172 184 { 185 //Zeny recieve (due to failure) 186 if(log_config.zeny) 187 log_zeny(sd, "E", sd, msg->zeny); 188 173 189 sd->status.zeny += msg->zeny; 174 190 clif_updatestatus(sd, SP_ZENY); -
src/map/map.h
r19 r24 77 77 MAPID_XMAS, 78 78 MAPID_SUMMER, 79 //Bit masking is used here? 79 80 MAPID_ADEPT = 0x0E, // Adept [Brain] 80 81 //2_1 classes … … 87 88 MAPID_ASSASSIN, 88 89 MAPID_STAR_GLADIATOR, 90 //and here and down there 89 91 MAPID_NECROMANCER = JOBL_2_1|0x0E, // Necromancer [Brain] 90 92 //2_2 classes … … 96 98 MAPID_ROGUE, 97 99 MAPID_SOUL_LINKER, 100 //see. why are the bitmasks like this? Xray thing? 98 101 MAPID_WARLOCK = JOBL_2_2|0x0E, // Warlock [Flavio] 99 102 //1-1, advanced … … 293 296 SP_PERFECT_HIT_RATE,SP_PERFECT_HIT_ADD_RATE,SP_CRITICAL_RATE,SP_GET_ZENY_NUM,SP_ADD_GET_ZENY_NUM, // 1038-1042 294 297 SP_ADD_DAMAGE_CLASS,SP_ADD_MAGIC_DAMAGE_CLASS,SP_ADD_DEF_CLASS,SP_ADD_MDEF_CLASS, // 1043-1046 295 SP_ADD_MONSTER_DROP_ITEM,SP_DEF_RATIO_ATK_ELE,SP_DEF_RATIO_ATK_RACE,SP_ ADD_SPEED, // 1047-1050298 SP_ADD_MONSTER_DROP_ITEM,SP_DEF_RATIO_ATK_ELE,SP_DEF_RATIO_ATK_RACE,SP_FREE3, // 1047-1050 296 299 SP_HIT_RATE,SP_FLEE_RATE,SP_FLEE2_RATE,SP_DEF_RATE,SP_DEF2_RATE,SP_MDEF_RATE,SP_MDEF2_RATE, // 1051-1057 297 300 SP_SPLASH_RANGE,SP_SPLASH_ADD_RANGE,SP_AUTOSPELL,SP_HP_DRAIN_RATE,SP_SP_DRAIN_RATE, // 1058-1062 … … 320 323 //2020 (SP_FREE) (previously SP_ADD_DAMAGE_BY_CLASS) 321 324 //2033 (SP_FREE2) (previously SP_ADDEFF_WHENHIT_SHORT) 325 //1050 (SP_FREE3) (previously SP_ADD_SPEED) 322 326 }; 323 327 -
src/map/mob.c
r19 r24 2026 2026 break; 2027 2027 //Let players decide whether to retaliate versus the master or the mob. [Skotlex] 2028 /*if (md2->master_id && battle_config.retaliate_to_master) 2029 md->attacked_id = md2->master_id;*/ 2030 if (md2->master_id && battle_config.retaliate_to_master) 2031 { 2032 //necro_retaliation config (same as above, but only works for adept/necro/warlock summons) [Brainstorm] 2033 if(!battle_config.necro_retaliation && (md2->class_ >= 3100 && md2->class_ <= 3235)) 2034 md->attacked_id = src->id; 2035 else md->attacked_id = md2->master_id; //All normal summons 2036 } 2028 if (md2->master_id && battle_config.retaliate_to_master) 2029 //this is odd... does that mean if you have a pet out it will get attecked instead of you? 2030 { 2031 //necro_retaliation config (same as above, but only works for adept/necro/warlock summons) [Brainstorm] 2032 if(!battle_config.necro_retaliation && (md2->class_ >= 3100 && md2->class_ <= 3235)) 2033 md->attacked_id = src->id; 2034 else md->attacked_id = md2->master_id; //All normal summons 2035 } 2037 2036 2038 2037 else … … 2556 2555 mob_script_callback(md, src, CALLBACK_DEAD); 2557 2556 else 2558 if(md->npc_event[0] && !md-> npc_killmonster)2557 if(md->npc_event[0] && !md->state.npc_killmonster) 2559 2558 { 2560 2559 md->status.hp = 0; //So that npc_event invoked functions KNOW that I am dead. … … 2836 2835 } 2837 2836 2837 //Weird structure, is this in the right place? 2838 2838 /// Count slaves with a certain master and class. by FlavioJS [Brain] 2839 2839 static int mob_countslave_class_sub(struct block_list* bl, va_list ap) … … 2851 2851 if( md->master_id == id ) 2852 2852 {// has the correct master 2853 int i;2854 for( i = 0; i < count; ++i )2855 {2856 if( md->class_ == classes[i] )2857 return 1;2858 }2853 int i; 2854 for( i = 0; i < count; ++i ) 2855 { 2856 if( md->class_ == classes[i] ) 2857 return 1; 2858 } 2859 2859 } 2860 2860 return 0; … … 4033 4033 "mob_boss.txt", 4034 4034 "mob_pouch.txt", 4035 "mob_familiar.txt" 4036 };4035 "mob_familiar.txt" // familiar By FlavioJS [Brain] 4036 };//mob_familiar.txt make sure the name is right. 4037 4037 4038 4038 memset(&summon, 0, sizeof(summon)); -
src/map/mob.h
r19 r24 12 12 13 13 14 #define MAX_RANDOMMONSTER 5 15 #define MAX_MOB_RACE_DB 6 14 #define MAX_RANDOMMONSTER 5 //seems okay. just makes it so you can hold 5 summons at once. 15 #define MAX_MOB_RACE_DB 6 //should this be changed though? I assume since undead was only expanded it's fine but it may fix something later. 16 16 17 17 // Change this to increase the table size in your mob_db to accomodate a larger mob database. 18 18 // Be sure to note that IDs 4001 to 4048 are reserved for advanced/baby/expanded classes. 19 19 // Notice that the last 1000 entries are used for player clones, so always set this to desired value +1000 20 #define MAX_MOB_DB 7000 20 #define MAX_MOB_DB 7000 //7000 should work fine. 21 21 22 22 //The number of drops all mobs have and the max drop-slot that the steal skill will attempt to steal from. … … 113 113 unsigned char attacked_count; //For rude attacked. 114 114 int provoke_flag; // Celest 115 unsigned npc_killmonster: 1; //for new killmonster behavior 115 116 } state; 116 117 struct guardian_data* guardian_data; … … 142 143 unsigned int skilldelay[MAX_MOBSKILL]; 143 144 char npc_event[50]; 144 int npc_killmonster; //for new killmonster behavior145 145 }; 146 146 … … 270 270 int mob_countslave(struct block_list *bl); 271 271 int mob_convertslave(struct mob_data *md); 272 // I really don't see the point in this... 272 273 int mob_countslave_class(struct block_list* bl, int count, short* classes); // By FlavioJS [Brain] 273 274 -
src/map/pc.c
r22 r24 133 133 } 134 134 135 void pc_setinvincibletimer(struct map_session_data* sd, int val) 135 void pc_setinvincibletimer(struct map_session_data* sd, int val) 136 136 { 137 137 nullpo_retv(sd); … … 258 258 case MAPID_TAEKWON: // Taekwon 259 259 clif_fame_taekwon(sd,count); 260 break; 260 break; 261 261 } 262 262 chrif_updatefamelist(sd); … … 267 267 { 268 268 int i; 269 269 270 270 switch(job){ 271 271 case MAPID_BLACKSMITH: // Blacksmith … … 330 330 sd->status.clothes_color=0; 331 331 332 //Only copy the Cart/Peco/Falcon options, the rest are handled via 332 //Only copy the Cart/Peco/Falcon options, the rest are handled via 333 333 //status change load/saving. [Skotlex] 334 334 sd->status.option = sd->sc.option&(OPTION_CART|OPTION_FALCON|OPTION_RIDING); 335 335 336 336 if (sd->sc.data[SC_JAILED]) 337 337 { //When Jailed, do not move last point. … … 403 403 if (!itemdb_isequip2(sd->inventory_data[n])) 404 404 return 0; //Not equippable by players. 405 405 406 406 ep = sd->inventory_data[n]->equip; 407 407 if(sd->inventory_data[n]->look == W_DAGGER || … … 518 518 if (itemdb_isspecial(item->card[0])) 519 519 return 1; 520 520 521 521 ARR_FIND( 0, s, i, item->card[i] && (data = itemdb_exists(item->card[i])) != NULL && data->flag.no_equip&flag ); 522 522 return( i < s ) ? 0 : 1; … … 535 535 if( i == EQI_HEAD_MID && sd->equip_index[EQI_HEAD_LOW] == index ) continue; 536 536 if( i == EQI_HEAD_TOP && (sd->equip_index[EQI_HEAD_MID] == index || sd->equip_index[EQI_HEAD_LOW] == index) ) continue; 537 537 538 538 if( !sd->inventory_data[index] ) continue; 539 539 … … 568 568 // Parents need to have their ring equipped 569 569 if( !pc_isequipped(p1_sd, WEDDING_RING_M) && !pc_isequipped(p1_sd, WEDDING_RING_F) ) 570 return false; 570 return false; 571 571 572 572 if( !pc_isequipped(p2_sd, WEDDING_RING_M) && !pc_isequipped(p2_sd, WEDDING_RING_F) ) … … 603 603 int job, joblevel; 604 604 unsigned int jobexp; 605 605 606 606 if( !pc_can_Adopt(p1_sd, p2_sd, b_sd) ) 607 607 return false; … … 632 632 pc_skill(p1_sd, WE_CALLBABY, 1, 0); 633 633 pc_skill(p2_sd, WE_CALLBABY, 1, 0); 634 634 635 635 return true; 636 636 } … … 660 660 return 0; 661 661 if(map_flag_gvg(sd->bl.m) && ((item->flag.no_equip&2) || !pc_isAllowedCardOn(sd,item->slot,n,2))) 662 return 0; 662 return 0; 663 663 if(map[sd->bl.m].flag.restricted) 664 664 { … … 669 669 670 670 if (sd->sc.count) { 671 671 672 672 if(item->equip & EQP_ARMS && item->type == IT_WEAPON && sd->sc.data[SC_STRIPWEAPON]) // Also works with left-hand weapons [DracoRPG] 673 673 return 0; … … 698 698 if (!(1<<(sd->class_&MAPID_BASEMASK)&item->class_base[(sd->class_&JOBL_2_1)?1:((sd->class_&JOBL_2_2)?2:0)])) 699 699 return 0; 700 700 701 701 //Not equipable by upper class. [Skotlex] 702 702 if(!(1<<((sd->class_&JOBL_UPPER)?1:((sd->class_&JOBL_BABY)?2:0))&item->class_upper)) … … 730 730 sd->class_ = MAPID_NOVICE; 731 731 } else 732 sd->class_ = i; 732 sd->class_ = i; 733 733 //Initializations to null/0 unneeded since map_session_data was filled with 0 upon allocation. 734 734 if(!sd->status.hp) pc_setdead(sd); … … 739 739 sd->npc_timer_id = -1; 740 740 sd->pvp_timer = -1; 741 741 742 742 sd->canuseitem_tick = tick; 743 743 sd->cantalk_tick = tick; … … 754 754 if (battle_config.disp_zeny) 755 755 sd->state.showzeny = 1; 756 //Checks the battleflags to see if player has selected to see summon's stats. 757 //I see nothing wrong here. 756 758 //Vanaheim settings [Brainstorm] 757 759 if (battle_config.disp_summon_stats) // Battle Flag to Show Summoned Monster Stats [Brain] 758 sd->state.showsummon = 1; 759 760 sd->state.showsummon = 1; 761 762 760 763 if (!(battle_config.display_skill_fail&2)) 761 764 sd->state.showdelay = 1; 762 765 763 766 // ACe`FbN 764 767 pc_setinventorydata(sd); 765 768 pc_checkitem(sd); 766 769 767 770 status_change_init(&sd->bl); 768 771 if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && (pc_isGM(sd) >= get_atcommand_level(atcommand_hide))) … … 819 822 sd->packet_ver, CONVIP(ip)); 820 823 } 821 824 822 825 // Send friends list 823 826 clif_friendslist_send(sd); … … 866 869 } 867 870 868 //Attempts to set a mob. 871 //Attempts to set a mob. 869 872 int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) 870 873 { … … 898 901 { 899 902 int i,j; 900 903 901 904 sd->change_level = pc_readglobalreg(sd,"jobchange_level"); 902 905 sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER"); … … 932 935 if (i < sd->status.skill[sd->cloneskill_id].lv) 933 936 sd->status.skill[sd->cloneskill_id].lv = i; 934 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 937 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 935 938 } 936 939 } … … 945 948 if (sd->status.guild_id) 946 949 guild_member_joined(sd); 947 950 948 951 // pet 949 952 if (sd->status.pet_id > 0) … … 1016 1019 } 1017 1020 c = pc_class2idx(c); 1018 for(i=0;i<MAX_SKILL;i++){ 1021 for(i=0;i<MAX_SKILL;i++){ 1019 1022 if (sd->status.skill[i].flag != 13) //Don't touch plagiarized skills 1020 1023 sd->status.skill[i].id=0; //First clear skills. 1021 1024 } 1022 1025 1023 for(i=0;i<MAX_SKILL;i++){ 1024 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1026 for(i=0;i<MAX_SKILL;i++){ 1027 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1025 1028 sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; 1026 1029 sd->status.skill[i].flag=0; … … 1111 1114 sd->status.skill[id].flag=1; //So it is not saved, and tagged as a "bonus" skill. 1112 1115 } else 1113 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1116 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1114 1117 sd->status.skill[id].lv= skill_tree_get_max(id, sd->status.class_); 1115 1118 } … … 1127 1130 if(battle_config.skillfree) 1128 1131 return; //Function serves no purpose if this is set 1129 1132 1130 1133 i = pc_calc_skilltree_normalize_job(sd); 1131 1134 c = pc_mapid2jobid(i, sd->status.sex); … … 1142 1145 if(sd->status.skill[id].id) //Already learned 1143 1146 continue; 1144 1147 1145 1148 for(j=0;j<5;j++) { 1146 1149 if((k=skill_tree[c][i].need[j].id)) … … 1163 1166 if (sd->status.job_level < skill_tree[c][i].joblv) 1164 1167 continue; 1165 1168 1166 1169 j = skill_get_inf2(id); 1167 1170 if(!sd->status.skill[id].lv && ( … … 1202 1205 int skill_point; 1203 1206 int c = sd->class_; 1204 1207 1205 1208 if (!battle_config.skillup_limit) 1206 1209 return c; 1207 1210 1208 1211 skill_point = pc_calc_skillpoint(sd); 1209 1212 if(pc_checkskill(sd, NV_BASIC) < 9) //Consider Novice Tree when you don't have NV_BASIC maxed. … … 1611 1614 break; 1612 1615 val += (int)status->max_hp; 1613 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1616 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1614 1617 //If this is called outside of status_calc_pc, you'd better pray they do not underflow and end with UINT_MAX max_hp. 1615 1618 status->max_hp = (unsigned int)val; 1616 1619 break; 1617 1620 case SP_MAXSP: 1618 if(sd->state.lr_flag == 2) 1621 if(sd->state.lr_flag == 2) 1619 1622 break; 1620 1623 val += (int)status->max_sp; … … 1658 1661 } 1659 1662 break; 1660 case SP_ADD_SPEED: //Raw increase1661 if(sd->state.lr_flag != 2) {1662 bonus = status->speed - val;1663 status->speed = cap_value(bonus, 0, USHRT_MAX);1664 }1665 break;1666 1663 case SP_SPEED_RATE: //Non stackable increase 1667 if(sd->state.lr_flag != 2 && sd->speed_rate > 100-val)1668 sd->speed_rate = 100-val;1664 if(sd->state.lr_flag != 2) 1665 sd->speed_rate = min(sd->speed_rate, -val); 1669 1666 break; 1670 1667 case SP_SPEED_ADDRATE: //Stackable increase … … 2674 2671 if(idx_card < 0 || idx_card >= MAX_INVENTORY || !sd->inventory_data[idx_card]) 2675 2672 return 0; //Invalid card index. 2676 2673 2677 2674 if(idx_equip < 0 || idx_equip >= MAX_INVENTORY || !sd->inventory_data[idx_equip]) 2678 2675 return 0; //Invalid item index. 2679 2676 2680 2677 nameid=sd->status.inventory[idx_equip].nameid; 2681 2678 cardid=sd->status.inventory[idx_card].nameid; … … 2902 2899 if(amount > MAX_AMOUNT) 2903 2900 return 5; 2904 2901 2905 2902 data = itemdb_search(item_data->nameid); 2906 2903 w = data->weight*amount; … … 2997 2994 return 0; //Can't drop items in nodrop mapflag maps. 2998 2995 } 2999 2996 3000 2997 if (!pc_candrop(sd,&sd->status.inventory[n])) { 3001 2998 clif_displaymessage (sd->fd, msg_txt(263)); 3002 2999 return 0; 3003 3000 } 3004 3001 3005 3002 //Logs items, dropped by (P)layers [Lupus] 3006 3003 if(log_config.enable_logs&0x8) … … 3010 3007 if (!map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2)) 3011 3008 return 0; 3012 3009 3013 3010 pc_delitem(sd, n, amount, 0); 3014 3011 return 1; … … 3033 3030 if (sd->status.party_id) 3034 3031 p = party_search(sd->status.party_id); 3035 3032 3036 3033 if(fitem->first_get_charid > 0 && fitem->first_get_charid != sd->status.char_id) 3037 3034 { … … 3123 3120 if ((nameid == 605 || nameid == 606) && pc_issit(sd)) 3124 3121 return 0; 3125 3122 3126 3123 //added item_noequip.txt items check by Maya&[Lupus] 3127 3124 if ( … … 3145 3142 )) 3146 3143 return 0; 3147 3144 3148 3145 //Not usable by upper class. [Skotlex] 3149 3146 if(!( … … 3329 3326 if (idx < 0 || idx >= MAX_INVENTORY) //Invalid index check [Skotlex] 3330 3327 return 1; 3331 3328 3332 3329 item_data = &sd->status.inventory[idx]; 3333 3330 … … 3369 3366 if (idx < 0 || idx >= MAX_CART) //Invalid index check [Skotlex] 3370 3367 return 1; 3371 3368 3372 3369 item_data=&sd->status.cart[idx]; 3373 3370 … … 3421 3418 if(md->state.steal_flag == UCHAR_MAX || md->sc.opt1) //already stolen from / status change check 3422 3419 return 0; 3423 3420 3424 3421 sd_status= status_get_status_data(&sd->bl); 3425 3422 md_status= status_get_status_data(bl); … … 3438 3435 rate = (sd_status->dex - md_status->dex)/2 + lv*6 + 4; 3439 3436 rate += sd->add_steal_rate; 3440 3437 3441 3438 if( rate < 1 ) 3442 3439 return 0; … … 3464 3461 return 0; 3465 3462 } 3466 3463 3467 3464 if(battle_config.show_steal_in_same_party) 3468 3465 party_foreachsamemap(pc_show_steal,sd,AREA_SIZE,sd,tmp_item.nameid); … … 3473 3470 log_pick_pc(sd, "P", itemid, 1, NULL); 3474 3471 } 3475 3472 3476 3473 //A Rare Steal Global Announce by Lupus 3477 3474 if(md->db->dropitem[i].p<=battle_config.rare_drop_announce) { … … 3604 3601 //Tag player for rewarping after map-loading is done. [Skotlex] 3605 3602 sd->state.rewarp = 1; 3606 3603 3607 3604 sd->mapindex = mapindex; 3608 3605 sd->bl.m = m; … … 3762 3759 if(!sd->sc.count) 3763 3760 return 0; 3764 3761 3765 3762 for (i = 0; i < ARRAYLENGTH(scw_list); i++) 3766 3763 { // Skills requiring specific weapon types … … 3769 3766 status_change_end(&sd->bl,scw_list[i],-1); 3770 3767 } 3771 3768 3772 3769 if(sd->sc.data[SC_SPURT] && sd->status.weapon) 3773 3770 // Spurt requires bare hands (feet, in fact xD) 3774 3771 status_change_end(&sd->bl,SC_SPURT,-1); 3775 3772 3776 3773 if(sd->status.shield <= 0) { // Skills requiring a shield 3777 3774 for (i = 0; i < ARRAYLENGTH(scs_list); i++) … … 3861 3858 class_ |= MAPID_THIEF; 3862 3859 break; 3863 3860 3864 3861 case JOB_STAR_GLADIATOR: 3865 3862 case JOB_STAR_GLADIATOR2: 3866 3863 class_ |= JOBL_2_1; 3867 3864 class_ |= MAPID_TAEKWON; 3868 break; 3865 break; 3869 3866 case JOB_SOUL_LINKER: 3870 3867 class_ |= JOBL_2_2; … … 3890 3887 class_ = MAPID_SUMMER; 3891 3888 break; 3892 //Possible to be in the wrong spot? 3889 //This is where your errors begin. 3893 3890 case JOB_NECROMANCER: // Necromancer [Brain] 3894 3891 class_ |= JOBL_2_1; 3895 3892 class_ |= MAPID_ADEPT; 3896 break; 3893 break; 3897 3894 case JOB_WARLOCK: // Warlock [Brain] 3898 3895 class_ |= JOBL_2_2; … … 3923 3920 case MAPID_XMAS: return JOB_XMAS; 3924 3921 case MAPID_SUMMER: return JOB_SUMMER; 3922 // double check this too. 3925 3923 case MAPID_ADEPT: return JOB_ADEPT; // Adept [Brain] 3926 3924 //2_1 classes … … 3933 3931 case MAPID_ASSASSIN: return JOB_ASSASSIN; 3934 3932 case MAPID_STAR_GLADIATOR: return JOB_STAR_GLADIATOR; 3933 //and this 3935 3934 case MAPID_NECROMANCER: return JOB_NECROMANCER; // Necromancer [Brain] 3936 3935 //2_2 classes … … 3942 3941 case MAPID_ROGUE: return JOB_ROGUE; 3943 3942 case MAPID_SOUL_LINKER: return JOB_SOUL_LINKER; 3943 //this too 3944 3944 case MAPID_WARLOCK: return JOB_WARLOCK; // Warlock [Brain] 3945 3945 //1-1: advanced … … 4007 4007 case JOB_THIEF: 4008 4008 return msg_txt(550 - JOB_NOVICE+class_); 4009 4009 4010 4010 case JOB_KNIGHT: 4011 4011 case JOB_PRIEST: … … 4015 4015 case JOB_ASSASSIN: 4016 4016 return msg_txt(557 - JOB_KNIGHT+class_); 4017 4017 4018 4018 case JOB_KNIGHT2: 4019 4019 return msg_txt(557); 4020 4020 4021 4021 case JOB_CRUSADER: 4022 4022 case JOB_MONK: … … 4027 4027 case JOB_DANCER: 4028 4028 return msg_txt(563 - JOB_CRUSADER+class_); 4029 4029 4030 4030 case JOB_CRUSADER2: 4031 4031 return msg_txt(563); 4032 4032 4033 4033 case JOB_WEDDING: 4034 4034 case JOB_SUPER_NOVICE: … … 4056 4056 case JOB_ASSASSIN_CROSS: 4057 4057 return msg_txt(582 - JOB_LORD_KNIGHT+class_); 4058 4058 4059 4059 case JOB_LORD_KNIGHT2: 4060 4060 return msg_txt(582); 4061 4061 4062 4062 case JOB_PALADIN: 4063 4063 case JOB_CHAMPION: … … 4068 4068 case JOB_GYPSY: 4069 4069 return msg_txt(588 - JOB_PALADIN + class_); 4070 4070 4071 4071 case JOB_PALADIN2: 4072 4072 return msg_txt(588); … … 4080 4080 case JOB_BABY_THIEF: 4081 4081 return msg_txt(595 - JOB_BABY + class_); 4082 4082 4083 4083 case JOB_BABY_KNIGHT: 4084 4084 case JOB_BABY_PRIEST: … … 4088 4088 case JOB_BABY_ASSASSIN: 4089 4089 return msg_txt(602 - JOB_BABY_KNIGHT + class_); 4090 4090 4091 4091 case JOB_BABY_KNIGHT2: 4092 4092 return msg_txt(602); 4093 4093 4094 4094 case JOB_BABY_CRUSADER: 4095 4095 case JOB_BABY_MONK: … … 4100 4100 case JOB_BABY_DANCER: 4101 4101 return msg_txt(608 - JOB_BABY_CRUSADER +class_); 4102 4102 4103 4103 case JOB_BABY_CRUSADER2: 4104 4104 return msg_txt(608); 4105 4105 4106 4106 case JOB_SUPER_BABY: 4107 4107 return msg_txt(615); 4108 4108 4109 4109 case JOB_TAEKWON: 4110 4110 return msg_txt(616); … … 4114 4114 case JOB_SOUL_LINKER: 4115 4115 return msg_txt(618); 4116 4116 4117 4117 case JOB_GUNSLINGER: 4118 4118 return msg_txt(619); 4119 4119 case JOB_NINJA: 4120 4120 return msg_txt(620); 4121 //message display for job change? 4121 4122 case JOB_ADEPT: // Adept [Brain] 4122 return msg_txt(1000); 4123 return msg_txt(1000);//have to add these to the msg_txt in the conf? 4123 4124 case JOB_NECROMANCER: // Necromancer [Brain] 4124 4125 return msg_txt(1001); … … 4126 4127 return msg_txt(1002); 4127 4128 4129 4128 4130 default: 4129 4131 return msg_txt(650); … … 4219 4221 if (sd->status.status_point > USHRT_MAX - next) 4220 4222 sd->status.status_point = USHRT_MAX; 4221 else 4223 else 4222 4224 sd->status.status_point += next; 4223 4225 … … 4226 4228 if (battle_config.pet_lv_rate && sd->pd) //<Skotlex> update pet's level 4227 4229 status_calc_pet(sd->pd,0); 4228 4230 4229 4231 clif_updatestatus(sd,SP_STATUSPOINT); 4230 4232 clif_updatestatus(sd,SP_BASELEVEL); … … 4296 4298 4297 4299 if (sd->expaddrace[status->race]) 4298 bonus += sd->expaddrace[status->race]; 4300 bonus += sd->expaddrace[status->race]; 4299 4301 bonus += sd->expaddrace[status->mode&MD_BOSS?RC_BOSS:RC_NONBOSS]; 4300 4301 if (battle_config.pk_mode && 4302 4303 if (battle_config.pk_mode && 4302 4304 (int)(status_get_lv(src) - sd->status.base_level) >= 20) 4303 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4305 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4304 4306 4305 4307 if (sd->sc.data[SC_EXPBOOST]) … … 4308 4310 if (!bonus) 4309 4311 return; 4310 4312 4311 4313 *base_exp += (unsigned int) cap_value((double)*base_exp * bonus/100., 1, UINT_MAX); 4312 4314 *job_exp += (unsigned int) cap_value((double)*job_exp * bonus/100., 1, UINT_MAX); … … 4337 4339 nextb = pc_nextbaseexp(sd); 4338 4340 nextj = pc_nextjobexp(sd); 4339 4341 4340 4342 if(sd->state.showexp || battle_config.max_exp_gain_rate){ 4341 4343 if (nextb > 0) … … 4359 4361 } 4360 4362 } 4361 4363 4362 4364 //Cap exp to the level up requirement of the previous level when you are at max level, otherwise cap at UINT_MAX (this is required for some S. Novice bonuses). [Skotlex] 4363 4365 if (base_exp) { … … 4525 4527 4526 4528 max = pc_maxparameter(sd); 4527 4529 4528 4530 switch(type){ 4529 4531 case SP_STR: sd->status.str = cap_value(sd->status.str + val, 1, max); break; … … 4625 4627 } 4626 4628 status_calc_pc(sd,0); 4627 //Required because if you could level up all skills previously, 4629 //Required because if you could level up all skills previously, 4628 4630 //the update will not be sent as only the lv variable changes. 4629 4631 clif_skillinfoblock(sd); … … 4722 4724 { 4723 4725 nullpo_retr(0, sd); 4724 4726 4725 4727 if (battle_config.use_statpoint_table) 4726 4728 { // New statpoint table used here - Dexity … … 4735 4737 if (sd->class_&JOBL_UPPER) 4736 4738 stat+=52; // extra 52+48=100 stat points 4737 4739 4738 4740 if (stat > USHRT_MAX) 4739 4741 sd->status.status_point = USHRT_MAX; … … 4775 4777 clif_updatestatus(sd,SP_UDEX); 4776 4778 clif_updatestatus(sd,SP_ULUK); // End Addition 4777 4779 4778 4780 clif_updatestatus(sd,SP_STATUSPOINT); 4779 4781 status_calc_pc(sd,0); … … 4810 4812 merc_hom_vaporize(sd, 0); 4811 4813 } 4812 4814 4813 4815 for (i = 1; i < MAX_SKILL; i++) { 4814 4816 lv= sd->status.skill[i].lv; … … 4839 4841 } 4840 4842 } 4841 4843 4842 4844 if (flag&2 || !skill_point) return skill_point; 4843 4845 … … 4945 4947 if(!src || src == &sd->bl) 4946 4948 return; 4947 4949 4948 4950 if(sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support) 4949 4951 pet_target_check(sd,src,1); … … 4957 4959 int i=0,j=0,k=0; 4958 4960 unsigned int tick = gettick(); 4959 4961 4960 4962 if(sd->vender_id) 4961 4963 vending_closevending(sd); … … 4981 4983 } 4982 4984 4983 if(sd->status.hom_id > 0 ) //orn4985 if(sd->status.hom_id > 0 && battle_config.homunculus_auto_vapor) //orn 4984 4986 merc_hom_vaporize(sd, 0); 4985 4987 … … 5052 5054 // karma going down = more 'good' / more honourable. 5053 5055 // The Karma System way... 5054 5056 5055 5057 if (sd->status.karma > ssd->status.karma) { // If player killed was more evil 5056 5058 sd->status.karma--; … … 5059 5061 else if (sd->status.karma < ssd->status.karma) // If player killed was more good 5060 5062 ssd->status.karma++; 5061 5063 5062 5064 5063 5065 // or the PK System way... 5064 5066 5065 5067 if (sd->status.karma > 0) // player killed is dishonourable? 5066 5068 ssd->status.karma--; // honour points earned 5067 5069 sd->status.karma++; // honour points lost 5068 5070 5069 5071 // To-do: Receive exp on certain occasions 5070 5072 #endif … … 5313 5315 stat += (sd->status.base_level + i + 14) / 5 ; 5314 5316 if (sd->status.status_point > USHRT_MAX - stat) 5315 5317 5316 5318 sd->status.status_point = USHRT_MAX; 5317 5319 else … … 5515 5517 status_percent_damage(NULL, &sd->bl, hp, 0, hp==-100); 5516 5518 } 5517 5519 5518 5520 if(sp) { 5519 5521 if(sp > 0) … … 5547 5549 switch (upper) { 5548 5550 case 1: 5549 b_class|= JOBL_UPPER; 5551 b_class|= JOBL_UPPER; 5550 5552 break; 5551 5553 case 2: … … 5554 5556 } 5555 5557 //This will automatically adjust bard/dancer classes to the correct gender 5556 //That is, if you try to jobchange into dancer, it will turn you to bard. 5558 //That is, if you try to jobchange into dancer, it will turn you to bard. 5557 5559 job = pc_mapid2jobid(b_class, sd->status.sex); 5558 5560 if (job == -1) 5559 5561 return 1; 5560 5562 5561 5563 if ((unsigned short)b_class == sd->class_) 5562 5564 return 1; //Nothing to change. … … 5586 5588 } 5587 5589 } 5588 5590 5589 5591 sd->status.class_ = job; 5590 5592 fame_flag = pc_famerank(sd->status.char_id,sd->class_&MAPID_UPPERMASK); … … 5602 5604 } 5603 5605 5604 //Change look, if disguised, you need to undisguise 5606 //Change look, if disguised, you need to undisguise 5605 5607 //to correctly calculate new job sprite without 5606 5608 if (sd->disguise) … … 5630 5632 if(merc_is_hom_active(sd->hd) && !pc_checkskill(sd, AM_CALLHOMUN)) 5631 5633 merc_hom_vaporize(sd, 0); 5632 5634 5633 5635 if(sd->status.manner < 0) 5634 5636 clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); … … 5789 5791 else if (!(type&OPTION_FLYING) && p_type&OPTION_FLYING) 5790 5792 new_look = -1; 5791 5793 5792 5794 if (type&OPTION_WEDDING && !(p_type&OPTION_WEDDING)) 5793 5795 new_look = JOB_WEDDING; … … 6023 6025 struct global_reg *sd_reg; 6024 6026 int i,max; 6025 6027 6026 6028 nullpo_retr(0, sd); 6027 6029 switch (type) { … … 6100 6102 return 1; 6101 6103 } 6102 6104 6103 6105 // delete reg 6104 6106 if (val == 0) { … … 6172 6174 return 0; 6173 6175 } 6174 6176 6175 6177 // delete reg 6176 6178 if (!val || strcmp(val,"")==0) … … 6366 6368 if(pos == EQP_ACC) { //Accesories should only go in one of the two, 6367 6369 pos = req_pos&EQP_ACC; 6368 if (pos == EQP_ACC) //User specified both slots.. 6370 if (pos == EQP_ACC) //User specified both slots.. 6369 6371 pos = sd->equip_index[EQI_ACC_R] >= 0 ? EQP_ACC_L : EQP_ACC_R; 6370 6372 } … … 6551 6553 clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1); 6552 6554 6553 if((sd->status.inventory[n].equip & EQP_ARMS) && 6555 if((sd->status.inventory[n].equip & EQP_ARMS) && 6554 6556 sd->weapontype1 == 0 && sd->weapontype2 == 0 && (!sd->sc.data[SC_SEVENWIND] || sd->sc.data[SC_ASPERSIO])) //Check for seven wind (but not level seven!) 6555 6557 skill_enchant_elemental_end(&sd->bl,-1); … … 6607 6609 if (sd->vender_id) //Avoid reorganizing items when we are vending, as that leads to exploits (pointed out by End of Exam) 6608 6610 return 0; 6609 6611 6610 6612 // ió«lß 6611 6613 for(i=j=0;i<MAX_INVENTORY;i++){ … … 6852 6854 hp = sd->battle_status.hp-1; //Script drains cannot kill you. 6853 6855 } 6854 6856 6855 6857 if (sd->sp_loss.value) { 6856 6858 sd->sp_loss.tick += diff_tick; … … 6881 6883 } 6882 6884 } 6883 6885 6884 6886 if (sd->sp_regen.value) { 6885 6887 sd->sp_regen.tick += diff_tick; … … 6987 6989 if (data == 0 && battle_config.day_duration <= 0) // if we want a day 6988 6990 return 0; 6989 6991 6990 6992 if (!night_flag) 6991 6993 return 0; //Already day. 6992 6994 6993 6995 night_flag = 0; // 0=day, 1=night [Yor] 6994 6996 map_foreachpc(pc_daynight_timer_sub); … … 7008 7010 if (data == 0 && battle_config.night_duration <= 0) // if we want a night 7009 7011 return 0; 7010 7012 7011 7013 if (night_flag) 7012 7014 return 0; //Already nigth. … … 7037 7039 time_t timer; 7038 7040 struct tm *t; 7039 7041 7040 7042 time(&timer); 7041 7043 t = localtime(&timer); 7042 7043 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7044 7045 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7044 7046 return; 7045 7047 } … … 7050 7052 time_t timer; 7051 7053 struct tm *t; 7052 7054 7053 7055 time(&timer); 7054 7056 t = localtime(&timer); 7055 7057 7056 7058 diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME"); 7057 7059 7058 7060 return !(diff >= 0 && diff < battle_config.duel_time_interval); 7059 7061 } … … 7065 7067 7066 7068 if (sd->duel_group != ssd->duel_group) return 0; 7067 7069 7068 7070 sprintf(output, " %d. %s", ++(*p), sd->status.name); 7069 7071 clif_disp_onlyself(ssd, output, strlen(output)); … … 7097 7099 int i=1; 7098 7100 char output[256]; 7099 7101 7100 7102 while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++; 7101 7103 if(i == MAX_DUEL) return 0; 7102 7104 7103 7105 duel_count++; 7104 7106 sd->duel_group = i; … … 7106 7108 duel_list[i].invites_count = 0; 7107 7109 duel_list[i].max_players_limit = maxpl; 7108 7110 7109 7111 strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --" 7110 7112 clif_disp_onlyself(sd, output, strlen(output)); 7111 7113 7112 7114 clif_set0199(sd, 1); 7113 7115 //clif_misceffect2(&sd->bl, 159); … … 7125 7127 target_sd->duel_invite = did; 7126 7128 duel_list[did].invites_count++; 7127 7129 7128 7130 // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" 7129 7131 sprintf(output, msg_txt(374), sd->status.name); … … 7143 7145 { 7144 7146 char output[256]; 7145 7147 7146 7148 // " <- Player %s has left duel --" 7147 7149 sprintf(output, msg_txt(375), sd->status.name); 7148 7150 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7149 7151 7150 7152 duel_list[did].members_count--; 7151 7153 7152 7154 if(duel_list[did].members_count == 0) { 7153 map_foreachpc(duel_leave_sub, did); 7155 map_foreachpc(duel_leave_sub, did); 7154 7156 duel_count--; 7155 7157 } 7156 7158 7157 7159 sd->duel_group = 0; 7158 7160 duel_savetime(sd); … … 7164 7166 { 7165 7167 char output[256]; 7166 7168 7167 7169 duel_list[did].members_count++; 7168 7170 sd->duel_group = sd->duel_invite; 7169 7171 duel_list[did].invites_count--; 7170 7172 sd->duel_invite = 0; 7171 7173 7172 7174 // " -> Player %s has accepted duel --" 7173 7175 sprintf(output, msg_txt(376), sd->status.name); … … 7182 7184 { 7183 7185 char output[256]; 7184 7186 7185 7187 // " -- Player %s has rejected duel --" 7186 7188 sprintf(output, msg_txt(377), sd->status.name); 7187 7189 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7188 7190 7189 7191 duel_list[did].invites_count--; 7190 7192 sd->duel_invite = 0; … … 7284 7286 if (pc_split_str(line,split,4) < 4) 7285 7287 continue; 7286 7288 7287 7289 job_count = pc_split_atoi(split[1],jobs,':',CLASS_COUNT); 7288 7290 if (job_count < 1) … … 7303 7305 maxlv = MAX_LEVEL; 7304 7306 } 7305 7307 7306 7308 job = jobs[0] = pc_class2idx(job_id); 7307 7309 //We send one less and then one more because the last entry in the exp array should hold 0. … … 7464 7466 if (i > MAX_LEVEL) 7465 7467 break; 7466 statp[i]=j; 7468 statp[i]=j; 7467 7469 i++; 7468 7470 } … … 7473 7475 for (; i <= MAX_LEVEL; i++) { 7474 7476 j += (i+15)/5; 7475 statp[i] = j; 7477 statp[i] = j; 7476 7478 } 7477 7479 … … 7505 7507 else 7506 7508 ShowWarning("In function pc_read_motd() -> File '"CL_WHITE"%s"CL_RESET"' not found.\n", motd_txt); 7507 7509 7508 7510 return 0; 7509 7511 } -
src/map/pc.h
r22 r24 114 114 unsigned short autolootid; // [Zephyrus] 115 115 unsigned noks : 3; // [Zeph Kill Steal Protection] 116 //Aside from a Space it's fine, but white space has no effect so it's fine. 117 //Vanaheim settings [Brainstorm] 116 118 unsigned showsummon : 1; //Show summoned monster stats [Brainstorm] 119 117 120 bool changemap; 118 121 struct guild *gmaster_flag; … … 143 146 int fd; 144 147 unsigned short mapindex; 145 unsigned short prev_speed,prev_adelay;146 148 unsigned char head_dir; //0: Look forward. 1: Look right, 2: Look left. 147 149 unsigned int client_tick; … … 250 252 int crit_atk_rate; 251 253 int classchange; // [Valaris] 252 int speed_ add_rate, aspd_add;254 int speed_rate, speed_add_rate, aspd_add; 253 255 unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex] 254 256 … … 266 268 int castrate,delayrate,hprate,sprate,dsprate; 267 269 int atk_rate; 268 int speed_rate,hprecov_rate,sprecov_rate;270 int hprecov_rate,sprecov_rate; 269 271 int matk_rate; 270 272 int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate; -
src/map/script.c
r23 r24 7486 7486 int allflag=va_arg(ap,int); 7487 7487 7488 md-> npc_killmonster = 1;7488 md->state.npc_killmonster = 1; 7489 7489 7490 7490 if(!allflag){ … … 7495 7495 status_kill(bl); 7496 7496 } 7497 md-> npc_killmonster = 0;7497 md->state.npc_killmonster = 0; 7498 7498 return 0; 7499 7499 } -
src/map/skill.c
r23 r24 42 42 #define GD_SKILLRANGEMIN 900 43 43 #define GD_SKILLRANGEMAX GD_SKILLRANGEMIN+MAX_GUILDSKILL 44 #define HM_SKILLRANGEMIN 1 00044 #define HM_SKILLRANGEMIN 1100 //I know for a fact this will cause authok problems where it is, but perhaps it's changed now. 45 45 #define HM_SKILLRANGEMAX HM_SKILLRANGEMIN+MAX_HOMUNSKILL 46 46 … … 283 283 struct status_change* sc; 284 284 sc = status_get_sc(bl); 285 285 286 286 // Never copy NPC/Wedding Skills 287 287 if (skill_get_inf2(skillid)&(INF2_NPC_SKILL|INF2_WEDDING_SKILL)) … … 300 300 if ((skillid == AL_INCAGI || skillid == AL_BLESSING)) 301 301 return 0; 302 302 303 303 return 1; 304 304 } … … 306 306 // [MouseJstr] - skill ok to cast? and when? 307 307 int skillnotok (int skillid, struct map_session_data *sd) 308 { 308 { 309 309 int i,m; 310 310 nullpo_retr (1, sd); 311 311 m = sd->bl.m; 312 312 i = skill_get_index(skillid); 313 313 314 314 if (i == 0) 315 315 return 1; // invalid skill id 316 316 317 317 if (battle_config.gm_skilluncond && pc_isGM(sd) >= battle_config.gm_skilluncond) 318 318 return 0; // GMs can do any damn thing they want … … 354 354 return 1; 355 355 } 356 break; 356 break; 357 357 case MC_VENDING: 358 358 case MC_IDENTIFY: … … 387 387 if (i == 0) 388 388 return 1; // invalid skill id 389 389 390 390 if (hd->blockskill[i] > 0) 391 391 return 1; … … 396 396 397 397 struct s_skill_unit_layout* skill_get_unit_layout (int skillid, int skilllv, struct block_list* src, int x, int y) 398 { 398 { 399 399 int pos = skill_get_unit_layout_type(skillid,skilllv); 400 400 int dir; … … 420 420 421 421 /*========================================== 422 * 422 * 423 423 *------------------------------------------*/ 424 424 int skill_additional_effect (struct block_list* src, struct block_list *bl, int skillid, int skilllv, int attack_type, unsigned int tick) … … 450 450 if (!tsc) //skill additional effect is about adding effects to the target... 451 451 //So if the target can't be inflicted with statuses, this is pointless. 452 return 0; 452 return 0; 453 453 454 454 switch(skillid) … … 482 482 (2000 - 4*sstatus->agi - 2*sstatus->dex))) 483 483 ; //Stance triggered 484 else if(sc->data[SC_READYTURN] && 484 else if(sc->data[SC_READYTURN] && 485 485 sc_start(src,SC_COMBO, 15, TK_TURNKICK, 486 486 (2000 - 4*sstatus->agi - 2*sstatus->dex))) … … 492 492 rate += rate*sc->data[SC_SKILLRATE_UP]->val2/100; 493 493 status_change_end(src,SC_SKILLRATE_UP,-1); 494 } 494 } 495 495 sc_start4(src,SC_COMBO, rate, TK_COUNTER, bl->id,0,0, 496 496 (2000 - 4*sstatus->agi - 2*sstatus->dex)); … … 610 610 case CR_GRANDCROSS: 611 611 case NPC_GRANDDARKNESS: 612 if(tstatus->race == RC_UNDEAD || tstatus->race == RC_DEMON) 612 //Chance to cause blind status vs demon and undead element, but not against players 613 if(!dstsd && (battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race == RC_DEMON)) 613 614 sc_start(bl,SC_BLIND,100,skilllv,skill_get_time2(skillid,skilllv)); 614 615 break; … … 662 663 case NPC_PETRIFYATTACK: 663 664 sc_start4(bl,status_skill2sc(skillid),50+10*skilllv, 664 skilllv,0,0,skill_get_time(skillid,skilllv), 665 skilllv,0,0,skill_get_time(skillid,skilllv), 665 666 skill_get_time2(skillid,skilllv)); 666 667 break; … … 680 681 sc_start(bl,SC_BLEEDING,(20*skilllv),skilllv,skill_get_time2(skillid,skilllv)); 681 682 break; 682 case NPC_MENTALBREAKER: 683 case NPC_MENTALBREAKER: 683 684 { //Based on observations by Tharis, Mental Breaker should do SP damage 684 685 //equal to Matk*skLevel. … … 785 786 if (tsc->data[SC_ADRENALINE2]) 786 787 status_change_end(bl, SC_ADRENALINE2, -1); 787 } 788 } 788 789 break; 789 790 case TK_TURNKICK: … … 821 822 sc_start(bl,SC_CRITICALWOUND,100,skilllv,skill_get_time2(skillid,skilllv)); 822 823 break; 824 //This has weird Structure compared to the other stuff here. 823 825 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 824 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed825 sc_start(bl,SC_POISON,10000,skilllv,skill_get_time2(skillid,skilllv));826 break;826 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 827 sc_start(bl,SC_POISON,10000,skilllv,skill_get_time2(skillid,skilllv)); 828 break; 827 829 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 828 830 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 829 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed830 sc_start(bl,skillid==NC_PWSUFFER?SC_SUFFER:SC_AGONY,1000,skilllv,skill_get_time2(skillid,skilllv));831 break;831 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 832 sc_start(bl,skillid==NC_PWSUFFER?SC_SUFFER:SC_AGONY,1000,skilllv,skill_get_time2(skillid,skilllv)); 833 break; 832 834 case WL_SEARING: //Warlock Searing Pain [Brain] 833 //The DoT is only initiated if target isnt burning already.834 if(!tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE])835 sc_start(bl,SC_SEARING,10000,skilllv,skill_get_time2(skillid,skilllv));836 break;835 //The DoT is only initiated if target isnt burning already. 836 if(!tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 837 sc_start(bl,SC_SEARING,10000,skilllv,skill_get_time2(skillid,skilllv)); 838 break; 837 839 case WL_IMMOLATE: //Warlock Immolate [Brain] 838 //The DoT is only initiated if target isnt in immolate, but must be in searing pain status839 if(tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE])840 sc_start(bl,SC_IMMOLATE,10000,skilllv,skill_get_time2(skillid,skilllv));841 break;840 //The DoT is only initiated if target isnt in immolate, but must be in searing pain status 841 if(tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 842 sc_start(bl,SC_IMMOLATE,10000,skilllv,skill_get_time2(skillid,skilllv)); 843 break; 842 844 case WL_SHADOWBURN: //Warlock Shadow Burn [Brain] 843 sc_start(bl,SC_STUN,10000,skilllv,skill_get_time(skillid,skilllv)); 844 break; 845 //Mercenary Skills [Brainstorm] 846 /* case MS_BASH: 847 sc_start(bl,SC_STUN,5*(skilllv-5),skilllv,skill_get_time(skillid,skilllv)); 848 break; 849 case MER_CRASH: 850 sc_start(bl,SC_STUN,6*skilllv,skilllv,skill_get_time(skillid,skilllv)); 851 break;*/ 845 sc_start(bl,SC_STUN,10000,skilllv,skill_get_time(skillid,skilllv)); 846 break; 847 852 848 } 853 849 … … 961 957 if(sd && sd->classchange && attack_type&BF_WEAPON && 962 958 dstmd && !(tstatus->mode&MD_BOSS) && 963 (rand()%10000 < sd->classchange)) 959 (rand()%10000 < sd->classchange)) 964 960 { 965 961 struct mob_db *mob; … … 970 966 class_ = rand() % MAX_MOB_DB; 971 967 } while (!mobdb_checkid(class_)); 972 968 973 969 rate = rand() % 1000000; 974 970 mob = mob_db(class_); … … 984 980 985 981 /* Splitted off from skill_additional_effect, which is never called when the 986 * attack skill kills the enemy. Place in this function counter status effects 987 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 982 * attack skill kills the enemy. Place in this function counter status effects 983 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 988 984 * from cards) that will take effect on the source, not the target. [Skotlex] 989 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 985 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 990 986 * type of skills, so not every instance of skill_additional_effect needs a call 991 987 * to this one. … … 997 993 struct map_session_data *dstsd=NULL; 998 994 struct status_change *tsc; 999 995 1000 996 nullpo_retr(0, src); 1001 997 nullpo_retr(0, bl); … … 1015 1011 if(tsc && tsc->data[SC_KAAHI] && tsc->data[SC_KAAHI]->val4 == -1) 1016 1012 tsc->data[SC_KAAHI]->val4 = add_timer( 1017 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1013 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1018 1014 kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal. 1019 1015 break; … … 1047 1043 status_heal(src, 0, status_get_lv(bl)*(95+15*rate)/100, 2); 1048 1044 } 1049 1045 //was hard to pinpoint this place. 1050 1046 // Warlock Soul Steal [Brain] 1051 if(sd && skillid && attack_type&BF_MAGIC && status_isdead(bl) 1052 && !(skill_get_inf(skillid)&(INF_GROUND_SKILL|INF_SELF_SKILL))1053 && (rate=pc_checkskill(sd,WL_SOULSTEAL))>0){// Wont work with area/ground spells (hellfire)1054 if (pc_issit(sd)) pc_setstand(sd);1055 clif_skill_nodamage(src,bl,WL_SOULSTEAL,rate,1);1056 clif_specialeffect(src, 253, AREA); // Absorb Mana effect on caster1057 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2);1058 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul1047 if(sd && skillid && attack_type&BF_MAGIC && status_isdead(bl) 1048 && !(skill_get_inf(skillid)&(INF_GROUND_SKILL|INF_SELF_SKILL)) 1049 && (rate=pc_checkskill(sd,WL_SOULSTEAL))>0){// Wont work with area/ground spells (hellfire) 1050 if (pc_issit(sd)) pc_setstand(sd); 1051 clif_skill_nodamage(src,bl,WL_SOULSTEAL,rate,1); 1052 clif_specialeffect(src, 253, AREA); // Absorb Mana effect on caster 1053 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2); 1054 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul 1059 1055 } 1060 1056 … … 1069 1065 rate+=dstsd->addeff2[i].arrow_rate; 1070 1066 if (!rate) continue; 1071 1067 1072 1068 if ((dstsd->addeff2[i].flag&(ATF_LONG|ATF_SHORT)) != (ATF_LONG|ATF_SHORT)) 1073 1069 { //Trigger has range consideration. … … 1078 1074 type = dstsd->addeff2[i].id; 1079 1075 time = skill_get_time2(status_sc2skill(type),7); 1080 1076 1081 1077 if (dstsd->addeff2[i].flag&ATF_TARGET) 1082 1078 status_change_start(src,type,rate,7,0,0,0,time,0); 1083 1079 1084 1080 if (dstsd->addeff2[i].flag&ATF_SELF && !status_isdead(bl)) 1085 1081 status_change_start(bl,type,rate,7,0,0,0,time,0); … … 1089 1085 // Trigger counter-spells to retaliate against damage causing skills. 1090 1086 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autospell2[0].id && 1091 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1087 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1092 1088 { 1093 1089 struct block_list *tbl; … … 1109 1105 if (attack_type&BF_LONG) 1110 1106 rate>>=1; 1111 1107 1112 1108 if (skillnotok(skillid, dstsd)) 1113 1109 continue; … … 1118 1114 else 1119 1115 tbl = src; 1120 1116 1121 1117 switch (skill_get_casttype(skillid)) { 1122 1118 case CAST_GROUND: … … 1142 1138 //Auto-script when attacked 1143 1139 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autoscript2[0].script && 1144 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1140 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1145 1141 { 1146 1142 int i; … … 1166 1162 (BCT_ENEMY/BCT_PARTY/BCT_SELF) are the valid values. 1167 1163 --------------------------------------------------------------------------*/ 1168 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1164 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1169 1165 { 1170 1166 const int where_list[4] = {EQP_WEAPON, EQP_ARMOR, EQP_SHIELD, EQP_HELM}; … … 1268 1264 for (i = 0; i < ARRAYLENGTH(pos); i++) { 1269 1265 if (where&pos[i] && sc->data[sc_def[i]]) 1270 where&=~pos[i]; 1266 where&=~pos[i]; 1271 1267 } 1272 1268 if (!where) return 0; … … 1298 1294 if (count == 0) 1299 1295 return 0; //Actual knockback distance is 0. 1300 1296 1301 1297 switch (target->type) 1302 1298 { … … 1333 1329 1334 1330 if (!su) 1335 unit_stop_walking(target,0); 1331 unit_stop_walking(target,0); 1336 1332 1337 1333 dx = nx - target->x; … … 1350 1346 map_foreachinmovearea(clif_insight, target, AREA_SIZE, -dx, -dy, target->type == BL_PC ? BL_ALL : BL_PC, target); 1351 1347 1352 if(!(flag&0x1)) 1348 if(!(flag&0x1)) 1353 1349 clif_blown(target); 1354 1350 … … 1398 1394 * flag&0xFFF is passed to the underlying battle_calc_attack for processing 1399 1395 * (usually holds number of targets, or just 1 for simple splash attacks) 1400 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1396 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1401 1397 * packet shouldn't display a skill animation) 1402 1398 * flag&0x2000 is used to signal that the skilllv should be passed as -1 to the … … 1499 1495 } 1500 1496 } 1501 1497 1502 1498 if(sc && sc->data[SC_MAGICROD] && src == dsrc) { 1503 1499 int sp = skill_get_sp(skillid,skilllv); … … 1513 1509 1514 1510 damage = dmg.damage + dmg.damage2; 1515 1511 1516 1512 if( (skillid == AL_INCAGI || skillid == AL_BLESSING) && tsd->sc.data[SC_CHANGEUNDEAD] ) 1517 1513 damage = 1; … … 1524 1520 type=(skillid==0)?5:skill_get_hit(skillid); 1525 1521 1526 if(damage < dmg.div_ 1522 if(damage < dmg.div_ 1527 1523 //Only skills that knockback even when they miss. [Skotlex] 1528 1524 && skillid != CH_PALMSTRIKE) … … 1653 1649 break; 1654 1650 } 1655 1651 1656 1652 map_freeblock_lock(); 1657 1653 … … 1686 1682 } 1687 1683 } 1688 if (skillid != WZ_SIGHTRASHER && 1689 skillid != WZ_SIGHTBLASTER && 1684 if (skillid != WZ_SIGHTRASHER && 1685 skillid != WZ_SIGHTBLASTER && 1690 1686 skillid != AC_SHOWER && 1691 1687 skillid != SM_MAGNUM && … … 1709 1705 if (!status_isdead(bl)) 1710 1706 skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick); 1711 //Counter status effects [Skotlex] 1707 //Counter status effects [Skotlex] 1712 1708 skill_counter_additional_effect(dsrc,bl,skillid,skilllv,attack_type,tick); 1713 1709 } … … 1727 1723 skill_blown(dsrc,bl,dmg.blewcount,direction,0); 1728 1724 } 1729 1725 1730 1726 //Delayed damage must be dealt after the knockback (it needs to know actual position of target) 1731 1727 if (dmg.amotion) … … 1759 1755 1760 1756 if (!(flag&2) && 1761 ( 1757 ( 1762 1758 skillid == MG_COLDBOLT || skillid == MG_FIREBOLT || skillid == MG_LIGHTNINGBOLT 1763 1759 ) && … … 1933 1929 struct map_session_data *sd; 1934 1930 int gid, id, strvit, agidex; 1935 1931 1936 1932 sd = (struct map_session_data *)bl; 1937 1933 … … 1973 1969 int i,j,hp,sp,hp_rate,sp_rate,state,mhp ; 1974 1970 int itemid[10],amount[ARRAYLENGTH(itemid)],index[ARRAYLENGTH(itemid)]; 1975 1971 1976 1972 nullpo_retr(0, hd); 1977 1973 sd = hd->master; … … 2108 2104 target = src; //Required since it has to warp. 2109 2105 if(target == NULL) 2110 break; 2106 break; 2111 2107 if(target->prev == NULL) 2112 2108 break; … … 2151 2147 } 2152 2148 break; 2153 2154 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2155 if (!status_isdead(target) && status_get_sc(target)->data[SC_SUFFER]){ 2156 skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2157 clif_specialeffect(target, 180, AREA); //Shadow Hit Effect on target 2158 if (skl->type>1 && !status_isdead(target)) 2159 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2160 } 2161 break; 2162 case WL_SEARING: //Warlock Searing Pain [Brain] 2163 if (!status_isdead(target) && status_get_sc(target)->data[SC_SEARING]){ 2164 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2165 clif_specialeffect(target, 49, AREA); //Fire Hit Effect on target 2166 if (skl->type>1 && !status_isdead(target)) 2167 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2168 } 2169 break; 2170 case WL_IMMOLATE: //Warlock Immolate [Brain] 2171 if (!status_isdead(target) && status_get_sc(target)->data[SC_IMMOLATE]){ 2172 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2173 clif_specialeffect(target, 97, AREA); //Firepillar Hit Effect on target 2174 if (skl->type>1 && !status_isdead(target)) 2175 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2176 } 2177 break; 2178 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 2179 if (!status_isdead(target) && status_get_sc(target)->data[SC_AGONY]){ 2180 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2181 clif_specialeffect(target, 587, AREA); //Big Purple Flame Effect on target 2182 if (skl->type>1 && !status_isdead(target)) 2183 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2184 } 2185 break; 2186 2149 //Could be confusing to find the right place. 2150 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2151 if (!status_isdead(target) && status_get_sc(target)->data[SC_SUFFER]){ 2152 skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2153 clif_specialeffect(target, 180, AREA); //Shadow Hit Effect on target 2154 if (skl->type>1 && !status_isdead(target)) 2155 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2156 } 2157 break; 2158 case WL_SEARING: //Warlock Searing Pain [Brain] 2159 if (!status_isdead(target) && status_get_sc(target)->data[SC_SEARING]){ 2160 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2161 clif_specialeffect(target, 49, AREA); //Fire Hit Effect on target 2162 if (skl->type>1 && !status_isdead(target)) 2163 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2164 } 2165 break; 2166 case WL_IMMOLATE: //Warlock Immolate [Brain] 2167 if (!status_isdead(target) && status_get_sc(target)->data[SC_IMMOLATE]){ 2168 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2169 clif_specialeffect(target, 97, AREA); //Firepillar Hit Effect on target 2170 if (skl->type>1 && !status_isdead(target)) 2171 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2172 } 2173 break; 2174 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 2175 if (!status_isdead(target) && status_get_sc(target)->data[SC_AGONY]){ 2176 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2177 clif_specialeffect(target, 587, AREA); //Big Purple Flame Effect on target 2178 if (skl->type>1 && !status_isdead(target)) 2179 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2180 } 2181 break; 2187 2182 default: 2188 2183 skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); … … 2220 2215 ud = unit_bl2ud(src); 2221 2216 nullpo_retr(1, ud); 2222 2217 2223 2218 ARR_FIND( 0, MAX_SKILLTIMERSKILL, i, ud->skilltimerskill[i] == 0 ); 2224 2219 if( i == MAX_SKILLTIMERSKILL ) return 1; 2225 2220 2226 2221 ud->skilltimerskill[i] = ers_alloc(skill_timer_ers, struct skill_timerskill); 2227 2222 ud->skilltimerskill[i]->timer = add_timer(tick, skill_timerskill, src->id, i); … … 2248 2243 ud = unit_bl2ud(src); 2249 2244 nullpo_retr(0, ud); 2250 2245 2251 2246 for(i=0;i<MAX_SKILLTIMERSKILL;i++) { 2252 2247 if(ud->skilltimerskill[i]) { … … 2285 2280 2286 2281 nullpo_retr(1, src); 2287 nullpo_retr(1, bl); 2282 nullpo_retr(1, bl); 2288 2283 2289 2284 if (src->m != bl->m) … … 2292 2287 if (bl->prev == NULL) 2293 2288 return 1; 2294 2289 2295 2290 sd = BL_CAST(BL_PC, src); 2296 2291 tsd = BL_CAST(BL_PC, bl); … … 2308 2303 } 2309 2304 2310 sc = status_get_sc(src); 2305 sc = status_get_sc(src); 2311 2306 if (sc && !sc->count) 2312 2307 sc = NULL; //Unneeded … … 2397 2392 case NPC_BLEEDING: 2398 2393 case NPC_CRITICALWOUND: 2399 /*Mercenary Skills [Brainstorm]2400 case MS_BASH:2401 case MA_DOUBLE:2402 case MA_CHARGEARROW:2403 case ML_PIERCE:2404 case ML_SPIRALPIERCE:2405 case MER_CRASH:2406 2394 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2407 break;*/ 2395 break; 2396 2397 //... something doesn't fit about this. Seriously. 2408 2398 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 2409 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);2410 clif_specialeffect(bl, 124, AREA); //Venom Dust Effect on target2411 break;2412 case NC_DEATHHAND: 2413 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag|SD_LEVEL);//Hide skill yell2414 clif_specialeffect(bl, 65, AREA); //Power absorb Effect on target2415 if (battle_check_living(tstatus->race, tstatus->def_ele)){ //Check if target is a living creature before proceed2416 int chance = (10+(skilllv*2)+(status_get_luk(src)-status_get_luk(bl))/5);2417 //10% chance + 2% per skilllv + (caster luk - target luk)/5 %2418 if (rand()%100 < chance) {2419 clif_skill_nodamage(src,bl,skillid,-1,flag|SD_LEVEL);//Hide skill yell2420 status_percent_damage(src, bl, 100, 0, true); //Instant kill our target2421 } else clif_skill_fail(sd,skillid,0,0);2422 }2423 break;2399 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2400 clif_specialeffect(bl, 124, AREA); //Venom Dust Effect on target 2401 break; 2402 case NC_DEATHHAND: //Necro Death Hand [Brain] 2403 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag|SD_LEVEL);//Hide skill yell 2404 clif_specialeffect(bl, 65, AREA); //Power absorb Effect on target 2405 if (battle_check_living(tstatus->race, tstatus->def_ele)){ //Check if target is a living creature before proceed 2406 int chance = (10+(skilllv*2)+(status_get_luk(src)-status_get_luk(bl))/5); 2407 //10% chance + 2% per skilllv + (caster luk - target luk)/5 % 2408 if (rand()%100 < chance) { 2409 clif_skill_nodamage(src,bl,skillid,-1,flag|SD_LEVEL);//Hide skill yell 2410 status_percent_damage(src, bl, 100, 0, true); //Instant kill our target 2411 } else clif_skill_fail(sd,skillid,0,0); 2412 } 2413 break; 2424 2414 2425 2415 … … 2455 2445 map_foreachinrange(skill_attack_area, src, 2456 2446 skill_get_splash(skillid, skilllv), splash_target(src), 2457 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2447 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2458 2448 break; 2459 2449 … … 2597 2587 //Splash attack skills. 2598 2588 case AS_GRIMTOOTH: 2599 case MC_CARTREVOLUTION: 2589 case MC_CARTREVOLUTION: 2600 2590 case NPC_SPLASHATTACK: 2601 2591 flag |= SD_PREAMBLE; // a fake packet will be sent for the first target to be hit … … 2603 2593 case SM_MAGNUM: 2604 2594 case HT_BLITZBEAT: 2605 case AC_SHOWER: 2595 case AC_SHOWER: 2606 2596 case MG_NAPALMBEAT: 2607 2597 case MG_FIREBALL: … … 2660 2650 if (skill_area_temp[1] != bl->id) 2661 2651 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag|SD_ANIMATION); 2662 else 2652 else 2663 2653 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag); 2664 2654 break; … … 2725 2715 skill_castend_nodamage_id); 2726 2716 } 2727 break; 2717 break; 2728 2718 case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex] 2729 2719 // clif_skill_nodamage(src,bl,skillid,skilllv,0); //Can't make this one display the correct attack animation delay :/ 2730 2720 clif_damage(src,bl,tick,status_get_amotion(src),0,-1,1,4,0); //Display an absorbed damage attack. 2731 2721 skill_addtimerskill(src, tick + 1000, bl->id, 0, 0, skillid, skilllv, BF_WEAPON, flag); 2732 break; 2722 break; 2733 2723 2734 2724 case PR_TURNUNDEAD: … … 2758 2748 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2759 2749 break; 2750 //another thing in a weird place. 2760 2751 case AD_DARKHEAL: // Adept Dark Heal [Brain] 2761 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target2762 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Exception because we must add the effect manually =/2763 break;2752 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 2753 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Exception because we must add the effect manually =/ 2754 break; 2764 2755 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2765 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2766 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2756 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2757 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2758 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2759 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2760 //If target is on suffering status already, just cause damage, no extra DoT 2761 if(!status_get_sc(bl)->data[SC_SUFFER]) 2762 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2763 } 2764 else clif_skill_fail(sd,skillid,0,0); 2765 break; 2766 case NC_DRAINLIFE: // Necromancer Drain Life [Brain] 2767 { 2768 int heal = skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag)/2; 2769 if (heal > 0 && (battle_check_living(tstatus->race,tstatus->def_ele))){ 2770 clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); 2771 status_heal(src, heal, 0, 0); 2772 } 2773 } 2767 2774 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2768 2775 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2769 //If target is on suffering status already, just cause damage, no extra DoT 2770 if(!status_get_sc(bl)->data[SC_SUFFER]) 2771 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2772 } 2773 else clif_skill_fail(sd,skillid,0,0); 2774 break; 2775 case NC_DRAINLIFE: // Necromancer Drain Life [Brain] 2776 { 2777 int heal = skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag)/2; 2778 if (heal > 0 && (battle_check_living(tstatus->race,tstatus->def_ele))){ 2779 clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); 2780 status_heal(src, heal, 0, 0); 2781 } 2782 } 2783 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2784 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2785 break; 2776 break; 2786 2777 case WL_SHADOWBOLT: // Warlock Shadowbolt [Brain] 2787 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target2788 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster2789 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Again, the effect...cursed effects...2790 break;2778 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2779 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2780 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Again, the effect...cursed effects... 2781 break; 2791 2782 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2792 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target2793 clif_specialeffect(bl, 32, AREA); //Flame Engulf Effect on target2794 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster2795 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);2796 break;2783 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2784 clif_specialeffect(bl, 32, AREA); //Flame Engulf Effect on target 2785 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2786 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2787 break; 2797 2788 case WL_SEARING: // Warlock Searing Pain [Brain] 2798 clif_specialeffect(bl, 406, AREA); //Fire on Head Effect on target 2799 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2800 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2801 //if target is on searing status already, just cause damage, no extra DoT 2802 if(!status_get_sc(bl)->data[SC_SEARING]) 2803 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,4,flag); 2804 break; 2805 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2806 if(status_get_sc(bl)->data[SC_IMMOLATE]) { // Can only be casted if target is immolating status 2807 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2789 clif_specialeffect(bl, 406, AREA); //Fire on Head Effect on target 2808 2790 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2809 2791 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2810 status_change_end(bl,SC_IMMOLATE,-1); //End Immolating status 2811 } else clif_skill_fail(sd,skillid,0,0); 2812 break; 2792 //if target is on searing status already, just cause damage, no extra DoT 2793 if(!status_get_sc(bl)->data[SC_SEARING]) 2794 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,4,flag); 2795 break; 2796 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2797 if(status_get_sc(bl)->data[SC_IMMOLATE]) { // Can only be casted if target is immolating status 2798 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2799 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2800 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2801 status_change_end(bl,SC_IMMOLATE,-1); //End Immolating status 2802 } else clif_skill_fail(sd,skillid,0,0); 2803 break; 2813 2804 case WL_IMMOLATE: // Warlock Immolate [Brain] 2814 clif_specialeffect(bl, 635, AREA); //Dragon Fire Effect on target2815 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster2816 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);2817 //If Target is on searing pain status, will change immolating status instead2818 if(!status_get_sc(bl)->data[SC_IMMOLATE])2819 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,5,flag);2820 break;2805 clif_specialeffect(bl, 635, AREA); //Dragon Fire Effect on target 2806 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2807 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2808 //If Target is on searing pain status, will change immolating status instead 2809 if(!status_get_sc(bl)->data[SC_IMMOLATE]) 2810 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,5,flag); 2811 break; 2821 2812 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2822 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target2823 skill_attack(BF_MAGIC,src,bl,bl,skillid,skilllv,tick,flag|SD_ANIMATION);2824 break;2813 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2814 skill_attack(BF_MAGIC,src,bl,bl,skillid,skilllv,tick,flag|SD_ANIMATION); 2815 break; 2825 2816 case WL_PWAGONY: // Warlock Power Word: Agony [Brain] 2826 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2827 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2828 clif_specialeffect(bl, 587, AREA); //Big Purple Flame Effect on target 2829 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2830 //If target is on Agonizing status already, just cause damage, no extra DoT 2831 if(!status_get_sc(bl)->data[SC_AGONY]) 2832 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2833 } 2834 else clif_skill_fail(sd,skillid,0,0); 2835 break; 2836 2817 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2818 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2819 clif_specialeffect(bl, 587, AREA); //Big Purple Flame Effect on target 2820 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2821 //If target is on Agonizing status already, just cause damage, no extra DoT 2822 if(!status_get_sc(bl)->data[SC_AGONY]) 2823 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2824 } 2825 else clif_skill_fail(sd,skillid,0,0); 2826 break; 2837 2827 2838 2828 case NPC_MAGICALATTACK: … … 2872 2862 count++; // natural water cell 2873 2863 else 2874 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 2864 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 2875 2865 || (unit = map_find_skill_unit_oncell(src,x,y,NJ_SUITON,NULL)) != NULL ) 2876 2866 { … … 2937 2927 skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,flag); 2938 2928 status_percent_damage(src, src, 0, 100, false); 2939 } 2929 } 2940 2930 if (sd) skill_blockpc_start (sd, skillid, (skilllv < 5 ? 10000: 15000)); 2941 2931 break; … … 2998 2988 } 2999 2989 3000 map_freeblock_unlock(); 2990 map_freeblock_unlock(); 3001 2991 3002 2992 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. … … 3006 2996 3007 2997 /*========================================== 3008 * 2998 * 3009 2999 *------------------------------------------*/ 3010 3000 int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag) … … 3020 3010 int i; 3021 3011 enum sc_type type; 3022 3012 3023 3013 if(skillid > 0 && skilllv <= 0) return 0; // celest 3024 3014 … … 3041 3031 return 1; 3042 3032 3033 // Added DEATHPACT [Brain] 3034 //if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO) 3043 3035 if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO && skillid != NC_DEATHPACT) 3044 3036 return 1; … … 3046 3038 tstatus = status_get_status_data(bl); 3047 3039 sstatus = status_get_status_data(src); 3048 3040 3049 3041 //Check for undead skills that convert a no-damage skill into a damage one. [Skotlex] 3050 3042 switch (skillid) { … … 3067 3059 } 3068 3060 break; 3069 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3070 // Only player casted spells can be offensive (copyed from AL_HEAL code above) 3071 if (sd && (battle_check_living(tstatus->race,tstatus->def_ele)) //Check if target is a living creature 3072 && !pc_checkskill(dstsd,NC_PHYLACTERY) //Or he doesnt have Phylactery (non-perma undead) 3073 && !status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or Overwhelming Evil is off (most cases) 3074 if (battle_check_target(src, bl, BCT_ENEMY) < 1) { 3075 //Offensive heal does not works on non-enemies. 3076 clif_skill_fail(sd,skillid,0,0); 3077 return 0; 3078 } 3079 return skill_castend_damage_id(src, bl, skillid, skilllv, tick, flag); 3080 } 3081 break; 3061 //right place? 3062 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3063 // Only player casted spells can be offensive (copyed from AL_HEAL code above) 3064 if (sd && (battle_check_living(tstatus->race,tstatus->def_ele)) //Check if target is a living creature 3065 && !pc_checkskill(dstsd,NC_PHYLACTERY) //Or he doesnt have Phylactery (non-perma undead) 3066 && !status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or Overwhelming Evil is off (most cases) 3067 if (battle_check_target(src, bl, BCT_ENEMY) < 1) { 3068 //Offensive heal does not works on non-enemies. 3069 clif_skill_fail(sd,skillid,0,0); 3070 return 0; 3071 } 3072 return skill_castend_damage_id(src, bl, skillid, skilllv, tick, flag); 3073 } 3074 break; 3082 3075 3083 3076 case NPC_SMOKING: //Since it is a self skill, this one ends here rather than in damage_id. [Skotlex] … … 3107 3100 int heal = skill_calc_heal(src, bl, skilllv); 3108 3101 int heal_get_jobexp; 3109 3102 3110 3103 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3111 3104 heal=0; 3112 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 3113 if(dstsd) { 3114 heal = heal * (100 - pc_checkskill(dstsd,AD_PROFANE)*3)/100; 3115 //Wont heal even if he got elemental armors [Brain] 3116 if(pc_checkskill(dstsd,NC_PHYLACTERY)) heal = skilllv; 3117 } 3105 //To not allow heal for joo 3106 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 3107 if(dstsd) { 3108 heal = heal * (100 - pc_checkskill(dstsd,AD_PROFANE)*3)/100; 3109 //Wont heal even if he got elemental armors [Brain] 3110 if(pc_checkskill(dstsd,NC_PHYLACTERY)) heal = skilllv; 3111 } 3118 3112 if (sd) { 3119 3113 if ((i = pc_skillheal_bonus(sd, skillid))) … … 3151 3145 } 3152 3146 break; 3153 3154 3147 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3155 { 3156 int heal = skill_calc_heal(src, bl, skilllv); 3157 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3158 heal=0; 3159 if(battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race==RC_UNDEAD // Check if our target is undead or demon 3160 || tstatus->race==RC_DEMON || pc_checkskill(dstsd,NC_PHYLACTERY)//Or has a phylactery 3161 || status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or is on OverWhelm status, checking again... 3162 clif_skill_nodamage(src, bl, skillid, heal, 1); 3163 clif_skill_nodamage(NULL, bl, AL_HEAL, heal, 1); //Subtle way to show heal numbers AND effect =D 3164 status_heal(bl, heal, 0, 0); 3165 } else { 3166 clif_skill_nodamage(src, bl, skillid, 0, 1); 3167 clif_skill_nodamage(NULL, bl, AL_HEAL, 0, 1); 3168 } 3169 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 3170 } 3171 break; 3172 3148 { 3149 int heal = skill_calc_heal(src, bl, skilllv); 3150 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3151 heal=0; 3152 if(battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race==RC_UNDEAD // Check if our target is undead or demon 3153 || tstatus->race==RC_DEMON || pc_checkskill(dstsd,NC_PHYLACTERY)//Or has a phylactery 3154 || status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or is on OverWhelm status, checking again... 3155 clif_skill_nodamage(src, bl, skillid, heal, 1); 3156 clif_skill_nodamage(NULL, bl, AL_HEAL, heal, 1); //Subtle way to show heal numbers AND effect =D 3157 status_heal(bl, heal, 0, 0); 3158 } else { 3159 clif_skill_nodamage(src, bl, skillid, 0, 1); 3160 clif_skill_nodamage(NULL, bl, AL_HEAL, 0, 1); 3161 } 3162 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 3163 } 3164 break; 3173 3165 3174 3166 case PR_REDEMPTIO: … … 3202 3194 } else //Invalid target, skip resurrection. 3203 3195 break; 3204 3196 3205 3197 case ALL_RESURRECTION: 3206 case NC_DEATHPACT: // Necro Death Pact [Brain] 3198 case NC_DEATHPACT: // Necro Death Pact [Brain] (Seems fine) 3207 3199 if(sd && map_flag_gvg(bl->m)) 3208 3200 { //No reviving in WoE grounds! … … 3212 3204 if (!status_isdead(bl)) 3213 3205 break; 3214 { 3206 { 3215 3207 int per = 0, sper = 0; 3216 3208 if (map[bl->m].flag.pvp && dstsd && dstsd->pvp_point < 0) … … 3223 3215 case 4: per=80; break; 3224 3216 case 5: per=100; break; //Added a 5th level because NC_DEATHPACT got 5 lvs [Brain] 3225 } 3226 if(dstsd && dstsd->special_state.restart_full_recover) 3217 //above seems ok 3218 } 3219 if(dstsd && dstsd->special_state.restart_full_recover) 3227 3220 per = sper = 100; 3228 3221 if (status_revive(bl, per, sper)) 3229 3222 { 3230 3223 clif_skill_nodamage(src,bl,ALL_RESURRECTION,skilllv,1); //Both Redemptio and Res show this skill-animation. 3231 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] 3232 clif_skill_nodamage(src, bl, skillid, skilllv, 3233 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3234 break; 3235 } 3236 3237 if(sd && dstsd && battle_config.resurrection_exp > 0) 3224 //Seriously, how is this right? It just doesnt look right but i may be ignoring something. 3225 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] 3226 clif_skill_nodamage(src, bl, skillid, skilllv, 3227 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3228 break; 3229 } 3230 3231 if(sd && dstsd && battle_config.resurrection_exp > 0) 3238 3232 { 3239 3233 int exp = 0,jexp = 0; … … 3253 3247 } 3254 3248 break; 3255 3249 //Huge lump of code here. 3256 3250 case AD_PWBLIND: // Adept Power Word: Blind [Brain] 3257 if(!tsc->data[type]) { 3258 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3259 if(sc_start(bl, type,(30 + skilllv * 10 + (status_get_lv(src) - sstatus->int_)/5), 3260 skilllv, skill_get_time(skillid,skilllv))) 3261 { 3262 if(dstmd) mob_unlocktarget(dstmd,tick); //Removes current target 3263 clif_specialeffect(bl, 379, AREA); //379.Soul Drain (2nd Part) 3264 break; 3265 } 3266 } else clif_skill_fail(sd,skillid,0,0); 3267 break; 3268 3251 if(!tsc->data[type]) { 3252 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3253 if(sc_start(bl, type,(30 + skilllv * 10 + (status_get_lv(src) - sstatus->int_)/5), 3254 skilllv, skill_get_time(skillid,skilllv))) 3255 { 3256 if(dstmd) mob_unlocktarget(dstmd,tick); //Removes current target 3257 clif_specialeffect(bl, 379, AREA); //379.Soul Drain (2nd Part) 3258 break; 3259 } 3260 } else clif_skill_fail(sd,skillid,0,0); 3261 break; 3269 3262 case AD_PWFEAR: // Adept Power Word: Fear [Brain] 3270 if(!tsc->data[type]) {3271 clif_skill_nodamage(src, bl, skillid, skilllv,1);3272 if(dstsd)3273 type = SC_CONFUSION; //Players cant be affected by SC_FEAR3274 if(sc_start(bl, type, (30 + skilllv * 10), skilllv, skill_get_time(skillid,skilllv)))3275 {3276 clif_specialeffect(bl, 372, AREA); //372.Death3277 unit_escape(bl, bl, 30);3278 }3279 } else clif_skill_fail(sd,skillid,0,0);3280 break;3263 if(!tsc->data[type]) { 3264 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3265 if(dstsd) 3266 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3267 if(sc_start(bl, type, (30 + skilllv * 10), skilllv, skill_get_time(skillid,skilllv))) 3268 { 3269 clif_specialeffect(bl, 372, AREA); //372.Death 3270 unit_escape(bl, bl, 30); 3271 } 3272 } else clif_skill_fail(sd,skillid,0,0); 3273 break; 3281 3274 case WL_HOWLOFPAIN: // Warlock Howl of Pain [Brain] 3282 //These must be here first or else the code wont execute them. 3283 clif_specialeffect(src, 670, AREA); // Monster skill SCREAM effect on caster (no sound) 3284 clif_soundeffectall(bl, "wraith_die.wav", 0, AREA); //Wraith Laugh Sound 3285 if (flag & 1) { 3286 //Check if target is a living creature AND a valid enemy 3287 if (battle_check_target(src, bl, BCT_ENEMY) && battle_check_living(tstatus->race,tstatus->def_ele)) 3288 { 3289 if(sc_start(bl,type,10+skilllv*10,skilllv,skill_get_time(skillid,skilllv))) 3290 { 3291 if(dstmd) //PROVOKE Effect on mobs 3292 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 3293 // Breaks Frozen and Sleep status 3294 if(tsc && tsc->count){ 3295 if(tsc->data[SC_FREEZE]) 3296 status_change_end(bl,SC_FREEZE,-1); 3297 if(tsc->data[SC_SLEEP]) 3298 status_change_end(bl,SC_SLEEP,-1); 3299 } 3300 clif_emotion(bl,6); //anger emote on target 3301 break; 3302 } else { //What will happen if the status fail: 3275 //These must be here first or else the code wont execute them. 3276 clif_specialeffect(src, 670, AREA); // Monster skill SCREAM effect on caster (no sound) 3277 clif_soundeffectall(bl, "wraith_die.wav", 0, AREA); //Wraith Laugh Sound 3278 if (flag & 1) { 3279 //Check if target is a living creature AND a valid enemy 3280 if (battle_check_target(src, bl, BCT_ENEMY) && battle_check_living(tstatus->race,tstatus->def_ele)) 3303 3281 { 3304 if (sd) //If is a player 3305 clif_skill_fail(sd,skillid,0,0); 3306 map_freeblock_unlock(); //Else is a mob 3307 return 0; 3308 } 3309 unit_skillcastcancel(bl, 2); //In any case, will cancel casting 3310 } 3311 } 3312 } else { 3313 map_foreachinrange(skill_area_sub, src, 3314 skill_get_splash(skillid, skilllv), BL_CHAR, 3315 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3316 skill_castend_nodamage_id); 3317 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3318 map_freeblock_unlock(); 3319 return 1; 3320 } 3321 break; 3282 if(sc_start(bl,type,10+skilllv*10,skilllv,skill_get_time(skillid,skilllv))) 3283 { 3284 if(dstmd) //PROVOKE Effect on mobs 3285 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 3286 // Breaks Frozen and Sleep status 3287 if(tsc && tsc->count){ 3288 if(tsc->data[SC_FREEZE]) 3289 status_change_end(bl,SC_FREEZE,-1); 3290 if(tsc->data[SC_SLEEP]) 3291 status_change_end(bl,SC_SLEEP,-1); 3292 } 3293 clif_emotion(bl,6); //anger emote on target 3294 break; 3295 } else { //What will happen if the status fail: 3296 { 3297 if (sd) //If is a player 3298 clif_skill_fail(sd,skillid,0,0); 3299 map_freeblock_unlock(); //Else is a mob 3300 return 0; 3301 } 3302 unit_skillcastcancel(bl, 2); //In any case, will cancel casting 3303 } 3304 } 3305 } else { 3306 map_foreachinrange(skill_area_sub, src, 3307 skill_get_splash(skillid, skilllv), BL_CHAR, 3308 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3309 skill_castend_nodamage_id); 3310 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3311 map_freeblock_unlock(); 3312 return 1; 3313 } 3314 break; 3322 3315 case WL_HOWLOFTERROR: // Warlock Howl of Terror [Brain] 3323 if (flag & 1) {3324 int rate;3325 //Check if target is a living creature AND a valid enemy3326 if (battle_check_target(src, bl, BCT_ENEMY)3327 && battle_check_living(tstatus->race,tstatus->def_ele)) {3328 rate = 10 + skilllv*5 + pc_checkskill(sd,AD_PWFEAR)*3;3329 if(dstsd) {3330 rate -= 10; // 10% less chance on players3331 type = SC_CONFUSION; //Players cant be affected by SC_FEAR3332 }3333 if(sc_start(bl,type,rate,skilllv,skill_get_time(skillid,skilllv)))3334 clif_specialeffect(bl, 372, AREA); //Same as PW: Fear3335 }3336 } else {3337 map_foreachinrange(skill_area_sub, src,3338 skill_get_splash(skillid, skilllv), BL_CHAR,3339 src, skillid, skilllv, tick, flag|BCT_ENEMY|1,3340 skill_castend_nodamage_id);3341 clif_skill_nodamage(src, bl, skillid, skilllv, 1);3342 }3343 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound)3344 break;3345 3316 if (flag & 1) { 3317 int rate; 3318 //Check if target is a living creature AND a valid enemy 3319 if (battle_check_target(src, bl, BCT_ENEMY) 3320 && battle_check_living(tstatus->race,tstatus->def_ele)) { 3321 rate = 10 + skilllv*5 + pc_checkskill(sd,AD_PWFEAR)*3; 3322 if(dstsd) { 3323 rate -= 10; // 10% less chance on players 3324 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3325 } 3326 if(sc_start(bl,type,rate,skilllv,skill_get_time(skillid,skilllv))) 3327 clif_specialeffect(bl, 372, AREA); //Same as PW: Fear 3328 } 3329 } else { 3330 map_foreachinrange(skill_area_sub, src, 3331 skill_get_splash(skillid, skilllv), BL_CHAR, 3332 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3333 skill_castend_nodamage_id); 3334 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3335 } 3336 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound) 3337 break; 3338 // Would be easy to screw up in that. 3346 3339 3347 3340 case AL_DECAGI: … … 3361 3354 } 3362 3355 break; 3363 3356 //another huge lump 3364 3357 case NC_DARKMOON: //Necro Dark Moon [Brain] 3365 if (flag&1) {3366 //Check my enemies3367 if (battle_check_target(src, bl, BCT_ENEMY) &&3368 battle_check_living(tstatus->race,tstatus->def_ele))3369 {3370 if(sc_start(bl,SC_BLIND,50,skilllv,skill_get_time(skillid,skilllv)))3371 clif_specialeffect(bl, 580, AREA); //Box of Rain effect on target3372 }3373 else { //Now my Party members3374 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) {3375 clif_skill_nodamage(bl,bl,skillid,skilllv,3376 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));3377 clif_specialeffect(bl, 521, AREA); //Red Flashing Aura Sprite effect on target3378 } else if (sd) {3379 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv),3380 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id);3381 }3382 }3383 } else {3384 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR,3385 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id);3386 clif_skill_nodamage(src, bl, skillid, skilllv, 1);3387 }3388 clif_specialeffect(src, 407, AREA); //Soul Change Effect on caster3389 clif_soundeffectall(bl, "se_wolf1.wav", 0, AREA); //Wolf Howl Sound3390 break;3358 if (flag&1) { 3359 //Check my enemies 3360 if (battle_check_target(src, bl, BCT_ENEMY) && 3361 battle_check_living(tstatus->race,tstatus->def_ele)) 3362 { 3363 if(sc_start(bl,SC_BLIND,50,skilllv,skill_get_time(skillid,skilllv))) 3364 clif_specialeffect(bl, 580, AREA); //Box of Rain effect on target 3365 } 3366 else { //Now my Party members 3367 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3368 clif_skill_nodamage(bl,bl,skillid,skilllv, 3369 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3370 clif_specialeffect(bl, 521, AREA); //Red Flashing Aura Sprite effect on target 3371 } else if (sd) { 3372 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3373 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3374 } 3375 } 3376 } else { 3377 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3378 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3379 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3380 } 3381 clif_specialeffect(src, 407, AREA); //Soul Change Effect on caster 3382 clif_soundeffectall(bl, "se_wolf1.wav", 0, AREA); //Wolf Howl Sound 3383 break; 3391 3384 case NC_REQUIEM: //Necro Requiem [Brain] 3392 if (flag&1) { 3393 //Check my enemies 3394 if (battle_check_target(src, bl, BCT_ENEMY) && 3395 battle_check_living(tstatus->race,tstatus->def_ele)) 3396 { 3397 if(sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))) 3398 clif_specialeffect(bl, 578, AREA); //Box of Curse effect on target 3399 } 3400 else { //Now my Party members 3401 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3402 clif_skill_nodamage(bl,bl,skillid,skilllv, 3403 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3404 clif_specialeffect(bl, 572, AREA); //Warmth Soul effect on target 3405 } else if (sd) { 3406 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3407 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3408 } 3409 } 3410 } else { 3411 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3412 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3413 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3414 } 3415 int rnds = rand()%3; 3416 switch(rnds) { 3417 case 1: 3418 clif_soundeffectall(bl, "chant1.wav", 0, AREA); //Chanting Sound 3419 break; 3420 case 2: 3421 clif_soundeffectall(bl, "chant2.wav", 0, AREA); //Chanting Sound 3422 break; 3423 case 3: 3424 clif_soundeffectall(bl, "chant3.wav", 0, AREA); //Chanting Sound 3425 break; 3426 } 3427 break; 3428 3385 if (flag&1) { 3386 //Check my enemies 3387 if (battle_check_target(src, bl, BCT_ENEMY) && 3388 battle_check_living(tstatus->race,tstatus->def_ele)) 3389 { 3390 if(sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))) 3391 clif_specialeffect(bl, 578, AREA); //Box of Curse effect on target 3392 } 3393 else { //Now my Party members 3394 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3395 clif_skill_nodamage(bl,bl,skillid,skilllv, 3396 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3397 clif_specialeffect(bl, 572, AREA); //Warmth Soul effect on target 3398 } else if (sd) { 3399 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3400 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3401 } 3402 } 3403 } else { 3404 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3405 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3406 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3407 } 3408 int rnds = rand()%3; 3409 switch(rnds) { 3410 case 1: 3411 clif_soundeffectall(bl, "chant1.wav", 0, AREA); //Chanting Sound 3412 break; 3413 case 2: 3414 clif_soundeffectall(bl, "chant2.wav", 0, AREA); //Chanting Sound 3415 break; 3416 case 3: 3417 clif_soundeffectall(bl, "chant3.wav", 0, AREA); //Chanting Sound 3418 break; 3419 } 3420 break; 3429 3421 3430 3422 case PR_LEXDIVINA: … … 3432 3424 status_change_end(bl,type, -1); 3433 3425 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3434 } else 3435 clif_skill_nodamage (src, bl, skillid, skilllv, 3426 } else 3427 clif_skill_nodamage (src, bl, skillid, skilllv, 3436 3428 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3437 3429 break; … … 3449 3441 abra_skilllv = min(skilllv, skill_get_max(abra_skillid)); 3450 3442 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3451 3443 3452 3444 if( sd ) 3453 3445 {// player-casted … … 3463 3455 int target_id = 0; 3464 3456 if (!ud) break; 3465 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3457 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3466 3458 if (src->type == BL_PET) 3467 3459 bl = (struct block_list*)((TBL_PET*)src)->msd; 3468 3460 if (!bl) bl = src; 3469 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3461 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3470 3462 } else { //Assume offensive skills 3471 3463 if (ud->target) … … 3480 3472 bl = map_id2bl(target_id); 3481 3473 if (!bl) bl = src; 3482 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3474 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3483 3475 } else 3484 3476 unit_skilluse_id(src, target_id, abra_skillid, abra_skilllv); … … 3554 3546 case CR_PROVIDENCE: 3555 3547 if(sd && dstsd){ //Check they are not another crusader [Skotlex] 3556 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3548 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3557 3549 clif_skill_fail(sd,skillid,0,0); 3558 3550 map_freeblock_unlock(); … … 3563 3555 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3564 3556 break; 3565 3557 3566 3558 case CG_MARIONETTE: 3567 3559 { … … 3661 3653 3662 3654 sc_start(bl,SC_SEVENWIND,100,skilllv,skill_get_time(skillid,skilllv)); 3663 3655 3664 3656 break; 3665 3657 … … 3692 3684 case LK_BERSERK: 3693 3685 case KN_AUTOCOUNTER: 3694 case KN_TWOHANDQUICKEN: 3686 case KN_TWOHANDQUICKEN: 3695 3687 case KN_ONEHAND: 3696 3688 case CR_SPEARQUICKEN: … … 3703 3695 case MO_BLADESTOP: 3704 3696 case LK_AURABLADE: 3705 case LK_PARRYING: 3697 case LK_PARRYING: 3706 3698 case LK_CONCENTRATION: 3707 3699 case WS_CARTBOOST: … … 3729 3721 case NPC_DEFENDER: 3730 3722 case NPC_MAGICMIRROR: 3731 case ALL_ATFIELD: 3723 case ALL_ATFIELD: //AT Field [Brain] ( still dont think this belongs.) 3732 3724 clif_skill_nodamage(src,bl,skillid,skilllv, 3733 3725 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3734 3726 break; 3727 //ANOTHER large lump but it really doesnt feel like it fits here. 3735 3728 case AD_LUST: // Adept Blood Lust [Brain] 3736 clif_specialeffect(src, 220, AREA); //Berserk Pot effect3737 clif_specialeffect(src, 455, AREA); //Red Lightnings3738 clif_skill_nodamage(src,bl,skillid,skilllv,3739 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));3740 break;3729 clif_specialeffect(src, 220, AREA); //Berserk Pot effect 3730 clif_specialeffect(src, 455, AREA); //Red Lightnings 3731 clif_skill_nodamage(src,bl,skillid,skilllv, 3732 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3733 break; 3741 3734 case NC_DECREPIFY: //Necro Decrepify [Brain] 3742 if(battle_check_living(tstatus->race,tstatus->def_ele)){3743 clif_specialeffect(bl, 403, AREA); //Mind Breaker Effect on target3744 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster3745 clif_skill_nodamage(src,bl,skillid,skilllv,3746 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));3747 }3748 else clif_skill_fail(sd,skillid,0,0);3749 break;3735 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 3736 clif_specialeffect(bl, 403, AREA); //Mind Breaker Effect on target 3737 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 3738 clif_skill_nodamage(src,bl,skillid,skilllv, 3739 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3740 } 3741 else clif_skill_fail(sd,skillid,0,0); 3742 break; 3750 3743 case WL_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 3751 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite effect on target 3752 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3753 clif_skill_nodamage(src,bl,skillid,skilllv, 3754 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3755 break; 3756 case WL_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 3757 clif_specialeffect(bl, 135, AREA); //Ice Breaking effect on target 3758 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3759 clif_skill_nodamage(src,bl,skillid,skilllv, 3760 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3761 break; 3762 case WL_CURSETONGUES: // Warlock Curse of Tongues [Brain] 3763 clif_specialeffect(bl, 72, AREA); //Spinning Lights effect on target 3764 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3765 clif_skill_nodamage(src,bl,skillid,skilllv, 3766 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3767 break; 3768 case WL_CURSEDOOM: // Warlock Curse of Doom (temp) [Brain] 3769 if(!tsc->data[type]) { 3770 clif_specialeffect(bl, 196, AREA); //Small Curse Reaper effect on target 3744 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite effect on target 3771 3745 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3772 3746 clif_skill_nodamage(src,bl,skillid,skilllv, 3773 sc_start4(bl,type,100, 3774 skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); 3775 } else clif_skill_fail(sd,skillid,0,0); 3776 break; 3747 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3748 break; 3749 case WL_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 3750 clif_specialeffect(bl, 135, AREA); //Ice Breaking effect on target 3751 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3752 clif_skill_nodamage(src,bl,skillid,skilllv, 3753 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3754 break; 3755 case WL_CURSETONGUES: // Warlock Curse of Tongues [Brain] 3756 clif_specialeffect(bl, 72, AREA); //Spinning Lights effect on target 3757 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3758 clif_skill_nodamage(src,bl,skillid,skilllv, 3759 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3760 break; 3761 case WL_CURSEDOOM: // Warlock Curse of Doom (temp) [Brain] 3762 if(!tsc->data[type]) { 3763 clif_specialeffect(bl, 196, AREA); //Small Curse Reaper effect on target 3764 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3765 clif_skill_nodamage(src,bl,skillid,skilllv, 3766 sc_start4(bl,type,100, 3767 skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); 3768 } else clif_skill_fail(sd,skillid,0,0); 3769 break; 3777 3770 case WL_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 3778 clif_specialeffect(src, 348, AREA); //1000 Blades Trespassing effect on caster 3779 clif_skill_nodamage(src,bl,skillid,skilllv, 3780 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3781 break; 3771 clif_specialeffect(src, 348, AREA); //1000 Blades Trespassing effect on caster 3772 clif_skill_nodamage(src,bl,skillid,skilllv, 3773 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3774 break; 3775 3782 3776 case MG_SIGHT: 3783 3777 case AL_RUWACH: … … 3894 3888 if (!i) 3895 3889 { 3896 if (sd) 3890 if (sd) 3897 3891 clif_skill_fail(sd,skillid,0,0); 3898 3892 map_freeblock_unlock(); … … 3980 3974 skill_additional_effect(src,bl,skillid,skilllv,BF_MISC,tick); //Use Misc rather than weapon to signal passive pushback 3981 3975 } 3982 break; 3976 break; 3983 3977 3984 3978 case MO_ABSORBSPIRITS: … … 3996 3990 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 3997 3991 break; 3998 3992 //this feels more like it fits. 3999 3993 case WL_DRAINSOUL: // Warlock Drain Soul [Brain] 4000 i = 0; 4001 if (dstsd && (sd == dstsd || map_flag_vs(src->m))) 4002 { //check if target is a player and we are in versus map 4003 i = tstatus->max_sp * skilllv/100;//i = SkillLv% of player Max SP 4004 if(dstsd->spiritball && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { 4005 i += dstsd->spiritball * 5;//will drain Monk Spirits and regain 5 SP per Spirit 4006 pc_delspiritball(dstsd,dstsd->spiritball,0); 4007 } 4008 } else if (dstmd && !(tstatus->mode&MD_BOSS) && battle_check_living(tstatus->race,tstatus->def_ele)) 4009 { // check if target is a monster and not a Boss 4010 i = dstmd->level/5 * skilllv;//i = mob level/5 * Skill Lvl 4011 mob_target(dstmd,src,0);//This will turn the mob agressive against the caster 4012 } 4013 if(i < skilllv) i = skilllv; //Minimum 1 sp per skill lvl 4014 if (i) { 4015 clif_specialeffect(src, 253, AREA); //Absorb Mana effect on caster 4016 clif_specialeffect(bl, 52, AREA); //Lightning Hit effect on target 4017 status_heal(src, 0, i, 3); //caster drains sp 4018 status_zap(bl, 0, i*skilllv); //target lost sp equal to 1*SkillLv the amount drained 4019 } 4020 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4021 break; 4022 3994 i = 0; 3995 if (dstsd && (sd == dstsd || map_flag_vs(src->m))) 3996 { //check if target is a player and we are in versus map 3997 i = tstatus->max_sp * skilllv/100;//i = SkillLv% of player Max SP 3998 if(dstsd->spiritball && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { 3999 i += dstsd->spiritball * 5;//will drain Monk Spirits and regain 5 SP per Spirit 4000 pc_delspiritball(dstsd,dstsd->spiritball,0); 4001 } 4002 } else if (dstmd && !(tstatus->mode&MD_BOSS) && battle_check_living(tstatus->race,tstatus->def_ele)) 4003 { // check if target is a monster and not a Boss 4004 i = dstmd->level/5 * skilllv;//i = mob level/5 * Skill Lvl 4005 mob_target(dstmd,src,0);//This will turn the mob agressive against the caster 4006 } 4007 if(i < skilllv) i = skilllv; //Minimum 1 sp per skill lvl 4008 if (i) { 4009 clif_specialeffect(src, 253, AREA); //Absorb Mana effect on caster 4010 clif_specialeffect(bl, 52, AREA); //Lightning Hit effect on target 4011 status_heal(src, 0, i, 3); //caster drains sp 4012 status_zap(bl, 0, i*skilllv); //target lost sp equal to 1*SkillLv the amount drained 4013 } 4014 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4015 break; 4023 4016 4024 4017 case AC_MAKINGARROW: … … 4113 4106 } 4114 4107 break; 4115 4108 4116 4109 case WZ_SIGHTRASHER: 4117 4110 //Passive side of the attack. … … 4221 4214 case SM_AUTOBERSERK: // Celest 4222 4215 if (tsce) 4223 i = status_change_end(bl, type, -1); 4216 i = status_change_end(bl, type, -1); 4224 4217 else 4225 4218 i = sc_start(bl,type,100,skilllv,60000); … … 4235 4228 break; 4236 4229 case TK_RUN: 4237 if (tsce) 4230 if (tsce) 4238 4231 clif_skill_nodamage(src,bl,skillid,skilllv, 4239 4232 status_change_end(bl, type, -1)); … … 4331 4324 if (dstmd) 4332 4325 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 4333 4326 4334 4327 if (tsc->data[SC_STONE]) { 4335 4328 status_change_end(bl,SC_STONE,-1); … … 4482 4475 } 4483 4476 break; 4484 4477 4485 4478 case TF_PICKSTONE: 4486 4479 if(sd) { … … 4539 4532 //Note that Full Strip autospell doesn't use a duration 4540 4533 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 4541 skill_strip_equip(bl, location, i, skilllv, 4534 skill_strip_equip(bl, location, i, skilllv, 4542 4535 sd&&skillid==ST_FULLSTRIP&&!pc_checkskill(sd, skillid)?0:skill_get_time(skillid,skilllv))) 4543 4536 && sd) … … 4695 4688 continue; 4696 4689 switch (i) { 4697 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 4690 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 4698 4691 case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: 4699 4692 case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: … … 4745 4738 y = src->y + diry[dir]*skilllv*2; 4746 4739 } 4747 4740 4748 4741 clif_skill_nodamage(src,bl,TK_HIGHJUMP,skilllv,1); 4749 4742 if(!map_count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB) && map_getcell(src->m,x,y,CELL_CHKREACH)) { … … 4789 4782 } else if (!dstsd || map_flag_vs(bl->m)) //HP damage only on pvp-maps when against players. 4790 4783 hp = tstatus->max_hp/50; //Recover 2% HP [Skotlex] 4791 4784 4792 4785 clif_skill_nodamage(src,bl,skillid,skilllv,1); 4793 4786 unit_skillcastcancel(bl,0); … … 4799 4792 else 4800 4793 hp = 0; 4801 4794 4802 4795 if (sp) //Recover some of the SP used 4803 4796 sp = sp*(25*(skilllv-1))/100; … … 4875 4868 case NPC_CHANGETELEKINESIS: 4876 4869 clif_skill_nodamage(src,bl,skillid,skilllv, 4877 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4870 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4878 4871 skill_get_time(skillid, skilllv))); 4879 4872 break; … … 4883 4876 if(tstatus->def_ele==ELE_UNDEAD || tstatus->def_ele==ELE_DARK) break; 4884 4877 clif_skill_nodamage(src,bl,skillid,skilllv, 4885 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4878 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4886 4879 skill_get_time(skillid, skilllv))); 4887 4880 break; … … 4900 4893 sc_start(bl,type,100,skilllv,skill_time)) 4901 4894 && ud) { //Disable attacking/acting/moving for skill's duration. 4902 ud->attackabletime = 4895 ud->attackabletime = 4903 4896 ud->canact_tick = 4904 4897 ud->canmove_tick = tick + skill_time; … … 4944 4937 } 4945 4938 break; 4946 4939 4947 4940 case NPC_SPEEDUP: 4948 4941 { … … 5017 5010 sc_start(bl,type,100,100,skill_get_time(skillid, skilllv))); 5018 5011 break; 5019 5012 5020 5013 case NPC_AGIUP: 5021 5014 sc_start(bl,SC_SPEEDUP1,100,skilllv,skill_get_time(skillid, skilllv)); … … 5029 5022 sc_start4(bl,type,100,skilllv,0,0,6,skill_get_time(skillid,skilllv))); 5030 5023 break; 5031 5024 5032 5025 case NPC_SIEGEMODE: 5033 5026 // not sure what it does … … 5179 5172 return 1; 5180 5173 } 5181 5174 5182 5175 if (tsce) 5183 5176 { //HelloKitty2 (?) explained that this silently fails when target is … … 5190 5183 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 5191 5184 sc_start(bl,type,55+5*skilllv,skilllv,skill_get_time(skillid,skilllv)))) 5192 { 5185 { 5193 5186 if (sd) clif_skill_fail(sd,skillid,0,0); 5194 5187 map_freeblock_unlock(); … … 5371 5364 break; 5372 5365 default: 5373 break; 5374 } 5366 break; 5367 } 5375 5368 } while ((--count) > 0); 5376 5369 clif_skill_nodamage(src,bl,skillid,skilllv,1); … … 5432 5425 clif_skill_nodamage(src,bl,skillid,skilllv, 5433 5426 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 5434 5427 5435 5428 if (skillid == SL_SKE) 5436 5429 sc_start(src,SC_SMA,100,skilllv,skill_get_time(SL_SMA,skilllv)); 5437 5430 5438 5431 break; 5439 5432 5440 5433 // New guild skills [Celest] 5441 5434 case GD_BATTLEORDER: … … 5515 5508 clif_feel_info(sd, skilllv-1, 1); 5516 5509 } 5517 break; 5510 break; 5518 5511 5519 5512 case SG_HATE: … … 5595 5588 static const int per[5][2]={{20,50},{50,60},{25,75},{60,64},{34,67}}; 5596 5589 int rnd = rand()%100; 5597 i = (skilllv-1)%5; 5590 i = (skilllv-1)%5; 5598 5591 if(rnd<per[i][0]) //Self 5599 5592 bl = src; … … 5662 5655 mobskill_event(dstmd, src, tick, MSC_SKILLUSED|(skillid<<16)); 5663 5656 } 5664 5657 5665 5658 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. 5666 5659 battle_consume_ammo(sd, skillid, skilllv); … … 5694 5687 } 5695 5688 5696 if(ud->skillid != SA_CASTCANCEL ) { 5689 if(ud->skillid != SA_CASTCANCEL ) 5690 {// otherwise handled in unit_skillcastcancel() 5697 5691 if( ud->skilltimer != tid ) { 5698 5692 ShowError("skill_castend_id: Timer mismatch %d!=%d!\n", ud->skilltimer, tid); … … 5700 5694 return 0; 5701 5695 } 5702 if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST)) 5703 status_freecast_switch(sd); 5704 ud->skilltimer=-1; 5696 5697 if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 ) 5698 {// restore original walk speed 5699 ud->skilltimer = -1; 5700 status_calc_bl(&sd->bl, SCB_SPEED); 5701 } 5702 5703 ud->skilltimer = -1; 5705 5704 } 5706 5705 … … 5765 5764 if(inf2 & (INF2_PARTY_ONLY|INF2_GUILD_ONLY) && src != target) 5766 5765 { 5767 inf |= 5766 inf |= 5768 5767 (inf2&INF2_PARTY_ONLY?BCT_PARTY:0)| 5769 5768 (inf2&INF2_GUILD_ONLY?BCT_GUILD:0); … … 5807 5806 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv,1)) 5808 5807 break; 5809 5808 5810 5809 if(hd && !skill_check_condition_hom(hd,ud->skillid, ud->skilllv,1)) //[orn] 5811 5810 break; … … 5816 5815 if (ud->walktimer != -1 && ud->skillid != TK_RUN) 5817 5816 unit_stop_walking(src,1); 5818 5817 5819 5818 ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv); 5820 5819 5821 5820 if (skill_get_state(ud->skillid) != ST_MOVE_ENABLE) 5822 5821 unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1); 5823 5822 5824 5823 if(battle_config.skill_log && battle_config.skill_log&src->type) 5825 5824 ShowInfo("Type %d, ID %d skill castend id [id =%d, lv=%d, target ID %d]\n", … … 5876 5875 if (dy > 0) dy++; 5877 5876 else if(dy < 0) dy--; 5878 5877 5879 5878 if (unit_movepos(src, src->x+dx, src->y+dy, 1, 1)) 5880 5879 { //Display movement + animation. … … 5897 5896 5898 5897 /*========================================== 5899 * 5898 * 5900 5899 *------------------------------------------*/ 5901 5900 int skill_castend_pos(int tid, unsigned int tick, int id, intptr data) … … 5918 5917 return 0; 5919 5918 } 5920 5919 5921 5920 if( ud->skilltimer != tid ) 5922 5921 { … … 5926 5925 } 5927 5926 5928 if(sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST)) 5929 status_freecast_switch(sd); 5930 5927 if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 ) 5928 {// restore original walk speed 5929 ud->skilltimer=-1; 5930 status_calc_bl(&sd->bl, SCB_SPEED); 5931 } 5931 5932 ud->skilltimer=-1; 5933 5932 5934 do { 5933 5935 if(status_isdead(src)) … … 5937 5939 skill_get_unit_flag(ud->skillid)&UF_NOREITERATION && 5938 5940 skill_check_unit_range(src,ud->skillx,ud->skilly,ud->skillid,ud->skilllv) 5939 ) 5941 ) 5940 5942 { 5941 5943 if (sd) clif_skill_fail(sd,ud->skillid,0,0); … … 5976 5978 } 5977 5979 } 5978 5980 5979 5981 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv, 1)) 5980 5982 break; … … 6062 6064 skill_area_temp[1] = src->id; 6063 6065 i = skill_get_splash(skillid, skilllv); 6064 map_foreachinarea(skill_area_sub, 6066 map_foreachinarea(skill_area_sub, 6065 6067 src->m, x-i, y-i, x+i, y+i, BL_PC, 6066 6068 src, skillid, skilllv, tick, flag|BCT_ALL|1, … … 6089 6091 src->m, x-i, y-i, x+i,y+i,BL_SKILL); 6090 6092 break; 6091 6093 //the code changed alot and jumped around. 6092 6094 case WL_HELLFIRE: // Warlock Hellfire [Brain] 6093 //clif_specialeffect(sd, 92, AREA); //Meteor Effect on caster, cant set on ground 6094 clif_skill_poseffect(src,WZ_METEOR,skilllv,x,y,tick); //Meteor Effect 6095 clif_skill_nodamage(src, src, skillid, 0, 1); //Lalala, just to show the skill yell correctly 6096 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 6097 // Continue reading because skill_unitsetting is bellow 6098 6099 6095 //clif_specialeffect(sd, 92, AREA); //Meteor Effect on caster, cant set on ground 6096 clif_skill_poseffect(src,WZ_METEOR,skilllv,x,y,tick); //Meteor Effect 6097 clif_skill_nodamage(src, src, skillid, 0, 1); //Lalala, just to show the skill yell correctly 6098 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 6099 // Continue reading because skill_unitsetting is bellow 6100 6100 case MG_SAFETYWALL: 6101 case MG_FIREWALL: 6101 case MG_FIREWALL: 6102 6102 case MG_THUNDERSTORM: 6103 6103 case AL_PNEUMA: … … 6256 6256 md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, md->bl.id, 0); 6257 6257 mob_spawn (md); //Now it is ready for spawning. 6258 // @showsummon command implementation [Brainstorm] 6259 if(sd->state.showsummon){ 6260 char output[256]; 6261 sprintf(output, 6262 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6263 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6264 clif_disp_onlyself(sd,output,strlen(output)); 6265 sprintf(output, 6266 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6267 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6268 clif_disp_onlyself(sd,output,strlen(output)); 6269 } 6270 6271 } 6272 } 6273 break; 6274 6258 //Does this really belong here? 6259 // @showsummon command implementation [Brainstorm] 6260 if(sd->state.showsummon){ 6261 char output[256]; 6262 sprintf(output, 6263 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6264 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6265 clif_disp_onlyself(sd,output,strlen(output)); 6266 sprintf(output, 6267 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6268 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6269 clif_disp_onlyself(sd,output,strlen(output)); 6270 } 6271 6272 } 6273 } 6274 break; 6275 6276 //HUGE lump of code! 6277 //Some of the code repeats itself, Unless it just recites it for other classes it may be a problem 6275 6278 case AD_FAMILIAR: // Adept Summon Familiar [Brain] 6276 if( sd ) 6277 { 6278 int id; 6279 int mob_class; 6280 struct mob_data* md; 6281 mob_class = pc_readglobalreg(sd, "ADEPT_FAMILIAR"); 6282 if( mob_class == 0 ) 6279 if( sd ) 6283 6280 { 6284 mob_class = mob_get_random_id(4, 0x1, 0); 6285 pc_setglobalreg(sd, "ADEPT_FAMILIAR", mob_class); 6286 } 6287 id = mob_once_spawn(sd,src->m,src->x,src->y,"--en--",mob_class,1,""); 6288 md = (struct mob_data *)map_id2bl(id); 6289 if( md != NULL ) 6290 { 6291 md->master_id = sd->bl.id; 6292 md->special_state.ai = 1; 6293 md->status.mode = md->status.mode|MD_AGGRESSIVE; 6294 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6295 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6296 // @showsummon command implementation [Brainstorm] 6297 if(sd->state.showsummon){ 6298 char output[256]; 6299 sprintf(output, 6300 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6301 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6302 clif_disp_onlyself(sd,output,strlen(output)); 6303 sprintf(output, 6304 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6305 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6306 clif_disp_onlyself(sd,output,strlen(output)); 6307 } 6308 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6309 } 6310 } 6311 break; 6281 int id; 6282 int mob_class; 6283 struct mob_data* md; 6284 6285 mob_class = pc_readglobalreg(sd, "ADEPT_FAMILIAR"); 6286 if( mob_class == 0 ) 6287 { 6288 mob_class = mob_get_random_id(4, 0x1, 0); 6289 pc_setglobalreg(sd, "ADEPT_FAMILIAR", mob_class); 6290 } 6291 id = mob_once_spawn(sd,src->m,src->x,src->y,"--en--",mob_class,1,""); 6292 md = (struct mob_data *)map_id2bl(id); 6293 if( md != NULL ) 6294 { 6295 md->master_id = sd->bl.id; 6296 md->special_state.ai = 1; 6297 md->status.mode = md->status.mode|MD_AGGRESSIVE; 6298 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6299 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6300 // @showsummon command implementation [Brainstorm] 6301 if(sd->state.showsummon){ 6302 char output[256]; 6303 sprintf(output, 6304 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6305 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6306 clif_disp_onlyself(sd,output,strlen(output)); 6307 sprintf(output, 6308 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6309 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6310 clif_disp_onlyself(sd,output,strlen(output)); 6311 } 6312 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6313 } 6314 } 6315 break; 6312 6316 case NC_SKELETON: // Raise Skeleton [Brain] 6313 6317 case NC_ARCHER: // Raise Archer Skeleton … … 6317 6321 case NC_SHADOW: // Raise Shadow 6318 6322 case NC_WRAITH: // Raise Wraith 6319 if( sd ) 6320 { 6321 static const int mob_skeleton[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 6322 static const int mob_archer[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 6323 static const int mob_zombie[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 6324 static const int mob_mummy[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 6325 static const int mob_ghost[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 6326 static const int mob_shadow[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 6327 static const int mob_wraith[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 6328 int id; 6329 int mob_class; 6330 struct mob_data *md; 6331 6332 switch( skillid ) 6323 if( sd ) 6333 6324 { 6334 case NC_SKELETON: mob_class = mob_skeleton[skilllv-1]; break; 6335 case NC_ARCHER: mob_class = mob_archer[skilllv-1]; break; 6336 case NC_ZOMBIE: mob_class = mob_zombie[skilllv-1]; break; 6337 case NC_MUMMY: mob_class = mob_mummy[skilllv-1]; break; 6338 case NC_GHOST: mob_class = mob_ghost[skilllv-1]; break; 6339 case NC_SHADOW: mob_class = mob_shadow[skilllv-1]; break; 6340 case NC_WRAITH: mob_class = mob_wraith[skilllv-1]; break; 6341 default: 6342 mob_class = 1002; // poring 6343 ShowDebug("skill_castend_pos2: undefined skill #%d used to raise mobs, defaulting to poring\n"); 6344 break; 6345 } 6346 id = mob_once_spawn(sd,src->m,src->x,src->y,"--ja--",mob_class,1,""); 6347 if((md=(struct mob_data *)map_id2bl(id))) 6348 { 6349 md->master_id=sd->bl.id; 6350 md->special_state.ai=1; 6351 md->status.mode=md->db->status.mode|MD_AGGRESSIVE; 6352 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6353 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6354 // @showsummon command implementation [Brainstorm] 6355 if(sd->state.showsummon){ 6356 char output[256]; 6357 sprintf(output, 6358 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6359 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6360 clif_disp_onlyself(sd,output,strlen(output)); 6361 sprintf(output, 6362 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6363 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6364 clif_disp_onlyself(sd,output,strlen(output)); 6365 } 6366 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6367 } 6368 } 6369 break; 6370 6325 static const int mob_skeleton[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 6326 static const int mob_archer[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 6327 static const int mob_zombie[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 6328 static const int mob_mummy[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 6329 static const int mob_ghost[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 6330 static const int mob_shadow[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 6331 static const int mob_wraith[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 6332 int id; 6333 int mob_class; 6334 struct mob_data *md; 6335 6336 switch( skillid ) 6337 { 6338 case NC_SKELETON: mob_class = mob_skeleton[skilllv-1]; break; 6339 case NC_ARCHER: mob_class = mob_archer[skilllv-1]; break; 6340 case NC_ZOMBIE: mob_class = mob_zombie[skilllv-1]; break; 6341 case NC_MUMMY: mob_class = mob_mummy[skilllv-1]; break; 6342 case NC_GHOST: mob_class = mob_ghost[skilllv-1]; break; 6343 case NC_SHADOW: mob_class = mob_shadow[skilllv-1]; break; 6344 case NC_WRAITH: mob_class = mob_wraith[skilllv-1]; break; 6345 default: 6346 mob_class = 1002; // poring 6347 ShowDebug("skill_castend_pos2: undefined skill #%d used to raise mobs, defaulting to poring\n"); 6348 break; 6349 } 6350 id = mob_once_spawn(sd,src->m,src->x,src->y,"--ja--",mob_class,1,""); 6351 if((md=(struct mob_data *)map_id2bl(id))) 6352 { 6353 md->master_id=sd->bl.id; 6354 md->special_state.ai=1; 6355 md->status.mode=md->db->status.mode|MD_AGGRESSIVE; 6356 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6357 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6358 //I bet this should NOT be here -- Critical 6359 if(sd->state.showsummon){ 6360 char output[256]; 6361 sprintf(output, 6362 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6363 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6364 clif_disp_onlyself(sd,output,strlen(output)); 6365 sprintf(output, 6366 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6367 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6368 clif_disp_onlyself(sd,output,strlen(output)); 6369 } 6370 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6371 } 6372 } 6373 break; 6371 6374 6372 6375 … … 6395 6398 potion_hp = potion_hp * (100+i)/100; 6396 6399 potion_sp = potion_sp * (100+i)/100; 6397 6400 6398 6401 if(potion_hp > 0 || potion_sp > 0) { 6399 6402 i = skill_get_splash(skillid, skilllv); … … 6417 6420 potion_hp = potion_hp * (100+i)/100; 6418 6421 potion_sp = potion_sp * (100+i)/100; 6419 6422 6420 6423 if(potion_hp > 0 || potion_sp > 0) { 6421 6424 i = skill_get_splash(skillid, skilllv); … … 6439 6442 } 6440 6443 break; 6441 6444 6442 6445 case HW_GRAVITATION: 6443 6446 if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0))) … … 6521 6524 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow if a ground skill was not invoked. [Skotlex] 6522 6525 battle_consume_ammo(sd, skillid, skilllv); 6523 6526 6524 6527 return 0; 6525 6528 } 6526 6529 6527 6530 /*========================================== 6528 * 6531 * 6529 6532 *------------------------------------------*/ 6530 6533 int skill_castend_map (struct map_session_data *sd, short skill_num, const char *map) … … 6534 6537 //Simplify skill_failed code. 6535 6538 #define skill_failed(sd) { sd->menuskill_id = sd->menuskill_val = 0; } 6536 if(skill_num != sd->menuskill_id) 6539 if(skill_num != sd->menuskill_id) 6537 6540 return 0; 6538 6541 … … 6569 6572 return 0; 6570 6573 } 6571 6574 6572 6575 switch(skill_num) 6573 6576 { … … 6610 6613 } 6611 6614 } 6612 6615 6613 6616 //When it's an item-used warp-portal, the skill-lv used is lost.. assume max level. 6614 6617 lv = sd->skillitem==skill_num?skill_get_max(skill_num):pc_checkskill(sd,skill_num); 6615 6618 wx = sd->menuskill_val>>16; 6616 6619 wy = sd->menuskill_val&0xffff; 6617 6620 6618 6621 if( lv <= 0 ) return 0; 6619 6622 if( lv > 4 ) lv = 4; // crash prevention … … 6634 6637 return 0; 6635 6638 } 6636 6639 6637 6640 // This makes Warp Portal fail if the cell is not empty 6638 6641 //if(skill_check_unit_range2(&sd->bl,wx,wy,skill_num,lv) > 0) { … … 6693 6696 return 0; //Nothing to remove, this unit is not overlapped. 6694 6697 6695 if (unit->val1 != unit->group->skill_id) 6698 if (unit->val1 != unit->group->skill_id) 6696 6699 { //Reset state 6697 6700 unit->val1 = unit->group->skill_id; 6698 6701 unit->val2 &= ~UF_ENSEMBLE; 6699 6702 } 6700 6703 6701 6704 return map_foreachincell(skill_dance_overlap_sub, unit->bl.m,unit->bl.x,unit->bl.y,BL_SKILL, unit,flag); 6702 6705 } … … 6782 6785 switch(skillid) 6783 6786 { 6787 //seems good. 6784 6788 case WL_HELLFIRE: // Warlock Hellfire [Brain] 6785 if(map_flag_vs(src->m)) target = BCT_ALL;6786 break;6789 if(map_flag_vs(src->m)) target = BCT_ALL; 6790 break; 6787 6791 case MG_SAFETYWALL: 6788 6792 val2=skilllv+1; … … 6860 6864 { //Use the previous limit (minus the elapsed time) [Skotlex] 6861 6865 limit = old_sg->limit - DIFF_TICK(gettick(), old_sg->tick); 6862 if (limit < 0) //This can happen... 6866 if (limit < 0) //This can happen... 6863 6867 limit = skill_get_time(skillid,skilllv); 6864 6868 } … … 7107 7111 return NULL; 7108 7112 } 7109 7113 7110 7114 7111 7115 if (skillid == NJ_TATAMIGAESHI) //Store number of tiles. … … 7116 7120 7117 7121 /*========================================== 7118 * 7122 * 7119 7123 *------------------------------------------*/ 7120 7124 static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7129 7133 nullpo_retr(0, src); 7130 7134 nullpo_retr(0, bl); 7131 7135 7132 7136 if(bl->prev==NULL || !src->alive || status_isdead(bl)) 7133 7137 return 0; … … 7139 7143 && !skill_get_inf2(sg->skill_id) == INF2_TRAP) //Traps work on top of land protector, magical or not [Brain] 7140 7144 return 0; //AoE skills are ineffective. [Skotlex] 7141 7145 7142 7146 sc = status_get_sc(bl); 7143 7147 7144 7148 if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE) 7145 7149 return 0; //Hidden characters are immune to AoE skills except Heaven's Drive. [Skotlex] 7146 7150 7147 7151 type = status_skill2sc(sg->skill_id); 7148 7152 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7240 7244 } 7241 7245 break; 7242 7246 7243 7247 case UNT_FOGWALL: 7244 7248 if (!sce) … … 7261 7265 // src->limit = DIFF_TICK(tick+700,sg->tick); 7262 7266 // break; 7263 7267 7264 7268 case UNT_MOONLIT: 7265 7269 //Knockback out of area if affected char isn't in Moonlit effect … … 7275 7279 7276 7280 /*========================================== 7277 * 7281 * 7278 7282 *------------------------------------------*/ 7279 7283 int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7302 7306 tsc = status_get_sc(bl); 7303 7307 tstatus = status_get_status_data(bl); 7304 if (sg->state.magic_power) //For magic power. 7308 if (sg->state.magic_power) //For magic power. 7305 7309 { 7306 7310 sc = status_get_sc(ss); … … 7331 7335 return 0; 7332 7336 ts->tick = tick+sg->interval; 7333 7337 7334 7338 if ((skillid==CR_GRANDCROSS || skillid==NPC_GRANDDARKNESS) && !battle_config.gx_allhit) 7335 7339 ts->tick += sg->interval*(map_count_oncell(bl->m,bl->x,bl->y,BL_CHAR)-1); … … 7382 7386 if (status_isimmune(bl)) 7383 7387 heal = 0; /* é»éè²ã«ãŒãïŒããŒã«éïŒïŒ */ 7384 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 7385 if(tsd) {7386 heal = heal * (100 - pc_checkskill(tsd,AD_PROFANE)*3)/100;7387 //Wont heal even if he got elemental armors [Brain]7388 if(pc_checkskill(tsd,NC_PHYLACTERY)) heal = sg->skill_lv;7389 }7390 7388 //Okay? 7389 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 7390 if(tsd) { 7391 heal = heal * (100 - pc_checkskill(tsd,AD_PROFANE)*3)/100; 7392 //Wont heal even if he got elemental armors [Brain] 7393 if(pc_checkskill(tsd,NC_PHYLACTERY)) heal = sg->skill_lv; 7394 } 7391 7395 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7392 7396 status_heal(bl, heal, 0, 0); … … 7399 7403 7400 7404 case UNT_EVILLAND: 7401 if (tstatus->race!=RC_UNDEAD && tstatus->race!=RC_DEMON) 7405 //Will heal demon and undead element monsters, but not players. 7406 if (bl->type != BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race!=RC_DEMON) 7402 7407 { //Damage enemies 7403 7408 if(battle_check_target(&src->bl,bl,BCT_ENEMY)>0) … … 7423 7428 7424 7429 case UNT_ATTACK_SKILLS: 7425 switch (sg->skill_id) 7430 switch (sg->skill_id) 7426 7431 { 7427 7432 case SG_SUN_WARM: //SG skills [Komurka] … … 7461 7466 break; 7462 7467 default: 7463 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 7468 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 7464 7469 } 7465 7470 break; … … 7485 7490 if (status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8)) 7486 7491 { 7487 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 7492 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 7488 7493 if (td) sec = DIFF_TICK(td->tick, tick); 7489 7494 map_moveblock(bl, src->bl.x, src->bl.y, tick); … … 7556 7561 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7557 7562 status_heal(bl, heal, 0, 0); 7558 break; 7563 break; 7559 7564 } 7560 7565 … … 7731 7736 status_change_end(bl,type,-1); 7732 7737 break; 7733 7738 7734 7739 case UNT_SPIDERWEB: 7735 7740 { … … 7759 7764 if (sc && !sc->count) 7760 7765 sc = NULL; 7761 7766 7762 7767 type = status_skill2sc(skill_id); 7763 7768 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7776 7781 case BD_ETERNALCHAOS: 7777 7782 case BD_DRUMBATTLEFIELD: 7778 case BD_RINGNIBELUNGEN: 7783 case BD_RINGNIBELUNGEN: 7779 7784 case BD_ROKISWEIL: 7780 7785 case BD_INTOABYSS: … … 7785 7790 //FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner, 7786 7791 //it only checks if you are doing the same ensemble. So if there's two chars doing an ensemble 7787 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 7792 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 7788 7793 //your own. Let's pray that scenario is pretty unlikely and noone will complain too much about it. 7789 7794 skill_stop_dancing(bl); … … 7800 7805 status_change_end(bl, type, -1); 7801 7806 break; 7802 7807 7803 7808 case BA_POEMBRAGI: 7804 7809 case BA_WHISTLE: … … 7807 7812 case DC_HUMMING: 7808 7813 case DC_DONTFORGETME: 7809 case DC_FORTUNEKISS: 7814 case DC_FORTUNEKISS: 7810 7815 case DC_SERVICEFORYOU: 7811 7816 if (sce) … … 7857 7862 7858 7863 nullpo_retr(0, group); 7859 7864 7860 7865 dissonance = skill_dance_switch(unit, 0); 7861 7866 … … 7942 7947 if ((skillid != PR_BENEDICTIO && *c >=1) || *c >=2) 7943 7948 return 0; //Partner found for ensembles, or the two companions for Benedictio. [Skotlex] 7944 7949 7945 7950 if (bl == src) 7946 7951 return 0; … … 7951 7956 if (tsd->sc.data[SC_SILENCE] || tsd->sc.opt1) 7952 7957 return 0; 7953 7958 7954 7959 switch(skillid) 7955 7960 { … … 8036 8041 8037 8042 /*========================================== 8038 * 8043 * 8039 8044 *------------------------------------------*/ 8040 8045 static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) … … 8059 8064 8060 8065 /*========================================== 8061 * Determines if a given skill should be made to consume ammo 8066 * Determines if a given skill should be made to consume ammo 8062 8067 * when used by the player. [Skotlex] 8063 8068 *------------------------------------------*/ … … 8098 8103 sd->skillitem = sd->skillitemlv = 0; 8099 8104 //Need to do arrow state check. 8100 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8105 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8101 8106 //Need to do Spiritball check. 8102 8107 sd->spiritball_old = sd->spiritball; … … 8108 8113 if (!sc->count) 8109 8114 sc = NULL; 8110 8115 8111 8116 if(pc_is90overweight(sd)) { 8112 8117 clif_skill_fail(sd,skill,9,0); … … 8132 8137 if (sd->menuskill_id == AM_PHARMACY && 8133 8138 (skill == AM_PHARMACY || skill == AC_MAKINGARROW || skill == BS_REPAIRWEAPON || 8134 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8139 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8135 8140 )) { 8136 8141 sd->skillitem = sd->skillitemlv = 0; … … 8356 8361 } 8357 8362 break; 8358 8363 8359 8364 case TK_READYCOUNTER: 8360 8365 case TK_READYDOWN: … … 8384 8389 status_change_end(&sd->bl, SC_COMBO, -1); 8385 8390 sd->skillid_old = sd->skilllv_old = 0; 8386 return 0; //Can't repeat previous combo skill. 8391 return 0; //Can't repeat previous combo skill. 8387 8392 } 8388 8393 break; 8389 } else 8394 } else 8390 8395 if(sc->data[SC_COMBO]->val1 == skill) 8391 8396 break; //Combo ready. … … 8446 8451 } 8447 8452 break; 8453 //Weird to me. 8448 8454 case AD_FAMILIAR: //Adept Familiar [Flavio] 8449 {8450 short familiar[1] ={ pc_readglobalreg(sd, "ADEPT_FAMILIAR") };8451 int maxcount = skill_get_maxcount(skill,lv);8452 int count = 0;8453 count = mob_countslave_class(&sd->bl, 1, familiar );8454 if( count >= maxcount )8455 8455 { 8456 clif_skill_fail(sd,skill,0,0); 8457 return 0; 8458 } 8459 } 8460 break; 8456 short familiar[1] ={ pc_readglobalreg(sd, "ADEPT_FAMILIAR") }; 8457 int maxcount = skill_get_maxcount(skill,lv); 8458 int count = 0; 8459 count = mob_countslave_class(&sd->bl, 1, familiar ); 8460 if( count >= maxcount ) 8461 { 8462 clif_skill_fail(sd,skill,0,0); 8463 return 0; 8464 } 8465 } 8466 break; 8461 8467 case NC_SKELETON: // Raise Skeleton [Brain] 8462 8468 case NC_ARCHER: // Raise Archer Skeleton … … 8466 8472 case NC_SHADOW: // Raise Shadow 8467 8473 case NC_WRAITH: // Raise Wraith 8468 {// corrigido o limite de spawns [Flavio] 8469 short summon1[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 8470 short summon2[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 8471 short summon3[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 8472 short summon4[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 8473 short summon5[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 8474 short summon6[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 8475 short summon7[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 8476 int maxcount = skill_get_maxcount(skill,lv); 8477 int count = 0; 8478 switch( skill ) 8479 { 8480 case NC_SKELETON: count = mob_countslave_class(&sd->bl, 5, summon1); break; 8481 case NC_ARCHER: count = mob_countslave_class(&sd->bl, 5, summon2); break; 8482 case NC_ZOMBIE: count = mob_countslave_class(&sd->bl, 5, summon3); break; 8483 case NC_MUMMY: count = mob_countslave_class(&sd->bl, 5, summon4); break; 8484 case NC_GHOST: count = mob_countslave_class(&sd->bl, 5, summon5); break; 8485 case NC_SHADOW: count = mob_countslave_class(&sd->bl, 5, summon6); break; 8486 case NC_WRAITH: count = mob_countslave_class(&sd->bl, 5, summon7); break; 8487 } 8488 if( count >= maxcount ) 8489 { 8490 clif_skill_fail(sd,skill,0,0); 8491 return 0; 8492 } 8493 } 8494 break; 8495 8474 {// corrigido o limite de spawns [Flavio] 8475 short summon1[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 8476 short summon2[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 8477 short summon3[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 8478 short summon4[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 8479 short summon5[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 8480 short summon6[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 8481 short summon7[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 8482 int maxcount = skill_get_maxcount(skill,lv); 8483 int count = 0; 8484 switch( skill ) 8485 { 8486 case NC_SKELETON: count = mob_countslave_class(&sd->bl, 5, summon1); break; 8487 case NC_ARCHER: count = mob_countslave_class(&sd->bl, 5, summon2); break; 8488 case NC_ZOMBIE: count = mob_countslave_class(&sd->bl, 5, summon3); break; 8489 case NC_MUMMY: count = mob_countslave_class(&sd->bl, 5, summon4); break; 8490 case NC_GHOST: count = mob_countslave_class(&sd->bl, 5, summon5); break; 8491 case NC_SHADOW: count = mob_countslave_class(&sd->bl, 5, summon6); break; 8492 case NC_WRAITH: count = mob_countslave_class(&sd->bl, 5, summon7); break; 8493 } 8494 if( count >= maxcount ) 8495 { 8496 clif_skill_fail(sd,skill,0,0); 8497 return 0; 8498 } 8499 } 8500 break; 8496 8501 case WZ_FIREPILLAR: // celest 8497 8502 if (lv <= 5) // no gems required at level 1-5 … … 8502 8507 if(!(sc && sc->data[SC_SMA])) 8503 8508 return 0; 8504 break; 8509 break; 8505 8510 8506 8511 case HT_POWER: … … 8554 8559 clif_skill_fail(sd,skill,0,0); 8555 8560 return 0; 8556 } 8561 } 8557 8562 } 8558 8563 } … … 8606 8611 //Only invoke on skill begin cast (instant cast skill). [Kevin] 8607 8612 if(sp>0 && !type) 8608 { 8613 { 8609 8614 if (status->sp < (unsigned int)sp) 8610 8615 clif_skill_fail(sd,skill,1,0); … … 8632 8637 } 8633 8638 break; 8634 8639 8635 8640 case NJ_ISSEN: 8636 8641 if (status->hp < 2) { … … 8644 8649 } 8645 8650 break; 8646 8651 8647 8652 case NJ_ZENYNAGE: 8648 8653 if(sd->status.zeny < zeny) { … … 8686 8691 return 0; 8687 8692 } 8688 8693 8689 8694 if(weapon && !pc_check_weapontype(sd,weapon)) { 8690 8695 clif_skill_fail(sd,skill,6,0); … … 8782 8787 if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill) 8783 8788 sd->ud.canmove_tick = gettick(); //When using a combo, cancel the can't move delay to enable the skill. [Skotlex] 8784 8789 8785 8790 if (!unit_can_move(&sd->bl)) { 8786 8791 clif_skill_fail(sd,skill,0,0); … … 8873 8878 int skill_castfix (struct block_list *bl, int skill_id, int skill_lv) 8874 8879 { 8875 int time = skill_get_cast(skill_id, skill_lv); 8880 int time = skill_get_cast(skill_id, skill_lv); 8876 8881 struct map_session_data *sd; 8877 8882 8878 8883 nullpo_retr(0, bl); 8879 8884 sd = BL_CAST(BL_PC, bl); 8880 8885 8881 8886 // calculate base cast time (reduced by dex) 8882 8887 if (!(skill_get_castnodex(skill_id, skill_lv)&1)) { … … 8926 8931 status_change_end(bl, SC_SUFFRAGIUM, -1); 8927 8932 } 8928 if (sc->data[SC_DECREPIFY]) // Necro Decrepify [Brain] 8929 if (sc->data[SC_DECREPIFY]->val2>=3)8930 time += time * 25/100; //+25% cast time8931 if (sc->data[SC_CURSETONGUES]) { //Warlock Curse of Tongues [Brain]8932 time += time * sc->data[SC_CURSETONGUES]->val2 / 100;8933 status_change_end(bl, SC_CURSETONGUES, -1);8934 }8935 8933 //Curse skills... 8934 if (sc->data[SC_DECREPIFY]) // Necro Decrepify [Brain] 8935 if(sc->data[SC_DECREPIFY]->val2>=3) 8936 time += time * 25/100; //+25% cast time 8937 if (sc->data[SC_CURSETONGUES]) { //Warlock Curse of Tongues [Brain] 8938 time += time * sc->data[SC_CURSETONGUES]->val2 / 100; 8939 status_change_end(bl, SC_CURSETONGUES, -1); 8940 } 8936 8941 if (sc->data[SC_MEMORIZE]) { 8937 8942 time>>=1; … … 8952 8957 int delaynodex = skill_get_delaynodex(skill_id, skill_lv); 8953 8958 int time = skill_get_delay(skill_id, skill_lv); 8954 8959 8955 8960 nullpo_retr(0, bl); 8956 8961 … … 8959 8964 8960 8965 if (bl->type&battle_config.no_skill_delay) 8961 return battle_config.min_skill_delay_limit; 8966 return battle_config.min_skill_delay_limit; 8962 8967 8963 8968 if (time < 0) … … 8976 8981 default: 8977 8982 if (battle_config.delay_dependon_dex && !(delaynodex&1)) 8978 { // if skill delay is allowed to be reduced by dex 8983 { // if skill delay is allowed to be reduced by dex 8979 8984 int scale = battle_config.castrate_dex_scale - status_get_dex(bl); 8980 8985 if (scale > 0) … … 8984 8989 } 8985 8990 if (battle_config.delay_dependon_agi && !(delaynodex&1)) 8986 { // if skill delay is allowed to be reduced by agi 8991 { // if skill delay is allowed to be reduced by agi 8987 8992 int scale = battle_config.castrate_dex_scale - status_get_agi(bl); 8988 8993 if (scale > 0) … … 9028 9033 9029 9034 /*========================================= 9030 * 9035 * 9031 9036 *-----------------------------------------*/ 9032 9037 void skill_brandishspear_first (struct square *tc, int dir, int x, int y) … … 9552 9557 return count; 9553 9558 } 9554 9559 9555 9560 /*========================================== 9556 9561 * Returns the first element field found [Skotlex] … … 9706 9711 9707 9712 /*========================================== 9708 * 9713 * 9709 9714 *------------------------------------------*/ 9710 9715 int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap) … … 9739 9744 unit = (struct skill_unit *)src; 9740 9745 tick = va_arg(ap,int); 9741 9746 9742 9747 nullpo_retr(0, sg = unit->group); 9743 9748 nullpo_retr(0, ss = map_id2bl(sg->src_id)); … … 9749 9754 case UNT_SHOCKWAVE: 9750 9755 case UNT_SANDMAN: 9751 case UNT_FLASHER: 9756 case UNT_FLASHER: 9752 9757 skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); 9753 9758 break; … … 9795 9800 if (type != scs[i] && sc->data[scs[i]]) 9796 9801 status_change_end(bl, scs[i], -1); 9797 9802 9798 9803 return 0; 9799 9804 } … … 9813 9818 wall = false; 9814 9819 } 9815 9820 9816 9821 if( sce ) 9817 9822 { … … 9856 9861 if(!sc->count || !(sce=sc->data[SC_DANCING])) 9857 9862 return; 9858 9863 9859 9864 group = (struct skill_unit_group *)sce->val2; 9860 9865 sce->val2 = 0; 9861 9866 9862 9867 if (sce->val4) 9863 9868 { … … 9993 9998 nullpo_retr(NULL, src); 9994 9999 nullpo_retr(NULL, ud); 9995 10000 9996 10001 // find a free spot to store the new unit group 9997 10002 ARR_FIND( 0, MAX_SKILLUNITGROUP, i, ud->skillunit[i] == NULL ); … … 10053 10058 10054 10059 if (!src) src=map_id2bl(group->src_id); 10055 ud = unit_bl2ud(src); 10060 ud = unit_bl2ud(src); 10056 10061 if(!src || !ud) { 10057 10062 ShowError("skill_delunitgroup: Group's source not found! (src_id: %d skill_id: %d)\n", group->src_id, group->skill_id); 10058 return 0; 10063 return 0; 10059 10064 } 10060 10065 if (skill_get_unit_flag(group->skill_id)&(UF_DANCE|UF_SONG|UF_ENSEMBLE)) … … 10152 10157 if (group->interval==-1) 10153 10158 return NULL; 10154 10159 10155 10160 ud = unit_bl2ud(bl); 10156 10161 if (!ud) return NULL; … … 10394 10399 int skill_id; 10395 10400 int i; 10396 10401 10397 10402 nullpo_retr(0, group); 10398 10403 10399 10404 if( !unit->alive || target->prev == NULL ) 10400 10405 return 0; … … 10475 10480 //cells do not get deleted within them. [Skotlex] 10476 10481 if( dissonance ) skill_dance_switch(unit, 1); 10477 10482 10478 10483 if( flag&4 ) 10479 10484 skill_unit_onleft(skill_id,target,tick); … … 10502 10507 memset(skill_unit_temp, 0, sizeof(skill_unit_temp)); 10503 10508 } 10504 10509 10505 10510 map_foreachincell(skill_unit_move_sub,bl->m,bl->x,bl->y,BL_SKILL,bl,tick,flag); 10506 10511 … … 10680 10685 if (qty < 1) 10681 10686 qty = 1; 10682 10687 10683 10688 if (!skill_id) //A skill can be specified for some override cases. 10684 10689 skill_id = skill_produce_db[idx].req_skill; 10685 10690 10686 10691 slot[0]=slot1; 10687 10692 slot[1]=slot2; … … 10761 10766 case AM_TWILIGHT2: 10762 10767 case AM_TWILIGHT3: 10763 make_per = pc_checkskill(sd,AM_LEARNINGPOTION)* 10010768 make_per = pc_checkskill(sd,AM_LEARNINGPOTION)*50 10764 10769 + pc_checkskill(sd,AM_PHARMACY)*300 + sd->status.job_level*20 10765 + status->int_*5 + status->dex*10+status->luk*10; 10770 + (status->int_/2)*10 + status->dex*10+status->luk*10; 10771 if(merc_is_hom_active(sd->hd)) {//Player got a homun 10772 int skill; 10773 if((skill=merc_hom_checkskill(sd->hd,HVAN_INSTRUCT)) > 0) //His homun is a vanil with instruction change 10774 make_per += skill*100; //+1% bonus per level 10775 } 10766 10776 switch(nameid){ 10767 10777 case 501: // Red Potion 10768 10778 case 503: // Yellow Potion 10769 10779 case 504: // White Potion 10770 case 605: // Anodyne 10771 case 606: // Aloevera 10772 make_per += 2000; 10780 make_per += (1+rand()%100)*10 + 2000; 10773 10781 break; 10774 case 505: // Blue Potion 10775 make_per -= 500; 10776 break; 10777 case 545: // Condensed Red Potion 10778 case 546: // Condensed Yellow Potion 10779 case 547: // Condensed White Potion 10780 make_per -= 1000; 10781 break; 10782 case 970: // Alcohol 10783 make_per += 1000; 10784 break; 10785 case 7139: // Glistening Coat 10786 make_per -= 1000; 10782 case 970: // Alcohol 10783 make_per += (1+rand()%100)*10 + 1000; 10787 10784 break; 10788 10785 case 7135: // Bottle Grenade … … 10790 10787 case 7137: // Plant Bottle 10791 10788 case 7138: // Marine Sphere Bottle 10789 make_per += (1+rand()%100)*10; 10790 break; 10791 case 546: // Condensed Yellow Potion 10792 make_per -= (1+rand()%50)*10; 10793 break; 10794 case 547: // Condensed White Potion 10795 case 7139: // Glistening Coat 10796 make_per -= (1+rand()%100)*10; 10797 break; 10798 //Common items, recieve no bonus or penalty, listed just because they are commonly produced 10799 case 505: // Blue Potion 10800 case 545: // Condensed Red Potion 10801 case 605: // Anodyne 10802 case 606: // Aloevera 10792 10803 default: 10793 10804 break; … … 10827 10838 // - Baby Class Penalty = 80% (from adult's chance) ----// 10828 10839 if (sd->class_&JOBL_BABY) //if it's a Baby Class 10829 make_per = (make_per * 80) / 100; //Lupus10840 make_per = (make_per * 70) / 100; //Baby penalty is 30% 10830 10841 10831 10842 if(make_per < 1) make_per = 1; 10832 10843 10833 10844 10834 10845 if(rand()%10000 < make_per || qty > 1){ //Success, or crafting multiple items. 10835 10846 struct item tmp_item; … … 10902 10913 skill_id != AM_TWILIGHT2 && 10903 10914 skill_id != AM_TWILIGHT3) 10904 continue; 10915 continue; 10905 10916 //Add fame as needed. 10906 10917 switch(++sd->potion_success_counter) { … … 10955 10966 } 10956 10967 } 10957 //Failure 10968 //Failure 10958 10969 // if(log_config.produce) 10959 10970 // log_produce(sd,nameid,slot1,slot2,slot3,0); … … 11041 11052 return 0; 11042 11053 if (sd) sd->blockskill[data] = 0; 11043 11054 11044 11055 return 1; 11045 11056 } … … 11068 11079 return 0; 11069 11080 if (hd) hd->blockskill[data] = 0; 11070 11081 11071 11082 return 1; 11072 11083 } … … 11075 11086 { 11076 11087 nullpo_retr (-1, hd); 11077 11088 11078 11089 skillid = skill_get_index(skillid); 11079 11090 if (skillid == 0) … … 11135 11146 if ((val[j]-val[j-step]) != diff) 11136 11147 break; 11137 11148 11138 11149 if (j>=step) //No match, try next step. 11139 11150 continue; 11140 11151 11141 11152 for(; i < MAX_SKILL_LEVEL; i++) 11142 11153 { //Apply linear increase … … 11335 11346 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11336 11347 } else { 11337 int dx[] = { 1, 1 ,0, 0,-1}; 11338 int dy[] = { 1, 0, 0,-1,-1}; 11348 int dx[] = { 1, 1 ,0, 0,-1}; 11349 int dy[] = { 1, 0, 0,-1,-1}; 11339 11350 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11340 11351 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11366 11377 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11367 11378 } else { 11368 int dx[] = { 2, 1 ,0,-1,-2}; 11369 int dy[] = { 2, 1, 0,-1,-2}; 11379 int dx[] = { 2, 1 ,0,-1,-2}; 11380 int dy[] = { 2, 1, 0,-1,-2}; 11370 11381 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11371 11382 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11396 11407 * skill_nocast_db.txt 11397 11408 * skill_unit_db.txt 11398 * produce_db.txt 11409 * produce_db.txt 11399 11410 * create_arrow_db.txt 11400 11411 * abra_db.txt … … 11465 11476 skill_split_atoi(split[5],skill_db[i].sp_rate); 11466 11477 skill_split_atoi(split[6],skill_db[i].zeny); 11467 11478 11468 11479 //FIXME: document this 11469 11480 p = split[7]; … … 11483 11494 p++; 11484 11495 } 11485 11496 11486 11497 //FIXME: document this 11487 11498 p = split[8]; … … 11517 11528 else if( strcmpi(split[10],"water")==0 ) skill_db[i].state = ST_WATER; 11518 11529 else skill_db[i].state = ST_NONE; 11519 11530 11520 11531 skill_split_atoi(split[11],skill_db[i].spiritball); 11521 11532 for( j = 0; j < 10; j++ ) { … … 11533 11544 if( !i ) // invalid skill id 11534 11545 return false; 11535 11546 11536 11547 skill_split_atoi(split[1],skill_db[i].cast); 11537 11548 skill_split_atoi(split[2],skill_db[i].delay); … … 11549 11560 if( !i ) // invalid skill id 11550 11561 return false; 11551 11562 11552 11563 skill_split_atoi(split[1],skill_db[i].castnodex); 11553 11564 if( split[2] ) // optional column … … 11575 11586 if( !i ) // invalid skill id 11576 11587 return false; 11577 11588 11578 11589 skill_db[i].unit_id[0] = strtol(split[1],NULL,16); 11579 11590 skill_db[i].unit_id[1] = strtol(split[2],NULL,16); … … 11621 11632 skill_produce_db[current].req_skill = atoi(split[2]); 11622 11633 skill_produce_db[current].req_skill_lv = atoi(split[3]); 11623 11634 11624 11635 for( x = 4, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_PRODUCE_RESOURCE; x += 2, y++ ) 11625 11636 { … … 11640 11651 11641 11652 skill_arrow_db[current].nameid = i; 11642 11653 11643 11654 for( x = 1, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_ARROW_RESOURCE; x += 2, y++ ) 11644 11655 { … … 11679 11690 memset(skill_arrow_db,0,sizeof(skill_arrow_db)); 11680 11691 memset(skill_abra_db,0,sizeof(skill_abra_db)); 11681 11692 11682 11693 // load skill databases 11683 11694 safestrncpy(skill_db[0].name, "UNKNOWN_SKILL", sizeof(skill_db[0].name)); … … 11707 11718 skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0); 11708 11719 skill_readdb(); 11709 11720 11710 11721 skill_unit_ers = ers_new(sizeof(struct skill_unit_group)); 11711 11722 skill_timer_ers = ers_new(sizeof(struct skill_timerskill)); 11712 11723 11713 11724 add_timer_func_list(skill_unit_timer,"skill_unit_timer"); 11714 11725 add_timer_func_list(skill_castend_id,"skill_castend_id"); … … 11716 11727 add_timer_func_list(skill_timerskill,"skill_timerskill"); 11717 11728 add_timer_func_list(skill_blockpc_end, "skill_blockpc_end"); 11718 11729 11719 11730 add_timer_interval(gettick()+SKILLUNITTIMER_INTERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INTERVAL); 11720 11731 … … 11729 11740 return 0; 11730 11741 } 11731 11742 //Why is this after the cleanup code? 11732 11743 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount)// ITEM GIVER [Brain] 11733 11744 { … … 11735 11746 11736 11747 nullpo_retr(1, src); 11737 nullpo_retr(1, bl); 11748 nullpo_retr(1, bl); 11738 11749 11739 11750 if (src->m != bl->m) 11740 return 1;11751 return 1; 11741 11752 if (bl->prev == NULL) 11742 return 1;11753 return 1; 11743 11754 if (src->type == BL_PC) 11744 sd = (struct map_session_data *)src;11755 sd = (struct map_session_data *)src; 11745 11756 if (bl->type == BL_PC) 11746 tsd = (struct map_session_data *)bl;11757 tsd = (struct map_session_data *)bl; 11747 11758 if (status_isdead(bl)) 11748 return 1;11759 return 1; 11749 11760 11750 11761 int eflag; 11751 11762 struct item item_tmp; 11752 11763 struct block_list tbl; 11753 11764 11754 11765 memset(&item_tmp,0,sizeof(item_tmp)); 11755 11766 memset(&tbl,0,sizeof(tbl)); … … 11762 11773 eflag = pc_additem(sd,&item_tmp,amount); 11763 11774 if(eflag) { 11764 clif_additem(sd,0,0,eflag);11765 map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0);11775 clif_additem(sd,0,0,eflag); 11776 map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); 11766 11777 } 11767 11778 return 0; -
src/map/skill.h
r22 r24 320 320 321 321 int skill_arrow_create( struct map_session_data *sd,int nameid); 322 323 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount); // Item giver func [Brain]324 325 322 326 323 // mobXLÌœß … … 959 956 960 957 ALL_INCCARRY = 681, 958 959 //most skills are irrelevant, will block comment them out. 960 /*+ GM_SANDMAN = 688, 961 + CASH_BLESSING, 962 + CASH_INCAGI, 963 + CASH_ASSUMPTIO, 964 + ALL_CATCRY,*/ 965 //Up there is irrelevant. 966 961 967 AD_PWBLIND = 700, // Custom Skills [Brainstorm] 962 968 AD_PWFEAR, … … 987 993 NC_DRAINLIFE, 988 994 NC_DEATHPACT, 989 995 //Still no idea why that is there. 990 996 ALL_ATFIELD, //GM SKILL 991 997 992 WL_CURSETONGUES , //732998 WL_CURSETONGUES =732, //732 993 999 WL_CURSEDOOM, 994 1000 WL_CURSEEXHAUST, … … 1009 1015 WL_CORRUPTION, //749 1010 1016 1017 //Irrelevant 1018 /*+ TD_FISHING = 750, 1019 + TD_MINING, 1020 + TD_HERBALISM, 1021 + TD_LEATHERWORK, 1022 + TD_TAILORING, 1023 + TD_BLACKSMITHING, 1024 + TD_SCRIBESCROLLA, 1025 + TD_SCRIBESCROLLB, 1026 + TD_SCRIBESCROLLC, 1027 + TD_SHIELD, 1028 + TD_WOODCUTTING,*/ 1029 // STOP! Cant use 800 (homun skills) NOR 900 (guild skills) 1011 1030 1012 1031 KN_CHARGEATK = 1001, -
src/map/status.c
r22 r24 130 130 set_sc( NPC_SILENCEATTACK , SC_SILENCE , SI_BLANK , SCB_NONE ); 131 131 set_sc( DC_WINKCHARM , SC_CONFUSION , SI_BLANK , SCB_NONE ); 132 set_sc( AD_PWFEAR , SC_FEAR , SI_HALLUCINATION , SCB_SPEED ); //Fear Status by [Brainstorm] 132 //the visual effect is HALLUCINATION?! 133 set_sc( AD_PWFEAR , SC_FEAR , SI_HALLUCINATION , SCB_SPEED ); //Fear Status by [Brainstorm] 133 134 set_sc( NPC_BLINDATTACK , SC_BLIND , SI_BLANK , SCB_HIT|SCB_FLEE ); 134 135 set_sc( LK_HEADCRUSH , SC_BLEEDING , SI_BLEEDING , SCB_REGEN ); … … 408 409 set_sc( GD_BATTLEORDER , SC_BATTLEORDERS , SI_BLANK , SCB_STR|SCB_INT|SCB_DEX ); 409 410 set_sc( GD_REGENERATION , SC_REGENERATION , SI_BLANK , SCB_REGEN ); 410 411 //Are we sure about this? 411 412 // Custom Jobs Skills [Brain] 412 add_sc( AD_PWBLIND , SC_BLIND); 413 add_sc( AD_PWFEAR , SC_FEAR); 414 set_sc( AD_LUST , SC_LUST , SI_JOINTBEAT , SCB_ASPD|SCB_BATK|SCB_WATK|SCB_REGEN); 415 416 set_sc( NC_DECREPIFY , SC_DECREPIFY , SI_BLEEDING , SCB_SPEED|SCB_BATK|SCB_WATK|SCB_DEF2|SCB_MDEF2); 417 set_sc( NC_DARKMOON , SC_DARKMOON , SI_MOON_COMFORT , SCB_FLEE|SCB_HIT); 418 add_sc( NC_DARKMOON , SC_BLIND); 419 set_sc( NC_REQUIEM , SC_REQUIEM , SI_KAIZEL , SCB_BATK|SCB_WATK); 420 add_sc( NC_GHOULTOUCH , SC_POISON); 421 set_sc( NC_PWSUFFER , SC_SUFFER , SI_BLANK , SCB_DEF|SCB_DEF2); 422 set_sc( NC_DEATHPACT , SC_DEATHPACT , SI_BIOMOBTRICKDEAD , SCB_DEF_ELE|SCB_REGEN); 413 add_sc( AD_PWBLIND , SC_BLIND); 414 add_sc( AD_PWFEAR , SC_FEAR); 415 set_sc( AD_LUST , SC_LUST , SI_JOINTBEAT , SCB_ASPD|SCB_BATK|SCB_WATK|SCB_REGEN); 416 set_sc( NC_DECREPIFY , SC_DECREPIFY , SI_BLEEDING , SCB_SPEED|SCB_BATK|SCB_WATK|SCB_DEF2|SCB_MDEF2); 417 set_sc( NC_DARKMOON , SC_DARKMOON , SI_MOON_COMFORT , SCB_FLEE|SCB_HIT); 418 add_sc( NC_DARKMOON , SC_BLIND); 419 set_sc( NC_REQUIEM , SC_REQUIEM , SI_KAIZEL , SCB_BATK|SCB_WATK); 420 add_sc( NC_GHOULTOUCH , SC_POISON); 421 set_sc( NC_PWSUFFER , SC_SUFFER , SI_BLANK , SCB_DEF|SCB_DEF2); 422 set_sc( NC_DEATHPACT , SC_DEATHPACT , SI_BIOMOBTRICKDEAD , SCB_DEF_ELE|SCB_REGEN); 423 423 424 set_sc( WL_SEARING , SC_SEARING , SI_BLANK, SCB_NONE);425 set_sc( WL_IMMOLATE , SC_IMMOLATE , SI_BLANK, SCB_NONE);426 add_sc( WL_SHADOWBURN 427 set_sc( WL_PWAGONY , SC_AGONY , SI_BLANK, SCB_MDEF|SCB_MDEF2);428 set_sc( WL_CURSETONGUES , SC_CURSETONGUES , SI_SLOWCAST, SCB_NONE);429 set_sc( WL_CURSEDOOM , SC_DOOM , SI_BLANK, SCB_NONE);430 set_sc( WL_CURSEWEAKNESS , SC_CURSEWEAKNESS , SI_STRIPWEAPON, SCB_BATK|SCB_WATK);431 set_sc( WL_CURSEEXHAUST , SC_CURSEEXHAUST, SI_CRITICALWOUND , SCB_DEF|SCB_MDEF);432 add_sc( WL_HOWLOFTERROR 433 set_sc( WL_HOWLOFPAIN , SC_PROVOKE , SI_PROVOKE, SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK);434 set_sc( WL_OVERWHELMING , SC_OVERWHELMING , SI_ENERGYCOAT, SCB_DEF|SCB_MDEF|SCB_MATK|SCB_REGEN|SCB_DEF_ELE);435 436 set_sc( ALL_ATFIELD , SC_ATFIELD , SI_UTSUSEMI,SCB_NONE);424 set_sc( WL_SEARING , SC_SEARING , SI_BLANK , SCB_NONE); 425 set_sc( WL_IMMOLATE , SC_IMMOLATE , SI_BLANK , SCB_NONE); 426 add_sc( WL_SHADOWBURN , SC_STUN); 427 set_sc( WL_PWAGONY , SC_AGONY , SI_BLANK , SCB_MDEF|SCB_MDEF2); 428 set_sc( WL_CURSETONGUES , SC_CURSETONGUES , SI_SLOWCAST , SCB_NONE); 429 set_sc( WL_CURSEDOOM , SC_DOOM , SI_BLANK , SCB_NONE); 430 set_sc( WL_CURSEWEAKNESS , SC_CURSEWEAKNESS , SI_STRIPWEAPON , SCB_BATK|SCB_WATK); 431 set_sc( WL_CURSEEXHAUST , SC_CURSEEXHAUST , SI_CRITICALWOUND , SCB_DEF|SCB_MDEF); 432 add_sc( WL_HOWLOFTERROR , SC_FEAR); 433 set_sc( WL_HOWLOFPAIN , SC_PROVOKE , SI_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK); 434 set_sc( WL_OVERWHELMING , SC_OVERWHELMING , SI_ENERGYCOAT , SCB_DEF|SCB_MDEF|SCB_MATK|SCB_REGEN|SCB_DEF_ELE); 435 //WTF IS THIS DOING HERE AT ALL?! 436 set_sc( ALL_ATFIELD , SC_ATFIELD , SI_UTSUSEMI ,SCB_NONE); 437 437 438 438 … … 675 675 status_change_end(target,SC_WINKCHARM,-1); 676 676 status_change_end(target,SC_CONFUSION,-1); 677 //error... definately... 678 if (sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 679 status_change_end(target, SC_FEAR, -1); 677 /*+ if (sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 678 + status_change_end(target, SC_FEAR, -1);*/ 679 //Modifying the above... 680 status_change_end(target,SC_FEAR,-1); 680 681 status_change_end(target,SC_TRICKDEAD,-1); 681 682 status_change_end(target,SC_HIDING,-1); … … 689 690 status_change_end(target, SC_ENDURE, -1); 690 691 } 692 //May also work here... MAYBE 693 // if (sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 694 // status_change_end(target, SC_FEAR, -1); 691 695 if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF) 692 696 { … … 1226 1230 } 1227 1231 1228 void status_calc_bl(struct block_list *bl, unsigned long flag);1229 1230 1232 // Basic ASPD value 1231 1233 int status_base_amotion_pc(struct map_session_data* sd, struct status_data* status) … … 1372 1374 if (md->master_id && md->special_state.ai>1) 1373 1375 flag|=16; 1374 1376 // a flag o_O 1375 1377 if (md->master_id && md->special_state.ai) 1376 flag|=32; //Adept/Necro/Warlock Summon Stats Bonus [Brainstorm] 1377 1378 1378 flag|=32; //Adept/Necro/Warlock Summon Stats Bonus [Brainstorm] 1379 1379 if (!flag) 1380 1380 { //No special status required. … … 1493 1493 status->aspd_rate -= 100*md->guardian_data->guardup_lv; 1494 1494 } 1495 //Gentlemen, prepare to error your ass off! =O Unless I fixed that thing wayyyy up thar ^ 1495 1496 //Summon Bonus from Skills [Brainstorm] 1496 1497 if(flag&32) 1497 1498 { 1498 mbl = map_id2bl(md->master_id);1499 if(mbl)1500 {1501 struct unit_data *ud = unit_bl2ud(mbl);1502 //Remove special AI when this is used by regular mobs.1503 if (mbl->type == BL_MOB && !((TBL_MOB*)mbl)->special_state.ai)1504 md->special_state.ai = 0;1505 1506 int master_lv = status_get_lv(mbl);1507 int skill_mastery = pc_checkskill((TBL_PC*)mbl,AD_SUMMONS);1508 int undead_mastery = pc_checkskill((TBL_PC*)mbl,NC_UNDEAD);1499 mbl = map_id2bl(md->master_id); //WTF?! Your mom! It's there you liar compiling bastard! 1500 if(mbl) 1501 { 1502 struct unit_data *ud = unit_bl2ud(mbl); 1503 //Remove special AI when this is used by regular mobs. 1504 if (mbl->type == BL_MOB && !((TBL_MOB*)mbl)->special_state.ai) 1505 md->special_state.ai = 0; 1506 1507 int master_lv = status_get_lv(mbl); 1508 int skill_mastery = pc_checkskill((TBL_PC*)mbl,AD_SUMMONS); 1509 int undead_mastery = pc_checkskill((TBL_PC*)mbl,NC_UNDEAD); 1509 1510 1510 if (ud->skillid == AD_FAMILIAR) 1511 { 1512 status->max_hp += (skill_mastery*10) + (master_lv*10); 1513 status->str += (master_lv) + (skill_mastery); 1514 status->dex += (master_lv) + (skill_mastery); 1515 status->agi += (master_lv) + (skill_mastery); 1516 status->int_ += (master_lv) + (skill_mastery); 1517 status->vit += (master_lv) + (skill_mastery); 1518 status->luk += (master_lv) + (skill_mastery); 1519 status->rhw.atk += (skill_mastery*3) 1520 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1521 status->rhw.atk2 += (skill_mastery*3) 1522 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1523 status->speed -= skill_mastery; 1524 status->def += (master_lv)/10 + (skill_mastery); 1525 status->mdef += (master_lv)/10 + (skill_mastery); 1526 //These are not automatically recalculated 1527 status->hit += (master_lv*2) + (skill_mastery); 1528 status->flee += (master_lv*2) + (skill_mastery); 1529 status->def2 += (master_lv) + (skill_mastery); 1530 status->mdef2 += (master_lv) + (skill_mastery); 1531 } 1532 else if(status->race==RC_UNDEAD) 1533 { 1534 status->max_hp += (undead_mastery*10) + (master_lv*2); 1535 status->str += (undead_mastery*3) + (skill_mastery); 1536 status->dex += (undead_mastery*3) + (skill_mastery); 1537 status->agi += (undead_mastery*3) + (skill_mastery); 1538 status->int_ += (undead_mastery*3) + (skill_mastery); 1539 status->vit += (undead_mastery*3) + (skill_mastery); 1540 status->luk += (undead_mastery*3) + (skill_mastery); 1541 status->rhw.atk += (undead_mastery*3) + (skill_mastery*3) 1542 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1543 status->rhw.atk2 += (undead_mastery*3) + (skill_mastery*3) 1544 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1545 status->speed -= undead_mastery; 1546 status->def += undead_mastery; 1547 status->mdef += undead_mastery; 1548 //These are not automatically recalculated 1549 status->hit += (undead_mastery*3) + (skill_mastery); 1550 status->flee += (undead_mastery*3) + (skill_mastery); 1551 status->def2 += (undead_mastery*3) + (skill_mastery); 1552 status->mdef2 += (undead_mastery*3) + (skill_mastery); 1553 } 1554 } 1555 else ShowError("status_calc_mob: Monster summoned without a master at %s\n", map[md->bl.m].name); 1556 } 1557 1558 1511 if (ud->skillid == AD_FAMILIAR) 1512 { 1513 status->max_hp += (skill_mastery*10) + (master_lv*10); 1514 status->str += (master_lv) + (skill_mastery); 1515 status->dex += (master_lv) + (skill_mastery); 1516 status->agi += (master_lv) + (skill_mastery); 1517 status->int_ += (master_lv) + (skill_mastery); 1518 status->vit += (master_lv) + (skill_mastery); 1519 status->luk += (master_lv) + (skill_mastery); 1520 status->rhw.atk += (skill_mastery*3) 1521 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1522 status->rhw.atk2 += (skill_mastery*3) 1523 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1524 status->speed -= skill_mastery; 1525 status->def += (master_lv)/10 + (skill_mastery); 1526 status->mdef += (master_lv)/10 + (skill_mastery); 1527 //These are not automatically recalculated 1528 status->hit += (master_lv*2) + (skill_mastery); 1529 status->flee += (master_lv*2) + (skill_mastery); 1530 status->def2 += (master_lv) + (skill_mastery); 1531 status->mdef2 += (master_lv) + (skill_mastery); 1532 } 1533 else if(status->race==RC_UNDEAD) 1534 { 1535 status->max_hp += (undead_mastery*10) + (master_lv*2); 1536 status->str += (undead_mastery*3) + (skill_mastery); 1537 status->dex += (undead_mastery*3) + (skill_mastery); 1538 status->agi += (undead_mastery*3) + (skill_mastery); 1539 status->int_ += (undead_mastery*3) + (skill_mastery); 1540 status->vit += (undead_mastery*3) + (skill_mastery); 1541 status->luk += (undead_mastery*3) + (skill_mastery); 1542 status->rhw.atk += (undead_mastery*3) + (skill_mastery*3) 1543 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1544 status->rhw.atk2 += (undead_mastery*3) + (skill_mastery*3) 1545 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1546 status->speed -= undead_mastery; 1547 status->def += undead_mastery; 1548 status->mdef += undead_mastery; 1549 //These are not automatically recalculated 1550 status->hit += (undead_mastery*3) + (skill_mastery); 1551 status->flee += (undead_mastery*3) + (skill_mastery); 1552 status->def2 += (undead_mastery*3) + (skill_mastery); 1553 status->mdef2 += (undead_mastery*3) + (skill_mastery); 1554 } 1555 } 1556 else ShowError("status_calc_mob: Monster summoned without a master at %s\n", map[md->bl.m].name); 1557 } 1559 1558 //Initial battle status 1560 1559 if (!first) … … 1745 1744 sd->delayrate=100; 1746 1745 sd->dsprate=100; 1747 sd->speed_rate = 100;1748 1746 sd->hprecov_rate = 100; 1749 1747 sd->sprecov_rate = 100; … … 1804 1802 status->aspd_rate = 1000; 1805 1803 status->ele_lv = 1; 1804 // status->race = RC_DEMIHUMAN; 1806 1805 status->race = RC_DEMIHUMAN;// This define players default race to DEMIHUMAN [Brain] 1807 1806 if(pc_checkskill(sd,NC_PHYLACTERY)>0) status->def_ele = ELE_UNDEAD; //Phylactery turns you UNDEAD 1 instead of NEUTRAL 1807 1808 1808 1809 1809 //zero up structures... … … 1860 1860 + sizeof(sd->crit_atk_rate) 1861 1861 + sizeof(sd->classchange) 1862 + sizeof(sd->speed_rate) 1862 1863 + sizeof(sd->speed_add_rate) 1863 1864 + sizeof(sd->aspd_add) … … 2042 2043 sd->perfect_hit += sd->perfect_hit_add; 2043 2044 sd->splash_range += sd->splash_add_range; 2044 if(sd->speed_add_rate)2045 sd->speed_rate += sd->speed_add_rate;2046 2045 2047 2046 // Damage modifiers from weapon type … … 2096 2095 status->dex += skill; 2097 2096 if((skill=pc_checkskill(sd,WL_DEMONOLOGY))>0) //Warlock Demonology [Brain] 2098 status->str += skill/2; //+1 str per 2 skill points 2099 2097 status->str += skill/2; //+1 str per 2 skill points 2100 2098 2101 2099 // Bonuses from cards and equipment as well as base stat, remember to avoid overflows. … … 2136 2134 status->max_hp += skill*200; 2137 2135 if((skill=pc_checkskill(sd,AD_PROFANE))>0) // Adept Profane Soul [Brain] 2138 status->max_hp += status->max_hp * (skill*3)/100; 2139 2136 status->max_hp += status->max_hp * (skill*3)/100; 2140 2137 2141 2138 // Apply relative modifiers from equipment … … 2168 2165 status->max_sp += status->max_sp * 2*skill/100; 2169 2166 if((skill=pc_checkskill(sd,AD_PROFANE))>0) // Adept Profane Soul [Brain] 2170 status->max_sp += sd->status.max_sp * (skill*3)/100; 2171 2172 2167 status->max_sp += sd->status.max_sp * (skill*3)/100; 2173 2168 // Apply relative modifiers from equipment 2174 2169 if(sd->sprate < 0) … … 2263 2258 } 2264 2259 } 2260 //right place? 2265 2261 if((skill=pc_checkskill(sd,AD_FERVOR))>0) // Adept Unholy Fevor [Brain] 2266 status->hit += skill*2;2262 status->hit += skill*2; 2267 2263 2268 2264 // ----- FLEE CALCULATION ----- … … 2274 2270 status->flee += (skill*3)>>1; 2275 2271 if((skill=pc_checkskill(sd,AD_FERVOR))>0) // Adept Unholy Fevor [Brain] 2276 status->flee += skill*2;2272 status->flee += skill*2; 2277 2273 2278 2274 // ----- EQUIPMENT-DEF CALCULATION ----- … … 2301 2297 status->mdef = cap_value(i, CHAR_MIN, CHAR_MAX); 2302 2298 } 2299 //AMIDOINITRITE? 2303 2300 // Absolute modifiers from passive skills 2304 2301 if((skill=pc_checkskill(sd,AD_DARKFAITH))>0) // Adept Dark Faith [Brain] 2305 status->mdef += 1*skill;2302 status->mdef += 1*skill; 2306 2303 2307 2304 … … 2314 2311 // ----- WALKING SPEED CALCULATION ----- 2315 2312 2316 if(sd->speed_rate < 0) 2317 sd->speed_rate = 0; 2318 if(sd->speed_rate != 100) 2319 status->speed = status->speed*sd->speed_rate/100; 2313 sd->speed_rate += sd->speed_add_rate; 2314 status->speed += status->speed * sd->speed_rate/100; 2320 2315 2321 2316 // Relative modifiers from passive skills … … 2411 2406 sd->subrace[RC_DRAGON]+=skill; 2412 2407 } 2413 2408 // Racial slurs =O 2414 2409 if((skill=pc_checkskill(sd,AD_DARKFAITH))>0) // Adept Dark Faith [Brain] 2415 sd->subele[ELE_DARK] += skill*5;2410 sd->subele[ELE_DARK] += skill*5; 2416 2411 if((skill=pc_checkskill(sd,WL_DEMONOLOGY))>0 ){ //Warlock Demonology [Brain] 2417 skill = skill*5;2418 sd->right_weapon.addrace[RC_DEMON]+=skill;2419 sd->magic_addrace[RC_DEMON]+=skill;2420 sd->subrace[RC_DEMON]+=skill;2412 skill = skill*5; 2413 sd->right_weapon.addrace[RC_DEMON]+=skill; 2414 sd->magic_addrace[RC_DEMON]+=skill; 2415 sd->subrace[RC_DEMON]+=skill; 2421 2416 } 2422 2417 if((pc_checkskill(sd,NC_PHYLACTERY))>0){ // Necro Phylactery [Brain] 2423 sd->subele[ELE_NEUTRAL] += 10; //And increases neutral resistance by 10% 2424 } 2418 sd->subele[ELE_NEUTRAL] += 10; //And increases neutral resistance by 10% 2419 } 2420 2425 2421 2426 2422 … … 2448 2444 } 2449 2445 if(sd->sc.data[SC_DEATHPACT]) //Necro Death Pact [Brain] 2450 sd->subele[ELE_NEUTRAL] += sd->sc.data[SC_DEATHPACT]->val2; 2451 2446 sd->subele[ELE_NEUTRAL] += sd->sc.data[SC_DEATHPACT]->val2; 2452 2447 if(sc->data[SC_ARMOR_ELEMENT]) 2453 2448 { //This status change should grant card-type elemental resist. … … 2605 2600 status->rhw.atk2 = status->str + hom->level; 2606 2601 2607 /*Passive bonus from Wolf Mastery (will only take effect when first created or level up) [Brainstorm]2608 if((skill=pc_checkskill(hd->master,QHT_WOLFMASTERY)) > 0)2609 {2610 status->rhw.atk += skill * 3;2611 status->rhw.atk2 += skill * 3;2612 status->str += skill;2613 status->agi += skill;2614 status->vit += skill;2615 status->dex += skill;2616 status->int_ += skill;2617 status->luk += skill;2618 }*/2619 2620 2621 2602 status->aspd_rate = 1000; 2622 2603 … … 2785 2766 || sc->data[SC_TRICKDEAD] 2786 2767 || sc->data[SC_BLEEDING] 2787 || sc->data[SC_LUST] // Adept Blood Lust, stops hp regen [Brain]2768 || sc->data[SC_LUST] // Adept Blood Lust, stops hp regen [Brain] 2788 2769 || sc->data[SC_DEATHPACT] // Necro Death Pact 2789 2770 … … 2894 2875 if(status->speed < battle_config.max_walk_speed) 2895 2876 status->speed = battle_config.max_walk_speed; 2896 2897 if ((skill=pc_checkskill(sd,SA_FREECAST))>0) { 2898 //Store casting walk speed for quick restoration. [Skotlex] 2899 sd->prev_speed = status->speed * (175-5*skill)/100; 2900 if(sd->ud.skilltimer != -1) { //Swap speed. 2901 skill = status->speed; 2902 status->speed = sd->prev_speed; 2903 sd->prev_speed = skill; 2904 } 2905 } 2906 } 2877 } 2878 2907 2879 if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) { 2908 2880 flag|=SCB_ASPD; … … 2916 2888 2917 2889 status->amotion = cap_value(skill,battle_config.max_aspd,2000); 2918 2919 2890 status->adelay = 2*status->amotion; 2920 if ((skill=pc_checkskill(sd,SA_FREECAST))>0) {2921 //Store casting adelay for quick restoration. [Skotlex]2922 sd->prev_adelay = status->adelay*(150-5*skill)/100;2923 if(sd->ud.skilltimer != -1) { //Swap adelay.2924 skill = status->adelay;2925 status->adelay = sd->prev_adelay;2926 sd->prev_adelay = skill;2927 }2928 }2929 2930 2891 } 2931 2892 … … 3567 3528 batk += 100; 3568 3529 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 3569 batk += batk * sc->data[SC_LUST]->val2/100;3530 batk += batk * sc->data[SC_LUST]->val2/100; 3570 3531 if(sc->data[SC_CURSEWEAKNESS]) // Warlock Curse of Weakness [Brain] 3571 batk -= batk * sc->data[SC_CURSEWEAKNESS]->val2/100;3532 batk -= batk * sc->data[SC_CURSEWEAKNESS]->val2/100; 3572 3533 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 3573 if(sc->data[SC_DECREPIFY]->val2>=2) 3574 batk -= batk * 25/100; 3575 3534 if(sc->data[SC_DECREPIFY]->val2>=2) 3535 batk -= batk * 25/100; 3576 3536 return (unsigned short)cap_value(batk,0,USHRT_MAX); 3577 3537 } … … 3608 3568 } 3609 3569 } 3610 if(sc->data[SC_BLOODLUST]) 3570 if(sc->data[SC_BLOODLUST])//WTF?! 3611 3571 watk += watk * sc->data[SC_BLOODLUST]->val2/100; 3612 3572 if(sc->data[SC_FLEET]) … … 3617 3577 watk -= watk * sc->data[SC_STRIPWEAPON]->val2/100; 3618 3578 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 3619 watk += watk * sc->data[SC_LUST]->val2/100;3579 watk += watk * sc->data[SC_LUST]->val2/100; 3620 3580 if(sc->data[SC_REQUIEM]){ //Necro Requiem [Brain] 3621 if(sc->data[SC_REQUIEM]->val2)3622 watk += sc->data[SC_REQUIEM]->val2*10;3623 if(sc->data[SC_REQUIEM]->val3)3624 watk -= sc->data[SC_REQUIEM]->val3*10;3625 } 3581 if(sc->data[SC_REQUIEM]->val2) 3582 watk += sc->data[SC_REQUIEM]->val2*10; 3583 if(sc->data[SC_REQUIEM]->val3) 3584 watk -= sc->data[SC_REQUIEM]->val3*10; 3585 }//???? 3626 3586 if(sc->data[SC_CURSEWEAKNESS]) // Warlock Curse of Weakness [Brain] 3627 watk -= watk * sc->data[SC_CURSEWEAKNESS]->val2/100;3587 watk -= watk * sc->data[SC_CURSEWEAKNESS]->val2/100; 3628 3588 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 3629 if(sc->data[SC_DECREPIFY]->val2>=2) 3630 watk -= watk * 25/100; 3631 3589 if(sc->data[SC_DECREPIFY]->val2>=2) 3590 watk -= watk * 25/100; 3632 3591 3633 3592 return (unsigned short)cap_value(watk,0,USHRT_MAX); … … 3650 3609 matk += matk * sc->data[SC_INCMATKRATE]->val1/100; 3651 3610 if(sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 3652 matk += matk * sc->data[SC_OVERWHELMING]->val2/100; 3653 3611 matk += matk * sc->data[SC_OVERWHELMING]->val2/100; 3654 3612 3655 3613 return (unsigned short)cap_value(matk,0,USHRT_MAX); … … 3700 3658 hit += 20; // RockmanEXE; changed based on updated [Reddozen] 3701 3659 if(sc->data[SC_DARKMOON]){ //Necro Dark Moon [Brain] 3702 if(sc->data[SC_DARKMOON]->val2) 3703 hit += sc->data[SC_DARKMOON]->val2; 3704 if(sc->data[SC_DARKMOON]->val3) 3705 hit -= sc->data[SC_DARKMOON]->val3; 3706 } 3707 3660 if(sc->data[SC_DARKMOON]->val2) 3661 hit += sc->data[SC_DARKMOON]->val2; 3662 if(sc->data[SC_DARKMOON]->val3) 3663 hit -= sc->data[SC_DARKMOON]->val3; 3664 } 3708 3665 3709 3666 return (short)cap_value(hit,1,SHRT_MAX); … … 3747 3704 flee += 10 + sc->data[SC_SPEED]->val1 * 10 ; 3748 3705 if(sc->data[SC_DARKMOON]){ //Necro Dark Moon [Brain] 3749 if(sc->data[SC_DARKMOON]->val2) 3750 flee += sc->data[SC_DARKMOON]->val2; 3751 if(sc->data[SC_DARKMOON]->val3) 3752 flee -= sc->data[SC_DARKMOON]->val3; 3753 } 3754 3706 if(sc->data[SC_DARKMOON]->val2) 3707 flee += sc->data[SC_DARKMOON]->val2; 3708 if(sc->data[SC_DARKMOON]->val3) 3709 flee -= sc->data[SC_DARKMOON]->val3; 3710 } 3755 3711 3756 3712 return (short)cap_value(flee,1,SHRT_MAX); … … 3812 3768 def -= def * (sc->data[SC_FLING]->val2)/100; 3813 3769 if(sc->data[SC_SUFFER]) // Necro Power Word: Suffer [Brain] 3814 def <<=1; // -25% def3770 def <<=1; // -25% def 3815 3771 if (sc->data[SC_CURSEEXHAUST]) // Warlock Curse of Exhaustion [Brain] 3816 def -= sc->data[SC_CURSEEXHAUST]->val2;3772 def -= sc->data[SC_CURSEEXHAUST]->val2; 3817 3773 if (sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 3818 3774 def += sc->data[SC_OVERWHELMING]->val1; 3819 3775 3820 3776 … … 3853 3809 def2 -= def2 * (sc->data[SC_FLING]->val3)/100; 3854 3810 if(sc->data[SC_SUFFER]) // Necro Power Word: Suffer [Brain] 3855 def2 -= def2 * 25/100; // -25% def3811 def2 -= def2 * 25/100; // -25% def 3856 3812 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 3857 if(sc->data[SC_DECREPIFY]->val2>=4)3858 def2 -= def2 * 25/100;3813 if(sc->data[SC_DECREPIFY]->val2>=4) 3814 def2 -= def2 * 25/100; 3859 3815 3860 3816 … … 3886 3842 mdef += 1; //Skill info says it adds a fixed 1 Mdef point. 3887 3843 if(sc->data[SC_AGONY]) // Warlock Power Word: Agony [Brain] 3888 mdef -= 25*mdef/100; // -25% mdef3844 mdef -= 25*mdef/100; // -25% mdef 3889 3845 if (sc->data[SC_CURSEEXHAUST]) // Warlock Curse of Exhaustion [Brain] 3890 mdef -= sc->data[SC_CURSEEXHAUST]->val2;3846 mdef -= sc->data[SC_CURSEEXHAUST]->val2; 3891 3847 if (sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 3892 mdef += sc->data[SC_OVERWHELMING]->val1; 3893 3848 mdef += sc->data[SC_OVERWHELMING]->val1; 3894 3849 3895 3850 return (signed char)cap_value(mdef,CHAR_MIN,CHAR_MAX); … … 3906 3861 mdef2 -= mdef2 * sc->data[SC_MINDBREAKER]->val3/100; 3907 3862 if(sc->data[SC_AGONY]) // Warlock Power Word: Agony [Brain] 3908 mdef2 -= mdef2 * 25/100; // -25% mdef3863 mdef2 -= mdef2 * 25/100; // -25% mdef 3909 3864 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 3910 if(sc->data[SC_DECREPIFY]->val2>=5)3911 mdef2 -= mdef2 * 25/100;3865 if(sc->data[SC_DECREPIFY]->val2>=5) 3866 mdef2 -= mdef2 * 25/100; 3912 3867 3913 3868 … … 3917 3872 static unsigned short status_calc_speed(struct block_list *bl, struct status_change *sc, int speed) 3918 3873 { 3874 TBL_PC* sd = BL_CAST(BL_PC, bl); 3875 3919 3876 //Default speed coming in means there's no speed_rate adjustments. 3920 3877 int new_speed = speed; 3921 3878 bool default_speed = (speed == DEFAULT_WALK_SPEED); 3879 3880 if( sd && sd->ud.skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 ) 3881 speed = speed * (175 - 5 * pc_checkskill(sd,SA_FREECAST))/100; 3922 3882 3923 3883 if(!sc || !sc->count) … … 3964 3924 else if(sc->data[SC_WINDWALK]) 3965 3925 new_speed -= new_speed * sc->data[SC_WINDWALK]->val3/100; 3966 else if(sc->data[SC_FEAR]) //Fear Status by [Brainstorm]3967 new_speed -= new_speed * 25/100;3926 else if(sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 3927 new_speed -= new_speed * 25/100; 3968 3928 3969 3929 } … … 4011 3971 speed = speed * 100/75; 4012 3972 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 4013 speed = speed * 100/75; //-25% walkspeed 4014 3973 speed = speed * 100/75; //-25% walkspeed 4015 3974 4016 3975 return (short)cap_value(speed,10,USHRT_MAX); … … 4083 4042 else if(sc->data[SC_MADNESSCANCEL]) 4084 4043 aspd_rate -= 200; 4085 else if(sc->data[SC_LUST]) // Adept Blood Lust [Brain]4086 aspd_rate -= sc->data[SC_LUST]->val2*10;4044 else if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 4045 aspd_rate -= sc->data[SC_LUST]->val2*10; 4087 4046 4088 4047 } … … 4180 4139 return sc->data[SC_ELEMENTALCHANGE]->val2; 4181 4140 if( sc->data[SC_DEATHPACT]) // Necro Death Pact [Brain] 4182 return ELE_UNDEAD;4141 return ELE_UNDEAD; 4183 4142 if( sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 4184 return ELE_DARK; 4185 4143 return ELE_DARK; 4186 4144 return (unsigned char)cap_value(element,0,UCHAR_MAX); 4187 4145 } … … 4203 4161 return sc->data[SC_ELEMENTALCHANGE]->val1; 4204 4162 if( sc->data[SC_DEATHPACT]) // Necro Death Pact [Brain] 4205 return 1;4163 return 1; 4206 4164 if( sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 4207 return 1;4165 return 1; 4208 4166 4209 4167 … … 4250 4208 } 4251 4209 return cap_value(mode,0,USHRT_MAX); 4252 }4253 4254 /*==========================================4255 * Quick swap of adelay/speed when starting ending SA_FREECAST4256 *------------------------------------------*/4257 void status_freecast_switch(struct map_session_data *sd)4258 {4259 struct status_data *status;4260 unsigned short b_speed,tmp;4261 4262 status = &sd->battle_status;4263 4264 b_speed = status->speed;4265 4266 tmp = status->speed;4267 status->speed = sd->prev_speed;4268 sd->prev_speed = tmp;4269 4270 tmp = status->adelay;4271 status->adelay = sd->prev_adelay;4272 sd->prev_adelay = tmp;4273 4274 if(b_speed != status->speed)4275 clif_updatestatus(sd,SP_SPEED);4276 4210 } 4277 4211 … … 4945 4879 case SC_ASSNCROS: 4946 4880 case SC_LUST: // Adept Blood Lust [Brain] 4947 4948 4881 if (sc->data[SC_QUAGMIRE]) 4949 4882 return 0; … … 5049 4982 switch (type) { 5050 4983 case SC_BLESSING: 5051 if ( status->race!=RC_UNDEAD&& status->race!=RC_DEMON)4984 if (!undead_flag && status->race!=RC_DEMON) 5052 4985 break; 5053 4986 case SC_QUAGMIRE: … … 5063 4996 case SC_RICHMANKIM: 5064 4997 case SC_ROKISWEIL: 5065 //New status [Brainstorm] 5066 case SC_FEAR: 5067 case SC_DECREPIFY: 5068 case SC_DARKMOON: 5069 case SC_REQUIEM: 5070 case SC_CURSETONGUES: 5071 case SC_CURSEWEAKNESS: 5072 case SC_CURSEEXHAUST: 5073 4998 //Not sure if its the right place. 4999 //New status [Brainstorm] 5000 case SC_FEAR: 5001 case SC_DECREPIFY: 5002 case SC_DARKMOON: 5003 case SC_REQUIEM: 5004 case SC_CURSETONGUES: 5005 case SC_CURSEWEAKNESS: 5006 case SC_CURSEEXHAUST: 5007 //SC Fogwall Must have been added after he did this? 5074 5008 case SC_FOGWALL: 5075 5009 return 0; … … 5083 5017 //TO-DO Blessing and Agi up should do 1 damage against players on Undead Status, even on PvM 5084 5018 //but cannot be plagiarized (this requires aegis investigation on packets and official behavior) [Brainstorm] 5085 if ( status->race!=RC_UNDEAD && status->race!=RC_DEMON) {5019 if ((!undead_flag && status->race!=RC_DEMON) || bl->type == BL_PC) { 5086 5020 if (sc->data[SC_CURSE]) 5087 5021 status_change_end(bl,SC_CURSE,-1); 5088 5022 if (sc->data[SC_STONE] && sc->opt1 == OPT1_STONE) 5089 5023 status_change_end(bl,SC_STONE,-1); 5090 // Warlock Curses are canceled by blessing [Brain] 5024 //hell of a time finding this 5025 // Warlock Curses are canceled by blessing [Brain] 5026 if (sc->data[SC_CURSEWEAKNESS]) 5027 status_change_end(bl,SC_CURSEWEAKNESS,-1); 5028 if (sc->data[SC_CURSETONGUES]) 5029 status_change_end(bl,SC_CURSETONGUES,-1); 5030 if (sc->data[SC_CURSEEXHAUST]) 5031 status_change_end(bl,SC_CURSEEXHAUST,-1); 5032 if (sc->data[SC_DOOM]) // This skill would be way funnier if we could igore this concept, no? 5033 status_change_end(bl,SC_DOOM,-1);//But then people would abuse on WoEs 5034 } 5035 break; 5036 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness removes Impositio Manus [Brain] 5037 if (sc->data[SC_IMPOSITIO]) 5038 status_change_end(bl,SC_IMPOSITIO,-1); 5039 if (sc->data[SC_BLESSING]) //The opposite is also valid, curses cancel blessing [Brain] 5040 status_change_end(bl,SC_BLESSING,-1); 5041 break; 5042 case SC_CURSETONGUES: // Warlock Curse of Tongues removes Suffragium [Brain] 5043 if (sc->data[SC_SUFFRAGIUM]) 5044 status_change_end(bl,SC_SUFFRAGIUM,-1); 5045 if (sc->data[SC_BLESSING]) 5046 status_change_end(bl,SC_BLESSING,-1); 5047 break; 5048 case SC_CURSEEXHAUST: // Warlock Curse of Exhaustion removes angelus [Brain] 5049 if (sc->data[SC_ANGELUS]) 5050 status_change_end(bl,SC_ANGELUS,-1); 5051 case SC_DOOM: 5052 if (sc->data[SC_BLESSING]) 5053 status_change_end(bl,SC_BLESSING,-1); 5054 break; 5055 case SC_IMPOSITIO: // Impositio Manus removes Curse of Weakness [Brain] 5091 5056 if (sc->data[SC_CURSEWEAKNESS]) 5092 status_change_end(bl,SC_CURSEWEAKNESS,-1); 5057 status_change_end(bl,SC_CURSEWEAKNESS,-1); 5058 break; 5059 case SC_SUFFRAGIUM: // Suffragium removes Curse of Tongues [Brain] 5093 5060 if (sc->data[SC_CURSETONGUES]) 5094 status_change_end(bl,SC_CURSETONGUES,-1); 5061 status_change_end(bl,SC_CURSETONGUES,-1); 5062 break; 5063 case SC_ANGELUS: // Angelus removes Curse of Exhaustion [Brain] 5095 5064 if (sc->data[SC_CURSEEXHAUST]) 5096 status_change_end(bl,SC_CURSEEXHAUST,-1); 5097 if (sc->data[SC_DOOM]) // This skill would be way funnier if we could igore this concept, no? 5098 status_change_end(bl,SC_DOOM,-1);//But then people would abuse on WoEs 5099 5100 } 5101 break; 5102 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness removes Impositio Manus [Brain] 5103 if (sc->data[SC_IMPOSITIO]) 5104 status_change_end(bl,SC_IMPOSITIO,-1); 5105 if (sc->data[SC_BLESSING]) //The opposite is also valid, curses cancel blessing [Brain] 5106 status_change_end(bl,SC_BLESSING,-1); 5107 break; 5108 case SC_CURSETONGUES: // Warlock Curse of Tongues removes Suffragium [Brain] 5109 if (sc->data[SC_SUFFRAGIUM]) 5110 status_change_end(bl,SC_SUFFRAGIUM,-1); 5111 if (sc->data[SC_BLESSING]) 5112 status_change_end(bl,SC_BLESSING,-1); 5113 break; 5114 case SC_CURSEEXHAUST: // Warlock Curse of Exhaustion removes angelus [Brain] 5115 if (sc->data[SC_ANGELUS]) 5116 status_change_end(bl,SC_ANGELUS,-1); 5117 case SC_DOOM: 5118 if (sc->data[SC_BLESSING]) 5119 status_change_end(bl,SC_BLESSING,-1); 5120 break; 5121 case SC_IMPOSITIO: // Impositio Manus removes Curse of Weakness [Brain] 5122 if (sc->data[SC_CURSEWEAKNESS]) 5123 status_change_end(bl,SC_CURSEWEAKNESS,-1); 5124 break; 5125 case SC_SUFFRAGIUM: // Suffragium removes Curse of Tongues [Brain] 5126 if (sc->data[SC_CURSETONGUES]) 5127 status_change_end(bl,SC_CURSETONGUES,-1); 5128 break; 5129 case SC_ANGELUS: // Angelus removes Curse of Exhaustion [Brain] 5130 if (sc->data[SC_CURSEEXHAUST]) 5131 status_change_end(bl,SC_CURSEEXHAUST,-1); 5132 break; 5133 5065 status_change_end(bl,SC_CURSEEXHAUST,-1); 5066 break; 5134 5067 case SC_INCREASEAGI: 5135 5068 status_change_end(bl,SC_DECREASEAGI,-1); … … 5150 5083 status_change_end(bl,SC_TWOHANDQUICKEN,-1); 5151 5084 status_change_end(bl,SC_ONEHAND,-1); 5085 // may need tinkering 5152 5086 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 5153 status_change_end(bl,SC_LUST,-1);5154 5155 break; 5087 status_change_end(bl,SC_LUST,-1); 5088 break; 5089 //may be in the wrong place. 5156 5090 case SC_ONEHAND: 5157 5091 //Removes the Aspd potion effect, as reported by Vicious. [Skotlex] … … 5211 5145 status_change_end(bl,SC_MADNESSCANCEL,-1); 5212 5146 break; 5213 case SC_FREEZE: //Frozen status ends immolating AND searing status [Brain]5214 if(sc->data[SC_IMMOLATE])5215 status_change_end(bl,SC_IMMOLATE,-1);5216 case SC_IMMOLATE: // Warlock Immolate [Brain]5217 if(sc->data[SC_SEARING]) //Immolating status ends searing status5218 status_change_end(bl,SC_SEARING,-1);5219 break;5220 5221 5147 case SC_MADNESSCANCEL: 5222 5148 status_change_end(bl,SC_ADJUSTMENT,-1); … … 5227 5153 status_change_end(bl,SC_INCREASEAGI,-1); 5228 5154 break; 5229 5155 //Code has changed since this 5156 case SC_FREEZE: //Frozen status ends immolating AND searing status [Brain] 5157 if(sc->data[SC_IMMOLATE]) 5158 status_change_end(bl,SC_IMMOLATE,-1); 5159 case SC_IMMOLATE: // Warlock Immolate [Brain] 5160 if(sc->data[SC_SEARING]) //Immolating status ends searing status 5161 status_change_end(bl,SC_SEARING,-1); 5162 break; 5230 5163 } 5231 5164 … … 5250 5183 case SC_SILENCE: 5251 5184 case SC_CONFUSION: 5185 //Should Edit depending on the one that will work for the modified ver. 5252 5186 case SC_FEAR: //Fear Status by [Brainstorm] 5253 5187 case SC_BLIND: … … 5560 5494 clif_emotion(bl,1); 5561 5495 break; 5562 case SC_FEAR: //Fear Status by [Brainstorm] 5563 clif_emotion(bl,16); // e_wah 5564 if(sd) tick /= 2; 5565 break; 5566 5496 case SC_FEAR: //Fear Status by [Brainstorm] 5497 clif_emotion(bl,16); // e_wah 5498 if(sd) tick /= 2; 5499 break; 5567 5500 case SC_BLEEDING: 5568 5501 val4 = tick/10000; … … 5941 5874 } 5942 5875 break; 5943 5944 case SC_ATFIELD: // AT-Field [Brainstorm] 5945 val2 = 100; // 100% Block chance 5946 val3 = 100; // Dodge 100 attacks total. 5947 val4 = tick/1000; 5948 tick = 1000; 5949 break; 5950 5951 5876 5877 //WHAT RELEVENCE DOES THIS HAVE AT ALL DAMNIT?! 5878 case SC_ATFIELD: // AT-Field [Brainstorm] 5879 val2 = 100; // 100% Block chance 5880 val3 = 100; // Dodge 100 attacks total. 5881 val4 = tick/1000; 5882 tick = 1000; 5883 break; 5884 5885 5952 5886 case SC_COMBO: 5953 5887 { … … 5992 5926 break; 5993 5927 case SC_BLESSING: 5994 if ( status->race!=RC_UNDEAD && status->race!=RC_DEMON)5928 if ((!undead_flag && status->race!=RC_DEMON) || bl->type == BL_PC) 5995 5929 val2 = val1; 5996 5930 else 5997 5931 val2 = 0; //0 -> Half stat. 5998 5932 break; 5999 case SC_REQUIEM: //Necro Requiem and Dark Moon [Brain]6000 case SC_DARKMOON:6001 if (undead_flag || status->race==RC_UNDEAD || status->race==RC_DEMON)6002 val2 = val1; //Demon and Undead get buffed6003 else if(status->race==RC_FORMLESS || status->def_ele==ELE_GHOST || bl->type == BL_PC)6004 {6005 val1 = 0; //No status change for Formless and Ghosts, and non-undead players6006 tick = 0; //Cancel status to not show requiem icon without a reason6007 }6008 else6009 val3 = val1; //Everything else (living) get negative status (requiem only)6010 break;6011 case SC_DECREPIFY: //Necro Decrepify [Brain]6012 val2 = val1;6013 break;5933 case SC_REQUIEM: //Necro Requiem and Dark Moon [Brain] 5934 case SC_DARKMOON: 5935 if (undead_flag || status->race==RC_UNDEAD || status->race==RC_DEMON) 5936 val2 = val1; //Demon and Undead get buffed 5937 else if(status->race==RC_FORMLESS || status->def_ele==ELE_GHOST || bl->type == BL_PC) 5938 { 5939 val1 = 0; //No status change for Formless and Ghosts, and non-undead players 5940 tick = 0; //Cancel status to not show requiem icon without a reason 5941 } 5942 else 5943 val3 = val1; //Everything else (living) get negative status (requiem only) 5944 break; 5945 case SC_DECREPIFY: //Necro Decrepify [Brain] 5946 val2 = val1; 5947 break; 6014 5948 6015 5949 case SC_TRICKDEAD: … … 6053 5987 val2 = 5*val1; //watk increase 6054 5988 break; 6055 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 6056 val2 = 5*val1; //batk/watk decrease 6057 break; 6058 case SC_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 6059 val2 = 2*val1; //def/mdef decrease 6060 break; 6061 case SC_CURSETONGUES: // Warlock Curse of Tongues [Brain] 6062 val2 = 10*val1; //casttime increase 6063 break; 6064 5989 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 5990 val2 = 5*val1; //batk/watk decrease 5991 break; 5992 case SC_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 5993 val2 = 2*val1; //def/mdef decrease 5994 break; 5995 case SC_CURSETONGUES: // Warlock Curse of Tongues [Brain] 5996 val2 = 10*val1; //casttime increase 5997 break; 6065 5998 case SC_MELTDOWN: 6066 5999 val2 = 100*val1; //Chance to break weapon … … 6119 6052 break; 6120 6053 case SC_LUST: // Adept Blood Lust [Brain] 6121 val2 = 5+3*val1; //Aspd/bAtk/wAtk change 6122 val3 = tick>0?tick:1000; //Interval at which HP is drained. 6123 break; 6124 case SC_DEATHPACT: // Necro Death Pact [Brain] 6125 val2 = 5*val1; //Neutral property resistance 6126 val3 = tick>0?tick:10000; //Interval at which HP is drained. 6127 break; 6128 case SC_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 6129 val2 = 2*val1; //matk bonus 6130 val3 = tick>0?tick:1000; //Interval at which SP is drained. 6131 break; 6132 6054 val2 = 5+3*val1; //Aspd/bAtk/wAtk change 6055 val3 = tick>0?tick:1000; //Interval at which HP is drained. 6056 break; 6057 case SC_DEATHPACT: // Necro Death Pact [Brain] 6058 val2 = 5*val1; //Neutral property resistance 6059 val3 = tick>0?tick:10000; //Interval at which HP is drained. 6060 break; 6061 case SC_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 6062 val2 = 2*val1; //matk bonus 6063 val3 = tick>0?tick:1000; //Interval at which SP is drained. 6064 break; 6133 6065 case SC_MINDBREAKER: 6134 6066 val2 = 20*val1; //matk increase. … … 6314 6246 unit_skillcastcancel(bl, 0); 6315 6247 break; 6316 6317 case SC_FEAR: //Fear Status by [Brainstorm] 6318 unit_stop_attack(bl); 6319 break; 6320 6321 6248 case SC_FEAR: //Fear Status by [Brainstorm] 6249 unit_stop_attack(bl); 6250 break; 6322 6251 } 6323 6252 … … 6765 6694 } 6766 6695 break; 6767 case SC_SPLASHER:6768 case SC_DOOM: // Warlock Curse of Doom [Brain] 6769 6696 case SC_SPLASHER: 6697 //Why is Doom here? 6698 case SC_DOOM: // Warlock Curse of Doom [Brain] 6770 6699 { 6771 6700 struct block_list *src=map_id2bl(sce->val3); … … 7135 7064 sc_timer_next(sce->val2+tick, status_change_timer, bl->id, data); 7136 7065 return 0; 7137 7138 7066 case SC_LUST: // Adept Blood Lust [Brain] 7139 if(!status_charge(bl, status->max_hp/100, 0))7140 break; //Not enough HP to continue.7141 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data);7142 return 0;7067 if(!status_charge(bl, status->max_hp/100, 0)) 7068 break; //Not enough HP to continue. 7069 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7070 return 0; 7143 7071 case SC_DEATHPACT: // Necro Death Pact [Brain] 7144 // Drains 1 HP every second (status wont kill, but dying will cancel it)7145 status_charge(bl, 1, 0);7146 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data);7147 return 0;7072 // Drains 1 HP every second (status wont kill, but dying will cancel it) 7073 status_charge(bl, 1, 0); 7074 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7075 return 0; 7148 7076 case SC_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 7149 if(!status_charge(bl, 0, status->max_sp/100)) 7150 break; //Not enough SP to continue. 7151 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7152 return 0; 7153 7077 if(!status_charge(bl, 0, status->max_sp/100)) 7078 break; //Not enough SP to continue. 7079 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7080 return 0; 7154 7081 7155 7082 case SC_CHASEWALK: … … 7387 7314 break; 7388 7315 case SC_DOOM: // Warlock Curse of Doom [Brain] 7389 if((sce->val4 -= 500) > 0) {7390 sc_timer_next(500 + tick, status_change_timer, bl->id, data);7391 return 0;7392 }7393 break;7316 if((sce->val4 -= 500) > 0) { 7317 sc_timer_next(500 + tick, status_change_timer, bl->id, data); 7318 return 0; 7319 } 7320 break; 7394 7321 7395 7322 case SC_MARIONETTE: … … 7560 7487 case SC_MATKFOOD: 7561 7488 case SC_DOOM: // Warlock Curse of Doom [Brain] 7562 7563 7489 continue; 7564 7490 -
src/map/status.h
r22 r24 294 294 SC_SEVENWIND, 295 295 SC_DEF_RATE, 296 SC_SPREGEN, 297 SC_WALKSPEED, 296 298 SC_DECREPIFY, // New status [brain] 297 299 SC_LUST, … … 310 312 SC_OVERWHELMING, 311 313 SC_FEAR, 312 SC_SPREGEN,313 SC_WALKSPEED,314 314 SC_MAX, //Automatically updated max, used in for's to check we are within bounds. 315 315 } sc_type; … … 823 823 void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, struct status_change *sc); 824 824 825 void status_freecast_switch(struct map_session_data *sd);826 825 int status_getrefinebonus(int lv,int type); 827 826 int status_check_skilluse(struct block_list *src, struct block_list *target, int skill_num, int flag); // [Skotlex] -
src/map/unit.c
r22 r24 374 374 if (sc && sc->data[SC_CONFUSION]) //Randomize the target position 375 375 map_random_dir(bl, &ud->to_x, &ud->to_y); 376 377 376 if (sc && sc->data[SC_FEAR]) //Flee from my target [Brainstorm] 378 unit_escape(bl, tbl, 15); 379 377 unit_escape(bl, tbl, 15); 380 378 381 379 if(ud->walktimer != -1) { … … 1091 1089 if(casttime > 0) { 1092 1090 ud->skilltimer = add_timer( tick+casttime, skill_castend_id, src->id, 0 ); 1093 if( sd && pc_checkskill(sd,SA_FREECAST))1094 status_ freecast_switch(sd);1091 if( sd && pc_checkskill(sd,SA_FREECAST) > 0 ) 1092 status_calc_bl(&sd->bl, SCB_SPEED); 1095 1093 else 1096 1094 unit_stop_walking(src,1); … … 1192 1190 if(casttime > 0) { 1193 1191 ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 ); 1194 if( sd && pc_checkskill(sd,SA_FREECAST))1195 status_ freecast_switch(sd);1192 if( sd && pc_checkskill(sd,SA_FREECAST) > 0 ) 1193 status_calc_bl(&sd->bl, SCB_SPEED); 1196 1194 else 1197 1195 unit_stop_walking(src,1); … … 1525 1523 } 1526 1524 1527 ud->canact_tick=tick; 1528 if(sd && pc_checkskill(sd,SA_FREECAST)) 1529 status_freecast_switch(sd); 1530 1525 ud->canact_tick = tick; 1526 1531 1527 if(type&1 && sd) 1532 1528 skill = sd->skillid_old; … … 1540 1536 if(ret<0) 1541 1537 ShowError("delete timer error : skillid : %d\n",ret); 1542 1538 1539 ud->skilltimer = -1; 1540 1541 if( sd && pc_checkskill(sd,SA_FREECAST) > 0 ) 1542 status_calc_bl(&sd->bl, SCB_SPEED); 1543 1543 1544 if(bl->type==BL_MOB) ((TBL_MOB*)bl)->skillidx = -1; 1544 1545 1545 ud->skilltimer = -1;1546 1546 clif_skillcastcancel(bl); 1547 1547 return 1;