extra display options, better controls, better map

This commit is contained in:
2025-11-05 02:24:37 -07:00
parent 880811262b
commit 4696a99095
3 changed files with 66 additions and 37 deletions

View File

@@ -10,10 +10,17 @@ to completely hide a node. `edges` is an array of arrays of two names of nodes.
An optional 3rd item can be set to `false` to hide an edge, or a string for a
custom label. `edges` can be nonexistent.
WASD panning and -/+ to zoom.
Pan with WASD or arrow keys.
Zoom with +/- keys.
`r` to reload the default map.
You can drag and drop a JSON file to load it.
Both nodes and edges can have an extra object with metadata, some of which is
used by this program. An array called `offset` will adjust the positioning of
labels. An array called `color` will set the color via 0 to 1 RGBA values
(node only).
## Example JSON
```json

View File

@@ -1,55 +1,68 @@
{
"nodes": {
"Second Farm": [-260, 67, -263, true],
"Second Farm": [-260, 67, -263, true, {"offset": [-40, 0], "color": [0, 1, 0, 1]}],
"tree farm north": [-164, 71, -267, false],
"Tree Farm": [-156, 68, -252, true],
"Tree Farm": [-156, 68, -252, true, {"color": [0, 0.75, 0, 1]}],
"farm paths diverge point": [-157, 71, -15, false],
"First Farm": [-146, 74, 10, true],
"First Farm": [-146, 74, 10, true, {"color": [0, 1, 0, 1]}],
"1st water crossing / halfway point": [-51, 64, 24, false],
"1st path split": [0, 95, 36, false],
"Spawn Point": [0, 87, 0, "Spawn"],
"Warehouse/Mine": [84, 110, 76, true],
"Spawn Point": [0, 87, 0, "Spawn", {"offset": [-46, -20]}],
"Warehouse/Mine": [84, 110, 76, true, {"offset": [2, -10]}],
"to village curve point": [139, 105, 145, false],
"Cliffspawn Village Bridge": [130, 104, 255, false],
"Cliffspawn Village": [147, 96, 305, true],
"Cliffspawn Village": [147, 96, 305, true, {"color": [0.67, 0.5, 0.33, 1]}],
"spawn hovel": [4, 91, -10, false],
"zombie spawner (hovel mine)": [96, 32, 26, "Zombie Dungeon"],
"geode (hovel mine)": [126, -37, -12, "geode"],
"future sand mine": [191, 63, -297, true],
"skeleton spawner (1st mine)": [119, 36, 92, true, "Skelton Dungeon"],
"zombie spawner (hovel mine)": [96, 32, 26, "Zombie Dungeon", {"color": [0, 0.5, 0, 1]}],
"geode (hovel mine)": [126, -37, -12, "geode", {"color": [0.5, 0.25, 1, 1]}],
"future sand mine": [191, 63, -297, true, {"color": [1, 1, 0, 1]}],
"skeleton spawner (1st mine)": [119, 36, 92, "Skeleton Dungeon"],
"Mount Sharpe": [696, 178, 667, true],
"Great Rock Waterfall": [814, 120, 601, true],
"Great Rock Waterfall": [814, 120, 601, true, {"color": [0.38, 0.38, 1, 1]}],
"Great Rock Waterfall (bottom)": [809, 74, 536, false],
"waterfall 2 top": [832, 121, 631, false],
"waterfall 2 top": [832, 121, 631, "", {"color": [0.38, 0.38, 1, 1], "offset": [0, 2]}],
"waterfall 2 bottom": [884, 82, 628, false],
"Ruined Nether Portal": [853, 79, 805, true],
"Trickster Waterfall": [439, 81, 743, true],
"Ruined Nether Portal": [853, 79, 805, true, {"color": [1, 0.25, 0, 1]}],
"Trickster Waterfall": [439, 81, 743, true, {"color": [0.38, 0.38, 1, 1]}],
"Trickster Waterfall (bottom)": [441, 62, 730, false],
"village crossroad": [130, 101, 296, false, {"notes": "insignificant"}],
"Second Farm original route corner": [-180, 69, -30, false],
"Second Farm original route corner 2": [-202, 79, -169, false]
"Second Farm original route corner 2": [-202, 79, -169, false],
"cherry blossum divergence point": [-332, 104, -423],
"original farm worldborder deadend": [-346, 109, -456],
"Cherry Point": [-480, 104, -404, true, {"color": [1, 0.67, 0.67, 1]}],
"unnamed beach point": [-376, 63, -313],
"unnamed summit curve point": [-387, 119, -229],
"unnamed summit": [-408, 130, -251],
"Sugarcane Point": [-161, 62, -365, true, {"color": [0.75, 1, 0.25, 1]}]
},
"edges": [
["tree farm north", "Second Farm"],
["tree farm north", "Second Farm", null, {"offset": [0, -12]}],
["tree farm north", "farm paths diverge point"],
["farm paths diverge point", "First Farm"],
["First Farm", "1st water crossing / halfway point"],
["1st water crossing / halfway point", "1st path split"],
["farm paths diverge point", "First Farm", null, {"offset": [0, -8]}],
["First Farm", "1st water crossing / halfway point", null, {"offset": [0, -12]}],
["1st water crossing / halfway point", "1st path split", null, {"offset": [-4, 6]}],
["1st path split", "Spawn Point"],
["Spawn Point", "Warehouse/Mine"],
["Warehouse/Mine", "to village curve point"],
["Warehouse/Mine", "to village curve point", null, {"offset": [-14, 6]}],
["to village curve point", "Cliffspawn Village Bridge"],
["Second Farm", "farm paths diverge point"],
["Second Farm", "farm paths diverge point", false, {"notes": "replaced with more detailed representation"}],
["1st path split", "Warehouse/Mine", false, {"notes": "not real"}],
["Cliffspawn Village", "Cliffspawn Village Bridge"],
["spawn hovel", "geode (hovel mine)"],
["spawn hovel", "zombie spawner (hovel mine)"],
["Warehouse/Mine", "skeleton spawner (1st mine)", false],
["Warehouse/Mine", "skeleton spawner (1st mine)", ""],
["Great Rock Waterfall", "Great Rock Waterfall (bottom)"],
["waterfall 2 top", "waterfall 2 bottom"],
["Trickster Waterfall", "Trickster Waterfall (bottom)", ""],
["farm paths diverge point", "Second Farm original route corner"],
["farm paths diverge point", "Second Farm original route corner", null, {"offset": [-32, 6]}],
["Second Farm original route corner", "Second Farm original route corner 2"],
["Second Farm original route corner 2", "Second Farm"]
["Second Farm original route corner 2", "Second Farm"],
["Second Farm", "cherry blossum divergence point"],
["original farm worldborder deadend", "cherry blossum divergence point"],
["Cherry Point", "cherry blossum divergence point"],
["unnamed summit curve point", "unnamed beach point"],
["unnamed summit curve point", "unnamed summit", null, {"offset": [-14, 10]}],
["Sugarcane Point", "Second Farm"]
]
}

View File

@@ -90,13 +90,20 @@ function love.draw()
end
love.graphics.setColor(0.67, 0.67, 0.67, 1)
if edge[4] and edge[4].offset then
-- these actually work better not scale-adjusted
center_x = center_x + edge[4].offset[1]
center_z = center_z + edge[4].offset[2]
end
love.graphics.print(distance, center_x, center_z - font:getHeight() / 2, 0, 1 / scale, 1 / scale)
end
end
-- draw nodes and label them
love.graphics.setColor(1, 1, 1, 1)
for name, node in pairs(nodes) do
local color = node[5] and node[5].color or {1, 1, 1, 1}
love.graphics.setColor(color)
if not (node[4] == false) then
love.graphics.circle("fill", node[1], node[3], node_radius / scale)
end
@@ -106,7 +113,7 @@ function love.draw()
name = node[4]
end
local text_x, text_y = node[1] + node_radius / scale, node[3] + node_radius / scale
local text_x, text_z = node[1] + node_radius / scale, node[3] + node_radius / scale
local difference = node[1] + font:getWidth(name) - maximums[1]
if difference > 0 then
@@ -115,29 +122,29 @@ function love.draw()
local difference = node[3] + font:getHeight() - maximums[2]
if difference > 0 then
text_y = node[3] - (node_radius + difference) / scale
text_z = node[3] - (node_radius + difference) / scale
end
love.graphics.print(name, text_x, text_y, 0, 1 / scale, 1 / scale)
if node[5] and node[5].offset then
text_x = text_x + node[5].offset[1] / scale
text_z = text_z + node[5].offset[2] / scale
end
love.graphics.print(name, text_x, text_z, 0, 1 / scale, 1 / scale)
end
end
-- TEMP center of map
-- love.graphics.setColor(1, 1, 1, 1)
-- love.graphics.circle("fill", minimums[1] + (maximums[1] - minimums[1]) / 2, minimums[2] + (maximums[2] - minimums[2]) / 2, node_radius / scale)
end
function love.update(dt)
if love.keyboard.isDown("w") then
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
translation[2] = translation[2] + translation_adjust_speed / scale * dt
end
if love.keyboard.isDown("s") then
if love.keyboard.isDown("s") or love.keyboard.isDown("down") then
translation[2] = translation[2] - translation_adjust_speed / scale * dt
end
if love.keyboard.isDown("a") then
if love.keyboard.isDown("a") or love.keyboard.isDown("left") then
translation[1] = translation[1] + translation_adjust_speed / scale * dt
end
if love.keyboard.isDown("d") then
if love.keyboard.isDown("d") or love.keyboard.isDown("right") then
translation[1] = translation[1] - translation_adjust_speed / scale * dt
end
if love.keyboard.isDown("=") then
@@ -159,5 +166,7 @@ end
function love.keypressed(key)
if key == "escape" then
love.event.quit()
elseif key == "r" then
load_map("map.json")
end
end