Jelajahi Sumber

Updated some skills to its RE behavior(AL_ANGELUS, RG_BACKSTAP, WZ_GRAVITATION, NJ_RAIGEKISAI).(bugreport:6342, bugreport:6336, bugreport:6339, bugreport:6331)
Added some Kagerou/Oboro skills. Special mega thanks to Judas :)
(KO_HUUMARANKA,KO_MEIKYOUSISUI,KO_ZANZOU,KO_KYOUGAKU,KO_JYUSATSU,KO_KAHU_ENTEN,KO_HYOUHU_HUBUKI,KO_KAZEHU_SEIRAN,KO_DOHU_KOUKAI)


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

rud0lp20 13 tahun lalu
induk
melakukan
9a63cdf65e

+ 2 - 0
db/pre-re/mob_db.txt

@@ -1140,3 +1140,5 @@
 //2080,CRYSTAL_L,Crystal,Crystal,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x120,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 2081,E_HYDRA,Suspicious Hydra,Strange Hydra,34,854,1,0,0,7,1,2,100,100,1,1,1,1,1,1,10,12,0,3,41,0x0,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 2082,G_PIRANHA,Piranha,Piranha,75,4522,0,0,0,1,182,223,2,10,69,45,30,30,66,35,10,12,1,5,61,0x3295,200,768,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+2308,KO_ZANZOU,Zanzou,Zanzou,1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

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

@@ -1639,6 +1639,7 @@
 //2537,5000,5000,0,60000,0,60000
 //==========================================
 
+
 //==== Kagerou & Oboro skills ==============
 //-- KO_YAMIKUMO
 3001,0,0,0,60000,0,0,0
@@ -1652,6 +1653,26 @@
 3007,0,1000,0,0,0,0,0
 //-- KO_MUCHANAGE
 3008,0,0,0,100,0,10000,0
+//-- KO_HUUMARANKA
+3009,0,3000,0,500,0,0,0
+//-- KO_MAKIBISHI
+3010,0,0,0,12000:14000:16000:18000:20000,10000,0,0
+//-- KO_MEIKYOUSISUI
+3011,3000,0,0,10000,0,0,0
+//-- KO_ZANZOU
+3012,0,0,0,27000:24000:21000:18000:15000,0,0,0
+//-- KO_KYOUGAKU
+3013,1000,0,0,12000:14000:16000:18000:20000,0,0,0
+//-- KO_JYUSATSU
+3014,1000,0,0,8000:10000:12000:14000:16000,0,0,0
+//-- KO_KAHU_ENTEN
+3015,500,0,0,300000,0,0,0
+//-- KO_HYOUHU_HUBUKI
+3016,500,0,0,300000,0,0,0
+//-- KO_KAZEHU_SEIRAN
+3017,500,0,0,300000,0,0,0
+//-- KO_DOHU_KOUKAI
+3018,500,0,0,300000,0,0,0
 //==========================================
 
 //===== Homunculus Skills ==================

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

@@ -1014,9 +1014,19 @@
 3003,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,		KO_LEFT,Left Hand Mastery
 3004,3:4:5:6:7,8,1,-1,0,0,5,-2,no,0,0,0,weapon,0,	KO_JYUMONJIKIRI,Cross Strike
 3005,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,		KO_SETSUDAN,Soul Sever
-3006,7:8:9:10:11,6,2,0,0x2,0,5,0,no,0,0,0,weapon,0,	KO_BAKURETSU,Bakuretsu Kunai
+3006,7:8:9:10:11,6,2,0,0x2,2,5,0,no,0,0,0,weapon,0,	KO_BAKURETSU,Bakuretsu Kunai
 3007,0,6,4,-1,0x42,4:4:4:4:5,5,0,no,0,0,0,misc,0,	KO_HAPPOKUNAI,Happo Kunai
-3008,9,8,2,0,0x52,0,10,-10,no,0,0,0,misc,0,	KO_MUCHANAGE,Mucha Nage
+3008,9,8,2,0,0x52,2,10,-10,no,0,0,0,misc,0,	KO_MUCHANAGE,Mucha Nage
+3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,	KO_HUUMARANKA,Huuma Shuriken Ranka 
+//3010,3,6,2,0,0x43,0,5,1,no,0,0x80,0,misc,0,	KO_MAKIBISHI,Makibishi
+3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,	KO_MEIKYOUSISUI,Meikyo Shisui
+3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,7,		KO_ZANZOU,Zanzou
+3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,		KO_KYOUGAKU,Kyougaku
+3014,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,		KO_JYUSATSU,Jyusatsu
+3015,0,6,4,3,0x1,0,1,1,no,0,0,0,none,0,		KO_KAHU_ENTEN,Kahu Enten
+3016,0,6,4,1,0x1,0,1,1,no,0,0,0,none,0,		KO_HYOUHU_HUBUKI,Hyouhu Hubuki
+3017,0,6,4,4,0x1,0,1,1,no,0,0,0,none,0,		KO_KAZEHU_SEIRAN,Kazehu Seiran
+3018,0,6,4,2,0x1,0,1,1,no,0,0,0,none,0,		KO_DOHU_KOUKAI,Dohu Koukai
 
 8001,9,6,4,0,0x1,0,5,1,no,0,0,0,magic,0,	HLIF_HEAL,Healing Touch
 8002,0,6,4,0,0x3,-1,5,1,no,0,0,0,none,0,	HLIF_AVOID,Avoid

+ 12 - 0
db/pre-re/skill_require_db.txt

@@ -785,12 +785,24 @@
 2536,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	//ALL_GUARDIAN_RECALL#Guardian's Recall#
 //2537,0,0,70: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	//ALL_ODINS_POWER#Odin's Power#
 
+//****
+// Kagerou/Oboro
 3001,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	//KO_YAMIKUMO#Yamikumo#
 3004,0,0,10:12:14:16: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	//KO_JYUMONJIKIRI#Cross Strike#
 3005,0,0,12:16:20:24: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	//KO_SETSUDAN#Soul Sever#
 3006,0,0,5:6:7:8:9,0,0,0,99,0,0,none,0,13294,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_BAKURETSU#Bakuretsu Kunai#
 3007,0,0,8:9:10:11:12,0,0,0,99,7,8,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_HAPPOKUNAI#Happo Kunai#
 3008,0,0,50,0,0,10000:20000:30000:40000:50000:60000:70000:80000:90000:100000,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	//KO_MUCHANAGE#Mucha Nage#
+3009,0,0,24:28:32:36: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	//KO_HUUMARANKA#Huuma Shuriken Ranka#
+3010,0,0,9:12:15:18:21,0,0,0,99,0,0,none,0,6493,3:4:5:6:7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_MAKIBISHI#Makibishi#
+3011,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	//KO_MEIKYOUSISUI#Meikyo Shisui#
+3012,0,0,40:44:48:52:56,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	//KO_ZANZOU#Zanzou#
+3013,0,0,40:44:48:52:56,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	//KO_KYOUGAKU#Kyougaku#
+3014,0,0,40:44:48:52:56,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	//KO_JYUSATSU#Jyusatsu#
+3015,0,0,20,0,0,0,99,0,0,none,0,6512,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_KAHU_ENTEN#Kahu Enten#
+3016,0,0,20,0,0,0,99,0,0,none,0,6513,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_HYOUHU_HUBUKI#Hyouhu Hubuki#
+3017,0,0,20,0,0,0,99,0,0,none,0,6514,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_KAZEHU_SEIRAN#Kazehu Seiran#
+3018,0,0,20,0,0,0,99,0,0,none,0,6515,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_DOHU_KOUKAI#Dohu Koukai#
 
 10010,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	//GD_BATTLEORDER##
 10011,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	//GD_REGENERATION##

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

@@ -150,6 +150,8 @@
 
 3006,0x86,    ,  0, 2, 100,enemy, 0x018	//KO_BAKURETSU
 3008,0x86,    ,  0, 2, 100,enemy, 0x018	//KO_MUCHANAGE
+3009,0x86,    ,  0, 3, 500,enemy, 0x018	//KO_HUUMARANKA
+//3010,0xfc,    ,  0, 2,1000,enemy, 0x022	//KO_MAKIBISHI
 
 8208,0x86,    ,  0, 2,1000,enemy, 0x080	//MA_SHOWER
 8209,0x90,    ,  0, 1,1000,enemy, 0x006	//MA_SKIDTRAP

+ 1 - 1
db/re/mob_db.txt

@@ -1444,7 +1444,7 @@
 2305,E_UNGOLIANT,Ungoliant,Ungoliant,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 2306,E_GOLDEN_BUG,Golden Thief Bug,Golden Thief Bug,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 2307,J_MISTRESS,Mistress,Mistress,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-2308,KO_ZANZOU,Zanzou,Zanzou,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+2308,KO_ZANZOU,Zanzou,Zanzou,1,50,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,7,20,0x0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 
 // Malaya Port
 2309,BUNGISNGIS,Bungisngis,Bungisngis,121,25513,0,1960,1650,1,851,1276,115,35,100,100,30,30,100,30,10,12,2,7,42,0x3795,200,1000,792,336,0,0,0,0,0,0,0,7054,2000,6510,1000,12700,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0

+ 22 - 2
db/re/skill_cast_db.txt

@@ -327,7 +327,7 @@
 
 //===== Rogue ==============================
 //-- RG_BACKSTAB
-212,0,500,0,0,0,0,0
+212,0,500,0,5000,0,0,0
 
 //-- RG_RAID
 214,0,0,0,5000,8000:9000:10000:11000:12000,0,0
@@ -905,7 +905,7 @@
 //-- NJ_HUUJIN
 540,1000:1500:2000:2500:3000:3500:4000:5000:5500:6000,1000,0,0,0,0,0
 //-- NJ_RAIGEKISAI
-541,4000,0,0,0,0,0,0
+541,4000,0,0,100,0,0,0
 //-- NJ_KAMAITACHI
 542,4000,0,0,0,0,0,0
 //-- NJ_NEN
@@ -1653,6 +1653,26 @@
 3007,0,1000,0,0,0,0,0
 //-- KO_MUCHANAGE
 3008,0,0,0,100,0,10000,0
+//-- KO_HUUMARANKA
+3009,0,3000,0,500,0,0,0
+//-- KO_MAKIBISHI
+3010,0,0,0,12000:14000:16000:18000:20000,10000,0,0
+//-- KO_MEIKYOUSISUI
+3011,3000,0,0,10000,0,0,0
+//-- KO_ZANZOU
+3012,0,0,0,27000:24000:21000:18000:15000,0,0,0
+//-- KO_KYOUGAKU
+3013,1000,0,0,12000:14000:16000:18000:20000,0,0,0
+//-- KO_JYUSATSU
+3014,1000,0,0,8000:10000:12000:14000:16000,0,0,0
+//-- KO_KAHU_ENTEN
+3015,500,0,0,300000,0,0,0
+//-- KO_HYOUHU_HUBUKI
+3016,500,0,0,300000,0,0,0
+//-- KO_KAZEHU_SEIRAN
+3017,500,0,0,300000,0,0,0
+//-- KO_DOHU_KOUKAI
+3018,500,0,0,300000,0,0,0
 //==========================================
 
 //===== Homunculus Skills ==================

+ 13 - 3
db/re/skill_db.txt

@@ -584,7 +584,7 @@
 538,9,6,2,1,0x1,0,10,1,yes,0,0,0,magic,0,	NJ_SUITON,Hidden Water
 539,0,6,4,1,0x2,3,5,1,yes,0,0,0,magic,0,		NJ_HYOUSYOURAKU,Ice Meteor
 540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0,	NJ_HUUJIN,Wind Blade
-541,9,6,4,4,0x2,2:2:3:3:4,5,1,yes,0,0,0,magic,0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
+541,9,6,2,4,0x2,2:2:3:3:4,5,1,yes,0,0,0,magic,0,	NJ_RAIGEKISAI,Lightning Strike of Destruction
 542,9,8,1,4,0,3,5,1,yes,0,0,5:6:7:8:9,magic,0,	NJ_KAMAITACHI,Kamaitachi
 543,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,		NJ_NEN,Soul
 544,-5,6,1,0,0x40,0,10,1,no,0,0,0,weapon,0,	NJ_ISSEN,Final Strike
@@ -1015,9 +1015,19 @@
 3003,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,		KO_LEFT,Left Hand Mastery
 3004,3:4:5:6:7,8,1,-1,0,0,5,-2,no,0,0,0,weapon,0,	KO_JYUMONJIKIRI,Cross Strike
 3005,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,		KO_SETSUDAN,Soul Sever
-3006,7:8:9:10:11,6,2,0,0x2,0,5,0,no,0,0,0,weapon,0,	KO_BAKURETSU,Bakuretsu Kunai
+3006,7:8:9:10:11,6,2,0,0x2,2,5,0,no,0,0,0,weapon,0,	KO_BAKURETSU,Bakuretsu Kunai
 3007,0,6,4,-1,0x42,4:4:4:4:5,5,0,no,0,0,0,misc,0,	KO_HAPPOKUNAI,Happo Kunai
-3008,9,8,2,0,0x52,0,10,-10,no,0,0,0,misc,0,	KO_MUCHANAGE,Mucha Nage
+3008,9,8,2,0,0x52,2,10,-10,no,0,0,0,misc,0,	KO_MUCHANAGE,Mucha Nage
+3009,9:10:11:12:13,8,2,-1,0x2,3,5,2,no,0,0,0,weapon,0,	KO_HUUMARANKA,Huuma Shuriken Ranka 
+//3010,3,6,2,0,0x43,0,5,1,no,0,0x80,0,misc,0,	KO_MAKIBISHI,Makibishi
+3011,0,6,4,0,0x1,0,5,0,yes,0,0,0,none,0,	KO_MEIKYOUSISUI,Meikyo Shisui
+3012,0,6,4,0,0x1,0,5,0,no,0,0,1,none,7,		KO_ZANZOU,Zanzou
+3013,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,		KO_KYOUGAKU,Kyougaku
+3014,5,6,1,0,0x1,0,5,0,no,0,0,0,none,0,		KO_JYUSATSU,Jyusatsu
+3015,0,6,4,3,0x1,0,1,1,no,0,0,0,none,0,		KO_KAHU_ENTEN,Kahu Enten
+3016,0,6,4,1,0x1,0,1,1,no,0,0,0,none,0,		KO_HYOUHU_HUBUKI,Hyouhu Hubuki
+3017,0,6,4,4,0x1,0,1,1,no,0,0,0,none,0,		KO_KAZEHU_SEIRAN,Kazehu Seiran
+3018,0,6,4,2,0x1,0,1,1,no,0,0,0,none,0,		KO_DOHU_KOUKAI,Dohu Koukai	
 
 8001,9,6,4,0,0x1,0,5,1,no,0,0,0,magic,0,	HLIF_HEAL,Healing Touch
 8002,0,6,4,0,0x3,-1,5,1,no,0,0,0,none,0,	HLIF_AVOID,Avoid

+ 12 - 0
db/re/skill_require_db.txt

@@ -787,12 +787,24 @@
 2536,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	//ALL_GUARDIAN_RECALL#Guardian's Recall#
 //2537,0,0,70: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	//ALL_ODINS_POWER#Odin's Power#
 
+//****
+// Kagerou/Oboro
 3001,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	//KO_YAMIKUMO#Yamikumo#
 3004,0,0,10:12:14:16: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	//KO_JYUMONJIKIRI#Cross Strike#
 3005,0,0,12:16:20:24: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	//KO_SETSUDAN#Soul Sever#
 3006,0,0,5:6:7:8:9,0,0,0,99,0,0,none,0,13294,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_BAKURETSU#Bakuretsu Kunai#
 3007,0,0,8:9:10:11:12,0,0,0,99,7,8,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_HAPPOKUNAI#Happo Kunai#
 3008,0,0,50,0,0,10000:20000:30000:40000:50000:60000:70000:80000:90000:100000,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	//KO_MUCHANAGE#Mucha Nage#
+3009,0,0,24:28:32:36: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	//KO_HUUMARANKA#Huuma Shuriken Ranka#
+3010,0,0,9:12:15:18:21,0,0,0,99,0,0,none,0,6493,3:4:5:6:7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_MAKIBISHI#Makibishi#
+3011,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	//KO_MEIKYOUSISUI#Meikyo Shisui#
+3012,0,0,40:44:48:52:56,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	//KO_ZANZOU#Zanzou#
+3013,0,0,40:44:48:52:56,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	//KO_KYOUGAKU#Kyougaku#
+3014,0,0,40:44:48:52:56,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	//KO_JYUSATSU#Jyusatsu#
+3015,0,0,20,0,0,0,99,0,0,none,0,6512,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_KAHU_ENTEN#Kahu Enten#
+3016,0,0,20,0,0,0,99,0,0,none,0,6513,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_HYOUHU_HUBUKI#Hyouhu Hubuki#
+3017,0,0,20,0,0,0,99,0,0,none,0,6514,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_KAZEHU_SEIRAN#Kazehu Seiran#
+3018,0,0,20,0,0,0,99,0,0,none,0,6515,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//KO_DOHU_KOUKAI#Dohu Koukai#
 
 10010,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	//GD_BATTLEORDER##
 10011,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	//GD_REGENERATION##

+ 4 - 1
db/re/skill_unit_db.txt

@@ -87,7 +87,7 @@
 428,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_SUN_WARM
 429,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_MOON_WARM
 430,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_STAR_WARM
-484,0xb8,    ,  2, 0,1000,enemy, 0x808	//HW_GRAVITATION
+484,0xb8,    ,  2, 0, 500,enemy, 0x808	//HW_GRAVITATION
 488,0xb9,    ,  3, 0,  -1,all,   0x200	//CG_HERMODE
 516,0x86,    ,  3, 0, 100,enemy, 0x000	//GS_DESPERADO
 521,0xbe,    ,  0, 1,1000,enemy, 0x000	//GS_GROUNDDRIFT
@@ -95,6 +95,7 @@
 527,0xbc,    , -1, 0,2000,enemy, 0x018	//NJ_TATAMIGAESHI
 535,0xbd,    , -1, 0,  20,enemy, 0x010	//NJ_KAENSIN
 538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x010	//NJ_SUITON
+541,0x86,    ,  0, 3:3:4:4:5, 100,enemy, 0x018	//NJ_RAIGEKISAI
 670,0xc7,    ,  1, 4:7:10:13:16:19:22:25:28:31,1000,all,0x008	//NPC_EVILLAND
 
 2044,0xca,    ,  0, 3,1000,all,   0x018	//AB_EPICLESIS
@@ -151,6 +152,8 @@
 
 3006,0x86,    ,  0, 2, 100,enemy, 0x018	//KO_BAKURETSU
 3008,0x86,    ,  0, 2, 100,enemy, 0x018	//KO_MUCHANAGE
+3009,0x86,    ,  0, 3, 500,enemy, 0x018	//KO_HUUMARANKA
+//3010,0xfc,    ,  0, 2,1000,enemy, 0x022	//KO_MAKIBISHI
 
 8020,0xf5,    ,  0, 3,2300:2100:1900:1700:1500,enemy,   0x018	//MH_POISON_MIST
 8033,0x7e,    ,  0, 0,  -1,all,   0x003	//MH_STEINWAND 

+ 35 - 6
src/map/battle.c

@@ -351,6 +351,19 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag
 				status_change_end(target, SC_CRYSTALIZE, INVALID_TIMER);
 		}
 	}
+	if( src->type == BL_PC || target->type == BL_PC ){
+		struct map_session_data *sd = BL_CAST(BL_PC, src);
+		struct map_session_data *tsd = BL_CAST(BL_PC, target);
+		int s, t;
+
+		ARR_FIND(1, 6, s, sd->talisman[s] > 0);
+		ARR_FIND(1, 6, t, tsd->talisman[t] > 0);
+
+		if( s < 5 && atk_elem == s )
+			ratio += sd->talisman[s] * 2; // +2% custom value
+		if( t < 5 && atk_elem == t )
+			damage -= damage * tsd->talisman[t] * 3 / 100; // -3% custom value
+	}
 	return damage*ratio/100;
 }
 
@@ -705,6 +718,10 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,struct Damag
 				status_change_end(bl, SC_KYRIE, INVALID_TIMER);
 		}
 
+		if( sc->data[SC_MEIKYOUSISUI] && rand()%100 < 40 ) // custom value
+			damage = 0;
+		
+
 		if (!damage) return 0;
 
 		if( (sce = sc->data[SC_LIGHTNINGWALK]) && flag&BF_LONG && rnd()%100 < sce->val1 ) {
@@ -1398,6 +1415,10 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 	{ //Take weapon's element
 		s_ele = sstatus->rhw.ele;
 		s_ele_ = sstatus->lhw.ele;
+		if( sd ){ //Summoning 10 talisman will endow your weapon.
+			ARR_FIND(1, 6, i, sd->talisman[i] >= 10);
+			if( i < 5) s_ele = s_ele_ = i;
+		}
 		if( flag.arrow && sd && sd->bonus.arrow_ele )
 			s_ele = sd->bonus.arrow_ele;
 		if( battle_config.attack_attr_none&src->type )
@@ -3310,9 +3331,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 		//Initialize variables that will be used afterwards
 		s_ele = skill_get_ele(skill_num, skill_lv);
 
-		if (s_ele == -1) // pl=-1 : the skill takes the weapon's element
+		if (s_ele == -1){ // pl=-1 : the skill takes the weapon's element
 			s_ele = sstatus->rhw.ele;
-		else if (s_ele == -2) //Use status element
+			if( sd ){ //Summoning 10 talisman will endow your weapon
+				ARR_FIND(1, 6, i, sd->talisman[i] > 0);
+				if( i < 5) s_ele = i;
+			}
+		}else if (s_ele == -2) //Use status element
 			s_ele = status_get_attack_sc_element(src,status_get_sc(src));
 		else if( s_ele == -3 ) //Use random element
 			s_ele = rnd()%ELE_MAX;
@@ -4173,6 +4198,9 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
 			md.damage -= totaldef;
 		}
 		break;
+	case KO_MAKIBISHI:
+		md.damage = 20 * skill_lv;
+		break;
 	}
 
 	if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets
@@ -4928,9 +4956,9 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 			}
 			break;
 		case BL_MOB:
-			if((((TBL_MOB*)target)->special_state.ai == 2 || //Marine Spheres
+			if(((((TBL_MOB*)target)->special_state.ai == 2 || //Marine Spheres
 				(((TBL_MOB*)target)->special_state.ai == 3 && battle_config.summon_flora&1)) && //Floras
-				s_bl->type == BL_PC && src->type != BL_MOB)
+				s_bl->type == BL_PC && src->type != BL_MOB) || ((TBL_MOB*)target)->special_state.ai == 4) //Zanzoe
 			{	//Targettable by players
 				state |= BCT_ENEMY;
 				strip_enemy = 0;
@@ -5094,8 +5122,9 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 				return 0; // Disable guardians/emperium owned by Guilds on non-woe times.
 
 			if( !md->special_state.ai )
-			{ //Normal mobs.
-				if( t_bl->type == BL_MOB && !((TBL_MOB*)t_bl)->special_state.ai )
+			{ //Normal mobs
+				if( (target->type == BL_MOB && t_bl->type == BL_PC && ((TBL_MOB*)target)->special_state.ai < 4) ||
+					( t_bl->type == BL_MOB && !((TBL_MOB*)t_bl)->special_state.ai ) )
 					state |= BCT_PARTY; //Normal mobs with no ai are friends.
 				else
 					state |= BCT_ENEMY; //However, all else are enemies.

+ 42 - 2
src/map/clif.c

@@ -1255,6 +1255,18 @@ static void clif_spiritball_single(int fd, struct map_session_data *sd)
 	WFIFOSET(fd, packet_len(0x1e1));
 }
 
+/*==========================================
+ * Kagerou/Oboro amulet spirit
+ *------------------------------------------*/
+static void clif_talisman_single(int fd, struct map_session_data *sd, short type)
+{
+	WFIFOHEAD(fd, packet_len(0x08cf));
+	WFIFOW(fd,0)=0x08cf;
+	WFIFOL(fd,2)=sd->bl.id;
+	WFIFOW(fd,6)=type;
+	WFIFOW(fd,8)=sd->talisman[type];
+	WFIFOSET(fd, packet_len(0x08cf));
+}
 
 /*==========================================
  * Run when player changes map / refreshes
@@ -1348,6 +1360,7 @@ int clif_spawn(struct block_list *bl)
 	case BL_PC:
 		{
 			TBL_PC *sd = ((TBL_PC*)bl);
+			int i;
 			if (sd->spiritball > 0)
 				clif_spiritball(sd);
 			if(sd->state.size==2) // tiny/big players [Valaris]
@@ -1360,6 +1373,10 @@ int clif_spawn(struct block_list *bl)
 				//New Mounts are not complaint to the original method, so we gotta tell this guy that he is mounting.
 				clif_status_load_notick(&sd->bl,SI_ALL_RIDING,2,1,0,0);
 			}
+			for(i = 1; i < 5; i++){
+				if( sd->talisman[i] > 0 )
+					clif_talisman(sd, i);
+			}
 		#ifdef NEW_CARTS
 			if( sd->sc.data[SC_PUSH_CART] )
 				clif_status_load_notick(&sd->bl, SI_ON_PUSH_CART, 2, sd->sc.data[SC_PUSH_CART]->val1, 0, 0);
@@ -4031,6 +4048,10 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d
 
 	if(dstsd->spiritball > 0)
 		clif_spiritball_single(sd->fd, dstsd);
+	for(i = 1; i < 5; i++){
+		if( dstsd->talisman[i] > 0 )
+			clif_talisman_single(sd->fd, dstsd, i);
+	}
 	if( dstsd->sc.option&OPTION_MOUNTING ) {
 		//New Mounts are not complaint to the original method, so we gotta tell this guy that I'm mounting.
 		clif_status_load_single(sd->fd,dstsd->bl.id,SI_ALL_RIDING,2,1,0,0);
@@ -8195,6 +8216,7 @@ void clif_message(struct block_list* bl, const char* msg)
 // refresh the client's screen, getting rid of any effects
 void clif_refresh(struct map_session_data *sd)
 {
+	int i;
 	nullpo_retv(sd);
 
 	clif_changemap(sd,sd->mapindex,sd->bl.x,sd->bl.y);
@@ -8213,6 +8235,10 @@ void clif_refresh(struct map_session_data *sd)
 	clif_updatestatus(sd,SP_LUK);
 	if (sd->spiritball)
 		clif_spiritball_single(sd->fd, sd);
+	for(i = 1; i < 5; i++){
+		if( sd->talisman[i] > 0 )
+			clif_talisman_single(sd->fd, sd, i);
+	}
 	if (sd->vd.cloth_color)
 		clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF);
 	if(merc_is_hom_active(sd->hd))
@@ -16123,7 +16149,21 @@ void clif_parse_SkillSelectMenu(int fd, struct map_session_data *sd) {
 	skill_select_menu(sd,RFIFOL(fd,2),RFIFOW(fd,6));
 	clif_menuskill_clear(sd);
 }
+/*==========================================
+ * Kagerou/Oboro amulet spirit
+ *------------------------------------------*/
+void clif_talisman(struct map_session_data *sd,short type)
+{
+	unsigned char buf[8];
+
+	nullpo_retv(sd);
 
+	WBUFW(buf,0)=0x08cf;
+	WBUFL(buf,2)=sd->bl.id;
+	WBUFW(buf,6)=type;
+	WBUFW(buf,8)=sd->talisman[type];
+	clif_send(buf,packet_len(0x08cf),&sd->bl,AREA);
+}
 /// Move Item from or to Personal Tab (CZ_WHATSOEVER) [FE]
 /// 0907 <index>.W
 ///
@@ -16549,7 +16589,7 @@ static int packetdb_readdb(void)
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	//#0x08C0
-		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -16557,7 +16597,7 @@ static int packetdb_readdb(void)
 		0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,		
+		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,	
 	};
 	struct {
 		void (*func)(int, struct map_session_data *);

+ 2 - 0
src/map/clif.h

@@ -736,6 +736,8 @@ int clif_skill_itemlistwindow( struct map_session_data *sd, int skill_id, int sk
 void clif_elemental_info(struct map_session_data *sd);
 void clif_elemental_updatestatus(struct map_session_data *sd, int type);
 
+void clif_talisman(struct map_session_data *sd, short type);
+
 /**
  * Color Table
  **/

+ 1 - 0
src/map/map.c

@@ -1707,6 +1707,7 @@ int map_quit(struct map_session_data *sd) {
 			status_change_end(&sd->bl, SC_ENDURE, INVALID_TIMER); //No need to save infinite endure.
 		status_change_end(&sd->bl, SC_WEIGHT50, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_WEIGHT90, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_KYOUGAKU, 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);

+ 3 - 2
src/map/mob.h

@@ -36,7 +36,7 @@
 #define MOB_CLONE_END MAX_MOB_DB
 
 //Used to determine default enemy type of mobs (for use in eachinrange calls)
-#define DEFAULT_ENEMY_TYPE(md) (md->special_state.ai?BL_CHAR:BL_PC|BL_HOM|BL_MER)
+#define DEFAULT_ENEMY_TYPE(md) (md->special_state.ai?BL_CHAR:BL_MOB|BL_PC|BL_HOM|BL_MER)
 
 //Externals for the status effects. [Epoque]
 extern const int mob_manuk[8];
@@ -121,11 +121,12 @@ struct mob_data {
 	char name[NAME_LENGTH];
 	struct {
 		unsigned int size : 2; //Small/Big monsters.
-		unsigned int ai : 2; //Special ai for summoned monsters.
+		unsigned int ai : 3; //Special ai for summoned monsters.
 							//0: Normal mob.
 							//1: Standard summon, attacks mobs.
 							//2: Alchemist Marine Sphere
 							//3: Alchemist Summon Flora
+							//4: Summon Zanzou
 		unsigned int clone : 1;/* is clone? 1:0 */
 	} special_state; //Special mob information that does not needs to be zero'ed on mob respawn.
 	struct {

+ 112 - 0
src/map/pc.c

@@ -878,6 +878,8 @@ int pc_isequip(struct map_session_data *sd,int n)
 			return 0;
 		if(item->equip & EQP_ACC && sd->sc.data[SC__STRIPACCESSORY])
 			return 0;
+		if(item->equip && sd->sc.data[SC_KYOUGAKU])
+			return 0;
 
 		if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SUPERNOVICE) {
 			//Spirit of Super Novice equip bonuses. [Skotlex]
@@ -6382,6 +6384,9 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 	if ( sd && sd->spiritball )
 		pc_delspiritball(sd,sd->spiritball,0);
 
+	for(i = 1; i < 5; i++)
+		pc_del_talisman(sd, sd->talisman[i], i);
+
 	if (src)
 	switch (src->type) {
 	case BL_MOB:
@@ -8237,6 +8242,12 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag)
 		return 0;
 	}
 
+	if( !(flag&2) && sd->sc.count && sd->sc.data[SC_KYOUGAKU] )
+	{
+		clif_unequipitemack(sd,n,0,0);
+		return 0;
+	}
+
 	if(battle_config.battle_log)
 		ShowInfo("unequip %d %x:%x\n",n,pc_equippoint(sd,n),sd->status.inventory[n].equip);
 
@@ -8846,6 +8857,106 @@ bool pc_should_log_commands(struct map_session_data *sd)
 	return pc_group_should_log_commands(pc_get_group_id(sd));
 }
 
+static int pc_talisman_timer(int tid, unsigned int tick, int id, intptr_t data)
+{
+	struct map_session_data *sd;
+	int i, type;
+
+	if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
+		return 1;
+
+	ARR_FIND(1, 5, type, sd->talisman[type] > 0);
+
+	if( sd->talisman[type] <= 0 )
+	{
+		ShowError("pc_talisman_timer: %d talisman's available. (aid=%d cid=%d tid=%d)\n", sd->talisman[type], sd->status.account_id, sd->status.char_id, tid);
+		sd->talisman[type] = 0;
+		return 0;
+	}
+
+	ARR_FIND(0, sd->talisman[type], i, sd->talisman_timer[type][i] == tid);
+	if( i == sd->talisman[type] )
+	{
+		ShowError("pc_talisman_timer: timer not found (aid=%d cid=%d tid=%d)\n", sd->status.account_id, sd->status.char_id, tid);
+		return 0;
+	}
+
+	sd->talisman[type]--;
+	if( i != sd->talisman[type] )
+		memmove(sd->talisman_timer[type]+i, sd->talisman_timer[type]+i+1, (sd->talisman[type]-i)*sizeof(int));
+	sd->talisman_timer[type][sd->talisman[type]] = INVALID_TIMER;
+
+	clif_talisman(sd, type);
+
+	return 0;
+}
+
+int pc_add_talisman(struct map_session_data *sd,int interval,int max,int type)
+{
+	int tid, i;
+
+	nullpo_ret(sd);
+
+	if(max > 10)
+		max = 10;
+	if(sd->talisman[type] < 0)
+		sd->talisman[type] = 0;
+
+	if( sd->talisman[type] && sd->talisman[type] >= max )
+	{
+		if(sd->talisman_timer[type][0] != INVALID_TIMER)
+			delete_timer(sd->talisman_timer[type][0],pc_talisman_timer);
+		sd->talisman[type]--;
+		if( sd->talisman[type] != 0 )
+			memmove(sd->talisman_timer[type]+0, sd->talisman_timer[type]+1, (sd->talisman[type])*sizeof(int));
+		sd->talisman_timer[type][sd->talisman[type]] = INVALID_TIMER;
+	}
+
+	tid = add_timer(gettick()+interval, pc_talisman_timer, sd->bl.id, 0);
+	ARR_FIND(0, sd->talisman[type], i, sd->talisman_timer[type][i] == INVALID_TIMER || DIFF_TICK(get_timer(tid)->tick, get_timer(sd->talisman_timer[type][i])->tick) < 0);
+	if( i != sd->talisman[type] )
+		memmove(sd->talisman_timer[type]+i+1, sd->talisman_timer[type]+i, (sd->talisman[type]-i)*sizeof(int));
+	sd->talisman_timer[type][i] = tid;
+	sd->talisman[type]++;
+
+	clif_talisman(sd, type);
+	return 0;
+}
+
+int pc_del_talisman(struct map_session_data *sd,int count,int type)
+{
+	int i;
+
+	nullpo_ret(sd);
+
+	if( sd->talisman[type] <= 0 ) {
+		sd->talisman[type] = 0;
+		return 0;
+	}
+
+	if( count <= 0 )
+		return 0;
+	if( count > sd->talisman[type] )
+		count = sd->talisman[type];
+	sd->talisman[type] -= count;
+	if( count > 10 )
+		count = 10;
+
+	for(i = 0; i < count; i++) {
+		if(sd->talisman_timer[type][i] != INVALID_TIMER) {
+			delete_timer(sd->talisman_timer[type][i],pc_talisman_timer);
+			sd->talisman_timer[type][i] = INVALID_TIMER;
+		}
+	}
+	for(i = count; i < 10; i++) {
+		sd->talisman_timer[type][i-count] = sd->talisman_timer[type][i];
+		sd->talisman_timer[type][i] = INVALID_TIMER;
+	}
+
+	clif_talisman(sd, type);
+	return 0;
+}
+
 int pc_split_str(char *str,char **val,int num)
 {
 	int i;
@@ -9262,6 +9373,7 @@ int do_init_pc(void) {
 	add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
 	add_timer_func_list(pc_follow_timer, "pc_follow_timer");
 	add_timer_func_list(pc_endautobonus, "pc_endautobonus");
+	add_timer_func_list(pc_talisman_timer, "pc_talisman_timer");
 
 	add_timer(gettick() + autosave_interval, pc_autosave, 0, 0);
 

+ 5 - 0
src/map/pc.h

@@ -332,6 +332,8 @@ struct map_session_data {
 
 	short spiritball, spiritball_old;
 	int spirit_timer[MAX_SKILL_LEVEL];
+	short talisman[5];
+	int talisman_timer[5][10];
 
 	unsigned char potion_success_counter; //Potion successes in row counter
 	unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
@@ -918,4 +920,7 @@ void pc_itemcd_do(struct map_session_data *sd, bool load);
 
 int pc_load_combo(struct map_session_data *sd);
 
+int pc_add_talisman(struct map_session_data *sd,int interval,int max,int type);
+int pc_del_talisman(struct map_session_data *sd,int count,int type);
+
 #endif /* _PC_H_ */

+ 90 - 6
src/map/skill.c

@@ -953,6 +953,10 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 
 #ifdef RENEWAL
 		sc_start(bl,SC_RAID,100,7,5000);
+		break;
+
+	case RG_BACKSTAP:
+		sc_start(bl,SC_STUN,(5+2*skilllv),skilllv,skill_get_time(skillid,skilllv));
 #endif
 		break;
 
@@ -1345,6 +1349,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case KO_JYUMONJIKIRI: // needs more info
 		sc_start(bl,SC_JYUMONJIKIRI,25,skilllv,skill_get_time(skillid,skilllv));
 		break;
+	case KO_MAKIBISHI:
+		sc_start(bl, SC_STUN, 100, skilllv, skill_get_time2(skillid,skilllv)); 
+		break;
 	}
 
 	if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai)
@@ -3663,6 +3670,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	case MH_LAVA_SLIDE:
 	case KO_HAPPOKUNAI:
 	case KO_HUUMARANKA:
+	case KO_MUCHANAGE:
+	case KO_BAKURETSU:
 		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
@@ -5163,7 +5172,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 	case SR_CRESCENTELBOW:
 	case SR_LIGHTNINGWALK:
 	case SR_GENTLETOUCH_ENERGYGAIN:
-	case GN_CARTBOOST:			
+	case GN_CARTBOOST:	
+	case KO_MEIKYOUSISUI:
 		clif_skill_nodamage(src,bl,skillid,skilllv,
 			sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
 		break;
@@ -8660,7 +8670,57 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 			}
 		}
 		break;
-			
+
+	case KO_KAHU_ENTEN:
+	case KO_HYOUHU_HUBUKI:
+	case KO_KAZEHU_SEIRAN:
+	case KO_DOHU_KOUKAI:
+		if(sd) {
+			int ttype = skill_get_ele(skillid, skilllv);
+			clif_skill_nodamage(src, bl, skillid, skilllv, 1);
+			pc_add_talisman(sd, skill_get_time(skillid, skilllv), 10, ttype);
+		}
+		break;
+
+	case KO_ZANZOU:
+		if(sd){
+			struct mob_data *md;
+
+			md = mob_once_spawn_sub(src, src->m, src->x, src->y, status_get_name(src), 2308, "");
+			if( md )
+			{
+				md->master_id = src->id;
+				md->special_state.ai = 4;
+				if( md->deletetimer != INVALID_TIMER )
+					delete_timer(md->deletetimer, mob_timer_delete);
+				md->deletetimer = add_timer (gettick() + skill_get_time(skillid, skilllv), mob_timer_delete, md->bl.id, 0);
+				mob_spawn( md );
+				pc_setinvincibletimer(sd,500);// unlock target lock
+				clif_skill_nodamage(src,bl,skillid,skilllv,1);
+				skill_blown(src,bl,skill_get_blewcount(skillid,skilllv),unit_getdir(bl),0);
+			}
+		}
+		break;	
+
+	case KO_KYOUGAKU:
+		if( dstsd && tsc && !tsc->data[type] && rand()%100 < tstatus->int_/2 ){
+			clif_skill_nodamage(src,bl,skillid,skilllv,
+				sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
+		}else if( sd )
+			clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
+		break;
+
+	case KO_JYUSATSU:
+		if( dstsd && tsc && !tsc->data[type] && rand()%100 < tstatus->int_/2 ){
+			clif_skill_nodamage(src,bl,skillid,skilllv,
+				status_change_start(bl,type,10000,skilllv,0,0,0,skill_get_time(skillid,skilllv),1));
+			status_zap(bl, tstatus->max_hp*skilllv*5/100 , 0);
+			if( status_get_lv(bl) <= status_get_lv(src) )
+				status_change_start(bl,SC_COMA,10,skilllv,0,src->id,0,0,0);
+		}else if( sd )
+			clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
+		break;
+
 	default:
 		if( skillid >= HM_SKILLBASE && skillid <= HM_SKILLBASE + MAX_HOMUNSKILL ) {
 			if( src->type == BL_HOM && ((TBL_HOM*)src)->master->fd )
@@ -9383,6 +9443,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 	case KO_HUUMARANKA:
 	case KO_MUCHANAGE:
 	case KO_BAKURETSU:
+	//case KO_MAKIBISHI:
 		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,skillid,skilllv,x,y,0);
@@ -10961,8 +11022,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 				default:
 					skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 			}
-			if( skill_get_unit_interval(sg->skill_id) >= skill_get_time(sg->skill_id,sg->skill_lv) )
-				sg->unit_id = UNT_USED_TRAPS;
 			break;
 
 		case UNT_FIREPILLAR_WAITING:
@@ -11050,6 +11109,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 		case UNT_FLASHER:
 		case UNT_FREEZINGTRAP:
 		case UNT_FIREPILLAR_ACTIVE:
+		case UNT_MAKIBISHI:
 			map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
 			if (sg->unit_id != UNT_FIREPILLAR_ACTIVE)
 				clif_changetraplook(&src->bl, sg->unit_id==UNT_LANDMINE?UNT_FIREPILLAR_ACTIVE:UNT_USED_TRAPS);
@@ -11817,7 +11877,7 @@ static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list
 	skill=va_arg(ap,int);
 	c=va_arg(ap,int *);
 
-	if( md->master_id != src_id || md->special_state.ai != (unsigned)(skill == AM_SPHEREMINE?2:3) )
+	if( md->master_id != src_id || md->special_state.ai != (unsigned)(skill == AM_SPHEREMINE?2:skill == KO_ZANZOU?4:3) )
 		return 0; //Non alchemist summoned mobs have nothing to do here.
 
 	if(md->class_==mob_class)
@@ -12460,7 +12520,20 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh
 				clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
-			break;			
+			break;	
+		case KO_KAHU_ENTEN:
+		case KO_HYOUHU_HUBUKI:
+		case KO_KAZEHU_SEIRAN:
+		case KO_DOHU_KOUKAI:
+			{ 
+				int ttype = skill_get_ele(skill, lv);
+				ARR_FIND(1, 5, i, sd->talisman[i] > 0 && i != ttype);
+				if( (i < 5 && i != ttype) || sd->talisman[ttype] >= 10 ){
+					clif_skill_fail(sd, skill, USESKILL_FAIL_LEVEL, 0);
+					return 0;
+				}
+			}
+			break;
 	}
 
 	switch(require.state) {
@@ -12722,6 +12795,17 @@ int skill_check_condition_castend(struct map_session_data* sd, short skill, shor
 			}
 		}
 		break;
+	case KO_ZANZOU:
+		{
+			int c = 0;
+			i = map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, 2308, skill, &c);
+			if( c >= skill_get_maxcount(skill,lv) || c != i)
+			{
+				clif_skill_fail(sd , skill, USESKILL_FAIL_LEVEL, 0);
+				return 0;
+			}
+		}
+		break;
 	}
 
 	status = &sd->battle_status;

+ 60 - 5
src/map/status.c

@@ -286,7 +286,10 @@ void initChangeTables(void) {
 	set_sc( NPC_HALLUCINATION    , SC_HALLUCINATION   , SI_HALLUCINATION   , SCB_NONE );
 	add_sc( NPC_REBIRTH          , SC_REBIRTH         );
 	add_sc( RG_RAID              , SC_STUN            );
+#ifdef RENEWAL
 	add_sc( RG_RAID              , SC_RAID            );
+	add_sc( RG_BACKSTAP          , SC_STUN            );
+#endif
 	set_sc( RG_STRIPWEAPON       , SC_STRIPWEAPON     , SI_STRIPWEAPON     , SCB_WATK );
 	set_sc( RG_STRIPSHIELD       , SC_STRIPSHIELD     , SI_STRIPSHIELD     , SCB_DEF );
 	set_sc( RG_STRIPARMOR        , SC_STRIPARMOR      , SI_STRIPARMOR      , SCB_VIT );
@@ -705,9 +708,14 @@ void initChangeTables(void) {
 	set_sc( EL_UPHEAVAL        , SC_UPHEAVAL_OPTION      , SI_UPHEAVAL_OPTION      , SCB_NONE );
 	set_sc( EL_TIDAL_WEAPON    , SC_TIDAL_WEAPON_OPTION  , SI_TIDAL_WEAPON_OPTION  , SCB_ALL );
 	set_sc( EL_ROCK_CRUSHER    , SC_ROCK_CRUSHER         , SI_ROCK_CRUSHER         , SCB_DEF );
-	set_sc( EL_ROCK_CRUSHER_ATK, SC_ROCK_CRUSHER_ATK     , SI_ROCK_CRUSHER_ATK     , SCB_SPEED );	
+	set_sc( EL_ROCK_CRUSHER_ATK, SC_ROCK_CRUSHER_ATK     , SI_ROCK_CRUSHER_ATK     , SCB_SPEED );
+
 	add_sc( KO_YAMIKUMO			, SC_HIDING		  );
 	set_sc( KO_JYUMONJIKIRI		, SC_JYUMONJIKIRI		 , SI_KO_JYUMONJIKIRI	   , SCB_NONE );
+	add_sc( KO_MAKIBISHI	    , SC_STUN		  );
+	set_sc( KO_MEIKYOUSISUI		, SC_MEIKYOUSISUI		 , SI_MEIKYOUSISUI		   , SCB_NONE );
+	set_sc( KO_KYOUGAKU			, SC_KYOUGAKU			 , SI_KYOUGAKU			   , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK );
+	add_sc( KO_JYUSATSU			, SC_CURSE		  );
 	
 	add_sc( MH_STAHL_HORN		 , SC_STUN            );
 	set_sc( MH_ANGRIFFS_MODUS	 , SC_ANGRIFFS_MODUS  , SI_ANGRIFFS_MODUS	, SCB_BATK|SCB_WATK|SCB_DEF|SCB_FLEE );
@@ -985,7 +993,8 @@ void initChangeTables(void) {
 	StatusChangeStateTable[SC_CRYSTALIZE]          |= SCS_NOMOVE|SCS_NOMOVECOND;
 	StatusChangeStateTable[SC_NETHERWORLD]         |= SCS_NOMOVE;
 	StatusChangeStateTable[SC_CAMOUFLAGE]          |= SCS_NOMOVE|SCS_NOMOVECOND;
-	
+	StatusChangeStateTable[SC_MEIKYOUSISUI]		   |= SCS_NOMOVE;
+		
 	/* StatusChangeState (SCS_) NOPICKUPITEMS */
 	StatusChangeStateTable[SC_HIDING]              |= SCS_NOPICKITEM;
 	StatusChangeStateTable[SC_CLOAKING]            |= SCS_NOPICKITEM;
@@ -1895,7 +1904,7 @@ void status_calc_misc(struct block_list *bl, struct status_data *status, int lev
 #ifdef RENEWAL // renewal formulas
 	status->hit += level + status->dex + status->luk/3 + 175; //base level + ( every 1 dex = +1 hit ) + (every 3 luk = +1 hit) + 175
 	status->flee += level + status->agi + status->luk/5 + 100; //base level + ( every 1 agi = +1 flee ) + (every 5 luk = +1 flee) + 100
-	status->def2 += (int)(((float)level + status->vit)/2 + ((float)status->agi/5)); //base level + (every 2 agi = +1 def) + (every 5 agi = +1 def)
+	status->def2 += (int)(((float)level + status->vit)/2 + ((float)status->agi/5)); //base level + (every 2 vit = +1 def) + (every 5 agi = +1 def)
 	status->mdef2 += (int)(status->int_ + ((float)level/4) + ((float)status->dex/5) + ((float)status->vit/5)); //(every 4 base level = +1 mdef) + (every 1 int = +1 mdef) + (every 5 dex = +1 mdef) + (every 5 vit = +1 mdef)
 #else
 	status->hit += level + status->dex;
@@ -2009,6 +2018,8 @@ int status_calc_mob_(struct mob_data* md, bool first)
 		{	// different levels of HP according to skill level
 			if (ud->skillid == AM_SPHEREMINE) {
 				status->max_hp = 2000 + 400*ud->skilllv;
+			} else if(ud->skillid == KO_ZANZOU){
+				status->max_hp = 3000 + 3000 * ud->skilllv;
 			} else { //AM_CANNIBALIZE
 				status->max_hp = 1500 + 200*ud->skilllv + 10*status_get_lv(mbl);
 				status->mode|= MD_CANATTACK|MD_AGGRESSIVE;
@@ -4054,6 +4065,8 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang
 		str += sc->data[SC_INSPIRATION]->val3;
 	if(sc->data[SC_STOMACHACHE])
 		str -= sc->data[SC_STOMACHACHE]->val1;
+	if(sc->data[SC_KYOUGAKU])
+		str -= sc->data[SC_KYOUGAKU]->val2;
 
 	return (unsigned short)cap_value(str,0,USHRT_MAX);
 }
@@ -4103,7 +4116,8 @@ static unsigned short status_calc_agi(struct block_list *bl, struct status_chang
 		agi += sc->data[SC_INSPIRATION]->val3;
 	if(sc->data[SC_STOMACHACHE])
 		agi -= sc->data[SC_STOMACHACHE]->val1;
-
+	if(sc->data[SC_KYOUGAKU])
+		agi -= sc->data[SC_KYOUGAKU]->val2;
 
 	return (unsigned short)cap_value(agi,0,USHRT_MAX);
 }
@@ -4145,6 +4159,8 @@ static unsigned short status_calc_vit(struct block_list *bl, struct status_chang
 		vit += sc->data[SC_INSPIRATION]->val3;
 	if(sc->data[SC_STOMACHACHE])
 		vit -= sc->data[SC_STOMACHACHE]->val1;
+	if(sc->data[SC_KYOUGAKU])
+		vit -= sc->data[SC_KYOUGAKU]->val2;
 
 	return (unsigned short)cap_value(vit,0,USHRT_MAX);
 }
@@ -4196,6 +4212,8 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang
 		int_ += sc->data[SC_INSPIRATION]->val3;
 	if(sc->data[SC_STOMACHACHE])
 		int_ -= sc->data[SC_STOMACHACHE]->val1;
+	if(sc->data[SC_KYOUGAKU])
+		int_ -= sc->data[SC_KYOUGAKU]->val2;
 
 	return (unsigned short)cap_value(int_,0,USHRT_MAX);
 }
@@ -4247,6 +4265,8 @@ static unsigned short status_calc_dex(struct block_list *bl, struct status_chang
 		dex += sc->data[SC_INSPIRATION]->val3;
 	if(sc->data[SC_STOMACHACHE])
 		dex -= sc->data[SC_STOMACHACHE]->val1;
+	if(sc->data[SC_KYOUGAKU])
+		dex -= sc->data[SC_KYOUGAKU]->val2;
 
 	return (unsigned short)cap_value(dex,0,USHRT_MAX);
 }
@@ -4290,7 +4310,8 @@ static unsigned short status_calc_luk(struct block_list *bl, struct status_chang
 		luk -= sc->data[SC_STOMACHACHE]->val1;
 	if(sc->data[SC_BANANA_BOMB])
 		luk -= luk * sc->data[SC_BANANA_BOMB]->val1 / 100;
-
+	if(sc->data[SC_KYOUGAKU])
+		luk -= sc->data[SC_KYOUGAKU]->val2;
 
 	return (unsigned short)cap_value(luk,0,USHRT_MAX);
 }
@@ -4736,8 +4757,13 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change
 		return 0;
 	if(sc->data[SC_SUN_COMFORT])
 		def2 += sc->data[SC_SUN_COMFORT]->val2;
+
 	if(sc->data[SC_ANGELUS])
+#ifdef RENEWAL //in renewal only the VIT stat bonus is boosted by angelus
+		def2 += status_get_vit(bl) / 2 * sc->data[SC_ANGELUS]->val2/100;
+#else
 		def2 += def2 * sc->data[SC_ANGELUS]->val2/100;
+#endif
 	if(sc->data[SC_CONCENTRATION])
 		def2 -= def2 * sc->data[SC_CONCENTRATION]->val4/100;
 	if(sc->data[SC_POISON])
@@ -6063,6 +6089,9 @@ int status_get_sc_def(struct block_list *bl, enum sc_type type, int rate, int ti
 	case SC_MANDRAGORA:
 		sc_def = (status->vit+status->luk)/5;
 		break;
+	case SC_KYOUGAKU:
+		tick -= 30*status->int_;
+		break;
 	default:
 		//Effect that cannot be reduced? Likely a buff.
 		if (!(rnd()%10000 < rate))
@@ -6696,6 +6725,14 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 	case SC_FIGHTINGSPIRIT:
 		status_change_end(bl, type, INVALID_TIMER); // Remove previous one.
 		break;
+	case SC_MARSHOFABYSS:
+		status_change_end(bl, SC_INCAGI, INVALID_TIMER);
+		status_change_end(bl, SC_WINDWALK, INVALID_TIMER);
+		status_change_end(bl, SC_ASPDPOTION0, INVALID_TIMER);
+		status_change_end(bl, SC_ASPDPOTION1, INVALID_TIMER);
+		status_change_end(bl, SC_ASPDPOTION2, INVALID_TIMER);
+		status_change_end(bl, SC_ASPDPOTION3, INVALID_TIMER);
+		break;
 	case SC_SWINGDANCE:
 	case SC_SYMPHONYOFLOVER:
 	case SC_MOONLITSERENADE:
@@ -7847,6 +7884,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			break;
 		case SC_ELECTRICSHOCKER:
 		case SC_CRYSTALIZE:
+		case SC_MEIKYOUSISUI:
 			val4 = tick / 1000;
 			if( val4 < 1 )
 				val4 = 1;
@@ -8219,6 +8257,10 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			val4 = tick / 10000;
 			tick_time = 10000; // [GodLesZ] tick time
 			break;
+		case SC_KYOUGAKU:
+			val2 = 2*val1 + rand()%val1;
+			clif_status_change(bl,SI_ACTIVE_MONSTER_TRANSFORM,1,0,1002,0,0); // Temporarily shows Poring need official [malufett]
+			break;
 
 		default:
 			if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == 0 && StatusIconChangeTable[type] == 0 )
@@ -8275,6 +8317,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 		case SC_CURSEDCIRCLE_TARGET:
 		case SC_FEAR:
 		case SC_NETHERWORLD:
+		case SC_MEIKYOUSISUI:
 			unit_stop_walking(bl,1);
 		break;
 		case SC_HIDING:
@@ -9139,6 +9182,10 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 				}
 			}
 			break;
+		case SC_KYOUGAKU:
+			clif_status_load(bl, SI_KYOUGAKU, 0); // Avoid client crash
+			clif_status_load(bl, SI_ACTIVE_MONSTER_TRANSFORM, 0);
+			break;
 		}
 
 	opt_flag = 1;
@@ -10142,6 +10189,14 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 		/* they only end by status_change_end */
 		sc_timer_next(600000 + tick, status_change_timer, bl->id, data);
 		return 0;
+	case SC_MEIKYOUSISUI:
+		if( --(sce->val4) > 0 )
+		{ 
+			status_heal(bl, status->max_hp * (sce->val1+1) / 100, status->max_sp * sce->val1 / 100, 0);
+			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
+			return 0;
+		}
+		break;
 	}
 
 	// default for all non-handled control paths is to end the status

+ 3 - 0
src/map/unit.c

@@ -2231,6 +2231,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
 		case BL_PC:
 		{
 			struct map_session_data *sd = (struct map_session_data*)bl;
+			int i;
 
 			if( status_isdead(bl) )
 				pc_setrestartvalue(sd,2);
@@ -2253,6 +2254,8 @@ int unit_free(struct block_list *bl, clr_type clrtype)
 			pc_cleareventtimer(sd);
 			pc_inventory_rental_clear(sd);
 			pc_delspiritball(sd,sd->spiritball,1);
+			for(i = 1; i < 5; i++)
+				pc_del_talisman(sd, sd->talisman[i], i);
 
 			if( sd->reg ) {	//Double logout already freed pointer fix... [Skotlex]
 				aFree(sd->reg);