From e78b4c81628682b67462ebb063c5291e486f2de1 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com> Date: Sun, 20 Mar 2022 16:23:54 -0700 Subject: [PATCH 1/6] [RUN] Implement Pflug --- scripts/globals/abilities/pflug.lua | 21 +++++++++ scripts/globals/effects/pflug.lua | 20 +++++++++ scripts/globals/job_utils/rune_fencer.lua | 53 +++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 scripts/globals/abilities/pflug.lua create mode 100644 scripts/globals/effects/pflug.lua diff --git a/scripts/globals/abilities/pflug.lua b/scripts/globals/abilities/pflug.lua new file mode 100644 index 00000000000..b703929d670 --- /dev/null +++ b/scripts/globals/abilities/pflug.lua @@ -0,0 +1,21 @@ +----------------------------------- +-- Ability: Pflug +-- Enhances resistance. The types of resistance enhanced depend upon the runes you harbor. +-- Obtained: Rune Fencer Level 40 +-- Recast Time: 3:00 +-- Duration: 2:00 +----------------------------------- +require("scripts/globals/status") +require("scripts/globals/job_utils/rune_fencer") +----------------------------------- +local ability_object = {} + +ability_object.onAbilityCheck = function(player, target, ability) + return xi.job_utils.rune_fencer.checkHaveRunes(player) +end + +ability_object.onUseAbility = function(player, target, ability, action) + return xi.job_utils.rune_fencer.usePflug(player, target, ability, action) +end + +return ability_object diff --git a/scripts/globals/effects/pflug.lua b/scripts/globals/effects/pflug.lua new file mode 100644 index 00000000000..761070ce2cc --- /dev/null +++ b/scripts/globals/effects/pflug.lua @@ -0,0 +1,20 @@ +----------------------------------- +-- xi.effect.PFLUG +----------------------------------- +require("scripts/globals/status") +require("scripts/globals/job_utils/rune_fencer") +----------------------------------- +local effect_object = {} + +effect_object.onEffectGain = function(target, effect) + xi.job_utils.rune_fencer.onPflugEffectGain(target, effect) +end + +effect_object.onEffectTick = function(target, effect) +end + +effect_object.onEffectLose = function(target, effect) + xi.job_utils.rune_fencer.onPflugEffectLose(target, effect) +end + +return effect_object diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index d13e8e2548a..db88c6d9200 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -598,3 +598,56 @@ xi.job_utils.rune_fencer.useSwipeLunge = function(player, target, ability, actio return cumulativeDamage end + +local function addPflugResistType(type, effect, power) + + if type >= xi.effect.IGNIS and type <= xi.effect.TENEBRAE then + + local pflugResistTypes = + { + [xi.effect.IGNIS] = {xi.mod.PARALYZERES, xi.mod.BINDRES}, + [xi.effect.GELUS] = {xi.mod.SILENCERES, xi.mod.GRAVITYRES}, + [xi.effect.FLABRA] = {xi.mod.PETRIFYRES, xi.mod.SLOWRES}, + [xi.effect.TELLUS] = {xi.mod.STUNRES}, + [xi.effect.SULPOR] = {xi.mod.POISONRES}, + [xi.effect.UNDA] = {xi.mod.AMNESIARES, xi.mod.PLAGUERES}, + [xi.effect.LUX] = {xi.mod.SLEEPRES, xi.mod.BLINDRES, xi.mod.CURSERES}, + [xi.effect.TENEBRAE] = {xi.mod.CHARMRES, xi.mod.LULLABYRES}, + } + + local resistTypes = pflugResistTypes[type] + + for _, resistMod in pairs(resistTypes) do -- store mod in effect, this function is triggered from event onEffectGain so it adds to the player automatically. + effect:addMod(resistMod, power) + end + + end +end + + +xi.job_utils.rune_fencer.onPflugEffectGain = function(target, effect) + local statusEffects = target:getStatusEffects() + + for _, statusEffect in ipairs(statusEffects) do + local type = statusEffect:getType() + addPflugResistType(type, effect, effect:getPower() + effect:getSubPower()) + end +end + +xi.job_utils.rune_fencer.onPflugEffectLose = function(target, effect) + -- intentionally blank, the effect has a mod list that is deleted after this event is called in CStatusEffectContainer::RemoveStatusEffect +end + +xi.job_utils.rune_fencer.usePflug = function(player, target, ability, action) + local highestRune = player:getHighestRuneEffect() + local baseStrength = 10 + local meritBonus = player:getMerit(xi.merit.MERIT_PFLUG_EFFECT) + + if player:getMainJob() == xi.job.RUN then + baseStrength = 15 + end + + action:speceffect(target:getID(), getSpecEffectElementWard(highestRune)) + + player:addStatusEffect(xi.effect.PFLUG, baseStrength, 0, 120, 0, meritBonus) +end From 4d3e15ed8aad4b6195a13fdd3f23709a6da85d2e Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com> Date: Sun, 20 Mar 2022 16:34:24 -0700 Subject: [PATCH 2/6] Add source, cleanup one whitespace, add comment describing Pflug. --- scripts/globals/job_utils/rune_fencer.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index db88c6d9200..017768a2f57 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -599,6 +599,9 @@ xi.job_utils.rune_fencer.useSwipeLunge = function(player, target, ability, actio return cumulativeDamage end +-- see http://wiki.ffo.jp/html/1720.html, the effects resisted are against the strong element. +-- for example, Amnesia is fire based, therefore water runes (Unda) add resist Amnesia. +-- These effects seem to match the "Resist X" traits that all jobs have, including unused player traits that made it into autotranslate; Resist Curse/Charm local function addPflugResistType(type, effect, power) if type >= xi.effect.IGNIS and type <= xi.effect.TENEBRAE then @@ -617,7 +620,7 @@ local function addPflugResistType(type, effect, power) local resistTypes = pflugResistTypes[type] - for _, resistMod in pairs(resistTypes) do -- store mod in effect, this function is triggered from event onEffectGain so it adds to the player automatically. + for _, resistMod in pairs(resistTypes) do -- store mod in effect, this function is triggered from event onEffectGain so it adds to the player automatically. effect:addMod(resistMod, power) end From a44247ff67881a717698a01c938a9dc26263159d Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com> Date: Sun, 20 Mar 2022 16:58:06 -0700 Subject: [PATCH 3/6] Remove Lullaby res from Pflug --- scripts/globals/job_utils/rune_fencer.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/globals/job_utils/rune_fencer.lua b/scripts/globals/job_utils/rune_fencer.lua index 017768a2f57..642e5736f78 100644 --- a/scripts/globals/job_utils/rune_fencer.lua +++ b/scripts/globals/job_utils/rune_fencer.lua @@ -615,7 +615,7 @@ local function addPflugResistType(type, effect, power) [xi.effect.SULPOR] = {xi.mod.POISONRES}, [xi.effect.UNDA] = {xi.mod.AMNESIARES, xi.mod.PLAGUERES}, [xi.effect.LUX] = {xi.mod.SLEEPRES, xi.mod.BLINDRES, xi.mod.CURSERES}, - [xi.effect.TENEBRAE] = {xi.mod.CHARMRES, xi.mod.LULLABYRES}, + [xi.effect.TENEBRAE] = {xi.mod.CHARMRES}, } local resistTypes = pflugResistTypes[type] From a1d11be5fd4289bfddce40f386385e49951b41c6 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com> Date: Sun, 20 Mar 2022 18:50:53 -0700 Subject: [PATCH 4/6] Implement Crusade, partially implement Foil. --- documentation/modifier.h ordered by ID.txt | 3 ++- scripts/globals/effects/foil.lua | 19 +++++++++++++++ scripts/globals/spells/white/crusade.lua | 25 +++++++++++++++++++ scripts/globals/spells/white/foil.lua | 28 ++++++++++++++++++++++ scripts/globals/status.lua | 1 + sql/spell_list.sql | 4 ++-- src/map/modifier.h | 3 ++- 7 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 scripts/globals/effects/foil.lua create mode 100644 scripts/globals/spells/white/crusade.lua create mode 100644 scripts/globals/spells/white/foil.lua diff --git a/documentation/modifier.h ordered by ID.txt b/documentation/modifier.h ordered by ID.txt index ac1cc99d31f..73a873177e5 100644 --- a/documentation/modifier.h ordered by ID.txt +++ b/documentation/modifier.h ordered by ID.txt @@ -746,6 +746,7 @@ enum class Mod INSPIRATION_FAST_CAST = 1021, // Inspiration Fast Cast, additive with Fast Cast with a combined cap beyond 80% PARRY_SPIKES = 1022, // Battuta parry spikes rate PARRY_SPIKES_DMG = 1023, // Battuta parry spikes damage + SPECIAL_ATTACK_EVASION = 1024, // Foil "Special Attack" evasion // The spares take care of finding the next ID to use so long as we don't forget to list IDs that have been freed up by refactoring. // 570 through 825 used by WS DMG mods these are not spares. @@ -753,7 +754,7 @@ enum class Mod // The following modifier should not ever be set, but %damage modifiers to weaponskills use the next 255 IDs (this modifier + the WSID) // For example, +10% damage to Chant du Cygne would be ID 570 + 225 (795) - // SPARE = 1024, + // SPARE = 1025, }; // temporary workaround for using enum class as unordered_map key until compilers support it diff --git a/scripts/globals/effects/foil.lua b/scripts/globals/effects/foil.lua new file mode 100644 index 00000000000..3f76931276b --- /dev/null +++ b/scripts/globals/effects/foil.lua @@ -0,0 +1,19 @@ +----------------------------------- +-- xi.effect.FOIL +----------------------------------- +require("scripts/globals/status") +----------------------------------- +local effect_object = {} + +effect_object.onEffectGain = function(target, effect) + effect:addMod(xi.mod.SPECIAL_ATTACK_EVASION, effect:getPower()) +end + +effect_object.onEffectTick = function(target, effect) -- TODO: Determine how Foil ticks down? It's description indicates this. +end + +effect_object.onEffectLose = function(target, effect) + -- intentionally blank. mod removes itself in C++ due to being added to the effect. +end + +return effect_object diff --git a/scripts/globals/spells/white/crusade.lua b/scripts/globals/spells/white/crusade.lua new file mode 100644 index 00000000000..1925cfca91e --- /dev/null +++ b/scripts/globals/spells/white/crusade.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- Spell: Crusade +----------------------------------- +require("scripts/globals/magic") +require("scripts/globals/msg") +require("scripts/globals/status") +----------------------------------- +local spell_object = {} + +spell_object.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +spell_object.onSpellCast = function(caster, target, spell) + + if target:addStatusEffect(xi.effect.ENMITY_BOOST, 30, 0, 300) then + spell:setMsg(xi.msg.basic.MAGIC_GAIN_EFFECT) + else + spell:setMsg(xi.msg.basic.MAGIC_NO_EFFECT) + end + + return xi.effect.ENMITY_BOOST +end + +return spell_object diff --git a/scripts/globals/spells/white/foil.lua b/scripts/globals/spells/white/foil.lua new file mode 100644 index 00000000000..c5b3897b30c --- /dev/null +++ b/scripts/globals/spells/white/foil.lua @@ -0,0 +1,28 @@ +----------------------------------- +-- Spell: Foil +----------------------------------- +require("scripts/globals/magic") +require("scripts/globals/msg") +require("scripts/globals/status") +----------------------------------- +local spell_object = {} + +spell_object.onMagicCastingCheck = function(caster, target, spell) + return 0 +end + +-- TODO: determine mechanics of how Foil's "Special Attack" evasion works. +-- Martel has a post about it here: https://www.bluegartr.com/threads/115399-Rune-Fencer-Findings?p=5665305&viewfull=1#post5665305 +-- More testing is required (such as determining accuracy of the target used for testing) +spell_object.onSpellCast = function(caster, target, spell) + + if target:addStatusEffect(xi.effect.FOIL, 0, 0, 300) then -- power set to 0 because true mechanics are unknown as of now. The primary use of Foil is for enmity anyway. + spell:setMsg(xi.msg.basic.MAGIC_GAIN_EFFECT) + else + spell:setMsg(xi.msg.basic.MAGIC_NO_EFFECT) + end + + return xi.effect.FOIL +end + +return spell_object diff --git a/scripts/globals/status.lua b/scripts/globals/status.lua index 3834ea42bb3..c3f00b6d5b1 100644 --- a/scripts/globals/status.lua +++ b/scripts/globals/status.lua @@ -1234,6 +1234,7 @@ xi.mod = INSPIRATION_FAST_CAST = 1021, -- Inspiration's fast cast, additive with normal fast cast for a cap beyond 80% PARRY_SPIKES = 1022, -- Battuta parry spikes rate PARRY_SPIKES_DMG = 1023, -- Battuta parry spikes damage + SPECIAL_ATTACK_EVASION = 1024, -- Foil "Special Attack" evasion FIRE_AFFINITY_DMG = 347, ICE_AFFINITY_DMG = 348, diff --git a/sql/spell_list.sql b/sql/spell_list.sql index c98407835b6..95a8636b139 100644 --- a/sql/spell_list.sql +++ b/sql/spell_list.sql @@ -525,7 +525,7 @@ INSERT INTO `spell_list` VALUES (471,'foe_lullaby_ii',0x000000000000000000530000 INSERT INTO `spell_list` VALUES (473,'refresh_ii',0x00000000520000000000000000000000000000000000,6,29,7,0,3,34,60,5000,27000,0,0,118,2000,0,0,1.00,1,165,0,204,'ABYSSEA'); INSERT INTO `spell_list` VALUES (474,'cura_ii',0x00005300000000000000000000000000000000000000,6,20,7,0,1,33,45,3000,40000,0,0,298,2000,1,0,1.00,75,75,0,0,'ABYSSEA'); INSERT INTO `spell_list` VALUES (475,'cura_iii',0x00006000000000000000000000000000000000000000,6,20,7,0,1,33,60,3000,50000,0,0,298,2000,1,0,1.00,100,100,0,0,'ABYSSEA'); --- INSERT INTO `spell_list` VALUES (476,'crusade',0x00000000000058000000000000000000000000000000,6,7,0,1,34,18,3000,5000,230,0,53,4000,4,0,1.00,0,0,0,204,NULL); +INSERT INTO `spell_list` VALUES (476,'crusade',0x00000000000058000000000000000000000000000058,6,4,8,0,1,34,18,3000,10000,230,0,825,2000,0,0,1.00,0,0,0,204,'SOA'); INSERT INTO `spell_list` VALUES (477,'regen_iv',0x000056000000000000000000000000000000004F0000,6,28,7,0,3,34,82,2250,24000,0,0,140,2000,4,0,1.00,1,165,0,204,'ABYSSEA'); INSERT INTO `spell_list` VALUES (478,'embrava',0x00000000000000000000000000000000000000050000,6,0,7,0,27,36,1,3000,3000,230,0,121,2000,4,1,1.00,1,165,8,204,'ABYSSEA'); INSERT INTO `spell_list` VALUES (479,'boost-str',0x00005D00000000000000000000000000000000000000,6,140,1,0,1,34,36,5000,10000,0,0,0,2000,1,0,1.00,1,80,0,204,'ABYSSEA'); @@ -810,7 +810,7 @@ INSERT INTO `spell_list` VALUES (836,'thundara',0x000000000000000000000000000000 INSERT INTO `spell_list` VALUES (837,'thundara_ii',0x00000000000000000000000000000000000000005F00,2,152,5,0,4,36,253,3000,15000,2,0,900,2000,1,0,1.00,0,0,0,120,'SOA'); INSERT INTO `spell_list` VALUES (838,'watera',0x00000000000000000000000000000000000000001E00,2,153,6,0,4,36,66,1500,5000,2,0,901,2000,1,0,1.00,0,0,0,120,'SOA'); INSERT INTO `spell_list` VALUES (839,'watera_ii',0x00000000000000000000000000000000000000004B00,2,153,6,0,4,36,163,3000,15000,2,0,902,2000,1,0,1.00,0,0,0,120,'SOA'); --- INSERT INTO `spell_list` VALUES (840,'foil',0x0000000000000000000000000000000000000000003A,6,4,0,1,0,48,1000,30000,0,0,0,4000,0,0,1.00,20,80,0,204,'SOA'); +INSERT INTO `spell_list` VALUES (840,'foil',0x0000000000000000000000000000000000000000003A,6,4,3,0,1,34,48,3000,45000,230,0,903,2000,0,0,1.00,880,320,0,204,'SOA'); INSERT INTO `spell_list` VALUES (841,'distract',0x00000000230000000000000000000000000000000000,2,154,2,0,4,35,32,3000,10000,0,0,933,2000,0,0,1.00,1,320,0,204,'SOA'); INSERT INTO `spell_list` VALUES (842,'distract_ii',0x00000000550000000000000000000000000000000000,2,154,2,0,4,35,58,3000,10000,0,0,934,4000,0,0,1.00,1,320,0,204,'SOA'); INSERT INTO `spell_list` VALUES (843,'frazzle',0x000000002A0000000000000000000000000000000000,2,155,8,0,4,35,38,3000,10000,0,0,935,4000,0,0,1.00,1,320,0,204,'SOA'); diff --git a/src/map/modifier.h b/src/map/modifier.h index a90f32ed287..eed1a293d50 100644 --- a/src/map/modifier.h +++ b/src/map/modifier.h @@ -610,6 +610,7 @@ enum class Mod INSPIRATION_FAST_CAST = 1021, // Inspiration Fast Cast, additive with Fast Cast with a combined cap beyond 80% PARRY_SPIKES = 1022, // Battuta parry spikes rate PARRY_SPIKES_DMG = 1023, // Battuta parry spikes damage + SPECIAL_ATTACK_EVASION = 1024, // Foil "Special Attack" evasion // Stores the amount of elemental affinity (elemental staves mostly) - damage, acc, and perpetuation is all handled separately FIRE_AFFINITY_DMG = 347, // They're stored separately due to Magian stuff - they can grant different levels of @@ -880,7 +881,7 @@ enum class Mod // 888 // 936 // - // SPARE = 1024, and onward + // SPARE = 1025, and onward }; // temporary workaround for using enum class as unordered_map key until compilers support it From efea986f4ebb9e889469c177d4bf9c12aa44f226 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com> Date: Sun, 20 Mar 2022 18:58:14 -0700 Subject: [PATCH 5/6] Fix trailing whitespace --- scripts/globals/spells/white/foil.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/globals/spells/white/foil.lua b/scripts/globals/spells/white/foil.lua index c5b3897b30c..abeb4d40d84 100644 --- a/scripts/globals/spells/white/foil.lua +++ b/scripts/globals/spells/white/foil.lua @@ -11,7 +11,7 @@ spell_object.onMagicCastingCheck = function(caster, target, spell) return 0 end --- TODO: determine mechanics of how Foil's "Special Attack" evasion works. +-- TODO: determine mechanics of how Foil's "Special Attack" evasion works. -- Martel has a post about it here: https://www.bluegartr.com/threads/115399-Rune-Fencer-Findings?p=5665305&viewfull=1#post5665305 -- More testing is required (such as determining accuracy of the target used for testing) spell_object.onSpellCast = function(caster, target, spell) From 4ef264c10d6f287c165c089c79f4937f493bec27 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com> Date: Sun, 20 Mar 2022 19:36:33 -0700 Subject: [PATCH 6/6] Make Crusade & Foil scrolls usable --- scripts/globals/items/scroll_of_crusade.lua | 16 ++++++++++++++++ scripts/globals/items/scroll_of_foil.lua | 16 ++++++++++++++++ sql/item_basic.sql | 4 ++-- sql/item_usable.sql | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 scripts/globals/items/scroll_of_crusade.lua create mode 100644 scripts/globals/items/scroll_of_foil.lua diff --git a/scripts/globals/items/scroll_of_crusade.lua b/scripts/globals/items/scroll_of_crusade.lua new file mode 100644 index 00000000000..6ab0a18d975 --- /dev/null +++ b/scripts/globals/items/scroll_of_crusade.lua @@ -0,0 +1,16 @@ +----------------------------------- +-- ID: 5103 +-- Scroll of Crusade +-- Teaches the white magic Crusade +----------------------------------- +local item_object = {} + +item_object.onItemCheck = function(target) + return target:canLearnSpell(476) +end + +item_object.onItemUse = function(target) + target:addSpell(476) +end + +return item_object diff --git a/scripts/globals/items/scroll_of_foil.lua b/scripts/globals/items/scroll_of_foil.lua new file mode 100644 index 00000000000..2b661ac5743 --- /dev/null +++ b/scripts/globals/items/scroll_of_foil.lua @@ -0,0 +1,16 @@ +----------------------------------- +-- ID: 5102 +-- Scroll of Foil +-- Teaches the white magic Foil +----------------------------------- +local item_object = {} + +item_object.onItemCheck = function(target) + return target:canLearnSpell(840) +end + +item_object.onItemUse = function(target) + target:addSpell(840) +end + +return item_object diff --git a/sql/item_basic.sql b/sql/item_basic.sql index 63fb3713ce8..ed9452a1bad 100644 --- a/sql/item_basic.sql +++ b/sql/item_basic.sql @@ -4786,8 +4786,8 @@ INSERT INTO `item_basic` VALUES (5098,483,'scroll_of_boost-int','boost-int',1,34 INSERT INTO `item_basic` VALUES (5099,484,'scroll_of_boost-mnd','boost-mnd',1,34444,28,0,3875); INSERT INTO `item_basic` VALUES (5100,485,'scroll_of_boost-chr','boost-chr',1,34444,28,0,3997); INSERT INTO `item_basic` VALUES (5101,494,'scroll_of_arise','arise',1,34444,28,0,0); -INSERT INTO `item_basic` VALUES (5102,840,'scroll_of_foil','foil',1,34444,28,0,0); -INSERT INTO `item_basic` VALUES (5103,0,'scroll_of_crusade','crusade',1,34444,28,0,0); +INSERT INTO `item_basic` VALUES (5102,840,'scroll_of_foil','foil',1,1676,28,0,0); +INSERT INTO `item_basic` VALUES (5103,476,'scroll_of_crusade','crusade',1,1676,28,0,0); INSERT INTO `item_basic` VALUES (5104,845,'scroll_of_flurry','flurry',1,1548,28,0,43); INSERT INTO `item_basic` VALUES (5105,846,'scroll_of_flurry_ii','flurry_ii',1,34316,28,0,43); INSERT INTO `item_basic` VALUES (5106,0,'scroll_of_inundation','inundation',1,34444,28,0,0); diff --git a/sql/item_usable.sql b/sql/item_usable.sql index 68c5597966d..add9f1e9a4a 100644 --- a/sql/item_usable.sql +++ b/sql/item_usable.sql @@ -947,6 +947,8 @@ INSERT INTO `item_usable` VALUES (5097,'scroll_of_boost-agi',1,1,11,5,0,0,0,0); INSERT INTO `item_usable` VALUES (5098,'scroll_of_boost-int',1,1,11,5,0,0,0,0); INSERT INTO `item_usable` VALUES (5099,'scroll_of_boost-mnd',1,1,11,5,0,0,0,0); INSERT INTO `item_usable` VALUES (5100,'scroll_of_boost-chr',1,1,11,5,0,0,0,0); +INSERT INTO `item_usable` VALUES (5102,'scroll_of_foil',1,1,11,5,0,0,0,0); +INSERT INTO `item_usable` VALUES (5103,'scroll_of_crusade',1,1,11,5,0,0,0,0); INSERT INTO `item_usable` VALUES (5104,'scroll_of_flurry',1,1,11,5,0,0,0,0); INSERT INTO `item_usable` VALUES (5105,'scroll_of_flurry_ii',1,1,11,5,0,0,0,0); INSERT INTO `item_usable` VALUES (5120,'titanic_sawfish',1,1,25,0,0,0,0,0);