Browse Source

Applied remaining post-balance skill changes to Rune Knight.
- Adjusted Wind Cutter and Storm Blast cast times.
- Removed range from Enchant Blade and updated damage formula.
- Increased Hundred Spear range to 5.
- Changed Dragon Howl attack type from weapon to none.
- Added missing damage increase for spears while riding a Dragon.
- Updated Sonic Wave, Wind Cutter, Ignition Break, Hundred Spear, Storm Blast, and Fighting Spirit damage formulas.
- Death Bound now deflects 70% of the damage taken back at the attacker.
- Vitality Activation now stops SP regeneration, increases (1.5x) HP recovery items, and decreases (1.5x) SP recovery items.
- Stone Hard Skin now consumes 20% HP.
- Corrected the formula for Millennium Shield production chance.
- Phantom Thrust is now usable on party members in normal maps but doesn't inflict damage.
- Updated the list of statuses that Refresh removes.
- Giant Growth now has a 15% chance to increase damage.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17140 54d463be-8e91-2dee-dedb-b68131a5f0ec

aleos 12 năm trước cách đây
mục cha
commit
ef0f5669b2
7 tập tin đã thay đổi với 142 bổ sung102 xóa
  1. 21 21
      db/pre-re/skill_cast_db.txt
  2. 3 3
      db/re/skill_cast_db.txt
  3. 4 4
      db/re/skill_db.txt
  4. 38 33
      src/map/battle.c
  5. 5 0
      src/map/pc.c
  6. 54 31
      src/map/skill.c
  7. 17 10
      src/map/status.c

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

@@ -1071,44 +1071,44 @@
 1019,2000,1000,0,1800000,0,0
 //==========================================
 
-//===== Rune Knight ======================== 
-//-- RK_ENCHANTBLADE 
+//===== Rune Knight ========================
+//-- RK_ENCHANTBLADE
 2001,1000,0,0,300000,0,0
-//-- RK_SONICWAVE 
+//-- RK_SONICWAVE
 2002,0,1000,0,0,0,2000
-//-- RK_DEATHBOUND 
+//-- RK_DEATHBOUND
 2003,0,2000,0,2000,0,3000
-//-- RK_HUNDREDSPEAR 
+//-- RK_HUNDREDSPEAR
 2004,1000:900:800:700:600:500:400:300:200:100,500,0,0,0,3000
-//-- RK_WINDCUTTER 
-2005,0,2000,0,0,0,2000
-//-- RK_IGNITIONBREAK 
+//-- RK_WINDCUTTER
+2005,0,0,0,15000,0,2000
+//-- RK_IGNITIONBREAK
 2006,1000,0,0,0,0,2000
 
-//-- RK_DRAGONBREATH 
+//-- RK_DRAGONBREATH
 2008,0:0:0:1000:1000:1000:1500:1500:2000:2000,2000,0,10000,0,0
-//-- RK_DRAGONHOWLING 
+//-- RK_DRAGONHOWLING
 2009,0,0,0,15000,0,10000
 
-//-- RK_MILLENNIUMSHIELD 
+//-- RK_MILLENNIUMSHIELD
 2011,0,1000,0,180000,0,60000
-//-- RK_CRUSHSTRIKE 
+//-- RK_CRUSHSTRIKE
 2012,0,0,0,180000,0,30000
-//-- RK_REFRESH 
+//-- RK_REFRESH
 2013,0,0,0,60000,0,120000
-//-- RK_GIANTGROWTH 
+//-- RK_GIANTGROWTH
 2014,0,0,0,180000,0,0
-//-- RK_STONEHARDSKIN 
+//-- RK_STONEHARDSKIN
 2015,0,0,0,180000,10000,0
-//-- RK_VITALITYACTIVATION 
+//-- RK_VITALITYACTIVATION
 2016,0,0,0,180000,0,0
-//-- RK_STORMBLAST 
-2017,0,0,0,0,0,0
-//-- RK_FIGHTINGSPIRIT 
+//-- RK_STORMBLAST
+2017,2000,1000,0,0,0,0
+//-- RK_FIGHTINGSPIRIT
 2018,0,0,0,180000,0,0
-//-- RK_ABUNDANCE 
+//-- RK_ABUNDANCE
 2019,0,0,0,180000,0,0
-//========================================== 
+//==========================================
 
 //===== Gillotine Cross ==================== 
 //-- GC_VENOMIMPRESS 

+ 3 - 3
db/re/skill_cast_db.txt

@@ -1080,7 +1080,7 @@
 //-- RK_HUNDREDSPEAR
 2004,1000:900:800:700:600:500:400:300:200:100,500,0,0,0,3000,-1
 //-- RK_WINDCUTTER
-2005,0,2000,0,0,0,2000,-1
+2005,0,0,0,15000,0,2000,-1
 //-- RK_IGNITIONBREAK
 2006,1000,0,0,0,0,2000,-1
 
@@ -1101,8 +1101,8 @@
 2015,0,0,0,180000,10000,0,2000
 //-- RK_VITALITYACTIVATION
 2016,0,0,0,180000,0,0,-1
-//-- RK_STORMBLAST 
-2017,0,0,0,0,0,0,2000
+//-- RK_STORMBLAST
+2017,2000,1000,0,0,0,0,-1
 //-- RK_FIGHTINGSPIRIT
 2018,0,0,0,180000,0,0,-1
 //-- RK_ABUNDANCE

+ 4 - 4
db/re/skill_db.txt

@@ -678,15 +678,15 @@
 //****
 // RK Rune Knight
 //****
-2001,1,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,	RK_ENCHANTBLADE,Enchant Blade
+2001,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,	RK_ENCHANTBLADE,Enchant Blade
 2002,7:8:9:10:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,	RK_SONICWAVE,Sonic Wave
 2003,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,	RK_DEATHBOUND,Death Bound
-2004,1,8,1,-1,0,0,10,-5,no,0,0,0,weapon,0,	RK_HUNDREDSPEAR,Hundred Spear
+2004,5,8,1,-1,0,0,10,-5,no,0,0,0,weapon,0,	RK_HUNDREDSPEAR,Hundred Spear
 2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,	RK_WINDCUTTER,Wind Cutter
 2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,	RK_IGNITIONBREAK,Ignition Break
 2007,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,		RK_DRAGONTRAINING,Dragon Training
-2008,9,6,2,3,0xC2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,misc,0,	RK_DRAGONBREATH,Dragon Breath //CHECK May have to change this back to a weapon type attack.
-2009,0,6,4,0,0x3,3:4:5:6:7,5,1,yes,0,0,0,weapon,0,	RK_DRAGONHOWLING,Dragon Howling
+2008,9,6,2,3,0xC2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,misc,0,	RK_DRAGONBREATH,Dragon Breath
+2009,0,6,4,0,0x3,3:4:5:6:7,5,1,yes,0,0,0,none,0,	RK_DRAGONHOWLING,Dragon Howling
 2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,		RK_RUNEMASTERY,Rune Mastery
 2011,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,	RK_MILLENNIUMSHIELD,Millenium Shield
 2012,1,6,4,-1,0,0x8,1,1,yes,0,0,0,weapon,0,	RK_CRUSHSTRIKE,Crush Strike

+ 38 - 33
src/map/battle.c

@@ -1334,6 +1334,7 @@ int battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int dama
 	case HW_GRAVITATION:
 	case NJ_ZENYNAGE:
 	case KO_MUCHANAGE:
+	case RK_DRAGONBREATH:
 		break;
 	default:
 		/* Uncomment if you want god-mode Emperiums at 100 defense. [Kisuka]
@@ -1436,10 +1437,13 @@ int battle_addmastery(struct map_session_data *sd,struct block_list *target,int
 		case W_1HSPEAR:
 		case W_2HSPEAR:
 			if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
-				if(!pc_isriding(sd))
+				if(!pc_isriding(sd) || !pc_isridingdragon(sd))
 					damage += (skill * 4);
 				else
 					damage += (skill * 5);
+				// Increase damage by level of KN_SPEARMASTERY * 10
+				if(pc_checkskill(sd,RK_DRAGONTRAINING) > 0)
+					damage += (skill * 10);
 			}
 			break;
 		case W_1HAXE:
@@ -2536,36 +2540,40 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 					skillratio += ((skill_lv-1)%5+1)*100;
 					break;
 				case RK_SONICWAVE:
-						skillratio += 400 + 100 * skill_lv;
-						RE_LVL_DMOD(100);
+					skillratio = (skill_lv + 5) * 100; // ATK = {((Skill Level + 5) x 100) x (1 + [(Caster's Base Level - 100) / 200])} %
+					skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100;
 					break;
 				case RK_HUNDREDSPEAR:
-						skillratio += 500 + (80 * skill_lv);
-						if( sd )
-						{
-							short index = sd->equip_index[EQI_HAND_R];
-							if( index >= 0 && sd->inventory_data[index]
-								&& sd->inventory_data[index]->type == IT_WEAPON )
-								skillratio += max(10000 - sd->inventory_data[index]->weight, 0) / 10;
-							skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE);
-						} // (1 + [(Casters Base Level - 100) / 200])
-						skillratio = skillratio * (100 + (status_get_lv(src)-100) / 2) / 100;
+					skillratio += 500 + (80 * skill_lv);
+					if( sd ) {
+						short index = sd->equip_index[EQI_HAND_R];
+						if( index >= 0 && sd->inventory_data[index]
+							&& sd->inventory_data[index]->type == IT_WEAPON )
+							skillratio += max(10000 - sd->inventory_data[index]->weight, 0) / 10;
+						skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE);
+					} // (1 + [(Casters Base Level - 100) / 200])
+					skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100;
 					break;
 				case RK_WINDCUTTER:
-						skillratio += 50 * skill_lv;
-						RE_LVL_DMOD(100);
+					skillratio = (skill_lv + 2) * 50;
+					RE_LVL_DMOD(100);
 					break;
-				case RK_IGNITIONBREAK:
+				case RK_IGNITIONBREAK: {
+						// 3x3 cell Damage = ATK [{(Skill Level x 300) x (1 + [(Caster's Base Level - 100) / 100])}] %
+						// 7x7 cell Damage = ATK [{(Skill Level x 250) x (1 + [(Caster's Base Level - 100) / 100])}] %
+						// 11x11 cell Damage = ATK [{(Skill Level x 200) x (1 + [(Caster's Base Level - 100) / 100])}] %
+						int dmg = 300; // Base maximum damage at less than 3 cells.
 						i = distance_bl(src,target);
-						if( i < 2 )
-							skillratio = 200 + 200 * skill_lv;
-						else if( i < 4 )
-							skillratio = 100 + 200 * skill_lv;
-						else
-							skillratio = 100 + 100 * skill_lv;
-						RE_LVL_DMOD(100);
-						if( sstatus->rhw.ele == ELE_FIRE )
-							skillratio +=  skillratio / 2;
+						if( i > 7 )
+							dmg -= 100; // Greather than 7 cells. (200 damage)
+						else if( i > 3 )
+							dmg -= 50; // Greater than 3 cells, less than 7. (250 damage)
+						dmg = (dmg * skill_lv) * (100 + (status_get_lv(src) - 100) / 12) / 100;
+						// Elemental check, +100% damage if your element is fire.
+						if( sstatus->rhw.ele  == ELE_FIRE )
+							dmg += skill_lv * 100 / 100;
+						skillratio = dmg;
+					}
 					break;
 				case RK_CRUSHSTRIKE:
 					if( sd )
@@ -2577,12 +2585,11 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 					}
 					break;
 				case RK_STORMBLAST:
-					skillratio = 100 * (sd ? pc_checkskill(sd,RK_RUNEMASTERY) : 1) +  100 * (sstatus->int_ / 4);
+					skillratio = ((sd ? pc_checkskill(sd,RK_RUNEMASTERY) : 1) + (sstatus->int_ / 8)) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's INT / 8)} x 100] %
 					break;
-				case RK_PHANTOMTHRUST:
-					skillratio = 50 * skill_lv + 10 * ( sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 10);
-					//if( s_level > 100 ) skillratio += skillratio * s_level / 150;	// Base level bonus. This is official, but is disabled until I can confirm something with was changed or not. [Rytech]
-					//if( s_level > 100 ) skillratio += skillratio * (s_level - 100) / 200;	// Base level bonus.
+				case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] %
+					skillratio = 50 * skill_lv + 10 * (sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 5);
+					RE_LVL_DMOD(150); // Base level bonus.
 					break;
 				/**
 				 * GC Guilotine Cross
@@ -4593,8 +4600,7 @@ int battle_calc_return_damage(struct block_list* bl, struct block_list *src, int
 					*dmg = (int64)rd1 * 30 / 100; // Received damage = 30% of amplifly damage.
 					clif_skill_damage(src,bl,gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1,6);
 					status_change_end(bl,SC_DEATHBOUND,INVALID_TIMER);
-					rdamage += rd1;
-					if (rdamage < 1) rdamage = 1;
+					rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
 				}
 			}
 		}
@@ -5214,7 +5220,6 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 					case RA_SENSITIVEKEEN:
 					case GN_CRAZYWEED_ATK:
 					case RK_STORMBLAST:
-					case RK_PHANTOMTHRUST:
 					case SR_RAMPAGEBLASTER:
 					case NC_COLDSLOWER:
 					case NC_SELFDESTRUCTION:

+ 5 - 0
src/map/pc.c

@@ -7216,6 +7216,11 @@ int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp)
 			sp -= sp * 20 / 100;
 		}
 
+		if( sd->sc.data[SC_VITALITYACTIVATION] ){
+			hp += hp / 2; // 1.5 times
+			sp -= sp / 2;
+		}
+
 		if( sd->sc.data[SC_WATER_INSIGNIA] && sd->sc.data[SC_WATER_INSIGNIA]->val1 == 2 ) {
 			hp += hp / 10;
 			sp += sp / 10;

+ 54 - 31
src/map/skill.c

@@ -1190,13 +1190,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 	case NPC_CRITICALWOUND:
 		sc_start(bl,SC_CRITICALWOUND,100,skill_lv,skill_get_time2(skill_id,skill_lv));
 		break;
-	case RK_HUNDREDSPEAR:
-		if( !sd || pc_checkskill(sd,KN_SPEARBOOMERANG) == 0 )
-			break; // Spear Boomerang auto cast chance only works if you have mastered Spear Boomerang.
-		rate = 10 + 3 * skill_lv;
-		if( rnd()%100 < rate )
-			skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,1,tick,0);
-		break;
 	case RK_WINDCUTTER:
 		sc_start(bl,SC_FEAR,3+2*skill_lv,skill_lv,skill_get_time(skill_id,skill_lv));
 		break;
@@ -3279,6 +3272,14 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
 					map_foreachinrange(skill_area_sub, target, skill_get_splash(skl->skill_id, skl->skill_lv), BL_CHAR,
 									   src, skl->skill_id, skl->skill_lv, 0, skl->flag|1|BCT_ENEMY, skill_castend_damage_id);
 					break;
+				case RK_HUNDREDSPEAR:
+					if(src->type == BL_PC) {
+						int skill_lv = pc_checkskill((struct map_session_data *)src,KN_SPEARBOOMERANG);
+						if(skill_lv > 0)
+							skill_attack(BF_WEAPON,src,src,target,KN_SPEARBOOMERANG,skill_lv,tick,skl->flag);
+					} else
+						skill_attack(BF_WEAPON,src,src,target,KN_SPEARBOOMERANG,1,tick,skl->flag);
+					break;
 				case CH_PALMSTRIKE:
 					{
 						struct status_change* tsc = status_get_sc(target);
@@ -3412,7 +3413,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 {
 	struct map_session_data *sd = NULL;
 	struct status_data *tstatus;
-	struct status_change *sc;
+	struct status_change *sc, *tsc;
 
 	if (skill_id > 0 && !skill_lv) return 0;
 
@@ -3440,8 +3441,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	}
 
 	sc = status_get_sc(src);
+	tsc = status_get_sc(bl);
 	if (sc && !sc->count)
 		sc = NULL; //Unneeded
+	if (tsc && !tsc->count)
+		tsc = NULL;
 
 	tstatus = status_get_status_data(bl);
 
@@ -3536,7 +3540,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case NPC_CRITICALWOUND:
 	case NPC_HELLPOWER:
 	case RK_SONICWAVE:
-	case RK_HUNDREDSPEAR:
 	case AB_DUPLELIGHT_MELEE:
 	case RA_AIMEDBOLT:
 	case NC_AXEBOOMERANG:
@@ -4109,6 +4112,16 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		status_change_end(src, SC_HIDING, INVALID_TIMER);
 		skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
 		break;
+	case RK_HUNDREDSPEAR:
+		skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
+		if(rnd()%100 < (10 + 3*skill_lv)) {
+			if( !sd || pc_checkskill(sd,KN_SPEARBOOMERANG) == 0 )
+				break; // Spear Boomerang auto cast chance only works if you have mastered Spear Boomerang.
+			skill_blown(src,bl,6,-1,0);
+			skill_addtimerskill(src,tick+800,bl->id,0,0,skill_id,skill_lv,BF_WEAPON,flag);
+			skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,1,tick,0);
+		}
+		break;
 	case RK_PHANTOMTHRUST:
 		unit_setdir(src,map_calc_dir(src, bl->x, bl->y));
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
@@ -4117,8 +4130,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		if( battle_check_target(src,bl,BCT_ENEMY) )
 			skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
 		break;
-
-	case RK_STORMBLAST:
 	case RK_CRUSHSTRIKE:
 		if( sd ) {
 			if( pc_checkskill(sd,RK_RUNEMASTERY) >= ( skill_id == RK_CRUSHSTRIKE ? 7 : 3 ) )
@@ -4128,6 +4139,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		} else //non-sd support
 			skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
 		break;
+	case RK_STORMBLAST:
+		if( flag&1 )
+			skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
+		else {
+			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,src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1,skill_castend_nodamage_id);
+		}
+		break;
 	case GC_DARKILLUSION:
 		{
 			short x, y;
@@ -7462,8 +7481,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		}
 		break;
 	case RK_ENCHANTBLADE:
-		clif_skill_nodamage(src,bl,skill_id,skill_lv,// formula not confirmed
-			sc_start2(bl,type,100,skill_lv,100+20*skill_lv/*+sstatus->int_/2+status_get_lv(bl)/10*/,skill_get_time(skill_id,skill_lv)));
+		clif_skill_nodamage(src,bl,skill_id,skill_lv,
+			sc_start2(bl,type,100,skill_lv,(100+20*skill_lv)*(status_get_lv(src)/150)+sstatus->int_,skill_get_time(skill_id,skill_lv)));
 		break;
 	case RK_DRAGONHOWLING:
 		if( flag&1)
@@ -7492,7 +7511,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case RK_STONEHARDSKIN:
 		if( sd && pc_checkskill(sd,RK_RUNEMASTERY) >= 4 )
 		{
-			int heal = sstatus->hp / 4; // 25% HP
+			int heal = sstatus->hp / 5; // 20% HP
 			if( status_charge(bl,heal,0) )
 				clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start2(bl,type,100,skill_lv,heal,skill_get_time(skill_id,skill_lv)));
 			else
@@ -7513,7 +7532,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case RK_MILLENNIUMSHIELD:
 		if( sd && pc_checkskill(sd,RK_RUNEMASTERY) >= 9 )
 		{
-			short shields = (rnd()%100<50) ? 4 : ((rnd()%100<80) ? 3 : 2);
+			short shields = (rnd()%100<20) ? 4 : ((rnd()%100<30) ? 3 : 2); // 20% for 4, 30% for 3, 50% for 2
 			sc_start4(bl,type,100,skill_lv,shields,1000,0,skill_get_time(skill_id,skill_lv));
 			clif_millenniumshield(sd,shields);
 			clif_skill_nodamage(src,bl,skill_id,1,1);
@@ -7538,21 +7557,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		}
 		break;
 
-	case RK_FIGHTINGSPIRIT:
-		if( flag&1 ) {
-			if( src == bl )
-				sc_start2(bl,type,100,skill_area_temp[5],10*(sd?pc_checkskill(sd,RK_RUNEMASTERY):10),skill_get_time(skill_id,skill_lv));
-			else
-				sc_start(bl,type,100,skill_area_temp[5]/4,skill_get_time(skill_id,skill_lv));
-		} else if( sd && pc_checkskill(sd,RK_RUNEMASTERY) >= 5 ) {
-			if( sd->status.party_id ) {
-				i = party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,BCT_PARTY,skill_area_sub_count);
-				skill_area_temp[5] = 7 * i; // ATK
-				party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,flag|BCT_PARTY|1,skill_castend_nodamage_id);
-			} else
-				sc_start2(bl,type,100,7,5,skill_get_time(skill_id,skill_lv));
+	case RK_FIGHTINGSPIRIT: {
+			int atkbonus = 7 * party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,BCT_PARTY,skill_area_sub_count);
+			if( flag&1 ) {
+				if( src == bl )
+					sc_start2(bl,type,100,atkbonus,10*(sd?pc_checkskill(sd,RK_RUNEMASTERY):10),skill_get_time(skill_id,skill_lv));
+				else
+					sc_start(bl,type,100,atkbonus / 4,skill_get_time(skill_id,skill_lv));
+			} else if( sd && pc_checkskill(sd,RK_RUNEMASTERY) >= 5 ) {
+				if( sd->status.party_id )
+					party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,flag|BCT_PARTY|1,skill_castend_nodamage_id);
+				else
+					sc_start2(bl,type,100,7,10*(sd?pc_checkskill(sd,RK_RUNEMASTERY):10),skill_get_time(skill_id,skill_lv));
+				clif_skill_nodamage(src,bl,skill_id,1,1);
+			}
 		}
-		clif_skill_nodamage(src,bl,skill_id,1,1);
 		break;
 	/**
 	 * Guilotine Cross
@@ -8630,7 +8649,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 
 			// Summoning the new one.
 			if( !elemental_create(sd,elemental_class,skill_get_time(skill_id,skill_lv)) ) {
-				clif_skill_fail(sd,skill_id,0,0);
+				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				break;
 			}
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
@@ -9233,6 +9252,10 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 				if (sd) clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
 				break;
 			}
+			else if( ud->skill_id == RK_PHANTOMTHRUST && target->type != BL_MOB ) {
+				if( !map_flag_vs(src->m) && battle_check_target(src,target,BCT_PARTY) <= 0 )
+					break; // You can use Phantom Thurst on party members in normal maps too. [pakpil]
+			}
 
 			if(inf&BCT_ENEMY && (sc = status_get_sc(target)) &&
 				sc->data[SC_FOGWALL] &&
@@ -12989,7 +13012,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		case SC_MANHOLE:
 		case SC_DIMENSIONDOOR:
 			if( sc && sc->data[SC_MAGNETICFIELD] ) {
-				clif_skill_fail(sd,skill_id,0,0);
+				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
 			break;

+ 17 - 10
src/map/status.c

@@ -2657,7 +2657,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
 	sd->left_weapon.atkmods[1] = atkmods[1][sd->weapontype2];
 	sd->left_weapon.atkmods[2] = atkmods[2][sd->weapontype2];
 
-	if(pc_isriding(sd) &&
+	if(pc_isriding(sd) || pc_isridingdragon(sd) &&
 		(sd->status.weapon==W_1HSPEAR || sd->status.weapon==W_2HSPEAR))
 	{	//When Riding with spear, damage modifier to mid-class becomes
 		//same as versus large size.
@@ -3492,11 +3492,13 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
 		regen->hp = cap_value(regen->hp*sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX);
 		regen->state.walk= 1;
 	}
-	 if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) //if insignia lvl 1
+	if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) //if insignia lvl 1
 	        || (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1)
 	        || (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1)
 	        || (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1))
 	    regen->rate.hp *= 2;
+	if( sc->data[SC_VITALITYACTIVATION] )
+		regen->flag &=~RGN_SP;
 
 }
 void status_calc_state( struct block_list *bl, struct status_change *sc, enum scs_flag flag, bool start ) {
@@ -6459,12 +6461,19 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 		if( type >= SC_COMMON_MIN && type <= SC_COMMON_MAX) // Confirmed.
 			return 0; // Immune to status ailements
 		switch( type ) {
-		case SC_QUAGMIRE://Tester said it protects against this and decrease agi.
-		case SC_DECREASEAGI:
+		case SC_DEEPSLEEP:
 		case SC_BURNING:
+		case SC_STUN:
+		case SC_SLEEP:
+		case SC_CURSE:
+		case SC_STONE:
+		case SC_POISON:
+		case SC_BLIND:
+		case SC_SILENCE:
+		case SC_BLEEDING:
+		case SC_FREEZE:
 		case SC_FREEZING:
-		//case SC_WHITEIMPRISON://Need confirm. Protected against this in the past. [Rytech]
-		case SC_MARSHOFABYSS:
+		case SC_CRYSTALIZE:
 		case SC_TOXIN:
 		case SC_PARALYSE:
 		case SC_VENOMBLEED:
@@ -6472,9 +6481,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 		case SC_DEATHHURT:
 		case SC_PYREXIA:
 		case SC_OBLIVIONCURSE:
-		case SC_LEECHESEND:
-		case SC_CRYSTALIZE: ////08/31/2011 - Class Balance Changes
-		case SC_DEEPSLEEP:
+		case SC_MARSHOFABYSS:
 		case SC_MANDRAGORA:
 			return 0;
 		}
@@ -8051,7 +8058,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			tick_time = 10000; // [GodLesZ] tick time
 			break;
 		case SC_GIANTGROWTH:
-			val2 = 10; // Triple damage success rate.
+			val2 = 15; // Triple damage success rate.
 			break;
 		/**
 		 * Arch Bishop