87 lines
2.6 KiB
GDScript
87 lines
2.6 KiB
GDScript
@tool
|
|
extends Node3D
|
|
class_name HexMap
|
|
|
|
const BASE_TILE_SET_SCENE = preload('res://objects/map/tiles/base_hex_tile_set.tscn') as PackedScene
|
|
|
|
@export_tool_button("Load Map", "Callable") var load_map_action = load_map
|
|
|
|
@export var radius = 10
|
|
|
|
@onready var tile_set : HexTileSet = BASE_TILE_SET_SCENE.instantiate()
|
|
|
|
var empty_hex_tiles_coords : Array[Vector2i] = []
|
|
var hex_tiles_by_pos : Dictionary[String, HexTile] = {}
|
|
var hex_tiles_by_id : Dictionary[String, Array] = {}
|
|
|
|
func load_map():
|
|
for c in get_children():
|
|
c.queue_free()
|
|
empty_hex_tiles_coords = []
|
|
hex_tiles_by_pos = {}
|
|
|
|
empty_hex_tiles_coords = get_all_hex_coords()
|
|
empty_hex_tiles_coords.shuffle()
|
|
|
|
var mandatory_tiles = tile_set.get_all_hex_tiles().filter(
|
|
func (tile : HexTile): return tile.mandatory_tile
|
|
)
|
|
|
|
for hex_tile in mandatory_tiles:
|
|
for i in range(hex_tile.mandatory_count):
|
|
if len(empty_hex_tiles_coords) != 0:
|
|
spawn_tile(
|
|
empty_hex_tiles_coords.pop_front(),
|
|
hex_tile
|
|
)
|
|
|
|
while len(empty_hex_tiles_coords) != 0:
|
|
var coord : Vector2i = empty_hex_tiles_coords.pop_front()
|
|
spawn_tile(
|
|
coord,
|
|
get_available_tiles_for_coord(coord).pick_random()
|
|
)
|
|
|
|
|
|
|
|
func spawn_tile(coord : Vector2i, hex_tile : HexTile):
|
|
var new_tile = hex_tile.duplicate()
|
|
|
|
hex_tiles_by_pos["%d:%d" % [coord.x, coord.y]] = new_tile
|
|
if not (new_tile.name in hex_tiles_by_id):
|
|
hex_tiles_by_id[new_tile.name] = []
|
|
|
|
hex_tiles_by_id[new_tile.name].append(new_tile)
|
|
|
|
new_tile.position = get_world_tile_coord(coord)
|
|
|
|
new_tile.rotation.y = (randi() % 6)/6. * 2. * PI
|
|
|
|
add_child(new_tile)
|
|
|
|
func get_available_tiles_for_coord(_coord : Vector2) -> Array[HexTile]:
|
|
return tile_set.get_all_hex_tiles().filter(
|
|
func (tile : HexTile): return not tile.mandatory_tile
|
|
)
|
|
|
|
func get_all_hex_coords() -> Array[Vector2i]:
|
|
var coords : Array[Vector2i] = []
|
|
|
|
for x in range(-radius, radius):
|
|
for y in range(-radius, radius):
|
|
if Vector2(x,y).length() < radius:
|
|
coords.append(Vector2i(x,y))
|
|
|
|
return coords
|
|
|
|
func get_world_tile_coord(coord: Vector2i) -> Vector3:
|
|
return Vector3(
|
|
coord.x * HexTile.BASE_TILE_SIZE + (HexTile.BASE_TILE_SIZE/2. if coord.y%2 == 0 else 0.),
|
|
0.,
|
|
coord.y * HexTile.BASE_TILE_SIZE * cos(PI/6),
|
|
)
|
|
|
|
func get_all_tiles_with_id(id : String) -> Array[HexTile]:
|
|
if id in hex_tiles_by_id:
|
|
return (hex_tiles_by_id[id] as Array[HexTile])
|
|
return ([] as Array[HexTile]) |