mirror of
https://github.com/love2d/love.git
synced 2026-08-12 08:30:56 +02:00
0f0a64819e
(Designed to make launchers work for 'fake-fused' games, for example ones you'd easily distribute on linux.)
810 lines
27 KiB
Lua
810 lines
27 KiB
Lua
--[[
|
|
Copyright (c) 2006-2012 LOVE Development Team
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
--]]
|
|
|
|
-- Make sure love table exists.
|
|
if not love then love = {} end
|
|
|
|
-- Used for setup:
|
|
love.path = {}
|
|
love.arg = {}
|
|
|
|
-- Unparsed arguments:
|
|
argv = {}
|
|
|
|
-- Replace any \ with /.
|
|
function love.path.normalslashes(p)
|
|
return string.gsub(p, "\\", "/")
|
|
end
|
|
|
|
-- Makes sure there is a slash at the end
|
|
-- of a path.
|
|
function love.path.endslash(p)
|
|
if string.sub(p, string.len(p)-1) ~= "/" then
|
|
return p .. "/"
|
|
else
|
|
return p
|
|
end
|
|
end
|
|
|
|
-- Checks whether a path is absolute or not.
|
|
function love.path.abs(p)
|
|
|
|
local tmp = love.path.normalslashes(p)
|
|
|
|
-- Path is absolute if it starts with a "/".
|
|
if string.find(tmp, "/") == 1 then
|
|
return true
|
|
end
|
|
|
|
-- Path is absolute if it starts with a
|
|
-- letter followed by a colon.
|
|
if string.find(tmp, "%a:") == 1 then
|
|
return true
|
|
end
|
|
|
|
-- Relative.
|
|
return false
|
|
|
|
end
|
|
|
|
-- Converts any path into a full path.
|
|
function love.path.getfull(p)
|
|
|
|
if love.path.abs(p) then
|
|
return love.path.normalslashes(p)
|
|
end
|
|
|
|
local cwd = love.filesystem.getWorkingDirectory()
|
|
cwd = love.path.normalslashes(cwd)
|
|
cwd = love.path.endslash(cwd)
|
|
|
|
-- Construct a full path.
|
|
local full = cwd .. love.path.normalslashes(p)
|
|
|
|
-- Remove trailing /., if applicable
|
|
return full:match("(.-)/%.$") or full
|
|
end
|
|
|
|
-- Returns the leaf of a full path.
|
|
function love.path.leaf(p)
|
|
local a = 1
|
|
local last = p
|
|
|
|
while a do
|
|
a = string.find(p, "/", a+1)
|
|
|
|
if a then
|
|
last = string.sub(p, a+1)
|
|
end
|
|
end
|
|
|
|
return last
|
|
end
|
|
|
|
-- Finds the key in the table with the lowest integral index. The lowest
|
|
-- will typically the executable, for instance "lua5.1.exe".
|
|
function love.arg.getLow(a)
|
|
local m = math.huge
|
|
for k,v in pairs(a) do
|
|
if k < m then
|
|
m = k
|
|
end
|
|
end
|
|
return a[m]
|
|
end
|
|
|
|
love.arg.options = {
|
|
console = { a = 0 },
|
|
fused = {a = 0 },
|
|
game = { a = 1 }
|
|
}
|
|
|
|
function love.arg.parse_option(m, i)
|
|
m.set = true
|
|
|
|
if m.a > 0 then
|
|
m.arg = {}
|
|
for j=i,i+m.a-1 do
|
|
table.insert(m.arg, arg[j])
|
|
i = j
|
|
end
|
|
end
|
|
|
|
return i
|
|
end
|
|
|
|
function love.arg.parse_options()
|
|
|
|
local game
|
|
local argc = #arg
|
|
|
|
for i=1,argc do
|
|
-- Look for options.
|
|
local s, e, m = string.find(arg[i], "%-%-(.+)")
|
|
|
|
if m and love.arg.options[m] then
|
|
i = love.arg.parse_option(love.arg.options[m], i+1)
|
|
elseif not game then
|
|
game = i
|
|
end
|
|
end
|
|
|
|
if not love.arg.options.game.set then
|
|
love.arg.parse_option(love.arg.options.game, game or 0)
|
|
end
|
|
end
|
|
|
|
function love.createhandlers()
|
|
|
|
-- Standard callback handlers.
|
|
love.handlers = setmetatable({
|
|
keypressed = function (b, u)
|
|
if love.keypressed then love.keypressed(b, u) end
|
|
end,
|
|
keyreleased = function (b)
|
|
if love.keyreleased then love.keyreleased(b) end
|
|
end,
|
|
mousepressed = function (x,y,b)
|
|
if love.mousepressed then love.mousepressed(x,y,b) end
|
|
end,
|
|
mousereleased = function (x,y,b)
|
|
if love.mousereleased then love.mousereleased(x,y,b) end
|
|
end,
|
|
joystickpressed = function (j,b)
|
|
if love.joystickpressed then love.joystickpressed(j,b) end
|
|
end,
|
|
joystickreleased = function (j,b)
|
|
if love.joystickreleased then love.joystickreleased(j,b) end
|
|
end,
|
|
focus = function (f)
|
|
if love.focus then love.focus(f) end
|
|
end,
|
|
quit = function ()
|
|
return
|
|
end,
|
|
}, {
|
|
__index = function(self, name)
|
|
error("Unknown event: " .. name)
|
|
end,
|
|
})
|
|
|
|
end
|
|
|
|
local is_fused_game = false
|
|
local no_game_code = false
|
|
|
|
-- This can't be overriden.
|
|
function love.boot()
|
|
|
|
-- This is absolutely needed.
|
|
require("love")
|
|
require("love.filesystem")
|
|
|
|
love.arg.parse_options()
|
|
|
|
local o = love.arg.options
|
|
|
|
local arg0 = love.arg.getLow(arg)
|
|
love.filesystem.init(arg0)
|
|
|
|
-- Is this one of those fancy "fused" games?
|
|
local can_has_game = pcall(love.filesystem.setSource, arg0)
|
|
is_fused_game = can_has_game
|
|
if love.arg.options.fused.set then
|
|
is_fused_game = true
|
|
end
|
|
|
|
if not can_has_game and o.game.set and o.game.arg[1] then
|
|
local full_source = love.path.getfull(o.game.arg[1])
|
|
local leaf = love.path.leaf(full_source)
|
|
love.filesystem.setIdentity(leaf)
|
|
can_has_game = pcall(love.filesystem.setSource, full_source)
|
|
end
|
|
|
|
if can_has_game and not (love.filesystem.exists("main.lua") or love.filesystem.exists("conf.lua")) then
|
|
no_game_code = true
|
|
end
|
|
|
|
if not can_has_game then
|
|
love.nogame()
|
|
end
|
|
|
|
end
|
|
|
|
function love.init()
|
|
|
|
-- Create default configuration settings.
|
|
-- NOTE: Adding a new module to the modules list
|
|
-- will NOT make it load, see below.
|
|
local c = {
|
|
title = "Untitled",
|
|
author = "Unnamed",
|
|
version = love._version,
|
|
screen = {
|
|
width = 800,
|
|
height = 600,
|
|
fullscreen = false,
|
|
vsync = true,
|
|
fsaa = 0,
|
|
},
|
|
modules = {
|
|
event = true,
|
|
keyboard = true,
|
|
mouse = true,
|
|
timer = true,
|
|
joystick = true,
|
|
image = true,
|
|
graphics = true,
|
|
audio = true,
|
|
physics = true,
|
|
sound = true,
|
|
font = true,
|
|
thread = true,
|
|
},
|
|
console = false, -- Only relevant for windows.
|
|
identity = false,
|
|
release = false,
|
|
}
|
|
|
|
-- If config file exists, load it and allow it to update config table.
|
|
if not love.conf and love.filesystem and love.filesystem.exists("conf.lua") then
|
|
require("conf")
|
|
end
|
|
|
|
-- Yes, conf.lua might not exist, but there are other ways of making
|
|
-- love.conf appear, so we should check for it anyway.
|
|
if love.conf then
|
|
local ok, err = pcall(love.conf, c)
|
|
if not ok then
|
|
print(err)
|
|
-- continue
|
|
end
|
|
end
|
|
|
|
if c.release then
|
|
love._release = {
|
|
title = c.title ~= "Untitled" and c.title or nil,
|
|
author = c.author ~= "Unnamed" and c.author or nil,
|
|
url = c.url
|
|
}
|
|
end
|
|
|
|
if love.arg.options.console.set then
|
|
c.console = true
|
|
end
|
|
|
|
-- Gets desired modules.
|
|
for k,v in ipairs{
|
|
"thread",
|
|
"timer",
|
|
"event",
|
|
"keyboard",
|
|
"joystick",
|
|
"mouse",
|
|
"sound",
|
|
"audio",
|
|
"image",
|
|
"font",
|
|
"graphics",
|
|
"physics",
|
|
} do
|
|
if c.modules[v] then
|
|
require("love." .. v)
|
|
end
|
|
end
|
|
|
|
if love.event then
|
|
love.createhandlers()
|
|
end
|
|
|
|
-- Setup screen here.
|
|
if c.screen and c.modules.graphics then
|
|
if love.graphics.checkMode(c.screen.width, c.screen.height, c.screen.fullscreen) or (c.screen.width == 0 and c.screen.height == 0) then
|
|
assert(love.graphics.setMode(c.screen.width, c.screen.height, c.screen.fullscreen, c.screen.vsync, c.screen.fsaa), "Could not set screen mode")
|
|
else
|
|
error("Could not set screen mode")
|
|
end
|
|
love.graphics.setCaption(c.title)
|
|
end
|
|
|
|
-- Our first timestep, because screen creation can take some time
|
|
if love.timer then
|
|
love.timer.step()
|
|
end
|
|
|
|
if love.filesystem then
|
|
love.filesystem.setRelease(c.release and is_fused_game)
|
|
if c.identity then love.filesystem.setIdentity(c.identity) end
|
|
if love.filesystem.exists("main.lua") then require("main") end
|
|
end
|
|
|
|
if no_game_code then
|
|
error("No code to run\nYour game might be packaged incorrectly\nMake sure main.lua is at the top level of the zip")
|
|
end
|
|
|
|
-- Console hack
|
|
if c.console and love._openConsole then
|
|
love._openConsole()
|
|
end
|
|
|
|
-- Check the version
|
|
local compat = false
|
|
c.version = tostring(c.version)
|
|
for i, v in ipairs(love._version_compat) do
|
|
if c.version == v then
|
|
compat = true
|
|
break
|
|
end
|
|
end
|
|
if not compat then
|
|
local major, minor, revision = c.version:match("^(%d+)%.(%d+)%.(%d+)$")
|
|
if (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then
|
|
local msg = "This game was made for a version that is probably incompatible.\n"..
|
|
"The game might still work, but it is not guaranteed.\n" ..
|
|
"Furthermore, this means one should not judge this game or the engine if not."
|
|
print(msg)
|
|
if love.graphics and love.timer and love.event then
|
|
love.event.pump()
|
|
love.graphics.setBackgroundColor(89, 157, 220)
|
|
love.graphics.clear()
|
|
love.graphics.print(msg, 70, 70)
|
|
love.graphics.present()
|
|
love.graphics.setBackgroundColor(0, 0, 0)
|
|
love.timer.sleep(3)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function love.run()
|
|
|
|
math.randomseed(os.time())
|
|
math.random() math.random()
|
|
|
|
if love.load then love.load(arg) end
|
|
|
|
local dt = 0
|
|
|
|
-- Main loop time.
|
|
while true do
|
|
-- Process events.
|
|
if love.event then
|
|
love.event.pump()
|
|
for e,a,b,c,d in love.event.poll() do
|
|
if e == "quit" then
|
|
if not love.quit or not love.quit() then
|
|
if love.audio then
|
|
love.audio.stop()
|
|
end
|
|
return
|
|
end
|
|
end
|
|
love.handlers[e](a,b,c,d)
|
|
end
|
|
end
|
|
|
|
-- Update dt, as we'll be passing it to update
|
|
if love.timer then
|
|
love.timer.step()
|
|
dt = love.timer.getDelta()
|
|
end
|
|
|
|
-- Call update and draw
|
|
if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
|
|
if love.graphics then
|
|
love.graphics.clear()
|
|
if love.draw then love.draw() end
|
|
end
|
|
|
|
if love.timer then love.timer.sleep(0.001) end
|
|
if love.graphics then love.graphics.present() end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------------------------
|
|
-- Default screen.
|
|
-----------------------------------------------------------
|
|
|
|
function love.nogame()
|
|
local pig_png =
|
|
"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
|
|
bWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
|
|
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
|
|
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
|
|
NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
|
|
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
|
|
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv\
|
|
IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS\
|
|
ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD\
|
|
cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlE\
|
|
PSJ4bXAuaWlkOjdCQTYxREYxOUQ5RDExRTBBNjY4RTc1NEVEQTU1MERDIiB4bXBNTTpEb2N1bWVu\
|
|
dElEPSJ4bXAuZGlkOjdCQTYxREYyOUQ5RDExRTBBNjY4RTc1NEVEQTU1MERDIj4gPHhtcE1NOkRl\
|
|
cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N0JBNjFERUY5RDlEMTFFMEE2NjhF\
|
|
NzU0RURBNTUwREMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0JBNjFERjA5RDlEMTFFMEE2\
|
|
NjhFNzU0RURBNTUwREMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1l\
|
|
dGE+IDw/eHBhY2tldCBlbmQ9InIiPz6gRGuzAAAYXklEQVR42uydX2hcV37Hz4xkeTdxNrITkpBk\
|
|
0/EmgWxLbKlhyZZCPYJtSw3FUpe+FTzzsG9LLdFCH2W9FzwufeuDRtDX4tGLS0tBo0IpS1s8Tmk3\
|
|
S9x4kniXeMnKk7/eWLLU87vzu9LV/L/3nnPv79z7/cBlFEcjjc45v+/5/s7fwsHBgQIA5JMiigAA\
|
|
CAAAAAIAAIAAAAAgAAAACAAAAAIAAIAAAAAgAAAACAAAAAIAAIAAAAAgAAAACAAAAAIAAIAAAAAg\
|
|
AAAACAAAAAIAAIAAAAAgAAAACAAAAAIAAIAAAAAgAAAACAAAAAIAADDBdNg3FAoFax+m89f/XNYv\
|
|
9JzXz6x+5viVaPJrSz8f0OvsX/5BE1UIQD+T3vlZCHs5qGkB0EFPAb6sn8v6KYV9OwvDpn4aWhA6\
|
|
qHoAHBEAHfwU+KuBXj4uDf1saCFooAkACIBQAeBe/wbbfRu09XNdP3W4AgABECQAHPxbnN/bpsNC\
|
|
UIMQAAhAP4nOAiQc/IpTC0ox7urffRXNAoAUHYAOwi2Ltn/S1GAFYwQgLXimi2jZdKXiUgDugVeF\
|
|
1ENTP1VdAW00SWAgqMnRltjZPh1wuMFp7HG0OGX1p7mbun22MiEArHpbAutuTRcyUgMQJoWdU0dr\
|
|
VUqW09nI09zSBOBWgnl/WFrsBlpo4qCn3ZY42C9w+02zDVPwN7jTajsjALoQK/pl3YH6hhtAwFMP\
|
|
v8gBX1bhF6YlRY3ba8cFAbgruCAHuYEll8cGdi7WZgf0VOWYPU/QHXXO3FxuZSjo5zjoLwl2qYNo\
|
|
s3NtihUAh3r/3gZflThToIPbH1TyX/09E7MpNd6gONDrpyowmKWFoiM46C9z4JeU21BbrUsVgLsO\
|
|
FzAtHlpJKdB9+1liO1pyuBybLAi3WRxIGNoIersikLoACB75D5sSLNicr+Vgn+PePO2BpqSFoeUL\
|
|
g420ggfxrmQ06HuZDw5kSxAAsv6VLKSJLAItA8E+q45Glcs5CvYw6cQ2iYMWhGbEoPcH8q7krHzb\
|
|
uo2elSQAD5S5XX4SGufKoFwLAW/dJWyyILQmDH6bm8ykcziTlaoA6IpY5IrIVGPUhbswQdD7C0Uu\
|
|
5bgh2hLhBjuExqgBxoD1r2SoE5qojHQbPS1BALJi/4m6GrP4goM+qwNMUmkE3EF7RFuscN3kRYy9\
|
|
AcG0BcB1++9vI64PC3wEvbhUYWOUM+BZgCsZ6piGCqNus0upCQAX9C3HA3/g+QE66EvqaIAJQS/X\
|
|
GWxoIWiMSA8qXIeZTA902y2kKQB0zNe1jAX+YqC3B+7UKaVv1welCDHPopTOwtN/8fvNtATApfx/\
|
|
aOBzb1/JaAPJZYqghaA+YpxgNUP1vKIFoJaWAEje+TdJ4Jc56CuIm8zR5rGC2qCxggwJQU0LwEpa\
|
|
AnDgcOBT5ZcRJ7lID7yttUPSgwqnsa6OETS1ACwkLgDCl/8O3EKpAz9r9g+Eoz5ICAJjBC4OFqYm\
|
|
ABRM6xIruHc6D4EPQgrBahYFYNrwL5YUTE3VXb7bGmD1ryksywXHoQ6hotvHMSFgx3hVC0GdRaCS\
|
|
pT/atANI+9Rfgiqu76AE5PggJGtqwGAhp7nSO5CJHUCWbgf2N+ycDQY/TefpZ53HJhD8YFK8+yQ4\
|
|
VTyE2pZ+5qmT4TbnNKYFIK0AI3tGgV/r6fWvqu6qxAraM4gA5f/ruh3dYgcZFAKvzanu4LKzTDte\
|
|
QaPs/rrCAB8wA9n9LR4fWPHTAh4fWNFpwaawtKCduAPgNdZJUhtg92f1c43tPoIfmKbCacHikLRg\
|
|
Tcjn/CCNFCCpgPNP6Fnp6fWpUugMwmW0U2A5Lbih29sNPvAlKASUcs6H6YEz4wASgqb05of0+jdU\
|
|
vg5/AOmyOMQNtFgEGhAAs9S552/35Pq30OsDSW6AxgZoT35aKcGwuwJsC0DZ4t9E03vV4DJeHuFH\
|
|
rg+kuIFbfEhMb0qQ9HRhqPRDugPw8/1aj+WnwF9FuwOCKLEILPeIgOdcExSBVlYEwD+TP5jvk8Le\
|
|
VVjQA+RyjRae9aQELRaBdgK/fzsLAuAHfysQ/BXO9zHQB6RDbXWLD5UJisB82B46Ak3XBYAO4pzv\
|
|
yfdpUc862hVwiDlOCcoBEeiwE7AlAp2wF9gUBQZ/tSffv6GwlBe4ySw7gUpCItAM+wZJArDWG/yq\
|
|
O8qPgziB66zzrJVtEdh2VQCq/pVGHPxzHPzYsw+ywiqnsjZFoOGiABy72hjBDzJMxaIItEbdXiVV\
|
|
AIYFP0b6AUQgHBtR3lRE8AOQCRFouCQAdQQ/gAgYE4FI9j8tAeid6kPwA4jAkQjQJqKwy4Y3on6A\
|
|
pAWgOWCqD9t4AUTgSATaKvzegYYEARhnQVqsbsHgx24+ALoisBwQgWOxMi74o9r/JAWA1KzacysP\
|
|
9fyY6gOgy7WeFYNN1d1KbM3+J5kCVHs29pDlKaPOAegTgbmACNTV6FOH2/p7GtIFoBb8kKxyFdQ1\
|
|
AH34eweCW4np7Mumjd4/iRSgFTy8k9UNu/oAGCMCPf+2NCS+amIEYMBARCeYwwRG/AEAo5njg279\
|
|
2PKnB4PUe2+6lpYCrPXsTcZFHQBMznLwxGGOpeBR+EYOHDUtAO2A9Q+e40dTHNjWC0A4eo8Wq/F4\
|
|
QD3O1F+QaQsCUAoqFR+LhAM8AYg2HkBpc/Cm36rJX2DaAXRYnZqBf8NKPwCiU+5ZJNQ21fvbEIDb\
|
|
wdyEPzgW+wAQj9XgAaMmKRwcHIR7Q6Ew0ffxB8YpvgCYoXHm5vKky4PVpHFtcxbgGoIfAGMsBk8Y\
|
|
lpoC+L0/fVCM+gNglnUnBEBhtR8ANigFTxcWKQC81r+EugLACleCawMkOgDM+QNgDwr+ZZECgN4f\
|
|
ALdcgGkHgN4fAIdcgDEBQO8PgHsuwKQDQO8PQLIuoCJCAHjeH70/AAm7ACkO4ArqAoDEKQXPDEhF\
|
|
AHjNP1b9AZAOl9N2AAh+ANJjMc5goAkBuIw6ACBVKqkIANt/7PcHwNE0IK4DgP0HIH3moh4YElcA\
|
|
YP8BkEE5UQHggQfYfwBkcClpBwD7D0BeHYDmAsocADHMRjkyLI4AlFHmALjtAiIJAOf/JZQ3AKI4\
|
|
n5QDwOAfAPKYS0oAYP8BkEcp7LLgqAJwHmUNgPsuIKoA4MIPAHIsAEgBAJCJ3RTA5JnkAADjXLAq\
|
|
AAozAABkhiKKAACMAYShhDIGIKdjABAAAJACAAAgAAAACAAAQAxhtgVDAACAAwAAZIgWBACAnHLm\
|
|
5nIHAgAAsCIAHRQbAPkVgBaKDYD8CgAAQC5N2wLQRhkDkFMHcObmMgQAALmEStGnI/4SEoESytod\
|
|
CqefUIWZqeP/9uRJVTh1cuh79u9/1v9vD75S6tFjFKhcPoUA5M3GPf+UUiemVfHME/p1ygt279/p\
|
|
tSfowzD15osj//+BFoMDEoPdPf31Q/31XvffvnikDr78GhXjwBhAVAHYVjgXMJVA93pt6s31EzfA\
|
|
jbgK/z9ePj1YILQQkDiQm4B7SIR2EgKAcQDbwcWB7gU9vzqZdpBIaXHw3URXEL7SgvC599DXwBxh\
|
|
x+iiCgDWAtjo4XWgUKD7QZ9ZYdNP0XcM2hHs//KzriB81EHqkKD9jywAWmVaOxdrtCLQ6gnBD/cf\
|
|
qZ98eUc//6fuPdo5/hmmT6lz33xFvf3kq+rlmTNuVpe271MU9N+ePQqIvKHLwBM++vvfesUTABKC\
|
|
x+9/4qQ7oDb7zsMPvTb73q8/7muzr598Qb196lXv1QLbiQhAQG0WbRXkP356W219/r9egQ5iZ+8L\
|
|
1dT/n563n3xN/fD099Q3izMI+gw4hKk3nveeQzF4974TzoAC/+9/9W8j2+xP9u54ndrr33hB/cns\
|
|
90x3Xq0kBWDbhgBQ4f3NL/+pr8cfBRUoFf6fP/eHYt0AWXqvYVPQpzhw56wYaDdAQkDOQCIU+NQO\
|
|
J4XcAbVz6rioA0srBSgm+csmIWzw9woHqawkpr7zrDrxgzfUzMXf8r5G8EcX0OnfOatO/ulvq+lz\
|
|
L3ni4GrwB9ssvZc6LxO9f5htwLEFgMYBlOHZgH948B+Rgj9YoH/3yZaYwJ9ZPOc1WhdH8EWnUG++\
|
|
eFi2aQtBN9+/E1tAhqUNIdiM8qa4m4GMuQA/p48LCUjcCjEV+JJ6qSwSLOu0nBV1WibSXgM/p5GG\
|
|
AGyaKsitz39qrFKaBn9WGItKVh+Bn44QnLx03ksNkoQ6GlMpJ/2sGC6gzY48WQHQv5RUx8gBIYby\
|
|
oEMXkNhYgO55pt96xcvxYfVlpAZJ1cN7v75vPJ1Isvc34QCIuqkUwCT3dnesNwBqaN7g3hvPIwCF\
|
|
QO7Lc2JalK0LwNcfG/15O3tfRn3rRpoCsCGtIImfP3pgtfLJblJDg90XmhZoUSZxtlk/xjutaAPg\
|
|
raj234gA8C/Pz9JgbTVPXHht7E45IMANnH7CqdTs4UGkMYDrsVysoc8e60O8fML84p0z009aCf4Z\
|
|
3etjBZ9jgq3rzFuDYbyNnTL68yIsD+7Eyf9NCkCswUBawmt6Ge9LpkWFgz+rm3SyDs3OmBYB0x1X\
|
|
hE6rEWXxj3EB4A8RywXQxh6Tymx0STCCHyIwqMf+htnB3wgOYC3u7zR5KnA9zptph5Qpvm9ubbXH\
|
|
CZrbR/BnQwTeesVYXdIaflPOlTYHhUwp6ibO5zQmAPxhIosAqZ8JF0CFWH7qu+YazLmXkPNnbUzg\
|
|
wmtGVg5S8C889ZtGPhbtDAzJhonfa/pegFiW5M+e+d3YimriZ/h4O/gw2p85aGpw+k0zqwb/6Onz\
|
|
Xu8dB9oRGDJlpdy/KU4A2AXU4igqbemNGsAU/CYPWkhiMQlIB1onYGp68EfPLkQec6I0ohzeRayY\
|
|
KgcbNwORC4g8MkkFufbiD0OpKtn+v3rhj03uqz48mgtkWAQMuQC/4woTyPQe6rDoCUnd5N0chYOD\
|
|
g3BvKBTGfs/OxdpV/bIa98PRCsHmZz8dukaaxILy/bcND/oRlCci988+jxrvGD1tiFYH3vz0ttdm\
|
|
B23uoc7q+16v/90oTpc61vlJBGDSuLYiACwCd5XBuwN6lwvTHKy1I8BmpryDJ0D2oVOG9v7rQys/\
|
|
m5b2Blf3PTN1Ku7ioTUd/Fcn+cZJ43raYtlW9WPsdA5LhygOtobo+XODzTTP8PF07UmDP+0xgK7V\
|
|
6Y5SNlxsFJjzzw8O1XXVigAm8KE7aBQgry7AEDVT036JCgAvEa6iiQEQ3forA0t+03IA/qlBDdRj\
|
|
91os72jr//6F99BtOGAy6Dhwv9y8o8Hzc8dgNe6Gn1FMJ/VH6GdO5fhGYWq4e+/8fKD9PPF7r+O4\
|
|
8GGi+eArtbt9p2+qbm/mQ6/cMr5Ww5r1T8wBBFKBJWeKfXcvkeAnyAU8+pd3EelDHBOVzcB5eu0A\
|
|
dun/Gbg+jK4zFwid9LNi+5cUk/pr+OSgFSca3oOHRhvxsOAP9nJSb7xJk73//Gis1Y89h69/vsBr\
|
|
xxLrMItJ/lVaBGifQF28Xf/I3HmCdLfdRN8HAegvk3vj68G7YjxGANPNxAJZMrncV4wAMOQCRJ8h\
|
|
SD2ysV5h9zEiOUpghhggjWPhJxXoJOPDdt6fqgDweMCCEr4+YP/9X5n5QScwuBepYYZYi1E4FXFJ\
|
|
uLb/j+89kPRn19klq8wKgCsisPfux0ammuga8Im+D8uPjzMzNdEIPy3ainr09+Of3Zc0ndjUcZH4\
|
|
mpliWn8tDwrKXSREvcPP4t/84l9xPa4R43KRfrzzGMZMj0Y9s8EbnH33Yyl/KsVCKrNkxTT/al4k\
|
|
JFYEaPTexDQTNdJhAe6dXf+DNxDtQ8pm6BoJupItxs3Lk8wwJBj8CzYX+4wsY1vbgcOwc7FW0S/r\
|
|
UhuhF6AGFuqQmOzf66j9+595zqCgG6+N8+ozB7mx9z85HBgs+uUWsU5sbgEOSYeD3/igeOrnAWRJ\
|
|
BCg/9w6SBM5DIrIrY+GVteAPIwBFKRWjC6IuNR2g+ei9f7+L6HEcb1nxv76X+eB3ZgzAJREgCwoR\
|
|
cDv4vSXX6ef9YoJfnABABIAt2y8k+Cnoz0oJfpECEBCBJSVwnQCJwKOb/5On7ahOQwN+u3KCP7XR\
|
|
fqcEgEWApghFLhYiO/n15m3s55cM7RbcviNltL8uMfgJMbMAw9i5WCvplxuqe56AOGh+37tlBvv5\
|
|
RVl+StWE7PKrJbGtt6+Tcm0acIwI0HpamiJclNjgvKumYixKAeZ6ferxBW2trnI6qyAAZoTgqjJw\
|
|
4Yi1fEoLAAlB1LXpIEauT4euGNq/YYDUR/ozKQAsAovsBmalNkZapTZ17kUIQRKBT2cFvvMLSYd6\
|
|
NFV3P3+q+X5mBcCFcQEIgX2rT9t4hQU+sWbj8g4IwHAhuKZflqW3V2/tOt1Giy2/8Rq1DnY6p0GQ\
|
|
1Q9a/qUkD/KAAByJQJlTgpL0BuxtDX71WVX8zjNwBSFtPp3csy/r8A4fb0ertCm+3AgAiwCNB6y6\
|
|
4AYOy5HOANApAh0YAjHoh4Kdgt47sUfmoqsOB77IOy9yJQAuuoE+Mfj2aZ0izOb3WjLO6w/ufy45\
|
|
6EX3+rkXAFfdwDFmprzbiemsABo7yKw70AFOJ/LSoh3vZF8DB68kQFt1D+0Uf9NVbgUgIAQ0Q0CD\
|
|
hGWnA4XOxnvuW6p45glVeO6p7mGZDq469I/vph5+n05ddiPgg9D9fDXJvT4EYLAQVFgIZlVWIFGg\
|
|
wzD5QEzv9dRM+m6BenUK7N0973KV/Z3u8eoOBnuQJtv99jEr8LdNak/l0o/LGANwQARmOSW4kikh\
|
|
GCEORPH5bx3V23P9y5THLV327kfoycW9YOa7Dg6++Lob4HS7jttBPszuVwdN7engr3CaWdLPvBaB\
|
|
FgTADSEoccVVFADDA39t0Br+nsA/dAhaABYgABAC4DaU218flOfrwC9zeykPee+CFoEmBABCAPIV\
|
|
+GJdAAQAQgAmsPr6acQI/CCixgIgAP35Gw0CtkZZNRYCEoHsDxbmFwrS60Ny/CiB71PXbasKAZAr\
|
|
AA84qEkANnRl1UcIAX3fouof8AHuQvW9MWRUP07gB1OJs7pddSAAMgXgYJgFHFVpvLz4MtIDZ23+\
|
|
hureutse0CZ8t2dqW3l1VMcCAZAlAEHlpkq7riuvPYErMNlgQPK9vb8m5LIFd0edyRIEwC0BOFaB\
|
|
LATNUd/EYwVXWBCQIsiA6m5TDRjU4/qf4zqz6eQ6uu2chgDIC36y8VshrePY9IDFYI57E4iBvKCf\
|
|
VUeDuknVjYjZAAhAv/rfiqLoAVcwtlJZDPwxA6QJFnpY1R3EHRr0XN+LAVFOGhHjABCAaCnAKLzp\
|
|
o0lcQc+YwQUWBbiD6OXuBf2oI7dY5P3B2jSncNd0+7gKAcieAAy0npNO+wTcwQV2BxCE0QG/Ta+j\
|
|
tt8Ggl5S+gUByIEABPEbayNM7scDiSQI51kQyjkM9jYH/G0O9uYE9VjigJeaZkEAhArA3QR6CT9H\
|
|
9Rp02A0i7BJ8d3CBX7PiFJoc8B/w162wh2voOtxyQCidEoDpnPU2toPJz/u9VYS6wQYdQotFYWij\
|
|
55tkWgOEocw/m8ThaX6dFdYDdgKffTvw3+1Bi3Aisp1Tp2SNPDkAKXcItAMuoWViGykLhE/w698Y\
|
|
IXqDBKQ5JvgGBbvJAJfi5OLg1CxAnhzAB0I+BzXeSqBB+4G3qRtOLcoP7MmdmxmvR9pwsyX487Vc\
|
|
KsxijgRAcmD4Fh+MU8+uY6oJ/XhticeDQQC6DafF1hUC5X5drgjtaTdcK8tiztpOQ3CjhgCEY0mY\
|
|
oHcEOxMIALOJ3j8zLqCtXxYEicCalLMAIADDG01DaBqwiZCOnNatSHCWUQdwIQDJcx2pSaZEoK66\
|
|
MwNp0Ur590MAQlIT5gJaow4iAROLwHwK9Uqp24KL1j+3AsCVJckFXEcIG0sHFlRyswM1Ogrc5eDP\
|
|
qwPwXYCEXrcD+29FBGzm4y3u9VeyUGa5vRcgwilBNhCxcSSLGDrp99iP5Pqqu/D3YzfgZI3kKjeS\
|
|
tHr/s65bSEeEwD+/MQrk0Dak3gIMAYjfQNZVOkd+V13pTTJSzyV2A5dUdz/GsJ2UTbb53oEkrgo0\
|
|
BEC2CIg5Phpkk0njuoii8gaPaB43qd6YcskqSh1IAAJwXASqyu5cMv3sJeT9AAIgUwTIBdCCEhsD\
|
|
PtTzL7i2XRRkG4wBDB8XKCtz00gkKFX0/EDaGAAEYLwQlFT0a8Cot19zbQoJQAAgAIPFwD+++zyL\
|
|
QXlAju9PITVg90HmBAAAkB0wCAgABAAAAAEAAEAAAAAQAAAABAAAAAEAAEAAAAAQAAAABAAAAAEA\
|
|
AEAAAAAQAAAABAAAAAEAAEAAAAAQAAAABAAAAAEAAEAAAAAQAAAABAAAAAEAAEAAAAD2+H8BBgCz\
|
|
4xkvbY9d6gAAAABJRU5ErkJggg=="
|
|
local heart_png =
|
|
"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
|
|
bWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
|
|
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
|
|
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
|
|
NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
|
|
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
|
|
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv\
|
|
IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS\
|
|
ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD\
|
|
cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlE\
|
|
PSJ4bXAuaWlkOjk3NUYxN0NGOUQ5RDExRTA5MTgyQjc4MkNEQkY5RkI1IiB4bXBNTTpEb2N1bWVu\
|
|
dElEPSJ4bXAuZGlkOjk3NUYxN0QwOUQ5RDExRTA5MTgyQjc4MkNEQkY5RkI1Ij4gPHhtcE1NOkRl\
|
|
cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTc1RjE3Q0Q5RDlEMTFFMDkxODJC\
|
|
NzgyQ0RCRjlGQjUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTc1RjE3Q0U5RDlEMTFFMDkx\
|
|
ODJCNzgyQ0RCRjlGQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1l\
|
|
dGE+IDw/eHBhY2tldCBlbmQ9InIiPz7MtgYTAAACd0lEQVR42uyajW2CUBDHH8YBWKBJR8AJChvY\
|
|
AZriBNYJrBOIE9imA6gTyAZlg9p0ATaw99IzfSEgvI9DlLvk5UUUuPu9/71PvePxKPpsA9FzYwAM\
|
|
gAEwAAbAABgAA2AADIABMAAG0EcbmtzkeV7p9Z+nVQhViB8PUNK7j+nBxkF4ZgzVHMp9ydeZfAeU\
|
|
d3hPVnZ/3X6HZ7IhUgQATgZQraEEJT+XDi7AwVQzcB+qjQK0zuTzJ0Xg5ACw1aWjfs1tCTg30wh+\
|
|
XwH0nOVQIlUNpACw5fcNglclKx3MCYJXIYxOSqiLb2CRm75m8AKD+kJwVba2CF6gP+s2RoGlZvCq\
|
|
g/syCHDtFaqxg849hGeNyQDAw2WPHFu20gZVpKbT3OEI90ypgKkDB+9RCScIG8dDfCMFDE0l5shJ\
|
|
2epLgPBdMc5bGaoqowAQOPQzFnTmU6XAVViTydctA2g0Bb9lAGnfAewoAaQdDz6H/N9SAth1HMCK\
|
|
eiq87XLry5UnKQBcaXUVwurcatNlJzi79ta3AoAqSDoGYKHT+tYbIjjf/nQ8NTa1DIIfFS+SbYgo\
|
|
9ojSu7RNTG6yBoCpEF0YwqJqV5g8BQpLT90tMjLpt5kCJyVkqIRDi8HnptInWQsghFHdJoRDm5lK\
|
|
n2wxhMOQVMIbcfDynMH6Hc76gDKDfuFF/O0eO1/qQvBRkx+21gdUqCHBlHDZL2Q49Dox8v0ApV9I\
|
|
HAUf6c72LpYCJSkRYkoEbQXfyumwAYhYVB95O235TgIogJjWKCKVOW8q+04DKMwi5UnOg/g/dMlx\
|
|
imvVd5AAuCXjP0kxAAbAABgAA2AADIABMAAGwAB6ab8CDACjlPepVvE3rwAAAABJRU5ErkJggg=="
|
|
|
|
local hearts = {}
|
|
local rings = {}
|
|
|
|
local cx = 400
|
|
local cy = 300
|
|
|
|
local pig
|
|
local heart_image
|
|
|
|
local function add_heart_ring(radius, number, speed)
|
|
local step = math.pi*2/number
|
|
for i = 1,number do
|
|
local heart = {
|
|
radius = radius,
|
|
position = step*i,
|
|
speed = speed,
|
|
opacity = radius/450
|
|
}
|
|
table.insert(hearts, heart)
|
|
end
|
|
table.insert(rings, radius)
|
|
end
|
|
|
|
local function update_hearts(dt)
|
|
for i,v in ipairs(hearts) do
|
|
v.position = v.position + v.speed*dt*0.6
|
|
end
|
|
end
|
|
|
|
local function draw_hearts()
|
|
for i,v in ipairs(hearts) do
|
|
local x = math.cos(v.position) * v.radius + cx
|
|
local y = math.sin(v.position) * v.radius + cy
|
|
love.graphics.setColor(255, 255, 255, v.opacity*255)
|
|
love.graphics.draw(heart_image, x, y, v.position+0.4, 1, 1, 32, 32)
|
|
end
|
|
end
|
|
|
|
local function draw_pig(p)
|
|
love.graphics.setColor(255, 255, 255, 255)
|
|
love.graphics.draw(p.img, p.x, p.y, 0, 1, 1, 128, 128)
|
|
end
|
|
|
|
local function loadimage(file, name)
|
|
return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64")))
|
|
end
|
|
|
|
function love.load()
|
|
math.randomseed(os.time())
|
|
pig = {
|
|
x = cx,
|
|
y = cy,
|
|
img = loadimage(pig_png, "pig.png")
|
|
}
|
|
heart_image = loadimage(heart_png, "heart.png")
|
|
|
|
add_heart_ring(100, 10, 2.4)
|
|
add_heart_ring(150, 20, 2.2)
|
|
add_heart_ring(200, 25, 2.0)
|
|
add_heart_ring(250, 35, 1.8)
|
|
add_heart_ring(300, 40, 1.6)
|
|
add_heart_ring(350, 50, 1.4)
|
|
add_heart_ring(400, 60, 1.2)
|
|
add_heart_ring(450, 70, 1)
|
|
end
|
|
|
|
function love.update(dt)
|
|
update_hearts(dt)
|
|
end
|
|
|
|
function love.draw()
|
|
love.graphics.setBackgroundColor(254, 224, 238)
|
|
draw_hearts()
|
|
draw_pig(pig)
|
|
end
|
|
|
|
function love.keyreleased(key)
|
|
if key == "escape" then
|
|
love.event.quit()
|
|
end
|
|
end
|
|
|
|
function love.conf(t)
|
|
t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")"
|
|
t.modules.audio = false
|
|
t.modules.sound = false
|
|
t.modules.physics = false
|
|
t.modules.joystick = false
|
|
end
|
|
end
|
|
|
|
-----------------------------------------------------------
|
|
-- Error screen.
|
|
-----------------------------------------------------------
|
|
|
|
local debug = debug
|
|
|
|
local function error_printer(msg, layer)
|
|
print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
|
|
end
|
|
|
|
function love.errhand(msg)
|
|
msg = tostring(msg)
|
|
|
|
error_printer(msg, 2)
|
|
|
|
if not love.graphics or not love.event or not love.graphics.isCreated() then
|
|
return
|
|
end
|
|
|
|
-- Load.
|
|
if love.audio then love.audio.stop() end
|
|
love.graphics.reset()
|
|
love.graphics.setBackgroundColor(89, 157, 220)
|
|
local font = love.graphics.newFont(14)
|
|
love.graphics.setFont(font)
|
|
|
|
love.graphics.setColor(255, 255, 255, 255)
|
|
|
|
local trace = debug.traceback()
|
|
|
|
love.graphics.clear()
|
|
|
|
local err = {}
|
|
|
|
table.insert(err, "Error\n")
|
|
table.insert(err, msg.."\n\n")
|
|
|
|
for l in string.gmatch(trace, "(.-)\n") do
|
|
if not string.match(l, "boot.lua") then
|
|
l = string.gsub(l, "stack traceback:", "Traceback\n")
|
|
table.insert(err, l)
|
|
end
|
|
end
|
|
|
|
local p = table.concat(err, "\n")
|
|
|
|
p = string.gsub(p, "\t", "")
|
|
p = string.gsub(p, "%[string \"(.-)\"%]", "%1")
|
|
|
|
local function draw()
|
|
love.graphics.clear()
|
|
love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
|
|
love.graphics.present()
|
|
end
|
|
|
|
draw()
|
|
|
|
local e, a, b, c
|
|
while true do
|
|
e, a, b, c = love.event.wait()
|
|
|
|
if e == "quit" then
|
|
return
|
|
end
|
|
if e == "keypressed" and a == "escape" then
|
|
return
|
|
end
|
|
|
|
draw()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function love.releaseerrhand(msg)
|
|
print("An error has occured, the game has been stopped.")
|
|
|
|
if not love.graphics or not love.event or not love.graphics.isCreated() then
|
|
return
|
|
end
|
|
|
|
love.graphics.setCanvas()
|
|
love.graphics.setPixelEffect()
|
|
|
|
-- Load.
|
|
if love.audio then love.audio.stop() end
|
|
love.graphics.reset()
|
|
love.graphics.setBackgroundColor(89, 157, 220)
|
|
local font = love.graphics.newFont(14)
|
|
love.graphics.setFont(font)
|
|
|
|
love.graphics.setColor(255, 255, 255, 255)
|
|
|
|
love.graphics.clear()
|
|
|
|
local err = {}
|
|
|
|
p = string.format("An error has occured that caused %s to stop.\nYou can notify %s about this%s.", love._release.title or "this game", love._release.author or "the author", love._release.url and " at " .. love._release.url or "")
|
|
|
|
local function draw()
|
|
love.graphics.clear()
|
|
love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
|
|
love.graphics.present()
|
|
end
|
|
|
|
draw()
|
|
|
|
local e, a, b, c
|
|
while true do
|
|
e, a, b, c = love.event.wait()
|
|
|
|
if e == "quit" then
|
|
return
|
|
end
|
|
if e == "keypressed" and a == "escape" then
|
|
return
|
|
end
|
|
|
|
draw()
|
|
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------------------------
|
|
-- The root of all calls.
|
|
-----------------------------------------------------------
|
|
|
|
local result = xpcall(love.boot, error_printer)
|
|
if not result then return end
|
|
local result = xpcall(love.init, love._release and love.releaseerrhand or love.errhand)
|
|
if not result then return end
|
|
local result = xpcall(love.run, love._release and love.releaseerrhand or love.errhand)
|
|
if not result then return end
|