117 lines
3.3 KiB
GDScript
117 lines
3.3 KiB
GDScript
extends Node2D
|
|
|
|
|
|
onready var Grid = get_node("Grid")
|
|
onready var GridHighlight = get_node("GridHighlight")
|
|
|
|
onready var Islands = get_node("Islands")
|
|
onready var EditIslandButton = get_node("UI/TopContainer/EditIslandButton")
|
|
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_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 = []
|
|
var island = null
|
|
|
|
|
|
func _ready():
|
|
Grid.view_camera = WorldCamera
|
|
GridHighlight.view_camera = WorldCamera
|
|
|
|
island = Island.new()
|
|
Islands.add_child(island)
|
|
|
|
island.load_island("user://pirate_game_world.save")
|
|
|
|
# Set player starting position
|
|
PlayerChar.position = Globals.HexGrid.get_hex_center(Vector2(0,0))
|
|
|
|
|
|
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(Globals.ScreenToHex(event.position, WorldCamera))
|
|
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 < 5.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 = Globals.ScreenToHex(event.position, WorldCamera)
|
|
GridHighlight.pos = hex_hover
|
|
|
|
HexCoordValueLabel.text = str(hex_hover)
|
|
|
|
if is_dragging:
|
|
WorldCamera.offset = (drag_start - event.position) * WorldCamera.zoom.x
|
|
|
|
|
|
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("\\((?<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()
|