Job Improvement Project - Rune Knight (Part 2) (#4709)
* Fixes #4708. * kRO Changelog: http://ro.gnjoy.com/news/update/View.asp?seq=243&curpage=1 Thanks to @ecdarreola, @Litro, @Haydrich, and @LordWhiplash!
This commit is contained in:
parent
d1e5127728
commit
44e5c5bcc7
@ -7044,23 +7044,23 @@
|
||||
//===================================================================
|
||||
// Rune Knight's Rune Stones
|
||||
//===================================================================
|
||||
12725,Runstone_Nosiege,Nauthiz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_REFRESH",1; },{},{}
|
||||
12726,Runstone_Rhydo,Raido Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_CRUSHSTRIKE",1; },{},{}
|
||||
12727,Runstone_Verkana,Berkana Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_MILLENNIUMSHIELD",1; },{},{}
|
||||
12728,Runstone_Isia,Isa Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_VITALITYACTIVATION",1; },{},{}
|
||||
12729,Runstone_Asir,Othila Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_FIGHTINGSPIRIT",1; },{},{}
|
||||
12730,Runstone_Urj,Uruz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_ABUNDANCE",1; },{},{}
|
||||
12731,Runstone_Turisus,Thurisaz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_GIANTGROWTH",1; },{},{}
|
||||
12732,Runstone_Pertz,Wyrd Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STORMBLAST",1; },{},{}
|
||||
12733,Runstone_Hagalas,Hagalaz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STONEHARDSKIN",1; },{},{}
|
||||
12725,Runstone_Nosiege,Nauthiz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_REFRESH",1; },{},{}
|
||||
12726,Runstone_Rhydo,Raido Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_CRUSHSTRIKE",1; },{},{}
|
||||
12727,Runstone_Verkana,Berkana Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_MILLENNIUMSHIELD",1; },{},{}
|
||||
12728,Runstone_Isia,Isa Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_VITALITYACTIVATION",1; },{},{}
|
||||
12729,Runstone_Asir,Othila Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_FIGHTINGSPIRIT",1; },{},{}
|
||||
12730,Runstone_Urj,Uruz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_ABUNDANCE",1; },{},{}
|
||||
12731,Runstone_Turisus,Thurisaz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_GIANTGROWTH",1; },{},{}
|
||||
12732,Runstone_Pertz,Wyrd Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STORMBLAST",1; },{},{}
|
||||
12733,Runstone_Hagalas,Hagalaz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STONEHARDSKIN",1; },{},{}
|
||||
//===================================================================
|
||||
// Rune Knight Rune Ores
|
||||
//===================================================================
|
||||
12734,Runstone_Quality,Luxurious Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 5; },{},{}
|
||||
12735,Runstone_Ancient,Ancient Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 11; },{},{}
|
||||
12736,Runstone_Mystic,Mystic Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 14; },{},{}
|
||||
12737,Runstone_Ordinary,General Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 2; },{},{}
|
||||
12738,Runstone_Rare,Rare Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 8; },{},{}
|
||||
12734,Runstone_Quality,Luxurious Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 8; },{},{}
|
||||
12735,Runstone_Ancient,Ancient Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 30; },{},{}
|
||||
12736,Runstone_Mystic,Mystic Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 60; },{},{}
|
||||
12737,Runstone_Ordinary,General Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 4; },{},{}
|
||||
12738,Runstone_Rare,Rare Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 15; },{},{}
|
||||
//===================================================================
|
||||
// More usable items
|
||||
//===================================================================
|
||||
@ -11371,7 +11371,7 @@
|
||||
22536,WorkerScroll_B,Scroll Summoning Workers(Female),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{}
|
||||
22537,PrizeOfHero,Prize Of Hero,2,0,,100,,,,0,0xFFFFFFFF,63,2,,,1,,,{ getrandgroupitem(IG_PrizeOfHero,1); },{},{}
|
||||
22538,Hanbok_bag,Hanbok bag,2,0,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_HANBOK,600000,0; },{},{}
|
||||
22540,Runstone_Lux,Lux Anima Runestone,11,2,,100,,,,,0xFFFFFFFF,56,2,,,,,,{ itemskill "RK_LUXANIMA",1; },{},{}
|
||||
22540,Runstone_Lux,Lux Anima Runestone,11,2,,10,,,,,0xFFFFFFFF,56,2,,,,,,{ itemskill "RK_LUXANIMA",1; },{},{}
|
||||
22541,PC_Room_Coupon_Box_VI,PC Room Coupon Box VI,18,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{}
|
||||
22542,Center_Potion_B,Concentration Potion,2,10,,100,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{}
|
||||
22543,Berserk_Potion_B,Berserk Potion,2,10,,200,,,,0,0x6,63,2,,,,,,{ sc_start SC_ASPDPOTION2,1800000,9; },{},{}
|
||||
|
@ -99,6 +99,8 @@
|
||||
//12207,60000 //Vit_Dish10_
|
||||
22508,1200000 //Para_Team_Mark_
|
||||
|
||||
22540,5000,SC_REUSE_LIMIT_LUXANIMA //Runstone_Lux
|
||||
|
||||
// Bed of Honor
|
||||
22687,5000,SC_REUSE_LIMIT_F // Pieces_Of_Sentiment
|
||||
|
||||
|
@ -17,14 +17,5 @@
|
||||
// Example:
|
||||
// 512,4,12 // Will not allow more than 4 Apples in storages.
|
||||
|
||||
// Rune Knight
|
||||
12725,60,1 // Nauthiz Rune
|
||||
12726,60,1 // Raido Rune
|
||||
12727,60,1 // Berkana Rune
|
||||
12728,60,1 // Isa Rune
|
||||
12730,60,1 // Uruz Rune
|
||||
12733,60,1 // Hagalaz Rune
|
||||
22540,60,1 // Lux Anima Rune
|
||||
|
||||
// Arch Bishop
|
||||
12333,3,1 // Ancilla
|
||||
|
@ -17392,6 +17392,8 @@ Body:
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
Critical: true
|
||||
Range:
|
||||
- Level: 1
|
||||
Size: 7
|
||||
@ -17488,10 +17490,33 @@ Body:
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
TargetType: Attack
|
||||
Range: 5
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Range: 7
|
||||
Hit: Multi_Hit
|
||||
HitCount: -5
|
||||
Element: Weapon
|
||||
SplashArea:
|
||||
- Level: 1
|
||||
Area: 1
|
||||
- Level: 2
|
||||
Area: 1
|
||||
- Level: 3
|
||||
Area: 1
|
||||
- Level: 4
|
||||
Area: 1
|
||||
- Level: 5
|
||||
Area: 2
|
||||
- Level: 6
|
||||
Area: 2
|
||||
- Level: 7
|
||||
Area: 2
|
||||
- Level: 8
|
||||
Area: 2
|
||||
- Level: 9
|
||||
Area: 3
|
||||
- Level: 10
|
||||
Area: 3
|
||||
CastTime:
|
||||
- Level: 1
|
||||
Time: 1000
|
||||
@ -17526,33 +17551,50 @@ Body:
|
||||
Description: Wind Cutter
|
||||
MaxLevel: 5
|
||||
Type: Weapon
|
||||
TargetType: Ground
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Range: 1
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Wind
|
||||
SplashArea: 2
|
||||
Knockback: 3
|
||||
Element: Weapon
|
||||
SplashArea:
|
||||
- Level: 1
|
||||
Area: 1
|
||||
- Level: 2
|
||||
Area: 1
|
||||
- Level: 3
|
||||
Area: 2
|
||||
- Level: 4
|
||||
Area: 2
|
||||
- Level: 5
|
||||
Area: 3
|
||||
CopyFlags:
|
||||
Skill:
|
||||
Reproduce: true
|
||||
Duration1: 15000
|
||||
Cooldown: 2000
|
||||
FixedCastTime: -1
|
||||
AfterCastActDelay: 1000
|
||||
Cooldown:
|
||||
- Level: 1
|
||||
Time: 800
|
||||
- Level: 2
|
||||
Time: 650
|
||||
- Level: 3
|
||||
Time: 500
|
||||
- Level: 4
|
||||
Time: 350
|
||||
- Level: 5
|
||||
Time: 200
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
Amount: 20
|
||||
Amount: 34
|
||||
- Level: 2
|
||||
Amount: 24
|
||||
Amount: 38
|
||||
- Level: 3
|
||||
Amount: 28
|
||||
Amount: 42
|
||||
- Level: 4
|
||||
Amount: 32
|
||||
Amount: 46
|
||||
- Level: 5
|
||||
Amount: 36
|
||||
Amount: 50
|
||||
Weapon:
|
||||
Dagger: true
|
||||
1hSword: true
|
||||
@ -17567,6 +17609,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Critical: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
@ -17717,7 +17760,7 @@ Body:
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
AfterCastActDelay: 1000
|
||||
Duration1: 180000
|
||||
Duration1: 900000
|
||||
Duration2: 60000
|
||||
FixedCastTime: -1
|
||||
Requires:
|
||||
@ -17770,7 +17813,7 @@ Body:
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1: 180000
|
||||
Duration1: 900000
|
||||
FixedCastTime: 1000
|
||||
CastTimeFlags:
|
||||
IgnoreDex: true
|
||||
@ -17788,7 +17831,7 @@ Body:
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1: 180000
|
||||
Duration1: 900000
|
||||
Duration2: 10000
|
||||
FixedCastTime: 2000
|
||||
CastTimeFlags:
|
||||
@ -17807,7 +17850,7 @@ Body:
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1: 180000
|
||||
Duration1: 900000
|
||||
FixedCastTime: -1
|
||||
Requires:
|
||||
SpCost: 1
|
||||
@ -17819,13 +17862,13 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Critical: true
|
||||
Flags:
|
||||
TargetTrap: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
SplashArea: 3
|
||||
Knockback: 7
|
||||
CastTime: 2000
|
||||
FixedCastTime: -1
|
||||
Requires:
|
||||
@ -17840,9 +17883,8 @@ Body:
|
||||
Splash: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
SplashArea: -1
|
||||
CastCancel: true
|
||||
Duration1: 180000
|
||||
Duration1: 900000
|
||||
FixedCastTime: -1
|
||||
Requires:
|
||||
SpCost: 1
|
||||
@ -17858,7 +17900,7 @@ Body:
|
||||
HitCount: 1
|
||||
Element: Holy
|
||||
CastCancel: true
|
||||
Duration1: 180000
|
||||
Duration1: 900000
|
||||
FixedCastTime: -1
|
||||
Requires:
|
||||
SpCost: 1
|
||||
@ -31739,11 +31781,9 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Splash: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
SplashArea: 3
|
||||
Duration1: 60000
|
||||
Duration1: 900000
|
||||
FixedCastTime: -1
|
||||
Requires:
|
||||
SpCost: 1
|
||||
|
@ -168,7 +168,8 @@ bonus2 bSkillUseSPrate,sk,n; Decreases SP consumption of skill sk by n%
|
||||
Atk/Def
|
||||
-------
|
||||
bonus2 bSkillAtk,sk,n; Increases damage of skill sk by n%
|
||||
bonus bLongAtkRate,n; Increases damage of ranged attacks by n%
|
||||
bonus bShortAtkRate,n; Increases damage of short ranged attacks by n%
|
||||
bonus bLongAtkRate,n; Increases damage of long ranged attacks by n%
|
||||
bonus bCritAtkRate,n; Increases critical damage by +n%
|
||||
bonus bCriticalDef,n; Decreases the chance of being hit by critical hits by n%
|
||||
bonus2 bWeaponAtk,w,n; Adds n ATK when weapon of type w is equipped
|
||||
|
@ -852,6 +852,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
|
||||
}
|
||||
}
|
||||
#ifndef RENEWAL
|
||||
if (flag & BF_SHORT)
|
||||
cardfix = cardfix * (100 + sd->bonus.short_attack_atk_rate) / 100;
|
||||
if( flag&BF_LONG )
|
||||
cardfix = cardfix * (100 + sd->bonus.long_attack_atk_rate) / 100;
|
||||
#endif
|
||||
@ -2575,6 +2577,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
||||
#ifdef RENEWAL
|
||||
case ASC_BREAKER:
|
||||
#endif
|
||||
case RK_IGNITIONBREAK:
|
||||
case GC_CROSSIMPACT:
|
||||
cri /= 2;
|
||||
break;
|
||||
@ -2865,7 +2868,8 @@ static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct
|
||||
} else if (weapon_position == EQI_HAND_L)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if (skill_id == RK_WINDCUTTER && sd && sd->status.weapon == W_2HSWORD)
|
||||
return true;
|
||||
|
||||
return nk[NK_IGNOREDEFENSE] != 0;
|
||||
}
|
||||
@ -2957,6 +2961,22 @@ static int battle_get_weapon_element(struct Damage* wd, struct block_list *src,
|
||||
if (!sd)
|
||||
element = ELE_NEUTRAL; //forced neutral for monsters
|
||||
break;
|
||||
case RK_DRAGONBREATH:
|
||||
if (sc) {
|
||||
if (sc->data[SC_LUXANIMA]) // Lux Anima has priority over Giant Growth
|
||||
element = ELE_DARK;
|
||||
else if (sc->data[SC_GIANTGROWTH])
|
||||
element = ELE_HOLY;
|
||||
}
|
||||
break;
|
||||
case RK_DRAGONBREATH_WATER:
|
||||
if (sc) {
|
||||
if (sc->data[SC_LUXANIMA]) // Lux Anima has priority over Fighting Spirit
|
||||
element = ELE_NEUTRAL;
|
||||
else if (sc->data[SC_FIGHTINGSPIRIT])
|
||||
element = ELE_GHOST;
|
||||
}
|
||||
break;
|
||||
case LG_HESPERUSLIT:
|
||||
if (sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 4)
|
||||
element = ELE_HOLY;
|
||||
@ -3541,6 +3561,10 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
|
||||
}
|
||||
|
||||
switch (skill_id) {
|
||||
case RK_WINDCUTTER:
|
||||
if (sd && sd->weapontype1 == W_2HSWORD)
|
||||
wd->div_ = 2;
|
||||
break;
|
||||
case RA_AIMEDBOLT:
|
||||
wd->div_ = 2 + tstatus->size + rnd()%2;
|
||||
break;
|
||||
@ -4098,42 +4122,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += ((skill_lv - 1) % 5 + 1) * 100;
|
||||
break;
|
||||
case RK_SONICWAVE:
|
||||
skillratio += -100 + (skill_lv + 7) * 100; // ATK = {((Skill Level + 7) x 100) x (1 + [(Caster's Base Level - 100) / 200])} %
|
||||
skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100;
|
||||
skillratio += -100 + 500 + 100 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case RK_HUNDREDSPEAR:
|
||||
skillratio += 500 + (80 * skill_lv);
|
||||
if (sd) {
|
||||
short index = sd->equip_index[EQI_HAND_R];
|
||||
|
||||
if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON)
|
||||
skillratio += max(10000 - sd->inventory_data[index]->weight, 0) / 10;
|
||||
skillratio += -100 + 600 + 200 * skill_lv;
|
||||
if (sd)
|
||||
skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE);
|
||||
} // (1 + [(Casters Base Level - 100) / 200])
|
||||
skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case RK_WINDCUTTER:
|
||||
skillratio += -100 + (skill_lv + 2) * 50;
|
||||
if (sd) {
|
||||
if (sd->weapontype1 == W_2HSWORD)
|
||||
skillratio += -100 + 250 * skill_lv;
|
||||
else if (sd->weapontype1 == W_1HSPEAR || sd->weapontype1 == W_2HSPEAR)
|
||||
skillratio += -100 + 400 * skill_lv;
|
||||
else
|
||||
skillratio += -100 + 300 * skill_lv;
|
||||
} else
|
||||
skillratio += -100 + 300 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case RK_IGNITIONBREAK:
|
||||
// 3x3 cell Damage = ATK [{(Skill Level x 300) x (1 + [(Caster's Base Level - 100) / 100])}] %
|
||||
// 7x7 cell Damage = ATK [{(Skill Level x 250) x (1 + [(Caster's Base Level - 100) / 100])}] %
|
||||
// 11x11 cell Damage = ATK [{(Skill Level x 200) x (1 + [(Caster's Base Level - 100) / 100])}] %
|
||||
i = distance_bl(src,target);
|
||||
if (i < 2)
|
||||
skillratio += -100 + 300 * skill_lv;
|
||||
else if (i < 4)
|
||||
skillratio += -100 + 250 * skill_lv;
|
||||
else
|
||||
skillratio += -100 + 200 * skill_lv;
|
||||
skillratio = skillratio * status_get_lv(src) / 100;
|
||||
// Elemental check, 1.5x damage if your weapon element is fire.
|
||||
if (sstatus->rhw.ele == ELE_FIRE)
|
||||
skillratio += 100 * skill_lv;
|
||||
skillratio += -100 + 400 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case RK_STORMBLAST:
|
||||
skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + status_get_str(src) / 8) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 8)} x 100] %
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] %
|
||||
skillratio += -100 + 50 * skill_lv + 10 * (sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 5);
|
||||
@ -5570,6 +5586,9 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
|
||||
case LK_SPIRALPIERCE:
|
||||
if (!sd) wd.flag = (wd.flag&~(BF_RANGEMASK|BF_WEAPONMASK))|BF_LONG|BF_MISC;
|
||||
break;
|
||||
case RK_WINDCUTTER:
|
||||
if (sd && (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR))
|
||||
wd.flag |= BF_LONG;
|
||||
|
||||
// The number of hits is set to 3 by default for use in Inspiration status.
|
||||
// When in Banding, the number of hits is equal to the number of Royal Guards in Banding.
|
||||
@ -5615,7 +5634,10 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
||||
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id,true);
|
||||
if( rdamage > 0 ) {
|
||||
struct block_list *d_bl = battle_check_devotion(src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
|
||||
if (sc && sc->data[SC_VITALITYACTIVATION])
|
||||
rdamage /= 2;
|
||||
if (tsc->data[SC_MAXPAIN]) {
|
||||
tsc->data[SC_MAXPAIN]->val2 = (int)rdamage;
|
||||
skill_castend_damage_id(target, src, NPC_MAXPAIN_ATK, tsc->data[SC_MAXPAIN]->val1, tick, wd->flag);
|
||||
@ -5751,6 +5773,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
if (sd) { //monsters, homuns and pets have their damage computed directly
|
||||
wd.damage = wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.masteryAtk;
|
||||
wd.damage2 = wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.masteryAtk2;
|
||||
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);
|
||||
}
|
||||
@ -7691,10 +7715,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
} else
|
||||
status_change_end(src,SC_SPELLFIST,INVALID_TIMER);
|
||||
}
|
||||
if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) {
|
||||
wd.damage <<= 1; // Double Damage
|
||||
skill_break_equip(src, src, EQP_WEAPON, 10, BCT_SELF); // Break chance happens on successful damage increase
|
||||
}
|
||||
if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage)
|
||||
wd.damage += wd.damage * 150 / 100; // 2.5 times damage
|
||||
|
||||
if( sd && battle_config.arrow_decrement && sc->data[SC_FEARBREEZE] && sc->data[SC_FEARBREEZE]->val4 > 0) {
|
||||
short idx = sd->equip_index[EQI_AMMO];
|
||||
|
@ -498,7 +498,7 @@ enum _sp {
|
||||
SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE, // 2079-2082
|
||||
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
|
||||
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2093
|
||||
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE // 2094-2095
|
||||
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE // 2094-2096
|
||||
};
|
||||
|
||||
enum _look {
|
||||
|
@ -3416,6 +3416,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
|
||||
if(sd->state.lr_flag !=2)
|
||||
sd->bonus.classchange=val;
|
||||
break;
|
||||
case SP_SHORT_ATK_RATE:
|
||||
if(sd->state.lr_flag != 2) //[Lupus] it should stack, too. As any other cards rate bonuses
|
||||
sd->bonus.short_attack_atk_rate+=val;
|
||||
break;
|
||||
case SP_LONG_ATK_RATE:
|
||||
if(sd->state.lr_flag != 2) //[Lupus] it should stack, too. As any other cards rate bonuses
|
||||
sd->bonus.long_attack_atk_rate+=val;
|
||||
@ -8634,6 +8638,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
|
||||
case SP_UNBREAKABLE_GARMENT: val = (sd->bonus.unbreakable_equip&EQP_GARMENT)?1:0; break;
|
||||
case SP_UNBREAKABLE_SHOES: val = (sd->bonus.unbreakable_equip&EQP_SHOES)?1:0; break;
|
||||
case SP_CLASSCHANGE: val = sd->bonus.classchange; break;
|
||||
case SP_SHORT_ATK_RATE: val = sd->bonus.short_attack_atk_rate; break;
|
||||
case SP_LONG_ATK_RATE: val = sd->bonus.long_attack_atk_rate; break;
|
||||
case SP_BREAK_WEAPON_RATE: val = sd->bonus.break_weapon_rate; break;
|
||||
case SP_BREAK_ARMOR_RATE: val = sd->bonus.break_armor_rate; break;
|
||||
@ -8983,10 +8988,8 @@ int pc_itemheal(struct map_session_data *sd, int itemid, int hp, int sp)
|
||||
if (sd->sc.data[SC_NORECOVER_STATE])
|
||||
penalty = 100;
|
||||
|
||||
if (sd->sc.data[SC_VITALITYACTIVATION]) {
|
||||
if (sd->sc.data[SC_VITALITYACTIVATION])
|
||||
hp += hp / 2; // 1.5 times
|
||||
sp -= sp / 2;
|
||||
}
|
||||
|
||||
if (sd->sc.data[SC_WATER_INSIGNIA] && sd->sc.data[SC_WATER_INSIGNIA]->val1 == 2) {
|
||||
hp += hp / 10;
|
||||
|
@ -486,6 +486,7 @@ struct map_session_data {
|
||||
int arrow_atk,arrow_ele,arrow_cri,arrow_hit;
|
||||
int nsshealhp,nsshealsp;
|
||||
int critical_def,double_rate;
|
||||
int short_attack_atk_rate; // Short range atk rate, not weapon based.
|
||||
int long_attack_atk_rate; //Long range atk rate, not weapon based. [Skotlex]
|
||||
int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
|
||||
int ignore_mdef_ele;
|
||||
|
@ -671,6 +671,7 @@
|
||||
export_constant2("bUnbreakableArmor",SP_UNBREAKABLE_ARMOR);
|
||||
export_constant2("bUnbreakableHelm",SP_UNBREAKABLE_HELM);
|
||||
export_constant2("bUnbreakableShield",SP_UNBREAKABLE_SHIELD);
|
||||
export_constant2("bShortAtkRate",SP_SHORT_ATK_RATE);
|
||||
export_constant2("bLongAtkRate",SP_LONG_ATK_RATE);
|
||||
export_constant2("bCritAtkRate",SP_CRIT_ATK_RATE);
|
||||
export_constant2("bCriticalAddRace",SP_CRITICAL_ADDRACE);
|
||||
@ -1583,6 +1584,8 @@
|
||||
export_constant(SC_ADD_ATK_DAMAGE);
|
||||
export_constant(SC_ADD_MATK_DAMAGE);
|
||||
export_constant(SC_SOUNDOFDESTRUCTION);
|
||||
export_constant(SC_LUXANIMA);
|
||||
export_constant(SC_REUSE_LIMIT_LUXANIMA);
|
||||
#ifdef RENEWAL
|
||||
export_constant(SC_EXTREMITYFIST2);
|
||||
#endif
|
||||
|
@ -1343,6 +1343,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
if((sce=sc->data[SC_EDP]))
|
||||
sc_start4(src,bl,SC_DPOISON,sce->val2, sce->val1,src->id,0,0,
|
||||
skill_get_time2(ASC_EDP,sce->val1));
|
||||
|
||||
if ((sce = sc->data[SC_LUXANIMA]) && rnd() % 100 < sce->val2)
|
||||
skill_castend_nodamage_id(src, bl, RK_STORMBLAST, 1, tick, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -1692,9 +1695,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case NPC_CRITICALWOUND:
|
||||
sc_start(src,bl,SC_CRITICALWOUND,100,skill_lv,skill_get_time2(skill_id,skill_lv));
|
||||
break;
|
||||
case RK_WINDCUTTER:
|
||||
sc_start(src,bl,SC_FEAR,3+2*skill_lv,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
break;
|
||||
case RK_DRAGONBREATH:
|
||||
sc_start4(src,bl,SC_BURNING,15,skill_lv,1000,src->id,0,skill_get_time(skill_id,skill_lv));
|
||||
break;
|
||||
@ -2033,6 +2033,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case SC_DRESSUP: case SC_HANBOK: case SC_OKTOBERFEST:
|
||||
case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4:
|
||||
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
|
||||
case SC_REUSE_LIMIT_LUXANIMA:
|
||||
continue;
|
||||
case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI:
|
||||
case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME:
|
||||
@ -4862,7 +4863,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
break;
|
||||
|
||||
case MO_TRIPLEATTACK:
|
||||
case RK_WINDCUTTER:
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag|SD_ANIMATION);
|
||||
break;
|
||||
|
||||
@ -5112,6 +5112,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
case NPC_REVERBERATION_ATK:
|
||||
case NPC_ARROWSTORM:
|
||||
case RK_IGNITIONBREAK:
|
||||
case RK_HUNDREDSPEAR:
|
||||
case AB_JUDEX:
|
||||
case AB_ADORAMUS:
|
||||
case WL_SOULEXPANSION:
|
||||
@ -5560,8 +5561,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
case RK_DRAGONBREATH:
|
||||
if( tsc && tsc->data[SC_HIDING] )
|
||||
clif_skill_nodamage(src,src,skill_id,skill_lv,1);
|
||||
else
|
||||
else {
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
}
|
||||
break;
|
||||
|
||||
case NPC_SELFDESTRUCTION:
|
||||
@ -5619,16 +5621,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
status_change_end(src, SC_HIDING, INVALID_TIMER);
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
break;
|
||||
case RK_HUNDREDSPEAR:
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
if(rnd()%100 < (10 + 3*skill_lv)) {
|
||||
int skill_req = ((sd) ? pc_checkskill(sd,KN_SPEARBOOMERANG) : skill_get_max(KN_SPEARBOOMERANG));
|
||||
if( !skill_req )
|
||||
break; // Spear Boomerang auto cast chance only works if you have Spear Boomerang.
|
||||
skill_blown(src,bl,6,-1,BLOWN_NONE);
|
||||
skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,skill_req,tick,0);
|
||||
}
|
||||
break;
|
||||
case RK_PHANTOMTHRUST:
|
||||
unit_setdir(src,map_calc_dir(src, bl->x, bl->y));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
@ -5637,6 +5629,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
if( battle_check_target(src,bl,BCT_ENEMY) > 0 )
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
break;
|
||||
case RK_WINDCUTTER:
|
||||
case RK_STORMBLAST:
|
||||
if( flag&1 )
|
||||
skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
@ -7516,6 +7509,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
//List of self skills that give damage around caster
|
||||
case ASC_METEORASSAULT:
|
||||
case GS_SPREADATTACK:
|
||||
case RK_WINDCUTTER:
|
||||
case RK_STORMBLAST:
|
||||
case NC_AXETORNADO:
|
||||
case GC_COUNTERSLASH:
|
||||
@ -7560,7 +7554,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget,
|
||||
src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||
if( !i && ( skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
|
||||
if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
|
||||
clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||
}
|
||||
break;
|
||||
@ -8498,6 +8492,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SC_WEDDING: case SC_XMAS: case SC_SUMMER:
|
||||
case SC_DRESSUP: case SC_HANBOK: case SC_OKTOBERFEST:
|
||||
case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4:
|
||||
case SC_REUSE_LIMIT_LUXANIMA:
|
||||
continue;
|
||||
case SC_WHISTLE:
|
||||
case SC_ASSNCROS:
|
||||
@ -9632,7 +9627,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
case RK_ENCHANTBLADE:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start2(src,bl,type,100,skill_lv,((100+20*skill_lv)*status_get_lv(src))/150+sstatus->int_,skill_get_time(skill_id,skill_lv)));
|
||||
sc_start2(src,bl,type,100,skill_lv,((100+20*skill_lv)*status_get_lv(src))/100+sstatus->int_,skill_get_time(skill_id,skill_lv)));
|
||||
break;
|
||||
case RK_DRAGONHOWLING:
|
||||
if( flag&1)
|
||||
@ -9657,6 +9652,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
map_foreachinrange(skill_area_sub, bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
||||
}
|
||||
break;
|
||||
case RK_LUXANIMA:
|
||||
status_change_clear_buffs(bl, SCCB_LUXANIMA); // For bonus_script
|
||||
case RK_GIANTGROWTH:
|
||||
case RK_STONEHARDSKIN:
|
||||
case RK_VITALITYACTIVATION:
|
||||
@ -9690,57 +9687,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
|
||||
case RK_FIGHTINGSPIRIT: {
|
||||
// val1: ATKBonus: Caster: 70 + 7 * PartyMember. Member: (70 + 7 * PartyMember) / 2
|
||||
uint8 runemastery_skill_lv = (sd ? pc_checkskill(sd, RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY));
|
||||
|
||||
// val1: ATKBonus: ? // !TODO: Confirm new ATK formula
|
||||
// val2: ASPD boost: [RK_RUNEMASTERYlevel * 4 / 10] * 10 ==> RK_RUNEMASTERYlevel * 4
|
||||
if( flag&1 ) {
|
||||
if( skill_area_temp[1] == bl->id )
|
||||
sc_start2(src,bl,type,100,70 + 7 * skill_area_temp[0],4 * ((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY)),skill_area_temp[4]);
|
||||
else
|
||||
sc_start(src,bl,type,100,skill_area_temp[3],skill_area_temp[4]);
|
||||
} else {
|
||||
if( sd && sd->status.party_id ) {
|
||||
skill_area_temp[0] = party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,BCT_PARTY,skill_area_sub_count);
|
||||
skill_area_temp[1] = src->id;
|
||||
skill_area_temp[3] = (70 + 7 * skill_area_temp[0]) / 2;
|
||||
skill_area_temp[4] = skill_get_time(skill_id,skill_lv);
|
||||
party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,flag|BCT_PARTY|1,skill_castend_nodamage_id);
|
||||
}
|
||||
else
|
||||
sc_start2(src,bl,type,100,77,4 * ((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY)),skill_get_time(skill_id,skill_lv));
|
||||
clif_skill_nodamage(src,bl,skill_id,1,1);
|
||||
}
|
||||
sc_start2(src,bl,type,100,70 + 7 * runemastery_skill_lv,4 * runemastery_skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case RK_LUXANIMA:
|
||||
{
|
||||
sc_type runes[] = { SC_MILLENNIUMSHIELD, SC_REFRESH, SC_GIANTGROWTH, SC_STONEHARDSKIN, SC_VITALITYACTIVATION, SC_ABUNDANCE };
|
||||
|
||||
if (sd == NULL || sd->status.party_id == 0 || flag&1) {
|
||||
if (src->id == bl->id) // Don't give it back to the RK
|
||||
break;
|
||||
|
||||
sc_start(src, bl, runes[skill_area_temp[5]], 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
status_change_clear_buffs(bl, SCCB_LUXANIMA); // For bonus_script
|
||||
} else if (sd) { // Find which SC is going to be given
|
||||
int recent = 0, result = -1;
|
||||
|
||||
for (i = 0; i < ARRAYLENGTH(runes); i++) {
|
||||
if (sd->sc.data[runes[i]] && ((sd->sc.data[runes[i]]->timer * (runes[i] == SC_REFRESH? 3 : 1)) > recent || recent == 0)) {
|
||||
recent = sd->sc.data[runes[i]]->timer;
|
||||
result = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (result != -1) {
|
||||
skill_area_temp[5] = result;
|
||||
status_change_end(src, runes[result], INVALID_TIMER);
|
||||
party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id);
|
||||
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GC_ROLLINGCUTTER:
|
||||
{
|
||||
@ -10028,6 +9982,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SC_DRESSUP: case SC_HANBOK: case SC_OKTOBERFEST:
|
||||
case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4:
|
||||
case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
|
||||
case SC_REUSE_LIMIT_LUXANIMA:
|
||||
continue;
|
||||
case SC_ASSUMPTIO:
|
||||
if( bl->type == BL_MOB )
|
||||
@ -12722,11 +12677,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
}
|
||||
break;
|
||||
|
||||
case RK_WINDCUTTER:
|
||||
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||
case AC_SHOWER:
|
||||
if (skill_id == AC_SHOWER)
|
||||
status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
case MA_SHOWER:
|
||||
case NC_COLDSLOWER:
|
||||
case RK_DRAGONBREATH:
|
||||
@ -19821,7 +19773,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
|
||||
int i, sc, ele, idx, equip, wlv, make_per = 0, flag = 0, skill_lv = 0;
|
||||
int num = -1; // exclude the recipe
|
||||
struct status_data *status;
|
||||
struct item_data* data;
|
||||
|
||||
nullpo_ret(sd);
|
||||
|
||||
@ -19870,32 +19821,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
|
||||
}
|
||||
}
|
||||
|
||||
if (skill_id == RK_RUNEMASTERY) {
|
||||
int temp_qty, runemastery_skill_lv = pc_checkskill(sd,skill_id);
|
||||
data = itemdb_search(nameid);
|
||||
|
||||
if (runemastery_skill_lv >= 10) temp_qty = 1 + rnd()%3;
|
||||
else if (runemastery_skill_lv > 4) temp_qty = 1 + rnd()%2;
|
||||
else temp_qty = 1;
|
||||
|
||||
if (data->stack.inventory) {
|
||||
for (i = 0; i < MAX_INVENTORY; i++) {
|
||||
if (sd->inventory.u.items_inventory[i].nameid == nameid) {
|
||||
if (sd->inventory.u.items_inventory[i].amount >= data->stack.amount) {
|
||||
clif_msg(sd,RUNE_CANT_CREATE);
|
||||
return 0;
|
||||
} else {
|
||||
// The amount fits, say we got temp_qty 4 and 19 runes, we trim temp_qty to 1.
|
||||
if (temp_qty + sd->inventory.u.items_inventory[i].amount >= data->stack.amount)
|
||||
temp_qty = data->stack.amount - sd->inventory.u.items_inventory[i].amount;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
qty = temp_qty;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_PRODUCE_RESOURCE; i++) {
|
||||
short id, x, j;
|
||||
|
||||
@ -20004,7 +19929,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
|
||||
break;
|
||||
|
||||
case RK_RUNEMASTERY: {
|
||||
int A = 100 * (51 + 2 * pc_checkskill(sd, skill_id));
|
||||
int A = 100 * (30 + 2 * pc_checkskill(sd, skill_id));
|
||||
int B = 100 * status->dex / 30 + 10 * (status->luk + sd->status.job_level);
|
||||
int C = 100 * cap_value(sd->itemid,0,100); //itemid depend on makerune()
|
||||
int D = 0;
|
||||
@ -20032,6 +19957,15 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
|
||||
break; //not specified =-15%
|
||||
}
|
||||
make_per = A + B + C + D;
|
||||
|
||||
uint8 runemastery_skill_lv = pc_checkskill(sd,skill_id);
|
||||
|
||||
if (runemastery_skill_lv > 9)
|
||||
qty = 2 + rnd() % 5; // 2~6
|
||||
else if (runemastery_skill_lv > 4)
|
||||
qty = 2 + rnd() % 3; // 2~4
|
||||
else
|
||||
qty = 2;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -814,11 +814,12 @@ void initChangeTables(void)
|
||||
set_sc( RK_REFRESH , SC_REFRESH , EFST_REFRESH , SCB_NONE );
|
||||
set_sc( RK_GIANTGROWTH , SC_GIANTGROWTH , EFST_GIANTGROWTH , SCB_STR );
|
||||
set_sc( RK_STONEHARDSKIN , SC_STONEHARDSKIN , EFST_STONEHARDSKIN , SCB_DEF|SCB_MDEF );
|
||||
set_sc( RK_VITALITYACTIVATION , SC_VITALITYACTIVATION , EFST_VITALITYACTIVATION , SCB_REGEN );
|
||||
set_sc( RK_VITALITYACTIVATION , SC_VITALITYACTIVATION , EFST_VITALITYACTIVATION , SCB_NONE );
|
||||
set_sc( RK_FIGHTINGSPIRIT , SC_FIGHTINGSPIRIT , EFST_FIGHTINGSPIRIT , SCB_WATK|SCB_ASPD );
|
||||
set_sc( RK_ABUNDANCE , SC_ABUNDANCE , EFST_ABUNDANCE , SCB_NONE );
|
||||
set_sc( RK_CRUSHSTRIKE , SC_CRUSHSTRIKE , EFST_CRUSHSTRIKE , SCB_NONE );
|
||||
set_sc_with_vfx( RK_DRAGONBREATH_WATER , SC_FREEZING , EFST_FROSTMISTY , SCB_ASPD|SCB_SPEED|SCB_DEF );
|
||||
set_sc( RK_LUXANIMA , SC_LUXANIMA , EFST_LUXANIMA , SCB_ALL );
|
||||
|
||||
/* GC Guillotine Cross */
|
||||
set_sc_with_vfx( GC_VENOMIMPRESS, SC_VENOMIMPRESS , EFST_VENOMIMPRESS , SCB_NONE );
|
||||
@ -3413,6 +3414,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
|
||||
#endif
|
||||
if(sc->data[SC_LUNARSTANCE])
|
||||
bonus += sc->data[SC_LUNARSTANCE]->val2;
|
||||
if (sc->data[SC_LUXANIMA])
|
||||
bonus += sc->data[SC_LUXANIMA]->val3;
|
||||
|
||||
//Decreasing
|
||||
if (sc->data[SC_VENOMBLEED] && sc->data[SC_VENOMBLEED]->val3 == 1)
|
||||
@ -3554,6 +3557,8 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
|
||||
bonus += sc->data[SC_SERVICE4U]->val2;
|
||||
if(sc->data[SC_MERC_SPUP])
|
||||
bonus += sc->data[SC_MERC_SPUP]->val2;
|
||||
if (sc->data[SC_LUXANIMA])
|
||||
bonus += sc->data[SC_LUXANIMA]->val3;
|
||||
|
||||
//Decreasing
|
||||
if (sc->data[SC_MELODYOFSINK])
|
||||
@ -4684,6 +4689,12 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
|
||||
}
|
||||
if (sc->data[SC_PYREXIA] && sc->data[SC_PYREXIA]->val3 == 0)
|
||||
sd->bonus.crit_atk_rate += sc->data[SC_PYREXIA]->val2;
|
||||
if (sc->data[SC_LUXANIMA]) {
|
||||
pc_bonus2(sd, SP_ADDSIZE, SZ_ALL, sc->data[SC_LUXANIMA]->val3);
|
||||
sd->bonus.crit_atk_rate += sc->data[SC_LUXANIMA]->val3;
|
||||
sd->bonus.short_attack_atk_rate += sc->data[SC_LUXANIMA]->val3;
|
||||
sd->bonus.long_attack_atk_rate += sc->data[SC_LUXANIMA]->val3;
|
||||
}
|
||||
}
|
||||
status_cpy(&sd->battle_status, base_status);
|
||||
|
||||
@ -5117,7 +5128,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
|
||||
(bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK &&
|
||||
sc->data[SC_EXTREMITYFIST] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) ||
|
||||
#endif
|
||||
(sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1) || sc->data[SC_VITALITYACTIVATION])
|
||||
(sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1))
|
||||
regen->flag &= ~RGN_SP;
|
||||
|
||||
if (sc->data[SC_TENSIONRELAX]) {
|
||||
@ -6010,7 +6021,7 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang
|
||||
if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH)
|
||||
str += ((sc->data[SC_SPIRIT]->val3)>>16)&0xFF;
|
||||
if(sc->data[SC_GIANTGROWTH])
|
||||
str += 30;
|
||||
str += sc->data[SC_GIANTGROWTH]->val2;
|
||||
if(sc->data[SC_BEYONDOFWARCRY])
|
||||
str -= sc->data[SC_BEYONDOFWARCRY]->val2;
|
||||
if(sc->data[SC_SAVAGE_STEAK])
|
||||
@ -7620,7 +7631,7 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s
|
||||
|
||||
if ((sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION]))
|
||||
aspd -= 50; // +5 ASPD
|
||||
if (sc->data[SC_FIGHTINGSPIRIT] && sc->data[SC_FIGHTINGSPIRIT]->val2)
|
||||
if (sc->data[SC_FIGHTINGSPIRIT])
|
||||
aspd -= sc->data[SC_FIGHTINGSPIRIT]->val2;
|
||||
if (sc->data[SC_MTF_ASPD])
|
||||
aspd -= sc->data[SC_MTF_ASPD]->val1;
|
||||
@ -10124,6 +10135,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_REUSE_LIMIT_ASPD_POTION:
|
||||
case SC_DORAM_BUF_01:
|
||||
case SC_DORAM_BUF_02:
|
||||
case SC_REUSE_LIMIT_LUXANIMA:
|
||||
return 0;
|
||||
case SC_PUSH_CART:
|
||||
case SC_COMBO:
|
||||
@ -11211,7 +11223,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
tick_time = 10000; // [GodLesZ] tick time
|
||||
break;
|
||||
case SC_GIANTGROWTH:
|
||||
val2 = 15; // Double damage success rate.
|
||||
val2 = 30; // Damage success rate and STR increase
|
||||
break;
|
||||
case SC_LUXANIMA:
|
||||
val2 = 15; // Storm Blast success %
|
||||
val3 = 30; // Damage/HP/SP % increase
|
||||
break;
|
||||
|
||||
/* Arch Bishop */
|
||||
@ -12854,6 +12870,7 @@ int status_change_clear(struct block_list* bl, int type)
|
||||
case SC_LHZ_DUN_N4:
|
||||
case SC_ENTRY_QUEUE_APPLY_DELAY:
|
||||
case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT:
|
||||
case SC_REUSE_LIMIT_LUXANIMA:
|
||||
// Costumes
|
||||
case SC_MOONSTAR:
|
||||
case SC_SUPER_STAR:
|
||||
@ -14983,6 +15000,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type)
|
||||
case SC_LHZ_DUN_N2:
|
||||
case SC_LHZ_DUN_N3:
|
||||
case SC_LHZ_DUN_N4:
|
||||
case SC_REUSE_LIMIT_LUXANIMA:
|
||||
// Clans
|
||||
case SC_CLAN_INFO:
|
||||
case SC_SWORDCLAN:
|
||||
|
@ -930,6 +930,9 @@ enum sc_type : int16 {
|
||||
SC_HELPANGEL,
|
||||
SC_SOUNDOFDESTRUCTION,
|
||||
|
||||
SC_LUXANIMA,
|
||||
SC_REUSE_LIMIT_LUXANIMA,
|
||||
|
||||
#ifdef RENEWAL
|
||||
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user