better mod item registry

This commit is contained in:
Hanan Rodebaugh
2026-08-07 20:24:11 -04:00
parent cab62ff7b3
commit abb4f3f9f0
2 changed files with 59 additions and 2 deletions
+46 -1
View File
@@ -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)
+13 -1
View File
@@ -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