PokeBot/storage/inventory.lua

201 lines
3.8 KiB
Lua

local inventory = {}
local pokemon = require "storage.pokemon"
local input = require "util.input"
local memory = require "util.memory"
local menu = require "util.menu"
local utils = require "util.utils"
local items = {
pokeball = 4,
bicycle = 6,
moon_stone = 10,
antidote = 11,
paralyze_heal = 15,
full_restore = 16,
super_potion = 19,
potion = 20,
escape_rope = 29,
carbos = 38,
repel = 30,
rare_candy = 40,
helix_fossil = 42,
nugget = 49,
pokedoll = 51,
super_repel = 56,
fresh_water = 60,
soda_pop = 61,
pokeflute = 73,
ether = 80,
max_ether = 81,
elixer = 82,
x_accuracy = 46,
x_speed = 67,
x_special = 68,
cut = 196,
fly = 197,
surf = 198,
strength = 199,
horn_drill = 207,
bubblebeam = 211,
water_gun = 212,
ice_beam = 213,
thunderbolt = 224,
earthquake = 226,
dig = 228,
tm34 = 234,
rock_slide = 248,
}
local ITEM_BASE = 0xD31E
-- Data
function inventory.indexOf(name)
local searchID = items[name]
for i=0,19 do
local iidx = ITEM_BASE + i * 2
if memory.raw(iidx) == searchID then
return i
end
end
return -1
end
function inventory.count(name)
local index = inventory.indexOf(name)
if index ~= -1 then
return memory.raw(ITEM_BASE + index * 2 + 1)
end
return 0
end
function inventory.contains(...)
for i,name in ipairs(arg) do
if inventory.count(name) > 0 then
return name
end
end
end
-- Actions
function inventory.teach(item, poke, replaceIdx, altPoke)
local main = memory.value("menu", "main")
local column = menu.getCol()
if main == 144 then
if column == 5 then
menu.select(replaceIdx, true)
else
input.press("A")
end
elseif main == 128 then
if column == 5 then
menu.select(inventory.indexOf(item), "accelerate", true)
elseif column == 11 then
menu.select(2, true)
elseif column == 14 then
menu.select(0, true)
end
elseif main == 103 then
input.press("B")
elseif main == 64 or main == 96 or main == 192 then
if column == 5 then
menu.select(replaceIdx, true)
elseif column == 14 then
input.press("A")
elseif column == 15 then
menu.select(0, true)
else
local idx = 0
if poke then
idx = pokemon.indexOf(poke, altPoke)
end
menu.select(idx, true)
end
else
return false
end
return true
end
function inventory.isFull()
return memory.raw(0xD345) > 0
end
function inventory.use(item, poke, midfight)
if midfight then
local battleMenu = memory.value("battle", "menu")
if battleMenu == 94 then
local rowSelected = memory.value("menu", "row")
if menu.getCol() == 9 then
if rowSelected == 0 then
input.press("Down")
else
input.press("A")
end
else
input.press("Left")
end
elseif battleMenu == 233 then
menu.select(inventory.indexOf(item), "accelerate", true)
elseif utils.onPokemonSelect(battleMenu) then
if poke then
if type(poke) == "string" then
poke = pokemon.indexOf(poke)
end
menu.select(poke, true)
else
input.press("A")
end
else
input.press("B")
end
return
end
local main = memory.value("menu", "main")
local column = menu.getCol()
if main == 144 then
if memory.value("battle", "menu") == 95 then
input.press("B")
else
local idx = 0
if poke then
idx = pokemon.indexOf(poke)
end
menu.select(idx, true)
end
elseif main == 128 or main == 60 then
if column == 5 then
menu.select(inventory.indexOf(item), "accelerate", true)
elseif column == 11 then
menu.select(2, true)
elseif column == 14 then
menu.select(0, true)
else
local index = 0
if poke then
index = pokemon.indexOf(poke)
end
menu.select(index, true)
end
elseif main == 228 then
if column == 14 and memory.value("battle", "menu") == 95 then
input.press("B")
end
elseif main == 103 then
input.press("B")
else
return false
end
return true
end
return inventory