From f1a641e260f983fa0f5d0e1b4d8097f2c7fc5432 Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 13 Mar 2006 18:50:35 +0000 Subject: - Shield Reflect is now passed through Devotion as well. - Devotion won't work on guildmates now (only party-members) - Devoted to characters lose the devotion effect when the Crusader is at less than 25% Hp. - Changed Gravity Field's element to earth so that it may hit hidden chars. - chrif_scdata_save will not send a save scdata request when the char has been already tagged as in the final save. - Cleaned up status_change_start a bit to make status_change_end calls on a separate switch, before it is cancelled by the switch about "sc already active". If it fails because the sc is already active, now it returns 1. - Cleaned SC_SUITON a bit to get rid of that compile warning. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@5589 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 9 ++ db/Changelog.txt | 3 + db/skill_db.txt | 4 +- src/map/chrif.c | 2 + src/map/pc.c | 25 ++--- src/map/skill.c | 2 +- src/map/status.c | 296 ++++++++++++++++++++++++++-------------------------- 7 files changed, 177 insertions(+), 164 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 228cf1a7e..93121da48 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -5,6 +5,15 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS 2006/03/13 + * Shield Reflect is now passed through Devotion as well. [Skotlex] + - Devoted characters lose the devotion effect when the Crusader is at less + than 25% Hp. [Skotlex] + * chrif_scdata_save will not send a save scdata request when the char has + been already tagged as in the final save. [Skotlex] + * Some status_change_start cleanups, stuff like blessing should now remove + stone/curse even if the status does not begins because the character is + already blessed. [Skotlex] + * Cleaned SC_SUITON a bit to get rid of that compile warning. [Skotlex] * Added function battle_calc_gvg_damage for gvg related damage reductions. Fixes Gravitation being reduced as well as Pressure overriding max-castles restriction. [Skotlex] diff --git a/db/Changelog.txt b/db/Changelog.txt index e2b13d77f..76b849e72 100644 --- a/db/Changelog.txt +++ b/db/Changelog.txt @@ -26,6 +26,9 @@ ========================= 03/13 + * Devotion won't work on guildmates now (only party-members) [Skotlex] + * Changed Gravity Field's element to earth so that it may hit hidden chars. + [Skotlex] * Added missing mob skills to G_HYDRA, G_PARASITE [Lupus] * Fixed TK and Soul Linker's position of their job entry in exp2.txt, thanks to Coltaro. [Skotlex] diff --git a/db/skill_db.txt b/db/skill_db.txt index f1850ca45..fb0eebd3d 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -274,7 +274,7 @@ 252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#Shield Reflect# 253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0 //CR_HOLYCROSS#Holy Cross# 254,0,6,4,6,0,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#Grand Cross# -255,7:8:9:10:11,6,16,0,1,0,5,1,yes,0,3584,0,none,0 //CR_DEVOTION#Sacrifice# +255,7:8:9:10:11,6,16,0,1,0,5,1,yes,0,1536,0,none,0 //CR_DEVOTION#Sacrifice# 256,9,6,16,0,1,0,5,1,yes,0,512,0,none,0 //CR_PROVIDENCE#Resistant Souls# 257,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#Defending Aura# 258,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //CR_SPEARQUICKEN#Spear Quicken# @@ -503,7 +503,7 @@ 481,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //HP_MANARECHARGE#Mana Recharge# 482,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_DOUBLECASTING#Double Casting# 483,9,6,2,0,1,0,1,1,no,0,0,0,none,0 //HW_GANBANTEIN#Ganbantein# -484,9,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field# +484,9,6,2,2,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field# 485,-2,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //WS_CARTTERMINATION#Cart Termination# 486,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust# 487,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //CG_LONGINGFREEDOM#Longing for Freedom# diff --git a/src/map/chrif.c b/src/map/chrif.c index 2ba1ede84..4a37e1f1a 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -1155,6 +1155,8 @@ int chrif_save_scdata(struct map_session_data *sd) struct status_change_data data; struct TimerData *timer; + if (sd->state.finalsave) //Character was already saved? + return -1; #ifndef TXT_ONLY if(charsave_method) //New 'Local' save { diff --git a/src/map/pc.c b/src/map/pc.c index af5e362e0..e20f15f75 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2145,11 +2145,11 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4 switch(type){ case SP_AUTOSPELL: if(sd->state.lr_flag != 2) - pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, val?type2:-type2, type3, type4, current_equip_card_id); + pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, (val?type2:-type2), type3, type4, current_equip_card_id); break; case SP_AUTOSPELL_WHENHIT: if(sd->state.lr_flag != 2) - pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, val?type2:-type2, type3, type4, current_equip_card_id); + pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, (val?type2:-type2), type3, type4, current_equip_card_id); break; default: if(battle_config.error_log) @@ -5272,14 +5272,21 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) clif_updatestatus(sd,SP_HP); - if(sd->status.hp>0){ - if(sd->status.hpstatus.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer != -1 && + + if (sd->status.hpstatus.max_hp>>2) { //25% HP left effects. + if(sd->status.hp>0 && sd->sc.data[SC_AUTOBERSERK].timer != -1 && (sd->sc.data[SC_PROVOKE].timer==-1 || sd->sc.data[SC_PROVOKE].val2==0 )) - // オ?トバ?サ?ク?動 sc_start4(&sd->bl,SC_PROVOKE,100,10,1,0,0,0); - sd->canlog_tick = gettick(); + for(i = 0; i < 5; i++) + if (sd->devotion[i]){ + struct map_session_data *devsd = map_id2sd(sd->devotion[i]); + if (devsd) status_change_end(&devsd->bl,SC_DEVOTION,-1); + } + } + if(sd->status.hp>0){ + sd->canlog_tick = gettick(); return damage; } @@ -5416,12 +5423,6 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) sd->state.snovice_flag = 4; } - for(i = 0; i < 5; i++) - if (sd->devotion[i]){ - struct map_session_data *devsd = map_id2sd(sd->devotion[i]); - if (devsd) status_change_end(&devsd->bl,SC_DEVOTION,-1); - } - pc_setdead(sd); skill_unit_move(&sd->bl,gettick(),4); if (battle_config.clear_unit_ondeath) diff --git a/src/map/skill.c b/src/map/skill.c index 716d6ef17..c88666ea3 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1000,7 +1000,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int case AS_GRIMTOOTH: { - int type = sd?SC_SLOWDOWN:SC_STOP; + int type = dstsd?SC_SLOWDOWN:SC_STOP; if (tsc->data[type].timer == -1) sc_start(bl,type,100,skilllv,skill_get_time2(skillid, skilllv)); break; diff --git a/src/map/status.c b/src/map/status.c index 0edb39ccb..5b44f6ba4 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1717,14 +1717,8 @@ int status_calc_agi(struct block_list *bl, int agi) agi -= 2 + sc->data[SC_DECREASEAGI].val1; if(sc->data[SC_QUAGMIRE].timer!=-1) agi -= sc->data[SC_QUAGMIRE].val1*(bl->type==BL_PC?5:10); - if(sc->data[SC_SUITON].timer!=-1 && status_get_class(bl) != JOB_NINJA) - if (sc->data[SC_SUITON].val1 > 7) - agi -= 8; - else if (sc->data[SC_SUITON].val1 > 4) - agi -= 5; - else if (sc->data[SC_SUITON].val1 > 1) - agi -= 3; - + if(sc->data[SC_SUITON].timer!=-1) + agi -= sc->data[SC_SUITON].val2; } return agi; @@ -3639,7 +3633,113 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val return 0; } } - + //Before overlapping fail, one must check for status cured. + switch (type) { + case SC_BLESSING: + if (!undead_flag && race!=6) { + if (sc->data[SC_CURSE].timer!=-1) + status_change_end(bl,SC_CURSE,-1); + if (sc->data[SC_STONE].timer!=-1 && sc->data[SC_STONE].val2==0) + status_change_end(bl,SC_STONE,-1); + } + break; + case SC_INCREASEAGI: + if(sc->data[SC_DECREASEAGI].timer!=-1 ) + status_change_end(bl,SC_DECREASEAGI,-1); + break; + case SC_DONTFORGETME: + //is this correct? Maybe all three should stop the same subset of SCs... + if(sc->data[SC_ASSNCROS].timer!=-1 ) + status_change_end(bl,SC_ASSNCROS,-1); + case SC_QUAGMIRE: + if(sc->data[SC_CONCENTRATE].timer!=-1 ) + status_change_end(bl,SC_CONCENTRATE,-1); + if(sc->data[SC_TRUESIGHT].timer!=-1 ) + status_change_end(bl,SC_TRUESIGHT,-1); + if(sc->data[SC_WINDWALK].timer!=-1 ) + status_change_end(bl,SC_WINDWALK,-1); + //Also blocks the ones below... + case SC_DECREASEAGI: + if(sc->data[SC_INCREASEAGI].timer!=-1 ) + status_change_end(bl,SC_INCREASEAGI,-1); + if(sc->data[SC_ADRENALINE].timer!=-1 ) + status_change_end(bl,SC_ADRENALINE,-1); + if(sc->data[SC_ADRENALINE2].timer!=-1 ) + status_change_end(bl,SC_ADRENALINE2,-1); + if(sc->data[SC_SPEARSQUICKEN].timer!=-1 ) + status_change_end(bl,SC_SPEARSQUICKEN,-1); + if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 ) + status_change_end(bl,SC_TWOHANDQUICKEN,-1); + if(sc->data[SC_CARTBOOST].timer!=-1 ) + status_change_end(bl,SC_CARTBOOST,-1); + if(sc->data[SC_ONEHAND].timer!=-1 ) + status_change_end(bl,SC_ONEHAND,-1); + break; + case SC_ONEHAND: + //Removes the Aspd potion effect, as reported by Vicious. [Skotlex] + if(sc->data[SC_ASPDPOTION0].timer!=-1) + status_change_end(bl,SC_ASPDPOTION0,-1); + if(sc->data[SC_ASPDPOTION1].timer!=-1) + status_change_end(bl,SC_ASPDPOTION1,-1); + if(sc->data[SC_ASPDPOTION2].timer!=-1) + status_change_end(bl,SC_ASPDPOTION2,-1); + if(sc->data[SC_ASPDPOTION3].timer!=-1) + status_change_end(bl,SC_ASPDPOTION3,-1); + break; + case SC_MAXOVERTHRUST: + //Cancels Normal Overthrust. [Skotlex] + if (sc->data[SC_OVERTHRUST].timer != -1) + status_change_end(bl, SC_OVERTHRUST, -1); + break; + case SC_KYRIE: + // -- moonsoul (added to undo assumptio status if target has it) + if(sc->data[SC_ASSUMPTIO].timer!=-1 ) + status_change_end(bl,SC_ASSUMPTIO,-1); + break; + case SC_DELUGE: + if (sc->data[SC_FOGWALL].timer != -1 && sc->data[SC_BLIND].timer != -1) + status_change_end(bl,SC_BLIND,-1); + break; + case SC_SILENCE: + if (sc->data[SC_GOSPEL].timer!=-1 && sc->data[SC_GOSPEL].val4 == BCT_SELF) + //Clear Gospel [Skotlex] + status_change_end(bl,SC_GOSPEL,-1); + break; + case SC_HIDING: + if(sc->data[SC_CLOSECONFINE].timer != -1) + status_change_end(bl, SC_CLOSECONFINE, -1); + if(sc->data[SC_CLOSECONFINE2].timer != -1) + status_change_end(bl, SC_CLOSECONFINE2, -1); + break; + case SC_BERSERK: /* バ?サ?ク */ + if(battle_config.berserk_cancels_buffs) + { + if (sc->data[SC_ONEHAND].timer != -1) + status_change_end(bl,SC_ONEHAND,-1); + if (sc->data[SC_TWOHANDQUICKEN].timer != -1) + status_change_end(bl,SC_TWOHANDQUICKEN,-1); + if (sc->data[SC_CONCENTRATION].timer != -1) + status_change_end(bl,SC_CONCENTRATION,-1); + if (sc->data[SC_PARRYING].timer != -1) + status_change_end(bl,SC_PARRYING,-1); + if (sc->data[SC_ENDURE].timer != -1) + status_change_end(bl,SC_ENDURE,-1); + if (sc->data[SC_AURABLADE].timer != -1) + status_change_end(bl,SC_AURABLADE,-1); + } + break; + case SC_ASSUMPTIO: + if(sc->data[SC_KYRIE].timer!=-1) + status_change_end(bl,SC_KYRIE,-1); + break; + case SC_CARTBOOST: /* カ?トブ?スト */ + if(sc->data[SC_DECREASEAGI].timer!=-1 ) + { //Cancel Decrease Agi, but take no further effect [Skotlex] + status_change_end(bl,SC_DECREASEAGI,-1); + return 0; + } + break; + } //Check for overlapping fails if(sc->data[type].timer != -1){ switch (type) { @@ -3677,7 +3777,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break; default: if(sc->data[type].val1 > val1) - return 0; + return 1; //Return true to not mess up skill animations. [Skotlex } (sc->count)--; delete_timer(sc->data[type].timer, status_change_timer); @@ -3711,28 +3811,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val } break; - case SC_INCREASEAGI: /* 速度上昇 */ - calc_flag = 1; - if(sc->data[SC_DECREASEAGI].timer!=-1 ) - status_change_end(bl,SC_DECREASEAGI,-1); - break; - case SC_DECREASEAGI: /* 速度減少 */ - calc_flag = 1; - if(sc->data[SC_INCREASEAGI].timer!=-1 ) - status_change_end(bl,SC_INCREASEAGI,-1); - if(sc->data[SC_ADRENALINE].timer!=-1 ) - status_change_end(bl,SC_ADRENALINE,-1); - if(sc->data[SC_ADRENALINE2].timer!=-1 ) - status_change_end(bl,SC_ADRENALINE2,-1); - if(sc->data[SC_SPEARSQUICKEN].timer!=-1 ) - status_change_end(bl,SC_SPEARSQUICKEN,-1); - if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 ) - status_change_end(bl,SC_TWOHANDQUICKEN,-1); - if(sc->data[SC_CARTBOOST].timer!=-1 ) - status_change_end(bl,SC_CARTBOOST,-1); - if(sc->data[SC_ONEHAND].timer!=-1 ) - status_change_end(bl,SC_ONEHAND,-1); - break; case SC_SIGNUMCRUCIS: /* シグナムクルシス */ calc_flag = 1; val2 = 10 + val1*2; @@ -3740,21 +3818,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val tick = 600*1000; clif_emotion(bl,4); break; - case SC_ONEHAND: //Removes the Aspd potion effect, as reported by Vicious. [Skotlex] - if(sc->data[SC_ASPDPOTION0].timer!=-1) - status_change_end(bl,SC_ASPDPOTION0,-1); - if(sc->data[SC_ASPDPOTION1].timer!=-1) - status_change_end(bl,SC_ASPDPOTION1,-1); - if(sc->data[SC_ASPDPOTION2].timer!=-1) - status_change_end(bl,SC_ASPDPOTION2,-1); - if(sc->data[SC_ASPDPOTION3].timer!=-1) - status_change_end(bl,SC_ASPDPOTION3,-1); - calc_flag = 1; - break; - case SC_MAXOVERTHRUST: //Cancels Normal Overthrust. [Skotlex] - if (sc->data[SC_OVERTHRUST].timer != -1) - status_change_end(bl, SC_OVERTHRUST, -1); - break; case SC_MAXIMIZEPOWER: /* マキシマイズパワ?(SPが1減る時間,val2にも) */ if (!(flag&4)) { @@ -3780,37 +3843,11 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val val2 = status_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* 耐久度 */ val3 = (val1 / 2 + 5); /* 回? */ } -// -- moonsoul (added to undo assumptio status if target has it) - if(sc->data[SC_ASSUMPTIO].timer!=-1 ) - status_change_end(bl,SC_ASSUMPTIO,-1); break; case SC_MINDBREAKER: calc_flag = 1; if(tick <= 0) tick = 1000; /* (オ?トバ?サ?ク) */ break; - case SC_QUAGMIRE: /* クァグマイア */ - calc_flag = 1; - if(sc->data[SC_CONCENTRATE].timer!=-1 ) /* 集中力向上解除 */ - status_change_end(bl,SC_CONCENTRATE,-1); - if(sc->data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */ - status_change_end(bl,SC_INCREASEAGI,-1); - if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 ) - status_change_end(bl,SC_TWOHANDQUICKEN,-1); - if(sc->data[SC_ONEHAND].timer!=-1 ) - status_change_end(bl,SC_ONEHAND,-1); - if(sc->data[SC_SPEARSQUICKEN].timer!=-1 ) - status_change_end(bl,SC_SPEARSQUICKEN,-1); - if(sc->data[SC_ADRENALINE].timer!=-1 ) - status_change_end(bl,SC_ADRENALINE,-1); - if(sc->data[SC_ADRENALINE2].timer!=-1 ) - status_change_end(bl,SC_ADRENALINE2,-1); - if(sc->data[SC_TRUESIGHT].timer!=-1 ) /* トゥル?サイト */ - status_change_end(bl,SC_TRUESIGHT,-1); - if(sc->data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */ - status_change_end(bl,SC_WINDWALK,-1); - if(sc->data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */ - status_change_end(bl,SC_CARTBOOST,-1); - break; case SC_MAGICPOWER: calc_flag = 1; val2 = 1; @@ -3853,17 +3890,34 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1; val3 = val1*10; break; - case SC_DELUGE: - calc_flag = 1; - if (sc->data[SC_FOGWALL].timer != -1 && sc->data[SC_BLIND].timer != -1) - status_change_end(bl,SC_BLIND,-1); - break; case SC_VIOLENTGALE: calc_flag = 1; val3 = val1*3; break; case SC_SUITON: calc_flag = 1; + if (flag&4) + break; + if (status_get_class(bl) != JOB_NINJA) { + //Is there some kind of formula behind this? + switch ((val1+1)/3) { + case 3: + val2 = 8; + break; + case 2: + val2 = 5; + break; + case 1: + val2 = 3; + break; + case 0: + val2 = 0; + break; + default: + val2 = 3*((val1+1)/3); + break; + } + } else val2 = 0; break; case SC_SPEARSQUICKEN: /* スピアクイッケン */ @@ -3875,29 +3929,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1); break; - case SC_DONTFORGETME: /* 私を忘れないで */ - calc_flag = 1; - if(sc->data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */ - status_change_end(bl,SC_INCREASEAGI,-1); - if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 ) - status_change_end(bl,SC_TWOHANDQUICKEN,-1); - if(sc->data[SC_ONEHAND].timer!=-1 ) - status_change_end(bl,SC_ONEHAND,-1); - if(sc->data[SC_SPEARSQUICKEN].timer!=-1 ) - status_change_end(bl,SC_SPEARSQUICKEN,-1); - if(sc->data[SC_ADRENALINE].timer!=-1 ) - status_change_end(bl,SC_ADRENALINE,-1); - if(sc->data[SC_ADRENALINE2].timer!=-1 ) - status_change_end(bl,SC_ADRENALINE2,-1); - if(sc->data[SC_ASSNCROS].timer!=-1 ) - status_change_end(bl,SC_ASSNCROS,-1); - if(sc->data[SC_TRUESIGHT].timer!=-1 ) /* トゥル?サイト */ - status_change_end(bl,SC_TRUESIGHT,-1); - if(sc->data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */ - status_change_end(bl,SC_WINDWALK,-1); - if(sc->data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */ - status_change_end(bl,SC_CARTBOOST,-1); - break; case SC_MOONLIT: val2 = bl->id; skill_setmapcell(bl,CG_MOONLIT, val1, CELL_SETMOONLIT); @@ -4016,14 +4047,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val } break; - case SC_SILENCE: /* 沈?(レックスデビ?ナ) */ - if (sc->data[SC_GOSPEL].timer!=-1) { - if (sc->data[SC_GOSPEL].val4 == BCT_SELF) { //Clear Gospel [Skotlex] - status_change_end(bl,SC_GOSPEL,-1); - } - break; - } - break; case SC_CONFUSION: clif_emotion(bl,1); break; @@ -4034,10 +4057,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val /* option */ case SC_HIDING: /* ハイディング */ calc_flag = 1; - if(sc->data[SC_CLOSECONFINE].timer != -1) - status_change_end(bl, SC_CLOSECONFINE, -1); - if(sc->data[SC_CLOSECONFINE2].timer != -1) - status_change_end(bl, SC_CLOSECONFINE2, -1); if(bl->type == BL_PC && !(flag&4)) { val2 = tick / 1000; /* 持?時間 */ tick = 1000; @@ -4134,21 +4153,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break; case SC_BERSERK: /* バ?サ?ク */ - if(battle_config.berserk_cancels_buffs) - { - if (sc->data[SC_ONEHAND].timer != -1) - status_change_end(bl,SC_ONEHAND,-1); - if (sc->data[SC_TWOHANDQUICKEN].timer != -1) - status_change_end(bl,SC_TWOHANDQUICKEN,-1); - if (sc->data[SC_CONCENTRATION].timer != -1) - status_change_end(bl,SC_CONCENTRATION,-1); - if (sc->data[SC_PARRYING].timer != -1) - status_change_end(bl,SC_PARRYING,-1); - if (sc->data[SC_ENDURE].timer != -1) - status_change_end(bl,SC_ENDURE,-1); - if (sc->data[SC_AURABLADE].timer != -1) - status_change_end(bl,SC_AURABLADE,-1); - } if(sd && !(flag&4)){ sd->status.hp = sd->status.max_hp * 3; sd->status.sp = 0; @@ -4161,11 +4165,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1; break; - case SC_ASSUMPTIO: /* アスムプティオ */ - if(sc->data[SC_KYRIE].timer!=-1) - status_change_end(bl,SC_KYRIE,-1); - break; - case SC_WARM: //SG skills [Komurka] if (!(flag&4)) { val2 = tick/100; @@ -4243,6 +4242,10 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val type2 = SC_DEFENDER; if (src->sc.data[type2].timer != -1) sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1)); + type2 = SC_REFLECTSHIELD; + if (src->sc.data[type2].timer != -1) + sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1)); + } break; } @@ -4251,15 +4254,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val battle_damage(NULL, bl, status_get_hp(bl)-1, 0); return 1; - case SC_CARTBOOST: /* カ?トブ?スト */ - if(sc->data[SC_DECREASEAGI].timer!=-1 ) - { //Cancel Decrease Agi, but take no further effect [Skotlex] - status_change_end(bl,SC_DECREASEAGI,-1); - return 0; - } - calc_flag = 1; - break; - case SC_CLOSECONFINE2: { struct block_list *src = val2?map_id2bl(val2):NULL; @@ -4324,12 +4318,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1; break; case SC_BLESSING: - if (bl->type==BL_PC || (!undead_flag && race!=6)) { - if (sc->data[SC_CURSE].timer!=-1) - status_change_end(bl,SC_CURSE,-1); - if (sc->data[SC_STONE].timer!=-1 && sc->data[SC_STONE].val2==0) - status_change_end(bl,SC_STONE,-1); - } case SC_CONCENTRATION: /* コンセントレ?ション */case SC_ETERNALCHAOS: /* エタ?ナルカオス */ case SC_DRUMBATTLE: /* ?太鼓の響き */ case SC_NIBELUNGEN: /* ニ?ベルングの指輪 */ @@ -4398,9 +4386,15 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val case SC_SKA: case SC_TWOHANDQUICKEN: /* 2HQ */ case SC_MIRACLE: + case SC_INCREASEAGI: /* 速度上昇 */ + case SC_DECREASEAGI: /* 速度減少 */ + case SC_ONEHAND: + case SC_DONTFORGETME: /* 私を忘れないで */ + case SC_DELUGE: + case SC_CARTBOOST: /* カ?トブ?スト */ + case SC_QUAGMIRE: /* クァグマイア */ calc_flag = 1; break; - case SC_LULLABY: /* 子守唄 */ case SC_RICHMANKIM: case SC_ROKISWEIL: /* ロキの叫び */ @@ -4449,6 +4443,9 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val case SC_KAAHI: case SC_INTRAVISION: case SC_BASILICA: + case SC_MAXOVERTHRUST: + case SC_SILENCE: /* 沈?(レックスデビ?ナ) */ + case SC_ASSUMPTIO: /* アスムプティオ */ break; // gs_something1 [Vicious] case SC_MADNESSCANCEL: @@ -4857,6 +4854,7 @@ int status_change_end( struct block_list* bl , int type,int tid ) case SC_DEFENDER: calc_flag = 1; + case SC_REFLECTSHIELD: case SC_AUTOGUARD: if (sd) { struct map_session_data *tsd; -- cgit v1.2.3-70-g09d2