extends Node2D onready var EditIslandButton = get_node("UI/TopContainer/EditIslandButton") onready var GridDrawer = get_node("GridDrawer") onready var WorldCamera = get_node("Camera") onready var OffsetValueLabel = get_node("UI/TopContainer/OffsetValue") onready var ZoomValueLabel = get_node("UI/TopContainer/ZoomValue") onready var HexCoordValueLabel = get_node("UI/TopContainer/HexCoordValue") onready var PlayerChar = get_node("PlayerChar") onready var FPSValueLabel = get_node("UI/TopContainer/FPSValue") var Island = preload("Island.gd") var hex_size = 128 var hex_grid_bbox = [[0,0], [10,10]] var hex_hover = Vector2.ZERO var is_dragging = false var drag_start = null var target = Vector2() var tile_data = {} var islands = [] # Called when the node enters the scene tree for the first time. func _ready(): load_world("user://pirate_game_world.save") Globals.HexGrid.hex_scale = Vector2(hex_size, hex_size) # Set player starting position PlayerChar.position = Globals.HexGrid.get_hex_center(Vector2(0,0)) GridDrawer.hex_scale = Vector2(hex_size, hex_size) func _draw(): draw_tiles() draw_grid() func draw_grid(): var view_grid_corners = calc_grid_view_rect() var tl_tile_coords = Globals.HexGrid.get_hex_center(view_grid_corners[0]) var tr_tile_coords = Globals.HexGrid.get_hex_center(view_grid_corners[1]) var bl_tile_coords = Globals.HexGrid.get_hex_center(view_grid_corners[2]) var br_tile_coords = Globals.HexGrid.get_hex_center(view_grid_corners[3]) var nc = ceil ((tr_tile_coords[0] - tl_tile_coords[0]) * 1.5 / hex_size) var nr = ceil ((bl_tile_coords[1] - tr_tile_coords[1]) / hex_size) + 2 for c in range (nc): var dx = 0.75 * hex_size * c var dy = (c % 2) * sqrt(3) * 0.25 * hex_size #(c % 2) * sqrt(3) * hex_size * 0.75 for r in range (nr): draw_set_transform(tl_tile_coords + Vector2(dx, r * hex_size * sqrt(3) * 0.5 + dy), 0, Vector2.ONE) draw_polyline(GridDrawer.HexPoints, "#888", 1 * WorldCamera.zoom.x) var coords = Globals.HexGrid.get_hex_center (hex_hover) draw_set_transform(coords, 0, Vector2.ONE) draw_polyline(GridDrawer.HexPoints, "#f00", 2 * WorldCamera.zoom.x) func draw_tiles(): for coord in tile_data.keys(): draw_set_transform (coord, 0, Vector2.ONE) draw_polygon(GridDrawer.HexPoints, GridDrawer.get_tile_color(tile_data[coord])) func screen_to_world(pos: Vector2): pos = pos - OS.get_window_safe_area().size * 0.5 return WorldCamera.offset + pos * WorldCamera.zoom func screen_to_hex(pos: Vector2): return Globals.HexGrid.get_hex_at(screen_to_world(pos)).axial_coords func world_to_screen(pos: Vector2): return pos * WorldCamera.zoom + WorldCamera.offset func calc_grid_view_rect(): var view_tl = Vector2(-hex_size,-hex_size) var view_br = OS.get_window_safe_area().size - view_tl var top_left = screen_to_hex (view_tl) var top_right = screen_to_hex (Vector2(view_br.x, view_tl.y)) var bottom_left = screen_to_hex (Vector2(view_tl.x, view_br.y)) var bottom_right = screen_to_hex (view_br) return [top_left, top_right, bottom_left, bottom_right] func handle_game_event(event): if event is InputEventMouseButton: # Move main character if event.pressed and event.button_index == BUTTON_LEFT: PlayerChar.target = Globals.HexGrid.get_hex_center(screen_to_hex(event.position)) return true return false func _unhandled_input(event): if event is InputEventMouseButton: if handle_game_event(event): return # Move camera if event.pressed and event.button_index == 2: is_dragging = true drag_start = (WorldCamera.offset / WorldCamera.zoom.x + event.position) else: is_dragging = false # Zoom Camera if event.pressed and event.button_index == BUTTON_WHEEL_DOWN and event.pressed and WorldCamera.zoom.y < 3.5: WorldCamera.zoom = WorldCamera.zoom * 1.0 / 0.8 elif event.button_index == BUTTON_WHEEL_UP and event.pressed: WorldCamera.zoom = WorldCamera.zoom * 0.8 if 'position' in event: hex_hover = screen_to_hex(event.position) HexCoordValueLabel.text = str(hex_hover) if is_dragging: WorldCamera.offset = (drag_start - event.position) * WorldCamera.zoom.x update() OffsetValueLabel.text = str(WorldCamera.offset) ZoomValueLabel.text = str(WorldCamera.zoom) func save_world(path: String): var world_save_data = File.new() world_save_data.open(path, File.WRITE) world_save_data.store_line (to_json(tile_data)) world_save_data.close() func load_world(path: String): var world_save_data = File.new() world_save_data.open(path, File.READ) var data = parse_json(world_save_data.get_line()) world_save_data.close() var data_keys = data.keys() tile_data = {} var coord_regex = RegEx.new() coord_regex.compile("\\((?-?\\d+(.?\\d+)?), (?-?\\d+(.?\\d+)?)\\)") var reg_test_result = coord_regex.search("(0, 0)") assert(reg_test_result) reg_test_result = coord_regex.search("(123.124, 552.0)") assert(reg_test_result) for k in data_keys: var coords = Vector2.ZERO var regresult = coord_regex.search(k) if regresult: print(regresult.get_string("tile_x"), " - ", regresult.get_string("tile_y")) coords = Vector2(float(regresult.get_string("tile_x")), float(regresult.get_string("tile_y"))) tile_data[coords] = data[k] update()