49 lines
1.4 KiB
GDScript
49 lines
1.4 KiB
GDScript
class_name Minefield extends Node2D
|
|
|
|
static var instance: Minefield
|
|
|
|
@onready var minePrefab: PackedScene = preload("res://scenes/Mine.tscn")
|
|
@onready var cam: Camera2D = $Camera2D
|
|
|
|
@export var width: int = 10
|
|
@export var height: int = 10
|
|
@export var mineCount: int = 10
|
|
|
|
var mines: Array[Mine]
|
|
var spriteWidth: int = 16
|
|
var fieldInitialized: bool = false
|
|
|
|
func _enter_tree() -> void:
|
|
if (instance == null || is_instance_valid(instance)): instance = self
|
|
else: queue_free()
|
|
|
|
func _ready() -> void:
|
|
var scale: float = 1
|
|
for x: int in range(width):
|
|
for y: int in range(height):
|
|
var mine: Mine = minePrefab.instantiate()
|
|
mine.coord = Vector2i(x, y)
|
|
mine.position = Vector2(spriteWidth * x - (spriteWidth * (width / 2)) + (spriteWidth / 2),
|
|
spriteWidth * y - (spriteWidth * (height / 2)) + (spriteWidth / 2))
|
|
add_child(mine)
|
|
mines.append(mine)
|
|
|
|
func initField(coord: Vector2i) -> void:
|
|
var picked: Array[Vector2i]
|
|
for i: int in range(mineCount):
|
|
var pick: Vector2i
|
|
while (true):
|
|
pick = Vector2i(randi_range(0, width - 1), randi_range(0, height - 1))
|
|
if abs(coord - pick) <= Vector2i(1, 1) || pick in picked:
|
|
continue
|
|
break
|
|
print("Picked " + str(pick))
|
|
picked.append(pick)
|
|
getMine(pick).type = Mine.MineType.MINE
|
|
for mine: Mine in mines:
|
|
mine.evaluateType()
|
|
|
|
func getMine(coord: Vector2i) -> Mine:
|
|
if (coord.x < 0 || coord.y < 0 || coord.x >= width || coord.y >= width): return null
|
|
return mines[(coord.x * height) + coord.y]
|