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 DropEffect: CLIENT
Script: | Script: |
.@rate = ((getrefine()>14)?15:10); .@rate = ((getrefine()>14)?15:10);
bonus2 bAddClass,Class_All,.@rate; bonus bAtkRate,.@rate;
bonus3 bAutoSpell,"SM_MAGNUM",10,15; bonus3 bAutoSpell,"SM_MAGNUM",10,15;
- Id: 4495 - Id: 4495
AegisName: Sealed_Amon_Ra_Card AegisName: Sealed_Amon_Ra_Card
@ -37112,7 +37112,7 @@ Body:
SubType: Enchant SubType: Enchant
Weight: 10 Weight: 10
Script: | 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 */ /* unknown rate */
- Id: 25702 - Id: 25702
AegisName: EP17_1_EVT35 AegisName: EP17_1_EVT35
@ -37130,7 +37130,7 @@ Body:
SubType: Enchant SubType: Enchant
Weight: 10 Weight: 10
Script: | 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 */ /* unknown rate */
- Id: 25704 - Id: 25704
AegisName: EP17_1_EVT37 AegisName: EP17_1_EVT37
@ -38245,7 +38245,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
bonus5 bAutoSpell,"SM_ENDURE",1,5,BF_SHORT,0; bonus5 bAutoSpell,"SM_ENDURE",1,5,BF_SHORT,0;
- Id: 27101 - Id: 27101
AegisName: SweetNightM_Card AegisName: SweetNightM_Card
@ -38960,7 +38960,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus bStr,4; bonus bStr,4;
bonus2 bAddClass,Class_All,4; bonus bAtkRate,4;
- Id: 27172 - Id: 27172
AegisName: Cowraiders3_Card AegisName: Cowraiders3_Card
Name: Scimitar Buffalo Bandit Card Name: Scimitar Buffalo Bandit Card
@ -39660,7 +39660,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
bonus bLongAtkRate,5; bonus bLongAtkRate,5;
- Id: 27257 - Id: 27257
AegisName: Kuro_Akuma_Card AegisName: Kuro_Akuma_Card
@ -39689,7 +39689,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
bonus bAspdRate,5; bonus bAspdRate,5;
- Id: 27259 - Id: 27259
AegisName: Rechenier_Card AegisName: Rechenier_Card
@ -39830,7 +39830,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
.@val = 10; .@val = 10;
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
if (getrefine() >= 10) { if (getrefine() >= 10) {
.@val += 5; .@val += 5;
} }
@ -40007,7 +40007,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
- Id: 27304 - Id: 27304
AegisName: E_EA2S_Card AegisName: E_EA2S_Card
Name: E EA2S Card Name: E EA2S Card
@ -40287,7 +40287,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
bonus bMaxHPRate,-50; bonus bMaxHPRate,-50;
bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_DemiHuman,30;
bonus2 bAddRace,RC_Player_Human,30; bonus2 bAddRace,RC_Player_Human,30;
@ -40371,7 +40371,7 @@ Body:
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus3 bAutoSpellWhenHit,"NPC_WIDECURSE",3,(1+.@r); 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; }"; autobonus3 "{ }",1000,5000,"NV_FIRSTAID","{ active_transform 3029,5000; }";
/* unknown rates */ /* unknown rates */
- Id: 27328 - Id: 27328
@ -40452,7 +40452,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,25; bonus bAtkRate,25;
bonus2 bSubRace,RC_Demon,-5; bonus2 bSubRace,RC_Demon,-5;
- Id: 27335 - Id: 27335
AegisName: Chaotic_Baphomet_Junior_Card AegisName: Chaotic_Baphomet_Junior_Card
@ -40710,7 +40710,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
- Id: 27355 - Id: 27355
AegisName: Contaminated_Raydric_Archer_Card AegisName: Contaminated_Raydric_Archer_Card
Name: Contaminated Raydric Archer Card Name: Contaminated Raydric Archer Card
@ -41473,7 +41473,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,4; bonus bAtkRate,4;
bonus bHit,10; bonus bHit,10;
- Id: 29062 - Id: 29062
AegisName: Mettle2 AegisName: Mettle2
@ -41482,7 +41482,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,8; bonus bAtkRate,8;
bonus bHit,20; bonus bHit,20;
- Id: 29063 - Id: 29063
AegisName: Mettle3 AegisName: Mettle3
@ -41491,7 +41491,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,12; bonus bAtkRate,12;
bonus bHit,30; bonus bHit,30;
- Id: 29064 - Id: 29064
AegisName: Mettle4 AegisName: Mettle4
@ -41500,7 +41500,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,16; bonus bAtkRate,16;
bonus bHit,40; bonus bHit,40;
- Id: 29065 - Id: 29065
AegisName: Mettle5 AegisName: Mettle5
@ -41509,7 +41509,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,20; bonus bAtkRate,20;
bonus bHit,50; bonus bHit,50;
- Id: 29066 - Id: 29066
AegisName: Mettle6 AegisName: Mettle6
@ -41518,7 +41518,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,24; bonus bAtkRate,24;
bonus bHit,60; bonus bHit,60;
- Id: 29067 - Id: 29067
AegisName: Mettle7 AegisName: Mettle7
@ -41527,7 +41527,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,28; bonus bAtkRate,28;
bonus bHit,70; bonus bHit,70;
- Id: 29068 - Id: 29068
AegisName: Mettle8 AegisName: Mettle8
@ -41536,7 +41536,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,32; bonus bAtkRate,32;
bonus bHit,80; bonus bHit,80;
- Id: 29069 - Id: 29069
AegisName: Mettle9 AegisName: Mettle9
@ -41545,7 +41545,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,36; bonus bAtkRate,36;
bonus bHit,90; bonus bHit,90;
- Id: 29070 - Id: 29070
AegisName: Mettle10 AegisName: Mettle10
@ -41554,7 +41554,7 @@ Body:
SubType: Enchant SubType: Enchant
Buy: 10 Buy: 10
Script: | Script: |
bonus2 bAddClass,Class_All,44; bonus bAtkRate,44;
bonus bHit,100; bonus bHit,100;
- Id: 29071 - Id: 29071
AegisName: MagicEessence1 AegisName: MagicEessence1
@ -43530,7 +43530,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
if (.@r>=7) { if (.@r>=7) {
bonus bBaseAtk,25; bonus bBaseAtk,25;
if (.@r>=9) { if (.@r>=9) {
@ -43694,7 +43694,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | 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 - Id: 29549
AegisName: Improve_Orb_L_DEX AegisName: Improve_Orb_L_DEX
Name: Modification Orb(Firing Shot) Name: Modification Orb(Firing Shot)
@ -43708,7 +43708,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | 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 - Id: 29551
AegisName: Improve_Orb_L_AGI AegisName: Improve_Orb_L_AGI
Name: Modification Orb(Fatal Flash) Name: Modification Orb(Fatal Flash)
@ -44124,7 +44124,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus bBaseAtk,2*(.@r/2); bonus bBaseAtk,2*(.@r/2);
bonus bHit,3*(.@r/2); bonus bHit,3*(.@r/2);
bonus2 bAddClass,Class_All,(.@r/5); bonus bAtkRate,(.@r/5);
- Id: 29673 - Id: 29673
AegisName: Time_Jewely_Str_2 AegisName: Time_Jewely_Str_2
Name: Temporal Jewel (STR) Lv 2 Name: Temporal Jewel (STR) Lv 2
@ -44134,7 +44134,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus bBaseAtk,4*(.@r/2); bonus bBaseAtk,4*(.@r/2);
bonus bHit,5*(.@r/2); bonus bHit,5*(.@r/2);
bonus2 bAddClass,Class_All,2*(.@r/5); bonus bAtkRate,2*(.@r/5);
- Id: 29674 - Id: 29674
AegisName: Time_Jewely_Str_3 AegisName: Time_Jewely_Str_3
Name: Temporal Jewel (STR) Lv 3 Name: Temporal Jewel (STR) Lv 3
@ -44144,7 +44144,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus bBaseAtk,7*(.@r/2); bonus bBaseAtk,7*(.@r/2);
bonus bHit,7*(.@r/2); bonus bHit,7*(.@r/2);
bonus2 bAddClass,Class_All,3*(.@r/5); bonus bAtkRate,3*(.@r/5);
- Id: 29675 - Id: 29675
AegisName: Time_Jewely_Agi_1 AegisName: Time_Jewely_Agi_1
Name: Temporal Jewel (AGI) Lv 1 Name: Temporal Jewel (AGI) Lv 1
@ -44244,7 +44244,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus2 bWeaponDamageRate,W_BOW,(.@r/2); bonus2 bWeaponDamageRate,W_BOW,(.@r/2);
bonus bHit,2*(.@r/2); bonus bHit,2*(.@r/2);
bonus2 bAddClass,Class_All,(.@r/5); bonus bAtkRate,(.@r/5);
- Id: 29685 - Id: 29685
AegisName: Time_Jewely_Dex_2 AegisName: Time_Jewely_Dex_2
Name: Temporal Jewel (DEX) Lv 2 Name: Temporal Jewel (DEX) Lv 2
@ -44254,7 +44254,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus2 bWeaponDamageRate,W_BOW,2*(.@r/2); bonus2 bWeaponDamageRate,W_BOW,2*(.@r/2);
bonus bHit,5*(.@r/2); bonus bHit,5*(.@r/2);
bonus2 bAddClass,Class_All,2*(.@r/5); bonus bAtkRate,2*(.@r/5);
- Id: 29686 - Id: 29686
AegisName: Time_Jewely_Dex_3 AegisName: Time_Jewely_Dex_3
Name: Temporal Jewel (DEX) Lv 3 Name: Temporal Jewel (DEX) Lv 3
@ -44264,7 +44264,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus2 bWeaponDamageRate,W_BOW,3*(.@r/2); bonus2 bWeaponDamageRate,W_BOW,3*(.@r/2);
bonus bHit,7*(.@r/2); bonus bHit,7*(.@r/2);
bonus2 bAddClass,Class_All,3*(.@r/5); bonus bAtkRate,3*(.@r/5);
- Id: 29687 - Id: 29687
AegisName: Time_Jewely_Luk_1 AegisName: Time_Jewely_Luk_1
Name: Temporal Jewel (LUK) Lv 1 Name: Temporal Jewel (LUK) Lv 1
@ -44274,7 +44274,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus bCritAtkRate,3*(.@r/2); bonus bCritAtkRate,3*(.@r/2);
bonus bCritical,(.@r/2); bonus bCritical,(.@r/2);
bonus2 bAddClass,Class_All,(.@r/5); bonus bAtkRate,(.@r/5);
- Id: 29688 - Id: 29688
AegisName: Time_Jewely_Luk_2 AegisName: Time_Jewely_Luk_2
Name: Temporal Jewel (LUK) Lv 2 Name: Temporal Jewel (LUK) Lv 2
@ -44284,7 +44284,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus bCritAtkRate,6*(.@r/2); bonus bCritAtkRate,6*(.@r/2);
bonus bCritical,2*(.@r/2); bonus bCritical,2*(.@r/2);
bonus2 bAddClass,Class_All,2*(.@r/5); bonus bAtkRate,2*(.@r/5);
- Id: 29689 - Id: 29689
AegisName: Time_Jewely_Luk_3 AegisName: Time_Jewely_Luk_3
Name: Temporal Jewel (LUK) Lv 3 Name: Temporal Jewel (LUK) Lv 3
@ -44294,7 +44294,7 @@ Body:
.@r = getequiprefinerycnt(EQI_HEAD_TOP); .@r = getequiprefinerycnt(EQI_HEAD_TOP);
bonus bCritAtkRate,9*(.@r/2); bonus bCritAtkRate,9*(.@r/2);
bonus bCritical,3*(.@r/2); bonus bCritical,3*(.@r/2);
bonus2 bAddClass,Class_All,3*(.@r/5); bonus bAtkRate,3*(.@r/5);
- Id: 29706 - Id: 29706
AegisName: Tenacity1 AegisName: Tenacity1
Name: Tenacity Lv1 Name: Tenacity Lv1
@ -44636,7 +44636,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
.@r = getrefine()/2; .@r = getrefine()/2;
bonus2 bAddClass,Class_All,1+.@r; bonus bAtkRate,1+.@r;
bonus bMatkRate,1+.@r; bonus bMatkRate,1+.@r;
bonus bMaxHPrate,-2*(1+.@r); bonus bMaxHPrate,-2*(1+.@r);
- Id: 31018 - Id: 31018
@ -44690,7 +44690,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus bAspdRate,10; bonus bAspdRate,10;
bonus2 bAddClass,Class_All,-3; bonus bAtkRate,-3;
- Id: 31022 - Id: 31022
AegisName: XM_Teddy_Bear_Card AegisName: XM_Teddy_Bear_Card
Name: Abandoned Teddy Bear Card Name: Abandoned Teddy Bear Card
@ -44729,7 +44729,7 @@ Body:
BuyingStore: true BuyingStore: true
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
bonus5 bAutoSpell,"RK_IGNITIONBREAK",5,20,BF_WEAPON,1; bonus5 bAutoSpell,"RK_IGNITIONBREAK",5,20,BF_WEAPON,1;
- Id: 31025 - Id: 31025
AegisName: As_Wind_Ghost_Card AegisName: As_Wind_Ghost_Card
@ -44966,7 +44966,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus bUnbreakableArmor; bonus bUnbreakableArmor;
bonus2 bAddClass,Class_All,30; bonus bAtkRate,30;
bonus bMaxHPrate,-15; bonus bMaxHPrate,-15;
- Id: 300014 - Id: 300014
AegisName: Ingrid_Card AegisName: Ingrid_Card
@ -44980,7 +44980,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus bUnbreakableArmor; bonus bUnbreakableArmor;
bonus2 bAddClass,Class_All,-15; bonus bAtkRate,-15;
bonus bMaxHPrate,40; bonus bMaxHPrate,40;
bonus2 bHPLossRate,1000,4000; bonus2 bHPLossRate,1000,4000;
UnEquipScript: | UnEquipScript: |
@ -44998,10 +44998,10 @@ Body:
BuyingStore: true BuyingStore: true
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
bonus bMaxHPrate,-5; bonus bMaxHPrate,-5;
bonus bMaxSPrate,-5; bonus bMaxSPrate,-5;
bonus2 bAddClass,Class_All,(getrefine()/4); bonus bAtkRate,(getrefine()/4);
- Id: 300016 - Id: 300016
AegisName: Treasure_Mimic_Card AegisName: Treasure_Mimic_Card
Name: Treasure Mimic Card Name: Treasure Mimic Card
@ -45274,7 +45274,7 @@ Body:
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_VIEW) == W_BOOK) { if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_VIEW) == W_BOOK) {
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
bonus bHit,20; bonus bHit,20;
} }
bonus bShortAtkRate,.@r; bonus bShortAtkRate,.@r;
@ -46073,7 +46073,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus bMaxHPrate,-5; bonus bMaxHPrate,-5;
bonus2 bAddClass,Class_All,(getrefine()/3); bonus bAtkRate,(getrefine()/3);
- Id: 300151 - Id: 300151
AegisName: ILL_Kraken_Card AegisName: ILL_Kraken_Card
Name: Deep Sea Kraken Card Name: Deep Sea Kraken Card
@ -46285,7 +46285,7 @@ Body:
Flags: Flags:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
bonus bLongAtkRate,7; bonus bLongAtkRate,7;
- Id: 300185 - Id: 300185
AegisName: MD_Geffen_Akuma_Card AegisName: MD_Geffen_Akuma_Card
@ -46794,7 +46794,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
if (BaseJob == JOB_NOVICE) { if (BaseJob == JOB_NOVICE) {
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
bonus bMaxHP,1500; bonus bMaxHP,1500;
} }
- Id: 300243 - Id: 300243
@ -47121,7 +47121,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
.@r = getrefine(); .@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) { 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); bonus bShortAtkRate,10+2*(.@r/3);
if (BaseLevel>=200) { if (BaseLevel>=200) {
@ -47139,7 +47139,7 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
.@r = getrefine(); .@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) { if (getiteminfo(getequipid(EQI_HAND_R),11) == W_1HSPEAR || getiteminfo(getequipid(EQI_HAND_R),11) == W_2HSPEAR) {
bonus bLongAtkRate,10+2*(.@r/3); bonus bLongAtkRate,10+2*(.@r/3);
if (BaseLevel>=200) { if (BaseLevel>=200) {
@ -47276,9 +47276,9 @@ Body:
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus2 bAddClass,Class_All,-10+3*(.@r/3); bonus bAtkRate,-10+3*(.@r/3);
if (.@r>=11) { if (.@r>=11) {
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
} }
- Id: 300275 - Id: 300275
AegisName: aegis_300275 AegisName: aegis_300275
@ -47883,12 +47883,12 @@ Body:
.@r = getrefine(); .@r = getrefine();
if (getrefine() < 12) { if (getrefine() < 12) {
bonus bMaxHPrate,-30; bonus bMaxHPrate,-30;
bonus2 bAddClass,Class_All,-10; bonus bAtkRate,-10;
bonus bMatkRate,-10; bonus bMatkRate,-10;
} }
else { else {
bonus bMaxHPrate,30; bonus bMaxHPrate,30;
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
bonus bMatkRate,10; bonus bMatkRate,10;
} }
if (getequiparmorlv() == 2) { if (getequiparmorlv() == 2) {
@ -47907,7 +47907,7 @@ Body:
BuyingStore: true BuyingStore: true
DropEffect: CLIENT DropEffect: CLIENT
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
bonus bMatkRate,5; bonus bMatkRate,5;
.@r = getrefine(); .@r = getrefine();
bonus bPAtk,2*(.@r/3); bonus bPAtk,2*(.@r/3);
@ -48102,7 +48102,7 @@ Body:
bonus bStr,10; bonus bStr,10;
bonus bMdef,3; bonus bMdef,3;
bonus bDef,25; bonus bDef,25;
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
- Id: 310077 - Id: 310077
AegisName: Cassock_Agi AegisName: Cassock_Agi
Name: AGI Blessing Name: AGI Blessing
@ -48205,7 +48205,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
bonus bStr,3; bonus bStr,3;
- Id: 310087 - Id: 310087
AegisName: Automatic_Orb6 AegisName: Automatic_Orb6
@ -48328,7 +48328,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
bonus bBaseAtk,75; bonus bBaseAtk,75;
if (.@r>=9) { if (.@r>=9) {
bonus bShortAtkRate,2; bonus bShortAtkRate,2;
@ -48569,13 +48569,13 @@ Body:
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus bMatkRate,3; bonus bMatkRate,3;
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
if (.@r>=9) { if (.@r>=9) {
bonus bMatkRate,3; bonus bMatkRate,3;
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
if (.@r>=11) { if (.@r>=11) {
bonus bMatkRate,4; bonus bMatkRate,4;
bonus2 bAddClass,Class_All,4; bonus bAtkRate,4;
} }
} }
- Id: 310118 - Id: 310118
@ -48653,7 +48653,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | 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 - Id: 310125
AegisName: Automatic_Orb44 AegisName: Automatic_Orb44
Name: Automatic Orb(Fatal Flash) Name: Automatic Orb(Fatal Flash)
@ -49653,35 +49653,35 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,1; bonus bAtkRate,1;
- Id: 310198 - Id: 310198
AegisName: aegis_310198 AegisName: aegis_310198
Name: Anger Lv2 Name: Anger Lv2
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
- Id: 310199 - Id: 310199
AegisName: aegis_310199 AegisName: aegis_310199
Name: Anger Lv3 Name: Anger Lv3
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
- Id: 310200 - Id: 310200
AegisName: aegis_310200 AegisName: aegis_310200
Name: Anger Lv4 Name: Anger Lv4
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,7; bonus bAtkRate,7;
- Id: 310201 - Id: 310201
AegisName: aegis_310201 AegisName: aegis_310201
Name: Anger Lv5 Name: Anger Lv5
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
- Id: 310202 - Id: 310202
AegisName: aegis_310202 AegisName: aegis_310202
Name: Horror Lv1 Name: Horror Lv1
@ -49798,35 +49798,35 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,1; bonus bAtkRate,1;
- Id: 310218 - Id: 310218
AegisName: aegis_310218 AegisName: aegis_310218
Name: Empathy Lv2 Name: Empathy Lv2
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
- Id: 310219 - Id: 310219
AegisName: aegis_310219 AegisName: aegis_310219
Name: Empathy Lv3 Name: Empathy Lv3
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
- Id: 310220 - Id: 310220
AegisName: aegis_310220 AegisName: aegis_310220
Name: Empathy Lv4 Name: Empathy Lv4
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,7; bonus bAtkRate,7;
- Id: 310221 - Id: 310221
AegisName: aegis_310221 AegisName: aegis_310221
Name: Empathy Lv5 Name: Empathy Lv5
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
- Id: 310222 - Id: 310222
AegisName: aegis_310222 AegisName: aegis_310222
Name: Happiness Lv1 Name: Happiness Lv1
@ -50675,7 +50675,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
bonus bBaseAtk,25; bonus bBaseAtk,25;
if (.@r>=7) { if (.@r>=7) {
bonus bShortAtkRate,3; bonus bShortAtkRate,3;
@ -50728,7 +50728,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus2 bAddClass,Class_All,4; bonus bAtkRate,4;
bonus bBaseAtk,50; bonus bBaseAtk,50;
if (.@r>=7) { if (.@r>=7) {
bonus bShortAtkRate,3; bonus bShortAtkRate,3;
@ -50781,7 +50781,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus2 bAddClass,Class_All,6; bonus bAtkRate,6;
bonus bBaseAtk,100; bonus bBaseAtk,100;
if (.@r>=7) { if (.@r>=7) {
bonus bShortAtkRate,5; bonus bShortAtkRate,5;
@ -50869,16 +50869,16 @@ Body:
Script: | Script: |
.@r = getrefine(); .@r = getrefine();
bonus bMatkRate,2; bonus bMatkRate,2;
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
if (.@r>=7) { if (.@r>=7) {
bonus bMatkRate,2; bonus bMatkRate,2;
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
if (.@r>=9) { if (.@r>=9) {
bonus bMatkRate,2; bonus bMatkRate,2;
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
if (.@r>=11) { if (.@r>=11) {
bonus bMatkRate,4; bonus bMatkRate,4;
bonus2 bAddClass,Class_All,4; bonus bAtkRate,4;
} }
} }
} }
@ -52729,7 +52729,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | 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 - Id: 310610
AegisName: Wolf_Orb_Sp_Int AegisName: Wolf_Orb_Sp_Int
Name: Wolf Orb (Spell Buster) Name: Wolf Orb (Spell Buster)
@ -53613,7 +53613,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
bonus bHit,10; bonus bHit,10;
- Id: 310693 - Id: 310693
AegisName: Star_Of_Mettle2 AegisName: Star_Of_Mettle2
@ -53621,7 +53621,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
bonus bHit,15; bonus bHit,15;
- Id: 310694 - Id: 310694
AegisName: Star_Of_Mettle3 AegisName: Star_Of_Mettle3
@ -53629,7 +53629,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,7; bonus bAtkRate,7;
bonus bHit,20; bonus bHit,20;
bonus bPAtk,1; bonus bPAtk,1;
- Id: 310695 - Id: 310695
@ -53638,7 +53638,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
bonus bHit,25; bonus bHit,25;
bonus bPAtk,2; bonus bPAtk,2;
- Id: 310696 - Id: 310696
@ -53647,7 +53647,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,15; bonus bAtkRate,15;
bonus bHit,30; bonus bHit,30;
bonus bPAtk,4; bonus bPAtk,4;
- Id: 310697 - Id: 310697
@ -53657,7 +53657,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus bLongAtkRate,2; bonus bLongAtkRate,2;
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
- Id: 310698 - Id: 310698
AegisName: Star_Of_MasterArcher2 AegisName: Star_Of_MasterArcher2
Name: Star of Master Archer Lv2 Name: Star of Master Archer Lv2
@ -53665,7 +53665,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus bLongAtkRate,3; bonus bLongAtkRate,3;
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
- Id: 310699 - Id: 310699
AegisName: Star_Of_MasterArcher3 AegisName: Star_Of_MasterArcher3
Name: Star of Master Archer Lv3 Name: Star of Master Archer Lv3
@ -53673,7 +53673,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus bLongAtkRate,5; bonus bLongAtkRate,5;
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
bonus bPAtk,1; bonus bPAtk,1;
- Id: 310700 - Id: 310700
AegisName: Star_Of_MasterArcher4 AegisName: Star_Of_MasterArcher4
@ -53682,7 +53682,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus bLongAtkRate,7; bonus bLongAtkRate,7;
bonus2 bAddClass,Class_All,6; bonus bAtkRate,6;
bonus bPAtk,2; bonus bPAtk,2;
- Id: 310701 - Id: 310701
AegisName: Star_Of_MasterArcher5 AegisName: Star_Of_MasterArcher5
@ -53691,7 +53691,7 @@ Body:
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus bLongAtkRate,10; bonus bLongAtkRate,10;
bonus2 bAddClass,Class_All,7; bonus bAtkRate,7;
bonus bPAtk,4; bonus bPAtk,4;
- Id: 310702 - Id: 310702
AegisName: Star_Of_Sharp1 AegisName: Star_Of_Sharp1
@ -54539,14 +54539,14 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | 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 - Id: 310914
AegisName: HeroInsignia_STR AegisName: HeroInsignia_STR
Name: Strength Name: Strength
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
- Id: 310915 - Id: 310915
AegisName: HeroInsignia_LUK AegisName: HeroInsignia_LUK
Name: Luck Name: Luck
@ -55057,14 +55057,14 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,3; bonus bAtkRate,3;
- Id: 310987 - Id: 310987
AegisName: ATK_2Lv AegisName: ATK_2Lv
Name: ATK 2Lv Name: ATK 2Lv
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,5; bonus bAtkRate,5;
- Id: 310988 - Id: 310988
AegisName: MATK_1Lv AegisName: MATK_1Lv
Name: MATK 1Lv Name: MATK 1Lv
@ -55268,7 +55268,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,15+5*getenchantgrade(); bonus bAtkRate,15+5*getenchantgrade();
- Id: 311017 - Id: 311017
AegisName: Gear_MATK AegisName: Gear_MATK
Name: Clockwork (Matk) Name: Clockwork (Matk)
@ -56407,7 +56407,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,6; bonus bAtkRate,6;
bonus bBaseAtk,100; bonus bBaseAtk,100;
.@r = getrefine(); .@r = getrefine();
if (.@r >= 7) { if (.@r >= 7) {
@ -56425,7 +56425,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,6; bonus bAtkRate,6;
bonus bBaseAtk,100; bonus bBaseAtk,100;
.@r = getrefine(); .@r = getrefine();
if (.@r >= 7) { if (.@r >= 7) {
@ -56478,17 +56478,17 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | Script: |
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
bonus bMatkRate,2; bonus bMatkRate,2;
.@r = getrefine(); .@r = getrefine();
if (.@r >= 7) { if (.@r >= 7) {
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
bonus bMatkRate,2; bonus bMatkRate,2;
if (.@r >= 9) { if (.@r >= 9) {
bonus2 bAddClass,Class_All,2; bonus bAtkRate,2;
bonus bMatkRate,2; bonus bMatkRate,2;
if (.@r >= 11) { if (.@r >= 11) {
bonus2 bAddClass,Class_All,4; bonus bAtkRate,4;
bonus bMatkRate,4; bonus bMatkRate,4;
} }
} }
@ -56765,7 +56765,7 @@ Body:
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: | 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 - Id: 311121
AegisName: Ice_F_Orb_Sp_Int AegisName: Ice_F_Orb_Sp_Int
Name: Ice Magic Orb (Spell Buster) Name: Ice Magic Orb (Spell Buster)
@ -60074,7 +60074,7 @@ Body:
bonus bLongAtkRate,5*(.@r/3); bonus bLongAtkRate,5*(.@r/3);
bonus bShortAtkRate,5*(.@r/3); bonus bShortAtkRate,5*(.@r/3);
if (.@r>=9) { if (.@r>=9) {
bonus2 bAddClass,Class_All,10; bonus bAtkRate,10;
if (.@r>=11 ) { if (.@r>=11 ) {
bonus bPAtk,5; bonus bPAtk,5;
.@i = getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_VIEW); .@i = getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_VIEW);

View File

@ -83,7 +83,7 @@ Body:
- Id: 13 - Id: 13
Option: VAR_ATKPERCENT Option: VAR_ATKPERCENT
Script: | Script: |
bonus2 bAddClass,Class_All,getrandomoptinfo(ROA_VALUE); bonus bAtkRate,getrandomoptinfo(ROA_VALUE);
- Id: 14 - Id: 14
Option: VAR_MAGICATKPERCENT Option: VAR_MAGICATKPERCENT
Script: | Script: |

View File

@ -42468,7 +42468,7 @@ Body:
- Level: 10 - Level: 10
Amount: 16 Amount: 16
SpCost: 30 SpCost: 30
Status: Watk_Element Status: Sub_Weaponproperty
- Id: 8203 - Id: 8203
Name: MS_BOWLINGBASH Name: MS_BOWLINGBASH
Description: Bowling_Bash Description: Bowling_Bash

View File

@ -8157,3 +8157,12 @@ Body:
NoClearance: true NoClearance: true
Fail: Fail:
S_Manapotion: true 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 bBaseAtk,n; Basic attack power + n
bonus bAtk,n; ATK + n (unofficial) bonus bAtk,n; ATK + n (unofficial)
bonus bAtk2,n; ATK2 + n 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 bWeaponAtkRate,n; Weapon ATK + n%
bonus bMatk,n; Magical attack power + n bonus bMatk,n; Magical attack power + n
bonus bMatkRate,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_] + 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; 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] 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; cardfix = cardfix * (100 + (10 + 2 * skill)) / 100;
#endif
} }
//! CHECKME: These right & left hand weapon ignores 'left_cardfix_to_right'? //! 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 * @param sd Player
* @return Base weapon damage * @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); struct status_data *status = status_get_status_data(src);
uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R; 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)); atkmin = max(0, (int)(atkmin - variance + base_stat_bonus));
atkmax = min(UINT16_MAX, (int)(atkmax + 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; damage = atkmax;
else else
damage = rnd_value(atkmin, atkmax); 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 *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target); struct status_data *tstatus = status_get_status_data(target);
struct map_session_data *sd = BL_CAST(BL_PC, src); 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 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); 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->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); // Check critical
wd->weaponAtk = battle_attr_fix(src, target, wd->weaponAtk, right_element, tstatus->def_ele, tstatus->ele_lv); 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->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); 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_calc_equip_attack(src, skill_id);
wd->equipAtk2 = battle_attr_fix(src, target, wd->equipAtk2, left_element, tstatus->def_ele, tstatus->ele_lv); 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 //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 //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); 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) { if(sd) {
int skill; 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 #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] 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); 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 #ifdef RENEWAL
default: // fall through to apply EDP bonuses default: // fall through to apply EDP bonuses
// Renewal EDP formula [helvetica] // Renewal EDP formula [helvetica]
// weapon atk * (1 + (edp level * .8)) // weapon atk * (2.5 + (edp level * .3))
// equip atk * (1 + (edp level * .6)) // equip atk * (2.5 + (edp level * .3))
ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 100 + (sc->data[SC_EDP]->val1 * 80)); ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 250 + (sc->data[SC_EDP]->val1 * 30));
ATK_RATE(wd->equipAtk, wd->equipAtk2, 100 + (sc->data[SC_EDP]->val1 * 60)); ATK_RATE(wd->equipAtk, wd->equipAtk2, 250 + (sc->data[SC_EDP]->val1 * 30));
break; break;
#else #else
default: 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) } 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); skill = pc_checkskill(sd,TF_DOUBLE);
wd->damage2 = (int64)wd->damage * (1 + (skill * 2))/100; 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 } else if(is_attack_right_handed(src, skill_id) && is_attack_left_handed(src, skill_id)) { //Dual-wield
#endif
if (wd->damage) { if (wd->damage) {
if( (sd->class_&MAPID_BASEMASK) == MAPID_THIEF ) { if( (sd->class_&MAPID_BASEMASK) == MAPID_THIEF ) {
skill = pc_checkskill(sd,AS_RIGHT); 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); wd->damage2 = battle_calc_bg_damage(src,target,wd->damage2,skill_id,wd->flag);
} }
else { else {
int64 d1 = wd->damage + wd->damage2,d2 = wd->damage2; wd->damage = battle_calc_damage(src, target, wd, wd->damage, skill_id, skill_lv);
wd->damage = battle_calc_damage(src,target,wd,d1,skill_id,skill_lv); wd->damage2 = battle_calc_damage(src, target, wd, wd->damage2, skill_id, skill_lv);
if( mapdata_flag_gvg2(mapdata) ) if (mapdata_flag_gvg2(mapdata)) {
wd->damage = battle_calc_gvg_damage(src,target,wd->damage,skill_id,wd->flag); wd->damage = battle_calc_gvg_damage(src, target, wd->damage, skill_id, wd->flag);
else if( mapdata->flag[MF_BATTLEGROUND] ) wd->damage2 = battle_calc_gvg_damage(src, target, wd->damage2, skill_id, wd->flag);
wd->damage = battle_calc_bg_damage(src,target,wd->damage,skill_id,wd->flag); }
wd->damage2 = (int64)d2*100/d1 * wd->damage/100; 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; 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 = wd.damage = wd.damage2 =
#ifdef RENEWAL #ifdef RENEWAL
wd.statusAtk = wd.statusAtk2 = wd.equipAtk = wd.equipAtk2 = wd.weaponAtk = wd.weaponAtk2 = wd.masteryAtk = wd.masteryAtk2 = wd.statusAtk = wd.statusAtk2 = wd.equipAtk = wd.equipAtk2 = wd.weaponAtk = wd.weaponAtk2 = wd.masteryAtk = wd.masteryAtk2 =
wd.percentAtk = wd.percentAtk2 =
#endif #endif
0; 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)) if(!is_attack_hitting(&wd, src, target, skill_id, skill_lv, true))
wd.dmg_lv = ATK_FLEE; wd.dmg_lv = ATK_FLEE;
else if(!(infdef = is_infinite_defense(target, wd.flag))) { //no need for math against plants 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 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 ratio = battle_calc_attack_skill_ratio(&wd, src, target, skill_id, skill_lv); // skill level ratios
ATK_RATE(wd.damage, wd.damage2, ratio); 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 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); ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min);
} }
#endif #endif
int i = 0;
#ifndef RENEWAL
// add any miscellaneous player ATK bonuses // 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); 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); ATK_ADDRATE(wd.damage, wd.damage2, -i);
RE_ALLATK_ADDRATE(&wd, -i); #endif
}
#ifdef RENEWAL #ifdef RENEWAL
// In Renewal we only cardfix to the weapon and equip ATK // 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); battle_attack_sc_bonus(&wd, src, target, skill_id, skill_lv);
if (sd) { //monsters, homuns and pets have their damage computed directly 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)) 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) if (wd.flag & BF_SHORT)
ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.short_attack_atk_rate); 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 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); 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 // Res reduces physical damage by a percentage and
// is calculated before DEF and other reductions. // is calculated before DEF and other reductions.
// This should be the official formula. [Rytech] // 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.damage = wd.damage * (5000 + res) / (5000 + 10 * res);
wd.damage2 = wd.damage2 * (5000 + res) / (5000 + 10 * res); wd.damage2 = wd.damage2 * (5000 + res) / (5000 + 10 * res);
} }
#else #else
// final attack bonuses that aren't affected by cards // final attack bonuses that aren't affected by cards
battle_attack_sc_bonus(&wd, src, target, skill_id, skill_lv); 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); 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); 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 #ifdef RENEWAL
if (is_attack_critical(&wd, src, target, skill_id, skill_lv, false)) { 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 (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 * (1.4f + (0.01f * sstatus->crate)))));
wd.damage = (int64)floor((float)((wd.damage * (140 + sstatus->crate)) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100); if (is_attack_left_handed(src, skill_id))
else wd.damage2 = (int64)floor((float)((wd.damage2 * (1.4f + (0.01f * sstatus->crate)))));
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);
}
} else } 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); ATK_ADDRATE(wd.damage, wd.damage2, -tsd->bonus.crit_def_rate);
}
} }
#endif #endif

View File

@ -72,7 +72,7 @@ enum e_battle_check_target : uint32 {
/// Damage structure /// Damage structure
struct Damage { struct Damage {
#ifdef RENEWAL #ifdef RENEWAL
int64 statusAtk, statusAtk2, weaponAtk, weaponAtk2, equipAtk, equipAtk2, masteryAtk, masteryAtk2; int64 statusAtk, statusAtk2, weaponAtk, weaponAtk2, equipAtk, equipAtk2, masteryAtk, masteryAtk2, percentAtk, percentAtk2;
#endif #endif
int64 damage, /// Right hand damage int64 damage, /// Right hand damage
damage2; /// Left hand damage damage2; /// Left hand damage

View File

@ -1842,6 +1842,7 @@
export_constant(SC_POISON_SHIELD_OPTION); export_constant(SC_POISON_SHIELD_OPTION);
export_constant(SC_M_LIFEPOTION); export_constant(SC_M_LIFEPOTION);
export_constant(SC_S_MANAPOTION); export_constant(SC_S_MANAPOTION);
export_constant(SC_SUB_WEAPONPROPERTY);
#ifdef RENEWAL #ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2); 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); src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id);
clif_skill_nodamage (src,src,skill_id,skill_lv,1); clif_skill_nodamage (src,src,skill_id,skill_lv,1);
// Initiate 20% of your damage becomes fire element. // 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)); sc_start4(src,src,SC_WATK_ELEMENT,100,3,20,0,0,skill_get_time2(skill_id, skill_lv));
#endif
break; break;
case TK_JUMPKICK: 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 HW_MAGICPOWER:
case PF_MEMORIZE: case PF_MEMORIZE:
case PA_SACRIFICE: case PA_SACRIFICE:
#ifndef RENEWAL
case ASC_EDP: case ASC_EDP:
#endif
case PF_DOUBLECASTING: case PF_DOUBLECASTING:
case SG_SUN_COMFORT: case SG_SUN_COMFORT:
case SG_MOON_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))); sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
break; 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: case LG_SHIELDSPELL:
if (skill_lv == 1) if (skill_lv == 1)
type = SC_SHIELDSPELL_HP; 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: case SC_DEEP_POISONING_OPTION:
val3 = ELE_POISON; val3 = ELE_POISON;
break; 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: 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()) { 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_M_LIFEPOTION,
SC_S_MANAPOTION, SC_S_MANAPOTION,
SC_SUB_WEAPONPROPERTY,
#ifdef RENEWAL #ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
#endif #endif