Initial commit

This commit is contained in:
shylie 2025-07-17 19:09:00 -04:00
commit 53c2840d1f
5 changed files with 150 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "zprite"]
path = zprite
url = https://git.shylie.info/shylie/zprite.git

20
LICENSE Normal file
View File

@ -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.

BIN
circle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

126
main.lua Normal file
View File

@ -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

1
zprite Submodule

@ -0,0 +1 @@
Subproject commit 6eba579c969700428afdfe4d67c670d5400405ae