diff --git a/conf/battle/homunc.conf b/conf/battle/homunc.conf index 01fc0c4d3e..d230a1e7ec 100644 --- a/conf/battle/homunc.conf +++ b/conf/battle/homunc.conf @@ -50,7 +50,7 @@ homunculus_auto_vapor: 80 homunculus_max_level: 99 // Max level for Homunculus S -homunculus_S_max_level: 175 +homunculus_S_max_level: 250 // Growth level for Homunculus S // This is the level at which homunculus S can use their growth tables diff --git a/db/homun_skill_tree.txt b/db/homun_skill_tree.txt index ae44218702..a36c73896c 100644 --- a/db/homun_skill_tree.txt +++ b/db/homun_skill_tree.txt @@ -92,23 +92,36 @@ 6048,8024,10,106,0,0,0,0,0,0,0,0,0,0,0 //MH_ERASER_CUTTER 6048,8025,10,121,0,0,0,0,0,0,0,0,0,0,0 //MH_XENO_SLASHER 6048,8026,5,137,0,0,0,0,0,0,0,0,0,0,0 //MH_SILENT_BREEZE +6048,8046,10,210,0,0,0,0,0,0,0,0,0,0,0 //MH_CLASSY_FLUTTER +6048,8047,10,215,0,0,0,0,0,0,0,0,0,0,0 //MH_TWISTER_CUTTER +6048,8048,10,230,0,0,0,0,0,0,0,0,0,0,0 //MH_ABSOLUTE_ZEPHYR //Bayeri 6049,8031,10,105,0,0,0,0,0,0,0,0,0,0,0 //MH_STAHL_HORN 6049,8032,5,112,0,0,0,0,0,0,0,0,0,0,0 //MH_GOLDENE_FERSE 6049,8033,5,121,0,0,0,0,0,0,0,0,0,0,0 //MH_STEINWAND 6049,8034,10,138,0,0,0,0,0,0,0,0,0,0,0 //MH_HEILIGE_STANGE 6049,8035,5,130,0,0,0,0,0,0,0,0,0,0,0 //MH_ANGRIFFS_MODUS +6049,8055,10,210,0,0,0,0,0,0,0,0,0,0,0 //MH_LICHT_GEHORN +6049,8056,10,215,0,0,0,0,0,0,0,0,0,0,0 //MH_GLANZEN_SPIES +6049,8057,10,230,0,0,0,0,0,0,0,0,0,0,0 //MH_HEILIGE_PFERD +6049,8058,10,230,0,0,0,0,0,0,0,0,0,0,0 //MH_GOLDENE_TONE //Sera 6050,8018,5,132,0,0,0,0,0,0,0,0,0,0,0 //MH_SUMMON_LEGION 6050,8019,10,105,0,0,0,0,0,0,0,0,0,0,0 //MH_NEEDLE_OF_PARALYZE 6050,8020,5,116,0,0,0,0,0,0,0,0,0,0,0 //MH_POISON_MIST 6050,8021,10,123,0,0,0,0,0,0,0,0,0,0,0 //MH_PAIN_KILLER +6050,8052,10,210,0,0,0,0,0,0,0,0,0,0,0 //MH_POLISHING_NEEDLE +6050,8053,10,215,0,0,0,0,0,0,0,0,0,0,0 //MH_TOXIN_OF_MANDARA +6050,8054,10,230,0,0,0,0,0,0,0,0,0,0,0 //MH_NEEDLE_STINGER //Dieter 6051,8039,5,122,0,0,0,0,0,0,0,0,0,0,0 //MH_MAGMA_FLOW 6051,8040,5,116,0,0,0,0,0,0,0,0,0,0,0 //MH_GRANITIC_ARMOR 6051,8041,10,109,0,0,0,0,0,0,0,0,0,0,0 //MH_LAVA_SLIDE 6051,8042,10,131,0,0,0,0,0,0,0,0,0,0,0 //MH_PYROCLASTIC 6051,8043,5,102,0,0,0,0,0,0,0,0,0,0,0 //MH_VOLCANIC_ASH +6051,8059,10,210,0,0,0,0,0,0,0,0,0,0,0 //MH_BLAZING_LAVA +6051,8044,10,215,0,0,0,0,0,0,0,0,0,0,0 //MH_BLAST_FORGE +6051,8045,10,230,0,0,0,0,0,0,0,0,0,0,0 //MH_TEMPERING //Elanor 6052,8027,1,100,0,0,0,0,0,0,0,0,0,0,0 //MH_STYLE_CHANGE 6052,8028,5,100,0,0,0,0,0,0,0,0,0,0,0 //MH_SONIC_CRAW @@ -117,3 +130,6 @@ 6052,8036,5,100,0,0,0,0,0,0,0,0,0,0,0 //MH_TINDER_BREAKER 6052,8037,5,112,0,0,0,0,0,0,0,0,0,0,0 //MH_CBC 6052,8038,5,133,0,0,0,0,0,0,0,0,0,0,0 //MH_EQC +6052,8049,10,210,0,0,0,0,0,0,0,0,0,0,0 //MH_BRUSHUP_CLAW +6052,8050,10,215,0,0,0,0,0,0,0,0,0,0,0 //MH_BLAZING_AND_FURIOUS +6052,8051,10,230,0,0,0,0,0,0,0,0,0,0,0 //MH_THE_ONE_FIGHTER_RISES diff --git a/db/re/exp_homun.yml b/db/re/exp_homun.yml index 1e06b33e97..5897e712de 100644 --- a/db/re/exp_homun.yml +++ b/db/re/exp_homun.yml @@ -379,3 +379,154 @@ Body: Exp: 87140000 - Level: 174 Exp: 94875000 +# TODO: unconfirmed values from here + - Level: 175 + Exp: 104362500 + - Level: 176 + Exp: 112711500 + - Level: 177 + Exp: 121728420 + - Level: 178 + Exp: 131466693 + - Level: 179 + Exp: 141984028 + - Level: 180 + Exp: 153342750 + - Level: 181 + Exp: 165610170 + - Level: 182 + Exp: 178858983 + - Level: 183 + Exp: 193167701 + - Level: 184 + Exp: 208621117 + - Level: 185 + Exp: 225310806 + - Level: 186 + Exp: 243335670 + - Level: 187 + Exp: 262802523 + - Level: 188 + Exp: 283826724 + - Level: 189 + Exp: 306532861 + - Level: 190 + Exp: 331055489 + - Level: 191 + Exp: 357539928 + - Level: 192 + Exp: 386143122 + - Level: 193 + Exp: 417034571 + - Level: 194 + Exp: 450397336 + - Level: 195 + Exp: 486429122 + - Level: 196 + Exp: 525343451 + - Level: 197 + Exp: 567370927 + - Level: 198 + Exp: 612760601 + - Level: 199 + Exp: 661781449 + - Level: 200 + Exp: 714723964 + - Level: 201 + Exp: 771901881 + - Level: 202 + Exp: 833654031 + - Level: 203 + Exp: 900346353 + - Level: 204 + Exp: 972374061 + - Level: 205 + Exp: 1050163985 + - Level: 206 + Exp: 1134177103 + - Level: 207 + Exp: 1224911271 + - Level: 208 + Exp: 1322904172 + - Level: 209 + Exp: 1428736505 + - Level: 210 + Exp: 1543035425 + - Level: 211 + Exp: 1666478259 + - Level: 212 + Exp: 1799796519 + - Level: 213 + Exp: 1943780240 + - Level: 214 + Exp: 2099282659 + - Level: 215 + Exp: 2267225271 + - Level: 216 + Exp: 2448603292 + - Level: 217 + Exp: 2644491555 + - Level: 218 + Exp: 2856050879 + - Level: 219 + Exp: 3084534949 + - Level: 220 + Exp: 3331297744 + - Level: 221 + Exp: 3597801563 + - Level: 222 + Exp: 3885625688 + - Level: 223 + Exp: 4196475743 + - Level: 224 + Exp: 4532193802 + - Level: 225 + Exp: 4894769306 + - Level: 226 + Exp: 5286350850 + - Level: 227 + Exp: 5709258918 + - Level: 228 + Exp: 6165999631 + - Level: 229 + Exp: 6659279601 + - Level: 230 + Exp: 7192021969 + - Level: 231 + Exp: 7767383726 + - Level: 232 + Exp: 8388774424 + - Level: 233 + Exp: 9059876377 + - Level: 234 + Exp: 9784666487 + - Level: 235 + Exp: 10567439805 + - Level: 236 + Exp: 11412834989 + - Level: 237 + Exp: 12325861788 + - Level: 238 + Exp: 13311930731 + - Level: 239 + Exp: 14376885189 + - Level: 240 + Exp: 15527036004 + - Level: 241 + Exp: 16769198884 + - Level: 242 + Exp: 18110734794 + - Level: 243 + Exp: 19559593577 + - Level: 244 + Exp: 21124361063 + - Level: 245 + Exp: 22814309948 + - Level: 246 + Exp: 24639454743 + - Level: 247 + Exp: 26610611122 + - Level: 248 + Exp: 28739460011 + - Level: 249 + Exp: 31038616811 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 82c73edb7b..d877897d0f 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -42624,6 +42624,845 @@ Body: PathCheck: true RangedSingleUnit: true Status: Ash + - Id: 8044 + Name: MH_BLAST_FORGE + Description: Blast Forge + MaxLevel: 10 + Type: Weapon + TargetType: Ground + DamageFlags: + Splash: true + Range: 1 + Hit: Single + HitCount: 1 + Element: Fire + ActiveInstance: 1 + CastTime: + - Level: 1 + Time: 5000 + - Level: 2 + Time: 5000 + - Level: 3 + Time: 5000 + - Level: 4 + Time: 4500 + - Level: 5 + Time: 4500 + - Level: 6 + Time: 4500 + - Level: 7 + Time: 4000 + - Level: 8 + Time: 4000 + - Level: 9 + Time: 4000 + - Level: 10 + Time: 3500 + AfterCastActDelay: 1000 + Duration1: 5000 + FixedCastTime: 1000 + Requires: + SpCost: + - Level: 1 + Amount: 52 + - Level: 2 + Amount: 59 + - Level: 3 + Amount: 66 + - Level: 4 + Amount: 73 + - Level: 5 + Amount: 80 + - Level: 6 + Amount: 87 + - Level: 7 + Amount: 94 + - Level: 8 + Amount: 101 + - Level: 9 + Amount: 108 + - Level: 10 + Amount: 115 + Unit: + Id: Lava_Slide + Layout: + - Level: 1 + Size: 1 + - Level: 2 + Size: 1 + - Level: 3 + Size: 1 + - Level: 4 + Size: 1 + - Level: 5 + Size: 2 + - Level: 6 + Size: 2 + - Level: 7 + Size: 2 + - Level: 8 + Size: 2 + - Level: 9 + Size: 3 + - Level: 10 + Size: 3 + Interval: 1000 + Target: Enemy + Flag: + NoReiteration: true + NoOverlap: true + PathCheck: true + - Id: 8045 + Name: MH_TEMPERING + Description: Tempering + MaxLevel: 10 + TargetType: Self + DamageFlags: + NoDamage: true + CastTime: + - Level: 1 + Time: 1000 + - Level: 2 + Time: 1500 + - Level: 3 + Time: 2000 + - Level: 4 + Time: 2500 + - Level: 5 + Time: 3000 + - Level: 6 + Time: 3500 + - Level: 7 + Time: 4000 + - Level: 8 + Time: 4500 + - Level: 9 + Time: 5000 + - Level: 10 + Time: 5500 + AfterCastActDelay: 1000 + Duration1: + - Level: 1 + Time: 45000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 75000 + - Level: 4 + Time: 90000 + - Level: 5 + Time: 105000 + - Level: 6 + Time: 120000 + - Level: 7 + Time: 135000 + - Level: 8 + Time: 150000 + - Level: 9 + Time: 165000 + - Level: 10 + Time: 180000 + FixedCastTime: 200 + Requires: + SpCost: + - Level: 1 + Amount: 83 + - Level: 2 + Amount: 91 + - Level: 3 + Amount: 99 + - Level: 4 + Amount: 107 + - Level: 5 + Amount: 115 + - Level: 6 + Amount: 123 + - Level: 7 + Amount: 131 + - Level: 8 + Amount: 139 + - Level: 9 + Amount: 147 + - Level: 10 + Amount: 155 + Status: Tempering + - Id: 8046 + Name: MH_CLASSY_FLUTTER + Description: Classy Flutter + MaxLevel: 10 + DamageFlags: + NoDamage: true + - Id: 8047 + Name: MH_TWISTER_CUTTER + Description: Twister Cutter + MaxLevel: 10 + Type: Magic + TargetType: Attack + DamageFlags: + IgnoreDefense: true + Range: 7 + Element: Wind + Hit: Multi_Hit + HitCount: -2 + CastCancel: true + CastTime: # !TODO: Confirm cast time + - Level: 1 + Time: 600 + - Level: 2 + Time: 700 + - Level: 3 + Time: 800 + - Level: 4 + Time: 900 + - Level: 5 + Time: 1000 + - Level: 6 + Time: 1100 + - Level: 7 + Time: 1200 + - Level: 8 + Time: 1300 + - Level: 9 + Time: 1400 + - Level: 10 + Time: 1500 + Requires: + SpCost: + - Level: 1 + Amount: 106 + - Level: 2 + Amount: 112 + - Level: 3 + Amount: 118 + - Level: 4 + Amount: 124 + - Level: 5 + Amount: 130 + - Level: 6 + Amount: 136 + - Level: 7 + Amount: 142 + - Level: 8 + Amount: 148 + - Level: 9 + Amount: 154 + - Level: 10 + Amount: 160 + - Id: 8048 + Name: MH_ABSOLUTE_ZEPHYR + Description: Absolute Zephyr + MaxLevel: 10 + Type: Magic + TargetType: Attack + DamageFlags: + Splash: true + IgnoreDefense: true + Range: 7 + Hit: Multi_Hit + HitCount: -6 + Element: Wind + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 2 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 3 + - Level: 10 + Area: 4 + CastTime: # !TODO: Confirm cast time + - Level: 1 + Time: 600 + - Level: 2 + Time: 700 + - Level: 3 + Time: 800 + - Level: 4 + Time: 900 + - Level: 5 + Time: 1000 + - Level: 6 + Time: 1100 + - Level: 7 + Time: 1200 + - Level: 8 + Time: 1300 + - Level: 9 + Time: 1400 + - Level: 10 + Time: 1500 + Requires: + SpCost: + - Level: 1 + Amount: 122 + - Level: 2 + Amount: 129 + - Level: 3 + Amount: 136 + - Level: 4 + Amount: 143 + - Level: 5 + Amount: 150 + - Level: 6 + Amount: 157 + - Level: 7 + Amount: 164 + - Level: 8 + Amount: 171 + - Level: 9 + Amount: 178 + - Level: 10 + Amount: 185 + - Id: 8049 + Name: MH_BRUSHUP_CLAW + Description: Brushup Claw + MaxLevel: 10 + DamageFlags: + NoDamage: true + - Id: 8050 + Name: MH_BLAZING_AND_FURIOUS + Description: Blazing And Furious + MaxLevel: 10 + Type: Weapon + TargetType: Support + DamageFlags: + NoDamage: true + IgnoreDefense: true + Splash: true + Range: 7 + Hit: Multi_Hit + HitCount: 1 + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 1 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 2 + - Level: 8 + Area: 2 + - Level: 9 + Area: 3 + - Level: 10 + Area: 3 + Requires: + SpCost: + - Level: 1 + Amount: 103 + - Level: 2 + Amount: 108 + - Level: 3 + Amount: 113 + - Level: 4 + Amount: 118 + - Level: 5 + Amount: 123 + - Level: 6 + Amount: 128 + - Level: 7 + Amount: 133 + - Level: 8 + Amount: 138 + - Level: 9 + Amount: 143 + - Level: 10 + Amount: 148 + SpiritSphereCost: 1 + - Id: 8051 + Name: MH_THE_ONE_FIGHTER_RISES + Description: The One Fighter Rises + MaxLevel: 10 + Type: Weapon + TargetType: Self + DamageFlags: + IgnoreDefense: true + Splash: true + Range: 7 + Hit: Single + HitCount: 1 + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 1 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 2 + - Level: 8 + Area: 2 + - Level: 9 + Area: 3 + - Level: 10 + Area: 3 + Requires: + SpCost: + - Level: 1 + Amount: 100 + - Level: 2 + Amount: 106 + - Level: 3 + Amount: 112 + - Level: 4 + Amount: 118 + - Level: 5 + Amount: 124 + - Level: 6 + Amount: 130 + - Level: 7 + Amount: 136 + - Level: 8 + Amount: 142 + - Level: 9 + Amount: 148 + - Level: 10 + Amount: 154 + - Id: 8052 + Name: MH_POLISHING_NEEDLE + Description: Polishing Needle + MaxLevel: 10 + DamageFlags: + NoDamage: true + - Id: 8053 + Name: MH_TOXIN_OF_MANDARA + Description: Toxin Of Mandara + MaxLevel: 10 + Type: Weapon + TargetType: Attack + DamageFlags: + IgnoreDefense: true + Splash: true + Range: 2 + Hit: Single + HitCount: 1 + Element: Neutral + CastTime: + - Level: 1 + Time: 1000 + - Level: 2 + Time: 1000 + - Level: 3 + Time: 1000 + - Level: 4 + Time: 1100 + - Level: 5 + Time: 1100 + - Level: 6 + Time: 1100 + - Level: 7 + Time: 1200 + - Level: 8 + Time: 1200 + - Level: 9 + Time: 1200 + - Level: 10 + Time: 1300 + Duration1: + - Level: 1 + Time: 2500 + - Level: 2 + Time: 3000 + - Level: 3 + Time: 3500 + - Level: 4 + Time: 4000 + - Level: 5 + Time: 4500 + - Level: 6 + Time: 5000 + - Level: 7 + Time: 5500 + - Level: 8 + Time: 6000 + - Level: 9 + Time: 6500 + - Level: 10 + Time: 7000 + FixedCastTime: + - Level: 1 + Time: 500 + - Level: 2 + Time: 500 + - Level: 3 + Time: 500 + - Level: 4 + Time: 400 + - Level: 5 + Time: 400 + - Level: 6 + Time: 400 + - Level: 7 + Time: 300 + - Level: 8 + Time: 300 + - Level: 9 + Time: 300 + - Level: 10 + Time: 200 + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 2 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 3 + - Level: 10 + Area: 4 + Requires: + SpCost: + - Level: 1 + Amount: 60 + - Level: 2 + Amount: 65 + - Level: 3 + Amount: 70 + - Level: 4 + Amount: 75 + - Level: 5 + Amount: 80 + - Level: 6 + Amount: 85 + - Level: 7 + Amount: 90 + - Level: 8 + Amount: 95 + - Level: 9 + Amount: 100 + - Level: 10 + Amount: 105 + Status: Toxin_of_Mandara + - Id: 8054 + Name: MH_NEEDLE_STINGER + Description: Needle Stinger + MaxLevel: 10 + Type: Weapon + TargetType: Attack + DamageFlags: + IgnoreDefense: true + Range: 7 + Hit: Single + HitCount: 1 + Element: Poison + CastTime: + - Level: 1 + Time: 1000 + - Level: 2 + Time: 1000 + - Level: 3 + Time: 1000 + - Level: 4 + Time: 1100 + - Level: 5 + Time: 1100 + - Level: 6 + Time: 1100 + - Level: 7 + Time: 1200 + - Level: 8 + Time: 1200 + - Level: 9 + Time: 1200 + - Level: 10 + Time: 1300 + FixedCastTime: + - Level: 1 + Time: 500 + - Level: 2 + Time: 500 + - Level: 3 + Time: 500 + - Level: 4 + Time: 400 + - Level: 5 + Time: 400 + - Level: 6 + Time: 400 + - Level: 7 + Time: 300 + - Level: 8 + Time: 300 + - Level: 9 + Time: 300 + - Level: 10 + Time: 200 + Requires: + SpCost: + - Level: 1 + Amount: 74 + - Level: 2 + Amount: 82 + - Level: 3 + Amount: 90 + - Level: 4 + Amount: 98 + - Level: 5 + Amount: 106 + - Level: 6 + Amount: 114 + - Level: 7 + Amount: 122 + - Level: 8 + Amount: 130 + - Level: 9 + Amount: 138 + - Level: 10 + Amount: 146 + - Id: 8055 + Name: MH_LICHT_GEHORN + Description: Licht Gehorn + MaxLevel: 10 + DamageFlags: + NoDamage: true + - Id: 8056 + Name: MH_GLANZEN_SPIES + Description: Glanzen Spies + MaxLevel: 10 + Type: Weapon + TargetType: Attack + DamageFlags: + IgnoreDefense: true + Range: 3 + Element: Holy + Hit: Single + HitCount: 1 + FixedCastTime: 500 + Requires: + SpCost: + - Level: 1 + Amount: 60 + - Level: 2 + Amount: 65 + - Level: 3 + Amount: 70 + - Level: 4 + Amount: 75 + - Level: 5 + Amount: 80 + - Level: 6 + Amount: 85 + - Level: 7 + Amount: 90 + - Level: 8 + Amount: 95 + - Level: 9 + Amount: 100 + - Level: 10 + Amount: 105 + - Id: 8057 + Name: MH_HEILIGE_PFERD + Description: Heilige Pferd + MaxLevel: 10 + Type: Magic + TargetType: Self + DamageFlags: + Splash: true + IgnoreDefense: true + Hit: Single + HitCount: 1 + Element: Holy + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 1 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 2 + - Level: 8 + Area: 2 + - Level: 9 + Area: 3 + - Level: 10 + Area: 3 + CastTime: # !TODO: Confirm cast time + - Level: 1 + Time: 600 + - Level: 2 + Time: 700 + - Level: 3 + Time: 800 + - Level: 4 + Time: 900 + - Level: 5 + Time: 1000 + - Level: 6 + Time: 1100 + - Level: 7 + Time: 1200 + - Level: 8 + Time: 1300 + - Level: 9 + Time: 1400 + - Level: 10 + Time: 1500 + FixedCastTime: + - Level: 1 + Time: 2000 + - Level: 2 + Time: 1800 + - Level: 3 + Time: 1600 + - Level: 4 + Time: 1400 + - Level: 5 + Time: 1200 + - Level: 6 + Time: 1000 + - Level: 7 + Time: 800 + - Level: 8 + Time: 600 + - Level: 9 + Time: 400 + - Level: 10 + Time: 200 + Requires: + SpCost: + - Level: 1 + Amount: 122 + - Level: 2 + Amount: 129 + - Level: 3 + Amount: 136 + - Level: 4 + Amount: 143 + - Level: 5 + Amount: 150 + - Level: 6 + Amount: 157 + - Level: 7 + Amount: 164 + - Level: 8 + Amount: 171 + - Level: 9 + Amount: 178 + - Level: 10 + Amount: 185 + - Id: 8058 + Name: MH_GOLDENE_TONE + Description: Goldene Tone + MaxLevel: 10 + TargetType: Self + DamageFlags: + NoDamage: true + CastTime: + - Level: 1 + Time: 1000 + - Level: 2 + Time: 1500 + - Level: 3 + Time: 2000 + - Level: 4 + Time: 2500 + - Level: 5 + Time: 3000 + - Level: 6 + Time: 3500 + - Level: 7 + Time: 4000 + - Level: 8 + Time: 4500 + - Level: 9 + Time: 5000 + - Level: 10 + Time: 5500 + AfterCastActDelay: 1000 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 40000 + - Level: 3 + Time: 50000 + - Level: 4 + Time: 60000 + - Level: 5 + Time: 70000 + - Level: 6 + Time: 80000 + - Level: 7 + Time: 90000 + - Level: 8 + Time: 100000 + - Level: 9 + Time: 110000 + - Level: 10 + Time: 120000 + FixedCastTime: 200 + Requires: + SpCost: + - Level: 1 + Amount: 124 + - Level: 2 + Amount: 133 + - Level: 3 + Amount: 142 + - Level: 4 + Amount: 151 + - Level: 5 + Amount: 160 + - Level: 6 + Amount: 169 + - Level: 7 + Amount: 178 + - Level: 8 + Amount: 187 + - Level: 9 + Amount: 196 + - Level: 10 + Amount: 205 + Status: Goldene_Tone + - Id: 8059 + Name: MH_BLAZING_LAVA + Description: Blazing Lava + MaxLevel: 10 + DamageFlags: + NoDamage: true - Id: 8201 Name: MS_BASH Description: Bash diff --git a/db/re/status.yml b/db/re/status.yml index 7690898616..58b2f4652f 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -8530,3 +8530,21 @@ Body: NoClearance: true - Status: WeaponBreaker DurationLookup: NPC_WEAPONBRAKER + - Status: Tempering + Icon: EFST_TEMPERING + DurationLookup: MH_TEMPERING + CalcFlags: + Patk: true + - Status: Goldene_Tone + Icon: EFST_GOLDENE_TONE + DurationLookup: MH_GOLDENE_TONE + CalcFlags: + Res: true + Mres: true + - Status: Toxin_of_Mandara + Icon: EFST_TOXIN_OF_MANDARA + DurationLookup: MH_TOXIN_OF_MANDARA + Flags: + Debuff: true + CalcFlags: + Res: true diff --git a/src/common/database.cpp b/src/common/database.cpp index 89b8c7826d..5fb9f02934 100644 --- a/src/common/database.cpp +++ b/src/common/database.cpp @@ -114,6 +114,7 @@ bool YamlDatabase::load(const std::string& path) { ShowError( "Failed to load %s database file from '" CL_WHITE "%s" CL_RESET "'.\n", this->type.c_str(), path.c_str() ); ShowError( "There is likely a syntax error in the file.\n" ); ShowError( "Error message: %s\n", e.what() ); + aFree(buf); return false; } diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index c020334392..6f67726e54 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -89,7 +89,7 @@ typedef uint32 t_itemid; #endif #define MAX_FAME 1000000000 ///Max fame points #define MAX_CART 100 ///Maximum item in cart -#define MAX_SKILL 1465 ///Maximum skill can be hold by Player, Homunculus, & Mercenary (skill list) AND skill_db limit +#define MAX_SKILL 1481 ///Maximum skill can be hold by Player, Homunculus, & Mercenary (skill list) AND skill_db limit #define DEFAULT_WALK_SPEED 150 ///Default walk speed #define MIN_WALK_SPEED 20 ///Min walk speed #define MAX_WALK_SPEED 1000 ///Max walk speed @@ -179,7 +179,7 @@ const t_itemid WEDDING_RING_F = 2635; //Base Homun skill. #define HM_SKILLBASE 8001 -#define MAX_HOMUNSKILL 43 +#define MAX_HOMUNSKILL 59 #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.cpp b/src/map/battle.cpp index 412f8d4298..e0a1577880 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -2479,6 +2479,7 @@ static int battle_range_type(struct block_list *src, struct block_list *target, case SHC_FATAL_SHADOW_CROW: // 9 cell cast range. case MT_RUSH_QUAKE: // 9 cell cast range. case ABC_UNLUCKY_RUSH: // 7 cell cast range. + case MH_THE_ONE_FIGHTER_RISES: // 7 cell cast range. //case ABC_DEFT_STAB: // 2 cell cast range??? case NPC_MAXPAIN_ATK: return BF_SHORT; @@ -3894,6 +3895,14 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s if( tsc && tsc->getSCE(SC_JYUMONJIKIRI) ) wd->div_ = wd->div_ * -1;// needs more info break; + case MH_BLAZING_AND_FURIOUS: { + struct homun_data *hd = BL_CAST(BL_HOM, src); + if (hd) { + wd->div_ = hd->homunculus.spiritball; + hom_delspiritball(hd, MAX_SPIRITBALL, 1); + } + break; + } #ifdef RENEWAL case AS_POISONREACT: skill_lv = pc_checkskill(sd, TF_DOUBLE); @@ -4964,22 +4973,40 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 20 * skill_lv; break; case MH_NEEDLE_OF_PARALYZE: - skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->dex / 6; // !TODO: Confirm Base Level and DEX bonus + skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // !TODO: Confirm Base Level and DEX bonus + break; + case MH_TOXIN_OF_MANDARA: + skillratio += -100 + 400 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // !TODO: Confirm Base Level and DEX bonus + break; + case MH_NEEDLE_STINGER: + skillratio += -100 + 200 + 500 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // !TODO: Confirm Base Level and DEX bonus break; case MH_STAHL_HORN: - skillratio += -100 + 1000 + 300 * skill_lv * status_get_lv(src) / 150 + sstatus->vit / 6; // !TODO: Confirm VIT bonus + skillratio += -100 + 1000 + 300 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus + break; + case MH_GLANZEN_SPIES: + skillratio += -100 + 300 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->vit; // !TODO: Confirm VIT bonus break; case MH_LAVA_SLIDE: skillratio += -100 + 50 * skill_lv; break; + case MH_BLAST_FORGE: + skillratio += -100 + 70 * skill_lv * status_get_lv(src) / 100 + sstatus->str; + break; case MH_SONIC_CRAW: skillratio += -100 + 60 * skill_lv * status_get_lv(src) / 150; break; + case MH_BLAZING_AND_FURIOUS: + skillratio += -100 + 80 * skill_lv * status_get_lv(src) / 100 + sstatus->str; + break; + case MH_THE_ONE_FIGHTER_RISES: + skillratio += -100 + 580 * skill_lv * status_get_lv(src) / 100 + sstatus->str; + break; case MH_SILVERVEIN_RUSH: - skillratio += -100 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str / 6; // !TODO: Confirm STR bonus + skillratio += -100 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str; // !TODO: Confirm STR bonus break; case MH_MIDNIGHT_FRENZY: - skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 150 + sstatus->str / 6; // !TODO: Confirm STR bonus + skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 150 + sstatus->str; // !TODO: Confirm STR bonus break; case MH_MAGMA_FLOW: skillratio += -100 + (100 * skill_lv + 3 * status_get_lv(src)) * status_get_lv(src) / 120; @@ -7437,13 +7464,22 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case MH_ERASER_CUTTER: case MH_XENO_SLASHER: - skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->int_ / 6; // !TODO: Confirm Base Level and INT bonus + skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus + break; + case MH_TWISTER_CUTTER: + skillratio += -100 + 480 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus + break; + case MH_ABSOLUTE_ZEPHYR: + skillratio += -100 + 1000 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus break; case MH_HEILIGE_STANGE: - skillratio += -100 + 1500 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit / 6; // !TODO: Confirm VIT bonus + skillratio += -100 + 1500 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus + break; + case MH_HEILIGE_PFERD: + skillratio += -100 + 1200 + 350 * skill_lv * status_get_lv(src) / 100 + sstatus->vit; // !TODO: Confirm VIT bonus break; case MH_POISON_MIST: - skillratio += -100 + 200 * skill_lv * status_get_lv(src) / 100 + sstatus->dex / 6; // ! TODO: Confirm DEX bonus + skillratio += -100 + 200 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // ! TODO: Confirm DEX bonus break; case SU_SV_STEMSPEAR: skillratio += 600; diff --git a/src/map/homunculus.hpp b/src/map/homunculus.hpp index d915641870..65b3edf732 100644 --- a/src/map/homunculus.hpp +++ b/src/map/homunculus.hpp @@ -90,7 +90,7 @@ struct homun_data { }; #define MAX_HOM_SKILL_REQUIRE 5 -#define MAX_HOM_SKILL_TREE 8 +#define MAX_HOM_SKILL_TREE 10 /// Homunculus skill entry [Celest] struct homun_skill_tree_entry { diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 36f22c3e21..7e6e3e3fa0 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1867,6 +1867,9 @@ export_constant(SC_BEEF_RIB_STEW); export_constant(SC_PORK_RIB_STEW); export_constant(SC_WEAPONBREAKER); + export_constant(SC_TOXIN_OF_MANDARA); + export_constant(SC_GOLDENE_TONE); + export_constant(SC_TEMPERING); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index fec5e31424..047af7d8b4 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1106,7 +1106,10 @@ bool skill_isNotOk_hom(struct homun_data *hd, uint16 skill_id, uint16 skill_lv) clif_skill_fail(sd, skill_id, USESKILL_FAIL_SPIRITS, spiritball); return true; } - hom_delspiritball(hd, spiritball, 1); + + // Blazing And Furious removes all spirit balls after calculating the amount of hits + if (skill_id != MH_BLAZING_AND_FURIOUS) + hom_delspiritball(hd, spiritball, 1); } //Use master's criteria. @@ -2026,6 +2029,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case MH_NEEDLE_OF_PARALYZE: sc_start(src,bl, SC_PARALYSIS, 30 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; + case MH_TOXIN_OF_MANDARA: + sc_start(src,bl, SC_TOXIN_OF_MANDARA, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + break; case MH_XENO_SLASHER: sc_start4(src, bl, SC_BLEEDING, skill_lv, skill_lv, src->id, 0, 0, skill_get_time2(skill_id, skill_lv)); break; @@ -5587,6 +5593,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RL_S_STORM: case RL_R_TRIP: case MH_XENO_SLASHER: + case MH_HEILIGE_PFERD: + case MH_THE_ONE_FIGHTER_RISES: case NC_ARMSCANNON: case SU_SCRATCH: case SU_LUNATICCARROTBEAT: @@ -6760,6 +6768,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; //recursive homon skill + case MH_ABSOLUTE_ZEPHYR: + case MH_TOXIN_OF_MANDARA: + case MH_BLAZING_AND_FURIOUS: case MH_MAGMA_FLOW: case MH_HEILIGE_STANGE: if(flag&1){ @@ -6771,8 +6782,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); break; + case MH_TWISTER_CUTTER: + case MH_GLANZEN_SPIES: case MH_STAHL_HORN: case MH_NEEDLE_OF_PARALYZE: + case MH_NEEDLE_STINGER: case MH_SONIC_CRAW: case MH_MIDNIGHT_FRENZY: case MH_SILVERVEIN_RUSH: @@ -7639,6 +7653,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui #endif break; + case MH_BLAZING_AND_FURIOUS: case TK_JUMPKICK: /* Check if the target is an enemy; if not, skill should fail so the character doesn't unit_movepos (exploitable) */ if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) { @@ -8364,6 +8379,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case LG_OVERBRAND: case NPC_RAYOFGENESIS: case LG_RAYOFGENESIS: + case MH_THE_ONE_FIGHTER_RISES: + case MH_HEILIGE_PFERD: case KO_HAPPOKUNAI: case RL_FIREDANCE: case RL_R_TRIP: @@ -8405,6 +8422,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if (skill_id == IQ_MASSIVE_F_BLASTER || skill_id == SHC_IMPACT_CRATER || skill_id == MT_AXE_STOMP || skill_id == ABC_ABYSS_DAGGER) sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + if (skill_id == MH_THE_ONE_FIGHTER_RISES) { + hom_addspiritball(hd, MAX_SPIRITBALL); + } skill_area_temp[1] = 0; clif_skill_nodamage(src,bl,skill_id,skill_lv,1); @@ -12109,6 +12129,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else sc_start(&hd->bl,&hd->bl, SC_STYLE_CHANGE, 100, MH_MD_FIGHTING, INFINITE_TICK); } break; + case MH_GOLDENE_TONE: + case MH_TEMPERING: { + block_list* master_bl = battle_get_master(src); + + if (master_bl != nullptr){ + clif_skill_nodamage(src,master_bl,skill_id,skill_lv,1); + sc_start(src, master_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + } + + if (hd) + skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); + } break; case MH_PAIN_KILLER: bl = battle_get_master(src); if (bl != nullptr) @@ -13520,6 +13552,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case KO_ZENKAI: case MH_LAVA_SLIDE: case MH_VOLCANIC_ASH: + case MH_BLAST_FORGE: case MH_POISON_MIST: case MH_STEINWAND: case MH_XENO_SLASHER: @@ -14844,6 +14877,7 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui val3 = 0; // Suck target at n seconds. break; case MH_POISON_MIST: + case MH_BLAST_FORGE: case MH_LAVA_SLIDE: skill_clear_group(src, 1); break; diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 3c23aff63b..5adc61565b 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -2369,6 +2369,22 @@ enum e_skill { MH_LAVA_SLIDE, MH_PYROCLASTIC, MH_VOLCANIC_ASH, + MH_BLAST_FORGE, + MH_TEMPERING, + MH_CLASSY_FLUTTER, + MH_TWISTER_CUTTER, + MH_ABSOLUTE_ZEPHYR, + MH_BRUSHUP_CLAW, + MH_BLAZING_AND_FURIOUS, + MH_THE_ONE_FIGHTER_RISES, + MH_POLISHING_NEEDLE, + MH_TOXIN_OF_MANDARA, + MH_NEEDLE_STINGER, + MH_LICHT_GEHORN, + MH_GLANZEN_SPIES, + MH_HEILIGE_PFERD, + MH_GOLDENE_TONE, + MH_BLAZING_LAVA, MS_BASH = 8201, MS_MAGNUM, diff --git a/src/map/status.cpp b/src/map/status.cpp index 96fee0de65..2282d343df 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -4966,6 +4966,31 @@ int status_calc_homunculus_(struct homun_data *hd, uint8 opt) if((skill_lv = hom_checkskill(hd, HLIF_BRAIN)) > 0) status->max_sp += skill_lv * status->max_sp / 100; + if((skill_lv = hom_checkskill(hd, MH_CLASSY_FLUTTER)) > 0) { + status->matk_min += 100 + 60* skill_lv; + status->matk_max += 100 + 60* skill_lv; + } + + if((skill_lv = hom_checkskill(hd, MH_BRUSHUP_CLAW)) > 0) { + status->batk += 100 + 60* skill_lv; + } + + if((skill_lv = hom_checkskill(hd, MH_POLISHING_NEEDLE)) > 0) { + status->matk_min += 50 + 20* skill_lv; + status->matk_max += 50 + 20* skill_lv; + status->batk += 100 + 40* skill_lv; + } + + if((skill_lv = hom_checkskill(hd, MH_LICHT_GEHORN)) > 0) { + status->matk_min += 100 + 30* skill_lv; + status->matk_max += 100 + 30* skill_lv; + status->batk += 100 + 30* skill_lv; + } + + if((skill_lv = hom_checkskill(hd, MH_BLAZING_LAVA)) > 0) { + status->batk += 100 + 60* skill_lv; + } + if (opt&SCO_FIRST) { hd->battle_status.hp = hom->hp; hd->battle_status.sp = hom->sp; @@ -8427,6 +8452,8 @@ static signed short status_calc_patk(struct block_list *bl, status_change *sc, i patk += sc->getSCE(SC_ABYSS_SLAYER)->val2; if (sc->getSCE(SC_PRON_MARCH)) patk += sc->getSCE(SC_PRON_MARCH)->val2; + if (sc->getSCE(SC_TEMPERING)) + patk += sc->getSCE(SC_TEMPERING)->val2; return (short)cap_value(patk, 0, SHRT_MAX); } @@ -8473,10 +8500,14 @@ static signed short status_calc_res(struct block_list *bl, status_change *sc, in res += sc->getSCE(SC_D_MACHINE)->val3; if (sc->getSCE(SC_MUSICAL_INTERLUDE)) res += sc->getSCE(SC_MUSICAL_INTERLUDE)->val2; + if (sc->getSCE(SC_GOLDENE_TONE)) + res += sc->getSCE(SC_GOLDENE_TONE)->val2; if (sc->getSCE(SC_SHADOW_STRIP) && bl->type != BL_PC) res -= res * sc->getSCE(SC_SHADOW_STRIP)->val2 / 100; if (sc->getSCE(SC_AIN_RHAPSODY)) res -= sc->getSCE(SC_AIN_RHAPSODY)->val2; + if (sc->getSCE(SC_TOXIN_OF_MANDARA)) + res -= sc->getSCE(SC_TOXIN_OF_MANDARA)->val2; return (short)cap_value(res, 0, SHRT_MAX); } @@ -8493,6 +8524,8 @@ static signed short status_calc_mres(struct block_list *bl, status_change *sc, i if (!sc || !sc->count) return cap_value(mres, 0, SHRT_MAX); + if (sc->getSCE(SC_GOLDENE_TONE)) + mres += sc->getSCE(SC_GOLDENE_TONE)->val2; if (sc->getSCE(SC_SHADOW_STRIP) && bl->type != BL_PC) mres -= mres * sc->getSCE(SC_SHADOW_STRIP)->val2 / 100; if (sc->getSCE(SC_GEF_NOCTURN)) @@ -12013,10 +12046,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_PYROCLASTIC: val2 += 100 + 10*val1; // atk bonus // !TODO: Confirm formula break; + case SC_TEMPERING: + val2 += 5 + val1; // patk bonus + break; + case SC_GOLDENE_TONE: + val2 += 3 * val1; // res/mres bonus + break; case SC_PARALYSIS: // [Lighta] need real info val2 = 2*val1; // def reduction val3 = 500*val1; // varcast augmentation break; + case SC_TOXIN_OF_MANDARA: + val2 = 15*val1; // res reduction + break; case SC_LIGHT_OF_REGENE: // Yommy leak need confirm val2 = 20 * val1; // hp reco on death % break; diff --git a/src/map/status.hpp b/src/map/status.hpp index cc730f932b..f932e87f44 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -1258,6 +1258,11 @@ enum sc_type : int16 { SC_WEAPONBREAKER, + // 2021 Mutated Homunculus Skills + SC_TOXIN_OF_MANDARA, + SC_GOLDENE_TONE, + SC_TEMPERING, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif