@@ -0,0 +1,94 @@ | |||
--[[ | |||
Copyright (c) 2010-2013 Matthias Richter | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
Except as contained in this notice, the name(s) of the above copyright holders | |||
shall not be used in advertising or otherwise to promote the sale, use or | |||
other dealings in this Software without prior written authorization. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]]-- | |||
local function include_helper(to, from, seen) | |||
if from == nil then | |||
return to | |||
elseif type(from) ~= 'table' then | |||
return from | |||
elseif seen[from] then | |||
return seen[from] | |||
end | |||
seen[from] = to | |||
for k,v in pairs(from) do | |||
k = include_helper({}, k, seen) -- keys might also be tables | |||
if to[k] == nil then | |||
to[k] = include_helper({}, v, seen) | |||
end | |||
end | |||
return to | |||
end | |||
-- deeply copies `other' into `class'. keys in `other' that are already | |||
-- defined in `class' are omitted | |||
local function include(class, other) | |||
return include_helper(class, other, {}) | |||
end | |||
-- returns a deep copy of `other' | |||
local function clone(other) | |||
return setmetatable(include({}, other), getmetatable(other)) | |||
end | |||
local function new(class) | |||
-- mixins | |||
class = class or {} -- class can be nil | |||
local inc = class.__includes or {} | |||
if getmetatable(inc) then inc = {inc} end | |||
for _, other in ipairs(inc) do | |||
if type(other) == "string" then | |||
other = _G[other] | |||
end | |||
include(class, other) | |||
end | |||
-- class implementation | |||
class.__index = class | |||
class.init = class.init or class[1] or function() end | |||
class.include = class.include or include | |||
class.clone = class.clone or clone | |||
-- constructor call | |||
return setmetatable(class, {__call = function(c, ...) | |||
local o = setmetatable({}, c) | |||
o:init(...) | |||
return o | |||
end}) | |||
end | |||
-- interface for cross class-system compatibility (see https://github.com/bartbes/Class-Commons). | |||
if class_commons ~= false and not common then | |||
common = {} | |||
function common.class(name, prototype, parent) | |||
return new{__includes = {prototype, parent}} | |||
end | |||
function common.instance(class, ...) | |||
return class(...) | |||
end | |||
end | |||
-- the module | |||
return setmetatable({new = new, include = include, clone = clone}, | |||
{__call = function(_,...) return new(...) end}) |
@@ -0,0 +1,6 @@ | |||
rm game.love | |||
rm game.zip | |||
zip -r game * | |||
mv game.zip game.love | |||
love game.love | |||
rm game.love |
@@ -0,0 +1,24 @@ | |||
edible = Class{} | |||
function edible:init( y , x , fat ) | |||
self.RED = 255 | |||
self.GREEN = 255 | |||
self.BLUE = 255 | |||
self.x = x | |||
self.y = y | |||
self.width = fat | |||
self.height = fat | |||
self.fat = fat | |||
self.dead = false | |||
end | |||
function edible:update(dt) | |||
end | |||
function edible:render() | |||
love.graphics.setColor(self.fat*20/200, 0, 0, 1) | |||
love.graphics.circle('line', self.x, self.y, self.fat) | |||
love.graphics.setColor(255, 255, 255, 255) | |||
end |
@@ -0,0 +1,111 @@ | |||
life = Class{} | |||
function life:init( y , x , fat ) | |||
self.RED = 255 | |||
self.GREEN = 255 | |||
self.BLUE = 255 | |||
self.x = x | |||
self.y = y | |||
self.width = fat | |||
self.height = fat | |||
self.fat = fat | |||
self.dead = false | |||
self.multiplycounter = 1 | |||
self.closest = 999999 | |||
end | |||
function life:update(dt) | |||
if not self.dead then | |||
if self.fat - self.width < -self.width*0.3 then | |||
self.dead = true | |||
end | |||
self.fat = self.fat - self.width*0.0001*dt | |||
if not self:checkIfEating() then | |||
self:lookForFood(dt) | |||
end | |||
if self.width > 30 then | |||
table.insert(bugs, life(self.y+self.width, self.x+self.width, self.fat/2)) | |||
self.width = self.width/2 | |||
self.fat = self.fat/2 | |||
end | |||
end | |||
print(self.fat) | |||
end | |||
function life:lookForFood(dt) | |||
self.closest = 9000000 | |||
local sx, sy = self.x, self.y | |||
print("looking for food...") | |||
for i, food in ipairs(edibles) do | |||
if math.sqrt((self.x - food.x)^2 + (self.y-food.y)^2) < self.closest then | |||
self.closest = math.sqrt((self.x - food.x)^2 + (self.y-food.y)^2) | |||
sx, sy = food.x, food.y | |||
print("going to " .. i) | |||
end | |||
end | |||
self:goTo(sx, sy, dt) | |||
end | |||
function life:goTo(x, y, dt) | |||
self.speed = (10 + self.fat * 0.5 ) | |||
if (x-self.x) ~= 0 then | |||
self.m = (y-self.y)/(x-self.x) | |||
if y-self.y > 0 then | |||
self.m = math.abs(self.m) | |||
elseif y-self.y < 0 and self.m > 0 then | |||
self.m = -self.m | |||
end | |||
else | |||
if y-self.y > 0 then | |||
self.m = 1 | |||
elseif y-self.y < 0 then | |||
self.m = -1 | |||
else | |||
self.m = 0 | |||
end | |||
end | |||
if self.m > 1 or self.m < -1 then | |||
self.speed = math.abs(self.speed / (self.m)) | |||
end | |||
if (self.x < x) then | |||
self.x = self.x + self.speed * dt | |||
self.y = self.y + (self.speed* self.m * dt ) | |||
print("go right" .. self.fat ..x .. " " ..y ) | |||
elseif self.x > x then | |||
self.x = self.x - self.speed* dt | |||
self.y = self.y + (self.speed* self.m * dt ) | |||
print("go left" .. self.fat ..x .. " " ..y) | |||
else | |||
self.y = self.y + (self.speed* self.m * dt ) | |||
print("go vertical" .. self.fat ..x .. " " ..y) | |||
end | |||
--if (self.y < y) then | |||
-- self.y = self.y + (10 * dt + self.fat * 0.5 * dt) | |||
-- print("go down" .. self.fat) | |||
--elseif self.y > y then | |||
-- print("go up" .. self.fat) | |||
-- self.y = self.y - (10 * dt + self.fat * 0.5 * dt) | |||
--end | |||
self.fat = self.fat - self.fat * self.width * 0.0003 * dt | |||
print(self.m .. " " .. self.speed * self.m) | |||
print((self.speed* self.m * dt )) | |||
end | |||
function life:checkIfEating() | |||
for i, food in ipairs(edibles) do | |||
if math.abs(self.x - food.x) < 10 and math.abs(self.y-food.y) < 10 then | |||
self.fat = self.fat + food.fat | |||
self.width = self.width + food.fat/2 | |||
table.remove(edibles, i) | |||
print("yum") | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
function life:render() | |||
love.graphics.setColor(self.RED, self.GREEN, self.BLUE, self.fat*20/200) | |||
love.graphics.circle('fill', self.x, self.y, self.width) | |||
love.graphics.setColor(255, 255, 255, 255) | |||
end |
@@ -0,0 +1,50 @@ | |||
VIRTUAL_WIDTH = 1280 | |||
VIRTUAL_HEIGHT = 720 | |||
WINDOW_WIDTH = 1280 | |||
WINDOW_HEIGHT = 720 | |||
Class = require 'class' | |||
require 'simpleScale' | |||
require 'life' | |||
require 'edible' | |||
bugs = {} | |||
edibles = {} | |||
function love.load() | |||
math.randomseed(os.time()) | |||
smallfont = love.graphics.newFont("font.ttf", 25) | |||
love.keyboard.setKeyRepeat(true) | |||
simpleScale.setWindow(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT) | |||
table.insert(bugs, life(VIRTUAL_HEIGHT/2, VIRTUAL_WIDTH/2, 10)) | |||
table.insert(edibles, edible(20, VIRTUAL_WIDTH/2+5, 4)) | |||
end | |||
function love.update(dt) | |||
love.window.setTitle(#bugs) | |||
for i, bug in ipairs(bugs) do | |||
bug:update(dt) | |||
end | |||
regulator() | |||
end | |||
function regulator() | |||
for i, bug in ipairs(bugs) do | |||
if bug.dead then | |||
table.insert(edibles, edible(bug.y, bug.x, bug.fat)) | |||
table.remove(bugs, i) | |||
end | |||
end | |||
if #edibles < #bugs/3 then | |||
table.insert(edibles, edible(math.random(0, VIRTUAL_HEIGHT), math.random(0, VIRTUAL_WIDTH), 10)) | |||
end | |||
end | |||
function love.draw() | |||
simpleScale.set() | |||
love.graphics.clear(0,0,0,1) | |||
for i, bug in ipairs(bugs) do | |||
bug:render(dt) | |||
end | |||
for i, edible in ipairs(edibles) do | |||
edible:render(dt) | |||
end | |||
love.graphics.setColor(1,1,1,1) | |||
love.graphics.setFont(smallfont) | |||
simpleScale.unSet() | |||
end |
@@ -0,0 +1,7 @@ | |||
# Kinda Life. | |||
This is not a game, just a simulation I made because I had nothing better to do. Run in Lua, I guess you could use | |||
``` | |||
./debuggame.sh | |||
``` | |||
Although idk |
@@ -0,0 +1,123 @@ | |||
simpleScale = {} | |||
--Your Game's Aspect Ratio | |||
local gAspectRatio | |||
--The Window's Aspect Ratio | |||
local wAspectRatio | |||
--The scale between the game and the window's aspect ratio | |||
simpleScale.scale = 1 | |||
local xt, yt = 0, 0, 1 | |||
local gameW, gameH, windowW, windowH = 800, 600, 800, 600 | |||
-- Declares your game's width and height, and sets the window size/settings | |||
-- To be used instead of love.window.setMode | |||
-- [gw] and [gh] are the width and height of the initial game | |||
-- [sw] and [sh] (optional) are the width and height of the final window | |||
-- [settings] (optional) are settings for love.window.setMode | |||
function simpleScale.setWindow(gw, gh, sw, sh, settings) | |||
sw = sw or gw | |||
sh = sh or gh | |||
gAspectRatio = gw/gh | |||
gameW = gw | |||
gameH = gh | |||
simpleScale.updateWindow(sw, sh, settings) | |||
end | |||
-- Updates the Window size/settings | |||
-- To be used instead of love.window.setMode | |||
-- [sw] and [sh] are the width and height of the new Window | |||
-- [settings] (optional) are settings for love.window.setMode | |||
function simpleScale.updateWindow(sw, sh, settings) | |||
love.window.setMode(sw, sh, settings) | |||
windowW, windowH = love.graphics.getWidth(), love.graphics.getHeight() | |||
wAspectRatio = windowW/windowH | |||
--Window aspect ratio is TALLER than game | |||
if gAspectRatio > wAspectRatio then | |||
scale = windowW/gameW | |||
xt = 0 | |||
yt = windowH/2 - (scale*gameH)/2 | |||
--Window aspect ratio is WIDER than game | |||
elseif gAspectRatio < wAspectRatio then | |||
scale = windowH/gameH | |||
xt = windowW/2 - (scale*gameW)/2 | |||
yt = 0 | |||
--Window and game aspect ratios are EQUAL | |||
else | |||
scale = windowW/gameW | |||
xt = 0 | |||
yt = 0 | |||
end | |||
simpleScale.scale = scale | |||
end | |||
-- If you screen is resizable on drag, you'll need to call this to make sure | |||
-- the appropriate screen values stay updated | |||
-- You can call it on love.update() with no trouble | |||
function simpleScale.resizeUpdate() | |||
windowW, windowH = love.graphics.getWidth(), love.graphics.getHeight() | |||
wAspectRatio = windowW/windowH | |||
--Window aspect ratio is TALLER than game | |||
if gAspectRatio > wAspectRatio then | |||
scale = windowW/gameW | |||
xt = 0 | |||
yt = windowH/2 - (scale*gameH)/2 | |||
--Window aspect ratio is WIDER than game | |||
elseif gAspectRatio < wAspectRatio then | |||
scale = windowH/gameH | |||
xt = windowW/2 - (scale*gameW)/2 | |||
yt = 0 | |||
--Window and game aspect ratios are EQUAL | |||
else | |||
scale = windowW/gameW | |||
xt = 0 | |||
yt = 0 | |||
end | |||
simpleScale.scale = scale | |||
end | |||
-- Transforms the game's window relative to the entire window | |||
-- Call this at the beginning of love.draw() | |||
function simpleScale.set() | |||
love.graphics.push() | |||
love.graphics.translate(xt, yt) | |||
love.graphics.scale(scale, scale) | |||
end | |||
-- Untransforms the game's window | |||
-- Call this at the end of love.draw | |||
-- You can optionally make the letterboxes a specific color by passing | |||
-- [color] (optional) a table of color values | |||
function simpleScale.unSet(color) | |||
love.graphics.scale(1/scale, 1/scale) | |||
love.graphics.translate(-xt, -yt) | |||
love.graphics.pop() | |||
--Draw the Letterboxes | |||
local r,g,b,a = love.graphics.getColor() | |||
local originalColor = love.graphics.getColor() | |||
local boxColor | |||
if color == nil then | |||
boxColor = {0,0,0} | |||
else | |||
boxColor = color | |||
end | |||
love.graphics.setColor(boxColor) | |||
--Horizontal bars | |||
if gAspectRatio > wAspectRatio then | |||
love.graphics.rectangle("fill", 0, 0, windowW, math.abs((gameH*scale - (windowH))/2)) | |||
love.graphics.rectangle("fill", 0, windowH, windowW, -math.abs((gameH*scale - (windowH))/2)) | |||
--Vertical bars | |||
elseif gAspectRatio < wAspectRatio then | |||
love.graphics.rectangle("fill", 0, 0, math.abs((gameW*scale - (windowW))/2),windowH) | |||
love.graphics.rectangle("fill", windowW, 0, -math.abs((gameW*scale - (windowW))/2),windowH) | |||
end | |||
love.graphics.setColor(r,g,b,a) | |||
end |