diff --git a/src/inventory/ItemEffects.lua b/src/inventory/ItemEffects.lua index 63f74228..2dd49e1d 100644 --- a/src/inventory/ItemEffects.lua +++ b/src/inventory/ItemEffects.lua @@ -25,6 +25,18 @@ local function noEffect(data) return romText(data, "_ItemUseNoEffectText", "It won't have\nany effect.") end +local function registeredEffect(data, itemDef) + if not data or not itemDef or not itemDef.effect then + return nil + end + + if not data.item_effects then + return nil + end + + return data.item_effects[itemDef.effect] +end + local HEAL_AMOUNT = { POTION = 20, SUPER_POTION = 50, HYPER_POTION = 200, FRESH_WATER = 50, SODA_POP = 60, LEMONADE = 80, @@ -72,7 +84,18 @@ function ItemEffects.healsHP(id) end -- Does this item need a party-member target? -function ItemEffects.needsTarget(id, itemDef) +-- 'data' is optional for compat purposes; targeting falls back to itemDef/vanilla detection +function ItemEffects.needsTarget(id, itemDef, data) + if itemDef and itemDef.needsTarget ~= nil then + return itemDef.needsTarget + end + + local effect = registeredEffect(data, itemDef) + + if effect and effect.needsTarget ~= nil then + return effect.needsTarget + end + return HEAL_AMOUNT[id] or STATUS_HEAL[id] or id == "MAX_POTION" or id == "FULL_RESTORE" or id == "REVIVE" or id == "MAX_REVIVE" or id == "RARE_CANDY" or STONES[id] @@ -147,6 +170,28 @@ function ItemEffects.use(data, save, itemId, target, battle, moveIndex, ow) local itemDef = data.items[itemId] local name = itemDef and itemDef.name or itemId + local effectDef = registeredEffect(data, itemDef) + if effectDef then + if battle and effectDef.battle == false then + return "failed", { notTime(data, save) } + end + + if not battle and effectDef.field == false then + return "failed", { notTime(data, save) } + end + + return effectDef.use({ + data = data, + save = save, + itemId = itemId, + item = itemDef, + target = target, + battle = battle, + moveIndex = moveIndex, + overworld = ow, + }) + end + -- ItemUseVitamin / ItemUsePPUp / ItemUseEvoStone / ItemUseCoinCase / -- ItemUseTMHM / ItemUseRepelCommon all refuse mid-battle -- (jp nz, ItemUseNotTime) diff --git a/src/ui/BagMenu.lua b/src/ui/BagMenu.lua index 650b364d..1a2c59ee 100644 --- a/src/ui/BagMenu.lua +++ b/src/ui/BagMenu.lua @@ -253,6 +253,18 @@ local function useOn(game, battle, id, target, list, moveIndex, picker) return end + if result == "kept" then + if battle then + list:close() + showMessages(game, payload, function() + battle:itemUsed({}) + end) + else + showMessages(game, payload, closePicker) + end + return + end + if result == "consumed" then consume(game, id) -- refresh counts in the list @@ -404,7 +416,7 @@ local function useItem(game, battle, id, list) showMessages(game, payload) return end - if ItemEffects.needsTarget(id, def) and not ItemEffects.isBall(id) then + if ItemEffects.needsTarget(id, def, game.data) and not ItemEffects.isBall(id) then -- TMs/HMs boot up and announce their move before the target picker -- (ItemUseTMHM: BootedUpTMText / BootedUpHMText + TeachMachineMoveText) if def and def.machine then