mirror of
https://github.com/AverageConsumer/kanto-gear.git
synced 2026-08-28 18:24:42 +02:00
Add optional full bottom battle UI
This commit is contained in:
@@ -98,6 +98,8 @@ handheld and the fork is not distributed as a PC replacement.
|
|||||||
- **EXTRA SCREEN** prefers an external presentation display for TV-style use.
|
- **EXTRA SCREEN** prefers an external presentation display for TV-style use.
|
||||||
- **HIDE UPPER BATTLE UI** removes duplicated battle menus only while the
|
- **HIDE UPPER BATTLE UI** removes duplicated battle menus only while the
|
||||||
companion display is ready.
|
companion display is ready.
|
||||||
|
- **FULL BOTTOM BATTLE UI** additionally moves both HP/status panels to the
|
||||||
|
companion display. The current split layout remains the default.
|
||||||
- **PROFILE → PURIST** hides gameplay-assistance pages; **ENHANCED** enables
|
- **PROFILE → PURIST** hides gameplay-assistance pages; **ENHANCED** enables
|
||||||
them; **CUSTOM** lets you choose each assist separately.
|
them; **CUSTOM** lets you choose each assist separately.
|
||||||
|
|
||||||
|
|||||||
+94
-13
@@ -553,10 +553,18 @@ return function(mod)
|
|||||||
} },
|
} },
|
||||||
{ key = "hide_upper_battle_ui", label = "HIDE UPPER BATTLE UI",
|
{ key = "hide_upper_battle_ui", label = "HIDE UPPER BATTLE UI",
|
||||||
type = "toggle", default = false },
|
type = "toggle", default = false },
|
||||||
|
{ key = "full_bottom_battle_ui", label = "FULL BOTTOM BATTLE UI",
|
||||||
|
type = "toggle", default = false },
|
||||||
})
|
})
|
||||||
local function assist(key)
|
local function assist(key)
|
||||||
return assistEnabled(mod.options:get("profile"), mod.options:get(key))
|
return assistEnabled(mod.options:get("profile"), mod.options:get(key))
|
||||||
end
|
end
|
||||||
|
local function fullBottomBattleUI()
|
||||||
|
return mod.options:get("full_bottom_battle_ui") == true
|
||||||
|
end
|
||||||
|
local function hideUpperBattleUI()
|
||||||
|
return fullBottomBattleUI() or mod.options:get("hide_upper_battle_ui")
|
||||||
|
end
|
||||||
|
|
||||||
local runtime = rawget(_G, "love")
|
local runtime = rawget(_G, "love")
|
||||||
local system = runtime and runtime.system
|
local system = runtime and runtime.system
|
||||||
@@ -1729,7 +1737,7 @@ return function(mod)
|
|||||||
|
|
||||||
local function drawBattleLocked()
|
local function drawBattleLocked()
|
||||||
header("BATTLE")
|
header("BATTLE")
|
||||||
if mod.options:get("hide_upper_battle_ui")
|
if hideUpperBattleUI()
|
||||||
and battle.message and #battle.message > 0 then
|
and battle.message and #battle.message > 0 then
|
||||||
box("fill", 6, 30, 148, 106, DARK)
|
box("fill", 6, 30, 148, 106, DARK)
|
||||||
outline(6, 30, 148, 106, PAPER)
|
outline(6, 30, 148, 106, PAPER)
|
||||||
@@ -1747,6 +1755,50 @@ return function(mod)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function drawFullBattleHpBar(x, y, w, hp, maxHp)
|
||||||
|
local ratio = math.max(0,
|
||||||
|
math.min(1, (hp or 0) / math.max(1, maxHp or 1)))
|
||||||
|
box("fill", x, y, w, 6, DARK)
|
||||||
|
box("fill", x + 1, y + 1, math.floor((w - 2) * ratio), 4,
|
||||||
|
ratio > 0.5 and MID or ratio > 0.2 and PAPER or INK)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function drawFullBattleStatus(mon, y, player)
|
||||||
|
if not mon then return end
|
||||||
|
text(fit(mon.name or mon.species or "-", 12), 6, y + 4, INK, 2)
|
||||||
|
text(fit("L" .. tostring(mon.level or 0), 4), 6, y + 27, DARK)
|
||||||
|
local status = (mon.hp or 0) <= 0 and "FNT" or mon.status
|
||||||
|
if status then text(fit(status, 3), 36, y + 27, DARK) end
|
||||||
|
if player then
|
||||||
|
drawFullBattleHpBar(60, y + 28, 48, mon.hp, mon.maxHp)
|
||||||
|
text(fit(("%d/%d"):format(mon.hp or 0, mon.maxHp or 0), 7),
|
||||||
|
113, y + 27, INK)
|
||||||
|
else
|
||||||
|
drawFullBattleHpBar(60, y + 28, 94, mon.hp, mon.maxHp)
|
||||||
|
end
|
||||||
|
box("fill", 4, y + 44, 152, 1, DARK)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function drawFullBattleActions(labels)
|
||||||
|
for i, label in ipairs(labels) do
|
||||||
|
local col, row = (i - 1) % 2, math.floor((i - 1) / 2)
|
||||||
|
button(3 + col * 78, 94 + row * 24, 76, 22,
|
||||||
|
label, battle.menuIndex == i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function drawFullBattleRoot()
|
||||||
|
drawFullBattleStatus(battle.enemy, 0, false)
|
||||||
|
drawFullBattleStatus(battle.player, 45, true)
|
||||||
|
drawFullBattleActions({ "FIGHT", "PKMN", "ITEM", "RUN" })
|
||||||
|
end
|
||||||
|
|
||||||
|
local function drawFullSafari()
|
||||||
|
drawFullBattleStatus(battle.enemy, 0, false)
|
||||||
|
centered("SAFARI BALLS " .. tostring(battle.safariBalls or 0), 64, DARK)
|
||||||
|
drawFullBattleActions({ "BALL", "BAIT", "ROCK", "RUN" })
|
||||||
|
end
|
||||||
|
|
||||||
local function drawBattle()
|
local function drawBattle()
|
||||||
local top = game and game.stack and game.stack:top()
|
local top = game and game.stack and game.stack:top()
|
||||||
local party = top and top.isPartyMenu and top
|
local party = top and top.isPartyMenu and top
|
||||||
@@ -1763,7 +1815,7 @@ return function(mod)
|
|||||||
elseif summary then
|
elseif summary then
|
||||||
drawBattleSummary(summary)
|
drawBattleSummary(summary)
|
||||||
elseif battle.prompt == "safari" then
|
elseif battle.prompt == "safari" then
|
||||||
drawSafari()
|
if fullBottomBattleUI() then drawFullSafari() else drawSafari() end
|
||||||
elseif battle.prompt == "mimic" then
|
elseif battle.prompt == "mimic" then
|
||||||
drawMimic()
|
drawMimic()
|
||||||
elseif moveInfo then
|
elseif moveInfo then
|
||||||
@@ -1773,7 +1825,8 @@ return function(mod)
|
|||||||
elseif battle.prompt ~= "menu" then
|
elseif battle.prompt ~= "menu" then
|
||||||
drawBattleLocked()
|
drawBattleLocked()
|
||||||
else
|
else
|
||||||
drawBattleRoot()
|
if fullBottomBattleUI() then drawFullBattleRoot()
|
||||||
|
else drawBattleRoot() end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2058,6 +2111,15 @@ return function(mod)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function fullBattleChoice(x, y)
|
||||||
|
for i = 1, 4 do
|
||||||
|
local col, row = (i - 1) % 2, math.floor((i - 1) / 2)
|
||||||
|
if inside(x, y, 3 + col * 78, 94 + row * 24, 76, 22) then
|
||||||
|
return i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function tapBattle(x, y)
|
local function tapBattle(x, y)
|
||||||
local top = game and game.stack and game.stack:top()
|
local top = game and game.stack and game.stack:top()
|
||||||
if top and top.kind == "pp_item_move" then
|
if top and top.kind == "pp_item_move" then
|
||||||
@@ -2111,9 +2173,15 @@ return function(mod)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
if battle.prompt == "safari" then
|
if battle.prompt == "safari" then
|
||||||
if y < 24 then return end
|
local choice
|
||||||
local col, row = x >= 81 and 1 or 0, y >= 81 and 1 or 0
|
if fullBottomBattleUI() then
|
||||||
local action = ({ "ball", "bait", "rock", "run" })[row * 2 + col + 1]
|
choice = fullBattleChoice(x, y)
|
||||||
|
elseif y >= 24 then
|
||||||
|
local col, row = x >= 81 and 1 or 0, y >= 81 and 1 or 0
|
||||||
|
choice = row * 2 + col + 1
|
||||||
|
end
|
||||||
|
local action = ({ "ball", "bait", "rock", "run" })[choice]
|
||||||
|
if not action then return end
|
||||||
submit("safari", { action = action })
|
submit("safari", { action = action })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -2153,9 +2221,15 @@ return function(mod)
|
|||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if battle.prompt ~= "menu" or y < 24 then return end
|
if battle.prompt ~= "menu" then return end
|
||||||
local col, row = x >= 81 and 1 or 0, y >= 81 and 1 or 0
|
local choice
|
||||||
local choice = row * 2 + col + 1
|
if fullBottomBattleUI() then
|
||||||
|
choice = fullBattleChoice(x, y)
|
||||||
|
elseif y >= 24 then
|
||||||
|
local col, row = x >= 81 and 1 or 0, y >= 81 and 1 or 0
|
||||||
|
choice = row * 2 + col + 1
|
||||||
|
end
|
||||||
|
if not choice then return end
|
||||||
local raw = battleState()
|
local raw = battleState()
|
||||||
if raw and game.stack:top() == raw then
|
if raw and game.stack:top() == raw then
|
||||||
raw.menuIndex = choice
|
raw.menuIndex = choice
|
||||||
@@ -2600,7 +2674,7 @@ return function(mod)
|
|||||||
local raw = battleState()
|
local raw = battleState()
|
||||||
local top = game and game.stack and game.stack:top()
|
local top = game and game.stack and game.stack:top()
|
||||||
local owned = bottomOwnsBattleUI(
|
local owned = bottomOwnsBattleUI(
|
||||||
mod.options:get("hide_upper_battle_ui"), active,
|
hideUpperBattleUI(), active,
|
||||||
system.hasSecondaryDisplay(), displayReady, raw)
|
system.hasSecondaryDisplay(), displayReady, raw)
|
||||||
return not (owned
|
return not (owned
|
||||||
and (state == raw or (state == top and top.isTextBox)))
|
and (state == raw or (state == top and top.isTextBox)))
|
||||||
@@ -2609,21 +2683,28 @@ return function(mod)
|
|||||||
mod.hooks:wrap("battle.move_grid_navigation", function(next, state)
|
mod.hooks:wrap("battle.move_grid_navigation", function(next, state)
|
||||||
if next(state) == true then return true end
|
if next(state) == true then return true end
|
||||||
return bottomOwnsBattleUI(
|
return bottomOwnsBattleUI(
|
||||||
mod.options:get("hide_upper_battle_ui"), active,
|
hideUpperBattleUI(), active,
|
||||||
system.hasSecondaryDisplay(), displayReady, state)
|
system.hasSecondaryDisplay(), displayReady, state)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
mod.hooks:wrap("ui.party.grid_navigation", function(next, state)
|
mod.hooks:wrap("ui.party.grid_navigation", function(next, state)
|
||||||
if next(state) == true then return true end
|
if next(state) == true then return true end
|
||||||
return bottomOwnsBattleUI(
|
return bottomOwnsBattleUI(
|
||||||
mod.options:get("hide_upper_battle_ui"), active,
|
hideUpperBattleUI(), active,
|
||||||
system.hasSecondaryDisplay(), displayReady, battleState())
|
system.hasSecondaryDisplay(), displayReady, battleState())
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
mod.hooks:wrap("battle.status_hud_visible", function(next, state)
|
||||||
|
if next(state) == false then return false end
|
||||||
|
return not bottomOwnsBattleUI(
|
||||||
|
fullBottomBattleUI(), active, system.hasSecondaryDisplay(),
|
||||||
|
displayReady, state)
|
||||||
|
end)
|
||||||
|
|
||||||
mod.hooks:wrap("screen.render_visible", function(next, state)
|
mod.hooks:wrap("screen.render_visible", function(next, state)
|
||||||
if next(state) == false then return false end
|
if next(state) == false then return false end
|
||||||
local owned = bottomOwnsBattleUI(
|
local owned = bottomOwnsBattleUI(
|
||||||
mod.options:get("hide_upper_battle_ui"), active,
|
hideUpperBattleUI(), active,
|
||||||
system.hasSecondaryDisplay(), displayReady, battleState())
|
system.hasSecondaryDisplay(), displayReady, battleState())
|
||||||
return not (owned and mirroredBattleMenu(state))
|
return not (owned and mirroredBattleMenu(state))
|
||||||
end)
|
end)
|
||||||
|
|||||||
Reference in New Issue
Block a user