class_name Minefield extends Node2D static var instance: Minefield @onready var tilePrefab: PackedScene = preload("res://scenes/Tile.tscn") @onready var cam: Camera2D = $Camera2D @export var width: int = 10 @export var height: int = 10 @export var mineCount: int = 10 @export var startingSafeZone: int = 2 var tiles: Array[Tile] var mines: Array[Tile] var falseFlags: Array[Tile] var spriteWidth: int = 16 var fieldInitialized: bool = false var gameRunning: bool = true var revealed: int = 0 var winCondition: int var timer: int func _enter_tree() -> void: if (instance == null || is_instance_valid(instance)): instance = self else: queue_free() func _ready() -> void: var scale: float = 1 winCondition = (width * height) - mineCount for x: int in range(width): for y: int in range(height): var tile: Tile = tilePrefab.instantiate() tile.coord = Vector2i(x, y) tile.position = Vector2(spriteWidth * x - (spriteWidth * (width / 2)) + (spriteWidth / 2), spriteWidth * y - (spriteWidth * (height / 2)) + (spriteWidth / 2)) add_child(tile) tiles.append(tile) func initField(coord: Vector2i) -> void: fieldInitialized = true var pickPool: Array[Tile] = tiles.duplicate() for i: int in range(mineCount): var pick: Tile = pickPool.pick_random() while (true): pickPool.erase(pick) if (abs(coord - pick.coord) >= Vector2i(startingSafeZone, startingSafeZone)): pick.type = Tile.TileTypes.MINE mines.append(pick) break pick = pickPool.pick_random() for tile: Tile in tiles: tile.evaluateType() timer = Time.get_ticks_msec() func lose() -> void: gameRunning = false for mine: Tile in mines: await get_tree().create_timer(randf_range(0.01, 0.25)).timeout mine.reveal() for flag: Tile in falseFlags: await get_tree().create_timer(randf_range(0.01, 0.1)).timeout flag.breakFlag() func tilesRevealed(count: int) -> void: revealed += count if (revealed == winCondition): gameRunning = false var completionTime: int = Time.get_ticks_msec() - timer var humanTime: float = float(completionTime) / 1000 print("You win.\nCompleted in " + str(humanTime) + " seconds") func getTile(coord: Vector2i) -> Tile: if (coord.x < 0 || coord.y < 0 || coord.x >= width || coord.y >= width): return null return tiles[(coord.x * height) + coord.y]