summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-07-08 17:38:44 +0000
committershennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-07-08 17:38:44 +0000
commit22c75b070526de8b103032f5bf13504af81e0095 (patch)
tree46129805f108454e02fd3e8d83a1c22395599db4
parent6d371c31155c7d34aee7cf43bcf8ba6ac88060c9 (diff)
downloadhercules-22c75b070526de8b103032f5bf13504af81e0095.tar.gz
hercules-22c75b070526de8b103032f5bf13504af81e0095.tar.bz2
hercules-22c75b070526de8b103032f5bf13504af81e0095.tar.xz
hercules-22c75b070526de8b103032f5bf13504af81e0095.zip
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://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16381 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--db/homun_skill_tree.txt31
-rw-r--r--db/re/skill_cast_db.txt44
-rw-r--r--db/re/skill_db.txt27
-rw-r--r--db/re/skill_require_db.txt26
-rw-r--r--db/re/skill_unit_db.txt6
-rw-r--r--src/common/mmo.h6
-rw-r--r--src/map/battle.c24
-rw-r--r--src/map/clif.c26
-rw-r--r--src/map/skill.c86
-rw-r--r--src/map/status.c37
-rw-r--r--src/map/status.h4
11 files changed, 246 insertions, 71 deletions
diff --git a/db/homun_skill_tree.txt b/db/homun_skill_tree.txt
index 2f889fdaf..e93c6f058 100644
--- a/db/homun_skill_tree.txt
+++ b/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 \ No newline at end of file
diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt
index c061dbf7a..0a409a9ba 100644
--- a/db/re/skill_cast_db.txt
+++ b/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
diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt
index 74909e3ce..b2ea60a7c 100644
--- a/db/re/skill_db.txt
+++ b/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
diff --git a/db/re/skill_require_db.txt b/db/re/skill_require_db.txt
index b5173e631..a39ca31d5 100644
--- a/db/re/skill_require_db.txt
+++ b/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
diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt
index be86ef62e..33e47e249 100644
--- a/db/re/skill_unit_db.txt
+++ b/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
diff --git a/src/common/mmo.h b/src/common/mmo.h
index c3c2dc06e..7557d0ce3 100644
--- a/src/common/mmo.h
+++ b/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)
diff --git a/src/map/battle.c b/src/map/battle.c
index 64c695264..bbed08be6 100644
--- a/src/map/battle.c
+++ b/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;
diff --git a/src/map/clif.c b/src/map/clif.c
index 4153130e5..a35e0fa49 100644
--- a/src/map/clif.c
+++ b/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 )
{
diff --git a/src/map/skill.c b/src/map/skill.c
index cd67eac80..9e7b5711a 100644
--- a/src/map/skill.c
+++ b/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};
diff --git a/src/map/status.c b/src/map/status.c
index 3b874c918..f1ad9fd8d 100644
--- a/src/map/status.c
+++ b/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
diff --git a/src/map/status.h b/src/map/status.h
index ab21311b8..532eb8d13 100644
--- a/src/map/status.h
+++ b/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;