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:
Joam 2022-07-21 16:29:42 +07:00 committed by GitHub
parent 78b4f4420d
commit e3cb3fa01f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 933 additions and 815 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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: |

View File

@ -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

View File

@ -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

View File

@ -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%

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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()) {

View File

@ -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