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, )