Premier commit
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
@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])
|
||||
Reference in New Issue
Block a user