Przeglądaj źródła

Rebellion Skills are added!
** Some attempts to support this job with its skills (as usable as good as I can, some of them are custom from limited info, maybe I miss some behaviors)
** Maybe some formulas, entries on skill_db, skill_require_db, skill_unit_db, and skill_cast_db are still custom
** Thank posters are on: (1) http://rathena.org/board/topic/85195-rebellion-class-released-on-kro-sakray/ (2) http://forums.irowiki.org/showthread.php?t=100131
** Some notes:
--> RL_RICHS_COIN, Rich's Coin
--> RL_MASS_SPIRAL, Mass Spiral: Bleeding chance and additional damage still custom formula
--> RL_BANISHING_BUSTER,Banishing Buster: Custom chance formula to remove buff/debuff
--> RL_B_TRAP,Bind Trap: Even I updated my client and use original lua, I stil can't see the trap
--> RL_FLICKER,Flicker
--> RL_S_STORM,Shatter Storm: Custom formula for success rate
--> RL_E_CHAIN,Eternal Chain
--> RL_QD_SHOT,Quick Draw Shot
--> RL_C_MARKER,Crimson Marker: Still doesn't show the icon of marked target on minimap (I don't know the packet for it)
--> RL_FIREDANCE,Fire Dance: Not sure it's only 1 hit damage or works like Desperado (I saw someone's screenshot, it seem only deals 1 hit)
--> RL_H_MINE,Howling Mine
--> RL_P_ALTER,Platinum Alter
--> RL_FALLEN_ANGEL,Fallen Angel
--> RL_R_TRIP,Round Trip
--> RL_FIRE_RAIN,Fire Rain: (1) This should able to remove ground target aroung its area, (2) And the splash area like a 'cone' (I imagined like someone uses gun then fire brutally to his/her front way)
--> RL_HEAT_BARREL,Heat Barrel: Still custom formula, but I saw the damage is increased highly.
--> RL_AM_BLAST,Anti-Material Blast: Custom formula for success chance
--> RL_SLUGSHOT,Slug Shot: Custom formula for damage (I saw someone's screenshot, bullet with 120 weight can deals 100k damage)
--> RL_HAMMER_OF_GOD,Hammer of God: If there is no enemy with SC_C_MARKER around the area, the skill Hammer of God animation won't displayed (maybe I missed something? I guess so)
(I guess some lines and algorithm should be cleaner, cooler, and sexier. :P)

IMPORTANT for client side:
- You should have up-to-date grf files
- I used original lua files, I didn't use translated lua files that exist nowadays because I think they need to update their supports for Rebellion
- Some items for Rebellion Skill's requirement(s) aren't added yet

Signed-off-by: Cahyadi Ramadhan Togihon <house.bad@gmail.com>

Cahyadi Ramadhan Togihon 11 lat temu
rodzic
commit
507f047cfb
14 zmienionych plików z 882 dodań i 203 usunięć
  1. 10 1
      db/const.txt
  2. 47 1
      db/re/skill_cast_db.txt
  3. 25 25
      db/re/skill_db.txt
  4. 123 23
      db/re/skill_require_db.txt
  5. 1 0
      db/re/skill_unit_db.txt
  6. 92 12
      src/map/battle.c
  7. 9 0
      src/map/map.c
  8. 26 8
      src/map/pc.c
  9. 7 0
      src/map/pc.h
  10. 381 105
      src/map/skill.c
  11. 2 1
      src/map/skill.h
  12. 134 19
      src/map/status.c
  13. 20 7
      src/map/status.h
  14. 5 1
      src/map/unit.c

+ 10 - 1
db/const.txt

@@ -1331,7 +1331,16 @@ SC_ILLUSIONDOPING 568
 SC_FLASHCOMBO 569
 SC_MOONSTAR  570
 SC_SUPER_STAR  571
-SC_EXTREMITYFIST2	572
+SC_HEAT_BARREL	572
+SC_HEAT_BARREL_AFTER	573
+SC_P_ALTER	574
+SC_E_CHAIN	575
+SC_C_MARKER	576
+SC_ANTI_M_BLAST	577
+SC_B_TRAP	578
+SC_H_MINE	579
+SC_QD_SHOT_READY	580
+SC_EXTREMITYFIST2	581
 
 e_gasp	0
 e_what	1

+ 47 - 1
db/re/skill_cast_db.txt

@@ -1662,8 +1662,54 @@
 //==========================================
 
 //===== Rebellion ==========================
+//-- RL_GLITTERING_GREED
+//2551,0,0,0,0,0,0,-1
+//-- RL_RICHS_COIN
+2552,0,1000,0,600000,0,0,-1
+//-- RL_MASS_SPIRAL
+2553,0,1000,0,0,30000,1000,-1
+//-- RL_BANISHING_BUSTER
+2554,0,1000,0,0,0,1500,-1
 //-- RL_B_TRAP
-2555,0,0,0,10000:11000:12000:13000:14000,0,0,-1
+2555,0,0,0,10000:11000:12000:13000:14000,0,2000,-1
+//-- RL_FLICKER
+2556,0,500,0,0,0,2000,-1
+//-- RL_S_STORM
+2557,0,1000,0,0,0,1500,-1
+//-- RL_E_CHAIN
+2558,0,500,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,0,5000,-1
+//-- RL_QD_SHOT
+2559,0,1000,0,1500,0,5000,-1
+//-- RL_C_MARKER
+2560,0,0,0,30000,0,1000,-1
+//-- RL_FIREDANCE
+2561,0,1500,0,0,0,5000,-1
+//-- RL_H_MINE
+2562,0,1500,0,30000,15000,2000,-1
+//-- RL_P_ALTER
+2563,0,1000,0,60000,0,5000,-1
+//-- RL_FALLEN_ANGEL
+2564,0,1500,0,0,0,4500:4000:3500:2500:2000,-1
+//-- RL_R_TRIP
+2565,0,1500,0,0,0,3000,-1
+//-- RL_D_TAIL
+2566,0,1500,0,0,0,5000,-1
+//-- RL_FIRE_RAIN
+2567,0,1500,0,100,0,5000,-1
+//-- RL_HEAT_BARREL
+2568,0,1000,0,60000,10000,10000,-1
+//-- RL_AM_BLAST
+2569,0,1500,0,0,12000:14000:16000:18000:20000,3000,-1
+//-- RL_SLUGSHOT
+2570,0,1000,0,0,10000,1500,-1
+//-- RL_HAMMER_OF_GOD
+2571,0,1000,0,0,3000:3000:4000:4000:5000,3000,-1
+//-- RL_R_TRIP_PLUSATK
+//2572,0,0,0,0,0,0,-1
+//-- RL_B_FLICKER_ATK
+//2573,0,0,0,0,0,0,-1
+//-- RL_GLITTERING_GREED_ATK
+//2574,0,0,0,0,0,0,-1
 //==========================================
 
 //==== Kagerou & Oboro skills ==============

+ 25 - 25
db/re/skill_db.txt

@@ -1,4 +1,4 @@
-//id,range,hit,inf,element,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count,name,description
+//id,range,hit,inf,element,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count,inf3,name,description
 // 01 ID
 // 02 range (combo skills do not check for range when used,
 //           if range is < 5, the skill is considered melee-range)
@@ -1229,30 +1229,30 @@
 
 //****
 // Rebellion
-2551,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0,	RL_GLITTERING_GREED,Flip The Coin Greed
-2552,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0,	RL_RICHS_COIN,Rich's Coin
-2553,15,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_MASS_SPIRAL,Mass Spiral
-2554,9,6,1,-1,0x2,2,5,1,no,0,0,0,weapon,0,0,	RL_BANISHING_BUSTER,Banishing Buster
-2555,0,6,4,0,0x1,0,5,1,no,0,0,3,none,0,0,	RL_B_TRAP,Bind Trap
-2556,0,6,4,0,0x3,-1,1,1,no,0,0,0,none,0,0,	RL_FLICKER,Flicker
-2557,9,6,1,-1,0x2,2,5,1,no,0,0,0,weapon,0,0,	RL_S_STORM,Shatter Storm
-2558,0,6,4,0,0x1,0,10,1,no,0,0,0,none,0,0,	RL_E_CHAIN,Eternal Chain
-2559,0,6,4,-1,0,0,1,1,no,0,0x200,0,weapon,0,0,	RL_QD_SHOT,Quick Draw Shot
-2560,11,6,1,0,0x1,0,1,1,no,0,0,3,none,0,0,	RL_C_MARKER,Crimson Marker
-2561,0,6,4,-1,0x2,2,5,1,no,0,0,0,weapon,0,0,	RL_FIREDANCE,Fire Dance
-2562,7:8:9:10:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_H_MINE,Howling Mine
-2563,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0,	RL_P_ALTER,Platinum Alter
-2564,9,6,2,0,0x1,0,5,1,no,0,0,0,none,0,0,	RL_FALLEN_ANGEL,Fallen Angel
-2565,0,6,4,-1,0x2,2:3:4:5:6,5,1,no,0,0,0,weapon,3,0,	RL_R_TRIP,Round Trip
-2566,0,6,4,-1,0x2,-1,5,1,no,0,0,0,weapon,0,0,	RL_D_TAIL,Dragon Tail
-2567,3,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_FIRE_RAIN,Fire Rain
-2568,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0,	RL_HEAT_BARREL,Heat Barrel
-2569,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_AM_BLAST,Anti-Material Blast
-2570,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,6,0,	RL_SLUGSHOT,Slug Shot
-2571,7:8:9:10:11,6,1,-1,0x2,2,5,1,no,0,0,0,weapon,0,0,	RL_HAMMER_OF_GOD,Hammer of God
-2572,0,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0,	RL_R_TRIP_PLUSATK,Round Trip Plus Attack
-2573,0,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_B_FLICKER_ATK,Bind Flicker Attack
-2574,0,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0,	RL_GLITTERING_GREED_ATK,Flip The Coin Greed Attack
+//2551,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0,	RL_GLITTERING_GREED,Flip The Coin Greed
+2552,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0,	RL_RICHS_COIN,Rich's Coin
+2553,15,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_MASS_SPIRAL,Mass Spiral
+2554,9,6,1,-1,0x2,2,5,1,no,0,0,0,weapon,0,0x0,	RL_BANISHING_BUSTER,Banishing Buster
+2555,3,6,2,0,0x1,1,5,1,no,0,0,1,misc,0,0x0,	RL_B_TRAP,Bind Trap
+2556,0,6,4,0,0x3,-1,1,1,no,0,0,0,none,0,0x0,	RL_FLICKER,Flicker
+2557,9,6,1,-1,0x2,2,5,1,no,0,0,0,weapon,0,0x0,	RL_S_STORM,Shatter Storm
+2558,0,6,4,0,0x1,0,10,1,no,0,0,0,none,0,0x0,	RL_E_CHAIN,Eternal Chain
+2559,-9,6,4,-1,0x3,21,1,1,no,0,0x0,0,weapon,0,0x0,	RL_QD_SHOT,Quick Draw Shot
+2560,11,6,1,0,0x1,0,1,1,no,0,0,3,none,0,0x0,	RL_C_MARKER,Crimson Marker
+2561,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0,	RL_FIREDANCE,Fire Dance
+2562,7:8:9:10:11,6,1,-1,0x2,2,5,1,no,0,0,0,weapon,0,0x0,	RL_H_MINE,Howling Mine
+2563,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0,	RL_P_ALTER,Platinum Alter
+2564,9,6,2,0,0x1,0,5,1,no,0,0,0,none,0,0x0,	RL_FALLEN_ANGEL,Fallen Angel
+2565,0,6,4,-1,0x2,2:2:2:2:3,5,1,no,0,0,0,weapon,3,0x0,	RL_R_TRIP,Round Trip
+2566,0,6,4,-1,0x3,-1,5,1,no,0,0,0,weapon,0,0x0,	RL_D_TAIL,Dragon Tail
+2567,3,6,1,-1,0x2,5,5,1,no,0,0,0,weapon,0,0,	RL_FIRE_RAIN,Fire Rain
+2568,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0,	RL_HEAT_BARREL,Heat Barrel
+2569,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_AM_BLAST,Anti-Material Blast
+2570,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_SLUGSHOT,Slug Shot
+2571,7:8:9:10:11,6,2,-1,0x2,2,5,1,no,0,0,0,weapon,0,0x0,	RL_HAMMER_OF_GOD,Hammer of God
+//2572,0,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0,	RL_R_TRIP_PLUSATK,Round Trip Plus Attack
+//2573,0,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_B_FLICKER_ATK,Bind Flicker Attack
+//2574,0,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0,	RL_GLITTERING_GREED_ATK,Flip The Coin Greed Attack
 
 //****
 // Kagerou & Oboro

+ 123 - 23
db/re/skill_require_db.txt

@@ -27,11 +27,15 @@
 //  Usage for multiple status requirements: SC_STATUS1:SC_STATUS2:SC_STATUS3 (max. is MAX_SKILL_STATUS_REQUIRE)
 //  Use any number or SC_ALL will disable status requirements
 
+//****
+// SM Swordman
 5,0,0,8:8:8:8:8:15:15:15:15:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SM_BASH#バッシュ#
 6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SM_PROVOKE#プロボック#
 7,20:20:19:19:18:18:17:17:16:16,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SM_MAGNUM#マグナムブレイク#
 8,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SM_ENDURE#インデュア#
 
+//****
+// MG Mage
 10,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MG_SIGHT#サイト#
 11,0,0,9:9:9:12:12:12:15:15:15:18,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MG_NAPALMBEAT#ナパ?ムビ?ト#
 12,0,0,30:30:30:35:35:35:40:40:40:40,0,0,0,99,0,0,none,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MG_SAFETYWALL#セイフティウォ?ル#
@@ -45,6 +49,8 @@
 20,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MG_LIGHTNINGBOLT#ライトニングボルト#
 21,0,0,29:34:39:44:49:54:59:64:69:74,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MG_THUNDERSTORM#サンダ?スト?ム#
 
+//****
+// AL Acolyte
 24,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AL_RUWACH#ルアフ#
 25,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AL_PNEUMA#ニュ?マ#
 26,0,0,10:9,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AL_TELEPORT#テレポ?ト#
@@ -58,20 +64,29 @@
 34,0,0,28:32:36:40:44:48:52:56:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AL_BLESSING#ブレッシング#
 35,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AL_CURE#キュア?#
 
+//****
+// MC Merchant
 40,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MC_IDENTIFY#アイテム鑑定#
 41,0,0,30,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MC_VENDING#露店開設#
 42,0,0,5,0,0,100:200:300:400:500:600:700:800:900:1000,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MC_MAMMONITE#メマ?ナイト#
 
+//****
+// AC Archer
 45,0,0,25:30:35:40:45:50:55:60:65:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AC_CONCENTRATION#集中力向上#
 46,0,0,12,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AC_DOUBLE#ダブルストレイフィング#
 47,0,0,15,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AC_SHOWER#アロ?シャワ?#
 
+//****
+// TF Thief
 50,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TF_STEAL#スティ?ル#
 51,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TF_HIDING#ハイディング#
 52,0,0,12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TF_POISON#インベナム#
 53,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TF_DETOXIFY#解毒#
+
 54,0,0,60,0,0,0,99,0,0,none,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ALL_RESURRECTION#リザレクション#
 
+//****
+// KN Knight
 56,0,0,7,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_PIERCE#ピア?ス#
 57,0,0,12,0,0,0,4:5,0,0,riding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_BRANDISHSPEAR#ブランディッシュスピア#
 58,0,0,9,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_SPEARSTAB#スピアスタブ#
@@ -80,6 +95,8 @@
 61,0,0,3,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_AUTOCOUNTER#オ?トカウンタ?#
 62,0,0,13:14:15:16:17:18:19:20:21:22,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KN_BOWLINGBASH#ボウリングバッシュ#
 
+//****
+// PR Priest
 66,0,0,13:16:19:22:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PR_IMPOSITIO#イムポシティオマヌス#
 67,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PR_SUFFRAGIUM#サフラギウム#
 68,0,0,14:18:22:26:30,0,0,0,99,0,0,none,0,0,523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PR_ASPERSIO#アスペルシオ#
@@ -94,6 +111,9 @@
 77,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PR_TURNUNDEAD#タ?ンアンデッド#
 78,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PR_LEXAETERNA#レックスエ?テルナ#
 79,0,0,40:42:44:46:48:50:52:54:56:58,0,0,0,99,0,0,none,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PR_MAGNUS#マグヌスエクソシズム#
+
+//****
+// WZ Wizard
 80,0,0,75,0,0,0,99,0,0,none,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WZ_FIREPILLAR#ファイア?ピラ?#
 81,0,0,35:37:39:41:43:45:47:49:51:53,0,0,0,99,0,0,none,SC_SIGHT,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WZ_SIGHTRASHER#サイトラッシャ?#
 83,0,0,20:24:30:34:40:44:50:54:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WZ_METEOR#メテオスト?ム#
@@ -108,6 +128,9 @@
 92,0,0,5:10:15:20:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WZ_QUAGMIRE#クァグマイア#
 93,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WZ_ESTIMATION#モンスタ?情報#
 
+
+//****
+// BS Blacksmith
 108,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BS_REPAIRWEAPON#武器修理#
 
 110,0,0,10,0,0,0,1:2:6:7:8,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BS_HAMMERFALL#ハンマ?フォ?ル#
@@ -115,6 +138,9 @@
 112,0,0,18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BS_WEAPONPERFECT#ウェポンパ?フェクション#
 113,0,0,18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BS_OVERTHRUST#オ?バ?トラスト#
 114,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BS_MAXIMIZE#マキシマイズパワ?#
+
+//****
+// HT Hunter
 115,0,0,10,0,0,0,99,0,0,none,0,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HT_SKIDTRAP#スキッドトラップ#
 116,0,0,10,0,0,0,99,0,0,none,0,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HT_LANDMINE#ランドマイン#
 117,0,0,12,0,0,0,99,0,0,none,0,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HT_ANKLESNARE#アンクルスネア#
@@ -131,6 +157,8 @@
 130,0,0,8,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HT_DETECTING#ディテクティング#
 131,0,0,10,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HT_SPRINGTRAP#スプリングトラップ#
 
+//****
+// AS Assassin
 135,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AS_CLOAKING#クロ?キング#
 136,0,0,16:18:20:22:24:26:28:30:32:34,0,0,0,16,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AS_SONICBLOW#ソニックブロ?#
 137,0,0,3,0,0,0,16,0,0,none,SC_HIDING,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AS_GRIMTOOTH#グリムトゥ?ス#
@@ -138,6 +166,10 @@
 139,0,0,25:30:35:40:45:50:55:60:45:45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AS_POISONREACT#ポイズンリアクト#
 140,0,0,20,0,0,0,99,0,0,none,0,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AS_VENOMDUST#ベナムダスト#
 141,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AS_SPLASHER#ベナムスプラッシャ?#
+
+
+//****
+// 1st Class Quest Skills
 142,0,0,3,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NV_FIRSTAID#?急手?#
 143,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NV_TRICKDEAD#死んだふり#
 
@@ -154,6 +186,8 @@
 156,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AL_HOLYLIGHT#ホ?リ?ライト#
 157,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MG_ENERGYCOAT#エナジ?コ?ト#
 
+//****
+// RG Rogue
 211,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RG_STEALCOIN#スティ?ルコイン#
 212,0,0,16,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RG_BACKSTAP#バックスタブ#
 
@@ -167,6 +201,8 @@
 221,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RG_FLAGGRAFFITI#フラッググラフィティ#
 222,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RG_CLEANER#クリ?ナ?#
 
+//****
+// AM Alchemist
 228,0,0,5,0,0,0,99,0,0,none,0,0,7134,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_PHARMACY#ファ?マシ?#
 229,0,0,10,0,0,0,99,0,0,none,0,0,7135,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_DEMONSTRATION#デモンストレ?ション#
 230,0,0,15,0,0,0,99,0,0,none,0,0,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_ACIDTERROR#アシッドテラ?#
@@ -182,6 +218,8 @@
 244,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_REST
 247,0,0,74:68:62:56:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_RESURRECTHOMUN
 
+//****
+// CR Crusader
 249,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_AUTOGUARD#オ?トガ?ド#
 250,0,0,10,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_SHIELDCHARGE#シ?ルドチャ?ジ#
 251,0,0,12,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_SHIELDBOOMERANG#シ?ルドブ?メラン#
@@ -193,6 +231,8 @@
 257,0,0,30,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_DEFENDER#ディフェンダ?#
 258,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_SPEARQUICKEN#スピアクイッケン#
 
+//****
+// MO Monk
 261,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MO_CALLSPIRITS#?功#
 262,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MO_ABSORBSPIRITS#?奪#
 
@@ -207,6 +247,8 @@
 272,0,0,11:12:13:14:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MO_CHAINCOMBO#連打掌#
 273,0,0,11:12:13:14:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MO_COMBOFINISH#猛龍拳#
 
+//****
+// SA Sage
 275,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SA_CASTCANCEL#キャストキャンセル#
 276,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SA_MAGICROD#マジックロッド#
 277,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SA_SPELLBREAKER#スペルブレイカ?#
@@ -237,6 +279,8 @@
 302,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SA_FULLRECOVERY#フルリカバリ?#
 303,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SA_COMA#コ?マ#
 
+//****
+// Bard & Dancer
 304,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BD_ADAPTATION#アドリブ#
 305,0,0,1,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BD_ENCORE#アンコ?ル#
 306,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BD_LULLABY#子守歌#
@@ -248,6 +292,8 @@
 312,0,0,10,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BD_INTOABYSS#深淵の中に#
 313,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BD_SIEGFRIED#不死身のジ?クフリ?ド#
 
+//****
+// BA Bard
 316,0,0,1:3:5:7:9,0,0,0,13,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BA_MUSICALSTRIKE#ミュ?ジカルストライク#
 317,0,0,18:21:24:27:30,0,0,0,13,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BA_DISSONANCE#不協和音#
 318,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BA_FROSTJOKE#寒いジョ?ク#
@@ -256,6 +302,8 @@
 321,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BA_POEMBRAGI#ブラギの詩#
 322,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BA_APPLEIDUN#イドゥンの林檎#
 
+//****
+// DC Dancer
 324,0,0,1:3:5:7:9,0,0,0,14,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//DC_THROWARROW#矢?ち#
 325,0,0,23:26:29:32:35,0,0,0,14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//DC_UGLYDANCE#自分勝手なダンス#
 326,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//DC_SCREAM#スクリ?ム#
@@ -269,43 +317,75 @@
 336,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WE_CALLPARTNER#?なたに逢いたい#
 337,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ITM_TOMAHAWK##
 
+//****
+// LK Lord Knight
 355,0,0,18:26:34:42:50,0,0,0,1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_AURABLADE#オ?ラブレ?ド#
 356,0,0,50,0,0,0,3,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_PARRYING#パリイング#
 357,0,0,14:18:22:26:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_CONCENTRATION#コンセントレ?ション#
 358,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_TENSIONRELAX#テンションリラックス#
 359,0,0,200,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_BERSERK#バ?サ?ク#
+
+//****
+// HP High Priest
 361,0,0,20:30:40:50:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HP_ASSUMPTIO#アスムプティオ#
 362,0,0,80:90:100:110:120,0,0,0,99,0,0,none,0,0,715,1,716,1,717,1,523,1,0,0,0,0,0,0,0,0,0,0,0,0,0	//HP_BASILICA#バジリカ#
 
+//****
+// HW High Wizard
 365,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HW_MAGICCRASHER#マジッククラッシャ?#
 366,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HW_MAGICPOWER#魔法力?幅#
+
+//****
+// PA Paladin
 367,0,0,30:35:40:45:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PA_PRESSURE#プレッシャ?#
 368,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PA_SACRIFICE#サクリファイス#
 369,0,0,80:80:80:80:80:100:100:100:100:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PA_GOSPEL#ゴスペル#
+
+//****
+// CH Champion
 370,0,0,2:4:6:8:10,0,0,0,99,0,0,none,SC_EXPLOSIONSPIRITS,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CH_PALMSTRIKE#猛虎硬派山#
 371,0,0,4:6:8:10:12,0,0,0,99,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CH_TIGERFIST#伏虎拳#
 372,0,0,4:6:8:10:12:14:16:18:20:22,0,0,0,99,0,0,none,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CH_CHAINCRUSH#連柱崩?#
+
+//****
+// PF Professor
 373,0,0,1:2:3:4:5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_HPCONVERSION#???????#
 374,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_SOULCHANGE#ソウルチェンジ#
 375,0,0,80:90:100:110:120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_SOULBURN#?ウルバ?ン#
 
+//****
+// ASC Assassin Cross
 378,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_EDP#エンチャントデッドリ?ポイズン#
 379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_BREAKER#ソウルブレ?カ?#
+
+//****
+// SN Sniper
 380,0,0,20:20:25:25:30:30:35:35:40:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SN_SIGHT#トゥル?サイト#
 381,0,0,30:34:38:42:46,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SN_FALCONASSAULT#ファルコンアサルト#
 382,0,0,18:21:24:27:30,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0		//SN_SHARPSHOOTING#シャ?プシュ?ティング#
 383,0,0,46:52:58:64:70:76:82:88:94:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SN_WINDWALK#ウインドウォ?ク#
+
+//****
+// WS Whitesmith
 384,0,0,50:50:60:60:70:70:80:80:90:90,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WS_MELTDOWN#メルトダウン#
 385,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WS_CREATECOIN#クリエイトコイン#
 386,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WS_CREATENUGGET#塊製造#
 387,0,0,20,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WS_CARTBOOST#カ?トブ?スト#
 388,0,0,20,0,0,0,99,0,0,none,0,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WS_SYSTEMCREATE#自動攻??置製作#
+
+//****
+// ST Stalker
 389,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ST_CHASEWALK#チェイスウォ?ク#
 390,0,0,10:15:20:25:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ST_REJECTSWORD#リジェクトソ?ド#
 
+//****
+// CG Clown & Gypsy
 394,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,13:14,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CG_ARROWVULCAN#アロ?バルカン#
 395,0,0,30:40:50:60:70,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CG_MOONLIT#月明りの泉に落ちる花びら#
 396,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CG_MARIONETTE#マリオネットコントロ?ル#
+
+//****
+// Other 2-Trans Class Skills
 397,0,0,18:21:24:27:30,0,0,0,2:3:4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_SPIRALPIERCE#スパイラルピア?ス#
 398,0,0,23,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_HEADCRUSH#ヘッドクラッシュ#
 399,0,0,12:12:14:14:16:16:18:18:20:20,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//LK_JOINTBEAT#ジョイントビ?ト#
@@ -317,9 +397,13 @@
 405,0,0,50,0,0,0,99,0,0,none,0,0,1025,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_SPIDERWEB#スパイダ?ウェッブ#
 406,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_METEORASSAULT#メテオアサルト#
 407,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_CDP#デッドリ?ポイズン作成#
+
 408,0,0,1,0,-10,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WE_BABY##
 409,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WE_CALLPARENT##
 410,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WE_CALLBABY##
+
+//****
+// TK Taekwon
 411,0,0,100:90:80:70:60:50:40:30:20:10,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TK_RUN
 412,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TK_READYSTORM
 413,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TK_STORMKICK
@@ -335,6 +419,8 @@
 425,0,0,20:20:20:20:50:50:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TK_SEVENWIND
 426,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//TK_HIGHJUMP
 
+//****
+// SG Star Gladiator
 427,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SG_FEEL
 428,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SG_SUN_WARM
 429,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SG_MOON_WARM
@@ -345,8 +431,12 @@
 434,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SG_HATE
 444,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SG_FUSION
 
+//****
+// SL Soul Linker
 445,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_ALCHEMIST
+
 446,0,0,10,0,8,0,99,0,0,none,0,0,657,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_BERSERKPITCHER#Berserk Pitcher#
+
 447,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_MONK
 448,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_STAR
 449,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_SAGE
@@ -359,7 +449,9 @@
 456,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_ROGUE
 457,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_ASSASSIN
 458,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_BLACKSMITH
+
 459,0,0,64,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//BS_ADRENALINE2#
+
 460,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_HUNTER
 461,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//SL_SOULLINKER
 462,0,0,120:110:100:90:80:70:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAIZEL#Kaizel#
@@ -380,6 +472,8 @@
 479,0,0,40,0,0,0,99,0,0,none,0,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_FULLPROTECTION##
 480,0,0,28:31:34:37:40,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PA_SHIELDCHAIN##
 
+//****
+// Other Skills
 482,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//PF_DOUBLECASTING##
 483,0,0,40,0,0,0,99,0,0,none,0,0,715,1,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HW_GANBANTEIN##
 484,0,0,20:40:60:80:100,0,0,0,99,0,0,none,0,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HW_GRAVITATION##
@@ -398,6 +492,9 @@
 497,0,0,200,0,0,0,99,0,0,none,0,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_TWILIGHT2##
 498,0,0,200,0,0,0,99,0,0,none,0,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//AM_TWILIGHT3##
 499,0,0,12,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//HT_POWER##
+
+//****
+// GS Gunslinger
 500,0,0,2,0,0,1,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GS_GLITTERING
 501,0,0,10,0,0,0,99,0,0,none,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GS_FLING
 502,0,0,20,0,0,0,99,99,1,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GS_TRIPLEACTION
@@ -417,6 +514,9 @@
 519,0,0,20:25:30:35:40:45:50:55:60:65,0,0,0,20,3,2:2:4:4:6:6:8:8:10:10,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GS_FULLBUSTER
 520,0,0,15:20:25:30:35:40:45:50:55:60,0,0,0,20:21,3,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GS_SPREADATTACK
 521,0,0,4:8:12:16:20:24:28:32:36:40,0,0,0,21,5,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GS_GROUNDDRIFT
+
+//****
+// NJ Ninja
 523,0,0,2,0,0,0,99,6,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_SYURIKEN
 524,0,0,30:25:20:15:10,0,0,0,99,7,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_KUNAI
 525,0,0,20:25:30:35:40,0,0,0,22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NJ_HUUMA
@@ -802,30 +902,30 @@
 
 //****
 // Rebellion
-2551,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_GLITTERING_GREED#Flip The Coin Greed#
-2552,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_RICHS_COIN#Rich's Coin#
-2553,0,0,80:84:88:92:96,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_MASS_SPIRAL#Mass Spiral#
-2554,0,0,55:60:65:70:75,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_BANISHING_BUSTER#Banishing Buster#
-2555,0,0,30:32:34:36:38,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_B_TRAP#Bind Trap#
+//2551,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_GLITTERING_GREED#Flip The Coin Greed#
+2552,0,0,10,0,0,100,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_RICHS_COIN#Rich's Coin#
+2553,0,0,80:84:88:92:96,0,0,0,18,3,1,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_MASS_SPIRAL#Mass Spiral#
+2554,0,0,55:60:65:70:75,0,0,0,20,3,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_BANISHING_BUSTER#Banishing Buster#
+2555,0,0,30:32:34:36:38,0,0,0,17:18:19:20:21,0,0,none,0,1,7940,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_B_TRAP#Bind Trap#
 2556,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FLICKER#Flicker#
-2557,0,0,55:60:65:70:75,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_S_STORM#Shatter Storm#
-2558,0,0,45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_E_CHAIN#Eternal Chain#
-2559,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_QD_SHOT#Quick Draw Shot#
-2560,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_C_MARKER#Crimson Marker#
-2561,0,0,10:15:20:25:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FIREDANCE#Fire Dance#
-2562,0,0,45:50:55:60:65,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_H_MINE#Howling Mine#
-2563,0,0,20:24:28:32:36,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_P_ALTER#Platinum Alter#
-2564,0,0,90,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FALLEN_ANGEL#Fallen Angel#
-2565,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_R_TRIP#Round Trip#
-2566,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_D_TAIL#Dragon Tail#
-2567,0,0,70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FIRE_RAIN#Fire Rain#
-2568,0,0,30:40:50:60:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_HEAT_BARREL#Heat Barrel#
-2569,0,0,80:84:88:92:96,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_AM_BLAST#Anti-Material Blast#
-2570,0,0,55:60:65:70:75,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_SLUGSHOT#Slug Shot#
-2571,0,0,70:80:90:100:110,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_HAMMER_OF_GOD#Hammer of God#
-2572,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_R_TRIP_PLUSATK#Round Trip Plus Attack#
-2573,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_B_FLICKER_ATK#Bind Flicker Attack#
-2574,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_GLITTERING_GREED_ATK#Flip The Coin Greed Attack#
+2557,0,0,55:60:65:70:75,0,0,0,20,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_S_STORM#Shatter Storm#
+2558,0,0,45,0,0,0,17:18:19:20:21,0,0,none,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_E_CHAIN#Eternal Chain#
+2559,0,0,5,0,0,0,17:18:19:20:21,3:4:5,0,none,SC_QD_SHOT_READY,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_QD_SHOT#Quick Draw Shot#
+2560,0,0,10,0,0,0,17:18:19:20:21,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_C_MARKER#Crimson Marker#
+2561,0,0,10:15:20:25:30,0,0,0,17,3,5,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FIREDANCE#Fire Dance#
+2562,0,0,45:50:55:60:65,0,0,0,21,5,0,none,0,0,7940,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_H_MINE#Howling Mine#
+2563,0,0,20:24:28:32:36,0,0,0,99,3,0,none,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13201	//RL_P_ALTER#Platinum Alter#
+2564,0,0,90,0,0,0,17,3,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FALLEN_ANGEL#Fallen Angel#
+2565,0,0,40:45:50:55:60,0,0,0,19,3,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_R_TRIP#Round Trip#
+2566,0,0,60:70:80:90:100,0,0,0,21,5,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_D_TAIL#Dragon Tail#
+2567,0,0,70,0,0,0,19,3,10,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_FIRE_RAIN#Fire Rain#
+2568,0,0,30:40:50:60:70,0,0,0,99,0,0,none,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_HEAT_BARREL#Heat Barrel#
+2569,0,0,80:84:88:92:96,0,0,0,17:18:19:20:21,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_AM_BLAST#Anti-Material Blast#
+2570,0,0,55:60:65:70:75,0,0,0,20,3,1,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_SLUGSHOT#Slug Shot#
+2571,0,0,70:80:90:100:110,0,0,0,18,3,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_HAMMER_OF_GOD#Hammer of God#
+//2572,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_R_TRIP_PLUSATK#Round Trip Plus Attack#
+//2573,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_B_FLICKER_ATK#Bind Flicker Attack#
+//2574,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RL_GLITTERING_GREED_ATK#Flip The Coin Greed Attack#
 
 //****
 // Kagerou/Oboro

+ 1 - 0
db/re/skill_unit_db.txt

@@ -156,6 +156,7 @@
 2490,0xea,    ,  0, 1,1000,enemy, 0x002	//GN_HELLS_PLANT
 
 2555,0x104,   ,  0, 1:2:2:3:3,500,enemy,0x006	//RL_B_TRAP
+2567,0x105,   ,  2, 2,1000,enemy, 0x0	//RL_FIRE_RAIN
 
 3006,0x86,    ,  0, 2,1000,enemy, 0x018	//KO_BAKURETSU
 3008,0x86,    ,  0, 2,1000,enemy, 0x018	//KO_MUCHANAGE

+ 92 - 12
src/map/battle.c

@@ -401,6 +401,9 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
 			if( tsc->data[SC_WIND_INSIGNIA]) ratio += 150;
 			status_change_end(target, SC_MAGNETICFIELD, INVALID_TIMER); //freed if received earth dmg
 			break;
+		case ELE_NEUTRAL:
+			if( tsc->data[SC_ANTI_M_BLAST] ) ratio += tsc->data[SC_ANTI_M_BLAST]->val2;
+			break;
 		}
 	} //end tsc check
 	if (src && src->type == BL_PC) {
@@ -2017,7 +2020,7 @@ static bool is_attack_critical(struct Damage wd, struct block_list *src, struct
  */
 static int is_attack_piercing(struct Damage wd, struct block_list *src, struct block_list *target, int skill_id, int skill_lv, short weapon_position)
 {
-	if (skill_id == MO_INVESTIGATE)
+	if (skill_id == MO_INVESTIGATE || skill_id == RL_MASS_SPIRAL)
 		return 2;
 
 	if(src != NULL) {
@@ -2180,7 +2183,10 @@ static bool is_attack_hitting(struct Damage wd, struct block_list *src, struct b
 		case GC_VENOMPRESSURE:
 			hitrate += 10 + 4 * skill_lv;
 			break;
-
+		case RL_SLUGSHOT:
+			if (distance_bl(src,target) > 3)
+				hitrate -= (10 - (skill_lv - 1));
+			break;
 	}
 	else if( sd && wd.type&0x08 && wd.div_ == 2 ) // +1 hit per level of Double Attack on a successful double attack (making sure other multi attack skills do not trigger this) [helvetica]
 		hitrate += pc_checkskill(sd,TF_DOUBLE);
@@ -2347,6 +2353,10 @@ static int battle_get_weapon_element(struct Damage wd, struct block_list *src, s
 			if (!sd)
 				element = ELE_NEUTRAL; //forced neutral for monsters
 			break;
+		case RL_H_MINE:
+			if (sd && sd->skill_id_old == RL_FLICKER) //Force RL_H_MINE deals fire damage if ativated by RL_FLICKER
+				element = ELE_FIRE;
+			break;
 		case KO_KAIHOU:
 			if( sd ){
 				ARR_FIND(1, 6, i, sd->talisman[i] > 0);
@@ -2779,10 +2789,13 @@ static struct Damage battle_calc_multi_attack(struct Damage wd, struct block_lis
 				wd.type = 0x08;
 			}
 		}
-		else if( sd->weapontype1 == W_REVOLVER && (skill_lv = pc_checkskill(sd,GS_CHAINACTION)) > 0 && rnd()%100 < 5*skill_lv )
+		else if( ((sd->weapontype1 == W_REVOLVER && (skill_lv = pc_checkskill(sd,GS_CHAINACTION)) > 0) //Normal Chain Action effect
+			|| (sd && sc->count && sc->data[SC_E_CHAIN] && (skill_lv = sc->data[SC_E_CHAIN]->val2) > 0)) //Chain Action of ETERNAL_CHAIN
+			&& rnd()%100 < 5*skill_lv ) //Sucess rate
 		{
 			wd.div_ = skill_get_num(GS_CHAINACTION,skill_lv);
 			wd.type = 0x08;
+			sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1));
 		}
 		else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW
 			&& (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->status.inventory[i].amount > 1)
@@ -3232,8 +3245,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 			RE_LVL_DMOD(150); // Base level bonus.
 			break;
 		/**
-			* GC Guilotine Cross
-			**/
+		 * GC Guilotine Cross
+		 **/
 		case GC_CROSSIMPACT:
 			skillratio += 900 + 100 * skill_lv;
 			RE_LVL_DMOD(120);
@@ -3628,6 +3641,58 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 			skillratio += -100 + 100 * skill_lv + 3 * status_get_lv(src);
 			skillratio = (skillratio * status_get_lv(src)) / 120;
 			break;
+		/**
+		 * Rebellion
+		 **/
+		case RL_MASS_SPIRAL:
+			skillratio += -100 + (200 * skill_lv);
+			break;
+		case RL_FIREDANCE:
+			skillratio += -100 + (100 * skill_lv);
+			skillratio += (skillratio * status_get_lv(src)) / 300; //(custom)
+			break;
+		case RL_BANISHING_BUSTER:
+			skillratio += -100 + (400 * skill_lv); //(custom)
+			break;
+		case RL_S_STORM:
+			skillratio += -100 + (200 * skill_lv); //(custom)
+			break;
+		case RL_SLUGSHOT:
+			{
+				uint16 w = 50;
+				if (sd->equip_index[EQI_AMMO] > 0) {
+					uint16 idx = sd->equip_index[EQI_AMMO];
+					struct item_data *id = NULL;
+					if (id = itemdb_exists(sd->status.inventory[idx].nameid))
+						w = id->weight;
+				}
+				w /= 10;
+				skillratio += -100 + (max(w,1) * skill_lv * 30); //(custom)
+			}
+			break;
+		case RL_D_TAIL:
+			skillratio += -100 + (2500 + 500 * skill_lv );
+			if (sd && &sd->c_marker)
+				skillratio /= max(sd->c_marker.count,1);
+			break;
+		case RL_R_TRIP:
+			skillratio += -100 + (150 * skill_lv); //(custom)
+			break;
+		case RL_H_MINE:
+			skillratio += 100 + (200 * skill_lv);
+			//If damaged by Flicker
+			if (sd && sd->skill_id_old == RL_FLICKER && tsc && tsc->data[SC_H_MINE] && tsc->data[SC_H_MINE]->val2 == src->id)
+				skillratio += 400 + (300 * skill_lv);
+			break;
+		case RL_HAMMER_OF_GOD:
+			skillratio += -100 + (2000 + (skill_lv - 1) * 500);
+			break;
+		case RL_QD_SHOT:
+			skillratio += -100 + (max(pc_checkskill(sd,GS_CHAINACTION),1) * status_get_dex(src) / 5); //(custom)
+			break;
+		case RL_FIRE_RAIN:
+			skillratio += -100 + 500 + (200 * (skill_lv - 1)) + status_get_dex(src); //(custom)
+			break;
 	}
 	return skillratio;
 }
@@ -3823,6 +3888,14 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, u
 				ATK_ADD(wd.damage, wd.damage2, sc->data[SC_FLASHCOMBO]->val2);
 				RE_ALLATK_ADD(wd, sc->data[SC_FLASHCOMBO]->val2);
 			}
+			if(sc->data[SC_HEAT_BARREL]) {
+				ATK_ADD(wd.damage, wd.damage2, sc->data[SC_HEAT_BARREL]->val2);
+				RE_ALLATK_ADD(wd, sc->data[SC_HEAT_BARREL]->val2);
+			}
+			if(sc->data[SC_P_ALTER]) {
+				ATK_ADD(wd.damage, wd.damage2, sc->data[SC_P_ALTER]->val2);
+				RE_ALLATK_ADD(wd, sc->data[SC_P_ALTER]->val2);
+			}
 		}
 	return wd;
 }
@@ -3907,12 +3980,16 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
 #else
 		vit_def = def2;
 #endif
-		if((battle_check_undead(sstatus->race,sstatus->def_ele) || sstatus->race==RC_DEMON) && //This bonus already doesnt work vs players
-			src->type == BL_MOB && (skill=pc_checkskill(tsd,AL_DP)) > 0)
+		if( src->type == BL_MOB && (battle_check_undead(sstatus->race,sstatus->def_ele) || sstatus->race==RC_DEMON) && //This bonus already doesnt work vs players
+			(skill=pc_checkskill(tsd,AL_DP)) > 0 )
 			vit_def += skill*(int)(3 +(tsd->status.base_level+1)*0.04);   // submitted by orn
 		if( src->type == BL_MOB && (skill=pc_checkskill(tsd,RA_RANGERMAIN))>0 &&
 			(sstatus->race == RC_BRUTE || sstatus->race == RC_FISH || sstatus->race == RC_PLANT) )
 			vit_def += skill*5;
+		if( src->type == BL_MOB && //Only affected from mob
+			tsc && tsc->count && tsc->data[SC_P_ALTER] && //If the Platinum Alter is activated
+			(battle_check_undead(sstatus->race,sstatus->def_ele) || sstatus->race==RC_UNDEAD) )	//Undead attacker
+			vit_def += tsc->data[SC_P_ALTER]->val3;
 	}
 	else { //Mob-Pet vit-eq
 #ifndef RENEWAL
@@ -3926,7 +4003,6 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
 #endif
 	}
 
-
 	if (battle_config.weapon_defense_type) {
 		vit_def += def1*battle_config.weapon_defense_type;
 		def1 = 0;
@@ -3941,8 +4017,8 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
 	if( def1 == -400 ) /* being hit by a gazillion units, -400 creates a division by 0 and subsequently crashes */
 		def1 = -399;
 	ATK_ADD2(wd.damage, wd.damage2,
-		is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ?(def1/2):0,
-		is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L)?(def1/2):0
+		is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ? (def1/2) : 0,
+		is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ? (def1/2) : 0
 	);
 	if( !attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_R) && !is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) )
 		wd.damage = wd.damage * (4000+def1) / (4000+10*def1) - vit_def;
@@ -3953,11 +4029,11 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
 		if (def1 > 100) def1 = 100;
 		ATK_RATE2(wd.damage, wd.damage2,
 			attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ?100:(is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ? (int64)is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R)*(def1+vit_def) : (100-def1)),
-			attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L)?100:(is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L)? (int64)is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L)*(def1+vit_def) : (100-def1))
+			attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ?100:(is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ? (int64)is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L)*(def1+vit_def) : (100-def1))
 		);
 		ATK_ADD2(wd.damage, wd.damage2,
 			attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_R) || is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ?0:-vit_def,
-			attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L) || is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L)?0:-vit_def
+			attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L) || is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ?0:-vit_def
 		);
 #endif
 	return wd;
@@ -5628,6 +5704,9 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
 	case KO_MAKIBISHI:
 		md.damage = 20 * skill_lv;
 		break;
+	case RL_B_TRAP:
+		md.damage = (200 + status_get_int(src) + status_get_dex(src)) * skill_lv * 10; //(custom)
+		break;
 	}
 
 	if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets
@@ -6472,6 +6551,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 					case SR_RAMPAGEBLASTER:
 					case NC_COLDSLOWER:
 					case NC_SELFDESTRUCTION:
+					case RL_FIRE_RAIN:
 #ifdef RENEWAL
 					case KN_BOWLINGBASH:
 					case KN_SPEARSTAB:

+ 9 - 0
src/map/map.c

@@ -1662,6 +1662,7 @@ int map_quit(struct map_session_data *sd) {
 		status_change_end(&sd->bl, SC_WEIGHT90, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_SATURDAYNIGHTFEVER, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_KYOUGAKU, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_C_MARKER, INVALID_TIMER);
 		if (battle_config.debuff_on_logout&1) {
 			status_change_end(&sd->bl, SC_ORCISH, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_STRIPWEAPON, INVALID_TIMER);
@@ -1677,6 +1678,10 @@ int map_quit(struct map_session_data *sd) {
 			// Both these statuses are removed on logout. [L0ne_W0lf]
 			status_change_end(&sd->bl, SC_SLOWCAST, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_CRITICALWOUND, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_HEAT_BARREL_AFTER, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_H_MINE, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_ANTI_M_BLAST, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_B_TRAP, INVALID_TIMER);
 		}
 		if (battle_config.debuff_on_logout&2) {
 			status_change_end(&sd->bl, SC_MAXIMIZEPOWER, INVALID_TIMER);
@@ -1685,6 +1690,9 @@ int map_quit(struct map_session_data *sd) {
 			status_change_end(&sd->bl, SC_PRESERVE, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_KAAHI, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_SPIRIT, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_HEAT_BARREL, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_P_ALTER, INVALID_TIMER);
+			status_change_end(&sd->bl, SC_E_CHAIN, INVALID_TIMER);
 		}
 	}
 
@@ -1735,6 +1743,7 @@ int map_quit(struct map_session_data *sd) {
 	party_booking_delete(sd); // Party Booking [Spiria]
 	pc_makesavestatus(sd);
 	pc_clean_skilltree(sd);
+	pc_crimson_marker_clear(sd);
 	chrif_save(sd,1);
 	unit_free_pc(sd);
 	return 0;

+ 26 - 8
src/map/pc.c

@@ -4348,8 +4348,8 @@ int pc_isUseitem(struct map_session_data *sd,int n)
 		sd->sc.data[SC__INVISIBILITY] ||
 		sd->sc.data[SC__MANHOLE] ||
 		sd->sc.data[SC_KAGEHUMI] ||
-		(sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOITEM)
-	    ))
+		(sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOITEM) ||
+		sd->sc.data[SC_HEAT_BARREL_AFTER]))
 		return 0;
 	
 	if (!pc_isItemClass(sd,item))
@@ -8655,7 +8655,11 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
 		return 0;
 	}
 
-	if( sd->sc.count && sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON ) {
+	if( sd->sc.count && (
+		(sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON) ||
+		sd->sc.data[SC_BERSERK] || 
+		sd->sc.data[SC_SATURDAYNIGHTFEVER]) )
+	{
 		clif_equipitemack(sd,0,0,0);
 		return 0;
 	}
@@ -8677,11 +8681,6 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
 		return 0;
 	}
 
-	if (sd->sc.data[SC_BERSERK] || sd->sc.data[SC_SATURDAYNIGHTFEVER]) {
-		clif_equipitemack(sd,n,0,0);	// fail
-		return 0;
-	}
-
 	if(pos == EQP_ACC) { //Accesories should only go in one of the two,
 		pos = req_pos&EQP_ACC;
 		if (pos == EQP_ACC) //User specified both slots..
@@ -8879,6 +8878,12 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
 		clif_unequipitemack(sd,n,0,0);
 		return 0;
 	}
+	if (&sd->sc) {
+		if (sd->sc.data[SC_HEAT_BARREL])
+			status_change_end(&sd->bl,SC_HEAT_BARREL,INVALID_TIMER);
+		if (sd->sc.data[SC_P_ALTER] && (sd->inventory_data[n]->type == IT_WEAPON || sd->inventory_data[n]->type == IT_AMMO))
+			status_change_end(&sd->bl,SC_P_ALTER,INVALID_TIMER);
+	}
 
 	if(battle_config.battle_log)
 		ShowInfo("unequip %d %x:%x\n",n,pc_equippoint(sd,n),sd->status.inventory[n].equip);
@@ -10287,6 +10292,19 @@ void pc_damage_log_clear(struct map_session_data *sd, int id)
 	}
 }
 
+void pc_crimson_marker_clear(struct map_session_data *sd) {
+	uint8 i;
+
+	if (!sd || !(&sd->c_marker) || !sd->c_marker.target)
+		return;
+
+	for (i = 0; i < MAX_SKILL_CRIMSON_MARKER; i++) {
+		struct block_list *bl = NULL;
+		if (sd->c_marker.target[i] && (bl = map_id2bl(sd->c_marker.target[i])))
+			status_change_end(bl,SC_C_MARKER,INVALID_TIMER);
+	}
+}
+
 /*==========================================
  * pc Init/Terminate
  *------------------------------------------*/

+ 7 - 0
src/map/pc.h

@@ -545,6 +545,11 @@ struct map_session_data {
 		int id;
 	} dmglog[DAMAGELOG_SIZE_PC];
 
+	struct s_crimson_marker {
+		int target[MAX_SKILL_CRIMSON_MARKER]; //Target id storage
+		uint8 count; //Count of target for skill like RL_D_TAIL
+	} c_marker;
+	bool flicker;
 };
 
 
@@ -1012,6 +1017,8 @@ void pc_baselevelchanged(struct map_session_data *sd);
 void pc_damage_log_add(struct map_session_data *sd, int id);
 void pc_damage_log_clear(struct map_session_data *sd, int id);
 
+void pc_crimson_marker_clear(struct map_session_data *sd);
+
 #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP)
 int pc_level_penalty_mod(struct map_session_data *sd, int mob_level, uint32 mob_race, uint32 mob_mode, int type);
 #endif

+ 381 - 105
src/map/skill.c

@@ -267,6 +267,7 @@ int skill_get_cooldown_(struct map_session_data *sd, int id, int lv) {
 }
 
 int skill_frostjoke_scream(struct block_list *bl,va_list ap);
+int skill_check_target_c_marker(struct block_list *bl,va_list ap);
 int skill_attack_area(struct block_list *bl,va_list ap);
 struct skill_unit_group *skill_locate_element_field(struct block_list *bl); // [Skotlex]
 int skill_graffitiremover(struct block_list *bl, va_list ap); // [Valaris]
@@ -929,8 +930,8 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 						sc_start4(src,bl,SC_DPOISON,sce->val2, sce->val1,src->id,0,0,
 							skill_get_time2(ASC_EDP,sce->val1));
 				}
-		}
-		break;
+			}
+			break;
 
 	case SM_BASH:
 		if( sd && skill_lv > 5 && pc_checkskill(sd,SM_FATALBLOW)>0 ){
@@ -1494,6 +1495,63 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 		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));
 		break;
+
+	case RL_MASS_SPIRAL:
+		sc_start(src,bl,SC_BLEEDING,10 * skill_lv + rnd()%50,skill_lv,skill_get_time2(skill_id,skill_lv)); //(custom)
+		break;
+	case RL_SLUGSHOT:
+		if (bl->type != BL_PC)
+			sc_start(src,bl,SC_STUN,10 * skill_lv + rnd()%50,skill_lv,skill_get_time2(skill_id,skill_lv)); //(custom)
+		else if (dstsd) {
+			pc_setsit(dstsd);
+			clif_sitting(bl);
+		}
+		break;
+	case RL_BANISHING_BUSTER:
+		if (dstsd && tsc) {
+			uint16 i = 0;
+			uint8 n = skill_lv * 2 + 2; //4, 6, 8, 10, 12
+			for (i = 0; i < SC_MAX && n > 0; i++) {
+				if (tsc->data[i] && rnd()%400 < status_get_dex(src)) { //(custom)
+					status_change_end(bl,(sc_type)i,INVALID_TIMER);
+					n--;
+				}
+			}
+		}
+		break;
+	case RL_S_STORM:
+		if (dstsd) {
+			uint8 i = 0, n, rand_pos[EQI_MAX];
+			uint16 pos[] = { EQP_HEAD_LOW, EQP_HEAD_MID, EQP_HEAD_TOP, EQP_HAND_R, EQP_HAND_L, EQP_ARMOR, EQP_SHOES, EQP_GARMENT, EQP_ACC_L, EQP_ACC_R };
+			n = cap_value(skill_lv,2,ARRAYLENGTH(pos));
+
+			while (i < n) {
+				uint8 res = rnd()%ARRAYLENGTH(pos);
+				if (i && res == rand_pos[i-1]) //Make sure the value is not same with previous!
+					continue;
+				
+				rand_pos[i] = res;
+				skill_break_equip(src,bl,pos[res],(status_get_dex(src)*skill_lv*10)-(status_get_agi(bl)*20),BCT_ENEMY); //(custom)
+				i++;
+			}
+		}
+		break;
+	case RL_AM_BLAST:
+		sc_start(src,bl,SC_ANTI_M_BLAST,10 * skill_lv + rnd()%50,skill_lv,skill_get_time2(skill_id,skill_lv)); //(custom)
+		break;
+	case RL_B_TRAP:
+		if (sd && sd->skill_id_old == RL_FLICKER && tsc && tsc->data[SC_B_TRAP])
+			status_change_end(bl,SC_B_TRAP,INVALID_TIMER);
+		break;
+
+	case RL_HAMMER_OF_GOD:
+		sc_start(src,bl,SC_STUN,100,skill_lv,skill_get_time2(skill_id,skill_lv));
+	case RL_D_TAIL:
+	case RL_QD_SHOT:
+		status_change_end(bl,SC_C_MARKER,INVALID_TIMER);
+		if (sc->data[SC_QD_SHOT_READY])
+			status_change_end(bl,SC_QD_SHOT_READY,INVALID_TIMER);
+		break;
 	} //end switch skill_id
 
 	if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai)
@@ -2637,6 +2695,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 			dmg.blewcount = 0; //only pushback when it hit for other
 		break;
 	}
+
 	switch(skill_id){
 	case CR_GRANDCROSS:
 	case NPC_GRANDDARKNESS:
@@ -2760,7 +2819,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 		break;
 	case WZ_SIGHTBLASTER:
 		dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
-			break;
+		break;
 	case AB_DUPLELIGHT_MELEE:
 	case AB_DUPLELIGHT_MAGIC:
 		dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */
@@ -2780,7 +2839,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 
 	skill_do_copy(src,bl,&dmg,damage,skill_id,skill_lv); //try to copy a skill
 
-
 	if (dmg.dmg_lv >= ATK_MISS && (type = skill_get_walkdelay(skill_id, skill_lv)) > 0)
 	{	//Skills with can't walk delay also stop normal attacking for that
 		//duration when the attack connects. [Skotlex]
@@ -3042,6 +3100,7 @@ static int skill_check_unit_range_sub (struct block_list *bl, va_list ap)
 		case RA_ICEBOUNDTRAP:
 		case SC_DIMENSIONDOOR:
 		case SC_BLOODYLUST:
+		case RL_B_TRAP:
 			//Non stackable on themselves and traps (including venom dust which does not has the trap inf2 set)
 			if (skill_id != g_skill_id && !(skill_get_inf2(g_skill_id)&INF2_TRAP) && g_skill_id != AS_VENOMDUST && g_skill_id != MH_POISON_MIST)
 				return 0;
@@ -3640,6 +3699,31 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 
 	tstatus = status_get_status_data(bl);
 
+	//Hits the target if marked with SC_C_MARKER only
+	switch (skill_id) {
+		case RL_QD_SHOT:
+			if (sd && bl->id == sd->ud.target)
+				return 1;
+		case RL_D_TAIL:
+		case RL_HAMMER_OF_GOD:
+			{
+				tsc = status_get_sc(bl);
+				if (!tsc || !tsc->data[SC_C_MARKER] || tsc->data[SC_C_MARKER]->val2 != src->id)
+					return 1;
+			}
+			break;
+		case RL_FLICKER:
+			{
+				tsc = status_get_sc(bl);
+				if (!tsc)
+					return 1;
+				if ((!tsc->data[SC_H_MINE] || tsc->data[SC_H_MINE]->val2 != src->id) &&
+					(!tsc->data[SC_B_TRAP] || tsc->data[SC_B_TRAP]->val2 != src->id))
+					return 1;
+			}
+			break;
+	}
+
 	map_freeblock_lock();
 
 	switch(skill_id)
@@ -3757,8 +3841,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case KO_SETSUDAN:
 	case KO_KAIHOU:
 	case GC_DARKCROW:
+	case RL_MASS_SPIRAL:
+	case RL_SLUGSHOT:
+	case RL_AM_BLAST:
 		skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
-	break;
+		break;
 
 	/**
 	 * Mechanic (MADO GEAR)
@@ -3991,6 +4078,15 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 	case KO_MUCHANAGE:
 	case KO_BAKURETSU:
 	case GN_ILLUSIONDOPING:
+	case RL_FIREDANCE:
+	case RL_BANISHING_BUSTER:
+	case RL_S_STORM:
+	case RL_D_TAIL:
+	case RL_R_TRIP:
+	case RL_FLICKER:
+	case RL_HAMMER_OF_GOD:
+	case RL_QD_SHOT:
+	case RL_FIRE_RAIN:
 		if( flag&1 ) {//Recursive invocation
 			// skill_area_temp[0] holds number of targets in area
 			// skill_area_temp[1] holds the id of the original target
@@ -4001,10 +4097,25 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 			if( skill_area_temp[1] != bl->id && !(skill_get_inf2(skill_id)&INF2_NPC_SKILL) )
 				sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills)
 
-			heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag);
-			if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) {
-				clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1);
-				status_heal(src,heal,0,0);
+			if (skill_id == RL_FLICKER) { //Skills that triggered by RL_FLICKER
+				tsc = status_get_sc(bl);
+				if (sd)
+					sd->flicker = true;
+				if (!tsc)
+					break;
+				if (tsc->data[SC_B_TRAP])
+					skill_attack(skill_get_type(RL_B_TRAP), src, src, bl, RL_B_TRAP, pc_checkskill(sd,RL_B_TRAP), tick, sflag);
+				if (tsc->data[SC_H_MINE])
+					skill_castend_damage_id(src,bl,RL_H_MINE,pc_checkskill(sd,RL_H_MINE),tick,sflag);
+				if (sd)
+					sd->flicker = false;
+			}
+			else {
+				heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag);
+				if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) {
+					clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1);
+					status_heal(src,heal,0,0);
+				}
 			}
 		} else {
 			switch ( skill_id ) {
@@ -4018,6 +4129,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 					break;
 				case NPC_EARTHQUAKE://FIXME: Isn't EarthQuake a ground skill after all?
 					skill_addtimerskill(src,tick+250,src->id,0,0,skill_id,skill_lv,2,flag|BCT_ENEMY|SD_SPLASH|1);
+					break;
 				default:
 					break;
 			}
@@ -4779,10 +4891,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 			skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
 			status_change_end(bl, SC_HIDING, INVALID_TIMER);
 			status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
-		} else{
+		} else {
 			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);
 			clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
-			}
+		}
 		break;
 
 	case SO_POISON_BUSTER: {
@@ -4878,7 +4990,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		}
 		break;
 
-
 	//recursive homon skill
 	case MH_MAGMA_FLOW:
 	case MH_HEILIGE_STANGE:
@@ -4886,9 +4997,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		    if((skill_id == MH_MAGMA_FLOW) && ((rnd()%100)>(3*skill_lv)) ) break;//chance to not trigger atk for magma
 		    skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
 		}
-		else {
+		else
 		    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);
-		}
 		break;
 
 	case MH_STAHL_HORN:
@@ -4897,33 +5007,56 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
 		break;
 	case MH_MIDNIGHT_FRENZY:
-	case MH_SILVERVEIN_RUSH:{
-		TBL_HOM *hd = BL_CAST(BL_HOM,src);
-		hom_delspiritball(hd,skill_id==MH_SILVERVEIN_RUSH?1:2,0);
-		skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
+	case MH_SILVERVEIN_RUSH:
+		{
+			TBL_HOM *hd = BL_CAST(BL_HOM,src);
+			hom_delspiritball(hd,skill_id==MH_SILVERVEIN_RUSH?1:2,0);
+			skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
+		}
 		break;
-	}
 	case MH_TINDER_BREAKER:
 	case MH_CBC:
-	case MH_EQC: {
-		int duration=0;
-		TBL_HOM *hd = BL_CAST(BL_HOM,src);
-		duration = max(skill_lv,(status_get_str(src)/7 - status_get_str(bl)/10))*1000; //Yommy formula
-		hom_delspiritball(hd,skill_id==MH_EQC?2:1,0); //only EQC consume 2 in grp 2
-		skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
-		clif_skill_nodamage(src,bl,skill_id,skill_lv,
-			sc_start4(src,bl,status_skill2sc(skill_id),100,skill_lv,src->id,0,0,duration));
-		if (skill_id==MH_TINDER_BREAKER && unit_movepos(src, bl->x, bl->y, 1, 1)) {
+	case MH_EQC:
+		{
+			int duration=0;
+			TBL_HOM *hd = BL_CAST(BL_HOM,src);
+			duration = max(skill_lv,(status_get_str(src)/7 - status_get_str(bl)/10))*1000; //Yommy formula
+			hom_delspiritball(hd,skill_id==MH_EQC?2:1,0); //only EQC consume 2 in grp 2
+			skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
+			clif_skill_nodamage(src,bl,skill_id,skill_lv,
+				sc_start4(src,bl,status_skill2sc(skill_id),100,skill_lv,src->id,0,0,duration));
+			if (skill_id==MH_TINDER_BREAKER && unit_movepos(src, bl->x, bl->y, 1, 1)) {
 #if PACKETVER >= 20111005
-			clif_snap(src, bl->x, bl->y);
+				clif_snap(src, bl->x, bl->y);
 #else
-			clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick);
+				clif_skill_poseffect(src,skill_id,skill_lv,bl->x,bl->y,tick);
 #endif
-
+			}
 		}
 		break;
-	}
 
+	case RL_H_MINE:
+		if (sd) {
+			//Splash damage around the main target(s)
+			if (!(flag&1) && sd->flicker && tsc && tsc->data[SC_H_MINE] && tsc->data[SC_H_MINE]->val2 == src->id) {
+				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|1,skill_castend_damage_id);
+			}
+			else {
+				if (sd && sd->flicker && tsc && tsc->data[SC_H_MINE] && tsc->data[SC_H_MINE]->val2 == src->id)
+				{
+					skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
+					tsc->data[SC_H_MINE]->val3 = 1; //Mark the SC end because not expired
+					status_change_end(bl,SC_H_MINE,INVALID_TIMER);
+					sc_start4(src,bl,SC_BURNING,10 * skill_lv + rnd()%50,skill_lv,1000,src->id,0,skill_get_time2(skill_id,skill_lv));
+				}
+				else if (skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag) && !sd->flicker && !status_isdead(bl))
+					sc_start(src,bl,SC_H_MINE,100,skill_id,skill_get_time(skill_id,skill_lv));
+			}
+		}
+		else if (!sd && skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag))
+			sc_start4(src,bl,SC_BURNING,10 * skill_lv + rnd()%50,skill_lv,1000,src->id,0,skill_get_time2(skill_id,skill_lv));
+		break;
 
 	case 0:/* no skill - basic/normal attack */
 		if(sd) {
@@ -5599,6 +5732,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case ALL_FULL_THROTTLE:
 	case RA_UNLIMIT:
 	case WL_TELEKINESIS_INTENSE:
+	case RL_HEAT_BARREL:
+	case RL_P_ALTER:
+	case RL_E_CHAIN:
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,
 			sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
 		break;
@@ -5902,6 +6038,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		status_change_end(src, SC_HIDING, INVALID_TIMER);
 		break;
 
+	//List of self skills that give damage around caster
+	case RL_FLICKER:
+		if (sd) {
+			sd->skill_id_old = RL_FLICKER;
+			sd->flicker = true;
+		}
 	case ASC_METEORASSAULT:
 	case GS_SPREADATTACK:
 	case RK_STORMBLAST:
@@ -5911,12 +6053,16 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case SR_RAMPAGEBLASTER:
 	case SR_HOWLINGOFLION:
 	case KO_HAPPOKUNAI:
+	case RL_FIREDANCE:
+	case RL_R_TRIP:
 		skill_area_temp[1] = 0;
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		i = 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);
 		if( !i && ( skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
 			clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+		if (sd && skill_id == RL_FLICKER)
+			sd->flicker = false;
 		break;
 
 	case NC_EMERGENCYCOOL:
@@ -6732,7 +6878,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				case SC_LAUDARAMUS:		case SC_GATLINGFEVER:	case SC_INCREASING:
 				case SC_ADJUSTMENT:		case SC_MADNESSCANCEL:
 				case SC_ANGEL_PROTECT:	case SC_MONSTER_TRANSFORM:	case SC_FULL_THROTTLE:
-				case SC_REBOUND:	case SC_TELEKINESIS_INTENSE:
+				case SC_REBOUND:		case SC_TELEKINESIS_INTENSE:
+				case SC_HEAT_BARREL:	case SC_HEAT_BARREL_AFTER:	case SC_P_ALTER:
+				case SC_E_CHAIN:		case SC_C_MARKER:		case SC_B_TRAP:
+				case SC_H_MINE:
 #ifdef RENEWAL
 				case SC_EXTREMITYFIST2:
 #endif
@@ -7637,7 +7786,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 			if(rnd()%100 < (20+10*skill_lv))
 				pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),10);
-			else if(sd->spiritball > 0)
+			else if(sd->spiritball > 0 && !pc_checkskill(sd,RL_RICHS_COIN))
 				pc_delspiritball(sd,1,0);
 		}
 		break;
@@ -8213,6 +8362,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				case SC_RAISINGDRAGON:	case SC_GT_ENERGYGAIN:	case SC_GT_CHANGE:
 				case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM:
 				case SC_FULL_THROTTLE: case SC_REBOUND: case SC_TELEKINESIS_INTENSE:
+				case SC_HEAT_BARREL:	case SC_HEAT_BARREL_AFTER:	case SC_P_ALTER:
+				case SC_E_CHAIN:		case SC_C_MARKER:		case SC_B_TRAP:
+				case SC_H_MINE:
 #ifdef RENEWAL
 				case SC_EXTREMITYFIST2:
 #endif
@@ -8951,7 +9103,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,0,0));
 		}
 		break;
-
 	case WM_SONG_OF_MANA:
 	case WM_DANCE_WITH_WUG:
 	case WM_LERADS_DEW:
@@ -8966,7 +9117,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			if( sc_start2(src,bl,type,100,skill_lv,count,skill_get_time(skill_id,skill_lv)) )
 				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);
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
-
 		}
 		break;
 
@@ -9219,7 +9369,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			clif_skill_itemlistwindow(sd,skill_id,skill_lv);
 		}
 		break;
-
+	/**
+	 * Genetic
+	 **/
 	case GN_BLOOD_SUCKER:
 		{
 			struct status_change *sc = status_get_sc(src);
@@ -9238,7 +9390,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			}
 		}
 		break;
-
 	case GN_MANDRAGORA:
 		if( flag&1 ) {
 			if ( clif_skill_nodamage(bl, src, skill_id, skill_lv,
@@ -9248,7 +9399,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			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 GN_SLINGITEM:
 		if( sd ) {
 			short ammo_id;
@@ -9266,7 +9416,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 					else
 						skill_attack(BF_WEAPON,src,src,bl,GN_SLINGITEM_RANGEMELEEATK,skill_lv,tick,flag);
 				} else //Otherwise, it fails, shows animation and removes items.
-					clif_skill_fail(sd,GN_SLINGITEM_RANGEMELEEATK,0xa,0);
+					clif_skill_fail(sd,GN_SLINGITEM_RANGEMELEEATK,USESKILL_FAIL,0);
 			} else if( itemdb_is_GNthrowable(ammo_id) ){
 				struct script_code *script = sd->inventory_data[i]->script;
 				if( !script )
@@ -9280,7 +9430,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);// This packet is received twice actually, I think it is to show the animation.
 		break;
-
 	case GN_MIX_COOKING:
 	case GN_MAKEBOMB:
 	case GN_S_PHARMACY:
@@ -9294,6 +9443,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		}
 		break;
+	/**
+	 * Elemental
+	 **/
 	case EL_CIRCLE_OF_FIRE:
 	case EL_PYROTECHNIC:
 	case EL_HEATER:
@@ -9331,7 +9483,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			}
 		}
 		break;
-
 	case EL_FIRE_MANTLE:
 	case EL_WATER_BARRIER:
 	case EL_ZEPHYR:
@@ -9340,7 +9491,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
 		skill_unitsetting(src,skill_id,skill_lv,bl->x,bl->y,0);
 		break;
-
 	case EL_WATER_SCREEN: {
 			struct elemental_data *ele = BL_CAST(BL_ELEM, src);
 			if( ele ) {
@@ -9358,8 +9508,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				}
 			}
 		}
-		break;
-
+		break;	
+	/**
+	 * Kagerou & Oboro
+	 **/
 	case KO_KAHU_ENTEN:
 	case KO_HYOUHU_HUBUKI:
 	case KO_KAZEHU_SEIRAN:
@@ -9370,7 +9522,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			pc_add_talisman(sd, skill_get_time(skill_id, skill_lv), 10, ttype);
 		}
 		break;
-
 	case KO_ZANZOU:
 		if(sd){
 			struct mob_data *md;
@@ -9390,7 +9541,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			}
 		}
 		break;
-
 	case KO_KYOUGAKU:
 		if( dstsd && tsc && !tsc->data[type] && rand()%100 < tstatus->int_/2 ){
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,
@@ -9398,7 +9548,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		}else if( sd )
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 		break;
-
 	case KO_JYUSATSU:
 		if( dstsd && tsc && !tsc->data[type] &&
 			rand()%100 < ((45+5*skill_lv) + skill_lv*5 - status_get_int(bl)/2) ){//[(Base chance of success) + (Skill Level x 5) - (int / 2)]%.
@@ -9410,7 +9559,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		}else if( sd )
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 		break;
-
 	case KO_GENWAKU:
 		if ( !map_flag_gvg(src->m) && ( dstsd || dstmd ) && battle_check_target(src,bl,BCT_ENEMY) > 0 ) {
 			int x = src->x, y = src->y;
@@ -9435,7 +9583,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			}
 		}
 		break;
-
 	case OB_AKAITSUKI:
 	case OB_OBOROGENSOU:
 		if( sd && ( (skill_id == OB_OBOROGENSOU && bl->type == BL_MOB) // This skill does not work on monsters.
@@ -9451,7 +9598,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
 		clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
 		break;
-
 	case KG_KAGEHUMI:
 		if( flag&1 ){
 			if(tsc && ( tsc->option&(OPTION_CLOAK|OPTION_HIDE) ||
@@ -9478,62 +9624,62 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		break;
 
 	case MH_SILENT_BREEZE: {
-	     struct status_change *ssc = status_get_sc(src);
-	     struct block_list *m_bl = battle_get_master(src);
-	     const enum sc_type scs[] = {
-		     SC_MANDRAGORA, SC_HARMONIZE, SC_DEEPSLEEP, SC_VOICEOFSIREN, SC_SLEEP, SC_CONFUSION, SC_HALLUCINATION
-	     };
-	     int heal;
-	     if(tsc){
-		 for (i = 0; i < ARRAYLENGTH(scs); i++) {
-		     if (tsc->data[scs[i]]) status_change_end(bl, scs[i], INVALID_TIMER);
-		 }
-		 if (!tsc->data[SC_SILENCE]) //put inavoidable silence on target
-			 status_change_start(src,bl, SC_SILENCE, 100, skill_lv, 0,0,0, skill_get_time(skill_id, skill_lv),1|2|8);
-	     }
-	     heal = status_get_sp(src) + status_get_lv(src); //cur_sp+blvl @TODO need real value
-	     status_heal(bl, heal, 0, 7);
-
-	     //now inflict silence on everyone
-	     if(ssc && !ssc->data[SC_SILENCE]) //put inavoidable silence on homun
-		 status_change_start(src, src, SC_SILENCE, 100, skill_lv, 0,0,0, skill_get_time(skill_id, skill_lv),1|2|8);
-	     if(m_bl){
-		 struct status_change *msc = status_get_sc(m_bl);
-		 if(msc && !msc->data[SC_SILENCE]) //put inavoidable silence on master
-		     status_change_start(src, m_bl, SC_SILENCE, 100, skill_lv, 0,0,0, skill_get_time(skill_id, skill_lv),1|2|8);
-	     }
-	     if (hd)
-		 skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
-	}
-	break;
+			 struct status_change *ssc = status_get_sc(src);
+			 struct block_list *m_bl = battle_get_master(src);
+			 const enum sc_type scs[] = {
+				 SC_MANDRAGORA, SC_HARMONIZE, SC_DEEPSLEEP, SC_VOICEOFSIREN, SC_SLEEP, SC_CONFUSION, SC_HALLUCINATION
+			 };
+			 int heal;
+			 if(tsc){
+				 for (i = 0; i < ARRAYLENGTH(scs); i++) {
+					 if (tsc->data[scs[i]]) status_change_end(bl, scs[i], INVALID_TIMER);
+				 }
+				 if (!tsc->data[SC_SILENCE]) //put inavoidable silence on target
+					 status_change_start(src,bl, SC_SILENCE, 100, skill_lv, 0,0,0, skill_get_time(skill_id, skill_lv),1|2|8);
+			 }
+			 heal = status_get_sp(src) + status_get_lv(src); //cur_sp+blvl @TODO need real value
+			 status_heal(bl, heal, 0, 7);
+
+			 //now inflict silence on everyone
+			 if(ssc && !ssc->data[SC_SILENCE]) //put inavoidable silence on homun
+				status_change_start(src, src, SC_SILENCE, 100, skill_lv, 0,0,0, skill_get_time(skill_id, skill_lv),1|2|8);
+			 if(m_bl) {
+				 struct status_change *msc = status_get_sc(m_bl);
+				 if(msc && !msc->data[SC_SILENCE]) //put inavoidable silence on master
+					 status_change_start(src, m_bl, SC_SILENCE, 100, skill_lv, 0,0,0, skill_get_time(skill_id, skill_lv),1|2|8);
+			 }
+			 if (hd)
+				skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
+		}
+		break;
 	case MH_OVERED_BOOST:
-	     if (hd){
-		 struct block_list *s_bl = battle_get_master(src);
-		 if(hd->homunculus.hunger>50) //reduce hunger
-		     hd->homunculus.hunger = hd->homunculus.hunger/2;
-		 else
-		     hd->homunculus.hunger = min(1,hd->homunculus.hunger);
-		 if(s_bl && s_bl->type==BL_PC){
-		     status_set_sp(s_bl,status_get_max_sp(s_bl)/2,0); //master drain 50% sp
-		     clif_send_homdata(((TBL_PC *)s_bl), SP_HUNGRY, hd->homunculus.hunger); //refresh hunger info
-		     sc_start(src,s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); //gene bonus
-		 }
-		 sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
-		 skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
+	     if (hd) {
+			 struct block_list *s_bl = battle_get_master(src);
+			 if(hd->homunculus.hunger>50) //reduce hunger
+				 hd->homunculus.hunger = hd->homunculus.hunger/2;
+			 else
+				 hd->homunculus.hunger = min(1,hd->homunculus.hunger);
+			 if(s_bl && s_bl->type==BL_PC) {
+				 status_set_sp(s_bl,status_get_max_sp(s_bl)/2,0); //master drain 50% sp
+				 clif_send_homdata(((TBL_PC *)s_bl), SP_HUNGRY, hd->homunculus.hunger); //refresh hunger info
+				 sc_start(src,s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); //gene bonus
+			 }
+			 sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
+			 skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
 	     }
 	     break;
 	case MH_GRANITIC_ARMOR:
-	case MH_PYROCLASTIC: {
-		 struct block_list *s_bl = battle_get_master(src);
-		 if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master
-		 sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
-		 if (hd) skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
+	case MH_PYROCLASTIC:
+		{
+			 struct block_list *s_bl = battle_get_master(src);
+			 if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master
+			 sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
+			 if (hd) skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
 	     }
 	     break;
-
 	case MH_LIGHT_OF_REGENE: //self
 		sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
-		if(hd){
+		if(hd) {
 		    hd->homunculus.intimacy = 251; //change to neutral (can't be cast if < 750)
 		    if(sd) clif_send_homdata(sd, SP_INTIMATE, hd->homunculus.intimacy); //refresh intimacy info
 		    skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
@@ -9558,9 +9704,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case MH_PAIN_KILLER:
 	   sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
 	   if (hd)
-		skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
+		   skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
 	   break;
-
 	case MH_SUMMON_LEGION: {
 		int summons[5] = {2158, 2159, 2159, 2160, 2160};
 		int qty[5] =     {3   , 3   , 4   , 4   , 5};
@@ -9587,6 +9732,66 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
 		}
 		break;
+	/**
+	 * Rebellion
+	 **/
+	case RL_RICHS_COIN:
+		if (sd) {
+			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
+			if (rnd()%100 < 50)
+				for (i = 0; i < 10; i++)
+					pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),10);
+		}
+		break;
+	case RL_C_MARKER:
+		if (sd && (dstsd || (bl->type == BL_MOB && dstmd))) {
+			uint8 i;
+			sd->c_marker.count = 0;
+			//Find empty slot. If already exist, renew it!
+			ARR_FIND(0,MAX_SKILL_CRIMSON_MARKER,i,sd->c_marker.target[i] == bl->id || !sd->c_marker.target[i]);
+			if (i >= MAX_SKILL_CRIMSON_MARKER) { //No slot
+				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
+				break;
+			}
+			//Attempt to run SC to the target
+			if (!sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))) {
+				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
+				break;
+			}
+			sd->c_marker.target[i] = bl->id;
+			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
+		}
+		break;
+	case RL_D_TAIL:
+		if (sd && &sd->c_marker) {
+			sd->c_marker.count = min(map_foreachinrange(skill_check_target_c_marker,bl,skill_get_splash(skill_id,skill_lv),splash_target(src),src,skill_id),MAX_SKILL_CRIMSON_MARKER);
+			if (!sd->c_marker.count) {
+				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
+				break;
+			}
+			status_zap(src,0,skill_get_sp(skill_id,skill_lv));
+			skill_area_temp[1] = 0;
+			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
+			if (sd->c_marker.count)
+				i = 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);
+			sd->c_marker.count = 0;
+		}
+		break;
+	case RL_QD_SHOT:
+		if (!sd)
+			break;
+		if (&sd->c_marker && sd->c_marker.target) {
+			i = min(map_foreachinrange(skill_check_target_c_marker,bl,skill_get_splash(skill_id,skill_lv),splash_target(src),src,skill_id),MAX_SKILL_CRIMSON_MARKER);
+
+			skill_area_temp[1] = 0;
+			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
+			if (i)
+				i = 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);
+		}
+		//Doesn't matter if the main target has SC_C_MARKER or not
+		skill_attack(skill_get_type(RL_QD_SHOT),src,src,bl,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_LEVEL|SD_ANIMATION);
+		break;
+
 	default:
 		ShowWarning("skill_castend_nodamage_id: Unknown skill used:%d\n",skill_id);
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
@@ -9848,6 +10053,7 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 			switch( ud->skill_id )
 			{
 			case GS_DESPERADO:
+			case RL_FIREDANCE:
 				sd->canequip_tick = tick + skill_get_time(ud->skill_id, ud->skill_lv);
 				break;
 			case CR_GRANDCROSS:
@@ -10220,7 +10426,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 	case MG_SAFETYWALL:
 	case MG_FIREWALL:
 	case MG_THUNDERSTORM:
-
 	case AL_PNEUMA:
 	case WZ_ICEWALL:
 	case WZ_FIREPILLAR:
@@ -10324,6 +10529,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 	case MH_STEINWAND:
 	case MH_XENO_SLASHER:
 	case NC_MAGMA_ERUPTION:
+	case RL_B_TRAP:
+		if (skill_id == RL_B_TRAP && sd)
+			sd->skill_id_old = skill_id;
 		flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete).
 	case GS_GROUNDDRIFT: //Ammo should be deleted right away.
 		skill_unitsetting(src,skill_id,skill_lv,x,y,0);
@@ -10805,6 +11013,25 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 		}
 		break;
 
+	case RL_FALLEN_ANGEL:
+		if( unit_movepos(src, x, y, 1, 1) ) {
+			enum e_skill skill_use = GS_DESPERADO;
+			uint8 skill_use_lv = pc_checkskill(sd,skill_use);
+			clif_slide(src,x,y);
+			if (skill_check_condition_castbegin(sd,skill_use,skill_use_lv)) {
+				skill_castend_pos2(src,src->x,src->y,skill_use,skill_use_lv,tick,SD_LEVEL|SD_ANIMATION|SD_SPLASH);
+				skill_consume_requirement(sd,skill_use,skill_use_lv,1);
+			}
+		}
+		else if (sd)
+			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
+		break;
+	case RL_HAMMER_OF_GOD:
+		i = skill_get_splash(skill_id, skill_lv);
+		map_foreachinarea(skill_area_sub, src->m, x-i, y-i, x+i, y+i, BL_CHAR,
+			src, skill_id, skill_lv, tick, flag|BCT_ENEMY|2, skill_castend_damage_id);
+		break;
+
 	default:
 		ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skill_id);
 		return 1;
@@ -11200,6 +11427,10 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
 	case RA_VERDURETRAP:
 	case RA_FIRINGTRAP:
 	case RA_ICEBOUNDTRAP:
+	/**
+	 * Rebellion
+	 **/
+	case RL_B_TRAP:
 		{
 			struct skill_condition req = skill_get_requirement(sd,skill_id,skill_lv);
 			ARR_FIND(0, MAX_SKILL_ITEM_REQUIRE, i, req.itemid[i] && (req.itemid[i] == ITEMID_TRAP || req.itemid[i] == ITEMID_TRAP_ALLOY));
@@ -11493,6 +11724,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
 		case RA_VERDURETRAP:
 		case RA_FIRINGTRAP:
 		case RA_ICEBOUNDTRAP:
+		case RL_B_TRAP:
 			val1 = 3500;
 			break;
 		case GS_DESPERADO:
@@ -12493,6 +12725,16 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 			skill_attack(BF_MAGIC, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
 			status_change_start(ss, bl, SC_BLIND, (10 + 10 * sg->skill_lv)*100, sg->skill_lv, sg->skill_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), 2|8);
 			break;
+
+		case UNT_B_TRAP:
+			sc_start(ss,bl,SC_B_TRAP,100,sg->skill_lv,max(status_get_str(bl) * 150,5000)); //(custom)
+			sg->unit_id = UNT_USED_TRAPS;
+			clif_changetraplook(&src->bl, UNT_USED_TRAPS);
+			sg->limit=DIFF_TICK(tick,sg->tick)+1500;
+			break;
+		/*case UNT_FIRE_RAIN:
+			skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,SD_LEVEL|SD_ANIMATION|SD_SPLASH);
+			break;*/
 	}
 
 	if (bl->type == BL_MOB && ss != bl)
@@ -13805,8 +14047,9 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		return 0;
 	}
 
-	if( require.spiritball > 0 && sd->spiritball < require.spiritball) {
-		clif_skill_fail(sd,skill_id,USESKILL_FAIL_SPIRITS,require.spiritball);
+	if( (require.spiritball > 0 && sd->spiritball < require.spiritball) || 
+		(require.spiritball == -1 && sd->spiritball < 1) ) {
+		clif_skill_fail(sd,skill_id,USESKILL_FAIL_SPIRITS,(require.spiritball == -1)? 1: require.spiritball);
 		return 0;
 	}
 
@@ -13983,6 +14226,7 @@ int skill_consume_requirement( struct map_session_data *sd, uint16 skill_id, uin
 		switch( skill_id ) {
 			case CG_TAROTCARD: // TarotCard will consume sp in skill_cast_nodamage_id [Inkfish]
 			case MC_IDENTIFY:
+			case RL_D_TAIL:
 				req.sp = 0;
 				break;
 			default:
@@ -13995,6 +14239,10 @@ int skill_consume_requirement( struct map_session_data *sd, uint16 skill_id, uin
 
 		if(req.spiritball > 0)
 			pc_delspiritball(sd,req.spiritball,0);
+		else if(req.spiritball == -1) {
+			sd->spiritball_old = sd->spiritball;
+			pc_delspiritball(sd,sd->spiritball,0);
+		}
 
 		if(req.zeny > 0)
 		{
@@ -14040,6 +14288,9 @@ int skill_consume_requirement( struct map_session_data *sd, uint16 skill_id, uin
 				case SA_VIOLENTGALE:
 					if( sc && sc->data[SC_WILD_STORM_OPTION] && rnd()%100 < 50 )
 						continue;
+				case RL_H_MINE:
+					if (sd->flicker)
+						continue;
 					break;
 			}
 
@@ -15156,6 +15407,30 @@ int skill_frostjoke_scream (struct block_list *bl, va_list ap)
 	return 0;
 }
 
+int skill_check_target_c_marker(struct block_list *bl, va_list ap) {
+	struct block_list *src;
+	struct status_change *tsc;
+	struct map_session_data *sd;
+	uint16 skill_id;
+
+	nullpo_ret(bl);
+	nullpo_ret(src = va_arg(ap,struct block_list*));
+	
+	if (src == bl || status_isdead(bl) || src->type != BL_PC)
+		return 0;
+	if (!(sd = (struct map_session_data *)src) || !(&sd->c_marker) || !sd->c_marker.target)
+		return 0;
+
+	skill_id = va_arg(ap,int);
+
+	//Skip target with no Crimson Marker
+	tsc = status_get_sc(bl);
+	if (!tsc || !tsc->data[SC_C_MARKER] || tsc->data[SC_C_MARKER]->val2 != src->id)
+		return 0;
+
+	return 1;
+}
+
 /*==========================================
  *
  *------------------------------------------*/
@@ -16152,7 +16427,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
 			case UNT_VERDURETRAP:
 			case UNT_FIRINGTRAP:
 			case UNT_ICEBOUNDTRAP:
-
+			case UNT_B_TRAP:
 			{
 				struct block_list* src;
 				if( unit->val1 > 0 && (src = map_id2bl(group->src_id)) != NULL && src->type == BL_PC )
@@ -16253,6 +16528,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
 			case UNT_FREEZINGTRAP:
 			case UNT_TALKIEBOX:
 			case UNT_ANKLESNARE:
+			case UNT_B_TRAP:
 				if( unit->val1 <= 0 ) {
 					if( group->unit_id == UNT_ANKLESNARE && group->val2 > 0 )
 						skill_delunit(unit);

+ 2 - 1
src/map/skill.h

@@ -20,8 +20,8 @@ struct status_change_entry;
 #define MAX_ARROW_RESOURCE		5
 #define MAX_SKILL_ABRA_DB		350
 #define MAX_SKILL_IMPROVISE_DB 50
-
 #define MAX_SKILL_LEVEL 100
+#define MAX_SKILL_CRIMSON_MARKER 3
 
 DBMap* skilldb_name2id;
 
@@ -1924,6 +1924,7 @@ enum {
 	UNT_HELLBURNING,
 	UNT_MAGMA_ERUPTION,
 	UNT_KINGS_GRACE,
+
 	UNT_GLITTERING_GREED,
 	UNT_B_TRAP,
 	UNT_FIRE_RAIN,

+ 134 - 19
src/map/status.c

@@ -753,6 +753,19 @@ void initChangeTables(void) {
 	set_sc_with_vfx( SC_MOONSTAR		, SC_MOONSTAR		, SI_MOONSTAR		, SCB_NONE );
 	set_sc_with_vfx( SC_SUPER_STAR		, SC_SUPER_STAR		, SI_SUPER_STAR		, SCB_NONE );
 
+	/**
+	 * Rebellion
+	 **/
+	add_sc( RL_MASS_SPIRAL,   SC_BLEEDING );
+	add_sc( RL_HAMMER_OF_GOD, SC_STUN );
+	set_sc( RL_B_TRAP,      SC_B_TRAP,         SI_B_TRAP,       SCB_SPEED );
+	set_sc( RL_E_CHAIN,     SC_E_CHAIN,        SI_E_CHAIN,      SCB_NONE );
+	set_sc( RL_C_MARKER,    SC_C_MARKER,       SI_C_MARKER,     SCB_SPEED );
+	set_sc( RL_P_ALTER,     SC_P_ALTER,        SI_P_ALTER,      SCB_BATK );
+	set_sc( RL_SLUGSHOT,    SC_STUN,           SI_SLUGSHOT,     SCB_NONE );
+	set_sc( RL_AM_BLAST,    SC_ANTI_M_BLAST,   SI_ANTI_M_BLAST, SCB_DEF_ELE );
+	set_sc( RL_HEAT_BARREL, SC_HEAT_BARREL,    SI_HEAT_BARREL,  SCB_BATK|SCB_ASPD|SCB_HIT );
+
 	// Storing the target job rather than simply SC_SPIRIT simplifies code later on.
 	SkillStatusChangeTable[SL_ALCHEMIST]	= (sc_type)MAPID_ALCHEMIST,
 	SkillStatusChangeTable[SL_MONK]		= (sc_type)MAPID_MONK,
@@ -908,11 +921,17 @@ void initChangeTables(void) {
 	StatusIconChangeTable[SC_PETROLOGY] = SI_PETROLOGY;
 	StatusIconChangeTable[SC_CURSED_SOIL] = SI_CURSED_SOIL;
 	StatusIconChangeTable[SC_UPHEAVAL] = SI_UPHEAVAL;
+
 	StatusIconChangeTable[SC_PUSH_CART] = SI_ON_PUSH_CART;
 	StatusIconChangeTable[SC_REBOUND] = SI_REBOUND;
 	StatusIconChangeTable[SC_MONSTER_TRANSFORM] = SI_MONSTER_TRANSFORM;
 	StatusIconChangeTable[SC_MOONSTAR] = SI_MOONSTAR;
 	StatusIconChangeTable[SC_SUPER_STAR] = SI_SUPER_STAR;
+	StatusIconChangeTable[SC_BURNING] = SI_BURNT;
+	
+	StatusIconChangeTable[SC_H_MINE] = SI_H_MINE;
+	StatusIconChangeTable[SC_QD_SHOT_READY] = SI_E_QD_SHOT_READY;
+	StatusIconChangeTable[SC_HEAT_BARREL_AFTER] = SI_HEAT_BARREL_AFTER;
 
 	//Other SC which are not necessarily associated to skills.
 	StatusChangeFlagTable[SC_ASPDPOTION0] = SCB_ASPD;
@@ -1067,6 +1086,7 @@ void initChangeTables(void) {
 	StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET]	|= SCS_NOCAST;
 	StatusChangeStateTable[SC_SILENCE]		|= SCS_NOCAST;
 	StatusChangeStateTable[SC_KINGS_GRACE]		|= SCS_NOCAST;
+	StatusChangeStateTable[SC_HEAT_BARREL_AFTER]	|= SCS_NOCAST;
 
 	/* StatusChangeState (SCS_) NOCHAT (skills) */
 	StatusChangeStateTable[SC_BERSERK]		|= SCS_NOCHAT;
@@ -4895,6 +4915,8 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change
 		hit -= (hit * sc->data[SC_ASH]->val2) / 100;
 	if(sc->data[SC_ILLUSIONDOPING])
 		hit -= hit * (5 + sc->data[SC_ILLUSIONDOPING]->val1) / 100; //Custom
+	if(sc->data[SC_HEAT_BARREL])
+		hit -= sc->data[SC_HEAT_BARREL]->val4;
 
 	return (short)cap_value(hit,1,SHRT_MAX);
 }
@@ -5321,6 +5343,10 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
 					val = max( val, sc->data[SC_POWER_OF_GAIA]->val2 );
 				if( sc->data[SC_MELON_BOMB] )
 					val = max( val, sc->data[SC_MELON_BOMB]->val1 );
+				if( sc->data[SC_C_MARKER] )
+					val = max( val, 10 );
+				if( sc->data[SC_B_TRAP] )
+					val = max( val, sc->data[SC_B_TRAP]->val3 );
 
 				if( sd && sd->bonus.speed_rate + sd->bonus.speed_add_rate > 0 ) // permanent item-based speedup
 					val = max( val, sd->bonus.speed_rate + sd->bonus.speed_add_rate );
@@ -5519,6 +5545,8 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, s
 		skills2 += sc->data[SC_EXTRACT_SALAMINE_JUICE]->val1;
 	if( sc->data[SC_INCASPDRATE] )
 		skills2 += sc->data[SC_INCASPDRATE]->val1;
+	if( sc->data[SC_HEAT_BARREL] )
+		skills2 += sc->data[SC_HEAT_BARREL]->val3;
 
 	return ( flag&1? (skills1 + pots) : skills2 );
 }
@@ -7014,6 +7042,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		if(sc->data[SC_HOVERING])
 			return 0;
 		break;
+	case SC_C_MARKER:
+		if (src == bl)
+			return 0;
+		else {
+			struct status_change *tsc = status_get_sc(bl);
+			//Failed if the target is already marked and the new marker that isn't same marker
+			if (tsc && tsc->data[type] && tsc->data[type]->val2 != src->id)
+				return 0;
+		}
+		break;
 	}
 
 	//Check for BOSS resistances
@@ -8922,6 +8960,44 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			val1 = 1002; //Default poring
 			val_flag |= 1;
 			break;
+
+		/**
+		 * Rebellion
+		 **/
+		case SC_HEAT_BARREL_AFTER:
+		case SC_QD_SHOT_READY:
+			break;
+
+		case SC_B_TRAP:
+			val3 = val1 * 25; //-movespeed (custom)
+		case SC_C_MARKER:
+		case SC_H_MINE:
+			val2 = src->id;
+			break;
+
+		case SC_HEAT_BARREL:
+			if (sd) {
+				uint8 n = (uint8)sd->spiritball_old;
+				val2 = val1 * n * 4; //+atk (custom)
+				val3 = val1 * n / 5; //+aspd (custom)
+				val4 = val1 * n * 2; //-hit (custom)
+			}
+			break;
+		case SC_P_ALTER:
+			if (sd) {
+				uint8 n = (uint8)sd->spiritball_old;
+				val2 = val1 * n * 2; //+atk (custom)
+				val3 = val1 * 15; //+def (custom)
+			}
+			break;
+		case SC_E_CHAIN:
+			if (sd)
+				val2 = (uint8)sd->spiritball_old;
+			break;
+		case SC_ANTI_M_BLAST:
+			val2 = val1 * 10;
+			break;
+
 		default:
 			if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == 0 && StatusIconChangeTable[type] == 0 )
 			{	//Status change with no calc, no icon, and no skill associated...?
@@ -8994,6 +9070,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_WEIGHT90:
 		case SC_CAMOUFLAGE:
 		case SC_VOICEOFSIREN:
+		case SC_HEAT_BARREL_AFTER:
 			unit_stop_attack(bl);
 		break;
 		case SC_SILENCE:
@@ -9355,6 +9432,7 @@ int status_change_clear(struct block_list* bl, int type) {
 			case SC_L_LIFEPOTION:
 			case SC_PUSH_CART:
 			case SC_STYLE_CHANGE:
+			case SC_HEAT_BARREL_AFTER:
 				continue;
 		}
 
@@ -9409,7 +9487,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 	struct status_change_entry *sce;
 	struct status_data *status;
 	struct view_data *vd;
-	int opt_flag=0, calc_flag;
+	int opt_flag=0, calc_flag,temp_n = 0;
 
 	nullpo_ret(bl);
 
@@ -9431,24 +9509,24 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 		if (sce->timer != INVALID_TIMER) //Could be a SC with infinite duration
 			delete_timer(sce->timer,status_change_timer);
 		if (sc->opt1)
-		switch (type) {
-			//"Ugly workaround"  [Skotlex]
-			//delays status change ending so that a skill that sets opt1 fails to
-			//trigger when it also removed one
-			case SC_STONE:
-				sce->val3 = 0; //Petrify time counter.
-			case SC_FREEZE:
-			case SC_STUN:
-			case SC_SLEEP:
-			if (sce->val1) {
-				//Removing the 'level' shouldn't affect anything in the code
-				//since these SC are not affected by it, and it lets us know
-				//if we have already delayed this attack or not.
-				sce->val1 = 0;
-				sce->timer = add_timer(gettick()+10, status_change_timer, bl->id, type);
-				return 1;
+			switch (type) {
+				//"Ugly workaround"  [Skotlex]
+				//delays status change ending so that a skill that sets opt1 fails to
+				//trigger when it also removed one
+				case SC_STONE:
+					sce->val3 = 0; //Petrify time counter.
+				case SC_FREEZE:
+				case SC_STUN:
+				case SC_SLEEP:
+					if (sce->val1) {
+						//Removing the 'level' shouldn't affect anything in the code
+						//since these SC are not affected by it, and it lets us know
+						//if we have already delayed this attack or not.
+						sce->val1 = 0;
+						sce->timer = add_timer(gettick()+10, status_change_timer, bl->id, type);
+						return 1;
+					}
 			}
-		}
 	}
 
 	(sc->count)--;
@@ -9456,6 +9534,11 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 	if ( StatusChangeStateTable[type] )
 		status_calc_state(bl,sc,( enum scs_flag ) StatusChangeStateTable[type],false);
 
+	switch (type) {
+		case SC_H_MINE:		temp_n = sc->data[type]->val3;	break;	//If ended by RL_FLICKER, don't drop the trap
+		case SC_C_MARKER:	temp_n = sc->data[type]->val2;	break;	//Player who gave mark
+	}
+
 	sc->data[type] = NULL;
 
 	vd = status_get_viewdata(bl);
@@ -9875,10 +9958,41 @@ 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));
 			break;
+		case SC_HEAT_BARREL:
+			if (sd)
+				sc_start(bl,bl,SC_HEAT_BARREL_AFTER,100,sce->val1,skill_get_time2(RL_HEAT_BARREL, sce->val1));
+			break;
+		case SC_C_MARKER:
+			{
+				//Remove mark data from caster
+				struct map_session_data *caster = map_id2sd(temp_n);
+				uint8 i = 0;
+
+				if (!caster || !&caster->c_marker || !caster->c_marker.target)
+					break;
+				ARR_FIND(0,MAX_SKILL_CRIMSON_MARKER,i,caster->c_marker.target[i] == bl->id);
+				if (i < MAX_SKILL_CRIMSON_MARKER)
+					caster->c_marker.target[i] = 0;
+			}
+			break;
+		case SC_H_MINE:
+			{
+				//Drop the material from target if expired
+				struct item it;
+				if (temp_n)
+					break;
+				if (!itemdb_exists(skill_get_itemid(RL_H_MINE,0)))
+					break;
+				memset(&it,0,sizeof(it));
+				it.nameid = skill_get_itemid(RL_H_MINE,0);
+				it.amount = max(skill_get_itemqty(RL_H_MINE,0),1);
+				it.identify = 1;
+				map_addflooritem(&it,it.amount,bl->m,bl->x,bl->y,0,0,0,4);
+			}
+			break;
 	}
 
 	opt_flag = 1;
@@ -11107,6 +11221,7 @@ int status_change_clear_buffs (struct block_list* bl, int type)
 			case SC_CURSEDCIRCLE_TARGET:
 			case SC_PUSH_CART:
 			case SC_STYLE_CHANGE:
+			case SC_HEAT_BARREL_AFTER:
 				continue;
 
 		 //Debuffs that can be removed.

+ 20 - 7
src/map/status.h

@@ -666,6 +666,19 @@ typedef enum sc_type {
 	SC_MOONSTAR,
 	SC_SUPER_STAR,
 
+	/**
+	 * Rebellion [Cydh]
+	 **/
+	SC_HEAT_BARREL,
+	SC_HEAT_BARREL_AFTER,
+	SC_P_ALTER,
+	SC_E_CHAIN,
+	SC_C_MARKER,
+	SC_ANTI_M_BLAST,
+	SC_B_TRAP,
+	SC_H_MINE,
+	SC_QD_SHOT_READY,
+
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2,
 #endif
@@ -1497,7 +1510,7 @@ enum e_mode
 //who were not on your field of sight when it happened)
 
 //opt1: Non stackable status changes.
-enum {
+enum sc_opt1 {
 	OPT1_STONE = 1, //Petrified
 	OPT1_FREEZE,
 	OPT1_STUN,
@@ -1510,7 +1523,7 @@ enum {
 };
 
 //opt2: Stackable status changes.
-enum {
+enum sc_opt2 {
 	OPT2_POISON		= 0x0001,
 	OPT2_CURSE		= 0x0002,
 	OPT2_SILENCE		= 0x0004,
@@ -1523,7 +1536,7 @@ enum {
 };
 
 //opt3: (SHOW_EFST_*)
-enum {
+enum sc_opt3 {
 	OPT3_NORMAL		= 0x00000000,
 	OPT3_QUICKEN		= 0x00000001,
 	OPT3_OVERTHRUST		= 0x00000002,
@@ -1545,7 +1558,7 @@ enum {
 	OPT3_CONTRACT		= 0x00020000,
 };
 
-enum {
+enum e_option {
 	OPTION_NOTHING		= 0x00000000,
 	OPTION_SIGHT		= 0x00000001,
 	OPTION_HIDE		= 0x00000002,
@@ -1600,14 +1613,14 @@ enum manner_flags
 /* Status Change State Flags */
 enum scs_flag {
 	SCS_NOMOVECOND		= 0x00000001, /* cond flag for nomove */
-	SCS_NOMOVE		= 0x00000002, /* unit unable to move */
+	SCS_NOMOVE			= 0x00000002, /* unit unable to move */
 	SCS_NOPICKITEMCOND	= 0x00000004, /* cond flag for nopickitem */
 	SCS_NOPICKITEM		= 0x00000008, /* player unable to pick up items */
 	SCS_NODROPITEMCOND	= 0x00000010, /* cond flag for nodropitem */
 	SCS_NODROPITEM		= 0x00000020, /* player unable to drop items */
 	SCS_NOCASTCOND		= 0x00000040, /* cond flag for nocast */
-	SCS_NOCAST		= 0x00000080, /* unit unable to cast skills */
-	SCS_NOCHAT		= 0x00000100, /* unit can't talk */
+	SCS_NOCAST			= 0x00000080, /* unit unable to cast skills */
+	SCS_NOCHAT			= 0x00000100, /* unit can't talk */
 	SCS_NOCHATCOND		= 0x00000200, /* cond flag for notalk */
 };
 

+ 5 - 1
src/map/unit.c

@@ -1115,7 +1115,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 	}
 	else if ( target_id == src->id &&
 		skill_get_inf(skill_id)&INF_SELF_SKILL &&
-		skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF )
+		(skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF ||
+		(skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) )
 	{
 		target_id = ud->target; //Auto-select target. [Skotlex]
 		combo = 1;
@@ -1848,6 +1849,9 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, unsigned int t
 	   )
 		return 0; // can't attack under these conditions
 
+	if (sd && &sd->sc && sd->sc.count && sd->sc.data[SC_HEAT_BARREL_AFTER])
+		return 0;
+
 	if( src->m != target->m )
 	{
 		if( src->type == BL_MOB && mob_warpchase((TBL_MOB*)src, target) )