diff --git a/db/homun_skill_tree.txt b/db/homun_skill_tree.txt index 2f889fdaff2..e93c6f058bc 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 c061dbf7a13..0a409a9bad0 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 74909e3ced4..b2ea60a7cc7 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 b5173e6316d..a39ca31d52d 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 be86ef62ec9..33e47e24900 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 c3c2dc06e4a..7557d0ce359 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 64c6952644a..bbed08be6a7 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 4153130e501..a35e0fa4929 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 cd67eac80ca..9e7b5711a66 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 3b874c91826..f1ad9fd8d2e 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 ab21311b894..532eb8d139e 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;