2025-05-13 14:49:17 -04:00
|
|
|
class_name Tile extends Node2D
|
2025-05-13 11:16:02 -04:00
|
|
|
|
|
|
|
@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")
|
2025-05-14 11:32:36 -04:00
|
|
|
@onready var brokenFlag: CompressedTexture2D = preload("res://sprites/brokenFlag.png")
|
2025-05-13 11:16:02 -04:00
|
|
|
@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")
|
|
|
|
]
|
|
|
|
|
2025-05-13 14:49:17 -04:00
|
|
|
enum TileTypes{
|
2025-05-13 11:16:02 -04:00
|
|
|
EMPTY,
|
|
|
|
ONE,
|
|
|
|
TWO,
|
|
|
|
THREE,
|
|
|
|
FOUR,
|
|
|
|
FIVE,
|
|
|
|
SIX,
|
|
|
|
SEVEN,
|
|
|
|
EIGHT,
|
|
|
|
MINE
|
|
|
|
}
|
|
|
|
|
|
|
|
@onready var layer1: Sprite2D = $layer1
|
|
|
|
@onready var layer2: Sprite2D = $layer2
|
|
|
|
|
2025-05-13 14:49:17 -04:00
|
|
|
var type: TileTypes
|
2025-05-13 11:16:02 -04:00
|
|
|
var coord: Vector2i
|
|
|
|
var revealed: bool = false
|
2025-05-13 22:29:20 -04:00
|
|
|
var flagged: bool = false
|
2025-05-13 11:16:02 -04:00
|
|
|
|
2025-05-14 11:32:36 -04:00
|
|
|
func getNeighbors() -> Array[Tile]:
|
|
|
|
var results: Array[Tile]
|
2025-05-13 11:16:02 -04:00
|
|
|
for x: int in range(-1, 2):
|
|
|
|
for y: int in range(-1, 2):
|
|
|
|
if (x == 0 && y == 0): continue
|
2025-05-13 14:49:17 -04:00
|
|
|
var tile: Tile = Minefield.instance.getTile(coord + Vector2i(x, y))
|
|
|
|
if (tile == null): continue
|
2025-05-14 11:32:36 -04:00
|
|
|
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
|
2025-05-13 14:49:17 -04:00
|
|
|
type = count as TileTypes
|
2025-05-13 11:16:02 -04:00
|
|
|
|
2025-05-14 11:32:36 -04:00
|
|
|
func reveal() -> int:
|
|
|
|
if (revealed || Minefield.instance.gameRunning && flagged): return 0
|
2025-05-13 11:16:02 -04:00
|
|
|
revealed = true
|
2025-05-14 11:32:36 -04:00
|
|
|
var count: int = 1
|
2025-05-13 11:16:02 -04:00
|
|
|
layer1.texture = backplate
|
|
|
|
match type:
|
2025-05-13 14:49:17 -04:00
|
|
|
TileTypes.EMPTY:
|
2025-05-13 11:16:02 -04:00
|
|
|
layer2.texture = null
|
2025-05-14 11:32:36 -04:00
|
|
|
for tile: Tile in getNeighbors(): count += tile.reveal()
|
2025-05-13 14:49:17 -04:00
|
|
|
TileTypes.MINE:
|
2025-05-13 11:16:02 -04:00
|
|
|
layer2.texture = mine
|
2025-05-14 11:32:36 -04:00
|
|
|
if (Minefield.instance.gameRunning): Minefield.instance.lose()
|
2025-05-13 11:16:02 -04:00
|
|
|
_:
|
|
|
|
layer2.texture = nums[type as int - 1]
|
2025-05-14 11:32:36 -04:00
|
|
|
return count
|
|
|
|
|
|
|
|
func breakFlag() -> void:
|
|
|
|
layer2.texture = brokenFlag
|
2025-05-13 11:16:02 -04:00
|
|
|
|
2025-05-13 22:29:20 -04:00
|
|
|
func _on_area_2d_input_event(viewport: Node, event: InputEvent, shape_idx: int) -> void:
|
2025-05-14 11:32:36 -04:00
|
|
|
if (!Minefield.instance.gameRunning): return
|
2025-05-13 22:29:20 -04:00
|
|
|
if (event.is_released()):
|
2025-05-14 11:32:36 -04:00
|
|
|
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):
|
2025-05-13 22:29:20 -04:00
|
|
|
if (!Minefield.instance.fieldInitialized):
|
|
|
|
Minefield.instance.initField(coord)
|
2025-05-14 11:32:36 -04:00
|
|
|
Minefield.instance.tilesRevealed(reveal())
|
2025-05-13 22:29:20 -04:00
|
|
|
elif (event.is_action_released("flag") && !revealed):
|
|
|
|
flagged = !flagged
|
|
|
|
if (flagged):
|
|
|
|
layer2.texture = flag
|
2025-05-14 11:32:36 -04:00
|
|
|
if (type != TileTypes.MINE): Minefield.instance.falseFlags.append(self)
|
2025-05-13 22:29:20 -04:00
|
|
|
else:
|
|
|
|
layer2.texture = null
|
2025-05-14 11:32:36 -04:00
|
|
|
if (type != TileTypes.MINE): Minefield.instance.falseFlags.erase(self)
|