Advertisement
johnlol

WeaponMastery

Aug 9th, 2023
1,410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 15.17 KB | Gaming | 0 0
  1. //===== EinherjarRO Scripts ==================================
  2. //= WeaponMasteries
  3. //===== By: ==================================================
  4. //= Stolao
  5. //===== Current Version: =====================================
  6. //= 1.37
  7. //===== Compatible With: =====================================
  8. //= rAthena SVN
  9. //===== Description: =========================================
  10. //= As you train using a particulat weapon type you gain
  11. //= passive bonuses depending on how much you have trained in
  12. //= that type. There are five types Onslaught, Swiftness,
  13. //= Safeguard, Ranged and Mystical
  14. //===== Comments: ============================================
  15. //= Masteries can go up to level 999 with curve of 2100
  16. //===== Additional Comments: =================================
  17. //= Visit Git For Older Versions
  18. //= 1.25 Added a Small boost to secondary stat based off prime stat
  19. //= 1.26 Added a Check for Item in Hand + Conf
  20. //= 1.27 Fixed mssing ""
  21. //= 1.28 Fixed missing ')'
  22. //= 1.29 Added a missing conf setting
  23. //= 1.2A Fixed missing descriptions
  24. //= 1.2B Increased .expcurve from 2500 -> 5000 due to Jobrate
  25. //= 1.2C Increased .wLvBonus from 1 -> 150 due to Jobrate
  26. //= 1.2D Replace 10 with .FirstLevel for custmoizability
  27. //= 1.2E Increase .FirstLevel from 10 -> 2000 due to Jobrate
  28. //= 1.2F Moved Level 0 Effects to top for consistant reading
  29. //= 1.30 Fixed a bug with @wlvl
  30. //= 1.31 Fixed bug where you would recive bonus from no gear
  31. //= 1.32 Tabulation
  32. //= 1.33 Made sword Onslaught
  33. //= 1.34 Made Any Shield Combo Safeguard
  34. //= 1.35 Made Exp Table a Constant (Dynamic from settings)
  35. //= 1.36 Fixed typo bug in Leveing up
  36. //= 1.37 Added F_WM_type to condence script a little
  37. //===== Contact Ifo: =========================================
  38. //= [Stolao]
  39. //= Email: Taingram11@gmail.com
  40. //============================================================
  41. //
  42. // Str - Onslaught: 2HSword,1HAxe,2HAxe,1HMace,2HMace(unused),Knuckle
  43. // Agi - Swiftness: Dagger,Fuuma Shuriken,Katar
  44. // Vit - Safegaurd: Unarmmed,1HSpear,2HSpear,Specialty
  45. // Dex - Ranged:    Bow,Instrument,Whip,Revolver,Rifle,Gatling Gun,Shotgun,Grenade Launcher
  46. // Int - Mystical:  Rod,Book,2HStaff,Scythe
  47.  
  48. function    script  Onslaught_M {
  49.     bonus bStr,1+getarg(0,0)/32;
  50.     bonus bAtkrate,1 + getarg(0,0) / 7 + ((1 + getarg(0,0) / 7) *readparam(bStr) / 100);   
  51.     if(getarg(0,0) >= 1)    bonus bCritical,1+getarg(0,0)/20;
  52.     if(getarg(0,0) >= 2)    bonus bAtk,1+getarg(0,0)/4;
  53.     if(getarg(0,0) >= 4)    bonus bAtk2,1+getarg(0,0)/4;
  54.     if(getarg(0,0) >= 8)    bonus bPerfectHitAddRate,1+getarg(0,0)/21;
  55.     if(getarg(0,0) >= 16)   bonus bBaseAtk,getarg(0,0)/4+1;
  56.     if(getarg(0,0) >= 32)   bonus bCritAtkRate,getarg(0,0)/4+1;
  57.     if(getarg(0,0) >= 64)   bonus bAspdRate,getarg(0,0)/22 + 1;
  58.     if(getarg(0,0) >= 128)  bonus bSplashAddRange,1;
  59.     return;
  60. }
  61.  
  62. function    script  Swiftness_M {
  63.     bonus bAgi,1+getarg(0,0)/32;
  64.     bonus bAspdRate,1+getarg(0,0)/7+((1+getarg(0,0)/7)*readparam(bAgi)/100);
  65.     if(getarg(0,0) >= 1)    bonus bSpeedAddRate,1+getarg(0,0)/9;
  66.     if(getarg(0,0) >= 2)    bonus bFlee,getarg(0,0)/3;
  67.     if(getarg(0,0) >= 4)    bonus bDoubleAddRate,1+getarg(0,0)/9;
  68.     if(getarg(0,0) >= 8)    bonus bFlee2,1+getarg(0,0)/33;
  69.     if(getarg(0,0) >= 16)   bonus bPerfectHitAddRate,1+getarg(0,0)/11;
  70.     if(getarg(0,0) >= 32)   bonus bCritAtkRate,getarg(0,0)/9-1;
  71.     if(getarg(0,0) >= 64)   bonus bCritical,1+getarg(0,0)/10;
  72.     if(getarg(0,0) >= 128)  bonus2 bHPDrainRate,1+getarg(0,0),1+getarg(0,0)/24;
  73.     return;
  74. }
  75.  
  76. function    script  Safegaurd_M {
  77.     bonus bVit,1+getarg(0,0)/32;
  78.     bonus bMaxHP,getarg(0,0)*5+5+((getarg(0,0)*5+5)*readparam(bVit)/100);
  79.     if(getarg(0,0) >= 1)    bonus bHPrecovRate,1+getarg(0,0)/2;
  80.     if(getarg(0,0) >= 2)    bonus bDef,1+getarg(0,0)/20;
  81.     if(getarg(0,0) >= 4)    bonus bMdef,1+getarg(0,0)/24;
  82.     if(getarg(0,0) >= 8)    bonus bMaxHPrate,1+getarg(0,0)/11;
  83.     if(getarg(0,0) >= 16)   bonus bNearAtkDef,getarg(0,0)/20+1;
  84.     if(getarg(0,0) >= 32)   bonus bLongAtkDef,getarg(0,0)/21+1;
  85.     if(getarg(0,0) >= 64)   bonus bMagicAtkDef,getarg(0,0)/22+1;
  86.     if(getarg(0,0) >= 128)  bonus bCriticalDef,getarg(0,0)/23+1;
  87.     return;
  88. }
  89.  
  90. function    script  Ranged_M    {
  91.     bonus bDex,1+getarg(0,0)/32;
  92.     bonus bAtkrate,1+getarg(0,0)/7+((1+getarg(0,0)/7)*readparam(bDex)/100);
  93.     if(getarg(0,0) >= 1)    bonus bBaseAtk,getarg(0,0)/3+2;
  94.     if(getarg(0,0) >= 2)    bonus bCritical,1+getarg(0,0)/21;
  95.     if(getarg(0,0) >= 4)    bonus bFlee,1+getarg(0,0)/11;
  96.     if(getarg(0,0) >= 8)    bonus bAspd,1+getarg(0,0)/11;
  97.     if(getarg(0,0) >= 16)   bonus bHit,1+getarg(0,0)/5;
  98.     if(getarg(0,0) >= 32)   bonus bLongAtkRate,getarg(0,0)/9-1;
  99.     if(getarg(0,0) >= 64)   bonus bCritAtkRate,4+getarg(0,0)/9;
  100.     if(getarg(0,0) >= 128)  bonus bAtkRange,1+getarg(0,0)/99;
  101.     return;
  102. }
  103.  
  104. function    script  Mystical_M  {
  105.     bonus bInt,1+getarg(0,0)/32;
  106.     bonus bMatk,1+getarg(0,0)+((1+getarg(0,0))*readparam(bInt)/100);
  107.     if(getarg(0,0) >= 1)    bonus bSPrecovRate,1+getarg(0,0)/2;
  108.     if(getarg(0,0) >= 2)    bonus bMaxSP,getarg(0,0)*2+2;
  109.     if(getarg(0,0) >= 4)    bonus bCastrate,-1-getarg(0,0)/20;
  110.     if(getarg(0,0) >= 8)    bonus bUseSPrate,-1-getarg(0,0)/21;
  111.     if(getarg(0,0) >= 16)   bonus bDelayrate,-1-getarg(0,0)/22;
  112.     if(getarg(0,0) >= 32)   bonus bHealPower,1+getarg(0,0)/2;
  113.     if(getarg(0,0) >= 64)   bonus bMAtkrate,1+getarg(0,0)/7;
  114.     if(getarg(0,0) >= 128)  bonus bNoCastCancel,1;
  115.     return;
  116. }
  117.  
  118. function    script  F_WM_type   {
  119.     switch(getarg(0,0)){
  120.         case 3:     case 6:     case 7:     case 8:
  121.         case 9:     case 12:    case 2:             return "Onslaught"; Break;
  122.         case 1:     case 16:    case 22:            return "Swiftness"; Break;
  123.         case 4:     case 5:     default:            return "Safegaurd"; Break;
  124.         case 11:    case 13:    case 14:    case 17:
  125.         case 18:    case 19:    case 20:    case 21:    return "Ranged";    Break;
  126.         case 10:    case 15:    case 23:    case 24:    return "Mystical";  Break;
  127.     }
  128. }
  129.  
  130. prontera,5,5,5  script  PCSTATCALC  111,{
  131.     end;
  132.  
  133. OnWeaponInfo:
  134.     .@M$ = .@atcmd_parameters$[0];
  135.     if((.@M$ == "")){
  136.         if(getiteminfo(getequipid(EQI_HAND_R),11) == 2 &&
  137.             getiteminfo(getequipid(EQI_HAND_L),2) == 4)
  138.             .@i = 0;
  139.         else    .@i = getiteminfo(getequipid(EQI_HAND_R),11);
  140.         .@M$ = callfunc("F_WM_type",.@i);
  141.     }
  142.     if(.@M$ == "Onslaught" || .@M$ == "onslaught" || .@M$ == "OnSlaught") .@i = 1;
  143.     if(.@M$ == "Swiftness" || .@M$ == "swiftness") .@i = 2;
  144.     if(.@M$ == "Safegaurd" || .@M$ == "SafeGaurd" || .@M$ == "safegaurd") .@i = 3;
  145.     if(.@M$ == "Ranged"    || .@M$ == "ranged"   ) .@i = 4;
  146.     if(.@M$ == "Mystical"  || .@M$ == "mystical" ) .@i = 5;
  147.     .@X = atoi(.@atcmd_parameters$[1]);
  148.     if(!.@X) .@X = getd(""+.@M$+"Master");
  149.     switch(.@i){
  150.         case 1:
  151.             dispbottom "Onslaught Lv: "+.@X+" "+OnslaughtExp+" / "+.NeededExp[.@X]+"xp";
  152.             dispbottom "Str +"+(1+.@X/32)+"";
  153.             dispbottom "Atk +"+(1+.@X/9)+"%";
  154.             if(.@X >= 1)dispbottom "Critical Chance +"+(1+.@X/20)+"";
  155.             if(.@X >= 2)dispbottom "Atk +"+(1+.@X/9)+"";
  156.             if(.@X >= 4)dispbottom "Weapon Atk +"+(1+.@X/11)+"";
  157.             if(.@X >= 8)dispbottom "Perfect Hit +"+(1+.@X/21)+"";
  158.             if(.@X >= 16)dispbottom "Base Atk +"+(.@X/4+1)+"";
  159.             if(.@X >= 32)dispbottom "Crit Damage +"+(.@X/8+3)+"%";
  160.             if(.@X >= 64)dispbottom "Aspd +"+.@X/16+"%";
  161.             if(.@X >= 128)dispbottom "Splash attack radius +1";
  162.             break;
  163.         case 2:
  164.             dispbottom "Swiftness Lv: "+.@X+" "+SwiftnessExp+" / "+.NeededExp[.@X]+"xp";
  165.             dispbottom "Agi +"+(1+.@X/32)+"";
  166.             dispbottom "Aspd +"+(1+.@X/9)+"%";
  167.             if(.@X >= 1)dispbottom "Moving speed +"+(1+.@X/9)+"%";
  168.             if(.@X >= 2)dispbottom "Flee +"+(.@X/2)+"";
  169.             if(.@X >= 4)dispbottom "Double Attack Chance +"+(1+.@X/9)+"%";
  170.             if(.@X >= 8)dispbottom "Perfect Dodge +"+(1+.@X/33)+"";
  171.             if(.@X >= 16)dispbottom "On-target impact chance +"+(1+.@X/11)+"%";
  172.             if(.@X >= 32)dispbottom "Crit Damage +"+(.@X/9-1)+"%";
  173.             if(.@X >= 64)dispbottom "Critical Chance +"+(1+.@X/10)+"";
  174.             if(.@X >= 128)dispbottom ""+(1+SwiftnessMaster)/10+"."+((1+SwiftnessMaster)%10)+"% chance of healing for "+(.@X/24+1)+"% of damage dealt with each normal attack";
  175.             break;
  176.         case 3:
  177.             dispbottom "Safegaurd Lv: "+.@X+" "+SafegaurdExp+" / "+.NeededExp[.@X]+"xp";
  178.             dispbottom "Vit +"+(1+.@X/32)+"";
  179.             dispbottom "Max HP +"+(.@X*5+5)+"";
  180.             if(.@X >= 1)dispbottom "Natural HP recovery ratio +"+(1+.@X/2)+"%";
  181.             if(.@X >= 2)dispbottom "Def +"+(1+.@X/20)+"";
  182.             if(.@X >= 4)dispbottom "Mdef +"+(1+.@X/24)+"";
  183.             if(.@X >= 8)dispbottom "Max HP +"+(1+.@X/9)+"%";
  184.             if(.@X >= 16)dispbottom "Adds "+(.@X/20+1)+" damage reduction against Critical Hits";
  185.             if(.@X >= 32)dispbottom "Adds "+(.@X/21+1)+" damage reduction against melee physical attacks";
  186.             if(.@X >= 64)dispbottom "Adds "+(.@X/22+1)+" damage reduction against ranged physical";
  187.             if(.@X >= 128)dispbottom "Adds "+(.@X/23+1)+" damage reduction against magical attacks";
  188.             break;
  189.         case 4:
  190.             dispbottom "Ranged Lv: "+.@X+" "+RangedExp+" / "+.NeededExp[.@X]+"xp";
  191.             dispbottom "Dex +"+(1+.@X/32)+"";
  192.             dispbottom "Atk +"+(1+.@X/9)+"%";
  193.             if(.@X >= 1)dispbottom "Moving speed +"+(1+.@X/20)+"%";
  194.             if(.@X >= 2)dispbottom "Critical +"+(1+.@X/21)+"";
  195.             if(.@X >= 4)dispbottom "Flee +"+(1+.@X/2)+"";
  196.             if(.@X >= 8)dispbottom "Aspd +"+(.@X/11)+"";
  197.             if(.@X >= 16)dispbottom "Hit +"+(.@X/9)+"";
  198.             if(.@X >= 32)dispbottom "Increases damage of ranged attacks by "+(.@X/11)+"%";
  199.             if(.@X >= 64)dispbottom "Crit Damage +"+(4+.@X/9)+"%";
  200.             if(.@X >= 128)dispbottom "Atk Range +"+(1+.@X/99)+"";
  201.             break;
  202.         case 5:
  203.             dispbottom "Mystical Lv: "+.@X+" "+MysticalExp+" / "+.NeededExp[.@X]+"xp";
  204.             dispbottom "Int +"+(1+.@X/32)+"";
  205.             dispbottom "Matk +"+(1+.@X/9)+"%";
  206.             if(.@X >= 1)dispbottom "Natural SP recovery ratio +"+(.@X/2+1)+"%";
  207.             if(.@X >= 2)dispbottom "Max SP +"+(2+.@X*2)+"";
  208.             if(.@X >= 4)dispbottom "Skill casting time "+(-1-.@X/20)+"%";
  209.             if(.@X >= 8)dispbottom "SP consumption "+(-1-.@X/21)+"%";
  210.             if(.@X >= 16)dispbottom "Decreases skill delay by "+(1+.@X/22)+"%";
  211.             if(.@X >= 32)dispbottom "Increase heal amount of all heal skills by "+(1+.@X/2)+"%";
  212.             if(.@X >= 64)dispbottom "Weapon magical attack power +"+(.@X+1)+"";
  213.             if(.@X >= 128)dispbottom "Prevents casting from being interrupted when hit";
  214.             break;
  215.         default:
  216.             dispbottom "@wi <Type> <Level>";
  217.             dispbottom "Type: Onslaught, Swiftness, Safegaurd, Ranged, Mystical";
  218.             break;
  219.     }
  220.     end;
  221.  
  222. OnWeaponLevel:
  223.     .@M$ = .@atcmd_parameters$[0];
  224.     .@X = atoi(.@atcmd_parameters$[1]);
  225.     if((.@M$ != "Onslaught" && .@M$ != "Swiftness" && .@M$ != "Safegaurd" && .@M$ != "Ranged" && .@M$ != "Mystical" && .@M$ != "All")||!.@X){
  226.         dispbottom "@wlvl <type> <lvl>";
  227.         dispbottom "Onslaught,  Swiftness,  Safegaurd,  Ranged,  Mystical,  All";
  228.         end;
  229.     }
  230.     if(.MaxMastery >= .@X){
  231.         if(.@M$ == "All"){
  232.             setarray .@X$[0],"Onslaught","Swiftness","Safegaurd","Ranged","Mystical";
  233.             .@i = 0;
  234.             while(.@i < 5){
  235.                 setd ""+.@X$[.@i]+"Master",.@X;
  236.                 setd ""+.@X$[.@i]+"Exp",0;
  237.                 dispbottom ""+.@X$[.@i]+" Mastery has advanced to Lv "+.@X+"!";
  238.                 .@i++;
  239.             }
  240.         } else {
  241.             setd ""+.@M$+"Master",.@X;
  242.             setd ""+.@M$+"Exp",0;
  243.             dispbottom ""+.@M$+" Mastery has advanced to Lv "+.@X+"!";
  244.         }
  245.     } else  dispbottom "Sorry. Your "+.@M$+" Mastery has reached its limit!";
  246.     end;
  247.  
  248. OnPCStatCalcEvent:
  249.     if(.Weapon){
  250.         if(getequipid(EQI_HAND_R) > 500 || (getequipid(EQI_HAND_R) < 500 && .RightFist)){
  251.             if(getiteminfo(getequipid(EQI_HAND_R),11) == 2 && getiteminfo(getequipid(EQI_HAND_L),2) == 4)
  252.                 .@i = 0;
  253.             else    .@i = getiteminfo(getequipid(EQI_HAND_R),11);
  254.             switch(.@i){
  255.                 case 3:     case 6:     case 7:     case 8:
  256.                 case 9:     case 12:    case 2:             Onslaught_M(OnslaughtMaster);   Break;
  257.                 case 1:     case 16:    case 22:            Swiftness_M(SwiftnessMaster);   Break;
  258.                 case 4:     case 5:     default:            Safegaurd_M(SafegaurdMaster);   Break;
  259.                 case 11:    case 13:    case 14:    case 17:
  260.                 case 18:    case 19:    case 20:    case 21:    Ranged_M(RangedMaster);     Break;
  261.                 case 10:    case 15:    case 23:    case 24:    Mystical_M(MysticalMaster); Break;
  262.             }
  263.         }
  264.         if((getequipid(EQI_HAND_L) > 500 && getiteminfo(getequipid(EQI_HAND_R),5) != 34 && .Left) || (getequipid(EQI_HAND_L) < 500 && .LeftFist)){
  265.             if(getiteminfo(getequipid(EQI_HAND_L),2) == 4)
  266.                 .@i = 0;
  267.             else    .@i = getiteminfo(getequipid(EQI_HAND_L),11);
  268.             switch(.@i){
  269.                 case 3:     case 6:     case 7:     case 8:
  270.                 case 9:     case 12:    case 2:             Onslaught_M(OnslaughtMaster / 2);   Break;
  271.                 case 1:     case 16:    case 22:            Swiftness_M(SwiftnessMaster / 2);   Break;
  272.                 case 4:     case 5:     default:            Safegaurd_M(SafegaurdMaster / 2);   Break;
  273.                 case 11:    case 13:    case 14:    case 17:
  274.                 case 18:    case 19:    case 20:    case 21:    Ranged_M(RangedMaster / 2);     Break;
  275.                 case 10:    case 15:    case 23:    case 24:    Mystical_M(MysticalMaster / 2);     Break;
  276.             }
  277.         }
  278.     }
  279.     end;
  280.  
  281. OnNPCKillEvent:
  282.     if(.Weapon){
  283.         .@M$ = "";
  284.         if(getequipid(EQI_HAND_R) > 500 || (getequipid(EQI_HAND_R) < 500 && .RightFist)){
  285.             if(getiteminfo(getequipid(EQI_HAND_R),11) == 2 &&
  286.                 getiteminfo(getequipid(EQI_HAND_L),2) == 4)
  287.                 .@i = 0;
  288.             else    .@i = getiteminfo(getequipid(EQI_HAND_R),11);
  289.             .@M$ = callfunc("F_WM_type",.@i);
  290.             .@exp = strmobinfo(3,killedrid);
  291.             .@wLv = getiteminfo(getequipid(EQI_HAND_R),13);
  292.             .@master = getd(""+ .@M$ + "Master");
  293.             if(.MaxMastery > .@master){
  294.                 Setd ""+.@M$+"Exp",getd(""+.@M$+"Exp") + .@exp  * (.Rates * (getstatus(SC_JEXPBOOST,3)?3:2) / 2) + .@wLv * .@wLv * .wLvBonus;
  295.                 if(getd(""+.@M$+"Exp") > .NeededExp[.@master]){
  296.                     setd ""+.@M$+"Master",.@master + 1;
  297.                     announce ""+.@M$+" Mastery has advanced to Lv "+(.@master + 1)+"!",bc_blue|bc_self;
  298.                     Setd ""+.@M$+"Exp",0;
  299.                 }
  300.             }
  301.         }
  302.         if((getequipid(EQI_HAND_L) > 500 && getiteminfo(getequipid(EQI_HAND_R),5) != 34 && .Left) || (getequipid(EQI_HAND_L) < 500 && .LeftFist)){
  303.             .@M$ = "";
  304.             if(getiteminfo(getequipid(EQI_HAND_L),2) == 4)
  305.                 .@i = 0;
  306.             else    .@i = getiteminfo(getequipid(EQI_HAND_L),11);
  307.             .@M$ = callfunc("F_WM_type",.@i);
  308.             .@wLv = getiteminfo(getequipid(EQI_HAND_L),13);
  309.             .@master = getd(""+ .@M$ + "Master");
  310.             if(.MaxMastery > .@master){
  311.                 Setd ""+.@M$+"Exp",getd(""+.@M$+"Exp") + .@exp  * (.Rates * (getstatus(SC_JEXPBOOST,3)?3:2) / 4) + .@wLv * .@wLv * .wLvBonus;
  312.                 if(getd(""+.@M$+"Exp") > .NeededExp[.@master]){
  313.                     setd ""+.@M$+"Master",.@master + 1;
  314.                     announce ""+.@M$+" Mastery has advanced to Lv "+(.@master + 1)+"!",bc_blue|bc_self;
  315.                     Setd ""+.@M$+"Exp",0;
  316.                 }
  317.             }
  318.         }
  319.     }
  320.     end;
  321.  
  322. OnInit:
  323.     bindatcmd("wi"      ,"PCSTATCALC::OnWeaponInfo",0,99);
  324.     bindatcmd("weaponinfo"  ,"PCSTATCALC::OnWeaponInfo",0,99);
  325.     bindatcmd("wlvlup"  ,"PCSTATCALC::OnWeaponLevel",60,99);
  326.     bindatcmd("wlvl"    ,"PCSTATCALC::OnWeaponLevel",60,99);
  327.     .Weapon = 1;        // Toggle Exp Groth On/Off
  328.                 //   1 = On
  329.                 //   0 = Off
  330.  
  331.     .Left = 1;      // Toggle Left Handed Mastery, left hand recives ~1/2 exp and stats
  332.                 //   1 = On
  333.                 //   0 = Off
  334.  
  335.     .RightFist = 0;     // Toggle Right fist recive Safegaurd Mastery effect
  336.                 //   1 = On
  337.                 //   0 = Off
  338.  
  339.     .LeftFist = 0;      // Toggle Left fist recive Safegaurd Mastery effect
  340.                 //   1 = On
  341.                 //   0 = Off
  342.  
  343.     .FirstLevel = 20000;    // Exp cost to get from level 0 -> 1
  344.  
  345.     .expcurve = 20000;  // Exp curve for weapon mastery
  346.                 //   Lv * Lv * .expcurve + .FirstLevel + Lv
  347.                 //   Default 5000
  348.  
  349.     .MaxMastery = 99;   // Sets the max Weapon Mastery Level
  350.                 //   Default 128
  351.  
  352.     .wLvBonus = 150;    // Amount of extra Weapon Exp from higher level weapons,
  353.                 //   Bonus exp = WLv * WLv * .wLvBonus
  354.                 //   Default 150
  355.  
  356.     // Exp Formula
  357.     for(.@i = 0; .@i < .MaxMastery; .@i++)
  358.         .NeededExp[.@i] = (.@i * .@i * .expcurve) + (.@i * 100) + .FirstLevel;
  359.  
  360.     // Dont Touch
  361.     .Rates = getbattleflag("job_exp_rate");
  362. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement