Browse Source

Hello World. Initial support for the new homunculus has been added, credits to brAthena for the base. Not all skills are yet supported, when a non-supported skill is used rather than the usual warning in the console you'll get a red-coloured message in-game "this skill is not yet supported". please step by our bug tracker should you step by any bugs. thank you very much, you're a great crowd.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16381 54d463be-8e91-2dee-dedb-b68131a5f0ec
shennetsind 13 năm trước cách đây
mục cha
commit
24e655bd3c

+ 31 - 0
db/homun_skill_tree.txt

@@ -85,3 +85,34 @@
 6016,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
 6016,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
 6016,8016,3,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
+//Eira
+6048,8022,5,0,0,0,0,0,0,0,0,0,0 	//MH_LIGHT_OF_REGENE
+6048,8023,5,0,0,0,0,0,0,0,0,0,0 	//MH_OVERED_BOOST
+6048,8024,5,0,0,0,0,0,0,0,0,0,0 	//MH_ERASER_CUTTER
+6048,8025,5,0,0,0,0,0,0,0,0,0,0 	//MH_XENO_SLASHER
+6048,8026,5,0,0,0,0,0,0,0,0,0,0 	//MH_SILENT_BREEZE
+//Bayeri
+6049,8031,5,0,0,0,0,0,0,0,0,0,0 	//MH_STAHL_HORN
+6049,8032,5,0,0,0,0,0,0,0,0,0,0 	//MH_GOLDENE_FERSE
+6049,8033,5,0,0,0,0,0,0,0,0,0,0 	//MH_STEINWAND
+//Sera
+6050,8018,5,0,0,0,0,0,0,0,0,0,0 	//MH_SUMMON_LEGION
+6050,8019,5,0,0,0,0,0,0,0,0,0,0 	//MH_NEEDLE_OF_PARALYZE
+6050,8020,5,0,0,0,0,0,0,0,0,0,0 	//MH_POISON_MIST
+6050,8021,5,0,0,0,0,0,0,0,0,0,0 	//MH_PAIN_KILLER
+//Dieter
+6051,8039,5,0,0,0,0,0,0,0,0,0,0 	//MH_MAGMA_FLOW
+6051,8040,5,0,0,0,0,0,0,0,0,0,0 	//MH_GRANITIC_ARMOR
+6051,8041,5,0,0,0,0,0,0,0,0,0,0 	//MH_LAVA_SLIDE
+6051,8042,5,0,0,0,0,0,0,0,0,0,0 	//MH_PYROCLASTIC
+6051,8043,5,0,0,0,0,0,0,0,0,0,0 	//MH_VOLCANIC_ASH
+//Elanor
+6052,8027,1,0,0,0,0,0,0,0,0,0,0 	//MH_STYLE_CHANGE
+6052,8028,5,0,0,0,0,0,0,0,0,0,0 	//MH_SONIC_CRAW
+6052,8029,5,0,0,0,0,0,0,0,0,0,0 	//MH_SILVERVEIN_RUSH
+6052,8030,5,0,0,0,0,0,0,0,0,0,0 	//MH_MIDNIGHT_FRENZY
+6052,8034,5,0,0,0,0,0,0,0,0,0,0 	//MH_HEILIGE_STANGE
+6052,8035,5,0,0,0,0,0,0,0,0,0,0 	//MH_ANGRIFFS_MODUS
+6052,8036,5,0,0,0,0,0,0,0,0,0,0 	//MH_TINDER_BREAKER
+6052,8037,5,0,0,0,0,0,0,0,0,0,0 	//MH_CBC
+6052,8038,5,0,0,0,0,0,0,0,0,0,0 	//MH_EQC

+ 21 - 23
db/re/skill_cast_db.txt

@@ -1665,25 +1665,24 @@
 8016,0,0,1000,0,0,0,0
 //==========================================
 
-//===== Mutated Homunculus Skills ========== CHECK - Need Aftercast and Cooldown times for these skills [Rytech]
 //-- MH_SUMMON_LEGION
-8018,2000,0,0,20000:30000:40000:50000:60000,0,0,0
-//-- MH_NEEDLE_OF_PARALYZE = Whats the duration of the paralyze status? [Rytech]
-8019,1500,0,0,0,0,0,0
+8018,2000,0,0,0,20000:30000:40000:50000:60000,0,400:600:800:1000:1200
+//-- MH_NEEDLE_OF_PARALYZE 
+8019,1500,0,0,0,0,0,500:400:300:200:100
 //-- MH_POISON_MIST
-8020,1000:1200:1400:1600:1800,0,0,12000:14000:16000:18000:20000,0,0,0
+8020,1000:1200:1400:1600:1800,0,0,0,12000:14000:16000:18000:20000,0,500
 //-- MH_PAIN_KILLER
-8021,2000,0,0,20000:30000:40000:50000:60000,0,0,0
+8021,2000,0,0,0,20000:30000:40000:50000:60000,0,1000:800:600:400:200
 //-- MH_LIGHT_OF_REGENE
-8022,1600:1400:1200:1000:800,0,0,360000:420000:480000:540000:600000,0,0,0
+8022,1600:1400:1200:1000:800,0,0,0,360000:420000:480000:540000:600000,0,1600:1400:1200:1000:800
 //-- MH_OVERED_BOOST
-8023,1000,0,0,30000:45000:60000:75000:90000,0,0,0
+8023,1000,0,0,0,30000:45000:60000:75000:90000,0,200:300:400:500:600
 //-- MH_ERASER_CUTTER
 8024,1000:1500:2000:2500:3000,0,0,0,0,0,0
-//-- MH_XENO_SLASHER - CHECK Whats the duration of bleeding status? [Rytech]
-8025,2000:3000:4000:5000:6000,0,0,500,0,0,0
+//-- MH_XENO_SLASHER
+8025,2000:3000:4000:5000:6000,0,0,0,500,0,500
 //-- MH_SILENT_BREEZE
-8026,2000,0,0,9000:12000:15000:18000:21000,0,0,0
+8026,2000,0,0,0,9000:12000:15000:18000:21000,0,1000:800:600:400:200
 //-- MH_STYLE_CHANGE
 //8027,0,0,0,0,0,0,0
 //-- MH_SONIC_CRAW
@@ -1692,16 +1691,16 @@
 //8029,0,0,0,0,0,0,0
 //-- MH_MIDNIGHT_FRENZY
 //8030,0,0,0,0,0,0,0
-//-- MH_STAHL_HORN - CHECK Stun duration is the same as regular stun? [Rytech]
-8031,1000,0,0,0,0,0,0
+//-- MH_STAHL_HORN 
+8031,1000,0,0,0,0,0,200:400:600:800:1000
 //-- MH_GOLDENE_FERSE
-8032,1000:1200:1400:1600:1800,0,0,30000:45000:60000:75000:90000,0,0,0
+8032,1000:1200:1400:1600:1800,0,0,0,30000:45000:60000:75000:90000,0,0
 //-- MH_STEINWAND
-8033,1000,0,0,30000:45000:60000:75000:90000,0,0,0
+8033,1000,0,0,0,30000:45000:60000:75000:90000,0,0
 //-- MH_HEILIGE_STANGE
-8034,2000,0,0,0,0,0,0
+8034,2000,0,0,0,0,0,1800:1600:1400:1200:1000
 //-- MH_ANGRIFFS_MODUS
-8035,200:400:600:800:1000,0,0,30000:45000:60000:75000:90000,0,0,0
+8035,200:400:600:800:1000,0,0,0,30000:45000:60000:75000:90000,0,0
 //-- MH_TINDER_BREAKER
 //8036,0,0,0,0,0,0,0
 //-- MH_CBC
@@ -1709,16 +1708,15 @@
 //-- MH_EQC
 //8038,0,0,0,0,0,0,0
 //-- MH_MAGMA_FLOW
-8039,4000,0,0,30000:45000:60000:75000:90000,0,0,0
+8039,4000,0,0,0,30000:45000:60000:75000:90000,0,2000:1500:1000:500:0
 //-- MH_GRANITIC_ARMOR
-8040,6000:5500:5000:4500:4000,0,0,0,0,0,0
+8040,6000:5500:5000:4500:4000,0,0,0,0,0,1000
 //-- MH_LAVA_SLIDE
-8041,6000:5500:5000:4500:4000,0,0,12000:14000:16000:18000:20000,0,0,0
+8041,6000:5500:5000:4500:4000,0,0,0,12000:14000:16000:18000:20000,0,1000
 //-- MH_PYROCLASTIC
-8042,6000:5500:5000:4500:4000,0,0,60000:90000:120000:150000:180000,0,0,0
+8042,6000:5500:5000:4500:4000,0,0,0,60000:90000:120000:150000:180000,0,1000
 //-- MH_VOLCANIC_ASH
-8043,5000:4500:4000:3500:3000,0,0,12000:14000:16000:18000:20000,0,0,0
-//==========================================
+8043,5000:4500:4000:3500:3000,0,0,0,12000:14000:16000:18000:20000,0,1000
 
 //===== Mercenary Skills ===================
 //-- MS_MAGNUM

+ 27 - 0
db/re/skill_db.txt

@@ -1024,6 +1024,33 @@
 8014,0,6,4,0,0x1,0,5,0,no,0,0,0,none,0,		HVAN_CHAOTIC,Benediction of Chaos
 8015,0,0,0,0,0x1,0,5,0,no,0,0,0,none,0,		HVAN_INSTRUCT,Instruct
 8016,4,6,4,-1,0xD2,4,3,1,no,0,0,0,misc,0,	HVAN_EXPLOSION,Bio Explosion
+//
+8018,9,6,1,0,0x1,0,5,1,no,0,0,0,none,0,		MH_SUMMON_LEGION,Summon Legion
+8019,5,6,1,5,0,0,5,1,no,0,0,0,weapon,0,		MH_NEEDLE_OF_PARALYZE,Needle of Paralyze
+8020,5,6,2,5,0,0,5,1,no,0,0,1,weapon,0,		MH_POISON_MIST,Nevoa Venenosa
+8021,1,6,1,0,0x1,0,5,1,no,0,0,0,none,0,		MH_PAIN_KILLER,Pain Killer
+8022,0,6,4,0,0,0x1,5,1,no,0,0,0,none,0,		MH_LIGHT_OF_REGENE,Light of Regene
+8023,0,6,4,0,0,0x1,5,1,no,0,0,0,none,0,		MH_OVERED_BOOST,Overed Boost
+8024,7,6,1,4:0:4:0:4,0,0,5,1,no,0,0,0,magic,0,	MH_ERASER_CUTTER,Corte Ilusório
+8025,7,6,2,4:0:4:0:4,0,0,5,1,no,0,0,0,magic,0,	MH_XENO_SLASHER,Xeno Slasher
+8026,5:5:7:7:9,6,16,0,0x1,0,5,1,no,0,0,0,magic,0,	MH_SILENT_BREEZE,Silent Breeze
+8027,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,		MH_STYLE_CHANGE,Style Change
+8028,1,8,1,0,0,0,5,1,no,0,0,0,weapon,0,		MH_SONIC_CRAW,Sonic Claw
+8029,1,6,4,0,0,0,5,1,no,0,0x200,0,weapon,0,	MH_SILVERVEIN_RUSH,Silver Bain Rush
+8030,1,6,4,0,0,0,5,1,no,0,0x200,0,weapon,0,	MH_MIDNIGHT_FRENZY,Midnight Frenzy
+8031,5:6:7:8:9,6,1,0,0,0,5,1,no,0,0,0,weapon,3,	MH_STAHL_HORN,Chifre de Aço
+8032,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,		MH_GOLDENE_FERSE,Ferraduras de Ouro
+8033,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,		MH_STEINWAND,Stone Wall
+8034,9,6,1,6,0x2,1:1:1:1:2,5,1,no,0,0,0,magic,0,	MH_HEILIGE_STANGE,Holy Pole
+8035,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,		MH_ANGRIFFS_MODUS,Modo de Ataque
+8036,3:4:5:6:7,6,1,0,0,0,5,1,no,0,0,0,weapon,0,	MH_TINDER_BREAKER,Tinder Breaker
+8037,1,6,4,0,0,0,5,1,no,0,0x200,0,weapon,0,	MH_CBC,Continual Break Combo
+8038,1,6,4,0,0,0,5,1,no,0,0x200,0,weapon,0,	MH_EQC,Eternal Quick Combo
+8039,0,6,4,3,0x2,1:1:1:2:2,5,1,no,0,0,0,weapon,0,	MH_MAGMA_FLOW,Magma Flow
+8040,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,		MH_GRANITIC_ARMOR,Granitic Armor
+8041,7,6,2,3,0x2,0,5,1,no,0,0,1,weapon,0,		MH_LAVA_SLIDE,Deslizamento de Lava
+8042,0,6,4,3,0x1,0,5,1,no,0,0,0,none,0,		MH_PYROCLASTIC,Pyroclastic
+8043,7,6,2,0,0x1,0,5,1,no,0,0,3,none,0,		MH_VOLCANIC_ASH,Volcanic Ash
 
 // Mercenary Skill Place holders
 8201,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,	MS_BASH,Bash

+ 26 - 0
db/re/skill_require_db.txt

@@ -803,6 +803,32 @@
 8013,0,0,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	//HVAN_CAPRICE
 8014,0,0,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	//HVAN_CHAOTIC
 8016,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	//HVAN_EXPLOSION
+8018,0,0,60:80:100:120:140,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	//MH_SUMMON_LEGION#Summon Legion#
+8019,0,0,48:60:72:84: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	//MH_NEEDLE_OF_PARALYZE#Needle of Paralyze#
+8020,0,0,65:75:85:95:105,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	//MH_POISON_MIST#Poison Mist#
+8021,0,0,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	//MH_PAIN_KILLER#Pain Killer#
+8022,0,0,40:50:60:70:80,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	//MH_LIGHT_OF_REGENE#Light of Regene#
+8023,0,0,70:90:110:130:150,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	//MH_OVERED_BOOST#Overed Boost#
+8024,0,0,25:30:35:40: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	//MH_ERASER_CUTTER#Eraser Cutter#
+8025,0,0,90:100:110:120:130,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	//MH_XENO_SLASHER#Xeno Slasher#
+8026,0,0,45:54:63:72:81,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	//MH_SILENT_BREEZE#Silent Breeze#
+8027,0,0,35,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	//MH_STYLE_CHANGE#Style Change#
+8028,0,0,20:25:30:35: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	//MH_SONIC_CRAW#Sonic Claw#
+8029,0,0,10:15:20:25:30,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MH_SILVERVEIN_RUSH#Silver Bain Rush#
+8030,0,0,8:16:24:32:40,0,0,0,99,0,0,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MH_MIDNIGHT_FRENZY#Midnight Frenzy#
+8031,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	//MH_STAHL_HORN#Steel Horn#
+8032,0,0,60:65:70:75:80,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	//MH_GOLDENE_FERSE#Golden Heel#
+8033,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	//MH_STEINWAND#Stone Wall#
+8034,0,0,60:68:76:84: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	//MH_HEILIGE_STANGE#Holy Pole#
+8035,0,0,60:65:70:75:80,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	//MH_ANGRIFFS_MODUS#Attack Mode#
+8036,0,0,20:25:30:35:40,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MH_TINDER_BREAKER#Tinder Breaker#
+8037,0,0,10:20:30:40:50,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MH_CBC#Continual Break Combo#
+8038,0,0,24:28:32:36:40,0,0,0,99,0,0,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//MH_EQC#Eternal Quick Combo#
+8039,0,0,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	//MH_MAGMA_FLOW#Magma Flow#
+8040,0,0,54:58:62:66: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	//MH_GRANITIC_ARMOR#Granitic Armor#
+8041,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	//MH_LAVA_SLIDE#Lava Slide#
+8042,0,0,20:28:36:44:52,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	//MH_PYROCLASTIC#Pyroclastic#
+8043,0,0,60:65:70:75:80,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	//MH_VOLCANIC_ASH#Volcanic Ash#
 
 8201,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	//MS_BASH
 8202,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	//MS_MAGNUM

+ 6 - 0
db/re/skill_unit_db.txt

@@ -148,6 +148,12 @@
 2488,0xe9,    ,  0, 3,1000,enemy, 0x000	//GN_FIRE_EXPANSION_TEAR_GAS
 2490,0xea,    ,  0, 1,1000,enemy, 0x000	//GN_HELLS_PLANT
 
+8020,0xf5,    ,  0, 3,2300:2100:1900:1700:1500,enemy,   0x018	//MH_POISON_MIST
+8033,0x7e,    ,  0, 0,  -1,all,   0x003	//MH_STEINWAND 
+8025,0x86,    ,  0, 2:2:3:3:4,1000,enemy, 0x018	//MH_XENO_SLASHER
+8041,0xf6,    ,  1:1:2:2:3, 0,1000,enemy,   0x018	//MH_LAVA_SLIDE
+8043,0xf7,    ,  0, 1,1000,enemy,   0x018	//MH_VOLCANIC_ASH
+
 8208,0x86,    ,  0, 2,1000,enemy, 0x080	//MA_SHOWER
 8209,0x90,    ,  0, 1,1000,enemy, 0x006	//MA_SKIDTRAP
 8210,0x93,    ,  0, 0,1000,enemy, 0x006	//MA_LANDMINE

+ 3 - 3
src/common/mmo.h

@@ -79,7 +79,7 @@
 #define MAX_ZENY 1000000000
 #define MAX_FAME 1000000000
 #define MAX_CART 100
-#define MAX_SKILL 3040
+#define MAX_SKILL 3100
 #define GLOBAL_REG_NUM 256
 #define ACCOUNT_REG_NUM 64
 #define ACCOUNT_REG2_NUM 16
@@ -139,8 +139,8 @@
 
 //Base Homun skill.
 #define HM_SKILLBASE 8001
-#define MAX_HOMUNSKILL 16
-#define MAX_HOMUNCULUS_CLASS	60	//[orn], Increased to 60 from 16 to allow new Homun-S.
+#define MAX_HOMUNSKILL 43
+#define MAX_HOMUNCULUS_CLASS	52	//[orn], Increased to 60 from 16 to allow new Homun-S.
 #define HM_CLASS_BASE 6001
 #define HM_CLASS_MAX (HM_CLASS_BASE+MAX_HOMUNCULUS_CLASS-1)
 

+ 19 - 5
src/map/battle.c

@@ -2429,6 +2429,12 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 				case EL_ROCK_CRUSHER:
 					skillratio += 700;
 					break;
+				case MH_STAHL_HORN:
+					skillratio += 500 + 100 * skill_lv;
+					break;
+				case MH_LAVA_SLIDE:
+					skillratio = 70 * skill_lv;
+					break;
 			}
 
 			ATK_RATE(skillratio);
@@ -3678,7 +3684,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 					case EL_TYPOON_MIS_ATK:
 						skillratio += 1100;
 						break;
-
+					case MH_ERASER_CUTTER:
+						if (skill_lv >= 3)
+							skillratio += 800 + 200 * skill_lv ;
+						else
+							skillratio += 500 + 400 * skill_lv;
+						break;
 				}
 
 				MATK_RATE(skillratio);
@@ -3839,10 +3850,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 	else if( map[target->m].flag.battleground )
 		ad.damage=battle_calc_bg_damage(src,target,ad.damage,ad.div_,skill_num,skill_lv,ad.flag);
 	
-	
-	if( skill_num == SO_VARETYR_SPEAR ) { // Physical damage.
-		struct Damage wd = battle_calc_weapon_attack(src,target,skill_num,skill_lv,mflag);
-		ad.damage += wd.damage;
+	switch( skill_num ) { /* post-calc modifiers */
+		case SO_VARETYR_SPEAR: { // Physical damage.
+			struct Damage wd = battle_calc_weapon_attack(src,target,skill_num,skill_lv,mflag);
+			ad.damage += wd.damage;
+			break;
+		}
+		//case HM_ERASER_CUTTER:
 	}
 	
 	return ad;

+ 26 - 0
src/map/clif.c

@@ -10582,6 +10582,27 @@ static void clif_parse_UseSkillToId_homun(struct homun_data *hd, struct map_sess
 		unit_skilluse_id(&hd->bl, target_id, skillnum, skilllv);
 }
 
+static void clif_parse_UseSkillToPos_homun(struct homun_data *hd, struct map_session_data *sd, unsigned int tick, short skillnum, short skilllv, short x, short y, int skillmoreinfo)
+{
+	int lv;
+	if( !hd )
+		return;
+	if( skillnotok_hom(skillnum, hd) )
+		return;
+	if( hd->ud.skilltimer != INVALID_TIMER ) {
+		if( skillnum != SA_CASTCANCEL && skillnum != SO_SPELLFIST ) return;
+	} else if( DIFF_TICK(tick, hd->ud.canact_tick) < 0 )
+		return;
+	
+	if( hd->sc.data[SC_BASILICA] )
+		return;
+	lv = merc_hom_checkskill(hd, skillnum);
+	if( skilllv > lv )
+		skilllv = lv;
+	if( skilllv )
+		unit_skilluse_pos(&hd->bl, x, y, skillnum, skilllv);
+}
+
 static void clif_parse_UseSkillToId_mercenary(struct mercenary_data *md, struct map_session_data *sd, unsigned int tick, short skillnum, short skilllv, int target_id)
 {
 	int lv;
@@ -10743,6 +10764,11 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, sho
 
 	if( !(skill_get_inf(skillnum)&INF_GROUND_SKILL) )
 		return; //Using a target skill on the ground? WRONG.
+	
+	if( skillnum >= HM_SKILLBASE && skillnum < HM_SKILLBASE + MAX_HOMUNSKILL ) {
+		clif_parse_UseSkillToPos_homun(sd->hd, sd, tick, skillnum, skilllv, x, y, skillmoreinfo);
+		return;
+	}
 
 	if( skillnum >= MC_SKILLBASE && skillnum < MC_SKILLBASE + MAX_MERCSKILL )
 	{

+ 49 - 37
src/map/skill.c

@@ -44,15 +44,18 @@
 #define SKILLUNITTIMER_INTERVAL	100
 
 // ranges reserved for mapping skill ids to skilldb offsets
-#define GD_SKILLRANGEMIN 900
-#define GD_SKILLRANGEMAX (GD_SKILLRANGEMIN+MAX_GUILDSKILL)
-#define MC_SKILLRANGEMIN 800
-#define MC_SKILLRANGEMAX (MC_SKILLRANGEMIN+MAX_MERCSKILL)
 #define HM_SKILLRANGEMIN 700
-#define HM_SKILLRANGEMAX (HM_SKILLRANGEMIN+MAX_HOMUNSKILL)
+#define HM_SKILLRANGEMAX HM_SKILLRANGEMIN + MAX_HOMUNSKILL
+#define MC_SKILLRANGEMIN HM_SKILLRANGEMAX + 1
+#define MC_SKILLRANGEMAX MC_SKILLRANGEMIN + MAX_MERCSKILL
 #define EL_SKILLRANGEMIN MC_SKILLRANGEMAX + 1
 #define EL_SKILLRANGEMAX EL_SKILLRANGEMIN + MAX_ELEMENTALSKILL
+#define GD_SKILLRANGEMIN EL_SKILLRANGEMAX + 1
+#define GD_SKILLRANGEMAX GD_SKILLRANGEMIN + MAX_GUILDSKILL
 
+#if GD_SKILLRANGEMAX > 999
+	#error GD_SKILLRANGEMAX is greater than 999
+#endif
 static struct eri *skill_unit_ers = NULL; //For handling skill_unit's [Skotlex]
 static struct eri *skill_timer_ers = NULL; //For handling skill_timerskills [Skotlex]
 
@@ -1122,9 +1125,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case NPC_CRITICALWOUND:
 		sc_start(bl,SC_CRITICALWOUND,100,skilllv,skill_get_time2(skillid,skilllv));
 		break;
-	/**
-	 * Rune Knight
-	 **/
 	case RK_HUNDREDSPEAR:
 		if( !sd || pc_checkskill(sd,KN_SPEARBOOMERANG) == 0 )
 			break; // Spear Boomerang auto cast chance only works if you have mastered Spear Boomerang.
@@ -1138,16 +1138,10 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case RK_DRAGONBREATH:
 		sc_start4(bl,SC_BURNING,5+5*skilllv,skilllv,1000,src->id,0,skill_get_time(skillid,skilllv));
 		break;
-	/**
-	 * Arch Bishop
-	 **/
 	case AB_ADORAMUS:
 		if( tsc && !tsc->data[SC_DECREASEAGI] ) //Prevent duplicate agi-down effect.
 			sc_start(bl, SC_ADORAMUS, 100, skilllv, skill_get_time(skillid, skilllv));
 		break;
-	/**
-	 * Warlock
-	 **/
 	case WL_CRIMSONROCK:
 		sc_start(bl, SC_STUN, 40, skilllv, skill_get_time(skillid, skilllv));
 		break;
@@ -1168,9 +1162,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case WL_JACKFROST:
 		sc_start(bl,SC_FREEZE,100,skilllv,skill_get_time(skillid,skilllv));
 		break;
-	/**
-	 * Ranger
-	 **/
 	case RA_WUGBITE:
 		{
 			int chance = (50+10*skilllv)-(sstatus->agi/4) + (sd ? pc_checkskill(sd,RA_TOOTHOFWUG)*2 : 0);
@@ -1193,9 +1184,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case RA_ICEBOUNDTRAP:
 		sc_start(bl, (skillid == RA_FIRINGTRAP) ? SC_BURNING:SC_FREEZING, 40 + 10 * skilllv, skilllv, skill_get_time2(skillid, skilllv));
 		break;
-	/**
-	 * Mechanic
-	 **/
 	case NC_PILEBUNKER:
 		if( rnd()%100 < 5 + 15*skilllv )
 		{ //Deactivatable Statuses: Kyrie Eleison, Auto Guard, Steel Body, Assumptio, and Millennium Shield
@@ -1218,15 +1206,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 		if( rnd()%100 < 5*skilllv )
 			skill_castend_damage_id(src, bl, NC_AXEBOOMERANG, pc_checkskill(sd, NC_AXEBOOMERANG), tick, 1);
 		break;
-	/**
-	 * Guilotine Cross
-	 **/
 	case GC_WEAPONCRUSH:
 		skill_castend_nodamage_id(src,bl,skillid,skilllv,tick,BCT_ENEMY);
 		break;
-	/**
-	 * Royal Guard
-	 **/
 	case LG_SHIELDPRESS:
 		sc_start(bl, SC_STUN, 30 + 8 * skilllv, skilllv, skill_get_time(skillid,skilllv));
 		break;
@@ -1361,6 +1343,12 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 	case EL_TYPOON_MIS:
 		sc_start(bl,SC_SILENCE,10*skilllv,skilllv,skill_get_time(skillid,skilllv));
 		break;
+	case MH_LAVA_SLIDE:
+		sc_start4(bl,SC_BURNING,10*skilllv,skilllv,1000,src->id,0,skill_get_time(skillid,skilllv));
+		break;			
+	case MH_STAHL_HORN:
+		sc_start(bl,SC_STUN,(20 + 4 * skilllv),skilllv,skill_get_time2(skillid,skilllv));
+		break;
 	}
 
 	if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai)
@@ -2769,7 +2757,7 @@ static int skill_check_unit_range_sub (struct block_list *bl, va_list ap)
 		case RA_ICEBOUNDTRAP:
 		case SC_DIMENSIONDOOR:
 			//Non stackable on themselves and traps (including venom dust which does not has the trap inf2 set)
-			if (skillid != g_skillid && !(skill_get_inf2(g_skillid)&INF2_TRAP) && g_skillid != AS_VENOMDUST)
+			if (skillid != g_skillid && !(skill_get_inf2(g_skillid)&INF2_TRAP) && g_skillid != AS_VENOMDUST && g_skillid != MH_POISON_MIST)
 				return 0;
 			break;
 		default: //Avoid stacking with same kind of trap. [Skotlex]
@@ -3421,7 +3409,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	case SR_GENTLETOUCH_QUIET:
 	case WM_SEVERE_RAINSTORM_MELEE:
 	case WM_GREAT_ECHO:
-	case GN_SLINGITEM_RANGEMELEEATK:			
+	case GN_SLINGITEM_RANGEMELEEATK:
+	case MH_STAHL_HORN:
 		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 	break;
 
@@ -3648,7 +3637,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	case WM_REVERBERATION_MAGIC:
 	case SO_VARETYR_SPEAR:
 	case GN_CART_TORNADO:
-	case GN_CARTCANNON:			
+	case GN_CARTCANNON:
+	case MH_LAVA_SLIDE:
 		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
@@ -3806,6 +3796,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	case AB_HIGHNESSHEAL:
 	case AB_DUPLELIGHT_MAGIC:
 	case WM_METALICSOUND:
+	case MH_ERASER_CUTTER:
 		skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
 		break;
 
@@ -4501,7 +4492,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		break;
 
 	default:
-		ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skillid);
+		if( skillid >= HM_SKILLBASE && skillid <= HM_SKILLBASE + MAX_HOMUNSKILL ) {
+			if( src->type == BL_HOM && ((TBL_HOM*)src)->master->fd )
+				clif_colormes(((TBL_HOM*)src)->master, COLOR_RED, "This skill is not yet supported");
+		} else /* temporary until all the homun-s skills are supported otherwise console would fill up with pointless warnings */
+			ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skillid);
 		clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion,
 			0, abs(skill_get_num(skillid, skilllv)),
 			skillid, skilllv, skill_get_hit(skillid));
@@ -7119,15 +7114,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		break;
 
 	case AM_REST:
-		if (sd)
-		{
+		if (sd) {
 			if (merc_hom_vaporize(sd,1))
 				clif_skill_nodamage(src, bl, skillid, skilllv, 1);
 			else
 				clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
 		}
 		break;
-
+	case MH_STAHL_HORN:
+		if (sd) {
+			if( skillid == MH_GOLDENE_FERSE )
+				clif_skill_fail(sd,skillid,USESKILL_FAIL_CONDITION,0);
+		}
+		break;
 	case HAMI_CASTLE:	//[orn]
 		if(rnd()%100 < 20*skilllv && src != bl)
 		{
@@ -7182,6 +7181,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 	case HFLI_FLEET:
 	case HFLI_SPEED:
 	case HLIF_CHANGE:
+	case MH_ANGRIFFS_MODUS:
+	case MH_GOLDENE_FERSE:			
 		clif_skill_nodamage(src,bl,skillid,skilllv,
 			sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
 		if (hd)
@@ -7263,7 +7264,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		}
 		break;
 	case RK_IGNITIONBREAK:
-	case LG_EARTHDRIVE: 
+	case LG_EARTHDRIVE:
+	case MH_LAVA_SLIDE:
 			clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skillid, skilllv, 6);
 			i = skill_get_splash(skillid,skilllv);
 			if( skillid == LG_EARTHDRIVE ) {
@@ -8609,7 +8611,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		break;
 			
 	default:
-		ShowWarning("skill_castend_nodamage_id: Unknown skill used:%d\n",skillid);
+		if( skillid >= HM_SKILLBASE && skillid <= HM_SKILLBASE + MAX_HOMUNSKILL ) {
+			if( src->type == BL_HOM && ((TBL_HOM*)src)->master->fd )
+				clif_colormes(((TBL_HOM*)src)->master, COLOR_RED, "This skill is not yet supported");
+		} else /* temporary until all the homun-s skills are supported otherwise console would fill up with pointless warnings */
+			ShowWarning("skill_castend_nodamage_id: Unknown skill used:%d\n",skillid);
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 		map_freeblock_unlock();
 		return 1;
@@ -9299,7 +9305,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 	case SO_FIRE_INSIGNIA:
 	case SO_WATER_INSIGNIA:
 	case SO_WIND_INSIGNIA:
-	case SO_EARTH_INSIGNIA:			
+	case SO_EARTH_INSIGNIA:
+	case MH_POISON_MIST:
 		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);
@@ -9751,7 +9758,11 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 		break;
 
 	default:
-		ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skillid);
+		if( skillid >= HM_SKILLBASE && skillid <= HM_SKILLBASE + MAX_HOMUNSKILL ) {
+			if( src->type == BL_HOM && ((TBL_HOM*)src)->master->fd )
+				clif_colormes(((TBL_HOM*)src)->master, COLOR_RED, "This skill is not yet supported");
+		} else /* temporary until all the homun-s skills are supported otherwise console would fill up with pointless warnings */
+			ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skillid);
 		return 1;
 	}
 
@@ -16253,6 +16264,7 @@ void skill_init_unit_layout (void)
 						memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
 					}
 					break;
+				case MH_POISON_MIST:
 				case AS_VENOMDUST: {
 						static const int dx[] = {-1, 0, 0, 0, 1};
 						static const int dy[] = { 0,-1, 0, 1, 0};

+ 34 - 3
src/map/status.c

@@ -707,6 +707,13 @@ void initChangeTables(void) {
 	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 );	
 	
+	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 );
+	set_sc( MH_GOLDENE_FERSE	 , SC_GOLDENE_FERSE   , SI_GOLDENE_FERSE	, SCB_SPEED|SCB_FLEE|SCB_ATK_ELE );
+	add_sc( MH_LAVA_SLIDE		 , SC_BURNING         );
+	add_sc( MH_POISON_MIST		 , SC_BLIND			  );
+	set_sc( MH_ERASER_CUTTER	 , SC_ERASER_CUTTER   , SI_BLANK			, SCB_NONE );
+	
 	// 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,
@@ -4330,6 +4337,8 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan
 		batk += sc->data[SC_FULL_SWING_K]->val1;
 	if(sc->data[SC_ODINS_POWER])
 		batk += 70;
+	if(sc->data[SC_ANGRIFFS_MODUS])
+		batk += batk * sc->data[SC_ANGRIFFS_MODUS]->val2/100;
 #ifdef RENEWAL_EDP
 	// renewal EDP increases your base atk by atk x skill level
 	if( sc->data[SC_EDP] )
@@ -4413,7 +4422,8 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
 		watk += watk / 10;
 	if( sc && sc->data[SC_TIDAL_WEAPON] )
 		watk += watk * sc->data[SC_TIDAL_WEAPON]->val2 / 100;
-
+	if(sc->data[SC_ANGRIFFS_MODUS])
+		watk += watk * sc->data[SC_ANGRIFFS_MODUS]->val2/100;
 #ifdef RENEWAL_EDP
 	// renewal EDP increases your weapon atk by watk x Skill Level - 1
 	if( sc->data[SC_EDP] && sc->data[SC_EDP]->val1 > 1 )
@@ -4592,6 +4602,10 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
 		flee += flee * sc->data[SC_ZEPHYR]->val2 / 100;
 	if( sc->data[SC_MARSHOFABYSS] )
 		flee -= (9 * sc->data[SC_MARSHOFABYSS]->val3 / 10 + sc->data[SC_MARSHOFABYSS]->val2 / 10) * (bl->type == BL_MOB ? 2 : 1);
+	if( sc->data[SC_ANGRIFFS_MODUS] )
+		flee -= flee * sc->data[SC_ANGRIFFS_MODUS]->val3 / 100;
+	if( sc->data[SC_GOLDENE_FERSE ] )
+		flee -= flee * sc->data[SC_GOLDENE_FERSE ]->val2 / 100;
 #ifdef RENEWAL
 	if( sc->data[SC_SPEARQUICKEN] )
 		flee += 2 * sc->data[SC_SPEARQUICKEN]->val1;
@@ -4684,7 +4698,9 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
 		def += 50;	
 	if(sc->data[SC_ODINS_POWER])
 		def -= 20;
-
+	if( sc->data[SC_ANGRIFFS_MODUS] )
+		def -= def * sc->data[SC_ANGRIFFS_MODUS]->val4 / 100;
+	
 	return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX);;
 }
 
@@ -5164,7 +5180,10 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
 		if(sc->data[SC_FLEET] &&
 			max < sc->data[SC_FLEET]->val2)
 			max = sc->data[SC_FLEET]->val2;
-
+		
+		if( sc->data[SC_GOLDENE_FERSE] && max < sc->data[SC_GOLDENE_FERSE]->val3 )
+			max = sc->data[SC_GOLDENE_FERSE]->val3;
+		
 		if(sc->data[SC_ASSNCROS] &&
 			max < sc->data[SC_ASSNCROS]->val2)
 		{
@@ -5428,6 +5447,8 @@ unsigned char status_calc_attack_element(struct block_list *bl, struct status_ch
 		return ELE_GHOST;
 	if(sc->data[SC_TIDAL_WEAPON_OPTION] || sc->data[SC_TIDAL_WEAPON] )
 		return ELE_WATER;
+	if(sc->data[SC_GOLDENE_FERSE] && rand()%100 < sc->data[SC_GOLDENE_FERSE]->val4)
+		return ELE_HOLY;
 	return (unsigned char)cap_value(element,0,UCHAR_MAX);
 }
 
@@ -7507,6 +7528,16 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			val3 = 3*val1; //Leech chance
 			val4 = 20; //Leech percent
 			break;
+		case SC_ANGRIFFS_MODUS:
+			val2 = 70 + 30*val1; //atk
+			val3 = 50 + 20*val1; //flee
+			val4 = 60 + 20*val1; //def
+			break;
+		case SC_GOLDENE_FERSE:
+			val2 = 20 + 10*val1; //flee
+			val3 = 10 + 4*val1; //aspd
+			val4 = 2 + 2*val1; //chance to issue holy-ele attack
+			break;			
 		case SC_FLEET:
 			val2 = 30*val1; //Aspd change
 			val3 = 5+5*val1; //bAtk/wAtk rate change

+ 4 - 0
src/map/status.h

@@ -612,6 +612,10 @@ typedef enum sc_type {
  * To increase the maximum value just add another status type before SC_MAXSPELLBOOK (ex. SC_SPELLBOOK7, SC_SPELLBOOK8 and so on)
  **/
 	SC_MAXSPELLBOOK,
+	/* homun-s */
+	SC_ANGRIFFS_MODUS,
+	SC_GOLDENE_FERSE,
+	SC_ERASER_CUTTER,
 	
 	SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
 } sc_type;