local map_editor_state = { map = {}, world = {}, ui = {}, selected_tile = false } local map_editor_scene_menu_options = { false, { texture = TEXTURES.NEW_GAME_HEX, action = function() win.scene:remove("menu") game_init() end }, false, { texture = TEXTURES.SAVE_GAME_HEX, action = function() game_save() gui_alert("succesfully saved!") end }, false, { texture = TEXTURES.LOAD_GAME_HEX, action = function() local save = am.load_state("save", "json") if save then win.scene:remove("menu") game_init(save) else gui_alert("no saved games") end end }, { texture = TEXTURES.MAP_EDITOR_HEX, action = function() map_editor_init(game_state and game_state.map and game_state.map.seed) end }, { texture = TEXTURES.UNPAUSE_HEX, action = function() win.scene:remove("menu") win.scene("context").paused = false end, keys = { "escape" } }, { texture = TEXTURES.SETTINGS_HEX, action = function() gui_alert("not yet :)") end }, { texture = TEXTURES.QUIT_HEX, action = function() win:close() end, keys = { "f4" } }, false } local function deselect_tile() map_editor_state.selected_tile = false win.scene:remove("tile_select_box") end function map_editor_action() local mouse = win:mouse_position() local hex = pixel_to_hex(mouse - WORLDSPACE_COORDINATE_OFFSET, vec2(HEX_SIZE)) local rounded_mouse = hex_to_pixel(hex, vec2(HEX_SIZE)) + WORLDSPACE_COORDINATE_OFFSET local evenq = hex_to_evenq(hex) local tile = hex_map_get(map_editor_state.map, hex) local interactable = evenq_is_in_interactable_region(evenq{ y = -evenq.y }) if win:key_pressed"escape" then win.scene("map_editor").paused = true win.scene:append(make_scene_menu(map_editor_scene_menu_options, nil, true)) end if win:mouse_down"left" then deselect_tile() map_editor_state.selected_tile = tile win.scene:append(( am.translate(rounded_mouse) ^ pack_texture_into_sprite(TEXTURES.SELECT_BOX, HEX_SIZE*2, HEX_SIZE*2, COLORS.SUNRAY) ) :tag"tile_select_box" ) end if map_editor_state.selected_tile then if win:key_down"a" then -- make the selected tile 'mountain' map_editor_state.selected_tile.elevation = 0.75 --map_editor_state.selected_tile.node("circle").color = map_elevation_color(map_editor_state.selected_tile.elevation) elseif win:key_down"w" then -- make the selected tile 'water' map_editor_state.selected_tile.elevation = -0.75 --map_editor_state.selected_tile.node("circle").color = map_elevation_color(map_editor_state.selected_tile.elevation) elseif win:key_down"d" then -- make the selected tile 'dirt' map_editor_state.selected_tile.elevation = 0.25 --map_editor_state.selected_tile.node("circle").color = map_elevation_color(map_editor_state.selected_tile.elevation) elseif win:key_down"g" then -- make the selected tile 'grass' map_editor_state.selected_tile.elevation = -0.25 --map_editor_state.selected_tile.node("circle").color = map_elevation_color(map_editor_state.selected_tile.elevation) end -- fine tune tile's elevation with mouse wheel local mouse_wheel_delta = win:mouse_wheel_delta().y / 100 if map_editor_state.selected_tile and mouse_wheel_delta ~= 0 then map_editor_state.selected_tile.elevation = math.clamp(map_editor_state.selected_tile.elevation + mouse_wheel_delta, -1, 1 - math.SMALLEST_NUMBER_ABOVE_0) --map_editor_state.selected_tile.node("circle").color = map_elevation_color(map_editor_state.selected_tile.elevation) end end -- update the cursor if not interactable then win.scene("cursor").hidden = true else win.scene("cursor").hidden = false win.scene("cursor_translate").position2d = rounded_mouse end if tile then win.scene("top_right_display").text = string.format( "raw elevation value: %.2f\ntile type: %s", tile.elevation, map_elevation_to_tile_type(tile.elevation) ) end end function map_editor_init() -- remove existing map_editor scene from the graph if it's there local map_editor_scene = am.group():tag"map_editor" map_editor_scene:late_action(map_editor_action) map_editor_state.map = default_map_editor_map(1) map_editor_state.world = make_hex_grid_scene(map_editor_state.map, false) map_editor_state.ui = am.group( am.translate(HEX_GRID_CENTER):tag"cursor_translate" ^ make_hex_cursor_node(0, COLORS.TRANSPARENT):tag"cursor", make_top_right_display_node() ) -- add the top level nodes to the scene map_editor_scene:append(map_editor_state.world) map_editor_scene:append(map_editor_state.ui) -- add the scene to the window switch_context(map_editor_scene) end