commit 53c2840d1f15a28d6973317d182dd7acd0147391 Author: shylie Date: Thu Jul 17 19:09:00 2025 -0400 Initial commit diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7b7d87f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "zprite"] + path = zprite + url = https://git.shylie.info/shylie/zprite.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..53dde2b --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2025 shylie + +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. diff --git a/circle.png b/circle.png new file mode 100644 index 0000000..ed34f11 Binary files /dev/null and b/circle.png differ diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..2335d72 --- /dev/null +++ b/main.lua @@ -0,0 +1,126 @@ +local tex = love.graphics.newImage("circle.png") +tex:setFilter("nearest", "nearest") + +local function water_color(layer) + local value = layer / 24 + return value / 4, value / 2, value +end + +local function dirt_color(layer) + if layer < 32 then + return layer / 40 / 2.5, layer / 80 / 2.5, 0.1 + else + return 0.05, (layer - 32) / 36 + 0.3, 0.05 + end +end + +local function mountain_color(layer) + if layer < 58 then + local value = layer / 64 / 2.5 + return value, value, value + else + local value = (layer - 58) / 20 + 0.7 + return value, value, value + end +end + +local function pick_colorfn(maxlayer) + if maxlayer < 16 then + return water_color + elseif maxlayer < 46 then + return dirt_color + else + return mountain_color + end +end + +local function ease(n) + return 5 ^ (3.1 * (n ^ 0.3) - 3) + 1 - 1.1 ^ n +end + +local BIG_BLOCK = love.graphics.newQuad(0, 0, 8, 8, tex) + +local z = require("zprite").zchunk.new(tex, 128, 32) + +local function update_map() + z:clear() + for i = -160, 160 do + for j = -160, 160 do + local noise_value = love.math.simplexNoise(i * 0.008, j * 0.008) + local layers = ease(noise_value) * 64 + z:put(i * 8, j * 8, BIG_BLOCK, math.floor(layers) + 1, pick_colorfn(layers)) + coroutine.yield() + end + end +end +local co = coroutine.create(update_map) + +local x = 0 +local y = 0 +local angle = 0 +local scale = 1 + +function love.update(dt) + for _ = 1, 64 do + if coroutine.status(co) == "suspended" then + coroutine.resume(co) + end + end + + if love.keyboard.isDown("d") then + local dx = 256 * math.cos(-angle) + local dy = 256 * math.sin(-angle) + x = x - dx * dt + y = y - dy * dt + end + if love.keyboard.isDown("a") then + local dx = 256 * math.cos(-angle) + local dy = 256 * math.sin(-angle) + x = x + dx * dt + y = y + dy * dt + end + if love.keyboard.isDown("s") then + local dx = 256 * math.cos(-angle + math.pi / 2) + local dy = 256 * math.sin(-angle + math.pi / 2) + x = x - dx * dt + y = y - dy * dt + end + if love.keyboard.isDown("w") then + local dx = 256 * math.cos(-angle + math.pi / 2) + local dy = 256 * math.sin(-angle + math.pi / 2) + x = x + dx * dt + y = y + dy * dt + end + if love.keyboard.isDown("q") then + angle = angle + dt + end + if love.keyboard.isDown("e") then + angle = angle - dt + end + if love.keyboard.isDown("f") then + scale = scale - dt * 5 + if scale < 0.2 then + scale = 0.2 + end + end + if love.keyboard.isDown("r") then + scale = scale + dt * 5 + if scale > 5 then + scale = 5 + end + end +end + +local t = love.math.newTransform() + +function love.draw() + for _, chunk in pairs(z._chunks) do + chunk.z._height_scale = 12 * scale + end + t:reset() + t:translate(love.graphics.getWidth() / 2, love.graphics.getHeight() / 2) + t:scale(scale, scale) + t:rotate(angle) + t:translate(x, y) + z:draw(t) +end diff --git a/zprite b/zprite new file mode 160000 index 0000000..6eba579 --- /dev/null +++ b/zprite @@ -0,0 +1 @@ +Subproject commit 6eba579c969700428afdfe4d67c670d5400405ae