From 0a8b4c2d2a7b686523932e09f2f232509a62374f Mon Sep 17 00:00:00 2001 From: Kyle Coburn Date: Tue, 7 Apr 2015 04:58:18 -0700 Subject: [PATCH] Unify more shared strategies --- ai/red/strategies.lua | 190 ++----------------------------------- ai/strategies.lua | 216 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 223 insertions(+), 183 deletions(-) diff --git a/ai/red/strategies.lua b/ai/red/strategies.lua index 6052a58..d4e2c91 100644 --- a/ai/red/strategies.lua +++ b/ai/red/strategies.lua @@ -456,38 +456,7 @@ strategyFunctions.equipForBrock = function(data) end end end - local main = Memory.value("menu", "main") - local nidoranIndex = Pokemon.indexOf("nidoran") - if nidoranIndex == 0 then - if Menu.close() then - return true - end - elseif Menu.pause() then - local column = Menu.getCol() - if Pokemon.info("squirtle", "status") > 0 then - Inventory.use("antidote", "squirtle") - elseif Inventory.contains("potion") and Pokemon.info("squirtle", "hp") < 15 then - Inventory.use("potion", "squirtle") - else - if main == 128 then - if column == 11 then - Menu.select(1, true) - elseif column == 12 then - Menu.select(1, true) - else - Input.press("B") - end - elseif main == 103 then --TODO check loop - if Memory.value("menu", "selection_mode") == 1 then - Menu.select(nidoranIndex, true) - else - Menu.select(0, true) - end - else - Input.press("B") - end - end - end + return strategyFunctions.swapNidoran() end strategyFunctions.fightBrock = function() @@ -628,31 +597,6 @@ strategyFunctions.battleModeSet = function() end end -strategyFunctions.leer = function(data) - local bm = Combat.bestMove() - if not bm or bm.minTurns < 3 then - if Battle.isActive() then - status.canProgress = true - elseif status.canProgress then - return true - end - Battle.automate() - return false - end - local opp = Battle.opponent() - local defLimit = 9001 - for i,poke in ipairs(data) do - if opp == poke[1] then - local minimumAttack = poke[3] - if not minimumAttack or nidoAttack > minimumAttack then - defLimit = poke[2] - end - break - end - end - return Strategies.buffTo("leer", defLimit) -end - strategyFunctions.bugCatcher = function() if Battle.isActive() then status.canProgress = true @@ -705,12 +649,7 @@ strategyFunctions.potionBeforeCocoons = function() return Strategies.functions.potion({hp=6, yolo=3}) end -strategyFunctions.swapHornAttack = function() - if Pokemon.battleMove("horn_attack") == 1 then - return true - end - Battle.swapMove(1, 3) -end +-- swapHornAttack strategyFunctions.fightMetapod = function() if Battle.isActive() then @@ -726,134 +665,19 @@ strategyFunctions.fightMetapod = function() end end -strategyFunctions.catchFlierBackup = function() - if Strategies.initialize() then - Control.canDie(true) - end - if not Control.canCatch() then - return true - end - local caught = Pokemon.inParty("pidgey", "spearow") - if Battle.isActive() then - if Memory.double("battle", "our_hp") == 0 then - if Pokemon.info("squirtle", "hp") == 0 then - Control.canDie(false) - elseif Utils.onPokemonSelect(Memory.value("battle", "menu")) then - Menu.select(Pokemon.indexOf("squirtle"), true) - else - Input.press("A") - end - else - Battle.handle() - end - else - local birdPath - local px, py = Player.position() - if caught then - if px > 33 then - return true - end - local startY = 9 - if px > 28 then - startY = py - end - birdPath = {{32,startY}, {32,11}, {34,11}} - elseif px == 37 then - if py == 10 then - py = 11 - else - py = 10 - end - Walk.step(px, py) - else - birdPath = {{32,10}, {32,11}, {34,11}, {34,10}, {37,10}} - end - if birdPath then - Walk.custom(birdPath) - end - end -end +-- catchFlierBackup -- 3: ROUTE 3 -strategyFunctions.startMtMoon = function() - Control.moonEncounters = 0 - Control.canDie(false) - return true -end +-- startMtMoon -strategyFunctions.evolveNidorino = function() - if Pokemon.inParty("nidorino") then - Bridge.caught("nidorino") - return true - end - if Battle.isActive() then - status.tries = 0 - status.canProgress = true - if Memory.double("battle", "opponent_hp") == 0 then - Input.press("A") - else - Battle.automate() - end - elseif status.tries > 3600 then - print("Broke from Nidorino on tries") - return true - else - if status.canProgress then - status.tries = status.tries + 1 - end - Input.press("A") - end -end +-- evolveNidorino -strategyFunctions.evolveNidoking = function() - if Battle.handleWild() then - if not Inventory.contains("moon_stone") then - if Strategies.initialize() then - Bridge.caught("nidoking") - end - if Menu.close() then - return true - end - elseif not Inventory.use("moon_stone") then - Menu.pause() - end - end -end +-- evolveNidoking -- helix -strategyFunctions.reportMtMoon = function() - if Battle.pp("horn_attack") == 0 then - print("ERR: Ran out of Horn Attacks") - end - if Control.moonEncounters then - local parasStatus - local conjunction = "but" - local goodEncounters = Control.moonEncounters < 10 - local parasCatch - if Pokemon.inParty("paras") then - parasCatch = "paras" - if goodEncounters then - conjunction = "and" - end - parasStatus = "we found a Paras!" - else - parasCatch = "no_paras" - if not goodEncounters then - conjunction = "and" - end - parasStatus = "we didn't find a Paras :(" - end - Bridge.caught(parasCatch) - Bridge.chat(Control.moonEncounters.." Moon encounters, "..conjunction.." "..parasStatus) - Control.moonEncounters = nil - end - - local timeLimit = Strategies.getTimeRequirement("mt_moon") - Strategies.resetTime(timeLimit, "complete Mt. Moon", true) - return true -end +-- reportMtMoon -- 4: MT. MOON diff --git a/ai/strategies.lua b/ai/strategies.lua index 4bfd4f6..79cef42 100644 --- a/ai/strategies.lua +++ b/ai/strategies.lua @@ -622,12 +622,194 @@ Strategies.functions = { return true end, + leer = function(data) + local bm = Combat.bestMove() + if not bm or bm.minTurns < 3 then + if Battle.isActive() then + status.canProgress = true + elseif status.canProgress then + return true + end + Battle.automate() + return false + end + local opp = Battle.opponent() + local defLimit = 9001 + for i,poke in ipairs(data) do + if opp == poke[1] then + local minimumAttack = poke[3] + if not minimumAttack or nidoAttack > minimumAttack then + defLimit = poke[2] + end + break + end + end + return Strategies.buffTo("leer", defLimit) + end, + -- ROUTE + swapNidoran = function() + local main = Memory.value("menu", "main") + local nidoranIndex = Pokemon.indexOf("nidoran") + if nidoranIndex == 0 then + if Menu.close() then + return true + end + elseif Menu.pause() then + if yellow then + if Inventory.contains("potion") and Pokemon.info("nidoran", "hp") < 15 then + Inventory.use("potion", "nidoran") + return false + end + else + if Pokemon.info("squirtle", "status") > 0 then + Inventory.use("antidote", "squirtle") + return false + end + if Inventory.contains("potion") and Pokemon.info("squirtle", "hp") < 15 then + Inventory.use("potion", "squirtle") + return false + end + end + + local column = Menu.getCol() + if main == 128 then + if column == 11 then + Menu.select(1, true) + elseif column == 12 then + Menu.select(1, true) + else + Input.press("B") + end + elseif main == Menu.pokemon then --TODO check loop + if Memory.value("menu", "selection_mode") == 1 then + Menu.select(nidoranIndex, true) + else + Menu.select(0, true) + end + else + Input.press("B") + end + end + end, + + swapHornAttack = function() + if Pokemon.battleMove("horn_attack") == 1 then + return true + end + Battle.swapMove(1, 3) + end, + dodgePalletBoy = function() return Strategies.dodgeUp(0x0223, 14, 14, 15, 7) end, + evolveNidorino = function() + if Pokemon.inParty("nidorino") then + Bridge.caught("nidorino") + return true + end + if Battle.isActive() then + status.tries = 0 + status.canProgress = true + if Memory.double("battle", "opponent_hp") == 0 then + Input.press("A") + else + Battle.automate() + end + elseif status.tries > 3600 then + print("Broke from Nidorino on tries") + return true + else + if status.canProgress then + status.tries = status.tries + 1 + end + Input.press("A") + end + end, + + catchFlierBackup = function() + if Strategies.initialize() then + Control.canDie(true) + end + if not Control.canCatch() then + return true + end + local caught = Pokemon.inParty("pidgey", "spearow") + if Battle.isActive() then + if Memory.double("battle", "our_hp") == 0 then + if Pokemon.info("squirtle", "hp") == 0 then + Control.canDie(false) + elseif Utils.onPokemonSelect(Memory.value("battle", "menu")) then + Menu.select(Pokemon.indexOf("squirtle"), true) + else + Input.press("A") + end + else + Battle.handle() + end + else + local birdPath + local px, py = Player.position() + if caught then + if px > 33 then + return true + end + local startY = 9 + if px > 28 then + startY = py + end + birdPath = {{32,startY}, {32,11}, {34,11}} + elseif px == 37 then + if py == 10 then + py = 11 + else + py = 10 + end + Walk.step(px, py) + else + birdPath = {{32,10}, {32,11}, {34,11}, {34,10}, {37,10}} + end + if birdPath then + Walk.custom(birdPath) + end + end + end, + + startMtMoon = function() + Control.moonEncounters = 0 + Control.canDie(false) + return true + end, + + evolveNidoking = function(data) + if Battle.handleWild() then + if Strategies.initialize() then + if data.paras and not Pokemon.inParty("paras") then + return true + end + if data.exp and Pokemon.getExp() > data.exp then + return true + end + if not Inventory.contains("moon_stone") then + return true + end + end + if not Inventory.contains("moon_stone") then + if not status.canProgress then + Bridge.caught("nidoking") + status.canProgress = true + end + if Menu.close() then + return true + end + elseif not Inventory.use("moon_stone") then + Menu.pause() + end + end + end, + helix = function() if Battle.handleWild() then if Inventory.contains("helix_fossil") then @@ -637,6 +819,40 @@ Strategies.functions = { end end, + reportMtMoon = function() + if Battle.pp("horn_attack") == 0 then + print("ERR: Ran out of Horn Attacks") + end + if Control.moonEncounters then + local catchPokemon = yellow and "sandshrew" or "paras" + local capsName = Utils.capitalize(catchPokemon) + local parasStatus + local conjunction = "but" + local goodEncounters = Control.moonEncounters < 10 + local catchDescription + if Pokemon.inParty(catchPokemon) then + catchDescription = catchPokemon + if goodEncounters then + conjunction = "and" + end + parasStatus = "we found a "..capsName.."!" + else + catchDescription = "no_"..catchPokemon + if not goodEncounters then + conjunction = "and" + end + parasStatus = "we didn't find a "..capsName.." :(" + end + Bridge.caught(catchDescription) + Bridge.chat(Control.moonEncounters.." Moon encounters, "..conjunction.." "..parasStatus) + Control.moonEncounters = nil + end + + local timeLimit = Strategies.getTimeRequirement("mt_moon") + Strategies.resetTime(timeLimit, "complete Mt. Moon", true) + return true + end, + dodgeCerulean = function() return dodgeH{ npc = 0x0242,