class_name Tile extends Node2D @onready var backplate: CompressedTexture2D = preload("res://sprites/backplate.png") @onready var cover: CompressedTexture2D = preload("res://sprites/cover.png") @onready var mine: CompressedTexture2D = preload("res://sprites/mine.png") @onready var flag: CompressedTexture2D = preload("res://sprites/flag.png") @onready var brokenFlag: CompressedTexture2D = preload("res://sprites/brokenFlag.png") @onready var nums: Array[CompressedTexture2D] = [ preload("res://sprites/1.png"), preload("res://sprites/2.png"), preload("res://sprites/3.png"), preload("res://sprites/4.png"), preload("res://sprites/5.png"), preload("res://sprites/6.png"), preload("res://sprites/7.png"), preload("res://sprites/8.png") ] enum TileTypes{ EMPTY, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, MINE } @onready var layer1: Sprite2D = $layer1 @onready var layer2: Sprite2D = $layer2 var type: TileTypes var coord: Vector2i var revealed: bool = false var flagged: bool = false func getNeighbors() -> Array[Tile]: var results: Array[Tile] for x: int in range(-1, 2): for y: int in range(-1, 2): if (x == 0 && y == 0): continue var tile: Tile = Minefield.instance.getTile(coord + Vector2i(x, y)) if (tile == null): continue results.append(tile) return results func evaluateType() -> void: if (type == TileTypes.MINE): return var count: int = 0 for tile: Tile in getNeighbors(): if (tile.type == TileTypes.MINE): count += 1 type = count as TileTypes func reveal() -> int: if (revealed || Minefield.instance.gameRunning && flagged): return 0 revealed = true var count: int = 1 layer1.texture = backplate match type: TileTypes.EMPTY: layer2.texture = null for tile: Tile in getNeighbors(): count += tile.reveal() TileTypes.MINE: layer2.texture = mine if (Minefield.instance.gameRunning): Minefield.instance.lose() _: layer2.texture = nums[type as int - 1] return count func breakFlag() -> void: layer2.texture = brokenFlag func _on_area_2d_input_event(viewport: Node, event: InputEvent, shape_idx: int) -> void: if (!Minefield.instance.gameRunning): return if (event.is_released()): if (event.is_action_released("reveal") && revealed): var count: int = 0 var neighbors: Array[Tile] = getNeighbors() for tile: Tile in neighbors: if (tile.flagged): count += 1 if (count == type as int): count = 0 for tile: Tile in neighbors: count += tile.reveal() Minefield.instance.tilesRevealed(count) elif (event.is_action_released("reveal") && !flagged): if (!Minefield.instance.fieldInitialized): Minefield.instance.initField(coord) Minefield.instance.tilesRevealed(reveal()) elif (event.is_action_released("flag") && !revealed): flagged = !flagged if (flagged): layer2.texture = flag if (type != TileTypes.MINE): Minefield.instance.falseFlags.append(self) else: layer2.texture = null if (type != TileTypes.MINE): Minefield.instance.falseFlags.erase(self)