Browse Source

Bug Fixes
* Adjusted Falcon Assault to take arrow elements into effect. (bugreport:7572)
* Cleaned up Self Destruction damage calculation. (bugreport:8941)
* Cleaned up Dragon Breath damage calculation.
* Fixed Millennium Shield, Crush Strike, and Refresh durations. (bugreport:8981)
* Fixed Makibishi area of effect. (bugreport:8963)
* Cleaned up some MOBID_* defines.

aleos89 11 years ago
parent
commit
1d8bec3100
7 changed files with 94 additions and 63 deletions
  1. 2 2
      db/pre-re/skill_db.txt
  2. 3 3
      db/re/skill_cast_db.txt
  3. 2 2
      db/re/skill_db.txt
  4. 52 19
      src/map/battle.c
  5. 3 0
      src/map/map.h
  6. 16 16
      src/map/pc.c
  7. 16 21
      src/map/skill.c

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

@@ -544,7 +544,7 @@
 //****
 //****
 // Sniper
 // Sniper
 380,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0,	SN_SIGHT,Falcon Eyes
 380,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0,	SN_SIGHT,Falcon Eyes
-381,5,8,1,0,0x40,0,5,1,yes,0,0,0,misc,0,0x80,		SN_FALCONASSAULT,Falcon Assault
+381,5,8,1,-3,0x40,0,5,1,yes,0,0,0,misc,0,0x80,		SN_FALCONASSAULT,Falcon Assault
 382,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0,	SN_SHARPSHOOTING,Focused Arrow Strike
 382,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0,	SN_SHARPSHOOTING,Focused Arrow Strike
 383,0,6,4,0,0x3,-1,10,1,yes,0,0,0,weapon,0,0x0,	SN_WINDWALK,Wind Walker
 383,0,6,4,0,0x3,-1,10,1,yes,0,0,0,weapon,0,0x0,	SN_WINDWALK,Wind Walker
 
 
@@ -1021,7 +1021,7 @@
 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_F_SIDESLIDE,Front-Side Slide
 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_F_SIDESLIDE,Front-Side Slide
 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_B_SIDESLIDE,Back-Side Slide
 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_B_SIDESLIDE,Back-Side Slide
 2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0,		NC_MAINFRAME,Mainframe Restructure
 2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0,		NC_MAINFRAME,Mainframe Restructure
-2267,0,6,4,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0,	NC_SELFDESTRUCTION,Self Destruction
+2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0,0,weapon,5,0x0,	NC_SELFDESTRUCTION,Self Destruction
 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0,	NC_SHAPESHIFT,Shape Shift
 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0,	NC_SHAPESHIFT,Shape Shift
 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0,		NC_EMERGENCYCOOL,Emergency Cool
 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0,		NC_EMERGENCYCOOL,Emergency Cool
 2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0,	NC_INFRAREDSCAN,Infrared Scan
 2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0,	NC_INFRAREDSCAN,Infrared Scan

+ 3 - 3
db/re/skill_cast_db.txt

@@ -1091,11 +1091,11 @@
 //-- RK_DRAGONHOWLING
 //-- RK_DRAGONHOWLING
 2009,0,0,0,15000,0,10000,-1
 2009,0,0,0,15000,0,10000,-1
 //-- RK_MILLENNIUMSHIELD
 //-- RK_MILLENNIUMSHIELD
-2011,0,1000,0,180000,0,60000,-1
+2011,0,1000,0,180000,60000,60000,-1
 //-- RK_CRUSHSTRIKE
 //-- RK_CRUSHSTRIKE
-2012,0,0,0,30000,0,30000,1000
+2012,0,0,0,30000,30000,30000,1000
 //-- RK_REFRESH
 //-- RK_REFRESH
-2013,0,0,0,60000,0,120000,1000
+2013,0,0,0,60000,120000,120000,1000
 //-- RK_GIANTGROWTH
 //-- RK_GIANTGROWTH
 2014,0,0,0,180000,0,0,1000
 2014,0,0,0,180000,0,0,1000
 //-- RK_STONEHARDSKIN
 //-- RK_STONEHARDSKIN

+ 2 - 2
db/re/skill_db.txt

@@ -544,7 +544,7 @@
 //****
 //****
 // Sniper
 // Sniper
 380,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0,	SN_SIGHT,Falcon Eyes
 380,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0,	SN_SIGHT,Falcon Eyes
-381,5,8,1,0,0x40,0,5,1,yes,0,0,0,misc,0,0x80,		SN_FALCONASSAULT,Falcon Assault
+381,5,8,1,-3,0x40,0,5,1,yes,0,0,0,misc,0,0x80,		SN_FALCONASSAULT,Falcon Assault
 382,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0,	SN_SHARPSHOOTING,Focused Arrow Strike
 382,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0,	SN_SHARPSHOOTING,Focused Arrow Strike
 383,0,6,4,0,0x3,-1,10,1,yes,0,0,0,weapon,0,0x0,	SN_WINDWALK,Wind Walker
 383,0,6,4,0,0x3,-1,10,1,yes,0,0,0,weapon,0,0x0,	SN_WINDWALK,Wind Walker
 
 
@@ -1021,7 +1021,7 @@
 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_F_SIDESLIDE,Front-Side Slide
 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_F_SIDESLIDE,Front-Side Slide
 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_B_SIDESLIDE,Back-Side Slide
 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0,		NC_B_SIDESLIDE,Back-Side Slide
 2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0,		NC_MAINFRAME,Mainframe Restructure
 2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0,		NC_MAINFRAME,Mainframe Restructure
-2267,0,6,4,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0,	NC_SELFDESTRUCTION,Self Destruction
+2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0,0,weapon,5,0x0,	NC_SELFDESTRUCTION,Self Destruction
 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0,	NC_SHAPESHIFT,Shape Shift
 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0,	NC_SHAPESHIFT,Shape Shift
 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0,		NC_EMERGENCYCOOL,Emergency Cool
 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0,		NC_EMERGENCYCOOL,Emergency Cool
 2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0,	NC_INFRAREDSCAN,Infrared Scan
 2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0,	NC_INFRAREDSCAN,Infrared Scan

+ 52 - 19
src/map/battle.c

@@ -2711,9 +2711,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
 			if (sd) {
 			if (sd) {
 				short index = sd->equip_index[EQI_HAND_L];
 				short index = sd->equip_index[EQI_HAND_L];
 
 
-				if (index >= 0 &&
-					sd->inventory_data[index] &&
-					sd->inventory_data[index]->type == IT_ARMOR)
+				if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR)
 					ATK_ADD(wd.damage, wd.damage2, sd->inventory_data[index]->weight/10);
 					ATK_ADD(wd.damage, wd.damage2, sd->inventory_data[index]->weight/10);
 			} else
 			} else
 				ATK_ADD(wd.damage, wd.damage2, sstatus->rhw.atk2); //Else use Atk2
 				ATK_ADD(wd.damage, wd.damage2, sstatus->rhw.atk2); //Else use Atk2
@@ -2722,6 +2720,44 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
 			wd.weaponAtk2 = (int)wd.damage2;
 			wd.weaponAtk2 = (int)wd.damage2;
 #endif
 #endif
 			break;
 			break;
+		case RK_DRAGONBREATH:
+		case RK_DRAGONBREATH_WATER:
+			{
+				int damagevalue = 0;
+
+				wd.damage = wd.damage2 = 0;
+#ifdef RENEWAL
+				wd.weaponAtk = wd.weaponAtk2 = 0;
+#endif
+				damagevalue = ((sstatus->hp / 50) + (status_get_max_sp(src) / 4)) * skill_lv;
+				if(status_get_lv(src) > 100)
+					damagevalue = damagevalue * status_get_lv(src) / 150;
+				if(sd)
+					damagevalue = damagevalue * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100;
+				ATK_ADD(wd.damage, wd.damage2, damagevalue);
+#ifdef RENEWAL
+				ATK_ADD(wd.weaponAtk, wd.weaponAtk2, damagevalue);
+#endif
+				wd.flag |= BF_LONG;
+			}
+			break;
+		case NC_SELFDESTRUCTION: {
+				int damagevalue = 0;
+
+				wd.damage = wd.damage2 = 0;
+#ifdef RENEWAL
+				wd.weaponAtk = wd.weaponAtk2 = 0;
+#endif
+				damagevalue = (skill_lv + 1) * ((sd ? pc_checkskill(sd,NC_MAINFRAME) : 0) + 8) * (status_get_sp(src) + sstatus->vit);
+				if(status_get_lv(src) > 100)
+					damagevalue = damagevalue * status_get_lv(src) / 100;
+				damagevalue = damagevalue + sstatus->hp;
+				ATK_ADD(wd.damage, wd.damage2, damagevalue);
+#ifdef RENEWAL
+				ATK_ADD(wd.weaponAtk, wd.weaponAtk2, damagevalue);
+#endif
+			}
+			break;
 		case KO_HAPPOKUNAI: {
 		case KO_HAPPOKUNAI: {
 				int damagevalue = 0;
 				int damagevalue = 0;
 
 
@@ -2745,9 +2781,8 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
 			}
 			}
 			break;
 			break;
 		case HFLI_SBR44:	//[orn]
 		case HFLI_SBR44:	//[orn]
-			if(src->type == BL_HOM) {
+			if(src->type == BL_HOM)
 				wd.damage = ((TBL_HOM*)src)->homunculus.intimacy ;
 				wd.damage = ((TBL_HOM*)src)->homunculus.intimacy ;
-			}
 			break;
 			break;
 
 
 		default:
 		default:
@@ -2802,6 +2837,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
 			//Add any bonuses that modify the base atk (pre-skills)
 			//Add any bonuses that modify the base atk (pre-skills)
 			if(sd) {
 			if(sd) {
 				int skill;
 				int skill;
+
 				if (sd->bonus.atk_rate) {
 				if (sd->bonus.atk_rate) {
 					ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.atk_rate);
 					ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.atk_rate);
 					RE_ALLATK_ADDRATE(wd, sd->bonus.atk_rate);
 					RE_ALLATK_ADDRATE(wd, sd->bonus.atk_rate);
@@ -5928,8 +5964,15 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
 	s_ele = skill_get_ele(skill_id, skill_lv);
 	s_ele = skill_get_ele(skill_id, skill_lv);
 	if (s_ele < 0 && s_ele != -3) //Attack that takes weapon's element for misc attacks? Make it neutral [Skotlex]
 	if (s_ele < 0 && s_ele != -3) //Attack that takes weapon's element for misc attacks? Make it neutral [Skotlex]
 		s_ele = ELE_NEUTRAL;
 		s_ele = ELE_NEUTRAL;
-	else if (s_ele == -3) //Use random element
-		s_ele = rnd()%ELE_ALL;
+	else if (s_ele == -3) { //Use random element
+		if (skill_id == SN_FALCONASSAULT) {
+			if (sstatus->rhw.ele && !status_get_attack_sc_element(src, status_get_sc(src)))
+				s_ele = sstatus->rhw.ele;
+			else
+				s_ele = status_get_attack_sc_element(src, status_get_sc(src));
+		} else
+			s_ele = rnd()%ELE_ALL;
+	}
 
 
 	//Skill Range Criteria
 	//Skill Range Criteria
 	md.flag |= battle_range_type(src, target, skill_id, skill_lv);
 	md.flag |= battle_range_type(src, target, skill_id, skill_lv);
@@ -6118,24 +6161,14 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
  	case RA_ICEBOUNDTRAP:
  	case RA_ICEBOUNDTRAP:
 		md.damage = skill_lv * status_get_dex(src) + status_get_int(src) * 5 ;
 		md.damage = skill_lv * status_get_dex(src) + status_get_int(src) * 5 ;
 		RE_LVL_TMDMOD();
 		RE_LVL_TMDMOD();
-		if(sd)
-		{
+		if(sd) {
 			int researchskill_lv = pc_checkskill(sd,RA_RESEARCHTRAP);
 			int researchskill_lv = pc_checkskill(sd,RA_RESEARCHTRAP);
 			if(researchskill_lv)
 			if(researchskill_lv)
 				md.damage = (int64)md.damage * 20 * researchskill_lv / (skill_id == RA_CLUSTERBOMB?50:100);
 				md.damage = (int64)md.damage * 20 * researchskill_lv / (skill_id == RA_CLUSTERBOMB?50:100);
 			else
 			else
 				md.damage = 0;
 				md.damage = 0;
-		}else
+		} else
 			md.damage = (int64)md.damage * 200 / (skill_id == RA_CLUSTERBOMB?50:100);
 			md.damage = (int64)md.damage * 200 / (skill_id == RA_CLUSTERBOMB?50:100);
-
-		break;
-	case NC_SELFDESTRUCTION:
-		{
-			short totaldef = status_get_def2(target) + (short)status_get_def(target);
-			md.damage = ( ((sd) ? pc_checkskill(sd,NC_MAINFRAME) : skill_get_max(NC_MAINFRAME)) + 8 ) * ( skill_lv + 1 ) * ( status_get_sp(src) + status_get_vit(src) );
-			RE_LVL_MDMOD(100);
-			md.damage += status_get_hp(src) - totaldef;
-		}
 		break;
 		break;
 	case GN_THORNS_TRAP:
 	case GN_THORNS_TRAP:
 		md.damage = 100 + 200 * skill_lv + status_get_int(src);
 		md.damage = 100 + 200 * skill_lv + status_get_int(src);

+ 3 - 0
src/map/map.h

@@ -54,6 +54,8 @@ void map_msg_reload(void);
 /** Added definitions for WoESE objects and other [L0ne_W0lf], [aleos] */
 /** Added definitions for WoESE objects and other [L0ne_W0lf], [aleos] */
 enum MOBID {
 enum MOBID {
 	MOBID_PORING			= 1002,
 	MOBID_PORING			= 1002,
+	MOBID_RED_PLANT			= 1078,
+	MOBID_BLACK_MUSHROOM	= 1084,
 	MOBID_GOBLIN_1			= 1122,
 	MOBID_GOBLIN_1			= 1122,
 	MOBID_GOBLIN_2,
 	MOBID_GOBLIN_2,
 	MOBID_GOBLIN_3,
 	MOBID_GOBLIN_3,
@@ -100,6 +102,7 @@ enum MOBID {
 	MOBID_MAGICDECOY_WATER,
 	MOBID_MAGICDECOY_WATER,
 	MOBID_MAGICDECOY_EARTH,
 	MOBID_MAGICDECOY_EARTH,
 	MOBID_MAGICDECOY_WIND,
 	MOBID_MAGICDECOY_WIND,
+	MOBID_ZANZOU			= 2308,
 	MOBID_S_HORNET			= 2158,
 	MOBID_S_HORNET			= 2158,
 	MOBID_S_GIANT_HORNET,
 	MOBID_S_GIANT_HORNET,
 	MOBID_S_LUCIOLA_VESPA,
 	MOBID_S_LUCIOLA_VESPA,

+ 16 - 16
src/map/pc.c

@@ -2197,22 +2197,22 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			break;
 			break;
 		case SP_BASE_ATK:
 		case SP_BASE_ATK:
 			if(sd->state.lr_flag != 2) {
 			if(sd->state.lr_flag != 2) {
-	#ifdef RENEWAL
+#ifdef RENEWAL
 				sd->bonus.eatk += val;
 				sd->bonus.eatk += val;
-	#else
+#else
 				bonus = status->batk + val;
 				bonus = status->batk + val;
 				status->batk = cap_value(bonus, 0, USHRT_MAX);
 				status->batk = cap_value(bonus, 0, USHRT_MAX);
-	#endif
+#endif
 			}
 			}
 			break;
 			break;
 		case SP_DEF1:
 		case SP_DEF1:
 			if(sd->state.lr_flag != 2) {
 			if(sd->state.lr_flag != 2) {
 				bonus = status->def + val;
 				bonus = status->def + val;
-	#ifdef RENEWAL
+#ifdef RENEWAL
 				status->def = cap_value(bonus, SHRT_MIN, SHRT_MAX);
 				status->def = cap_value(bonus, SHRT_MIN, SHRT_MAX);
-	#else
+#else
 				status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX);
 				status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX);
-	#endif
+#endif
 			}
 			}
 			break;
 			break;
 		case SP_DEF2:
 		case SP_DEF2:
@@ -2224,11 +2224,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 		case SP_MDEF1:
 		case SP_MDEF1:
 			if(sd->state.lr_flag != 2) {
 			if(sd->state.lr_flag != 2) {
 				bonus = status->mdef + val;
 				bonus = status->mdef + val;
-	#ifdef RENEWAL
+#ifdef RENEWAL
 				status->mdef = cap_value(bonus, SHRT_MIN, SHRT_MAX);
 				status->mdef = cap_value(bonus, SHRT_MIN, SHRT_MAX);
-	#else
+#else
 				status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX);
 				status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX);
-	#endif
+#endif
 				if( sd->state.lr_flag == 3 ) {//Shield, used for royal guard
 				if( sd->state.lr_flag == 3 ) {//Shield, used for royal guard
 					sd->bonus.shieldmdef += bonus;
 					sd->bonus.shieldmdef += bonus;
 				}
 				}
@@ -2315,9 +2315,9 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 				break;
 				break;
 			sd->bonus.sp += val;
 			sd->bonus.sp += val;
 			break;
 			break;
-	#ifndef RENEWAL_CAST
+#ifndef RENEWAL_CAST
 		case SP_VARCASTRATE:
 		case SP_VARCASTRATE:
-	#endif
+#endif
 		case SP_CASTRATE:
 		case SP_CASTRATE:
 			if(sd->state.lr_flag != 2)
 			if(sd->state.lr_flag != 2)
 				sd->castrate+=val;
 				sd->castrate+=val;
@@ -2369,11 +2369,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			break;
 			break;
 		case SP_ASPD_RATE:	//Stackable increase - Made it linear as per rodatazone
 		case SP_ASPD_RATE:	//Stackable increase - Made it linear as per rodatazone
 			if(sd->state.lr_flag != 2)
 			if(sd->state.lr_flag != 2)
-	#ifndef RENEWAL_ASPD
+#ifndef RENEWAL_ASPD
 				status->aspd_rate -= 10*val;
 				status->aspd_rate -= 10*val;
-	#else
+#else
 				status->aspd_rate2 += val;
 				status->aspd_rate2 += val;
-	#endif
+#endif
 			break;
 			break;
 		case SP_HP_RECOV_RATE:
 		case SP_HP_RECOV_RATE:
 			if(sd->state.lr_flag != 2)
 			if(sd->state.lr_flag != 2)
@@ -2752,7 +2752,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			if(sd->state.lr_flag != 2)
 			if(sd->state.lr_flag != 2)
 				sd->bonus.add_fixcast += val;
 				sd->bonus.add_fixcast += val;
 			break;
 			break;
-	#ifdef RENEWAL_CAST
+#ifdef RENEWAL_CAST
 		case SP_VARCASTRATE:
 		case SP_VARCASTRATE:
 			if(sd->state.lr_flag != 2)
 			if(sd->state.lr_flag != 2)
 				sd->bonus.varcastrate -= val;
 				sd->bonus.varcastrate -= val;
@@ -2761,7 +2761,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			if(sd->state.lr_flag != 2)
 			if(sd->state.lr_flag != 2)
 				sd->bonus.add_varcast += val;
 				sd->bonus.add_varcast += val;
 			break;
 			break;
-	#endif
+#endif
 		case SP_ADDMAXWEIGHT:
 		case SP_ADDMAXWEIGHT:
 			if (sd->state.lr_flag != 2)
 			if (sd->state.lr_flag != 2)
 				sd->max_weight += val;
 				sd->max_weight += val;

+ 16 - 21
src/map/skill.c

@@ -997,9 +997,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 	/**
 	/**
 	 * Storm Gust counter was dropped in renewal
 	 * Storm Gust counter was dropped in renewal
 	 **/
 	 **/
-	#ifdef RENEWAL
+#ifdef RENEWAL
 		sc_start(src,bl,SC_FREEZE,65-(5*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv));
 		sc_start(src,bl,SC_FREEZE,65-(5*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv));
-	#else
+#else
 		//On third hit, there is a 150% to freeze the target
 		//On third hit, there is a 150% to freeze the target
 		if(tsc->sg_counter >= 3 &&
 		if(tsc->sg_counter >= 3 &&
 			sc_start(src,bl,SC_FREEZE,150,skill_lv,skill_get_time2(skill_id,skill_lv)))
 			sc_start(src,bl,SC_FREEZE,150,skill_lv,skill_get_time2(skill_id,skill_lv)))
@@ -1009,7 +1009,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 		 **/
 		 **/
 		else if( tsc->sg_counter > 250 )
 		else if( tsc->sg_counter > 250 )
 			tsc->sg_counter = 0;
 			tsc->sg_counter = 0;
-	#endif
+#endif
 		break;
 		break;
 
 
 	case WZ_METEOR:
 	case WZ_METEOR:
@@ -8958,10 +8958,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case NC_SELFDESTRUCTION:
 	case NC_SELFDESTRUCTION:
 		if( sd ) {
 		if( sd ) {
 			if( pc_ismadogear(sd) )
 			if( pc_ismadogear(sd) )
-				 pc_setmadogear(sd, 0);
+				pc_setmadogear(sd, 0);
+			skill_area_temp[1] = 0;
 			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
 			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
-			skill_castend_damage_id(src, src, skill_id, skill_lv, tick, flag);
+			map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
 			status_set_sp(src, 0, 0);
 			status_set_sp(src, 0, 0);
+			skill_clear_unitgroup(src);
 		}
 		}
 		break;
 		break;
 
 
@@ -9587,7 +9589,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			int rate = (4 * skill_lv) + ((sd) ? pc_checkskill(sd,WM_LESSON)*2 + sd->status.job_level/5 : skill_get_max(WM_LESSON)) + status_get_lv(src) / 15;
 			int rate = (4 * skill_lv) + ((sd) ? pc_checkskill(sd,WM_LESSON)*2 + sd->status.job_level/5 : skill_get_max(WM_LESSON)) + status_get_lv(src) / 15;
 			if( bl != src )
 			if( bl != src )
 				sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv));
 				sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv));
-		}else {
+		} else {
 			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
 			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
 			map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR,
 			map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR,
 							   src, skill_id, skill_lv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id);
 							   src, skill_id, skill_lv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id);
@@ -9846,7 +9848,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		if(sd){
 		if(sd){
 			struct mob_data *md;
 			struct mob_data *md;
 
 
-			md = mob_once_spawn_sub(src, src->m, src->x, src->y, status_get_name(src), 2308, "", SZ_SMALL, AI_NONE);
+			md = mob_once_spawn_sub(src, src->m, src->x, src->y, status_get_name(src), MOBID_ZANZOU, "", SZ_SMALL, AI_NONE);
 			if( md )
 			if( md )
 			{
 			{
 				md->master_id = src->id;
 				md->master_id = src->id;
@@ -9880,7 +9882,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 		break;
 		break;
 	case KO_GENWAKU:
 	case KO_GENWAKU:
-		if ( !map_flag_gvg(src->m) && ( dstsd || dstmd ) && battle_check_target(src,bl,BCT_ENEMY) > 0 ) {
+		if ( !map_flag_gvg2(src->m) && ( dstsd || dstmd ) && !(tstatus->mode&MD_PLANT) && battle_check_target(src,bl,BCT_ENEMY) > 0 ) {
 			int x = src->x, y = src->y;
 			int x = src->x, y = src->y;
 
 
 			if( sd && rnd()%100 > ((45+5*skill_lv) - status_get_int(bl)/10) ){//[(Base chance of success) - (Intelligence Objectives / 10)]%.
 			if( sd && rnd()%100 > ((45+5*skill_lv) - status_get_int(bl)/10) ){//[(Base chance of success) - (Intelligence Objectives / 10)]%.
@@ -9893,8 +9895,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				clif_slide(src, bl->x, bl->y);
 				clif_slide(src, bl->x, bl->y);
 				clif_fixpos(src);
 				clif_fixpos(src);
 				sc_start(src,src,SC_CONFUSION,25,skill_lv,skill_get_time(skill_id,skill_lv));
 				sc_start(src,src,SC_CONFUSION,25,skill_lv,skill_get_time(skill_id,skill_lv));
-				if (unit_movepos(bl,x,y,0,0))
-				{
+				if (unit_movepos(bl,x,y,0,0)) {
 					clif_skill_damage(bl,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, -1, 6);
 					clif_skill_damage(bl,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, -1, 6);
 					if( bl->type == BL_PC && pc_issit((TBL_PC*)bl))
 					if( bl->type == BL_PC && pc_issit((TBL_PC*)bl))
 						clif_sitting(bl); //Avoid sitting sync problem
 						clif_sitting(bl); //Avoid sitting sync problem
@@ -11077,7 +11078,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 			if (rnd()%100 < 50) {
 			if (rnd()%100 < 50) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 			} else {
 			} else {
-				TBL_MOB* md = mob_once_spawn_sub(src, src->m, x, y, "--ja--",(skill_lv < 2 ? 1084+rnd()%2 : 1078+rnd()%6),"", SZ_SMALL, AI_NONE);
+				TBL_MOB* md = mob_once_spawn_sub(src, src->m, x, y, "--ja--",(skill_lv < 2 ? MOBID_BLACK_MUSHROOM + rnd()%2 : MOBID_RED_PLANT + rnd()%6),"", SZ_SMALL, AI_NONE);
 				int i;
 				int i;
 				if (!md) break;
 				if (!md) break;
 				if ((i = skill_get_time(skill_id, skill_lv)) > 0)
 				if ((i = skill_get_time(skill_id, skill_lv)) > 0)
@@ -11194,7 +11195,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 					case 2: sx = x - i; break;
 					case 2: sx = x - i; break;
 					case 6: sx = x + i; break;
 					case 6: sx = x + i; break;
 				}
 				}
-				skill_addtimerskill(src,gettick() + (150 * i),0,sx,sy,skill_id,skill_lv,dir,flag&2);
+				skill_addtimerskill(src,gettick() + (140 * i),0,sx,sy,skill_id,skill_lv,dir,flag&2);
 			}
 			}
 		}
 		}
 		break;
 		break;
@@ -11224,10 +11225,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 
 
 	case NC_SILVERSNIPER:
 	case NC_SILVERSNIPER:
 		{
 		{
-			int class_ = MOBID_SILVERSNIPER;
 			struct mob_data *md;
 			struct mob_data *md;
 
 
-			md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), class_, "", SZ_SMALL, AI_NONE);
+			md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), MOBID_SILVERSNIPER, "", SZ_SMALL, AI_NONE);
 			if( md ) {
 			if( md ) {
 				md->master_id = src->id;
 				md->master_id = src->id;
 				md->special_state.ai = AI_FAW;
 				md->special_state.ai = AI_FAW;
@@ -12909,6 +12909,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 		case UNT_ELECTRICWALK:
 		case UNT_ELECTRICWALK:
 		case UNT_PSYCHIC_WAVE:
 		case UNT_PSYCHIC_WAVE:
 		case UNT_MAGMA_ERUPTION:
 		case UNT_MAGMA_ERUPTION:
+		case UNT_MAKIBISHI:
 			skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 			skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 			break;
 			break;
 
 
@@ -13162,12 +13163,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 				sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv));
 				sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv));
 			break;
 			break;
 
 
-		case UNT_MAKIBISHI:
-			skill_attack(BF_MISC, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
-			sg->limit = DIFF_TICK(tick, sg->tick);
-			sg->unit_id = UNT_USED_TRAPS;
-			break;
-
 		case UNT_LAVA_SLIDE:
 		case UNT_LAVA_SLIDE:
 			skill_attack(BF_WEAPON, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
 			skill_attack(BF_WEAPON, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
 			if(++sg->val1 > 4) //after 5 stop hit and destroy me
 			if(++sg->val1 > 4) //after 5 stop hit and destroy me
@@ -14655,7 +14650,7 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
 		case KO_ZANZOU: {
 		case KO_ZANZOU: {
 				int c = 0;
 				int c = 0;
 
 
-				i = map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, 2308, skill_id, &c);
+				i = map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, MOBID_ZANZOU, skill_id, &c);
 				if( c >= skill_get_maxcount(skill_id,skill_lv) || c != i) {
 				if( c >= skill_get_maxcount(skill_id,skill_lv) || c != i) {
 					clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0);
 					clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0);
 					return false;
 					return false;