Renewal Physical damage cleanup (#6997)
Corrected bAtkRate item bonus behavior to be the same as official. Correction order of calculation of physical attack Enchant Deadly Poison now grants 25% poison pseudo elemental bonus. also Magnum break also grants 20% fire pseudo elemental damage. Advanced Katar Mastery bonus formula is corrected. Critical attacks now always use max attack value like Maximize Power-buffed attacks. Correction item-script of many items/combo from bAddClass,Class_All to bAtkRate according to official sources. Co-authored-by: Daegaladh <4557962+Daegaladh@users.noreply.github.com> Co-authored-by: Aleos <aleos89@users.noreply.github.com> Co-authored-by: Jittapan Pluemsumran <nightsheep@outlook.com>
This commit is contained in:
parent
78b4f4420d
commit
e3cb3fa01f
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -9718,7 +9718,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
.@rate = ((getrefine()>14)?15:10);
|
||||
bonus2 bAddClass,Class_All,.@rate;
|
||||
bonus bAtkRate,.@rate;
|
||||
bonus3 bAutoSpell,"SM_MAGNUM",10,15;
|
||||
- Id: 4495
|
||||
AegisName: Sealed_Amon_Ra_Card
|
||||
@ -37112,7 +37112,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Weight: 10
|
||||
Script: |
|
||||
autobonus "{ bonus bInt,50; bonus bMatkRate,15; bonus2 bAddClass,Class_All,-15; }",20,10000,BF_MAGIC;
|
||||
autobonus "{ bonus bInt,50; bonus bMatkRate,15; bonus bAtkRate,-15; }",20,10000,BF_MAGIC;
|
||||
/* unknown rate */
|
||||
- Id: 25702
|
||||
AegisName: EP17_1_EVT35
|
||||
@ -37130,7 +37130,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Weight: 10
|
||||
Script: |
|
||||
autobonus "{ bonus bStr,50; bonus2 bAddClass,Class_All,15; bonus bMatkRate,-15; }",20,10000,BF_WEAPON;
|
||||
autobonus "{ bonus bStr,50; bonus bAtkRate,15; bonus bMatkRate,-15; }",20,10000,BF_WEAPON;
|
||||
/* unknown rate */
|
||||
- Id: 25704
|
||||
AegisName: EP17_1_EVT37
|
||||
@ -38245,7 +38245,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
bonus5 bAutoSpell,"SM_ENDURE",1,5,BF_SHORT,0;
|
||||
- Id: 27101
|
||||
AegisName: SweetNightM_Card
|
||||
@ -38960,7 +38960,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus bStr,4;
|
||||
bonus2 bAddClass,Class_All,4;
|
||||
bonus bAtkRate,4;
|
||||
- Id: 27172
|
||||
AegisName: Cowraiders3_Card
|
||||
Name: Scimitar Buffalo Bandit Card
|
||||
@ -39660,7 +39660,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
bonus bLongAtkRate,5;
|
||||
- Id: 27257
|
||||
AegisName: Kuro_Akuma_Card
|
||||
@ -39689,7 +39689,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
bonus bAspdRate,5;
|
||||
- Id: 27259
|
||||
AegisName: Rechenier_Card
|
||||
@ -39830,7 +39830,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
.@val = 10;
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
if (getrefine() >= 10) {
|
||||
.@val += 5;
|
||||
}
|
||||
@ -40007,7 +40007,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
- Id: 27304
|
||||
AegisName: E_EA2S_Card
|
||||
Name: E EA2S Card
|
||||
@ -40287,7 +40287,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
bonus bMaxHPRate,-50;
|
||||
bonus2 bAddRace,RC_DemiHuman,30;
|
||||
bonus2 bAddRace,RC_Player_Human,30;
|
||||
@ -40371,7 +40371,7 @@ Body:
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus3 bAutoSpellWhenHit,"NPC_WIDECURSE",3,(1+.@r);
|
||||
autobonus2 "{ bonus2 bAddClass,Class_All,25; bonus bMatkRate,25; }",(1+.@r),10000,BF_WEAPON|BF_MAGIC;
|
||||
autobonus2 "{ bonus bAtkRate,25; bonus bMatkRate,25; }",(1+.@r),10000,BF_WEAPON|BF_MAGIC;
|
||||
autobonus3 "{ }",1000,5000,"NV_FIRSTAID","{ active_transform 3029,5000; }";
|
||||
/* unknown rates */
|
||||
- Id: 27328
|
||||
@ -40452,7 +40452,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,25;
|
||||
bonus bAtkRate,25;
|
||||
bonus2 bSubRace,RC_Demon,-5;
|
||||
- Id: 27335
|
||||
AegisName: Chaotic_Baphomet_Junior_Card
|
||||
@ -40710,7 +40710,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
- Id: 27355
|
||||
AegisName: Contaminated_Raydric_Archer_Card
|
||||
Name: Contaminated Raydric Archer Card
|
||||
@ -41473,7 +41473,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,4;
|
||||
bonus bAtkRate,4;
|
||||
bonus bHit,10;
|
||||
- Id: 29062
|
||||
AegisName: Mettle2
|
||||
@ -41482,7 +41482,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,8;
|
||||
bonus bAtkRate,8;
|
||||
bonus bHit,20;
|
||||
- Id: 29063
|
||||
AegisName: Mettle3
|
||||
@ -41491,7 +41491,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,12;
|
||||
bonus bAtkRate,12;
|
||||
bonus bHit,30;
|
||||
- Id: 29064
|
||||
AegisName: Mettle4
|
||||
@ -41500,7 +41500,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,16;
|
||||
bonus bAtkRate,16;
|
||||
bonus bHit,40;
|
||||
- Id: 29065
|
||||
AegisName: Mettle5
|
||||
@ -41509,7 +41509,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,20;
|
||||
bonus bAtkRate,20;
|
||||
bonus bHit,50;
|
||||
- Id: 29066
|
||||
AegisName: Mettle6
|
||||
@ -41518,7 +41518,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,24;
|
||||
bonus bAtkRate,24;
|
||||
bonus bHit,60;
|
||||
- Id: 29067
|
||||
AegisName: Mettle7
|
||||
@ -41527,7 +41527,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,28;
|
||||
bonus bAtkRate,28;
|
||||
bonus bHit,70;
|
||||
- Id: 29068
|
||||
AegisName: Mettle8
|
||||
@ -41536,7 +41536,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,32;
|
||||
bonus bAtkRate,32;
|
||||
bonus bHit,80;
|
||||
- Id: 29069
|
||||
AegisName: Mettle9
|
||||
@ -41545,7 +41545,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,36;
|
||||
bonus bAtkRate,36;
|
||||
bonus bHit,90;
|
||||
- Id: 29070
|
||||
AegisName: Mettle10
|
||||
@ -41554,7 +41554,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Buy: 10
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,44;
|
||||
bonus bAtkRate,44;
|
||||
bonus bHit,100;
|
||||
- Id: 29071
|
||||
AegisName: MagicEessence1
|
||||
@ -43530,7 +43530,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
if (.@r>=7) {
|
||||
bonus bBaseAtk,25;
|
||||
if (.@r>=9) {
|
||||
@ -43694,7 +43694,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
autobonus "{ bonus bInt,50; bonus bMatkRate,15; bonus2 bAddClass,Class_All,-15; }",30,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }";
|
||||
autobonus "{ bonus bInt,50; bonus bMatkRate,15; bonus bAtkRate,-15; }",30,10000,BF_MAGIC,"{ specialeffect2 EF_POTION_BERSERK; }";
|
||||
- Id: 29549
|
||||
AegisName: Improve_Orb_L_DEX
|
||||
Name: Modification Orb(Firing Shot)
|
||||
@ -43708,7 +43708,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
autobonus "{ bonus bStr,50; bonus2 bAddClass,Class_All,15; bonus bMatkRate,-15; }",30,10000,BF_NORMAL,"{ specialeffect2 EF_POTION_BERSERK; }";
|
||||
autobonus "{ bonus bStr,50; bonus bAtkRate,15; bonus bMatkRate,-15; }",30,10000,BF_NORMAL,"{ specialeffect2 EF_POTION_BERSERK; }";
|
||||
- Id: 29551
|
||||
AegisName: Improve_Orb_L_AGI
|
||||
Name: Modification Orb(Fatal Flash)
|
||||
@ -44124,7 +44124,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus bBaseAtk,2*(.@r/2);
|
||||
bonus bHit,3*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,(.@r/5);
|
||||
bonus bAtkRate,(.@r/5);
|
||||
- Id: 29673
|
||||
AegisName: Time_Jewely_Str_2
|
||||
Name: Temporal Jewel (STR) Lv 2
|
||||
@ -44134,7 +44134,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus bBaseAtk,4*(.@r/2);
|
||||
bonus bHit,5*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,2*(.@r/5);
|
||||
bonus bAtkRate,2*(.@r/5);
|
||||
- Id: 29674
|
||||
AegisName: Time_Jewely_Str_3
|
||||
Name: Temporal Jewel (STR) Lv 3
|
||||
@ -44144,7 +44144,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus bBaseAtk,7*(.@r/2);
|
||||
bonus bHit,7*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,3*(.@r/5);
|
||||
bonus bAtkRate,3*(.@r/5);
|
||||
- Id: 29675
|
||||
AegisName: Time_Jewely_Agi_1
|
||||
Name: Temporal Jewel (AGI) Lv 1
|
||||
@ -44244,7 +44244,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus2 bWeaponDamageRate,W_BOW,(.@r/2);
|
||||
bonus bHit,2*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,(.@r/5);
|
||||
bonus bAtkRate,(.@r/5);
|
||||
- Id: 29685
|
||||
AegisName: Time_Jewely_Dex_2
|
||||
Name: Temporal Jewel (DEX) Lv 2
|
||||
@ -44254,7 +44254,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus2 bWeaponDamageRate,W_BOW,2*(.@r/2);
|
||||
bonus bHit,5*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,2*(.@r/5);
|
||||
bonus bAtkRate,2*(.@r/5);
|
||||
- Id: 29686
|
||||
AegisName: Time_Jewely_Dex_3
|
||||
Name: Temporal Jewel (DEX) Lv 3
|
||||
@ -44264,7 +44264,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus2 bWeaponDamageRate,W_BOW,3*(.@r/2);
|
||||
bonus bHit,7*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,3*(.@r/5);
|
||||
bonus bAtkRate,3*(.@r/5);
|
||||
- Id: 29687
|
||||
AegisName: Time_Jewely_Luk_1
|
||||
Name: Temporal Jewel (LUK) Lv 1
|
||||
@ -44274,7 +44274,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus bCritAtkRate,3*(.@r/2);
|
||||
bonus bCritical,(.@r/2);
|
||||
bonus2 bAddClass,Class_All,(.@r/5);
|
||||
bonus bAtkRate,(.@r/5);
|
||||
- Id: 29688
|
||||
AegisName: Time_Jewely_Luk_2
|
||||
Name: Temporal Jewel (LUK) Lv 2
|
||||
@ -44284,7 +44284,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus bCritAtkRate,6*(.@r/2);
|
||||
bonus bCritical,2*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,2*(.@r/5);
|
||||
bonus bAtkRate,2*(.@r/5);
|
||||
- Id: 29689
|
||||
AegisName: Time_Jewely_Luk_3
|
||||
Name: Temporal Jewel (LUK) Lv 3
|
||||
@ -44294,7 +44294,7 @@ Body:
|
||||
.@r = getequiprefinerycnt(EQI_HEAD_TOP);
|
||||
bonus bCritAtkRate,9*(.@r/2);
|
||||
bonus bCritical,3*(.@r/2);
|
||||
bonus2 bAddClass,Class_All,3*(.@r/5);
|
||||
bonus bAtkRate,3*(.@r/5);
|
||||
- Id: 29706
|
||||
AegisName: Tenacity1
|
||||
Name: Tenacity Lv1
|
||||
@ -44636,7 +44636,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
.@r = getrefine()/2;
|
||||
bonus2 bAddClass,Class_All,1+.@r;
|
||||
bonus bAtkRate,1+.@r;
|
||||
bonus bMatkRate,1+.@r;
|
||||
bonus bMaxHPrate,-2*(1+.@r);
|
||||
- Id: 31018
|
||||
@ -44690,7 +44690,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus bAspdRate,10;
|
||||
bonus2 bAddClass,Class_All,-3;
|
||||
bonus bAtkRate,-3;
|
||||
- Id: 31022
|
||||
AegisName: XM_Teddy_Bear_Card
|
||||
Name: Abandoned Teddy Bear Card
|
||||
@ -44729,7 +44729,7 @@ Body:
|
||||
BuyingStore: true
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
bonus5 bAutoSpell,"RK_IGNITIONBREAK",5,20,BF_WEAPON,1;
|
||||
- Id: 31025
|
||||
AegisName: As_Wind_Ghost_Card
|
||||
@ -44966,7 +44966,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus bUnbreakableArmor;
|
||||
bonus2 bAddClass,Class_All,30;
|
||||
bonus bAtkRate,30;
|
||||
bonus bMaxHPrate,-15;
|
||||
- Id: 300014
|
||||
AegisName: Ingrid_Card
|
||||
@ -44980,7 +44980,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus bUnbreakableArmor;
|
||||
bonus2 bAddClass,Class_All,-15;
|
||||
bonus bAtkRate,-15;
|
||||
bonus bMaxHPrate,40;
|
||||
bonus2 bHPLossRate,1000,4000;
|
||||
UnEquipScript: |
|
||||
@ -44998,10 +44998,10 @@ Body:
|
||||
BuyingStore: true
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
bonus bMaxHPrate,-5;
|
||||
bonus bMaxSPrate,-5;
|
||||
bonus2 bAddClass,Class_All,(getrefine()/4);
|
||||
bonus bAtkRate,(getrefine()/4);
|
||||
- Id: 300016
|
||||
AegisName: Treasure_Mimic_Card
|
||||
Name: Treasure Mimic Card
|
||||
@ -45274,7 +45274,7 @@ Body:
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_VIEW) == W_BOOK) {
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
bonus bHit,20;
|
||||
}
|
||||
bonus bShortAtkRate,.@r;
|
||||
@ -46073,7 +46073,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus bMaxHPrate,-5;
|
||||
bonus2 bAddClass,Class_All,(getrefine()/3);
|
||||
bonus bAtkRate,(getrefine()/3);
|
||||
- Id: 300151
|
||||
AegisName: ILL_Kraken_Card
|
||||
Name: Deep Sea Kraken Card
|
||||
@ -46285,7 +46285,7 @@ Body:
|
||||
Flags:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
bonus bLongAtkRate,7;
|
||||
- Id: 300185
|
||||
AegisName: MD_Geffen_Akuma_Card
|
||||
@ -46794,7 +46794,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
if (BaseJob == JOB_NOVICE) {
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
bonus bMaxHP,1500;
|
||||
}
|
||||
- Id: 300243
|
||||
@ -47121,7 +47121,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
if (getiteminfo(getequipid(EQI_HAND_R),11) == W_1HSWORD || getiteminfo(getequipid(EQI_HAND_R),11) == W_2HSWORD || getiteminfo(getequipid(EQI_HAND_R),11) == W_DAGGER) {
|
||||
bonus bShortAtkRate,10+2*(.@r/3);
|
||||
if (BaseLevel>=200) {
|
||||
@ -47139,7 +47139,7 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
if (getiteminfo(getequipid(EQI_HAND_R),11) == W_1HSPEAR || getiteminfo(getequipid(EQI_HAND_R),11) == W_2HSPEAR) {
|
||||
bonus bLongAtkRate,10+2*(.@r/3);
|
||||
if (BaseLevel>=200) {
|
||||
@ -47276,9 +47276,9 @@ Body:
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,-10+3*(.@r/3);
|
||||
bonus bAtkRate,-10+3*(.@r/3);
|
||||
if (.@r>=11) {
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
}
|
||||
- Id: 300275
|
||||
AegisName: aegis_300275
|
||||
@ -47883,12 +47883,12 @@ Body:
|
||||
.@r = getrefine();
|
||||
if (getrefine() < 12) {
|
||||
bonus bMaxHPrate,-30;
|
||||
bonus2 bAddClass,Class_All,-10;
|
||||
bonus bAtkRate,-10;
|
||||
bonus bMatkRate,-10;
|
||||
}
|
||||
else {
|
||||
bonus bMaxHPrate,30;
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
bonus bMatkRate,10;
|
||||
}
|
||||
if (getequiparmorlv() == 2) {
|
||||
@ -47907,7 +47907,7 @@ Body:
|
||||
BuyingStore: true
|
||||
DropEffect: CLIENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
bonus bMatkRate,5;
|
||||
.@r = getrefine();
|
||||
bonus bPAtk,2*(.@r/3);
|
||||
@ -48102,7 +48102,7 @@ Body:
|
||||
bonus bStr,10;
|
||||
bonus bMdef,3;
|
||||
bonus bDef,25;
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
- Id: 310077
|
||||
AegisName: Cassock_Agi
|
||||
Name: AGI Blessing
|
||||
@ -48205,7 +48205,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
bonus bStr,3;
|
||||
- Id: 310087
|
||||
AegisName: Automatic_Orb6
|
||||
@ -48328,7 +48328,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
bonus bBaseAtk,75;
|
||||
if (.@r>=9) {
|
||||
bonus bShortAtkRate,2;
|
||||
@ -48569,13 +48569,13 @@ Body:
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus bMatkRate,3;
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
if (.@r>=9) {
|
||||
bonus bMatkRate,3;
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
if (.@r>=11) {
|
||||
bonus bMatkRate,4;
|
||||
bonus2 bAddClass,Class_All,4;
|
||||
bonus bAtkRate,4;
|
||||
}
|
||||
}
|
||||
- Id: 310118
|
||||
@ -48653,7 +48653,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
autobonus "{ bonus bShortAtkRate,10; bonus2 bAddClass,Class_All,15; bonus bStr,50; }",30,10000,BF_WEAPON;
|
||||
autobonus "{ bonus bShortAtkRate,10; bonus bAtkRate,15; bonus bStr,50; }",30,10000,BF_WEAPON;
|
||||
- Id: 310125
|
||||
AegisName: Automatic_Orb44
|
||||
Name: Automatic Orb(Fatal Flash)
|
||||
@ -49653,35 +49653,35 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,1;
|
||||
bonus bAtkRate,1;
|
||||
- Id: 310198
|
||||
AegisName: aegis_310198
|
||||
Name: Anger Lv2
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
- Id: 310199
|
||||
AegisName: aegis_310199
|
||||
Name: Anger Lv3
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
- Id: 310200
|
||||
AegisName: aegis_310200
|
||||
Name: Anger Lv4
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,7;
|
||||
bonus bAtkRate,7;
|
||||
- Id: 310201
|
||||
AegisName: aegis_310201
|
||||
Name: Anger Lv5
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
- Id: 310202
|
||||
AegisName: aegis_310202
|
||||
Name: Horror Lv1
|
||||
@ -49798,35 +49798,35 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,1;
|
||||
bonus bAtkRate,1;
|
||||
- Id: 310218
|
||||
AegisName: aegis_310218
|
||||
Name: Empathy Lv2
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
- Id: 310219
|
||||
AegisName: aegis_310219
|
||||
Name: Empathy Lv3
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
- Id: 310220
|
||||
AegisName: aegis_310220
|
||||
Name: Empathy Lv4
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,7;
|
||||
bonus bAtkRate,7;
|
||||
- Id: 310221
|
||||
AegisName: aegis_310221
|
||||
Name: Empathy Lv5
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
- Id: 310222
|
||||
AegisName: aegis_310222
|
||||
Name: Happiness Lv1
|
||||
@ -50675,7 +50675,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
bonus bBaseAtk,25;
|
||||
if (.@r>=7) {
|
||||
bonus bShortAtkRate,3;
|
||||
@ -50728,7 +50728,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,4;
|
||||
bonus bAtkRate,4;
|
||||
bonus bBaseAtk,50;
|
||||
if (.@r>=7) {
|
||||
bonus bShortAtkRate,3;
|
||||
@ -50781,7 +50781,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus2 bAddClass,Class_All,6;
|
||||
bonus bAtkRate,6;
|
||||
bonus bBaseAtk,100;
|
||||
if (.@r>=7) {
|
||||
bonus bShortAtkRate,5;
|
||||
@ -50869,16 +50869,16 @@ Body:
|
||||
Script: |
|
||||
.@r = getrefine();
|
||||
bonus bMatkRate,2;
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
if (.@r>=7) {
|
||||
bonus bMatkRate,2;
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
if (.@r>=9) {
|
||||
bonus bMatkRate,2;
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
if (.@r>=11) {
|
||||
bonus bMatkRate,4;
|
||||
bonus2 bAddClass,Class_All,4;
|
||||
bonus bAtkRate,4;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -52729,7 +52729,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
autobonus "{ bonus2 bAddClass,Class_All,25; bonus bVit,50; }",30,10000,BF_WEAPON;
|
||||
autobonus "{ bonus bAtkRate,25; bonus bVit,50; }",30,10000,BF_WEAPON;
|
||||
- Id: 310610
|
||||
AegisName: Wolf_Orb_Sp_Int
|
||||
Name: Wolf Orb (Spell Buster)
|
||||
@ -53613,7 +53613,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
bonus bHit,10;
|
||||
- Id: 310693
|
||||
AegisName: Star_Of_Mettle2
|
||||
@ -53621,7 +53621,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
bonus bHit,15;
|
||||
- Id: 310694
|
||||
AegisName: Star_Of_Mettle3
|
||||
@ -53629,7 +53629,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,7;
|
||||
bonus bAtkRate,7;
|
||||
bonus bHit,20;
|
||||
bonus bPAtk,1;
|
||||
- Id: 310695
|
||||
@ -53638,7 +53638,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
bonus bHit,25;
|
||||
bonus bPAtk,2;
|
||||
- Id: 310696
|
||||
@ -53647,7 +53647,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,15;
|
||||
bonus bAtkRate,15;
|
||||
bonus bHit,30;
|
||||
bonus bPAtk,4;
|
||||
- Id: 310697
|
||||
@ -53657,7 +53657,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus bLongAtkRate,2;
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
- Id: 310698
|
||||
AegisName: Star_Of_MasterArcher2
|
||||
Name: Star of Master Archer Lv2
|
||||
@ -53665,7 +53665,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus bLongAtkRate,3;
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
- Id: 310699
|
||||
AegisName: Star_Of_MasterArcher3
|
||||
Name: Star of Master Archer Lv3
|
||||
@ -53673,7 +53673,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus bLongAtkRate,5;
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
bonus bPAtk,1;
|
||||
- Id: 310700
|
||||
AegisName: Star_Of_MasterArcher4
|
||||
@ -53682,7 +53682,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus bLongAtkRate,7;
|
||||
bonus2 bAddClass,Class_All,6;
|
||||
bonus bAtkRate,6;
|
||||
bonus bPAtk,2;
|
||||
- Id: 310701
|
||||
AegisName: Star_Of_MasterArcher5
|
||||
@ -53691,7 +53691,7 @@ Body:
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus bLongAtkRate,10;
|
||||
bonus2 bAddClass,Class_All,7;
|
||||
bonus bAtkRate,7;
|
||||
bonus bPAtk,4;
|
||||
- Id: 310702
|
||||
AegisName: Star_Of_Sharp1
|
||||
@ -54539,14 +54539,14 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
autobonus "{ bonus bAgi,100; bonus2 bAddClass,Class_All,10; }",5,10000,BF_WEAPON;
|
||||
autobonus "{ bonus bAgi,100; bonus bAtkRate,10; }",5,10000,BF_WEAPON;
|
||||
- Id: 310914
|
||||
AegisName: HeroInsignia_STR
|
||||
Name: Strength
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
- Id: 310915
|
||||
AegisName: HeroInsignia_LUK
|
||||
Name: Luck
|
||||
@ -55057,14 +55057,14 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,3;
|
||||
bonus bAtkRate,3;
|
||||
- Id: 310987
|
||||
AegisName: ATK_2Lv
|
||||
Name: ATK 2Lv
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,5;
|
||||
bonus bAtkRate,5;
|
||||
- Id: 310988
|
||||
AegisName: MATK_1Lv
|
||||
Name: MATK 1Lv
|
||||
@ -55268,7 +55268,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,15+5*getenchantgrade();
|
||||
bonus bAtkRate,15+5*getenchantgrade();
|
||||
- Id: 311017
|
||||
AegisName: Gear_MATK
|
||||
Name: Clockwork (Matk)
|
||||
@ -56407,7 +56407,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,6;
|
||||
bonus bAtkRate,6;
|
||||
bonus bBaseAtk,100;
|
||||
.@r = getrefine();
|
||||
if (.@r >= 7) {
|
||||
@ -56425,7 +56425,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,6;
|
||||
bonus bAtkRate,6;
|
||||
bonus bBaseAtk,100;
|
||||
.@r = getrefine();
|
||||
if (.@r >= 7) {
|
||||
@ -56478,17 +56478,17 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
bonus bMatkRate,2;
|
||||
.@r = getrefine();
|
||||
if (.@r >= 7) {
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
bonus bMatkRate,2;
|
||||
if (.@r >= 9) {
|
||||
bonus2 bAddClass,Class_All,2;
|
||||
bonus bAtkRate,2;
|
||||
bonus bMatkRate,2;
|
||||
if (.@r >= 11) {
|
||||
bonus2 bAddClass,Class_All,4;
|
||||
bonus bAtkRate,4;
|
||||
bonus bMatkRate,4;
|
||||
}
|
||||
}
|
||||
@ -56765,7 +56765,7 @@ Body:
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
autobonus "{ bonus2 bAddClass,Class_All,25; bonus bVit,50; }",30,10000,BF_WEAPON;
|
||||
autobonus "{ bonus bAtkRate,25; bonus bVit,50; }",30,10000,BF_WEAPON;
|
||||
- Id: 311121
|
||||
AegisName: Ice_F_Orb_Sp_Int
|
||||
Name: Ice Magic Orb (Spell Buster)
|
||||
@ -60074,7 +60074,7 @@ Body:
|
||||
bonus bLongAtkRate,5*(.@r/3);
|
||||
bonus bShortAtkRate,5*(.@r/3);
|
||||
if (.@r>=9) {
|
||||
bonus2 bAddClass,Class_All,10;
|
||||
bonus bAtkRate,10;
|
||||
if (.@r>=11 ) {
|
||||
bonus bPAtk,5;
|
||||
.@i = getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_VIEW);
|
||||
|
@ -83,7 +83,7 @@ Body:
|
||||
- Id: 13
|
||||
Option: VAR_ATKPERCENT
|
||||
Script: |
|
||||
bonus2 bAddClass,Class_All,getrandomoptinfo(ROA_VALUE);
|
||||
bonus bAtkRate,getrandomoptinfo(ROA_VALUE);
|
||||
- Id: 14
|
||||
Option: VAR_MAGICATKPERCENT
|
||||
Script: |
|
||||
|
@ -42468,7 +42468,7 @@ Body:
|
||||
- Level: 10
|
||||
Amount: 16
|
||||
SpCost: 30
|
||||
Status: Watk_Element
|
||||
Status: Sub_Weaponproperty
|
||||
- Id: 8203
|
||||
Name: MS_BOWLINGBASH
|
||||
Description: Bowling_Bash
|
||||
|
@ -8157,3 +8157,12 @@ Body:
|
||||
NoClearance: true
|
||||
Fail:
|
||||
S_Manapotion: true
|
||||
- Status: Sub_Weaponproperty
|
||||
Flags:
|
||||
NoBanishingBuster: true
|
||||
NoDispell: true
|
||||
NoClearance: true
|
||||
NoRemoveOnDead: true
|
||||
NoClearbuff: true
|
||||
End:
|
||||
Sub_Weaponproperty: true
|
||||
|
@ -125,7 +125,7 @@ Atk/Def
|
||||
bonus bBaseAtk,n; Basic attack power + n
|
||||
bonus bAtk,n; ATK + n (unofficial)
|
||||
bonus bAtk2,n; ATK2 + n
|
||||
bonus bAtkRate,n; Attack power + n% (unofficial)
|
||||
bonus bAtkRate,n; ATK + n% that won't interfere with Damage modifier and SC_EDP (renewal mode only)
|
||||
bonus bWeaponAtkRate,n; Weapon ATK + n%
|
||||
bonus bMatk,n; Magical attack power + n
|
||||
bonus bMatkRate,n; Magical attack power + n%
|
||||
|
@ -883,8 +883,10 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
|
||||
cardfix = cardfix * (100 + sd->right_weapon.addclass[tstatus->class_] + sd->left_weapon.addclass[tstatus->class_] +
|
||||
sd->right_weapon.addclass[CLASS_ALL] + sd->left_weapon.addclass[CLASS_ALL]) / 100;
|
||||
}
|
||||
#ifndef RENEWAL
|
||||
if( sd->status.weapon == W_KATAR && (skill = pc_checkskill(sd,ASC_KATAR)) > 0 ) // Adv. Katar Mastery functions similar to a +%ATK card on official [helvetica]
|
||||
cardfix = cardfix * (100 + (10 + 2 * skill)) / 100;
|
||||
#endif
|
||||
}
|
||||
|
||||
//! CHECKME: These right & left hand weapon ignores 'left_cardfix_to_right'?
|
||||
@ -2232,7 +2234,7 @@ static int battle_calc_status_attack(struct status_data *status, short hand)
|
||||
* @param sd Player
|
||||
* @return Base weapon damage
|
||||
*/
|
||||
static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, struct map_session_data *sd)
|
||||
static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, struct map_session_data *sd, bool critical)
|
||||
{
|
||||
struct status_data *status = status_get_status_data(src);
|
||||
uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R;
|
||||
@ -2270,7 +2272,7 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_
|
||||
atkmin = max(0, (int)(atkmin - variance + base_stat_bonus));
|
||||
atkmax = min(UINT16_MAX, (int)(atkmax + variance + base_stat_bonus));
|
||||
|
||||
if (sc && sc->data[SC_MAXIMIZEPOWER])
|
||||
if ((sc && sc->data[SC_MAXIMIZEPOWER]) || critical == true)
|
||||
damage = atkmax;
|
||||
else
|
||||
damage = rnd_value(atkmin, atkmax);
|
||||
@ -3486,6 +3488,7 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
struct map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
bool critical = false;
|
||||
|
||||
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, false);
|
||||
int left_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_L, false);
|
||||
@ -3501,10 +3504,25 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
|
||||
wd->statusAtk2 = battle_attr_fix(src, target, wd->statusAtk, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
|
||||
}
|
||||
|
||||
wd->weaponAtk += battle_calc_base_weapon_attack(src, tstatus, &sstatus->rhw, sd);
|
||||
wd->weaponAtk = battle_attr_fix(src, target, wd->weaponAtk, right_element, tstatus->def_ele, tstatus->ele_lv);
|
||||
// Check critical
|
||||
if (wd->type == DMG_MULTI_HIT_CRITICAL || wd->type == DMG_CRITICAL)
|
||||
critical = true;
|
||||
|
||||
wd->weaponAtk2 += battle_calc_base_weapon_attack(src, tstatus, &sstatus->lhw, sd);
|
||||
wd->weaponAtk += battle_calc_base_weapon_attack(src, tstatus, &sstatus->rhw, sd, critical);
|
||||
wd->weaponAtk2 += battle_calc_base_weapon_attack(src, tstatus, &sstatus->lhw, sd, critical);
|
||||
|
||||
// Weapon ATK gain bonus from SC_SUB_WEAPONPROPERTY here ( +x% pseudo element damage)
|
||||
if (sd && sd->sc.data[SC_SUB_WEAPONPROPERTY]) {
|
||||
int64 bonus_atk = (int64)floor((float)( wd->weaponAtk * sd->sc.data[SC_SUB_WEAPONPROPERTY]->val2 / 100));
|
||||
int64 bonus_atk2 = (int64)floor((float)( wd->weaponAtk2 * sd->sc.data[SC_SUB_WEAPONPROPERTY]->val2 / 100));
|
||||
bonus_atk = battle_attr_fix(src, target, bonus_atk, sd->sc.data[SC_SUB_WEAPONPROPERTY]->val1, tstatus->def_ele, tstatus->ele_lv);
|
||||
bonus_atk2 = battle_attr_fix(src, target, bonus_atk2, sd->sc.data[SC_SUB_WEAPONPROPERTY]->val1, tstatus->def_ele, tstatus->ele_lv);
|
||||
|
||||
wd->weaponAtk += bonus_atk;
|
||||
wd->weaponAtk2 += bonus_atk2;
|
||||
}
|
||||
|
||||
wd->weaponAtk = battle_attr_fix(src, target, wd->weaponAtk, right_element, tstatus->def_ele, tstatus->ele_lv);
|
||||
wd->weaponAtk2 = battle_attr_fix(src, target, wd->weaponAtk2, left_element, tstatus->def_ele, tstatus->ele_lv);
|
||||
|
||||
wd->equipAtk += battle_calc_equip_attack(src, skill_id);
|
||||
@ -3513,6 +3531,12 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
|
||||
wd->equipAtk2 += battle_calc_equip_attack(src, skill_id);
|
||||
wd->equipAtk2 = battle_attr_fix(src, target, wd->equipAtk2, left_element, tstatus->def_ele, tstatus->ele_lv);
|
||||
|
||||
// AtkRate gives a static bonus from (W.ATK + E.ATK)
|
||||
if (sd && sd->bonus.atk_rate) {
|
||||
wd->percentAtk = (wd->weaponAtk + wd->equipAtk) * sd->bonus.atk_rate / 100;
|
||||
wd->percentAtk2 = (wd->weaponAtk2 + wd->equipAtk2) * sd->bonus.atk_rate / 100;
|
||||
}
|
||||
|
||||
//Mastery ATK is a special kind of ATK that has no elemental properties
|
||||
//Because masteries are not elemental, they are unaffected by Ghost armors or Raydric Card
|
||||
battle_calc_attack_masteries(wd, src, target, skill_id, skill_lv);
|
||||
@ -3734,10 +3758,6 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
|
||||
if(sd) {
|
||||
int skill;
|
||||
|
||||
if (sd->bonus.atk_rate) {
|
||||
ATK_ADDRATE(wd->damage, wd->damage2, sd->bonus.atk_rate);
|
||||
RE_ALLATK_ADDRATE(wd, sd->bonus.atk_rate);
|
||||
}
|
||||
#ifndef RENEWAL
|
||||
if(sd->bonus.crit_atk_rate && is_attack_critical(wd, src, target, skill_id, skill_lv, false)) { // add +crit damage bonuses here in pre-renewal mode [helvetica]
|
||||
ATK_ADDRATE(wd->damage, wd->damage2, sd->bonus.crit_atk_rate);
|
||||
@ -5487,10 +5507,10 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
|
||||
#ifdef RENEWAL
|
||||
default: // fall through to apply EDP bonuses
|
||||
// Renewal EDP formula [helvetica]
|
||||
// weapon atk * (1 + (edp level * .8))
|
||||
// equip atk * (1 + (edp level * .6))
|
||||
ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 100 + (sc->data[SC_EDP]->val1 * 80));
|
||||
ATK_RATE(wd->equipAtk, wd->equipAtk2, 100 + (sc->data[SC_EDP]->val1 * 60));
|
||||
// weapon atk * (2.5 + (edp level * .3))
|
||||
// equip atk * (2.5 + (edp level * .3))
|
||||
ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 250 + (sc->data[SC_EDP]->val1 * 30));
|
||||
ATK_RATE(wd->equipAtk, wd->equipAtk2, 250 + (sc->data[SC_EDP]->val1 * 30));
|
||||
break;
|
||||
#else
|
||||
default:
|
||||
@ -5910,7 +5930,11 @@ static void battle_calc_attack_left_right_hands(struct Damage* wd, struct block_
|
||||
} else if(sd->status.weapon == W_KATAR && !skill_id) { //Katars (offhand damage only applies to normal attacks, tested on Aegis 10.2)
|
||||
skill = pc_checkskill(sd,TF_DOUBLE);
|
||||
wd->damage2 = (int64)wd->damage * (1 + (skill * 2))/100;
|
||||
#ifdef RENEWAL
|
||||
} else if(is_attack_right_handed(src, skill_id) && is_attack_left_handed(src, skill_id) && sd->status.weapon != W_KATAR) { //Dual-wield
|
||||
#else
|
||||
} else if(is_attack_right_handed(src, skill_id) && is_attack_left_handed(src, skill_id)) { //Dual-wield
|
||||
#endif
|
||||
if (wd->damage) {
|
||||
if( (sd->class_&MAPID_BASEMASK) == MAPID_THIEF ) {
|
||||
skill = pc_checkskill(sd,AS_RIGHT);
|
||||
@ -6010,15 +6034,17 @@ static void battle_calc_attack_gvg_bg(struct Damage* wd, struct block_list *src,
|
||||
wd->damage2 = battle_calc_bg_damage(src,target,wd->damage2,skill_id,wd->flag);
|
||||
}
|
||||
else {
|
||||
int64 d1 = wd->damage + wd->damage2,d2 = wd->damage2;
|
||||
wd->damage = battle_calc_damage(src,target,wd,d1,skill_id,skill_lv);
|
||||
if( mapdata_flag_gvg2(mapdata) )
|
||||
wd->damage = battle_calc_gvg_damage(src,target,wd->damage,skill_id,wd->flag);
|
||||
else if( mapdata->flag[MF_BATTLEGROUND] )
|
||||
wd->damage = battle_calc_bg_damage(src,target,wd->damage,skill_id,wd->flag);
|
||||
wd->damage2 = (int64)d2*100/d1 * wd->damage/100;
|
||||
wd->damage = battle_calc_damage(src, target, wd, wd->damage, skill_id, skill_lv);
|
||||
wd->damage2 = battle_calc_damage(src, target, wd, wd->damage2, skill_id, skill_lv);
|
||||
if (mapdata_flag_gvg2(mapdata)) {
|
||||
wd->damage = battle_calc_gvg_damage(src, target, wd->damage, skill_id, wd->flag);
|
||||
wd->damage2 = battle_calc_gvg_damage(src, target, wd->damage2, skill_id, wd->flag);
|
||||
}
|
||||
else if (mapdata->flag[MF_BATTLEGROUND]) {
|
||||
wd->damage = battle_calc_bg_damage(src, target, wd->damage, skill_id, wd->flag);
|
||||
wd->damage2 = battle_calc_bg_damage(src, target, wd->damage2, skill_id, wd->flag);
|
||||
}
|
||||
if(wd->damage > 1 && wd->damage2 < 1) wd->damage2 = 1;
|
||||
wd->damage-=wd->damage2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6151,6 +6177,7 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
|
||||
wd.damage = wd.damage2 =
|
||||
#ifdef RENEWAL
|
||||
wd.statusAtk = wd.statusAtk2 = wd.equipAtk = wd.equipAtk2 = wd.weaponAtk = wd.weaponAtk2 = wd.masteryAtk = wd.masteryAtk2 =
|
||||
wd.percentAtk = wd.percentAtk2 =
|
||||
#endif
|
||||
0;
|
||||
|
||||
@ -6406,14 +6433,16 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
if(!is_attack_hitting(&wd, src, target, skill_id, skill_lv, true))
|
||||
wd.dmg_lv = ATK_FLEE;
|
||||
else if(!(infdef = is_infinite_defense(target, wd.flag))) { //no need for math against plants
|
||||
int64 ratio = 0;
|
||||
int i = 0;
|
||||
|
||||
battle_calc_skill_base_damage(&wd, src, target, skill_id, skill_lv); // base skill damage
|
||||
|
||||
int64 ratio = 0;
|
||||
|
||||
#ifndef RENEWAL
|
||||
ratio = battle_calc_attack_skill_ratio(&wd, src, target, skill_id, skill_lv); // skill level ratios
|
||||
|
||||
ATK_RATE(wd.damage, wd.damage2, ratio);
|
||||
RE_ALLATK_RATE(&wd, ratio);
|
||||
#endif
|
||||
|
||||
int64 bonus_damage = battle_calc_skill_constant_addition(&wd, src, target, skill_id, skill_lv); // other skill bonuses
|
||||
|
||||
@ -6429,15 +6458,16 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min);
|
||||
}
|
||||
#endif
|
||||
|
||||
int i = 0;
|
||||
|
||||
#ifndef RENEWAL
|
||||
// add any miscellaneous player ATK bonuses
|
||||
if( sd && skill_id && (i = pc_skillatk_bonus(sd, skill_id))) {
|
||||
if( sd && skill_id && (i = pc_skillatk_bonus(sd, skill_id)))
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, i);
|
||||
RE_ALLATK_ADDRATE(&wd, i);
|
||||
}
|
||||
if (tsd && (i = pc_sub_skillatk_bonus(tsd, skill_id))) {
|
||||
if (tsd && (i = pc_sub_skillatk_bonus(tsd, skill_id)))
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, -i);
|
||||
RE_ALLATK_ADDRATE(&wd, -i);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef RENEWAL
|
||||
// In Renewal we only cardfix to the weapon and equip ATK
|
||||
@ -6472,15 +6502,42 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
battle_attack_sc_bonus(&wd, src, target, skill_id, skill_lv);
|
||||
|
||||
if (sd) { //monsters, homuns and pets have their damage computed directly
|
||||
wd.damage = (wd.statusAtk + wd.weaponAtk + wd.equipAtk) * (100 + sstatus->patk) / 100 + wd.masteryAtk + bonus_damage;
|
||||
wd.damage = (int64)floor((float)((wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.percentAtk) * (100 + sstatus->patk) / 100 + wd.masteryAtk + bonus_damage));
|
||||
if (is_attack_left_handed(src, skill_id))
|
||||
wd.damage2 = (wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2) * (100 + sstatus->patk) / 100 + wd.masteryAtk2 + bonus_damage;
|
||||
wd.damage2 = (int64)floor((float)((wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.percentAtk2) * (100 + sstatus->patk) / 100 + wd.masteryAtk2 + bonus_damage));
|
||||
|
||||
// CritAtkRate modifier
|
||||
if (wd.type == DMG_CRITICAL || wd.type == DMG_MULTI_HIT_CRITICAL) {
|
||||
if (skill_id > 0) {
|
||||
wd.damage += (int64)floor((float)(wd.damage * sd->bonus.crit_atk_rate / 200));
|
||||
if (is_attack_left_handed(src, skill_id))
|
||||
wd.damage2 += (int64)floor((float)(wd.damage2 * sd->bonus.crit_atk_rate / 200));
|
||||
}
|
||||
else {
|
||||
wd.damage += (int64)floor((float)(wd.damage * sd->bonus.crit_atk_rate / 100));
|
||||
if (is_attack_left_handed(src, skill_id))
|
||||
wd.damage2 += (int64)floor((float)(wd.damage2 * sd->bonus.crit_atk_rate / 100));
|
||||
}
|
||||
}
|
||||
|
||||
if (wd.flag & BF_SHORT)
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.short_attack_atk_rate);
|
||||
if(wd.flag&BF_LONG && (skill_id != RA_WUGBITE && skill_id != RA_WUGSTRIKE)) //Long damage rate addition doesn't use weapon + equip attack
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.long_attack_atk_rate);
|
||||
}
|
||||
|
||||
ratio = battle_calc_attack_skill_ratio(&wd, src, target, skill_id, skill_lv); // skill level ratios
|
||||
|
||||
ATK_RATE(wd.damage, wd.damage2, ratio);
|
||||
|
||||
// Advance Katar Mastery
|
||||
if (sd) {
|
||||
uint16 katar_skill;
|
||||
|
||||
if (sd->status.weapon == W_KATAR && (katar_skill = pc_checkskill(sd, ASC_KATAR)) > 0) // Adv. Katar Mastery applied after calculate with skillratio.
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, (10 + 2 * katar_skill));
|
||||
}
|
||||
|
||||
// Res reduces physical damage by a percentage and
|
||||
// is calculated before DEF and other reductions.
|
||||
// This should be the official formula. [Rytech]
|
||||
@ -6510,6 +6567,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
wd.damage = wd.damage * (5000 + res) / (5000 + 10 * res);
|
||||
wd.damage2 = wd.damage2 * (5000 + res) / (5000 + 10 * res);
|
||||
}
|
||||
|
||||
#else
|
||||
// final attack bonuses that aren't affected by cards
|
||||
battle_attack_sc_bonus(&wd, src, target, skill_id, skill_lv);
|
||||
@ -6521,6 +6579,18 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
|
||||
battle_calc_attack_post_defense(&wd, src, target, skill_id, skill_lv);
|
||||
}
|
||||
|
||||
#ifdef RENEWAL
|
||||
// add any miscellaneous player ATK bonuses
|
||||
if( sd && skill_id && (i = pc_skillatk_bonus(sd, skill_id))) {
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, i);
|
||||
RE_ALLATK_ADDRATE(&wd, i);
|
||||
}
|
||||
if (tsd && (i = pc_sub_skillatk_bonus(tsd, skill_id))) {
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, -i);
|
||||
RE_ALLATK_ADDRATE(&wd, -i);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
battle_calc_element_damage(&wd, src, target, skill_id, skill_lv);
|
||||
@ -6531,22 +6601,14 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
#ifdef RENEWAL
|
||||
if (is_attack_critical(&wd, src, target, skill_id, skill_lv, false)) {
|
||||
if (sd) { //Check for player so we don't crash out, monsters don't have bonus crit rates [helvetica]
|
||||
if (skill_id > 0)
|
||||
wd.damage = (int64)floor((float)((wd.damage * (140 + sstatus->crate)) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100);
|
||||
else
|
||||
wd.damage = (int64)floor((float)((wd.damage * (140 + sstatus->crate)) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
|
||||
if (is_attack_left_handed(src, skill_id)) {
|
||||
if (skill_id > 0)
|
||||
wd.damage2 = (int64)floor((float)((wd.damage2 * (140 + sstatus->crate)) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100);
|
||||
else
|
||||
wd.damage2 = (int64)floor((float)((wd.damage2 * (140 + sstatus->crate)) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100);
|
||||
}
|
||||
wd.damage = (int64)floor((float)((wd.damage * (1.4f + (0.01f * sstatus->crate)))));
|
||||
if (is_attack_left_handed(src, skill_id))
|
||||
wd.damage2 = (int64)floor((float)((wd.damage2 * (1.4f + (0.01f * sstatus->crate)))));
|
||||
} else
|
||||
wd.damage = (int64)floor((float)(wd.damage * 140) / 100);
|
||||
wd.damage = (int64)floor((float)(wd.damage * 1.4f));
|
||||
|
||||
if (tsd && tsd->bonus.crit_def_rate != 0) {
|
||||
if (tsd && tsd->bonus.crit_def_rate != 0)
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, -tsd->bonus.crit_def_rate);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -72,7 +72,7 @@ enum e_battle_check_target : uint32 {
|
||||
/// Damage structure
|
||||
struct Damage {
|
||||
#ifdef RENEWAL
|
||||
int64 statusAtk, statusAtk2, weaponAtk, weaponAtk2, equipAtk, equipAtk2, masteryAtk, masteryAtk2;
|
||||
int64 statusAtk, statusAtk2, weaponAtk, weaponAtk2, equipAtk, equipAtk2, masteryAtk, masteryAtk2, percentAtk, percentAtk2;
|
||||
#endif
|
||||
int64 damage, /// Right hand damage
|
||||
damage2; /// Left hand damage
|
||||
|
@ -1842,6 +1842,7 @@
|
||||
export_constant(SC_POISON_SHIELD_OPTION);
|
||||
export_constant(SC_M_LIFEPOTION);
|
||||
export_constant(SC_S_MANAPOTION);
|
||||
export_constant(SC_SUB_WEAPONPROPERTY);
|
||||
|
||||
#ifdef RENEWAL
|
||||
export_constant(SC_EXTREMITYFIST2);
|
||||
|
@ -7503,7 +7503,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
|
||||
clif_skill_nodamage (src,src,skill_id,skill_lv,1);
|
||||
// Initiate 20% of your damage becomes fire element.
|
||||
#ifdef RENEWAL
|
||||
sc_start4(src,src,SC_SUB_WEAPONPROPERTY,100,3,20,skill_id,0,skill_get_time2(skill_id, skill_lv));
|
||||
#else
|
||||
sc_start4(src,src,SC_WATK_ELEMENT,100,3,20,0,0,skill_get_time2(skill_id, skill_lv));
|
||||
#endif
|
||||
break;
|
||||
|
||||
case TK_JUMPKICK:
|
||||
@ -7570,7 +7574,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case HW_MAGICPOWER:
|
||||
case PF_MEMORIZE:
|
||||
case PA_SACRIFICE:
|
||||
#ifndef RENEWAL
|
||||
case ASC_EDP:
|
||||
#endif
|
||||
case PF_DOUBLECASTING:
|
||||
case SG_SUN_COMFORT:
|
||||
case SG_MOON_COMFORT:
|
||||
@ -7661,6 +7667,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
break;
|
||||
|
||||
#ifdef RENEWAL
|
||||
// EDP also give +25% WATK poison pseudo element to user.
|
||||
case ASC_EDP:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
sc_start4(src,src,SC_SUB_WEAPONPROPERTY,100,5,25,skill_id,0,skill_get_time2(skill_id, skill_lv));
|
||||
break;
|
||||
#endif
|
||||
|
||||
case LG_SHIELDSPELL:
|
||||
if (skill_lv == 1)
|
||||
type = SC_SHIELDSPELL_HP;
|
||||
|
@ -12319,6 +12319,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_DEEP_POISONING_OPTION:
|
||||
val3 = ELE_POISON;
|
||||
break;
|
||||
case SC_SUB_WEAPONPROPERTY:
|
||||
if (sd && val3 == ASC_EDP) {
|
||||
uint16 poison_level = pc_checkskill(sd, GC_RESEARCHNEWPOISON);
|
||||
|
||||
if (poison_level > 0) {
|
||||
tick += 30000; // Base of 30 seconds
|
||||
tick += poison_level * 15 * 1000; // Additional 15 seconds per level
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (calc_flag.none() && scdb->skill_id == 0 && scdb->icon == EFST_BLANK && scdb->opt1 == OPT1_NONE && scdb->opt2 == OPT2_NONE && scdb->state.none() && scdb->flag.none() && scdb->end.empty() && scdb->endreturn.empty() && scdb->fail.empty()) {
|
||||
|
@ -1229,6 +1229,8 @@ enum sc_type : int16 {
|
||||
SC_M_LIFEPOTION,
|
||||
SC_S_MANAPOTION,
|
||||
|
||||
SC_SUB_WEAPONPROPERTY,
|
||||
|
||||
#ifdef RENEWAL
|
||||
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user