Implemented SH_KI_SUL_RAMPAGE (2nd rebalance)

MAX Lv: 7
Skill Requirement: Mystical Creature Mastery 5, Marine Festival of Kisul 2, Sandy Festival of Kisul 2
Skill Form: Active
Type: Recovery
Target: Instant Casting
Description: Using the powerful healing effect of Kisul.
Recovers 2 AP every 1 second to all party members, excluding the user, with 7 x 7 cells around the user.
The user can't use other skills while this skill is active, and if the user leaves the standing cell due to certain effect such as being knocked-back, the skill effect is canceled.
If the user learned Commune with Kisul, increases area of effect to 11 x 11 cells and increases AP recovery amount to 4.
_
[Level 1]: Duration: 4 seconds.
[Level 2]: Duration: 5 seconds.
[Level 3]: Duration: 6 seconds.
[Level 4]: Duration: 7 seconds.
[Level 5]: Duration: 8 seconds.
[Level 6]: Duration: 9 seconds.
[Level 7]: Duration: 10 seconds.

1st rebalance :
(nothing)

2nd rebalance :
- Reduces AP recovery rate from 3/6 to 2/4.
This commit is contained in:
Atemo 2023-10-28 16:58:43 +02:00
parent 6680ce00df
commit f17fb250be
5 changed files with 95 additions and 6 deletions

View File

@ -41675,6 +41675,53 @@ Body:
- Level: 5
Amount: 120
Status: Sandy_Festival
- Id: 5442
Name: SH_KI_SUL_RAMPAGE
Description: Kisul Rampage
MaxLevel: 7
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Splash: true
SplashArea: 3
Duration1:
- Level: 1
Time: 4000
- Level: 2
Time: 5000
- Level: 3
Time: 6000
- Level: 4
Time: 7000
- Level: 5
Time: 8000
- Level: 6
Time: 9000
- Level: 7
Time: 10000
CastCancel: true
CastTime: 3000
AfterCastActDelay: 1000
Cooldown: 60000
FixedCastTime: 1500
Requires:
SpCost:
- Level: 1
Amount: 90
- Level: 2
Amount: 100
- Level: 3
Amount: 110
- Level: 4
Amount: 120
- Level: 5
Amount: 130
- Level: 6
Amount: 140
- Level: 7
Amount: 150
Status: Ki_Sul_Rampage
- Id: 5443
Name: SH_COMMUNE_WITH_HYUN_ROK
Description: Commune with Hyunrok

View File

@ -8787,3 +8787,8 @@ Body:
Sta: true
EndOnStart:
Religio: true
- Status: Ki_Sul_Rampage
Icon: EFST_KI_SUL_RAMPAGE
DurationLookup: SH_KI_SUL_RAMPAGE
States:
NoCast: true

View File

@ -3123,6 +3123,8 @@ short skill_blown(struct block_list* src, struct block_list* target, char count,
status_change_end(target, SC_ROLLINGCUTTER);
if (tsc->getSCE(SC_CRESCIVEBOLT))
status_change_end(target, SC_CRESCIVEBOLT);
if (tsc->getSCE(SC_KI_SUL_RAMPAGE))
status_change_end(target, SC_KI_SUL_RAMPAGE);
if (tsc->getSCE(SC_SV_ROOTTWIST)) // Shouldn't move.
return 0;
}
@ -12827,8 +12829,7 @@ 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 | SD_SPLASH | 1, skill_castend_damage_id);
break;
case SH_KI_SUL_WATER_SPRAYING:
if (flag & 1)
{
if (flag & 1) {
int heal = 500 * skill_lv + status_get_int(src) * 5;
if (sd)
heal += pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY)*100;
@ -12842,8 +12843,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_heal(bl, heal, 0, 0, 0);
clif_skill_nodamage(0, bl, AL_HEAL, heal, 1);
}
else
{
else {
i = skill_get_splash(skill_id, skill_lv);
if ((sd && pc_checkskill(sd, SH_COMMUNE_WITH_KI_SUL)) || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION)))
i += 2;
@ -12860,7 +12860,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
time *= 2;
sc_start(src, bl, type, 100, skill_lv, time);
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
} else {
}
else {
i = skill_get_splash(skill_id, skill_lv);
if ((sd && pc_checkskill(sd, SH_COMMUNE_WITH_KI_SUL)) || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION)))
i += 2;
@ -12868,6 +12869,19 @@ 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_PARTY | SD_SPLASH | 1, skill_castend_nodamage_id);
}
break;
case SH_KI_SUL_RAMPAGE:
if (flag & 1) {
if (!(src == bl)) {
if ((sd && pc_checkskill(sd, SH_COMMUNE_WITH_KI_SUL)) || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION)))
status_heal(bl, 0, 0, 4, 0);
else
status_heal(bl, 0, 0, 2, 0);
}
}
else {
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
}
break;
default: {
std::shared_ptr<s_skill_db> skill = skill_db.find(skill_id);

View File

@ -12719,6 +12719,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_SANDY_FESTIVAL:
val2 = 2 * val1;
break;
case SC_KI_SUL_RAMPAGE:
val4 = tick / 1000;
tick_time = 100;
break;
default:
if (calc_flag.none() && scdb->skill_id == 0 && scdb->icon == EFST_BLANK && scdb->opt1 == OPT1_NONE && scdb->opt2 == OPT2_NONE && scdb->state.none() && scdb->flag.none() && scdb->endonstart.empty() && scdb->endreturn.empty() && scdb->fail.empty() && scdb->endonend.empty()) {
@ -14840,6 +14844,22 @@ TIMER_FUNC(status_change_timer){
if (sce->val4 >= 0)
skill_castend_damage_id( bl, bl, NPC_KILLING_AURA, sce->val1, tick, 0 );
break;
case SC_KI_SUL_RAMPAGE:
if (sce->val4-- > 0) {
int i = skill_get_splash(SH_KI_SUL_RAMPAGE, sce->val1);
int lv = sce->val1;
if ((sd && pc_checkskill(sd, SH_COMMUNE_WITH_KI_SUL)) || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION)))
{
i += 2;
lv += skill_get_max(SH_KI_SUL_RAMPAGE);
}
clif_skill_nodamage(bl, bl, SH_KI_SUL_RAMPAGE, lv, 1);
map_foreachinrange(skill_area_sub, bl, i, BL_CHAR,
bl, SH_KI_SUL_RAMPAGE, lv, tick, BCT_PARTY | SD_SPLASH | 1, skill_castend_nodamage_id);
sc_timer_next(1000 + tick);
return 0;
}
break;
}
// If status has an interval and there is at least 100ms remaining time, wait for next interval

View File

@ -786,8 +786,11 @@ int unit_walktoxy( struct block_list *bl, short x, short y, unsigned char flag)
TBL_PC *sd = BL_CAST(BL_PC, bl);
// Start timer to recall summon
if( sd != nullptr ){
if (sd->sc.getSCE(SC_KI_SUL_RAMPAGE))
status_change_end(bl, SC_KI_SUL_RAMPAGE);
// Start timer to recall summon
if (sd->md != nullptr)
unit_check_start_teleport_timer(&sd->md->bl);
if (sd->ed != nullptr)