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:
Aleos 2020-05-18 13:35:07 -04:00 committed by GitHub
parent d1e5127728
commit 44e5c5bcc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 205 additions and 187 deletions

View File

@ -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; },{},{}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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