Bug Fixes
* Updated Pointpoint Attack to also have a chance to break Helm equips. (bugreport:8735) * Fixed Feint Bomb stacking with Hiding and Stealth. (bugreport:8346) * Updated the trigger area of Feint Bomb to be 3x3 and AoE is 5x5. (bugreport:8346) * Fixed Chemical Protection not removing Strip effects. (bugreport:8746) * Fixed Warg Strike's Warg requirement, reverted to misc attack, and ignores target's Flee. (bugreport:8732) * Warg Bite and Warg Dash now ignore target's Flee. * Corrected Epiclesis HP/SP recovery timer. (bugreport:8751) * Fixed Crimson Moon not working with Epiclesis. * Updated Spirit Sphere requirement for Gentle Touch - Cure to 1. * Fixed Shield Boomerang not taking weapon element into account. (bugreport:8757) * Homunculus skill re-use delay is no longer reset when vaporized. * Lauda Agnus and Lauda Ramus can now be casted when the caster is not in a party. * Cart Revolution will now always knock targets to the West (added config to disable). (bugreport:8753) * Updated all non-3rd class skills cast times. (Hercules e2fdc3b) * Corrected Prestige magic evasion formula. (bugreport:8737) * Poem of Netherworld will now only effect enemies except in WoE. (bugreport:8771) * Poem of Netherworld can be removed by Status Recovery and Lion Howling. * Updated Deep Sleep, Crystalize, and Vacuum Extreme to use base status. (bugreport:8749) * Self Destruction now ignores target's DEF cards. * Fixed Raising Dragon not recovering SP. (bugreport:8769) * Fixed Charm bonuses for Kagerou/Oboro. (bugreport:8319) * Moved calculation for Chorus bonus. * Fixed Over Brand damaging targets on the entire map. (bugreport:8736) * Fixed Cast Ninja Spell not randomly picking a status ailment to cast on target. (bugreport:8774)
This commit is contained in:
parent
0602234e4d
commit
79fbd3bc69
@ -18,7 +18,7 @@
|
||||
// stat window (by default they don't crit)
|
||||
// 0x020: Their Min-Matk is always the same as their max
|
||||
// 0x040: Skill re-use delay is reset when they are vaporized.
|
||||
hom_setting: 0xFFFF
|
||||
hom_setting: 0x3D
|
||||
|
||||
// The rate a homunculus will get friendly by feeding it. (Note 2)
|
||||
homunculus_friendly_rate: 100
|
||||
|
@ -302,3 +302,7 @@ taekwon_mission_mobname: 0
|
||||
// Can a player Teleport on top of a Map Warp Portal? (Note 1)
|
||||
// On official servers players have been unable to do so.
|
||||
teleport_on_portal: no
|
||||
|
||||
// Is the knockback direction for Cart Revolution always West? (Note 1)
|
||||
// On official servers it will knock the target always to the West. If disabled it will knock the target backwards.
|
||||
cart_revo_knockback: yes
|
||||
|
@ -365,7 +365,7 @@
|
||||
248,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, CR_TRUST,Faith
|
||||
249,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, CR_AUTOGUARD,Guard
|
||||
250,3,6,1,0,0,0,5,1,no,0,0,0,weapon,5:6:7:8:9,0x0, CR_SHIELDCHARGE,Smite
|
||||
251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x0, CR_SHIELDBOOMERANG,Shield Boomerang
|
||||
251,3:5:7:9:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, CR_SHIELDBOOMERANG,Shield Boomerang
|
||||
252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0, CR_REFLECTSHIELD,Shield Reflect
|
||||
253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0,0x0, CR_HOLYCROSS,Holy Cross
|
||||
254,5,6,4,6,0x48,0,10,1,no,33,0x100,0,magic,0,0x0, CR_GRANDCROSS,Grand Cross
|
||||
@ -885,8 +885,8 @@
|
||||
2004,5,8,1,-1,0,0,10,-5,no,0,0,0,weapon,0,0x0, RK_HUNDREDSPEAR,Hundred Spear
|
||||
2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,0x0, RK_WINDCUTTER,Wind Cutter
|
||||
2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,0x0, RK_IGNITIONBREAK,Ignition Break
|
||||
2007,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, RK_DRAGONTRAINING,Dragon Training
|
||||
2008,9,6,2,3,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2007,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RK_DRAGONTRAINING,Dragon Training
|
||||
2008,9,6,2,3,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2009,0,6,4,0,0x3,3:4:5:6:7,5,1,no,0,0,0,none,0,0x0, RK_DRAGONHOWLING,Dragon Howling
|
||||
2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RK_RUNEMASTERY,Rune Mastery
|
||||
2011,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, RK_MILLENNIUMSHIELD,Millenium Shield
|
||||
@ -992,9 +992,9 @@
|
||||
2239,3,6,2,0,0x42,3,5,1,no,0,0x80,3,misc,0,0x2800, RA_CLUSTERBOMB,Cluster Bomb
|
||||
2240,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x0, RA_WUGMASTERY,Warg Mastery
|
||||
2241,0,6,4,0,0,0,3,1,no,0,0,0,none,0,0x2000, RA_WUGRIDER,Warg Rider
|
||||
2242,0,6,4,-1,0x2,1,1,0,no,0,0,0,weapon,0,0x2000, RA_WUGDASH,Warg Dash
|
||||
2243,9,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x2000, RA_WUGSTRIKE,Warg Strike
|
||||
2244,9,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x80, RA_WUGBITE,Warg Bite
|
||||
2242,0,6,4,-1,0x42,1,1,0,no,0,0,0,weapon,0,0x2000, RA_WUGDASH,Warg Dash
|
||||
2243,9,6,1,0,0x40,0,5,1,no,0,0,0,misc,0,0x2000, RA_WUGSTRIKE,Warg Strike
|
||||
2244,9,6,1,0,0x40,0,5,1,no,0,0,0,weapon,0,0x80, RA_WUGBITE,Warg Bite
|
||||
2245,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RA_TOOTHOFWUG,Tooth of Warg
|
||||
2246,0,6,4,0,0x2,3:4:5:6:7,5,1,no,0,0,0,weapon,0,0x0, RA_SENSITIVEKEEN,Sensitive Keen
|
||||
2247,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x42, RA_CAMOUFLAGE,Camouflage
|
||||
@ -1020,7 +1020,7 @@
|
||||
2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide
|
||||
2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_B_SIDESLIDE,Back-Side Slide
|
||||
2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure // Check me. Part of the code notes translated to "The amount of fuel have".
|
||||
2267,0,6,4,-1,0x4A,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction
|
||||
2267,0,6,4,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction
|
||||
2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0, NC_SHAPESHIFT,Shape Shift
|
||||
2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_EMERGENCYCOOL,Emergency Cool
|
||||
2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0, NC_INFRAREDSCAN,Infrared Scan
|
||||
@ -1060,7 +1060,7 @@
|
||||
2301,7,6,2,0,0x1,0,3,1,yes,0,0x20000,0,none,0,0x0, SC_CHAOSPANIC,Chaos Panic
|
||||
2302,7,6,2,0,0x1,0,3,1,yes,0,0x20000,0,none,0,0x0, SC_MAELSTROM,Maelstrom
|
||||
2303,7,6,2,0,0x1,3,3,1,yes,0,0,1,none,0,0x0, SC_BLOODYLUST,Bloody Lust
|
||||
2304,0,6,4,-1,0,0,3,1,no,0,0,0,weapon,0,0x0, SC_FEINTBOMB,Feint Bomb
|
||||
2304,0,6,4,-1,0,2,3,1,no,0,0,0,weapon,0,0x0, SC_FEINTBOMB,Feint Bomb
|
||||
|
||||
//****
|
||||
// LG Royal Guard
|
||||
@ -1074,7 +1074,7 @@
|
||||
2314,1,6,1,-1,0,0,1,1,no,0,0,0,weapon,0,0x0, LG_RAGEBURST,Rage Burst
|
||||
2315,0,6,4,0:6:0,0x2,0,3,1,yes,0,0,0,none,2:0:0,0x0, LG_SHIELDSPELL,Shield Spell
|
||||
2316,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_EXEEDBREAK,Exceed Break
|
||||
2317,1,6,2,-1,0x2,0,5,1,yes,0,0,0,none,0,0x0, LG_OVERBRAND,Over Brand
|
||||
2317,2,6,2,-1,0x2,0,5,1,yes,0,0,0,weapon,0,0x0, LG_OVERBRAND,Over Brand
|
||||
2318,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_PRESTIGE,Prestige
|
||||
2319,0,6,4,0,0x3,3,5,1,no,0,0,0,weapon,0,0x0, LG_BANDING,Banding //CHECK Splash isnt needed right? Banding has its own UNIT ID.
|
||||
2320,0,6,4,-1,0x2,3,5,1,yes,0,0,0,weapon,0,0x1000, LG_MOONSLASHER,Moon Slasher
|
||||
@ -1135,7 +1135,7 @@
|
||||
2416,0,6,1,-1,0,0,5,1,no,0,0,0,magic,0,0x0, WM_REVERBERATION_MAGIC,Reverberation Magic
|
||||
2417,11,6,2,0,0x3,5,1,1,no,0,0,0,none,0,0x0, WM_DOMINION_IMPULSE,Dominion Impulse
|
||||
2418,9,6,2,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, WM_SEVERE_RAINSTORM,Severe Rainstorm
|
||||
2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,0x0, WM_POEMOFNETHERWORLD,Poem of The Netherworld //CHECK May need to recode too.
|
||||
2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,0x0, WM_POEMOFNETHERWORLD,Poem of The Netherworld
|
||||
2420,0,6,4,0,0x2,2:3:4:5:6,5,1,yes,0,0,0,none,0,0x0, WM_VOICEOFSIREN,Voice of Siren
|
||||
2421,7,6,16,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, WM_DEADHILLHERE,Valley of Death
|
||||
2422,0,6,4,0,0x3,5:6:7:8:9,5,1,yes,0,0,0,none,0,0x0, WM_LULLABY_DEEPSLEEP,Deep Sleep Lullaby
|
||||
|
@ -663,7 +663,7 @@
|
||||
2240,0,0,5,0,0,0,99,0,0,none,0,0,6124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGMASTERY#Warg Mastery#
|
||||
2241,0,0,2,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,0,0 //RA_WUGRIDER#Warg Rider#
|
||||
2242,0,0,4,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGDASH#Warg Dash#
|
||||
2243,0,0,20:22:24:26:28,0,0,0,99,0,0,ridingwarg,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike#
|
||||
2243,0,0,20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike#
|
||||
2244,0,0,40:42:44:46:48,0,0,0,99,0,0,warg,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGBITE#Warg Bite#
|
||||
|
||||
2246,0,0,12,0,0,0,99,0,0,warg,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_SENSITIVEKEEN#Sensitive Keen#
|
||||
@ -773,7 +773,7 @@
|
||||
2342,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,0,0 //SR_CRESCENTELBOW_AUTOSPELL#Crescent Elbow Autospell#
|
||||
2343,0,0,11:12:13:14:15:16:17:18:19:20,0,-11:-12:-13:-14:-15:-16:-17:-18:-19:-20,0,99,0,0,none,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GATEOFHELL#Gate of Hell#
|
||||
2344,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,0,0 //SR_GENTLETOUCH_QUIET#Gentle Touch - Quiet#
|
||||
2345,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CURE#Gentle Touch - Cure#
|
||||
2345,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CURE#Gentle Touch - Cure#
|
||||
2346,0,0,40:50:60:70:80,-1:-2:-3:-4:-5,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,0,0 //SR_GENTLETOUCH_ENERGYGAIN#Gentle Touch - Energy Gain#
|
||||
2347,0,0,40:50:60:70:80,-2:-4:-6:-8:-10,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CHANGE#Gentle Touch - Change#
|
||||
2348,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_REVITALIZE#Gentle Touch - Revitalize#
|
||||
|
@ -101,7 +101,7 @@
|
||||
|
||||
//706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG
|
||||
|
||||
2044,0xca, , 0, 2,3000,all, 0x018 //AB_EPICLESIS
|
||||
2044,0xca, , 0, 2,1000,all, 0x018 //AB_EPICLESIS
|
||||
|
||||
2032,0xe1, , 2, 0,1000,enemy, 0x018 //GC_POISONSMOKE
|
||||
|
||||
@ -126,13 +126,13 @@
|
||||
2301,0xce, , 0, 2, -1,all, 0x200E //SC_CHAOSPANIC
|
||||
2302,0xcf, , 0, 2, -1,enemy, 0x002 //SC_MAELSTROM
|
||||
2303,0xd0, , 0, 2, -1,all, 0x2018 //SC_BLOODYLUST
|
||||
2304,0xd1, , 0, 2,1000,enemy, 0x018 //SC_FEINTBOMB
|
||||
2304,0xd1, , 0, 1,1000,enemy, 0x018 //SC_FEINTBOMB
|
||||
|
||||
2319,0xec, , 0, 3,5000,all, 0x000 //LG_BANDING
|
||||
|
||||
2414,0xda, , 0, 1,1000,enemy, 0x008 //WM_REVERBERATION
|
||||
2418,0xdb, , 0, 5, 300,enemy, 0x800 //WM_SEVERE_RAINSTORM
|
||||
2419,0xde, , 0, 1,1000,all, 0x014 //WM_POEMOFNETHERWORLD
|
||||
2419,0xde, , 0, 1,1000,enemy, 0x014 //WM_POEMOFNETHERWORLD
|
||||
|
||||
2443,0xdc, , 0, 0,1000,enemy, 0x00A //SO_FIREWALK
|
||||
2444,0xdd, , 0, 0,1000,enemy, 0x00A //SO_ELECTRICWALK
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -365,7 +365,7 @@
|
||||
248,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, CR_TRUST,Faith
|
||||
249,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, CR_AUTOGUARD,Guard
|
||||
250,3,6,1,0,0,0,5,1,no,0,0,0,weapon,5:6:7:8:9,0x0, CR_SHIELDCHARGE,Smite
|
||||
251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x0, CR_SHIELDBOOMERANG,Shield Boomerang
|
||||
251,3:5:7:9:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, CR_SHIELDBOOMERANG,Shield Boomerang
|
||||
252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0, CR_REFLECTSHIELD,Shield Reflect
|
||||
253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0,0x0, CR_HOLYCROSS,Holy Cross
|
||||
254,5,6,4,6,0x48,0,10,1,no,33,0x100,0,magic,0,0x0, CR_GRANDCROSS,Grand Cross
|
||||
@ -885,8 +885,8 @@
|
||||
2004,5,8,1,-1,0,0,10,-5,no,0,0,0,weapon,0,0x0, RK_HUNDREDSPEAR,Hundred Spear
|
||||
2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,0x0, RK_WINDCUTTER,Wind Cutter
|
||||
2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,0x0, RK_IGNITIONBREAK,Ignition Break
|
||||
2007,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, RK_DRAGONTRAINING,Dragon Training
|
||||
2008,9,6,2,3,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2007,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RK_DRAGONTRAINING,Dragon Training
|
||||
2008,9,6,2,3,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2009,0,6,4,0,0x3,3:4:5:6:7,5,1,no,0,0,0,none,0,0x0, RK_DRAGONHOWLING,Dragon Howling
|
||||
2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RK_RUNEMASTERY,Rune Mastery
|
||||
2011,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, RK_MILLENNIUMSHIELD,Millenium Shield
|
||||
@ -992,9 +992,9 @@
|
||||
2239,3,6,2,0,0x42,3,5,1,no,0,0x80,3,misc,0,0x2800, RA_CLUSTERBOMB,Cluster Bomb
|
||||
2240,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x0, RA_WUGMASTERY,Warg Mastery
|
||||
2241,0,6,4,0,0,0,3,1,no,0,0,0,none,0,0x2000, RA_WUGRIDER,Warg Rider
|
||||
2242,0,6,4,-1,0x2,1,1,0,no,0,0,0,weapon,0,0x2000, RA_WUGDASH,Warg Dash
|
||||
2243,9,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x2000, RA_WUGSTRIKE,Warg Strike
|
||||
2244,9,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x80, RA_WUGBITE,Warg Bite
|
||||
2242,0,6,4,-1,0x42,1,1,0,no,0,0,0,weapon,0,0x2000, RA_WUGDASH,Warg Dash
|
||||
2243,9,6,1,0,0x40,0,5,1,no,0,0,0,misc,0,0x2000, RA_WUGSTRIKE,Warg Strike
|
||||
2244,9,6,1,0,0x40,0,5,1,no,0,0,0,weapon,0,0x80, RA_WUGBITE,Warg Bite
|
||||
2245,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RA_TOOTHOFWUG,Tooth of Warg
|
||||
2246,0,6,4,0,0x2,3:4:5:6:7,5,1,no,0,0,0,weapon,0,0x0, RA_SENSITIVEKEEN,Sensitive Keen
|
||||
2247,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x42, RA_CAMOUFLAGE,Camouflage
|
||||
@ -1020,7 +1020,7 @@
|
||||
2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide
|
||||
2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_B_SIDESLIDE,Back-Side Slide
|
||||
2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure // Check me. Part of the code notes translated to "The amount of fuel have".
|
||||
2267,0,6,4,-1,0x4A,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction
|
||||
2267,0,6,4,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction
|
||||
2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0, NC_SHAPESHIFT,Shape Shift
|
||||
2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_EMERGENCYCOOL,Emergency Cool
|
||||
2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0, NC_INFRAREDSCAN,Infrared Scan
|
||||
@ -1060,7 +1060,7 @@
|
||||
2301,7,6,2,0,0x1,0,3,1,yes,0,0x20000,0,none,0,0x0, SC_CHAOSPANIC,Chaos Panic
|
||||
2302,7,6,2,0,0x1,0,3,1,yes,0,0x20000,0,none,0,0x0, SC_MAELSTROM,Maelstrom
|
||||
2303,7,6,2,0,0x1,3,3,1,yes,0,0,1,none,0,0x0, SC_BLOODYLUST,Bloody Lust
|
||||
2304,0,6,4,-1,0,0,3,1,no,0,0,0,weapon,0,0x0, SC_FEINTBOMB,Feint Bomb
|
||||
2304,0,6,4,-1,0,2,3,1,no,0,0,0,weapon,0,0x0, SC_FEINTBOMB,Feint Bomb
|
||||
|
||||
//****
|
||||
// LG Royal Guard
|
||||
@ -1074,7 +1074,7 @@
|
||||
2314,1,6,1,-1,0,0,1,1,no,0,0,0,weapon,0,0x0, LG_RAGEBURST,Rage Burst
|
||||
2315,0,6,4,0:6:0,0x2,0,3,1,yes,0,0,0,none,2:0:0,0x0, LG_SHIELDSPELL,Shield Spell
|
||||
2316,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_EXEEDBREAK,Exceed Break
|
||||
2317,1,6,2,-1,0x2,0,5,1,yes,0,0,0,none,0,0x0, LG_OVERBRAND,Over Brand
|
||||
2317,2,6,2,-1,0x2,0,5,1,yes,0,0,0,weapon,0,0x0, LG_OVERBRAND,Over Brand
|
||||
2318,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_PRESTIGE,Prestige
|
||||
2319,0,6,4,0,0x3,3,5,1,no,0,0,0,weapon,0,0x0, LG_BANDING,Banding //CHECK Splash isnt needed right? Banding has its own UNIT ID.
|
||||
2320,0,6,4,-1,0x2,3,5,1,yes,0,0,0,weapon,0,0x1000, LG_MOONSLASHER,Moon Slasher
|
||||
@ -1135,7 +1135,7 @@
|
||||
2416,0,6,1,-1,0,0,5,1,no,0,0,0,magic,0,0x0, WM_REVERBERATION_MAGIC,Reverberation Magic
|
||||
2417,11,6,2,0,0x3,5,1,1,no,0,0,0,none,0,0x0, WM_DOMINION_IMPULSE,Dominion Impulse
|
||||
2418,9,6,2,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, WM_SEVERE_RAINSTORM,Severe Rainstorm
|
||||
2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,0x0, WM_POEMOFNETHERWORLD,Poem of The Netherworld //CHECK May need to recode too.
|
||||
2419,9,6,2,0,0x3,1,5,1,yes,0,0x80,5,none,0,0x0, WM_POEMOFNETHERWORLD,Poem of The Netherworld
|
||||
2420,0,6,4,0,0x2,2:3:4:5:6,5,1,yes,0,0,0,none,0,0x0, WM_VOICEOFSIREN,Voice of Siren
|
||||
2421,7,6,16,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, WM_DEADHILLHERE,Valley of Death
|
||||
2422,0,6,4,0,0x3,5:6:7:8:9,5,1,yes,0,0,0,none,0,0x0, WM_LULLABY_DEEPSLEEP,Deep Sleep Lullaby
|
||||
@ -1304,7 +1304,7 @@
|
||||
5001,1,8,1,-1,0,0,5,3,no,0,0,0,weapon,0,0x0, GC_DARKCROW,Dark Claw
|
||||
5002,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, RA_UNLIMIT,Unlimited
|
||||
5003,7,6,1,-1,0x2,4:5:6:7:8,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping
|
||||
5004,9,6,2,1,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water
|
||||
5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water
|
||||
5005,0,6,4,0,0x3,3,1,1,no,0,0,0,none,0,0x0, RK_LUXANIMA,Lux Anima
|
||||
5006,1,6,2,3,0,0,5,1,no,0,0,3,misc,0,0x0, NC_MAGMA_ERUPTION,Magma Eruption
|
||||
5007,0,6,4,0,0x3,5:6:7:8:9,5,1,no,0,0,0,none,0,0x0, WM_FRIGG_SONG,Frigg's Song
|
||||
|
@ -663,7 +663,7 @@
|
||||
2240,0,0,5,0,0,0,99,0,0,none,0,0,6124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGMASTERY#Warg Mastery#
|
||||
2241,0,0,2,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,0,0 //RA_WUGRIDER#Warg Rider#
|
||||
2242,0,0,4,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGDASH#Warg Dash#
|
||||
2243,0,0,20:22:24:26:28,0,0,0,99,0,0,ridingwarg,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike#
|
||||
2243,0,0,20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGSTRIKE#Warg Strike#
|
||||
2244,0,0,40:42:44:46:48,0,0,0,99,0,0,warg,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_WUGBITE#Warg Bite#
|
||||
|
||||
2246,0,0,12,0,0,0,99,0,0,warg,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RA_SENSITIVEKEEN#Sensitive Keen#
|
||||
@ -773,7 +773,7 @@
|
||||
2342,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,0,0 //SR_CRESCENTELBOW_AUTOSPELL#Crescent Elbow Autospell#
|
||||
2343,0,0,11:12:13:14:15:16:17:18:19:20,0,-11:-12:-13:-14:-15:-16:-17:-18:-19:-20,0,99,0,0,none,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GATEOFHELL#Gate of Hell#
|
||||
2344,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,0,0 //SR_GENTLETOUCH_QUIET#Gentle Touch - Quiet#
|
||||
2345,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CURE#Gentle Touch - Cure#
|
||||
2345,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CURE#Gentle Touch - Cure#
|
||||
2346,0,0,40:50:60:70:80,-1:-2:-3:-4:-5,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,0,0 //SR_GENTLETOUCH_ENERGYGAIN#Gentle Touch - Energy Gain#
|
||||
2347,0,0,40:50:60:70:80,-2:-4:-6:-8:-10,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_CHANGE#Gentle Touch - Change#
|
||||
2348,0,0,40:50:60:70:80,0,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_GENTLETOUCH_REVITALIZE#Gentle Touch - Revitalize#
|
||||
|
@ -128,13 +128,13 @@
|
||||
2301,0xce, , 0, 2, -1,all, 0x200E //SC_CHAOSPANIC
|
||||
2302,0xcf, , 0, 2, -1,enemy, 0x002 //SC_MAELSTROM
|
||||
2303,0xd0, , 0, 2, -1,all, 0x2018 //SC_BLOODYLUST
|
||||
2304,0xd1, , 0, 2,1000,enemy, 0x018 //SC_FEINTBOMB
|
||||
2304,0xd1, , 0, 1,1000,enemy, 0x018 //SC_FEINTBOMB
|
||||
|
||||
2319,0xec, , 0, 3,5000,all, 0x000 //LG_BANDING
|
||||
|
||||
2414,0xda, , 0, 1,1000,enemy, 0x008 //WM_REVERBERATION
|
||||
2418,0xdb, , 0, 5, 300,enemy, 0x800 //WM_SEVERE_RAINSTORM
|
||||
2419,0xde, , 0, 1,1000,all, 0x014 //WM_POEMOFNETHERWORLD
|
||||
2419,0xde, , 0, 1,1000,enemy, 0x014 //WM_POEMOFNETHERWORLD
|
||||
|
||||
2443,0xdc, , 0, 0,1000,enemy, 0x00A //SO_FIREWALK
|
||||
2444,0xdd, , 0, 0,1000,enemy, 0x00A //SO_ELECTRICWALK
|
||||
|
@ -402,23 +402,6 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
|
||||
break;
|
||||
}
|
||||
} //end tsc check
|
||||
if (src && src->type == BL_PC) {
|
||||
TBL_PC *sd = BL_CAST(BL_PC,src);
|
||||
int s;
|
||||
|
||||
ARR_FIND(1, 6, s, sd->talisman[s] > 0);
|
||||
|
||||
if( s < 5 && atk_elem == s )
|
||||
ratio += sd->talisman[s] * 2; // +2% custom value
|
||||
}
|
||||
if( target && target->type == BL_PC ) {
|
||||
TBL_PC *tsd = BL_CAST(BL_PC, target);
|
||||
int t;
|
||||
|
||||
ARR_FIND(1, 6, t, tsd->talisman[t] > 0);
|
||||
if( t < 5 && atk_elem == t )
|
||||
DAMAGE_SUBRATE(tsd->talisman[t] * 3) // -3% custom value
|
||||
}
|
||||
return (int64)damage*ratio/100;
|
||||
}
|
||||
|
||||
@ -3758,17 +3741,7 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li
|
||||
struct status_change *tsc = status_get_sc(target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
int atk = 0, chorusbonus = 0;
|
||||
|
||||
// Minstrel/Wanderer number check for chorus skills.
|
||||
// Bonus remains 0 unless 3 or more Minstrels/Wanderers are in the party.
|
||||
if( sd && sd->status.party_id ) {
|
||||
chorusbonus = party_foreachsamemap(party_sub_count_class, sd, MAPID_THIRDMASK, MAPID_MINSTRELWANDERER);
|
||||
if( chorusbonus > 7 )
|
||||
chorusbonus = 5; // Maximum effect possible from 7 or more Minstrels/Wanderers
|
||||
else if( chorusbonus > 2 )
|
||||
chorusbonus = chorusbonus - 2; // Effect bonus from additional Minstrels/Wanderers if not above the max possible.
|
||||
}
|
||||
int atk = 0;
|
||||
|
||||
//Constant/misc additions from skills
|
||||
switch (skill_id) {
|
||||
@ -3805,8 +3778,6 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li
|
||||
case RA_WUGBITE:
|
||||
if(sd)
|
||||
atk = (30*pc_checkskill(sd, RA_TOOTHOFWUG));
|
||||
if( sc && sc->data[SC_DANCEWITHWUG] )
|
||||
atk += skill_lv * 10 * chorusbonus; // Dance With Wug Bonus. ATK = [(Skill Level x 10) x Number of Maestro/Wanderer in party(Maximum of 7)] %
|
||||
break;
|
||||
case SR_GATEOFHELL:
|
||||
atk = (status_get_max_hp(src) - status_get_hp(src));
|
||||
@ -3866,9 +3837,45 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li
|
||||
*/
|
||||
struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, uint16 skill_id)
|
||||
{
|
||||
struct map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
struct status_change *sc = status_get_sc(src);
|
||||
int chorusbonus = 0, type;
|
||||
|
||||
if( sd ) {
|
||||
// Minstrel/Wanderer number check for chorus skills.
|
||||
// Bonus remains 0 unless 3 or more Minstrels/Wanderers are in the party.
|
||||
if( sd->status.party_id ) {
|
||||
chorusbonus = party_foreachsamemap(party_sub_count_class, sd, MAPID_THIRDMASK, MAPID_MINSTRELWANDERER);
|
||||
if( chorusbonus > 7 )
|
||||
chorusbonus = 5; // Maximum effect possible from 7 or more Minstrels/Wanderers
|
||||
else if( chorusbonus > 2 )
|
||||
chorusbonus = chorusbonus - 2; // Effect bonus from additional Minstrels/Wanderers if not above the max possible.
|
||||
}
|
||||
|
||||
// Kagerou/Oboro Earth Charm effect +15% wATK
|
||||
ARR_FIND(1, 6, type, sd->talisman[type] > 0);
|
||||
if( type == 2 ) {
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, 15 * sd->talisman[type]);
|
||||
#ifdef RENEWAL
|
||||
ATK_ADDRATE(wd.weaponAtk, wd.weaponAtk2, 15 * sd->talisman[type]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
//The following are applied on top of current damage and are stackable.
|
||||
if ( sc ) {
|
||||
if( sc->data[SC_DANCEWITHWUG] ) {
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_DANCEWITHWUG]->val1 * 2 * chorusbonus);
|
||||
#ifdef RENEWAL
|
||||
ATK_ADDRATE(wd.equipAtk, wd.equipAtk2, sc->data[SC_DANCEWITHWUG]->val1 * 2 * chorusbonus);
|
||||
#endif
|
||||
if( skill_id == RA_WUGSTRIKE || skill_id == RA_WUGBITE || skill_id == RA_WUGDASH ) {
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_DANCEWITHWUG]->val1 * 10 * chorusbonus);
|
||||
#ifdef RENEWAL
|
||||
RE_ALLATK_ADDRATE(wd, sc->data[SC_DANCEWITHWUG]->val1 * 10 * chorusbonus);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifndef RENEWAL
|
||||
if( sc->data[SC_TRUESIGHT] )
|
||||
ATK_ADDRATE(wd.damage, wd.damage2, 2*sc->data[SC_TRUESIGHT]->val1);
|
||||
@ -3980,11 +3987,20 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
|
||||
#endif
|
||||
if( sd ) {
|
||||
int i = sd->ignore_def_by_race[tstatus->race] + sd->ignore_def_by_race[RC_ALL];
|
||||
int type;
|
||||
if( i ) {
|
||||
if( i > 100 ) i = 100;
|
||||
def1 -= def1 * i / 100;
|
||||
def2 -= def2 * i / 100;
|
||||
}
|
||||
|
||||
//Kagerou/Oboro Earth Charm effect +5% eDEF
|
||||
ARR_FIND(1, 6, type, sd->talisman[type] > 0);
|
||||
if( type == 2 ) {
|
||||
short i = 5 * sd->talisman[type];
|
||||
|
||||
def1 = (def1 * (100 + i)) / 100;
|
||||
}
|
||||
}
|
||||
|
||||
if( sc && sc->data[SC_EXPIATIO] ){
|
||||
@ -7399,6 +7415,7 @@ static const struct _battle_data {
|
||||
{ "feature.warp_suggestions", &battle_config.warp_suggestions_enabled, 0, 0, 1, },
|
||||
{ "taekwon_mission_mobname", &battle_config.taekwon_mission_mobname, 0, 0, 2, },
|
||||
{ "teleport_on_portal", &battle_config.teleport_on_portal, 0, 0, 1, },
|
||||
{ "cart_revo_knockback", &battle_config.cart_revo_knockback, 1, 0, 1, },
|
||||
};
|
||||
#ifndef STATS_OPT_OUT
|
||||
/**
|
||||
|
@ -537,6 +537,7 @@ extern struct Battle_Config
|
||||
int warp_suggestions_enabled;
|
||||
int taekwon_mission_mobname;
|
||||
int teleport_on_portal;
|
||||
int cart_revo_knockback;
|
||||
} battle_config;
|
||||
|
||||
void do_init_battle(void);
|
||||
|
327
src/map/skill.c
327
src/map/skill.c
@ -105,6 +105,11 @@ int firewall_unit_pos;
|
||||
int icewall_unit_pos;
|
||||
int earthstrain_unit_pos;
|
||||
int firerain_unit_pos;
|
||||
|
||||
struct s_skill_nounit_layout skill_nounit_layout[MAX_SKILL_UNIT_LAYOUT];
|
||||
int overbrand_nounit_pos;
|
||||
int overbrand_brandish_nounit_pos;
|
||||
|
||||
//early declaration
|
||||
int skill_block_check(struct block_list *bl, enum sc_type type, uint16 skill_id);
|
||||
static int skill_check_unit_range (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
|
||||
@ -801,6 +806,17 @@ struct s_skill_unit_layout* skill_get_unit_layout (uint16 skill_id, uint16 skill
|
||||
return &skill_unit_layout[0]; // default 1x1 layout
|
||||
}
|
||||
|
||||
struct s_skill_nounit_layout* skill_get_nounit_layout(uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y, int dir)
|
||||
{
|
||||
if( skill_id == LG_OVERBRAND )
|
||||
return &skill_nounit_layout[overbrand_nounit_pos + dir];
|
||||
else if( skill_id == LG_OVERBRAND_BRANDISH )
|
||||
return &skill_nounit_layout[overbrand_brandish_nounit_pos + dir];
|
||||
|
||||
ShowError("skill_get_nounit_layout: unknown no-unit layout for skill %d (level %d)\n", skill_id, skill_lv);
|
||||
return &skill_nounit_layout[0];
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Add effect to skill when hit succesfully target
|
||||
*------------------------------------------*/
|
||||
@ -1373,17 +1389,22 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
|
||||
sc_start(src,bl, SC_STUN, 30 + 8 * skill_lv + (status_get_dex(src) / 10) + (status_get_lv(src) / 4), skill_lv, skill_get_time(skill_id,skill_lv));
|
||||
break;
|
||||
case LG_PINPOINTATTACK:
|
||||
rate = 30 + (((5 * ((sd) ? pc_checkskill(sd,LG_PINPOINTATTACK) : skill_lv)) + (status_get_agi(src) + status_get_lv(src))) / 10);
|
||||
rate = 30 + 5 * ((sd) ? pc_checkskill(sd,LG_PINPOINTATTACK) : skill_lv) + (status_get_agi(src) + status_get_lv(src)) / 10;
|
||||
switch( skill_lv ) {
|
||||
case 1:
|
||||
sc_start2(src,bl,SC_BLEEDING,rate,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
|
||||
break;
|
||||
case 2:
|
||||
if( dstsd && dstsd->spiritball && rnd()%100 < rate )
|
||||
pc_delspiritball(dstsd, dstsd->spiritball, 0);
|
||||
skill_break_equip(src, bl, EQP_HELM, rate * 100, BCT_ENEMY);
|
||||
break;
|
||||
default:
|
||||
skill_break_equip(src,bl,(skill_lv == 3) ? EQP_SHIELD : (skill_lv == 4) ? EQP_ARMOR : EQP_WEAPON,rate * 100,BCT_ENEMY);
|
||||
case 3:
|
||||
skill_break_equip(src, bl, EQP_SHIELD, rate * 100, BCT_ENEMY);
|
||||
break;
|
||||
case 4:
|
||||
skill_break_equip(src, bl, EQP_ARMOR, rate * 100, BCT_ENEMY);
|
||||
break;
|
||||
case 5:
|
||||
skill_break_equip(src, bl, EQP_WEAPON, rate * 100, BCT_ENEMY);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -3042,7 +3063,10 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
case WL_CRIMSONROCK:
|
||||
dir = map_calc_dir(bl,skill_area_temp[4],skill_area_temp[5]);
|
||||
break;
|
||||
|
||||
case MC_CARTREVOLUTION:
|
||||
if (battle_config.cart_revo_knockback)
|
||||
dir = 2; // Official servers push target to the West
|
||||
break;
|
||||
}
|
||||
//blown-specific handling
|
||||
switch( skill_id ) {
|
||||
@ -3753,14 +3777,12 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
||||
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag);
|
||||
break;
|
||||
case LG_OVERBRAND_BRANDISH: {
|
||||
short x2 = src->x, y2 = src->y, x = x2, y = y2;
|
||||
switch(skl->type) {
|
||||
case 0: case 1: case 7: x2 += 4; x -= 4; y2 += 4; break;
|
||||
case 3: case 4: case 5: x2 += 4; x -= 4; y -= 4; break;
|
||||
case 2: y2 += 4; y -= 4; x -= 4; break;
|
||||
case 6: y2 += 4; y -= 4; x2 += 4; break;
|
||||
}
|
||||
map_foreachinarea(skill_area_sub, src->m, x, y, x2, y2, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
||||
int x = src->x, y = src->y;
|
||||
int i, dir = map_calc_dir(src,x,y);
|
||||
struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skl->skill_id,skl->skill_lv,src,x,y,dir);
|
||||
|
||||
for( i = 0; i < layout->count; i++ )
|
||||
map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id);
|
||||
}
|
||||
break;
|
||||
case RL_FIRE_RAIN: {
|
||||
@ -5090,6 +5112,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
status_change_end(bl, SC_RUSHWINDMILL, INVALID_TIMER);
|
||||
status_change_end(bl, SC_ECHOSONG, INVALID_TIMER);
|
||||
status_change_end(bl, SC_HARMONIZE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER);
|
||||
status_change_end(bl, SC_VOICEOFSIREN, INVALID_TIMER);
|
||||
status_change_end(bl, SC_DEEPSLEEP, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SIRCLEOFNATURE, INVALID_TIMER);
|
||||
@ -6460,12 +6483,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,i);
|
||||
break;
|
||||
case TF_HIDING:
|
||||
case ST_CHASEWALK: {
|
||||
struct status_change* sc = status_get_sc(src);
|
||||
|
||||
if( sc && sc->data[SC__FEINTBOMB] )
|
||||
status_change_end(bl, SC__FEINTBOMB, INVALID_TIMER);
|
||||
}
|
||||
case ST_CHASEWALK:
|
||||
case KO_YAMIKUMO:
|
||||
if (tsce)
|
||||
{
|
||||
@ -6646,6 +6664,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
status_change_end(bl, SC_SLEEP, INVALID_TIMER);
|
||||
status_change_end(bl, SC_STUN, INVALID_TIMER);
|
||||
status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NETHERWORLD, INVALID_TIMER);
|
||||
}
|
||||
//Is this equation really right? It looks so... special.
|
||||
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
||||
@ -7016,6 +7035,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case AM_CP_HELM:
|
||||
{
|
||||
unsigned int equip[] = {EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HEAD_TOP};
|
||||
enum sc_type scid = (sc_type)(SC_STRIPWEAPON + (skill_id - AM_CP_WEAPON));
|
||||
|
||||
if( sd && ( bl->type != BL_PC || ( dstsd && pc_checkequip(dstsd,equip[skill_id - AM_CP_WEAPON]) < 0 ) ) ){
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
@ -7023,6 +7043,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_change_end(bl, scid, INVALID_TIMER);
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
}
|
||||
@ -7767,9 +7788,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
unsigned int equip[] = {EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HEAD_TOP};
|
||||
int i, s = 0, skilltime = skill_get_time(skill_id,skill_lv);
|
||||
|
||||
for (i=0 ; i<4; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
if( bl->type != BL_PC || ( dstsd && pc_checkequip(dstsd,equip[i]) < 0 ) )
|
||||
continue;
|
||||
status_change_end(bl, (sc_type)(SC_STRIPWEAPON + i), INVALID_TIMER);
|
||||
sc_start(src,bl,(sc_type)(SC_CP_WEAPON + i),100,skill_lv,skilltime);
|
||||
s++;
|
||||
}
|
||||
@ -8524,7 +8546,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
|
||||
case AB_LAUDAAGNUS:
|
||||
if( flag&1 || sd == NULL ) {
|
||||
if( flag&1 || sd == NULL || !sd->status.party_id ) {
|
||||
if( tsc && (tsc->data[SC_FREEZE] || tsc->data[SC_STONE] || tsc->data[SC_BLIND] ||
|
||||
tsc->data[SC_BURNING] || tsc->data[SC_FREEZING] || tsc->data[SC_CRYSTALIZE])) {
|
||||
// Success Chance: (40 + 10 * Skill Level) %
|
||||
@ -8544,7 +8566,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
|
||||
case AB_LAUDARAMUS:
|
||||
if( flag&1 || sd == NULL ) {
|
||||
if( flag&1 || sd == NULL || !sd->status.party_id ) {
|
||||
if( tsc && (tsc->data[SC_SLEEP] || tsc->data[SC_STUN] || tsc->data[SC_MANDRAGORA] || tsc->data[SC_SILENCE] || tsc->data[SC_DEEPSLEEP]) ){
|
||||
// Success Chance: (40 + 10 * Skill Level) %
|
||||
if( rnd()%100 > 40+10*skill_lv ) break;
|
||||
@ -11182,16 +11204,12 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
break;
|
||||
|
||||
case LG_OVERBRAND: {
|
||||
uint8 dir = map_calc_dir(src, x, y);
|
||||
uint8 x2 = x = src->x, y2 = y = src->y;
|
||||
switch(dir) {
|
||||
case 0: case 1: case 7: x2++; x--; y2 += 7; break;
|
||||
case 3: case 4: case 5: x2++; x--; y -= 7; break;
|
||||
case 2: y2++; y--; x -= 7; break;
|
||||
case 6: y2++; y--; x2 += 7; break;
|
||||
}
|
||||
map_foreachinarea(skill_area_sub, src->m, x, y, x2, y2, BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
||||
skill_addtimerskill(src, gettick() + status_get_amotion(src), 0, 0, 0, LG_OVERBRAND_BRANDISH, skill_lv, dir, flag);
|
||||
int dir = map_calc_dir(src,x,y);
|
||||
struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skill_id,skill_lv,src,x,y,dir);
|
||||
|
||||
for( i = 0; i < layout->count; i++ )
|
||||
map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id);
|
||||
skill_addtimerskill(src,gettick() + status_get_amotion(src),0,0,0,LG_OVERBRAND_BRANDISH,skill_lv,dir,flag);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -11919,6 +11937,8 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
|
||||
interval = limit;
|
||||
val2 = 1;
|
||||
case WM_POEMOFNETHERWORLD: // Can't be placed on top of Land Protector.
|
||||
if( skill_id == WM_POEMOFNETHERWORLD && map_flag_gvg2(src->m) )
|
||||
target = BCT_ALL;
|
||||
case WM_SEVERE_RAINSTORM:
|
||||
case SO_WATER_INSIGNIA:
|
||||
case SO_FIRE_INSIGNIA:
|
||||
@ -12804,22 +12824,23 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
break;
|
||||
|
||||
case UNT_EPICLESIS:
|
||||
if( bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON )
|
||||
{
|
||||
if( ++sg->val2 % 3 == 0 ) {
|
||||
int hp, sp;
|
||||
switch( sg->skill_lv ) {
|
||||
case 1: case 2: hp = 3; sp = 2; break;
|
||||
case 3: case 4: hp = 4; sp = 3; break;
|
||||
case 5: default: hp = 5; sp = 4; break;
|
||||
}
|
||||
hp = tstatus->max_hp * hp / 100;
|
||||
sp = tstatus->max_sp * sp / 100;
|
||||
status_heal(bl, hp, sp, 3);
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, (sg->interval * 3) + 100);
|
||||
if( bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON ) {
|
||||
int hp, sp;
|
||||
switch( sg->skill_lv ) {
|
||||
case 1: case 2: hp = 3; sp = 2; break;
|
||||
case 3: case 4: hp = 4; sp = 3; break;
|
||||
case 5: default: hp = 5; sp = 4; break;
|
||||
}
|
||||
hp = tstatus->max_hp * hp / 100;
|
||||
sp = tstatus->max_sp * sp / 100;
|
||||
if (tsc && tsc->data[SC_AKAITSUKI] && hp)
|
||||
hp = ~hp + 1;
|
||||
status_heal(bl, hp, sp, 3);
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval + 100);
|
||||
sg->val2++;
|
||||
// Reveal hidden players every 5 seconds.
|
||||
if( sg->val2 % 5 == 0 ) {
|
||||
if( sg->val2 >= 5 ) {
|
||||
sg->val2 = 0;
|
||||
// Doesn't remove Invisibility or Chase Walk.
|
||||
status_change_end(bl,SC_HIDING,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
||||
@ -12857,7 +12878,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
skill_attack(BF_WEAPON,ss,&src->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
|
||||
break;
|
||||
case UNT_NETHERWORLD:
|
||||
if( !(status_get_mode(bl)&MD_BOSS) ) {
|
||||
if( !(status_get_mode(bl)&MD_BOSS) || (!map_flag_gvg2(ss->m) && battle_check_target(&src->bl,bl,BCT_PARTY) < 0) ) {
|
||||
if( !(tsc && tsc->data[type]) )
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv));
|
||||
}
|
||||
@ -12980,27 +13001,46 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
case UNT_ZENKAI_LAND:
|
||||
case UNT_ZENKAI_FIRE:
|
||||
case UNT_ZENKAI_WIND:
|
||||
if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 ){
|
||||
switch( sg->unit_id ){
|
||||
if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 ) {
|
||||
switch( sg->unit_id ) {
|
||||
case UNT_ZENKAI_WATER:
|
||||
sc_start(ss, bl, SC_CRYSTALIZE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
sc_start(ss, bl, SC_FREEZE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
sc_start(ss, bl, SC_FREEZING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
switch (rnd()%2 + 1) {
|
||||
case 1:
|
||||
sc_start(ss, bl, SC_FREEZE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
case 2:
|
||||
sc_start(ss, bl, SC_FREEZING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case UNT_ZENKAI_LAND:
|
||||
sc_start(ss, bl, SC_STONE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
sc_start(ss, bl, SC_POISON, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
switch (rnd()%2 + 1) {
|
||||
case 1:
|
||||
sc_start(ss, bl, SC_STONE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
case 2:
|
||||
sc_start(ss, bl, SC_POISON, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case UNT_ZENKAI_FIRE:
|
||||
sc_start(ss, bl, SC_BURNING, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
case UNT_ZENKAI_WIND:
|
||||
sc_start(ss, bl, SC_SILENCE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
sc_start(ss,bl, SC_SLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
sc_start(ss, bl, SC_DEEPSLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
switch (rnd()%3 + 1) {
|
||||
case 1:
|
||||
sc_start(ss, bl, SC_SLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
case 2:
|
||||
sc_start(ss, bl, SC_SILENCE, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
case 3:
|
||||
sc_start(ss, bl, SC_DEEPSLEEP, sg->val1*5, sg->skill_lv, skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}else
|
||||
} else
|
||||
sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
|
||||
@ -16927,7 +16967,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
||||
struct status_change *sc;
|
||||
if (src && (sc = status_get_sc(src)) != NULL && sc->data[SC__FEINTBOMB]) { // Copycat explodes if caster is still hidden.
|
||||
map_foreachinrange(skill_area_sub, &group->unit->bl, unit->range, splash_target(src), src, SC_FEINTBOMB, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
||||
status_change_end(src, SC__FEINTBOMB, INVALID_TIMER);
|
||||
status_change_end(bl, SC__FEINTBOMB, INVALID_TIMER);
|
||||
}
|
||||
skill_delunit(unit);
|
||||
}
|
||||
@ -18808,6 +18848,172 @@ void skill_init_unit_layout (void) {
|
||||
|
||||
}
|
||||
|
||||
void skill_init_nounit_layout (void) {
|
||||
int i, pos = 0;
|
||||
|
||||
memset(skill_nounit_layout,0,sizeof(skill_nounit_layout));
|
||||
|
||||
overbrand_nounit_pos = pos;
|
||||
for( i = 0; i < 8; i++ ) {
|
||||
if( i&1 ) {
|
||||
skill_nounit_layout[pos].count = 33;
|
||||
if( i&2 ) {
|
||||
if( i&4 ) { // 7
|
||||
int dx[] = { 5, 6, 7, 5, 6, 4, 5, 6, 4, 5, 3, 4, 5, 3, 4, 2, 3, 4, 2, 3, 1, 2, 3, 1, 2, 0, 1, 2, 0, 1,-1, 0, 1};
|
||||
int dy[] = { 7, 6, 5, 6, 5, 6, 5, 4, 5, 4, 5, 4, 3, 4, 3, 4, 3, 2, 3, 2, 3, 2, 1, 2, 1, 2, 1, 0, 1, 0, 1, 0,-1};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 3
|
||||
int dx[] = {-5,-6,-7,-5,-6,-4,-5,-6,-4,-5,-3,-4,-5,-3,-4,-2,-3,-4,-2,-3,-1,-2,-3,-1,-2, 0,-1,-2, 0,-1, 1, 0,-1};
|
||||
int dy[] = {-7,-6,-5,-6,-5,-6,-5,-4,-5,-4,-5,-4,-3,-4,-3,-4,-3,-2,-3,-2,-3,-2,-1,-2,-1,-2,-1, 0,-1, 0,-1, 0, 1};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
} else {
|
||||
if( i&4 ) { // 5
|
||||
int dx[] = { 7, 6, 5, 6, 5, 6, 5, 4, 5, 4, 5, 4, 3, 4, 3, 4, 3, 2, 3, 2, 3, 2, 1, 2, 1, 2, 1, 0, 1, 0, 1, 0,-1};
|
||||
int dy[] = {-5,-6,-7,-5,-6,-4,-5,-6,-4,-5,-3,-4,-5,-3,-4,-2,-3,-4,-2,-3,-1,-2,-3,-1,-2, 0,-1,-2, 0,-1, 1, 0,-1};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 1
|
||||
int dx[] = {-7,-6,-5,-6,-5,-6,-5,-4,-5,-4,-5,-4,-3,-4,-3,-4,-3,-2,-3,-2,-3,-2,-1,-2,-1,-2,-1, 0,-1, 0,-1, 0, 1};
|
||||
int dy[] = { 5, 6, 7, 5, 6, 4, 5, 6, 4, 5, 3, 4, 5, 3, 4, 2, 3, 4, 2, 3, 1, 2, 3, 1, 2, 0, 1, 2, 0, 1,-1, 0, 1};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
skill_nounit_layout[pos].count = 21;
|
||||
if( i&2 ) {
|
||||
if( i&4 ) { // 6
|
||||
int dx[] = { 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6};
|
||||
int dy[] = { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 2
|
||||
int dx[] = {-6,-5,-4,-3,-2,-1, 0,-6,-5,-4,-3,-2,-1, 0,-6,-5,-4,-3,-2,-1, 0};
|
||||
int dy[] = { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
} else {
|
||||
if( i&4 ) { // 4
|
||||
int dx[] = {-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
|
||||
int dy[] = { 0, 0, 0,-1,-1,-1,-2,-2,-2,-3,-3,-3,-4,-4,-4,-5,-5,-5,-6,-6,-6};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 0
|
||||
int dx[] = {-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
|
||||
int dy[] = { 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
}
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
overbrand_brandish_nounit_pos = pos;
|
||||
for( i = 0; i < 8; i++ ) {
|
||||
if( i&1 ) {
|
||||
skill_nounit_layout[pos].count = 74;
|
||||
if( i&2 ) {
|
||||
if( i&4 ) { // 7
|
||||
int dx[] = {-2,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
-3,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,-3,-2,-1,-0, 1, 2, 3, 4, 5, 6,
|
||||
-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6,-4,-3,-2,-1,-0, 1, 2, 3, 4, 5,
|
||||
-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
||||
int dy[] = { 8, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2,
|
||||
7, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3,
|
||||
6, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,
|
||||
5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 3
|
||||
int dx[] = { 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,-8, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,
|
||||
3, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6,
|
||||
4, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5,
|
||||
5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
||||
int dy[] = {-8,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,
|
||||
-7,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,
|
||||
-6,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,
|
||||
-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
} else {
|
||||
if( i&4 ) { // 5
|
||||
int dx[] = { 8, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2, 7, 6, 5, 4, 3, 2, 1, 0,-1,-2,
|
||||
7, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3, 6, 5, 4, 3, 2, 1, 0,-1,-2,-3,
|
||||
6, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,
|
||||
5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
||||
int dy[] = { 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,-8, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7,
|
||||
3, 2, 1, 0,-1,-2,-3,-4,-5,-6,-7, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6,
|
||||
4, 3, 2, 1, 0,-1,-2,-3,-4,-5,-6, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5,
|
||||
5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 1
|
||||
int dx[] = {-8,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,-7,-6,-5,-4,-3,-2,-1, 0, 1, 2,
|
||||
-7,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,-6,-5,-4,-3,-2,-1, 0, 1, 2, 3,
|
||||
-6,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4,
|
||||
-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
||||
int dy[] = {-2,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
-3,-2,-1, 0, 1, 2, 3, 4, 5, 6, 7,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6,
|
||||
-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, 6,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,
|
||||
-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
skill_nounit_layout[pos].count = 44;
|
||||
if( i&2 ) {
|
||||
if( i&4 ) { // 6
|
||||
int dx[] = { 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3};
|
||||
int dy[] = { 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-2,-2,-2,-2,-3,-3,-3,-3,-4,-4,-4,-4,-5,-5,-5,-5};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 2
|
||||
int dx[] = {-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0,-3,-2,-1, 0};
|
||||
int dy[] = { 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-2,-2,-2,-2,-3,-3,-3,-3,-4,-4,-4,-4,-5,-5,-5,-5};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
} else {
|
||||
if( i&4 ) { // 4
|
||||
int dx[] = { 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5, 5, 4, 3, 2, 1, 0,-1,-2,-3,-4,-5};
|
||||
int dy[] = {-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
} else { // 0
|
||||
int dx[] = {-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5,-5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5};
|
||||
int dy[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
memcpy(skill_nounit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_nounit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
}
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) {
|
||||
int inf = 0;
|
||||
int inf3 = 0;
|
||||
@ -19508,6 +19714,7 @@ static void skill_readdb(void) {
|
||||
}
|
||||
|
||||
skill_init_unit_layout();
|
||||
skill_init_nounit_layout();
|
||||
}
|
||||
|
||||
void skill_reload (void) {
|
||||
|
@ -188,6 +188,12 @@ struct s_skill_unit_layout {
|
||||
int dy[MAX_SKILL_UNIT_COUNT];
|
||||
};
|
||||
|
||||
struct s_skill_nounit_layout {
|
||||
int count;
|
||||
int dx[MAX_SKILL_UNIT_COUNT];
|
||||
int dy[MAX_SKILL_UNIT_COUNT];
|
||||
};
|
||||
|
||||
#define MAX_SKILLTIMERSKILL 15
|
||||
struct skill_timerskill {
|
||||
int timer;
|
||||
|
@ -3885,7 +3885,6 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
|
||||
|| sc->data[SC_TRICKDEAD]
|
||||
|| sc->data[SC_BLEEDING]
|
||||
|| sc->data[SC_MAGICMUSHROOM]
|
||||
|| sc->data[SC_RAISINGDRAGON]
|
||||
|| sc->data[SC_SATURDAYNIGHTFEVER]
|
||||
) // No regen
|
||||
regen->flag = 0;
|
||||
@ -3918,11 +3917,6 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
|
||||
} else
|
||||
regen->flag&=~sce->val4; // Remove regen as specified by val4
|
||||
}
|
||||
if (sc->data[SC_EPICLESIS]) {
|
||||
regen->rate.hp += sc->data[SC_EPICLESIS]->val3;
|
||||
regen->rate.sp += sc->data[SC_EPICLESIS]->val4;
|
||||
}
|
||||
|
||||
if(sc->data[SC_GT_REVITALIZE]) {
|
||||
regen->hp = cap_value(regen->hp*sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX);
|
||||
regen->state.walk= 1;
|
||||
@ -6942,7 +6936,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
|
||||
/// Example: 25% -> sc_def2=2000 -> 5%; 2500ms -> tick_def2=2000 -> 500ms
|
||||
int sc_def2 = 0, tick_def2 = 0;
|
||||
|
||||
struct status_data *status, *status_src;
|
||||
struct status_data *status, *status_src, *b_status;
|
||||
struct status_change *sc;
|
||||
struct map_session_data *sd;
|
||||
|
||||
@ -6987,6 +6981,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
|
||||
sd = BL_CAST(BL_PC,bl);
|
||||
status = status_get_status_data(bl);
|
||||
status_src = status_get_status_data(src);
|
||||
b_status = status_get_base_status(bl);
|
||||
sc = status_get_sc(bl);
|
||||
if( sc && !sc->count )
|
||||
sc = NULL;
|
||||
@ -7058,9 +7053,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
|
||||
sc_def = status->agi*50;
|
||||
break;
|
||||
case SC_DEEPSLEEP:
|
||||
sc_def = status->int_*50;
|
||||
sc_def = b_status->int_*50;
|
||||
tick_def = 0; // Linear reduction instead
|
||||
tick_def2 = (status->int_ + status_get_lv(bl))*50; // kRO balance update lists this formula
|
||||
tick_def2 = (b_status->int_ + status_get_lv(bl))*50; // kRO balance update lists this formula
|
||||
break;
|
||||
case SC_MAGICMIRROR:
|
||||
case SC_ARMORCHANGE:
|
||||
@ -7102,10 +7097,10 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
|
||||
tick_def2 = status->agi*100;
|
||||
break;
|
||||
case SC_CRYSTALIZE:
|
||||
tick_def2 = status->vit*100;
|
||||
tick_def2 = b_status->vit*100;
|
||||
break;
|
||||
case SC_VACUUM_EXTREME:
|
||||
tick_def2 = status->str*50;
|
||||
tick_def2 = b_status->str*50;
|
||||
break;
|
||||
case SC_MANDRAGORA:
|
||||
sc_def = (status->vit + status->luk)*20;
|
||||
@ -9252,7 +9247,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
}
|
||||
break;
|
||||
case SC_PRESTIGE:
|
||||
val2 = (status->int_ + status->luk) * (val1 / 20) * (status_get_lv(bl) / 200) + val1; // Chance to evade magic damage.
|
||||
val2 = (status->int_ + status->luk) * val1 / 20 * status_get_lv(bl) / 200 + val1; // Chance to evade magic damage.
|
||||
val1 *= 15; // Defence added
|
||||
if( sd )
|
||||
val1 += (10 * pc_checkskill(sd,CR_DEFENDER)) * (status_get_lv(bl) / 100);
|
||||
@ -9551,24 +9546,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
break;
|
||||
case SC_EPICLESIS:
|
||||
val2 = 5 * val1; //HP rate bonus
|
||||
switch (val1) { //! FIXME, looks so weird!
|
||||
//val3: HP regen rate bonus
|
||||
//val4: SP regen rate bonus
|
||||
case 1:
|
||||
case 2:
|
||||
val3 = 3; //HP regen rate bonus
|
||||
val4 = 2; //SP regen rate bonus
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
val3 = 4; //HP regen rate bonus
|
||||
val4 = 3; //SP regen rate bonus
|
||||
break;
|
||||
case 5:
|
||||
val3 = 5; //HP regen rate bonus
|
||||
val4 = 4; //SP regen rate bonus
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
/* Rebellion */
|
||||
@ -10607,8 +10584,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
break;
|
||||
case SC_RAISINGDRAGON:
|
||||
if( sd && sce->val2 && !pc_isdead(sd) ) {
|
||||
int i;
|
||||
i = min(sd->spiritball,5);
|
||||
int i = min(sd->spiritball,5);
|
||||
pc_delspiritball(sd, sd->spiritball, 0);
|
||||
status_change_end(bl, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
|
||||
while( i > 0 ) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user