diff --git a/ReadMe.md b/ReadMe.md index ea5b63c..cb63525 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -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 diff --git a/map.json b/map.json index 6b5e163..fb2e462 100644 --- a/map.json +++ b/map.json @@ -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"] ] } diff --git a/src/main.lua b/src/main.lua index ab9a75a..b563a59 100644 --- a/src/main.lua +++ b/src/main.lua @@ -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