浏览代码

Bug Fixes
* Updated Fire Expansion to official effects. (bugreport:8893)
* Updated Illusion Doping area of effect and hit reduction. (bugreport:8560)
* Cleaned up Full Throttle.
-- Thanks to exneval.

aleos89 11 年之前
父节点
当前提交
06986d6540
共有 9 个文件被更改,包括 123 次插入67 次删除
  1. 2 2
      db/pre-re/skill_cast_db.txt
  2. 2 2
      db/pre-re/skill_db.txt
  3. 2 2
      db/pre-re/skill_unit_db.txt
  4. 2 2
      db/re/skill_cast_db.txt
  5. 2 2
      db/re/skill_db.txt
  6. 2 2
      db/re/skill_unit_db.txt
  7. 33 10
      src/map/battle.c
  8. 52 36
      src/map/skill.c
  9. 26 9
      src/map/status.c

+ 2 - 2
db/pre-re/skill_cast_db.txt

@@ -1611,9 +1611,9 @@
 //-- GN_FIRE_EXPANSION
 2486,2000,500,0,0,0,0
 //-- GN_FIRE_EXPANSION_SMOKE_POWDER
-2487,0,0,0,10000:12000:14000:16000:18000,0,0
+2487,0,0,0,4000,0,0
 //-- GN_FIRE_EXPANSION_TEAR_GAS
-2488,0,0,0,10000:12000:14000:16000:18000,0,0
+2488,0,0,0,5000,0,0
 //-- GN_HELLS_PLANT
 2490,3000:3500:4000:4500:5000,500,0,14000:21000:28000:35000:42000,0,0
 //-- GN_HELLS_PLANT_ATK

+ 2 - 2
db/pre-re/skill_db.txt

@@ -1200,7 +1200,7 @@
 2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0,0x0,		GN_FIRE_EXPANSION,Fire Expansion
 2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0,		GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder
 2488,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0,		GN_FIRE_EXPANSION_TEAR_GAS,Fire Expansion Tear Gas
-2489,11,6,1,0,0,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0,0x0,		GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
+2489,11,8,1,-1,0x28,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0,0x0,		GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
 2490,9,6,2,0,0x3,1,5,1,yes,0,0x80,2:3:4:5:6,none,0,0x0,	GN_HELLS_PLANT,Hell's Plant
 2491,0,6,1,0,0x90,0,5,1,no,0,0,0,misc,0,0x0,	GN_HELLS_PLANT_ATK,Hell's Plant Attack
 2492,0,6,4,0,0x3,5:6:6:7:7,5,1,yes,0,0,0,none,0,0x0,	GN_MANDRAGORA,Howling of Mandragora
@@ -1301,7 +1301,7 @@
 // EP 14.3 Part 2 3rd Job Skills
 5001,1,8,1,-1,0,0,5,3,no,0,0,0,weapon,0,0x0, GC_DARKCROW,Dark Claw
 5002,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, RA_UNLIMIT,Unlimited
-5003,7,6,1,-1,0x2,4:5:6:7:8,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping
+5003,7,6,1,-1,0x2,4:5:6:7:-1,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping
 5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water
 5005,0,6,4,0,0x3,3,1,1,no,0,0,0,none,0,0x0, RK_LUXANIMA,Lux Anima
 5006,1,6,2,3,0,0,5,1,no,0,0,3,misc,0,0x0, NC_MAGMA_ERUPTION,Magma Eruption

+ 2 - 2
db/pre-re/skill_unit_db.txt

@@ -151,8 +151,8 @@
 2482,0xe6,0x7f, -1, 2,  -1,all,   0x000	//GN_WALLOFTHORN
 2484,0x86,    ,  0, 1, 100,enemy, 0x080	//GN_CRAZYWEED_ATK
 2485,0xe7,    ,  0, 2,2000,enemy, 0x098	//GN_DEMONIC_FIRE
-2487,0xe8,    ,  0, 2, 500,enemy, 0x000	//GN_FIRE_EXPANSION_SMOKE_POWDER
-2488,0xe9,    ,  0, 2, 500,enemy, 0x000	//GN_FIRE_EXPANSION_TEAR_GAS
+2487,0xe8,    ,  2, 0,  -1,all,   0x2000	//GN_FIRE_EXPANSION_SMOKE_POWDER
+2488,0xe9,    ,  2, 0,  -1,all,   0x2000	//GN_FIRE_EXPANSION_TEAR_GAS
 2490,0xea,    ,  0, 1,1000,enemy, 0x002	//GN_HELLS_PLANT
 
 2555,0x104,   ,  0, 1:2:2:3:3,500,enemy,0x6	//RL_B_TRAP

+ 2 - 2
db/re/skill_cast_db.txt

@@ -1602,9 +1602,9 @@
 //-- GN_FIRE_EXPANSION
 2486,2000,500,0,0,0,0,-1
 //-- GN_FIRE_EXPANSION_SMOKE_POWDER
-2487,0,0,0,10000:12000:14000:16000:18000,0,0,-1
+2487,0,0,0,4000,0,0,-1
 //-- GN_FIRE_EXPANSION_TEAR_GAS
-2488,0,0,0,10000:12000:14000:16000:18000,0,0,-1
+2488,0,0,0,5000,0,0,-1
 //-- GN_HELLS_PLANT
 2490,3000:3500:4000:4500:5000,500,0,14000:21000:28000:35000:42000,0,0,-1
 //-- GN_HELLS_PLANT_ATK

+ 2 - 2
db/re/skill_db.txt

@@ -1200,7 +1200,7 @@
 2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0,0x0,		GN_FIRE_EXPANSION,Fire Expansion
 2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0,		GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder
 2488,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0,		GN_FIRE_EXPANSION_TEAR_GAS,Fire Expansion Tear Gas
-2489,11,6,1,0,0,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0,0x0,		GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
+2489,11,8,1,-1,0x28,0,10,1:2:3:4:5:6:7:8:9:10,no,0,0,0,weapon,0,0x0,		GN_FIRE_EXPANSION_ACID,Fire Expansion Acid
 2490,9,6,2,0,0x3,1,5,1,yes,0,0x80,2:3:4:5:6,none,0,0x0,	GN_HELLS_PLANT,Hell's Plant
 2491,0,6,1,0,0x90,0,5,1,no,0,0,0,misc,0,0x0,	GN_HELLS_PLANT_ATK,Hell's Plant Attack
 2492,0,6,4,0,0x3,5:6:6:7:7,5,1,yes,0,0,0,none,0,0x0,	GN_MANDRAGORA,Howling of Mandragora
@@ -1304,7 +1304,7 @@
 // EP 14.3 Part 2 3rd Job Skills
 5001,1,8,1,-1,0,0,5,3,no,0,0,0,weapon,0,0x0, GC_DARKCROW,Dark Claw
 5002,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, RA_UNLIMIT,Unlimited
-5003,7,6,1,-1,0x2,4:5:6:7:8,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping
+5003,7,6,1,-1,0x2,4:5:6:7:-1,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping
 5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water
 5005,0,6,4,0,0x3,3,1,1,no,0,0,0,none,0,0x0, RK_LUXANIMA,Lux Anima
 5006,1,6,2,3,0,0,5,1,no,0,0,3,misc,0,0x0, NC_MAGMA_ERUPTION,Magma Eruption

+ 2 - 2
db/re/skill_unit_db.txt

@@ -153,8 +153,8 @@
 2482,0xe6,0x7f, -1, 2,  -1,all,   0x000	//GN_WALLOFTHORN
 2484,0x86,    ,  0, 1, 100,enemy, 0x080	//GN_CRAZYWEED_ATK
 2485,0xe7,    ,  0, 2,2000,enemy, 0x098	//GN_DEMONIC_FIRE
-2487,0xe8,    ,  0, 2, 500,enemy, 0x000	//GN_FIRE_EXPANSION_SMOKE_POWDER
-2488,0xe9,    ,  0, 2, 500,enemy, 0x000	//GN_FIRE_EXPANSION_TEAR_GAS
+2487,0xe8,    ,  2, 0,  -1,all,   0x2000	//GN_FIRE_EXPANSION_SMOKE_POWDER
+2488,0xe9,    ,  2, 0,  -1,all,   0x2000	//GN_FIRE_EXPANSION_TEAR_GAS
 2490,0xea,    ,  0, 1,1000,enemy, 0x002	//GN_HELLS_PLANT
 
 2555,0x104,   ,  0, 1:2:2:3:3,500,enemy,0x6	//RL_B_TRAP

+ 33 - 10
src/map/battle.c

@@ -4794,8 +4794,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
 #ifdef RENEWAL
 			case NJ_ISSEN:
 			case ASC_BREAKER:
-#endif
 			case CR_ACIDDEMONSTRATION:
+			case GN_FIRE_EXPANSION_ACID:
+#endif
 			case KO_HAPPOKUNAI:
 				break;
 			default:
@@ -4814,6 +4815,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
 		case MC_CARTREVOLUTION:
 		case MO_INVESTIGATE:
 		case CR_ACIDDEMONSTRATION:
+		case GN_FIRE_EXPANSION_ACID:
 		case KO_BAKURETSU:
 			// Forced to neutral element
 			wd.damage = battle_attr_fix(src, target, wd.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
@@ -4871,8 +4873,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
 #ifdef RENEWAL
 		case NJ_ISSEN:
 		case ASC_BREAKER:
-#endif
 		case CR_ACIDDEMONSTRATION:
+		case GN_FIRE_EXPANSION_ACID:
+#endif
 		case KO_HAPPOKUNAI:
 			return wd;
 		default:
@@ -5063,6 +5066,16 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 			case AB_RENOVATIO:
 				ad.damage = status_get_lv(src) * 10 + sstatus->int_;
 				break;
+#ifndef RENEWAL
+			case GN_FIRE_EXPANSION_ACID:
+				if(tstatus->vit + sstatus->int_)
+					ad.damage = (int64)(7 * tstatus->vit * sstatus->int_ * sstatus->int_ / (10 * (tstatus->vit + sstatus->int_)));
+				else
+					ad.damage = 0;
+				if(tsd)
+					ad.damage >>= 1;
+				break;
+#endif
 			default: {
 				if (sstatus->matk_max > sstatus->matk_min) {
 					MATK_ADD(sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min));
@@ -5374,11 +5387,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						break;
 					case GN_DEMONIC_FIRE:
 						if( skill_lv > 20)	// Fire expansion Lv.2
-							skillratio += 110 + 20 * (skill_lv - 20) + status_get_int(src) * 10;
-						else if( skill_lv > 10 )	// Fire expansion Lv.1
-							skillratio += 110 + 20 * (skill_lv - 10) + status_get_int(src) + ((sd) ? sd->status.job_level : 50);
-						else
-							skillratio += 110 + 20 * skill_lv;
+							skillratio += 10 + 20 * (skill_lv - 20) + status_get_int(src) * 10;
+						else if( skill_lv > 10 ) { // Fire expansion Lv.1
+							skillratio += 10 + 20 * (skill_lv - 10) + status_get_int(src) + ((sd) ? sd->status.job_level : 50);
+							RE_LVL_DMOD(100);
+						} else
+							skillratio += 10 + 20 * skill_lv;
 						break;
 					case KO_KAIHOU:
 						if(sd) {
@@ -5604,9 +5618,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 	switch(skill_id) { // These skills will do a GVG fix later
 #ifdef RENEWAL
 		case ASC_BREAKER:
-#endif
 		case CR_ACIDDEMONSTRATION:
-			return ad;
+			return ad; //These skills will do a GVG fix later
+#endif
 		default:
 			ad.damage=battle_calc_damage(src,target,&ad,ad.damage,skill_id,skill_lv);
 			if( map_flag_gvg2(target->m) )
@@ -5620,8 +5634,17 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 			struct Damage wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag);
 			if(!flag.infdef && ad.damage > 1)
 				ad.damage += wd.damage;
-			break;
 		}
+		break;
+#ifdef RENEWAL
+		case GN_FIRE_EXPANSION_ACID: {
+			struct Damage wd = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0);
+
+			ad.damage = (int64)(7 * ((wd.damage / skill_lv + ad.damage / skill_lv) * tstatus->vit / 100));
+			damage_div_fix(ad.damage, ad.div_);
+		}
+		break;
+#endif
 		//case HM_ERASER_CUTTER:
 	}
 

+ 52 - 36
src/map/skill.c

@@ -1539,8 +1539,8 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 		sc_start(src,bl,SC_DARKCROW,100,skill_lv,skill_get_time(skill_id,skill_lv));
 		break;
 	case GN_ILLUSIONDOPING:
-		if( sc_start(src,bl,SC_ILLUSIONDOPING,10 * skill_lv,skill_lv,skill_get_time(skill_id, skill_lv)) ) //Custom rate
-			sc_start(src,bl,SC_HALLUCINATION,100,skill_lv,skill_get_time(skill_id, skill_lv));
+		if( sc_start(src,bl,SC_ILLUSIONDOPING,100 - skill_lv * 10,skill_lv,skill_get_time(skill_id,skill_lv)) )
+			sc_start(src,bl,SC_HALLUCINATION,100,skill_lv,skill_get_time(skill_id,skill_lv));
 		break;
 
 	case RL_MASS_SPIRAL:
@@ -5158,6 +5158,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		}
 		break;
 
+	case GN_DEMONIC_FIRE:
+	case GN_FIRE_EXPANSION_ACID:
+		if (flag&1)
+			skill_attack(BF_MAGIC, src, src, bl, skill_id, skill_lv, tick, flag);
+		break;
+
 	case KO_JYUMONJIKIRI: {
 			short x, y;
 			short dir = map_calc_dir(src,bl->x,bl->y);
@@ -10818,8 +10824,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 	case GN_WALLOFTHORN:
 	case GN_THORNS_TRAP:
 	case GN_DEMONIC_FIRE:
-	case GN_FIRE_EXPANSION_SMOKE_POWDER:
-	case GN_FIRE_EXPANSION_TEAR_GAS:
 	case GN_HELLS_PLANT:
 	case SO_EARTHGRAVE:
 	case SO_DIAMONDDUST:
@@ -11289,29 +11293,38 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 			if( ud->skillunit[i]->skill_id == GN_DEMONIC_FIRE &&
 			   distance_xy(x, y, ud->skillunit[i]->unit->bl.x, ud->skillunit[i]->unit->bl.y) < 4 ) {
 				switch( skill_lv ) {
+					case 1:
+						ud->skillunit[i]->unit->val2 = skill_lv;
+						ud->skillunit[i]->unit->group->val2 = skill_lv;
+						break;
+					case 2:
+						map_foreachinarea(skill_area_sub,src->m,
+							ud->skillunit[i]->unit->bl.x - 2,ud->skillunit[i]->unit->bl.y - 2,
+							ud->skillunit[i]->unit->bl.x + 2,ud->skillunit[i]->unit->bl.y + 2, BL_CHAR,
+							src, GN_DEMONIC_FIRE, skill_lv + 20, tick, flag|BCT_ENEMY|SD_LEVEL|1, skill_castend_damage_id);
+						skill_delunit(ud->skillunit[i]->unit);
+						break;
 					case 3:
-						ud->skillunit[i]->unit_id = UNT_FIRE_EXPANSION_SMOKE_POWDER;
-						clif_changetraplook(&ud->skillunit[i]->unit->bl, UNT_FIRE_EXPANSION_SMOKE_POWDER);
+						skill_delunit(ud->skillunit[i]->unit);
+						skill_unitsetting(src, GN_FIRE_EXPANSION_SMOKE_POWDER, 1, x, y, 0);
+						flag |= 1;
 						break;
 					case 4:
-						ud->skillunit[i]->unit_id = UNT_FIRE_EXPANSION_TEAR_GAS;
-						clif_changetraplook(&ud->skillunit[i]->unit->bl, UNT_FIRE_EXPANSION_TEAR_GAS);
+						skill_delunit(ud->skillunit[i]->unit);
+						skill_unitsetting(src, GN_FIRE_EXPANSION_TEAR_GAS, 1, x, y, 0);
+						flag |= 1;
 						break;
 					case 5: {
 						int acid_lv = 5; // Cast at Acid Demonstration at level 5 unless the user has a higher level learned.
 						if( sd && pc_checkskill(sd, CR_ACIDDEMONSTRATION) > 5 )
 							acid_lv = pc_checkskill(sd, CR_ACIDDEMONSTRATION);
 						map_foreachinarea(skill_area_sub, src->m,
-										  ud->skillunit[i]->unit->bl.x - 3, ud->skillunit[i]->unit->bl.y - 3,
-										  ud->skillunit[i]->unit->bl.x + 3, ud->skillunit[i]->unit->bl.y + 3, BL_CHAR,
-										  src, CR_ACIDDEMONSTRATION, acid_lv, tick, flag|BCT_ENEMY|1|SD_LEVEL, skill_castend_damage_id);
+										  ud->skillunit[i]->unit->bl.x - 2, ud->skillunit[i]->unit->bl.y - 2,
+										  ud->skillunit[i]->unit->bl.x + 2, ud->skillunit[i]->unit->bl.y + 2, BL_CHAR,
+										  src, CR_ACIDDEMONSTRATION, acid_lv, tick, flag|BCT_ENEMY|SD_LEVEL|1, skill_castend_damage_id);
 						skill_delunit(ud->skillunit[i]->unit);
 						}
 						break;
-					default:
-						ud->skillunit[i]->unit->val2 = skill_lv;
-						ud->skillunit[i]->unit->group->val2 = skill_lv;
-						break;
 					}
 				}
 			}
@@ -11992,6 +12005,10 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
 			limit = 3000;
 		val3 = (x<<16)|y;
 		break;
+	case GN_FIRE_EXPANSION_SMOKE_POWDER:
+	case GN_FIRE_EXPANSION_TEAR_GAS:
+		limit = ((sd ? pc_checkskill(sd,GN_DEMONIC_FIRE) : 1) + 1) * limit;
+		break;
 	case KO_ZENKAI:
 		if( sd ){
 			ARR_FIND(1, 6, i, sd->talisman[i] > 0);
@@ -12373,6 +12390,17 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
 				skill_attack(skill_get_type(sg->skill_id), ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
 			break;
 
+		case UNT_FIRE_EXPANSION_SMOKE_POWDER:
+			if( !sce )
+				sc_start(ss, bl, type, 100, sg->skill_lv, sg->limit);
+			break;
+
+		case UNT_FIRE_EXPANSION_TEAR_GAS:
+			if( !sce )
+				if( sc_start4(ss, bl, type, 100, sg->skill_lv, 0, ss->id,0, sg->limit) )
+					sc_start(ss, bl, SC_TEARGAS_SOB, 100, sg->skill_lv, sg->limit);
+			break;
+
 		case UNT_VOLCANIC_ASH:
 			if (!sce)
 				sc_start(ss, bl, SC_ASH, 100, sg->skill_lv, skill_get_time(MH_VOLCANIC_ASH, sg->skill_lv));
@@ -12944,30 +12972,16 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 			}
 			break;
 
-		case UNT_DEMONIC_FIRE: {
-				TBL_PC* sd =  BL_CAST(BL_PC, ss);
-				switch( sg->val2 ) {
-					case 1:
-					case 2:
-					default:
-						sc_start(ss, bl, SC_BURNING, 4 + 4 * sg->skill_lv, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
-						skill_attack(skill_get_type(sg->skill_id), ss, &src->bl, bl, sg->skill_id, sg->skill_lv + 10 * sg->val2, tick, 0);
-						break;
-					case 3:
-						skill_attack(skill_get_type(CR_ACIDDEMONSTRATION), ss, &src->bl, bl, CR_ACIDDEMONSTRATION, ((sd) ? pc_checkskill(sd, CR_ACIDDEMONSTRATION) : sg->skill_lv), tick, 0);
-						break;
-				}
+		case UNT_DEMONIC_FIRE:
+			switch( sg->val2 ) {
+				case 1:
+				default:
+					sc_start(ss, bl, SC_BURNING, 4 + 4 * sg->skill_lv, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
+					skill_attack(skill_get_type(skill_id), ss, &src->bl, bl, sg->skill_id, sg->skill_lv + 10 * sg->val2, tick, 0);
+					break;
 			}
 			break;
 
-		case UNT_FIRE_EXPANSION_SMOKE_POWDER:
-			sc_start(ss, bl, status_skill2sc(GN_FIRE_EXPANSION_SMOKE_POWDER), 100, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
-			break;
-
-		case UNT_FIRE_EXPANSION_TEAR_GAS:
-			sc_start(ss, bl, status_skill2sc(GN_FIRE_EXPANSION_TEAR_GAS), 100, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
-			break;
-
 		case UNT_HELLS_PLANT:
 			if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 )
 				skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &src->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, 0);
@@ -13258,6 +13272,8 @@ int skill_unit_onleft (uint16 skill_id, struct block_list *bl, unsigned int tick
 		case SO_WIND_INSIGNIA:
 		case SO_EARTH_INSIGNIA:
 		case SC_BLOODYLUST:
+		case GN_FIRE_EXPANSION_SMOKE_POWDER:
+		case GN_FIRE_EXPANSION_TEAR_GAS:
 		case SO_ELEMENTAL_SHIELD:
 			if (sce)
 				status_change_end(bl, type, INVALID_TIMER);

+ 26 - 9
src/map/status.c

@@ -898,6 +898,7 @@ void initChangeTables(void)
 
 	StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = SI_CURSEDCIRCLE_ATKER;
 
+	StatusIconChangeTable[SC_TEARGAS_SOB] = SI_BLANK;
 	StatusIconChangeTable[SC_STOMACHACHE] = SI_STOMACHACHE;
 	StatusIconChangeTable[SC_MYSTERIOUS_POWDER] = SI_MYSTERIOUS_POWDER;
 	StatusIconChangeTable[SC_MELON_BOMB] = SI_MELON_BOMB;
@@ -5400,7 +5401,7 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change
 	if (sc->data[SC_TEARGAS])
 		hit -= hit * 50 / 100;
 	if(sc->data[SC_ILLUSIONDOPING])
-		hit -= hit * (5 + sc->data[SC_ILLUSIONDOPING]->val1) / 100; // Custom
+		hit -= 50;
 	if (sc->data[SC_MTF_ASPD])
 		hit += 5;
 
@@ -7836,6 +7837,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			case SC__LAZINESS:
 			case SC__UNLUCKY:
 			case SC__WEAKNESS:
+			case SC_TEARGAS:
+			case SC_TEARGAS_SOB:
 			case SC_PYREXIA:
 			case SC_DEATHHURT:
 			case SC_TOXIN:
@@ -9521,10 +9524,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			val2 = 20; //HP rate bonus
 			break;
 		case SC_TEARGAS:
-			val3 = status_get_max_hp(bl) * 5 / 100; // Drain 5% HP
+			val2 = status_get_max_hp(bl) * 5 / 100; // Drain 5% HP
 			val4 = tick / 2000;
 			tick_time = 2000;
-			sc_start(src, bl, SC_TEARGAS_SOB, 100, 0, 1|2|8); // Sob Emoticon
 			break;
 		case SC_TEARGAS_SOB:
 			val4 = tick / 3000;
@@ -9643,6 +9645,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			val2 = 7 - val1;
 			tick_time = 1000;
 			val4 = tick / tick_time;
+			tick = -1;
 			break;
 		case SC_KINGS_GRACE:
 			val2 = 3 + val1; //HP Recover rate
@@ -10791,8 +10794,12 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 		case SC_INTRAVISION:
 			calc_flag = SCB_ALL; // Required for overlapping
 			break;
-		case SC_FULL_THROTTLE:
-			sc_start(bl, bl, SC_REBOUND, 100, sce->val1, skill_get_time2(ALL_FULL_THROTTLE, sce->val1));
+		case SC_FULL_THROTTLE: {
+				int sec = skill_get_time2(status_sc2skill(type), sce->val1);
+
+				clif_status_change(bl, SI_DECREASEAGI, 1, sec, 0, 0, 0);
+				sc_start(bl, bl, SC_REBOUND, 100, sce->val1, sec);
+			}
 			break;
 		case SC_ITEMSCRIPT: // Removes Buff Icons
 			if (sd && sce->val2 != SI_BLANK)
@@ -11826,9 +11833,19 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 		return 0;
 
 	case SC_TEARGAS:
-		if(!status_charge(bl, 0, sce->val3))
-			break; // Not enough HP to continue.
-		sc_timer_next(2000 + tick, status_change_timer, bl->id, data);
+		if( --(sce->val4) >= 0 ) {
+			struct block_list *src = map_id2bl(sce->val3);
+			int damage = sce->val2;
+
+			map_freeblock_lock();
+			clif_damage(bl, bl, tick, 0, 0, damage, 1, 9, 0);
+			status_damage(src, bl, damage,0, 0, 1);
+			if( sc->data[type] ) {
+				sc_timer_next(2000 + tick, status_change_timer, bl->id, data);
+			}
+			map_freeblock_unlock();
+			return 0;
+		}
 		break;
 	case SC_TEARGAS_SOB:
 		if( --(sce->val4) >= 0 ) {
@@ -11890,7 +11907,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 	    break;
 	case SC_FULL_THROTTLE:
 		if( --(sce->val4) > 0 ) {
-			status_percent_damage(bl, bl, sce->val2, sce->val2, false);
+			status_percent_damage(bl, bl, 0, sce->val2, false);
 			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
 			return 0;
 		}