Skip to content

Commit

Permalink
Several no-damage status change skills updated
Browse files Browse the repository at this point in the history
* Scream and Frost Joke (fixes #945)
-- The delay until the status change kicks in was increased from 2s to 3s
-- Aftercast delay in pre-renewal was increased from 3s to 4s (already 4s in renewal)
-- Duration of Freeze from Frost Joke increased from 10-14s to 30s
* Hammer Fall, Lex Divina and offensive Status Recovery (fixes #945)
-- A delay of 1 second until the status change kicks in was added
-- Hammer Fall will hit the targets that are in the AoE before the delay (so you can't dodge)
-- Offensive Status Recovery's base duration reduced from 30s to 20s and base chance increased to 100%
-- Increased the maximum number of skill timers from 15 to 40 as they are needed for delayed status changes
* Stone and Freeze now remove Lex Aeterna (fixes #947)
-- For stone this refers to the second phase
* Scream, Frost Joke and Hammer Fall no longer make a target stop (fixes #948)
-- Similar behavior to e.g. Ankle Snare against bosses or in WoE
-- If the target was singing/dancing, it will still stop and the song/dance will be canceled
-- Fixed a bug that caused position lag when targets that are still moving but can't move anymore are hit
  • Loading branch information
Playtester committed Feb 7, 2016
1 parent 620e953 commit f5ea1dc
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 23 deletions.
8 changes: 4 additions & 4 deletions db/pre-re/skill_cast_db.txt
Expand Up @@ -135,15 +135,15 @@
//-- PR_SLOWPOISON
71,0,0,0,10000:20000:30000:40000,0,0
//-- PR_STRECOVERY
72,0,2000,0,0,30000,0
72,0,2000,0,0,20000,0
//-- PR_KYRIE
73,2000,2000,0,120000,0,0
//-- PR_MAGNIFICAT
74,4000,2000,0,30000:45000:60000:75000:90000,0,0
//-- PR_GLORIA
75,0,2000,0,10000:15000:20000:25000:30000,0,0
//-- PR_LEXDIVINA
76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0
76,0,3000,0,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0
//-- PR_TURNUNDEAD
77,1000,3000,0,0,0,0
//-- PR_LEXAETERNA
Expand Down Expand Up @@ -472,7 +472,7 @@
//-- BA_DISSONANCE
317,0,0,0,30000,3000,0
//-- BA_FROSTJOKE
318,0,3000,0,0,10000:11000:12000:13000:14000,0
318,0,4000,0,0,30000,0
//-- BA_WHISTLE
319,0,0,0,60000,20000,0
//-- BA_ASSASSINCROSS
Expand All @@ -490,7 +490,7 @@
//-- DC_UGLYDANCE
325,0,0,0,30000,3000,0
//-- DC_SCREAM
326,0,3000,0,0,5000,0
326,0,4000,0,0,5000,0
//-- DC_HUMMING
327,0,0,0,60000,20000,0
//-- DC_DONTFORGETME
Expand Down
6 changes: 3 additions & 3 deletions db/re/skill_cast_db.txt
Expand Up @@ -135,15 +135,15 @@
//-- PR_SLOWPOISON
71,0,0,0,10000:20000:30000:40000,0,0,0
//-- PR_STRECOVERY
72,0,2000,0,0,30000,0,0
72,0,2000,0,0,20000,0,0
//-- PR_KYRIE
73,1600,2000,0,120000,0,0,400
//-- PR_MAGNIFICAT
74,3200,2000,0,30000:45000:60000:75000:90000,0,0,800
//-- PR_GLORIA
75,0,2000,0,10000:15000:20000:25000:30000,0,0,0
//-- PR_LEXDIVINA
76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0,0
76,0,3000,0,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0
//-- PR_TURNUNDEAD
77,800,3000,0,0,0,0,200
//-- PR_LEXAETERNA
Expand Down Expand Up @@ -466,7 +466,7 @@
//-- BA_DISSONANCE
317,0,0,0,30000,3000,0,0
//-- BA_FROSTJOKER
318,0,4000,0,0,10000:11000:12000:13000:14000,0,0
318,0,4000,0,0,30000,0,0
//-- BA_WHISTLE
319,0,0,0,60000,20000,0,0
//-- BA_ASSASSINCROSS
Expand Down
2 changes: 1 addition & 1 deletion src/map/battle.c
Expand Up @@ -252,7 +252,7 @@ struct block_list* battle_getenemyarea(struct block_list *src, int x, int y, int
* @param skill_lv: Level of skill used
* @param skill_id: ID o skill used
* @param dmg_lv: State of the attack (miss, etc.)
* @param attack_type: Damage delay
* @param attack_type: Type of the attack (BF_NORMAL|BF_SKILL|BF_SHORT|BF_LONG|BF_WEAPON|BF_MAGIC|BF_MISC)
* @param additional_effects: Whether additional effect should be applied
* @param tick: Current tick
*------------------------------------------*/
Expand Down
25 changes: 12 additions & 13 deletions src/map/skill.c
Expand Up @@ -3892,6 +3892,11 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
map_foreachinarea(skill_frostjoke_scream,skl->map,skl->x-range,skl->y-range,
skl->x+range,skl->y+range,BL_CHAR,src,skl->skill_id,skl->skill_lv,tick);
break;
case PR_LEXDIVINA:
case PR_STRECOVERY:
case BS_HAMMERFALL:
sc_start(src, target, status_skill2sc(skl->skill_id), skl->type, skl->skill_lv, skill_get_time2(skl->skill_id, skl->skill_lv));
break;
case NPC_EARTHQUAKE:
if( skl->type > 1 )
skill_addtimerskill(src,tick+250,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
Expand Down Expand Up @@ -5998,10 +6003,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui

case PR_LEXDIVINA:
case MER_LEXDIVINA:
if( tsce )
status_change_end(bl,type, INVALID_TIMER);
if (tsce)
status_change_end(bl, type, INVALID_TIMER);
else
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv));
skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag);
clif_skill_nodamage (src, bl, skill_id, skill_lv, 1);
break;

Expand Down Expand Up @@ -6699,9 +6704,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;

case BS_HAMMERFALL:
clif_skill_nodamage(src,bl,skill_id,skill_lv,
sc_start(src,bl,SC_STUN,(20 + 10 * skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv)));
skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, (20 + 10 * skill_lv), flag);
break;

case RG_RAID:
skill_area_temp[1] = 0;
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
Expand Down Expand Up @@ -6971,7 +6976,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case BA_FROSTJOKER:
case DC_SCREAM:
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
skill_addtimerskill(src,tick+2000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag);
skill_addtimerskill(src,tick+3000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag);

if (md) {
// custom hack to make the mob display the skill, because these skills don't show the skill use text themselves
Expand Down Expand Up @@ -7098,14 +7103,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER);
}
status_change_end(bl, SC_STASIS, INVALID_TIMER);
//Is this equation really right? It looks so... special.
if(battle_check_undead(tstatus->race,tstatus->def_ele))
{
status_change_start(src,bl, SC_BLIND,
100*(100-(tstatus->int_/2+tstatus->vit/3+tstatus->luk/10)),
1,0,0,0,
skill_get_time2(skill_id, skill_lv) * (100-(tstatus->int_+tstatus->vit)/2)/100,SCSTART_NONE);
}
skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag);
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
if(dstmd)
mob_unlocktarget(dstmd,tick);
Expand Down
2 changes: 1 addition & 1 deletion src/map/skill.h
Expand Up @@ -242,7 +242,7 @@ struct s_skill_nounit_layout {
int dy[MAX_SKILL_UNIT_COUNT];
};

#define MAX_SKILLTIMERSKILL 15
#define MAX_SKILLTIMERSKILL 40
struct skill_timerskill {
int timer;
int src_id;
Expand Down
10 changes: 10 additions & 0 deletions src/map/status.c
Expand Up @@ -255,13 +255,15 @@ void initChangeTables(void)
set_sc( PR_KYRIE , SC_KYRIE , SI_KYRIE , SCB_NONE );
set_sc( PR_MAGNIFICAT , SC_MAGNIFICAT , SI_MAGNIFICAT , SCB_REGEN );
set_sc( PR_GLORIA , SC_GLORIA , SI_GLORIA , SCB_LUK );
add_sc( PR_STRECOVERY , SC_BLIND );
add_sc( PR_LEXDIVINA , SC_SILENCE );
set_sc( PR_LEXAETERNA , SC_AETERNA , SI_AETERNA , SCB_NONE );
add_sc( WZ_METEOR , SC_STUN );
add_sc( WZ_VERMILION , SC_BLIND );
add_sc( WZ_FROSTNOVA , SC_FREEZE );
add_sc( WZ_STORMGUST , SC_FREEZE );
set_sc( WZ_QUAGMIRE , SC_QUAGMIRE , SI_QUAGMIRE , SCB_AGI|SCB_DEX|SCB_ASPD|SCB_SPEED );
add_sc( BS_HAMMERFALL , SC_STUN );
set_sc( BS_ADRENALINE , SC_ADRENALINE , SI_ADRENALINE , SCB_ASPD );
set_sc( BS_WEAPONPERFECT , SC_WEAPONPERFECTION , SI_WEAPONPERFECTION , SCB_NONE );
set_sc( BS_OVERTHRUST , SC_OVERTHRUST , SI_OVERTHRUST , SCB_NONE );
Expand Down Expand Up @@ -8355,6 +8357,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF)
status_change_end(bl, SC_GOSPEL, INVALID_TIMER);
break;
case SC_FREEZE:
status_change_end(bl, SC_AETERNA, INVALID_TIMER);
break;
case SC_HIDING:
status_change_end(bl, SC_CLOSECONFINE, INVALID_TIMER);
status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER);
Expand Down Expand Up @@ -10465,6 +10470,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
switch (type) {
case SC_FREEZE:
case SC_STUN:
if(sc->data[SC_DANCING])
unit_stop_walking(bl, 1);
case SC_SLEEP:
case SC_STONE:
case SC_WHITEIMPRISON:
Expand All @@ -10480,6 +10487,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
// Fall through
case SC_CURSEDCIRCLE_ATKER:
unit_stop_attack(bl);
if (type == SC_FREEZE || type == SC_STUN)
break; //Handled above
// Fall through
case SC_STOP:
case SC_CONFUSION:
Expand Down Expand Up @@ -11880,6 +11889,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
sce->val4 = 0;
unit_stop_walking(bl,1);
unit_stop_attack(bl);
status_change_end(bl, SC_AETERNA, INVALID_TIMER);
sc->opt1 = OPT1_STONE;
clif_changeoption(bl);
sc_timer_next(1000+tick,status_change_timer, bl->id, data );
Expand Down
4 changes: 3 additions & 1 deletion src/map/unit.c
Expand Up @@ -1436,8 +1436,10 @@ int unit_set_walkdelay(struct block_list *bl, unsigned int tick, int delay, int
return 0;
} else {
// Don't set walk delays when already trapped.
if (!unit_can_move(bl))
if (!unit_can_move(bl)) {
unit_stop_walking(bl,4); //Unit might still be moving even though it can't move
return 0;
}
//Immune to being stopped for double the flinch time
if (DIFF_TICK(ud->canmove_tick, tick-delay) > 0)
return 0;
Expand Down

0 comments on commit f5ea1dc

Please sign in to comment.