|
@@ -8729,11 +8729,15 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
if( sc && !sc->count )
|
|
if( sc && !sc->count )
|
|
sc = NULL;
|
|
sc = NULL;
|
|
|
|
|
|
|
|
+#ifdef RENEWAL
|
|
|
|
+ uint16 levelAdv = (pow(max(0, status_get_lv(src) - status_get_lv(bl)), 2) / 5) * 100;
|
|
|
|
+#endif
|
|
|
|
+
|
|
switch (type) {
|
|
switch (type) {
|
|
case SC_POISON:
|
|
case SC_POISON:
|
|
case SC_DPOISON:
|
|
case SC_DPOISON:
|
|
- sc_def = status->vit*100;
|
|
|
|
#ifndef RENEWAL
|
|
#ifndef RENEWAL
|
|
|
|
+ sc_def = status->vit*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
if (sd) {
|
|
if (sd) {
|
|
// For players: 60000 - 450*vit - 100*luk
|
|
// For players: 60000 - 450*vit - 100*luk
|
|
@@ -8744,71 +8748,104 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
tick>>=1;
|
|
tick>>=1;
|
|
tick_def = (status->vit*200)/3;
|
|
tick_def = (status->vit*200)/3;
|
|
}
|
|
}
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->vit * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -2000;
|
|
#endif
|
|
#endif
|
|
break;
|
|
break;
|
|
case SC_STUN:
|
|
case SC_STUN:
|
|
|
|
+#ifndef RENEWAL
|
|
sc_def = status->vit*100;
|
|
sc_def = status->vit*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
tick_def2 = status->luk*10;
|
|
tick_def2 = status->luk*10;
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->vit * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -500;
|
|
|
|
+#endif
|
|
break;
|
|
break;
|
|
case SC_SILENCE:
|
|
case SC_SILENCE:
|
|
#ifndef RENEWAL
|
|
#ifndef RENEWAL
|
|
sc_def = status->vit*100;
|
|
sc_def = status->vit*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
|
|
+ tick_def2 = status->luk*10;
|
|
#else
|
|
#else
|
|
- sc_def = status->int_*100;
|
|
|
|
- sc_def2 = (status->vit + status->luk) * 5 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
|
|
|
|
+ sc_def = status->int_ * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -2000;
|
|
#endif
|
|
#endif
|
|
- tick_def2 = status->luk*10;
|
|
|
|
break;
|
|
break;
|
|
case SC_BLEEDING:
|
|
case SC_BLEEDING:
|
|
#ifndef RENEWAL
|
|
#ifndef RENEWAL
|
|
sc_def = status->vit*100;
|
|
sc_def = status->vit*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
|
|
+ tick_def2 = status->luk*10;
|
|
#else
|
|
#else
|
|
- sc_def = status->agi*100;
|
|
|
|
- sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
|
|
|
|
+ sc_def = status->agi * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -12000;
|
|
#endif
|
|
#endif
|
|
- tick_def2 = status->luk*10;
|
|
|
|
break;
|
|
break;
|
|
case SC_SLEEP:
|
|
case SC_SLEEP:
|
|
#ifndef RENEWAL
|
|
#ifndef RENEWAL
|
|
sc_def = status->int_*100;
|
|
sc_def = status->int_*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
|
|
+ tick_def2 = status->luk*10;
|
|
#else
|
|
#else
|
|
- sc_def = status->agi*100;
|
|
|
|
- sc_def2 = (status->int_ + status->luk) * 5 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
|
|
|
|
+ sc_def = status->agi * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -2000;
|
|
#endif
|
|
#endif
|
|
- tick_def2 = status->luk*10;
|
|
|
|
break;
|
|
break;
|
|
case SC_STONE:
|
|
case SC_STONE:
|
|
|
|
+#ifndef RENEWAL
|
|
sc_def = status->mdef*100;
|
|
sc_def = status->mdef*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
tick_def = 0; // No duration reduction
|
|
tick_def = 0; // No duration reduction
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->mdef * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -3000;
|
|
|
|
+#endif
|
|
break;
|
|
break;
|
|
case SC_FREEZE:
|
|
case SC_FREEZE:
|
|
|
|
+#ifndef RENEWAL
|
|
sc_def = status->mdef*100;
|
|
sc_def = status->mdef*100;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
tick_def2 = status_src->luk*-10; // Caster can increase final duration with luk
|
|
tick_def2 = status_src->luk*-10; // Caster can increase final duration with luk
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->mdef * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -3000;
|
|
|
|
+#endif
|
|
break;
|
|
break;
|
|
case SC_CURSE:
|
|
case SC_CURSE:
|
|
// Special property: immunity when luk is zero
|
|
// Special property: immunity when luk is zero
|
|
if (status->luk == 0)
|
|
if (status->luk == 0)
|
|
return 0;
|
|
return 0;
|
|
|
|
+#ifndef RENEWAL
|
|
sc_def = status->luk*100;
|
|
sc_def = status->luk*100;
|
|
sc_def2 = status->luk*10 - status_get_lv(src)*10; // Curse only has a level penalty and no resistance
|
|
sc_def2 = status->luk*10 - status_get_lv(src)*10; // Curse only has a level penalty and no resistance
|
|
tick_def = status->vit*100;
|
|
tick_def = status->vit*100;
|
|
tick_def2 = status->luk*10;
|
|
tick_def2 = status->luk*10;
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->luk * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -2000;
|
|
|
|
+#endif
|
|
break;
|
|
break;
|
|
case SC_BLIND:
|
|
case SC_BLIND:
|
|
|
|
+#ifndef RENEWAL
|
|
sc_def = (status->vit + status->int_)*50;
|
|
sc_def = (status->vit + status->int_)*50;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
|
|
tick_def2 = status->luk*10;
|
|
tick_def2 = status->luk*10;
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->int_ * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -2000;
|
|
|
|
+#endif
|
|
break;
|
|
break;
|
|
case SC_CONFUSION:
|
|
case SC_CONFUSION:
|
|
|
|
+#ifndef RENEWAL
|
|
sc_def = (status->str + status->int_)*50;
|
|
sc_def = (status->str + status->int_)*50;
|
|
sc_def2 = status_get_lv(src)*10 - status_get_lv(bl)*10 - status->luk*10; // Reversed sc_def2
|
|
sc_def2 = status_get_lv(src)*10 - status_get_lv(bl)*10 - status->luk*10; // Reversed sc_def2
|
|
tick_def2 = status->luk*10;
|
|
tick_def2 = status->luk*10;
|
|
|
|
+#else
|
|
|
|
+ sc_def = status->luk * 100 - levelAdv;
|
|
|
|
+ tick_def2 = -2000;
|
|
|
|
+#endif
|
|
break;
|
|
break;
|
|
case SC_DECREASEAGI:
|
|
case SC_DECREASEAGI:
|
|
if (sd)
|
|
if (sd)
|
|
@@ -8840,18 +8877,21 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
tick_def2 = (status->vit + status->dex) * 50;
|
|
tick_def2 = (status->vit + status->dex) * 50;
|
|
break;
|
|
break;
|
|
case SC_WHITEIMPRISON:
|
|
case SC_WHITEIMPRISON:
|
|
- if( tick == 5000 ) // 100% on caster
|
|
|
|
|
|
+ if( src == bl ) // 100% on caster
|
|
break;
|
|
break;
|
|
- if( bl->type == BL_PC )
|
|
|
|
- tick_def2 = status_get_lv(bl)*20 + status->vit*25 + status->agi*10;
|
|
|
|
- else
|
|
|
|
- tick_def2 = (status->vit + status->luk)*50;
|
|
|
|
|
|
+ sc_def = status->str * 20 + status_get_lv(bl) * 20 + status->luk * 10;
|
|
|
|
+ tick_def2 = -2000;
|
|
|
|
+ break;
|
|
|
|
+ case SC_FEAR:
|
|
|
|
+ sc_def = status->int_ * 20 + status_get_lv(bl) * 20 + status->luk * 10;
|
|
|
|
+ tick_def2 = -4000; // 2 seconds is applied twice on Aegis
|
|
break;
|
|
break;
|
|
case SC_BURNING:
|
|
case SC_BURNING:
|
|
- tick_def2 = 75*status->luk + 125*status->agi;
|
|
|
|
|
|
+ sc_def = status->agi * 20 + status_get_lv(bl) * 20 + status->luk * 10;
|
|
|
|
+ tick_def2 = -2000;
|
|
break;
|
|
break;
|
|
case SC_FREEZING:
|
|
case SC_FREEZING:
|
|
- tick_def2 = (status->vit + status->dex)*50;
|
|
|
|
|
|
+ tick_def2 = (status->vit + status->dex) * 50;
|
|
break;
|
|
break;
|
|
case SC_OBLIVIONCURSE: // 100% - (100 - 0.8 x INT)
|
|
case SC_OBLIVIONCURSE: // 100% - (100 - 0.8 x INT)
|
|
sc_def = status->int_ * 80;
|
|
sc_def = status->int_ * 80;
|
|
@@ -8875,7 +8915,7 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
tick_def2 = (status->vit + status->agi) * 70;
|
|
tick_def2 = (status->vit + status->agi) * 70;
|
|
break;
|
|
break;
|
|
case SC_CRYSTALIZE:
|
|
case SC_CRYSTALIZE:
|
|
- tick_def2 = (sd ? sd->status.vit : status_get_base_status(bl)->vit) * 100;
|
|
|
|
|
|
+ tick_def2 = status_get_base_status(bl)->vit * 100;
|
|
break;
|
|
break;
|
|
case SC_VACUUM_EXTREME:
|
|
case SC_VACUUM_EXTREME:
|
|
tick_def2 = (sd ? sd->status.str : status_get_base_status(bl)->str) * 50;
|
|
tick_def2 = (sd ? sd->status.str : status_get_base_status(bl)->str) * 50;
|
|
@@ -8909,8 +8949,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
sc_def2 = sc_def2*battle_config.pc_sc_def_rate/100;
|
|
sc_def2 = sc_def2*battle_config.pc_sc_def_rate/100;
|
|
}
|
|
}
|
|
|
|
|
|
- sc_def = min(sc_def, battle_config.pc_max_sc_def*100);
|
|
|
|
- sc_def2 = min(sc_def2, battle_config.pc_max_sc_def*100);
|
|
|
|
|
|
+ sc_def = cap_value(sc_def, 0, battle_config.pc_max_sc_def*100);
|
|
|
|
+ sc_def2 = cap_value(sc_def2, 0, battle_config.pc_max_sc_def*100);
|
|
|
|
|
|
if (battle_config.pc_sc_def_rate != 100) {
|
|
if (battle_config.pc_sc_def_rate != 100) {
|
|
tick_def = tick_def*battle_config.pc_sc_def_rate/100;
|
|
tick_def = tick_def*battle_config.pc_sc_def_rate/100;
|
|
@@ -8922,8 +8962,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
sc_def2 = sc_def2*battle_config.mob_sc_def_rate/100;
|
|
sc_def2 = sc_def2*battle_config.mob_sc_def_rate/100;
|
|
}
|
|
}
|
|
|
|
|
|
- sc_def = min(sc_def, battle_config.mob_max_sc_def*100);
|
|
|
|
- sc_def2 = min(sc_def2, battle_config.mob_max_sc_def*100);
|
|
|
|
|
|
+ sc_def = cap_value(sc_def, 0, battle_config.mob_max_sc_def*100);
|
|
|
|
+ sc_def2 = cap_value(sc_def2, 0, battle_config.mob_max_sc_def*100);
|
|
|
|
|
|
if (battle_config.mob_sc_def_rate != 100) {
|
|
if (battle_config.mob_sc_def_rate != 100) {
|
|
tick_def = tick_def*battle_config.mob_sc_def_rate/100;
|
|
tick_def = tick_def*battle_config.mob_sc_def_rate/100;
|
|
@@ -8983,41 +9023,31 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
|
|
|
|
|
// Cap minimum rate
|
|
// Cap minimum rate
|
|
rate = max(rate, scdb->min_rate);
|
|
rate = max(rate, scdb->min_rate);
|
|
- // Cap minimum duration
|
|
|
|
- tick = i64max(tick, scdb->min_duration);
|
|
|
|
|
|
|
|
if (rate < 10000 && (rate <= 0 || !(rnd()%10000 < rate)))
|
|
if (rate < 10000 && (rate <= 0 || !(rnd()%10000 < rate)))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
// Duration cannot be reduced
|
|
// Duration cannot be reduced
|
|
if (flag&SCSTART_NOTICKDEF)
|
|
if (flag&SCSTART_NOTICKDEF)
|
|
- return i64max(tick, 1);
|
|
|
|
|
|
+ return i64max(tick, scdb->min_duration);
|
|
|
|
|
|
tick -= tick*tick_def/10000;
|
|
tick -= tick*tick_def/10000;
|
|
- tick -= tick_def2;
|
|
|
|
|
|
|
|
- // Minimum durations
|
|
|
|
- switch (type) {
|
|
|
|
- case SC_ANKLE:
|
|
|
|
- case SC_MARSHOFABYSS:
|
|
|
|
- tick = i64max(tick, 5000); // Minimum duration 5s
|
|
|
|
- break;
|
|
|
|
- case SC_FREEZING:
|
|
|
|
- tick = i64max(tick, 6000); // Minimum duration 6s
|
|
|
|
- // NEED AEGIS CHECK: might need to be 10s (http://ro.gnjoy.com/news/notice/View.asp?seq=5352)
|
|
|
|
- break;
|
|
|
|
- case SC_BURNING:
|
|
|
|
- case SC_STASIS:
|
|
|
|
- case SC_VOICEOFSIREN:
|
|
|
|
- tick = i64max(tick, 10000); // Minimum duration 10s
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- // Skills need to trigger even if the duration is reduced below 1ms
|
|
|
|
- tick = i64max(tick, 1);
|
|
|
|
- break;
|
|
|
|
|
|
+#ifdef RENEWAL
|
|
|
|
+ // Renewal applies item resistance also to duration
|
|
|
|
+ if (sd) {
|
|
|
|
+ for (const auto &it : sd->reseff) {
|
|
|
|
+ if (it.id == type)
|
|
|
|
+ tick -= tick * it.val / 10000;
|
|
|
|
+ }
|
|
|
|
+ if (sd->sc.data[SC_COMMONSC_RESIST] && SC_COMMON_MIN <= type && type <= SC_COMMON_MAX)
|
|
|
|
+ tick -= tick * sd->sc.data[SC_COMMONSC_RESIST]->val1 / 100;
|
|
}
|
|
}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ tick -= tick_def2;
|
|
|
|
|
|
- return tick;
|
|
|
|
|
|
+ return i64max(tick, scdb->min_duration);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -9245,6 +9275,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|
if (undead_flag && !(flag&SCSTART_NOAVOID))
|
|
if (undead_flag && !(flag&SCSTART_NOAVOID))
|
|
return 0;
|
|
return 0;
|
|
break;
|
|
break;
|
|
|
|
+ case SC_BURNING:
|
|
|
|
+ // Level 2 Fire Element is immune
|
|
|
|
+ if (status->def_ele == ELE_FIRE && status->ele_lv == 2)
|
|
|
|
+ return 0;
|
|
|
|
+ break;
|
|
case SC_ALL_RIDING:
|
|
case SC_ALL_RIDING:
|
|
if( !sd || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_MADOGEAR) )
|
|
if( !sd || sc->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_MADOGEAR) )
|
|
return 0;
|
|
return 0;
|