Selaa lähdekoodia

- 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://svn.code.sf.net/p/rathena/svn/trunk@5589 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 vuotta sitten
vanhempi
commit
6e2b036285
7 muutettua tiedostoa jossa 177 lisäystä ja 164 poistoa
  1. 9 0
      Changelog-Trunk.txt
  2. 3 0
      db/Changelog.txt
  3. 2 2
      db/skill_db.txt
  4. 2 0
      src/map/chrif.c
  5. 13 12
      src/map/pc.c
  6. 1 1
      src/map/skill.c
  7. 147 149
      src/map/status.c

+ 9 - 0
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]

+ 3 - 0
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]

+ 2 - 2
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#

+ 2 - 0
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
 	{

+ 13 - 12
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.hp<sd->status.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer != -1 &&
+ 
+	if (sd->status.hp<sd->status.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 ))
-			// ƒI?ƒgƒo?ƒT?ƒN?“®
 			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)

+ 1 - 1
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;

+ 147 - 149
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;