diff --git a/assets/sprites/footer/gif/mbuttond.gif-autosave.kra b/assets/sprites/footer/gif/mbuttond.gif-autosave.kra deleted file mode 100644 index ed72a69..0000000 Binary files a/assets/sprites/footer/gif/mbuttond.gif-autosave.kra and /dev/null differ diff --git a/assets/sprites/footer/gif/mbuttono.gif-autosave.kra b/assets/sprites/footer/gif/mbuttono.gif-autosave.kra deleted file mode 100644 index 75fdd5d..0000000 Binary files a/assets/sprites/footer/gif/mbuttono.gif-autosave.kra and /dev/null differ diff --git a/assets/sprites/footer/gif/mbuttonu.gif-autosave.kra b/assets/sprites/footer/gif/mbuttonu.gif-autosave.kra deleted file mode 100644 index 1a633cd..0000000 Binary files a/assets/sprites/footer/gif/mbuttonu.gif-autosave.kra and /dev/null differ diff --git a/assets/sprites/footer/gif/menubar.gif-autosave.kra b/assets/sprites/footer/gif/menubar.gif-autosave.kra deleted file mode 100644 index 644ebec..0000000 Binary files a/assets/sprites/footer/gif/menubar.gif-autosave.kra and /dev/null differ diff --git a/const.lua b/const.lua index d421890..7ebf39e 100644 --- a/const.lua +++ b/const.lua @@ -11,6 +11,7 @@ FISH_EASE = ease.inOutSine -- ease used for fish movement FISH_ANGLE = 30 -- bigger angle allows for fish to swim further down/up at once FISH_FOLLOW_RANDOM = 10 +FISH_FOOD_CHECK_FREQ = 10 -- how often to check for food FISH_FOOD_COOLDOWN = 10 FISH_FOOD_HUNGRY = -5 FISH_FOOD_DEAD = -15 @@ -22,7 +23,7 @@ FISH_SIZE = 6 -- how many large guppies can you fit on the screen FOOTER_HEIGHT = 68 -FOOD_HITBOX = 0.05 +FOOD_HITBOX = 0.08 DEBUG_FISH_PATH_SUBDIVISIONS = 50 DEBUG_FISH_PREDICT_AMOUNT = 0.5 \ No newline at end of file diff --git a/constructors.lua b/constructors.lua index af8ed5c..e46f0af 100644 --- a/constructors.lua +++ b/constructors.lua @@ -8,6 +8,7 @@ function self.fish(x, y) y = y, size = 0, -- 0 for small, 1 for medium, 2 for big, 3 for king eattimer = 0 + math.random() * 2, -- starts out hungry, with a 2s delay + dead = false, lifetime = 0, @@ -26,6 +27,7 @@ function self.fish(x, y) yspeed = 0, eattimer = 1, hungry = 0, + deathanim = 0, } } @@ -50,8 +52,7 @@ function self.food(x, y, type) speed = 0.2, time = math.random(), deathtimer = 0, - type = 1, - goal = 0 -- assigns 0 as the fish so that hopefully the update loop replaces it with a valid, random one + type = 1 } return food diff --git a/main.lua b/main.lua index 3d8ab7a..1477773 100644 --- a/main.lua +++ b/main.lua @@ -52,7 +52,7 @@ function love.load() sheets.food1 = newAnimation(sprites['food/1'], sprites['food/1']:getWidth()/10, sprites['food/1']:getHeight()) - for i = 1, 10 do + for i = 1, 3 do table.insert(feesh, constr.fish(math.random(), math.random())) end end @@ -65,7 +65,6 @@ function love.update(dt) bench.startBenchmark('update') bench.startBenchmark('update_food') - local fishgoals = {} for i,f in ipairs(food) do f.y = f.y + dt * f.speed f.time = f.time + dt @@ -75,18 +74,8 @@ function love.update(dt) f.deathtimer = f.deathtimer + dt end - if f.goal == 0 or not f.goal then - for i,n in ipairs(feesh) do - if not fishgoals[i] and n.eattimer <= 0 then - f.goal = i - end - end - end - if f.deathtimer > 1 then table.remove(food, i) - else - fishgoals[f.goal] = i end end bench.stopBenchmark('update_food') @@ -120,26 +109,41 @@ function love.update(dt) local angle = math.random(-FISH_ANGLE, FISH_ANGLE) local str = math.random(70, 200)/200/4 - if n.eattimer < -15 then - str = str * 1.3 - end - if --[[love.mouse.isDown(1) or]] fishgoals[fi] then - local mx, my = love.mouse.getPosition() - mx = mx / love.graphics.getWidth() - my = my / love.graphics.getHeight() + if n.eattimer <= 0 and not n.dead then -- needs to follow something + local mx, my + if n.eattimer <= 0 then + if n.shortestfood and food[n.shortestfood] then + local f = food[n.shortestfood] + mx, my = f.x, f.y + elseif frame % FISH_FOOD_CHECK_FREQ == 0 then + local minfood = 0 + local mindist = 9e9 + + for i,f in ipairs(food) do + local dist = math.sqrt(math.pow(math.abs(f.x - n.render.x), 2) + math.pow(math.abs(f.y - n.render.y), 2)) + if dist < mindist then + mindist = dist + minfood = i + end + end + + if minfood ~= 0 then + n.shortestfood = minfood + end + end - if fishgoals[fi] and food[fishgoals[fi]] then - mx = food[fishgoals[fi]].x - my = food[fishgoals[fi]].y end - angle = math.deg(math.atan2(my - n.y, mx - n.x)) + math.random(-FISH_FOLLOW_RANDOM, FISH_FOLLOW_RANDOM) + if mx and my then + angle = math.deg(math.atan2(my - n.y, mx - n.x)) + math.random(-FISH_FOLLOW_RANDOM, FISH_FOLLOW_RANDOM) + str = math.random(70, 200)/200/8 + end end local x = math.cos(math.rad(angle)) * str local y = math.sin(math.rad(angle)) * str - if not (--[[love.mouse.isDown(1) or ]]fishgoals[fi]) then + if not ((n.shortestfood and food[n.shortestfood]) or n.dead) then x = x * math.sign(n.render.x - n.render.prevx) end @@ -155,6 +159,12 @@ function love.update(dt) end e.speed = 1 / (math.sqrt(math.pow(math.abs(e.x - e.fromx), 2) + math.pow(math.abs(e.y - e.fromy), 2))/2) / 15 + if n.eattimer < FISH_FOOD_HUNGRY or (n.shortestfood and food[n.shortestfood]) then + e.speed = e.speed * 1.3 + end + if n.dead then + e.speed = e.speed * 0.2 + end end end bench.stopBenchmark('update_fish_eases') @@ -180,16 +190,19 @@ function love.update(dt) n.render.x = clamp(n.render.x, 0.05, 0.95) n.render.y = clamp(n.render.y, 0.1, 0.85) + bench.stopBenchmark('update_fish_position') - if fishgoals[fi] and frame % FISH_COLISSION_CHECK_FREQ == 0 then - local f = food[fishgoals[fi]] + bench.startBenchmark('update_fish_colission') + if n.shortestfood and food[n.shortestfood] and frame % FISH_COLISSION_CHECK_FREQ == 0 then + local f = food[n.shortestfood] if f then local dist = math.abs(n.render.x - f.x) + math.abs(n.render.y - f.y) if dist < FOOD_HITBOX then - table.remove(food, fishgoals[fi]) + table.remove(food, n.shortestfood) n.eattimer = FISH_FOOD_COOLDOWN n.render.eattimer = 0 + n.shortestfood = -1 if n.lifetime > FISH_AGE_MEDIUM then n.size = 1 @@ -200,7 +213,7 @@ function love.update(dt) end end end - bench.stopBenchmark('update_fish_position') + bench.stopBenchmark('update_fish_colission') bench.startBenchmark('update_fish_render') if frame % FISH_RENDER_FREQ == 0 then @@ -249,12 +262,27 @@ function love.update(dt) n.render.swim = 0 end - n.render.turndir = math.sign(n.render.x - n.render.prevx) + if not n.dead then + n.render.turndir = math.sign(n.render.x - n.render.prevx) + end local m = n.eattimer < FISH_FOOD_HUNGRY and 1 or -1 n.render.hungry = clamp(n.render.hungry + dt * m * 3, 0, 1) - bench.stopBenchmark('update_fish_render') + + if n.eattimer <= FISH_FOOD_DEAD then + n.dead = true + + local timeSinceDead = math.abs(n.eattimer - FISH_FOOD_DEAD) + n.render.y = n.render.y + timeSinceDead/5 * math.min(timeSinceDead, 1) + n.render.y = clamp(n.render.y, 0, 0.85) + if n.render.y == 0.85 then + n.render.deathanim = n.render.deathanim + dt + if n.render.deathanim > 1 then + table.remove(feesh, fi) + end + end + end end bench.stopBenchmark('update_fish') bench.stopBenchmark('update') @@ -301,7 +329,7 @@ function love.draw() -- shadow bench.startBenchmark('render_shadow') for i, n in ipairs(feesh) do - love.graphics.setColor(1, 1, 1, n.render.y + 0.2) + love.graphics.setColor(1, 1, 1, n.render.y + 0.2 - n.render.deathanim) love.graphics.draw(sprites['shadow'], n.render.x * sw - (sprites['shadow']:getWidth() * spritescale)/2, sh - sh * 0.18 - (sprites['shadow']:getHeight() * spritescale)/2 + n.render.y * sh * 0.08, 0, spritescale, spritescale) end bench.stopBenchmark('render_shadow') @@ -322,14 +350,14 @@ function love.draw() if n.render.turndir == -1 then turn = 1 - turn; sizex = -1 end local turnframe = math.floor(turn * (#sample.quads - 1)) + 1 - if #sample.quads == 10 then + if #sample.quads == turnframe then sizex = -1 * sizex turnframe = 1 end local frame = math.floor(n.render.swim * (#sample.quads - 1)) + 1 - if turnframe ~= 1 and turnframe ~= 10 then + if turnframe ~= 1 and turnframe ~= #sample.quads then anim = 'turn' frame = turnframe end @@ -339,6 +367,12 @@ function love.draw() frame = math.floor(n.render.eattimer * (#sample.quads - 1)) + 1 end + if n.dead then + anim = 'die' + local a = math.min(math.abs(n.eattimer - FISH_FOOD_DEAD) * 1.4, 1) - n.render.deathanim * 0.4 + frame = math.floor(a * (#sample.quads - 1)) + 1 + end + local angle = n.render.angle if angle > math.pi/2 then angle = angle - math.pi @@ -364,9 +398,9 @@ function love.draw() local sadsheet = fishsprite(size, true, anim) local alpha = n.render.hungry == 1 and 0 or 1 - love.graphics.setColor(1, 1, 1, alpha) + love.graphics.setColor(1, 1, 1, alpha - n.render.deathanim) love.graphics.draw(sheet.spriteSheet, sheet.quads[math.max(math.min(frame, #sample.quads), 1)], x, y, angle, sizex * spritescale, spritescale, sample.width/2, sample.height/2) - love.graphics.setColor(1, 1, 1, n.render.hungry) + love.graphics.setColor(1, 1, 1, n.render.hungry - n.render.deathanim) love.graphics.draw(sadsheet.spriteSheet, sheet.quads[math.max(math.min(frame, #sample.quads), 1)], x, y, angle, sizex * spritescale, spritescale, sample.width/2, sample.height/2) love.graphics.setColor(1, 1, 1)