189 lines
6.0 KiB
GDScript
189 lines
6.0 KiB
GDScript
extends Node2D
|
|
|
|
onready var EditIslandButton = get_node("UI/TopContainer/EditIslandButton")
|
|
onready var TileTypes = get_node("UI/TileTypes")
|
|
onready var NoneButton = get_node("UI/Editor/NoneButton")
|
|
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 HexGrid = preload("../thirdparty/gdhexgrid/HexGrid.gd").new()
|
|
|
|
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 = {}
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
_on_LoadWorldButton_pressed()
|
|
HexGrid.hex_scale = Vector2(hex_size, hex_size)
|
|
|
|
# Set player starting position
|
|
PlayerChar.position = 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 = HexGrid.get_hex_center(view_grid_corners[0])
|
|
var tr_tile_coords = HexGrid.get_hex_center(view_grid_corners[1])
|
|
var bl_tile_coords = HexGrid.get_hex_center(view_grid_corners[2])
|
|
var br_tile_coords = 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 = 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 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 = HexGrid.get_hex_center(screen_to_hex(event.position))
|
|
return true
|
|
|
|
return false
|
|
|
|
func handle_editor_event(event):
|
|
if (Input.get_mouse_button_mask() & BUTTON_LEFT) == BUTTON_LEFT:
|
|
# if event.pressed and event.button_index == BUTTON_LEFT:
|
|
var pressed_button = NoneButton.group.get_pressed_button()
|
|
var tile_type = "None"
|
|
if pressed_button:
|
|
tile_type = pressed_button.text
|
|
|
|
var hex_coord = HexGrid.get_hex_center(screen_to_hex(event.position))
|
|
if tile_type != "None":
|
|
tile_data[hex_coord] = tile_type
|
|
update()
|
|
elif hex_coord in tile_data.keys():
|
|
tile_data.erase(hex_coord)
|
|
update()
|
|
|
|
return true
|
|
|
|
return false
|
|
|
|
func _unhandled_input(event):
|
|
if event is InputEventMouseButton:
|
|
if EditIslandButton.pressed:
|
|
if handle_editor_event (event):
|
|
return
|
|
elif 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
|
|
elif EditIslandButton.pressed:
|
|
if handle_editor_event (event):
|
|
return
|
|
|
|
update()
|
|
|
|
OffsetValueLabel.text = str(WorldCamera.offset)
|
|
ZoomValueLabel.text = str(WorldCamera.zoom)
|
|
|
|
|
|
func _on_SaveWorldButton_pressed():
|
|
var world_save_data = File.new()
|
|
world_save_data.open("user://pirate_game_world.save", File.WRITE)
|
|
world_save_data.store_line (to_json(tile_data))
|
|
world_save_data.close()
|
|
|
|
|
|
func _on_ClearWorldButton_pressed():
|
|
tile_data = {}
|
|
update()
|
|
|
|
func _on_LoadWorldButton_pressed():
|
|
var world_save_data = File.new()
|
|
world_save_data.open("user://pirate_game_world.save", 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("\\((?<tile_x>-?\\d+(.?\\d+)?), (?<tile_y>-?\\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()
|