Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions lib/OverworldBattle.lua
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,10 @@ end
-- not nest.
local session = nil

local function isIOS()
return love.system and love.system.getOS and love.system.getOS() == "iOS"
end

local function game()
return require("src.core.Game")
end
Expand Down Expand Up @@ -484,11 +488,15 @@ function OverworldBattle.update(dt)
-- reason the scene is: it binds a canvas of its own. After the frost, so
-- the glass is frosted from the world alone and never from the glyphs
-- about to sit on it.
local okHud, up = pcall(OverworldBattle.snapHUDs, session.battle, shot)
local ios = isIOS()
local okHud, up = false, false
if not ios then
okHud, up = pcall(OverworldBattle.snapHUDs, session.battle, shot)
end
session.snapped = (okHud and up) and true or false
-- once per battle, not once per frame: a driver that cannot do this cannot
-- do it sixty times a second either, and the fallback is silent and fine
if not okHud and not session.hudWarned then
if not ios and not okHud and not session.hudWarned then
session.hudWarned = true
V.mod.log:warn("overworld battle HUD snap failed: %s -- the HUDs draw "
.. "in the battle frame this battle", tostring(up))
Expand Down Expand Up @@ -928,6 +936,7 @@ function OverworldBattle.install()
local innerText = BattleState.drawTextArea
function BattleState:drawTextArea()
if not self.dramaticShapeShot then return innerText(self) end
if isIOS() then return innerText(self) end
local battle = self
if not self.dramaticShapeDark then return withoutBoxFill(battle, innerText) end
BattleHud.flipGlyphs(BattleScene.GB_W, BattleScene.GB_H, function()
Expand Down Expand Up @@ -1146,6 +1155,17 @@ function OverworldBattle.drawHudPanels(battle)
local shot = battle.dramaticShapeShot
battle.dramaticShapeDark = nil
if not shot then return end
if isIOS() then
local slide = (battle.introSlide or 0) * 4
local enemy, player = OverworldBattle.hudLive(battle, slide)
local rect = OverworldBattle.HUD_RECT
love.graphics.setColor(1, 1, 1, 0.84)
if enemy then love.graphics.rectangle("fill", rect.enemy[1], rect.enemy[2], rect.enemy[3], rect.enemy[4]) end
if player then love.graphics.rectangle("fill", rect.player[1], rect.player[2], rect.player[3], rect.player[4]) end
love.graphics.setColor(1, 1, 1, 1)
battle.dramaticShapeDark = nil
return
end
if snapped() then
battle.dramaticShapeDark = session and session.dark or nil
return
Expand Down
9 changes: 9 additions & 0 deletions lib/PixelCanvas.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
local V = ...

local PixelCanvas = {}

function PixelCanvas.new(w, h)
return pcall(love.graphics.newCanvas, w, h, { dpiscale = 1 })
end

return PixelCanvas
5 changes: 4 additions & 1 deletion lib/ShadowMap.lua
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ end
local function getCanvas(res)
if canvas == false then return nil end
if canvas and canvasRes == res then return canvas end
local ok, c = pcall(love.graphics.newCanvas, res, res)
local ok, c = V.require("PixelCanvas").new(res, res)
if not (ok and c) then
canvas = false
return nil
Expand Down Expand Up @@ -221,6 +221,9 @@ end
-- where the canvas cannot be made -- VoxelScene then keeps the flat decal
-- shadows, which need nothing but a quad.
function ShadowMap.available()
if love.system and love.system.getOS and love.system.getOS() == "iOS" then
return false
end
if not (love.graphics and love.graphics.newCanvas
and love.graphics.setDepthMode) then
return false
Expand Down
6 changes: 4 additions & 2 deletions lib/TiltShift.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
-- failure -- headless, no shader support) apply() hands the canvas back
-- untouched, so every other path is byte-for-byte what it always was.

local V = ...
local TiltShift = {}

TiltShift.level = 0
Expand Down Expand Up @@ -85,9 +86,10 @@ end

local function getCanvases(w, h)
if not ping or cw ~= w or ch ~= h then
local ok, a = pcall(love.graphics.newCanvas, w, h)
local PixelCanvas = V.require("PixelCanvas")
local ok, a = PixelCanvas.new(w, h)
if not ok then return nil end
local okB, b = pcall(love.graphics.newCanvas, w, h)
local okB, b = PixelCanvas.new(w, h)
if not okB then return nil end
-- the gaussian's fractional tap offsets need linear filtering
a:setFilter("linear", "linear")
Expand Down
3 changes: 2 additions & 1 deletion lib/Voxel3D.lua
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ local WorldCurve = V.require("WorldCurve")
local Sky = V.require("Sky")
local DayNight = V.require("DayNight")
local GlassMask = V.require("GlassMask")
local PixelCanvas = V.require("PixelCanvas")

local Voxel3D = {}

Expand Down Expand Up @@ -640,7 +641,7 @@ function Voxel3D.beginScene(w, h, cx, cy, vw, vh, sky, slot)
local name = slot or "world"
local slotHeld = slots[name]
if not (slotHeld and slotHeld.w == w and slotHeld.h == h) then
local ok, c = pcall(love.graphics.newCanvas, w, h)
local ok, c = PixelCanvas.new(w, h)
if not ok then return false end
c:setFilter("nearest", "nearest")
if slotHeld then releaseSlot(slotHeld) end
Expand Down