summaryrefslogtreecommitdiffstats
path: root/Map.gd
blob: 1300304050f1d77927c5cd47c105a3418a39dc60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
extends Sprite

signal configure(center, texture_size)
signal touched(msg)

const MAPH : String = "res://assets/map-h.png"
const MAPV : String = "res://assets/map-v.png"
const BLOCK : String = "res://assets/block.png"
const BLACK : String = "res://assets/black.png"
const GREEN : String = "res://assets/green.png"

var drag : Sprite

var board : HexBoard
var prev : Vector2
var hexes : Dictionary
var hex_rotation : int
var p0 : Vector2
var p1 : Vector2
var los : Array

func _ready():
	board = HexBoard.new()
	board.tile_factory_fct = funcref(self, "get_tile")
	board.v = false
	drag = null
	hexes = {}
	los = []

func reset() -> void:
	hexes.clear()
	hexes[-1] = Hex.new()	# off map

func get_tile(coords : Vector2, k : int) -> Tile:
	if hexes.has(k): return hexes[k]
	var hex : Hex = Hex.new()
	hex.rotation_degrees = hex_rotation
	hex.configure(board.center_of(coords), coords, [BLOCK, GREEN, BLACK])
	hexes[k] = hex
	$Hexes.add_child(hex)
	return hex

func on_rotate() -> void:
	texture = load(MAPH if board.v else MAPV)
	var ts : Vector2 = texture.get_size()
	var v0 : Vector2 = Vector2(50, 100)
	var c = ts / 2
	if centered:
		if board.v:	
			v0.x -= ts.y / 2
			v0.y -= ts.x / 2
		else:
			v0 -= ts / 2
		c = Vector2(0, 0)
	if board.v:
		hex_rotation = 30
		board.configure(10, 4, 100, v0, false)
	else:
		hex_rotation = 0
		board.configure(10, 7, 100, v0, true)
	emit_signal("configure", c, ts)
	p0 = Vector2(0, 0)
	p1 = Vector2(3, 3)
	$Tank.position = board.center_of(p0)
	$Target.position = board.center_of(p1)
	for hex in $Hexes.get_children():
		$Hexes.remove_child(hex)
		hex.queue_free()
	reset()
	update_los()

func on_mouse_move() -> void:
	if drag != null:
		drag.position = get_local_mouse_position()

func on_mouse_1(pressed : bool) -> void:
	var pos : Vector2 = get_local_mouse_position()
	var coords : Vector2 = board.to_map(pos)
	if pressed:
		notify(pos, coords)
		if drag == null:
			prev = coords
			if board.to_map($Tank.position) == coords:
				drag = $Tank
			elif board.to_map($Target.position) == coords:
				drag = $Target
	else:
		if drag:
			if board.is_on_map(coords):
				drag.position = board.center_of(coords)
				if drag == $Tank: p0 = coords
				else: p1 = coords
				update_los()
			else:
				drag.position = board.center_of(prev)
		drag = null

func on_mouse_2(pressed : bool) -> void:
	var pos : Vector2 = get_local_mouse_position()
	var coords : Vector2 = board.to_map(pos)
	if pressed:
		notify(pos, coords)
		var hex : Hex = board.get_tile(coords)
		if not hex.is_blocked(): hex.block(true)
		else: hex.block(false)
		update_los()

func notify(pos : Vector2, coords : Vector2) -> void:
	if board.is_on_map(coords):
		var center : Vector2 = board.center_of(coords)
		var key : int = board.key(coords)
		emit_signal("touched","%s\n -> %s\n -> %s\n -> %d" % [pos, coords, center, key])
	else:
		emit_signal("touched", "off board")

func update_los() -> void:
	for hex in los:
		hex.show_los(false)
	var ct : Vector2 = board.line_of_sight(p0, p1, los)
	$Los.setup($Tank.position, $Target.position, ct)
	for hex in los:
		hex.show_los(true)