65 lines
1.9 KiB
GDScript
65 lines
1.9 KiB
GDScript
extends Node2D
|
|
|
|
@export var tile_set: TileSet
|
|
@export var player_map: Node2D
|
|
@export var player_tower_map: TileMapLayer
|
|
@export var opponent_map: Node2D
|
|
@export var opponent_tower_map: TileMapLayer
|
|
@export var map_size := Vector2i(10, 20)
|
|
@export var camera: Camera2D
|
|
|
|
var clicked: bool = false
|
|
var clicked_pos: Vector2
|
|
|
|
|
|
func _ready() -> void:
|
|
player_tower_map.tile_set = tile_set
|
|
opponent_tower_map.tile_set = tile_set
|
|
player_tower_map.clear()
|
|
opponent_tower_map.clear()
|
|
MatchChannel.connect("on_match_update", on_match_update)
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
# gdlint:ignore = max-line-length
|
|
var new_zoom := float(get_window().size.y) / float(map_size.y * tile_set.tile_size.y)
|
|
camera.zoom = Vector2(new_zoom, new_zoom)
|
|
var new_base_postion := get_window().size / 2 / new_zoom
|
|
camera.position = new_base_postion
|
|
|
|
self.position.x = new_base_postion.x - map_size.x * tile_set.tile_size.x
|
|
opponent_map.position.x = map_size.x * tile_set.tile_size.x
|
|
|
|
|
|
func _input(_event) -> void:
|
|
if Input.is_action_just_pressed("place"):
|
|
clicked_pos = get_global_mouse_position()
|
|
clicked = true
|
|
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
if clicked:
|
|
clicked = false
|
|
var pos: Vector2i = world_to_game_pos(clicked_pos)
|
|
if pos == Vector2i(-1, -1):
|
|
return
|
|
MatchChannel.send_request_place(pos.x, pos.y)
|
|
|
|
|
|
func on_match_update(msg: TowerPlacedMessage) -> void:
|
|
if msg.map == TowerPlacedMessage.GamePlayerMaps.PLAYER:
|
|
player_tower_map.set_cell(Vector2i(msg.x, msg.y), 1, Vector2i(0, 0))
|
|
else:
|
|
opponent_tower_map.set_cell(Vector2i(msg.x, msg.y), 1, Vector2i(0, 0))
|
|
|
|
|
|
func world_to_game_pos(world_pos: Vector2) -> Vector2i:
|
|
if (
|
|
world_pos.x < self.position.x
|
|
|| world_pos.x > self.position.x + map_size.x * tile_set.tile_size.x
|
|
):
|
|
return Vector2i(-1, -1)
|
|
return Vector2i(
|
|
(world_pos.x - self.position.x) / tile_set.tile_size.x,
|
|
world_pos.y / tile_set.tile_size.y,
|
|
)
|