From b7a871399b3b0570bd23bcb31c524465819ac6a9 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 29 May 2025 13:36:22 +0300 Subject: [PATCH 01/14] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 29 ++++++++++++----------------- scenes/tilemap/tilemap.tscn | 1 - 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 5884b2fc..9af90053 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -78,7 +78,6 @@ var image: = Image.new() var image_load_proc: Callable var now: = 0 var visible_marks_count: = 0 -var mouse_wheel_count: = 0 var map_server_available: = false @@ -200,10 +199,10 @@ func _input(e) -> void: if e is InputEventMouseButton: if e.pressed: if e.button_index == MOUSE_BUTTON_WHEEL_DOWN: - mouse_wheel_count -= 1 + increment_zoom(-zoom_step, lmp) queue_redraw() elif e.button_index == MOUSE_BUTTON_WHEEL_UP: - mouse_wheel_count += 1 + increment_zoom( zoom_step, lmp) queue_redraw() if e.button_index == MOUSE_BUTTON_LEFT: @@ -236,10 +235,15 @@ func multiply_zoom(multiplier: float, pivot: Vector2) -> void: _xyz.y -= p2.y - p1.y -func set_zoom(zoom: float, pivot=null) -> void: - if pivot == null: - pivot = $canvas.size / 2.0 +func increment_zoom(increment: float, pivot: Vector2) -> void: + var p1: = screen_to_world(_xyz, pivot.x, pivot.y) + _xyz.z = clampf(_xyz.z + increment, min_zoom_level, max_zoom_level) + var p2: = screen_to_world(_xyz, pivot.x, pivot.y) + _xyz.x -= p2.x - p1.x + _xyz.y -= p2.y - p1.y + +func set_zoom(zoom: float, pivot: Vector2) -> void: var p1: = screen_to_world(_xyz, pivot.x, pivot.y) _xyz.z = clampf(zoom, max_zoom_level, min_zoom_level) var p2: = screen_to_world(_xyz, pivot.x, pivot.y) @@ -248,15 +252,6 @@ func set_zoom(zoom: float, pivot=null) -> void: func _draw() -> void: - - var lmp = get_local_mouse_position() - if mouse_wheel_count > 0: - multiply_zoom(1.0 + zoom_step, lmp) - mouse_wheel_count -= 1 - elif mouse_wheel_count < 0: - multiply_zoom(1.0 - zoom_step, lmp) - mouse_wheel_count += 1 - var z = min(max_zoom_level, _xyz.z) var t1 = screen_to_tile(0, 0, z) var t2 = screen_to_tile($canvas.size.x, $canvas.size.y, z) @@ -528,7 +523,7 @@ func xyz_to_idx(x: float, y: float, z: float) -> int: return int(i + (y * n + x)) -func get_tile(x: int, y: int, z: int, create: bool = true) -> Tile: +func get_tile(x: int, y: int, z: int) -> Tile: var n = pow(2, z) if x >= 0: @@ -560,7 +555,7 @@ func get_tile(x: int, y: int, z: int, create: bool = true) -> Tile: return tile var queue_size: = _queue.size() - if create and (not $canvas/player.is_playing()): + if not $canvas/player.is_playing(): if not tile: tile = Tile.new(idx, x, y, z) tile.url = base_url.replace('{x}', str(x)).replace('{y}', str(y)).replace('{z}', str(z)) diff --git a/scenes/tilemap/tilemap.tscn b/scenes/tilemap/tilemap.tscn index aa619a98..c00214d4 100644 --- a/scenes/tilemap/tilemap.tscn +++ b/scenes/tilemap/tilemap.tscn @@ -31,7 +31,6 @@ script = ExtResource("1_l64tp") base_url = "http://192.168.11.105:8001/osm_tiles/{z}/{x}/{y}.png" max_zoom_level = 15 max_zoom_level_server = 10 -az = 2.0 [node name="canvas" type="TextureRect" parent="." groups=["gui_items"]] clip_contents = true From 4e5df25019a75b6bc7640344947aecb332b4aa73 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 29 May 2025 13:37:02 +0300 Subject: [PATCH 02/14] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 9af90053..e4b94aa1 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -209,7 +209,6 @@ func _input(e) -> void: _dragging = e.pressed _drag_pos = screen_to_world(_xyz, lmp.x, lmp.y) - elif e is InputEventMouseMotion: if _dragging: var wp = screen_to_world(_xyz, lmp.x, lmp.y) @@ -311,7 +310,7 @@ func _clean_cache() -> void: func _process(delta) -> void: now += delta - # if cache is overflowing - clean it + # Если кэш переполнен - очистить его. if not _last_cache_check or now - _last_cache_check > 5: _last_cache_check = now _clean_cache() @@ -611,7 +610,7 @@ func haversine_m(lat1: float, lon1: float, lat2: float, lon2: float) -> float: var rlon1: = deg_to_rad(lon1) var rlat2: = deg_to_rad(lat2) var rlon2: = deg_to_rad(lon2) - # вычисления длины большого круга + # вычисление длины большого круга var cl1: = cos(rlat1) var cl2: = cos(rlat2) var sl1: = sin(rlat1) From 2f050d34c3fcfc37e32249f2bc52610705098c8d Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 29 May 2025 13:38:37 +0300 Subject: [PATCH 03/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=91=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=B1?= =?UTF-8?q?=D1=8B=D1=81=D1=82=D1=80=D0=BE=D0=B5=20=D0=BC=D0=B0=D1=81=D1=88?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.tscn | 1 + 1 file changed, 1 insertion(+) diff --git a/scenes/tilemap/tilemap.tscn b/scenes/tilemap/tilemap.tscn index c00214d4..39ff3629 100644 --- a/scenes/tilemap/tilemap.tscn +++ b/scenes/tilemap/tilemap.tscn @@ -29,6 +29,7 @@ size = Vector2(400, 400) [node name="tilemap" type="CanvasGroup" groups=["gui_items"]] script = ExtResource("1_l64tp") base_url = "http://192.168.11.105:8001/osm_tiles/{z}/{x}/{y}.png" +zoom_step = 0.1 max_zoom_level = 15 max_zoom_level_server = 10 From fdd3c7dfcafb8b80a76b9a1a8312262a64be52be Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 29 May 2025 13:39:10 +0300 Subject: [PATCH 04/14] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=97=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=91=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/prd.gd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/prd.gd b/scripts/prd.gd index 7809ffd4..151df547 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -341,10 +341,10 @@ func check_dir(): ## Производит приём состояния модулей ФС. -func on_data_capsrpb_received(unit: capsrpb.CapsRpb): - if not unit.json_dic.has('ts'): return - if unit.json_dic['ts'] != 7: return - if not unit.json_dic.has('msfs'): return +func on_data_capsrpb_received(unit0: capsrpb.CapsRpb): + if not unit0.json_dic.has('ts'): return + if unit0.json_dic['ts'] != 7: return + if not unit0.json_dic.has('msfs'): return var msfs = unit.json_dic['msfs'] for fs in msfs: From 2638fad8c1d8fef61c487f0280df301f15516444 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 29 May 2025 15:18:11 +0300 Subject: [PATCH 05/14] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9E=D0=BF=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D1=82=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf5a99cc..6562d51d 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ - Запустить скрипт `build.sh` -# Взаимодействие с 5p28 +# Взаимодействие с 5П-28 - Для получения навигационных данных, должно быть настроено дублирование udp-пакетов приходящих на соответствующий порт. Скрипт `ip-tables-navigation.sh` выполняет From cd5a58433cc40bc144a0b5fbb49afac1fcef24d2 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 30 May 2025 11:37:11 +0300 Subject: [PATCH 06/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=97=D0=B0=D0=BF=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=20=D0=B7=D0=B0=20=D0=BA=D1=80=D0=B0=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 48 +++++++++++++++++++++++++++------------ scenes/работа/работа.tscn | 2 ++ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index e4b94aa1..25f9ca80 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -24,8 +24,8 @@ class_name MercatorTileMap @export_color_no_alpha() var back_color: = Color.BLACK const default_size: = 400.0 var is_centered: = false -var is_anim_playng: = false - +var is_out_border1: = true +var is_out_border2: = true @export var animation_time: float = 0.1: set(val): @@ -65,7 +65,7 @@ var is_anim_playng: = false return _xyz.z -var _xyz: Vector3 = Vector3(0, 0, min_zoom_level) +var _xyz: Vector3 = Vector3(0, 0, 0) var _cache: Dictionary = {} var _queue: Dictionary = {} var _dragging: bool = false @@ -111,6 +111,7 @@ func get_marks_count(): return _marks.size() func _ready() -> void: + _xyz.z = min_zoom_level image_type = 'png' $canvas.connect('mouse_entered', func(): _rollover = true) $canvas.connect('mouse_exited', func(): _rollover = false) @@ -199,12 +200,12 @@ func _input(e) -> void: if e is InputEventMouseButton: if e.pressed: if e.button_index == MOUSE_BUTTON_WHEEL_DOWN: - increment_zoom(-zoom_step, lmp) - queue_redraw() + if (not is_out_border1) and (not is_out_border2): + increment_zoom(-zoom_step, lmp) + queue_redraw() elif e.button_index == MOUSE_BUTTON_WHEEL_UP: increment_zoom( zoom_step, lmp) queue_redraw() - if e.button_index == MOUSE_BUTTON_LEFT: _dragging = e.pressed _drag_pos = screen_to_world(_xyz, lmp.x, lmp.y) @@ -214,7 +215,17 @@ func _input(e) -> void: var wp = screen_to_world(_xyz, lmp.x, lmp.y) var diff = _drag_pos - wp _xyz.x += diff.x - _xyz.y += diff.y + + if (not is_out_border1) and diff.y >= 0: + _xyz.y += diff.y + if is_out_border1 and diff.y <= 0: + _xyz.y += diff.y + + if is_out_border2 and diff.y >= 0: + _xyz.y += diff.y + if (not is_out_border2) and diff.y <= 0: + _xyz.y += diff.y + queue_redraw() if diff.length() > 0: signaller.emmit(signaller.map_user_panning) @@ -253,11 +264,12 @@ func set_zoom(zoom: float, pivot: Vector2) -> void: func _draw() -> void: var z = min(max_zoom_level, _xyz.z) var t1 = screen_to_tile(0, 0, z) - var t2 = screen_to_tile($canvas.size.x, $canvas.size.y, z) - for tx in range(t1.x, t2.x + 1): - for ty in range(t1.y, t2.y + 1): + var t2 = screen_to_tile($canvas.size.x, $canvas.size.y, z) + Vector2(1, 1) + is_out_border1 = true + is_out_border2 = true + for tx in range(t1.x, t2.x): + for ty in range(t1.y, t2.y): _draw_tile(tx, ty, z) - var n = pow(2, z) var dx = n * tile_width var c = $canvas.size / 2.0 @@ -295,7 +307,6 @@ func get_next_in_queue() -> Tile: return tile -# delete oldest tiles from cache func _clean_cache() -> void: var overflow = _cache.size() - max_cached_tiles if overflow <= 0: @@ -365,11 +376,9 @@ func _response(result, code, _headers: Array, body: PackedByteArray, req, tile: push_error('не удалось получить изображение (неверный формат?) из \"%s\"' % tile.url) return - # create texture from image and add it to the cache tile.texture = ImageTexture.create_from_image(image) _cache[tile.i] = tile - # redraw the map queue_redraw() @@ -395,11 +404,19 @@ func _draw_subtile(tx: int, ty: int, tz: int, origx: int, origy: int, origz: flo var rect = Rect2(xrat1 * tile_width, yrat1 * tile_height, xwidth * tile_width, yheight * tile_height) if subtile.texture: + check_borders(p1, p2, $canvas.size.y) draw_texture_rect_region(subtile.texture, Rect2(p1, p2 - p1), rect) return true return false +func check_borders(p1, p2, h): + if p1.y < 0: + is_out_border1 = false + if p1.y + (p2 - p1).y > h: + is_out_border2 = false + + func _draw_tile(tx: int, ty: int, z: float) -> void: var tz = floor(z) var p1 = tile_to_screen(tx, ty, z) @@ -407,6 +424,7 @@ func _draw_tile(tx: int, ty: int, z: float) -> void: var tile = get_tile(tx, ty, tz) if tile: if tile.texture: + check_borders(p1, p2, $canvas.size.y) draw_texture_rect(tile.texture, Rect2(p1, p2 - p1), false, Color.WHITE, false) else: var zzz = tz @@ -416,7 +434,7 @@ func _draw_tile(tx: int, ty: int, z: float) -> void: zzz -= 1 txx = floor(txx / 2.0) tyy = floor(tyy / 2.0) - if _draw_subtile(txx, tyy, zzz, tx, ty,z): + if _draw_subtile(txx, tyy, zzz, tx, ty, z): break diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 9a75da68..736d3d64 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -84,6 +84,8 @@ metadata/_edit_lock_ = true [node name="tilemap" parent="." instance=ExtResource("10_gtwyg")] self_modulate = Color(1, 1, 1, 0.415686) position = Vector2(360, 360) +min_zoom_level = 3 +max_zoom_level_server = 11 [node name="player" type="AnimationPlayer" parent="tilemap"] libraries = { From f0f95d2d87bb54877db95ac0eba5c97e1f9f793a Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 30 May 2025 11:38:38 +0300 Subject: [PATCH 07/14] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9B=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D1=8F=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 25f9ca80..93d5aac4 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -572,13 +572,11 @@ func get_tile(x: int, y: int, z: int) -> Tile: return tile var queue_size: = _queue.size() - if not $canvas/player.is_playing(): - if not tile: - tile = Tile.new(idx, x, y, z) - tile.url = base_url.replace('{x}', str(x)).replace('{y}', str(y)).replace('{z}', str(z)) - tile.t = now - if z <= max_zoom_level_server: - _queue[idx] = tile + tile = Tile.new(idx, x, y, z) + tile.url = base_url.replace('{x}', str(x)).replace('{y}', str(y)).replace('{z}', str(z)) + tile.t = now + if z <= max_zoom_level_server: + _queue[idx] = tile if queue_size == 0 and _queue.size(): emit_signal('load_started') From b1e43c5c08a223ef3a4a6eea6766757cec5e8bd2 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 30 May 2025 11:38:50 +0300 Subject: [PATCH 08/14] Godot4.4 --- scenes/работа/работа.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 736d3d64..199f1828 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -287,6 +287,6 @@ texture_pressed = ExtResource("13_ggrwd") [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] From 86e9fe8cb1beaa984aef26f138708b327229fdad Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 30 May 2025 13:57:34 +0300 Subject: [PATCH 09/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=92=D1=8B=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=81=D1=82=D1=80=D0=BE=D0=B1=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D0=BE=D0=B1=D0=B7=D0=BE?= =?UTF-8?q?=D1=80=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B,=20?= =?UTF-8?q?=D1=82.=D0=BA.=20=D0=BE=D0=BD=20=D0=BD=D0=B0=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=B0=D1=80=D1=82=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/diagram/diagram.gd | 10 +++++++++- scenes/работа/работа.gd | 12 ++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/scenes/diagram/diagram.gd b/scenes/diagram/diagram.gd index 7be13d4a..008dcd31 100644 --- a/scenes/diagram/diagram.gd +++ b/scenes/diagram/diagram.gd @@ -29,9 +29,17 @@ func get_radius_outter() -> float: return material.get('shader_parameter/radius func get_radius_inner_0() -> float: return material.get('shader_parameter/radius_inner_0') func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1') -func set_view_mode(val: int): material.set('shader_parameter/mode', val); func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val) + +func set_view_mode(val: int): + if val == 1: + $строб.hide() + else: + $строб.show() + material.set('shader_parameter/mode', val) + + ## Закрашивание по умолчанию блоков ФС цветами из настроек. func set_def_colors(): var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51)) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 3096fbf6..ea8f9365 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -29,7 +29,7 @@ var shift_pressed: bool ## Кнопка SHIFT нажата. var strob_band_begin: float ## Ширина строба в момент начала перетаскивания. var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания. var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания. - +var view_mode: MapViewMode ## Режим отображения карты signal drag_begin ## Вызывается в момент начала перетаскивания. signal drag_continue ## Вызывается во время продолжения перетаскивания. @@ -59,6 +59,13 @@ enum BtnSel { } +## Режим отображения карты +enum MapViewMode { + RTO = 0, ## Режим приоритет РТО (малая карта, широкие секторы) + RLS = 1 ## Режим приоритет РЛС (большая карта, узкие секторы) + } + + const VAL_TO_EVENT = { false: 'manual_control', ## Выбор целей и установка помех вручную. true: 'full_auto' } ## Выбор целей и установка помех автоматически. @@ -86,6 +93,7 @@ func on_button_view_toggled(toggled: bool): var s = map_sizes[int(toggled)] $tilemap.size = s.size $tilemap.position = s.position + view_mode = MapViewMode.RLS if toggled else MapViewMode.RTO ## Встроенный обратный вызов. @@ -379,7 +387,7 @@ func _on_drag_begin(event) -> void: ## Обработчик событий ввода. Вызывается godot. func _input(event) -> void: if not is_visible_in_tree(): return - if event is InputEventMouseMotion: + if (event is InputEventMouseMotion) and (view_mode == MapViewMode.RTO): if drag_fsm == DragFSM.DRAG: emit_signal('drag_continue', event) elif event is InputEventMouseButton: From 744bb9ebdd1cf8a7a886fb3758f6d32e932dc46d Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 2 Jun 2025 09:20:03 +0300 Subject: [PATCH 10/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9F=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D1=8B=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B8=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D1=86=D0=B5=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.tscn | 3 --- 1 file changed, 3 deletions(-) diff --git a/scenes/tilemap/tilemap.tscn b/scenes/tilemap/tilemap.tscn index 39ff3629..3192fa60 100644 --- a/scenes/tilemap/tilemap.tscn +++ b/scenes/tilemap/tilemap.tscn @@ -28,10 +28,7 @@ size = Vector2(400, 400) [node name="tilemap" type="CanvasGroup" groups=["gui_items"]] script = ExtResource("1_l64tp") -base_url = "http://192.168.11.105:8001/osm_tiles/{z}/{x}/{y}.png" zoom_step = 0.1 -max_zoom_level = 15 -max_zoom_level_server = 10 [node name="canvas" type="TextureRect" parent="." groups=["gui_items"]] clip_contents = true From 0dc8e69785a383b2268b6a06954c25b7188af7de Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 3 Jun 2025 13:01:27 +0300 Subject: [PATCH 11/14] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 104 ++++++++++++++------------------------ 1 file changed, 39 insertions(+), 65 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 93d5aac4..6c15e782 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -142,16 +142,12 @@ func _on_resize() -> void: ## Создаёт новую отметку из координат экрана -func add_mark_from_screen_pos(id: int, x: float, y: float, mark: Node) -> bool: +func add_mark_from_screen_pos(id: int, scr_xy: Vector2, mark: Node) -> bool: if _marks.has(id): return false - var wrld_pos = screen_to_world(_xyz, x, y) - var p = world_to_tile(wrld_pos.x, wrld_pos.y, _xyz.z) - var tile_index = xyz_to_idx(p.x, p.y, _xyz.z) - var dot = { 'position': wrld_pos, 'tile_index': tile_index, 'mark': mark } - _marks[id] = dot + var wrld_pos = screen_to_world(_xyz, scr_xy) + _marks[id] = { 'position': wrld_pos, 'mark': mark, 'gap_size': 0.0 } add_child(mark) - fix_mark_position(dot) return true @@ -169,9 +165,7 @@ func add_mark_from_lon_lat(id: int, lon: float, lat: float, mark: Node, gap_size if _marks.has(id): return false var wrld_pos = lonlat_to_world(lon, lat) - var scr_pos = world_to_screen(wrld_pos.x, wrld_pos.y) - mark.set_global_position(scr_pos) - _marks[id] = {'position': wrld_pos, 'mark': mark, 'gap_size': gap_size } + _marks[id] = {'position': wrld_pos, 'mark': mark, 'gap_size': gap_size} add_child(mark) queue_redraw() return true @@ -189,7 +183,7 @@ func fix_mark_position(dot) -> void: func is_mark_visible(dot) -> bool: - var screen_pos = world_to_screen(dot.position.x, dot.position.y) + var screen_pos = world_to_screen(dot.position) return screen_pos.x > 0 and screen_pos.x < $canvas.size.x @@ -208,11 +202,11 @@ func _input(e) -> void: queue_redraw() if e.button_index == MOUSE_BUTTON_LEFT: _dragging = e.pressed - _drag_pos = screen_to_world(_xyz, lmp.x, lmp.y) + _drag_pos = screen_to_world(_xyz, lmp) elif e is InputEventMouseMotion: if _dragging: - var wp = screen_to_world(_xyz, lmp.x, lmp.y) + var wp = screen_to_world(_xyz, lmp) var diff = _drag_pos - wp _xyz.x += diff.x @@ -231,40 +225,34 @@ func _input(e) -> void: signaller.emmit(signaller.map_user_panning) -## Возвращает true, если видна область за краем карты -func is_border_visible(): - var z = min(max_zoom_level, _xyz.z) - return screen_to_tile(0, 0, z).y != 0 - - func multiply_zoom(multiplier: float, pivot: Vector2) -> void: - var p1: = screen_to_world(_xyz, pivot.x, pivot.y) + var p1: = screen_to_world(_xyz, pivot) _xyz.z = clampf(_xyz.z * multiplier, min_zoom_level, max_zoom_level) - var p2: = screen_to_world(_xyz, pivot.x, pivot.y) + var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y func increment_zoom(increment: float, pivot: Vector2) -> void: - var p1: = screen_to_world(_xyz, pivot.x, pivot.y) + var p1: = screen_to_world(_xyz, pivot) _xyz.z = clampf(_xyz.z + increment, min_zoom_level, max_zoom_level) - var p2: = screen_to_world(_xyz, pivot.x, pivot.y) + var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y func set_zoom(zoom: float, pivot: Vector2) -> void: - var p1: = screen_to_world(_xyz, pivot.x, pivot.y) + var p1: = screen_to_world(_xyz, pivot) _xyz.z = clampf(zoom, max_zoom_level, min_zoom_level) - var p2: = screen_to_world(_xyz, pivot.x, pivot.y) + var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y func _draw() -> void: var z = min(max_zoom_level, _xyz.z) - var t1 = screen_to_tile(0, 0, z) - var t2 = screen_to_tile($canvas.size.x, $canvas.size.y, z) + Vector2(1, 1) + var t1 = screen_to_tile(Vector2(0, 0), z) + var t2 = screen_to_tile($canvas.size, z) + Vector2(1, 1) is_out_border1 = true is_out_border2 = true for tx in range(t1.x, t2.x): @@ -272,29 +260,21 @@ func _draw() -> void: _draw_tile(tx, ty, z) var n = pow(2, z) var dx = n * tile_width - var c = $canvas.size / 2.0 - var r = min($canvas.size.x, $canvas.size.y) / 2.0 + var c: Vector2 = $canvas.size / 2.0 + var r = c.length() visible_marks_count = 0 for dot in _marks.values(): - var pos = world_to_screen(dot.position.x, dot.position.y) - if pos.x >= 0: - pos.x = fmod(pos.x, dx) - else: - pos.x = -pos.x - 1 - pos.x = int(dx - 1) - fmod(pos.x, dx) - dot.mark.position = pos - dot.mark.visible = c.distance_to(pos) < (r - dot.gap_size) + var scr_pos = world_to_screen(dot.position) + scr_pos.x = posmod(scr_pos.x, dx) + dot.mark.position = scr_pos + dot.mark.visible = c.distance_to(scr_pos) < (r - dot.gap_size) visible_marks_count += int(dot.mark.visible) func _clean_all() -> void: _queue.clear() _cache.clear() - _marks.clear() _req_count = 0 - for c in get_children().filter(func (item): return not item.is_in_group('gui_items')): - remove_child(c) - c.queue_free() # get the tile from queue with the newest timestamp @@ -449,7 +429,7 @@ func lonlat_to_world(lon: float, lat: float) -> Vector2: ## convert lon/lat to screen coords func lonlat_to_screen(lon: float, lat: float) -> Vector2: var w = lonlat_to_world(lon, lat) - return world_to_screen(w.x, w.y) + return world_to_screen(w) ## convert lon/lat to tile coords @@ -466,8 +446,8 @@ func world_to_lonlat(wx: float, wy: float) -> Vector2: ## convert screen coords to lon/lat -func screen_to_lonlat(sx: float, sy: float) -> Vector2: - var w = screen_to_world(_xyz, sx, sy) +func screen_to_lonlat(scr_xy: Vector2) -> Vector2: + var w = screen_to_world(_xyz, scr_xy) return world_to_lonlat(w.x, w.y) @@ -478,12 +458,12 @@ func tile_to_lonlat(tx: float, ty: float, tz: float) -> Vector2: ## convert screen coords to world coords -func screen_to_world(xyz: Vector3, sx: float, sy: float) -> Vector2: +func screen_to_world(xyz: Vector3, s: Vector2) -> Vector2: var n = pow(2.0, xyz.z) var span_w = n * tile_width var span_h = n * tile_height - var px = sx - $canvas.size.x / 2 + span_w / 2 - var py = sy - $canvas.size.y / 2 + span_h / 2 + var px = s.x - $canvas.size.x / 2 + span_w / 2 + var py = s.y - $canvas.size.y / 2 + span_h / 2 var xr = px / span_w var yr = py / span_h var x = (xr * 2.0 - 1.0) + xyz.x @@ -492,15 +472,15 @@ func screen_to_world(xyz: Vector3, sx: float, sy: float) -> Vector2: ## convert screen coords to tile coords -func screen_to_tile(sx: float, sy: float, z: float) -> Vector2: - var world = screen_to_world(_xyz, sx, sy) +func screen_to_tile(scr_xy: Vector2, z: float) -> Vector2: + var world = screen_to_world(_xyz, scr_xy) return world_to_tile(world.x, world.y, z) ## convert tile coords to screen coords func tile_to_screen(tx: float, ty: float, tz: float) -> Vector2: var w = tile_to_world(tx, ty, tz) - return world_to_screen(w.x, w.y) + return world_to_screen(w) ## convert tile coords to world coords @@ -513,30 +493,24 @@ func tile_to_world(tx: float, ty: float, tz: float) -> Vector2: ## convert world coords to tile coords func world_to_tile(wx: float, wy: float, z: float) -> Vector2: - var n: = pow(2.0, floor(z)) - var tx: = ((wx + 1.0) / 2.0) * n - var ty: = ((-wy + 1.0) / 2.0) * n - tx = floor(tx) - ty = floor(ty) + var n: float = pow(2.0, floor(z)) + var tx: float = floor(((wx + 1.0) / 2.0) * n) + var ty: float = floor(((-wy + 1.0) / 2.0) * n) return Vector2(tx, ty) ## convert world coords to screen coords -func world_to_screen(wx: float, wy: float) -> Vector2: +func world_to_screen(pos: Vector2) -> Vector2: var n: = pow(2.0, _xyz.z) - var w: = n * tile_width - var h: = n * tile_height - var xr: = ((wx - _xyz.x) + 1.0) / 2.0 - var yr: = (-(wy - _xyz.y) + 1.0) / 2.0 - var x = w * xr - w / 2.0 + $canvas.size.x / 2.0 - var y = h * yr - h / 2.0 + $canvas.size.y / 2.0 - return Vector2(x, y) + var wh: = Vector2(n * tile_width, n * tile_height) + var rxy: = Vector2(((pos.x - _xyz.x) + 1.0) / 2.0, (-(pos.y - _xyz.y) + 1.0) / 2.0) + return wh * rxy + ($canvas.size - wh) / 2.0 ## get the tile index from xyz tile coords func xyz_to_idx(x: float, y: float, z: float) -> int: var i: = (pow(4.0, z) - 1.0) / 3.0 - var n: = pow(2.0, z) + var n: = pow(2.0, z) return int(i + (y * n + x)) @@ -655,7 +629,7 @@ func find_at_screen_position(screen_pos: Vector2) -> Node: var closest_dot = null var closest_distance = INF for mark in _marks.values(): - var dot_screen_pos = world_to_screen(mark.position.x, mark.position.y) + var dot_screen_pos = world_to_screen(mark.position) var distance = dot_screen_pos.distance_to(screen_pos) if distance < closest_distance: closest_distance = distance From e4814472d982626c5810b73b97645f0691857e9a Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 3 Jun 2025 13:58:44 +0300 Subject: [PATCH 12/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B=20=D0=BA=20=D0=BA?= =?UTF-8?q?=D1=80=D0=B0=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 36 +++++++++++++++++++++++++++--------- scenes/tilemap/tilemap.tscn | 1 + scenes/работа/работа.tscn | 1 + 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 6c15e782..302c1036 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -13,7 +13,7 @@ class_name MercatorTileMap _clean_all() queue_redraw() -@export var zoom_step: float = 0.025 +@export var zoom_step: float = 0.1 @export var tile_width: float = 256.0 @export var tile_height: float = 256.0 @export_range(1, 1000, 1) var max_concurrent_requests:int = 5 @@ -79,7 +79,7 @@ var image_load_proc: Callable var now: = 0 var visible_marks_count: = 0 var map_server_available: = false - +var border: ImageTexture ## Вызывается после того, как загрузка плиток завершена signal load_completed() @@ -111,6 +111,13 @@ func get_marks_count(): return _marks.size() func _ready() -> void: + var img: = Image.create($canvas.size.x, $canvas.size.y / 10, false, Image.FORMAT_RGBA8) + var sz = img.get_size() + for x in sz.x: + for y in sz.y: + img.set_pixel(x, y, Color.CORAL) + border = ImageTexture.create_from_image(img) + _xyz.z = min_zoom_level image_type = 'png' $canvas.connect('mouse_entered', func(): _rollover = true) @@ -190,6 +197,7 @@ func is_mark_visible(dot) -> bool: func _input(e) -> void: var lmp = get_local_mouse_position() if not _rollover: + _dragging = false return if e is InputEventMouseButton: if e.pressed: @@ -250,6 +258,7 @@ func set_zoom(zoom: float, pivot: Vector2) -> void: func _draw() -> void: + # Рисование плиток var z = min(max_zoom_level, _xyz.z) var t1 = screen_to_tile(Vector2(0, 0), z) var t2 = screen_to_tile($canvas.size, z) + Vector2(1, 1) @@ -258,6 +267,7 @@ func _draw() -> void: for tx in range(t1.x, t2.x): for ty in range(t1.y, t2.y): _draw_tile(tx, ty, z) + # Рисование отметок var n = pow(2, z) var dx = n * tile_width var c: Vector2 = $canvas.size / 2.0 @@ -269,6 +279,14 @@ func _draw() -> void: dot.mark.position = scr_pos dot.mark.visible = c.distance_to(scr_pos) < (r - dot.gap_size) visible_marks_count += int(dot.mark.visible) + # Рисование границ + var p1 = $canvas.position + var p2 = $canvas.size / Vector2(1, 20) + if is_out_border1 and _dragging: + draw_texture_rect(border, Rect2(p1, p2), false, Color.WHITE, false) + p1.y = p1.y + $canvas.size.y - p2.y + if is_out_border2 and _dragging: + draw_texture_rect(border, Rect2(p1, p2), false, Color.WHITE, false) func _clean_all() -> void: @@ -398,18 +416,18 @@ func check_borders(p1, p2, h): func _draw_tile(tx: int, ty: int, z: float) -> void: - var tz = floor(z) - var p1 = tile_to_screen(tx, ty, z) - var p2 = tile_to_screen(tx + 1, ty + 1, z) - var tile = get_tile(tx, ty, tz) + var tz: float = floor(z) + var p1: = tile_to_screen(tx, ty, z) + var p2: = tile_to_screen(tx + 1, ty + 1, z) + var tile: = get_tile(tx, ty, tz) if tile: if tile.texture: check_borders(p1, p2, $canvas.size.y) draw_texture_rect(tile.texture, Rect2(p1, p2 - p1), false, Color.WHITE, false) else: - var zzz = tz - var txx = tx - var tyy = ty + var zzz: float = tz + var txx: = tx + var tyy: = ty while zzz > 1: zzz -= 1 txx = floor(txx / 2.0) diff --git a/scenes/tilemap/tilemap.tscn b/scenes/tilemap/tilemap.tscn index 3192fa60..40e8eb5b 100644 --- a/scenes/tilemap/tilemap.tscn +++ b/scenes/tilemap/tilemap.tscn @@ -28,6 +28,7 @@ size = Vector2(400, 400) [node name="tilemap" type="CanvasGroup" groups=["gui_items"]] script = ExtResource("1_l64tp") +border_scene = "uid://bumg0moa26skt" zoom_step = 0.1 [node name="canvas" type="TextureRect" parent="." groups=["gui_items"]] diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 199f1828..442c2dcd 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -86,6 +86,7 @@ self_modulate = Color(1, 1, 1, 0.415686) position = Vector2(360, 360) min_zoom_level = 3 max_zoom_level_server = 11 +az = 3.0 [node name="player" type="AnimationPlayer" parent="tilemap"] libraries = { From 921ac8eef327888ea9e91850d991030cc22b346c Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 3 Jun 2025 14:19:28 +0300 Subject: [PATCH 13/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B=20=D0=BA=20=D0=BA?= =?UTF-8?q?=D1=80=D0=B0=D1=8E.=20=D0=93=D1=80=D0=B0=D0=B4=D0=B8=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=BD=D0=B4=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 302c1036..4e4ec184 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -79,7 +79,8 @@ var image_load_proc: Callable var now: = 0 var visible_marks_count: = 0 var map_server_available: = false -var border: ImageTexture +var border1: ImageTexture +var border2: ImageTexture ## Вызывается после того, как загрузка плиток завершена signal load_completed() @@ -111,12 +112,13 @@ func get_marks_count(): return _marks.size() func _ready() -> void: - var img: = Image.create($canvas.size.x, $canvas.size.y / 10, false, Image.FORMAT_RGBA8) - var sz = img.get_size() - for x in sz.x: - for y in sz.y: - img.set_pixel(x, y, Color.CORAL) - border = ImageTexture.create_from_image(img) + var img: = Image.create(1, 2, false, Image.FORMAT_RGBA8) + img.set_pixel(0, 0, Color.CORAL) + img.set_pixel(0, 1, Color(1, 1, 1, 0)) + border1 = ImageTexture.create_from_image(img) + img.set_pixel(0, 0, Color(1, 1, 1, 0)) + img.set_pixel(0, 1, Color.CORAL) + border2 = ImageTexture.create_from_image(img) _xyz.z = min_zoom_level image_type = 'png' @@ -283,10 +285,10 @@ func _draw() -> void: var p1 = $canvas.position var p2 = $canvas.size / Vector2(1, 20) if is_out_border1 and _dragging: - draw_texture_rect(border, Rect2(p1, p2), false, Color.WHITE, false) + draw_texture_rect(border1, Rect2(p1, p2), false, Color.WHITE, false) p1.y = p1.y + $canvas.size.y - p2.y if is_out_border2 and _dragging: - draw_texture_rect(border, Rect2(p1, p2), false, Color.WHITE, false) + draw_texture_rect(border2, Rect2(p1, p2), false, Color.WHITE, false) func _clean_all() -> void: From 41d73ac026082bcde46e613c127460930a244e5f Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 3 Jun 2025 14:20:10 +0300 Subject: [PATCH 14/14] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BE=D1=82=D0=BC=D0=B5=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/dot.png | Bin 0 -> 1113 bytes scenes/tilemap/dot.png.import | 34 ++++++++++++++++++++++++++++++++++ scenes/tilemap/mark.gd | 4 ++++ scenes/tilemap/mark.gd.uid | 1 + scenes/tilemap/mark.tscn | 13 +++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 scenes/tilemap/dot.png create mode 100644 scenes/tilemap/dot.png.import create mode 100644 scenes/tilemap/mark.gd create mode 100644 scenes/tilemap/mark.gd.uid create mode 100644 scenes/tilemap/mark.tscn diff --git a/scenes/tilemap/dot.png b/scenes/tilemap/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad2af72b5b5e6642d45916e89b127dabe1a10e5 GIT binary patch literal 1113 zcmV-f1g86mP)240gym#+8-~H~-cb+jt-h4alAeZay zH^v0;vliV>2!_u9>jXom1Orb6ov*sL&2quaHNlMq!PE@!14g}o7iN9Fo^E4IX3qiu z!6o=v4IzVqWv>N~4hWvTA=p?USo2IU78X3xuY3R2Ex42toVzMGwJP}TvEWLV;93g; z*NF}m5s+WI9smdjao;dzHZFLqO7POO;KfqGI?QOKU9hxK@DMVZb zMxNmLPv|DLOTvxSPfU-)amjd!q3*M>) z^tj_sbBqA$M){(vsCke31aIODF)&5diEsUEJuYh!yXyijJ0X-qhg? zTE}+Y5~$V38FzJVZe=)z%=|tJFBFJ*&6B*TgSx2G7{^-k6Z#zIamHQU_r^-WgVq9? zCwaR%2B?#|nE_FKbK?bu=QxiucUM2?txEHz4(gLs|N$}1~xZoI&_=eXY^0q|?y z)InX;X<`gOrM|24%F3IYXJ)=YCQt`;QKzYN^v#S#3h(N?vbr}nueFHQL0th?7XuK~ z)ftNv_pToDXaGW52X(nsXwWHkKY#&9>w27JDXTNLNby?R&^oA#I!)Tq)fbHj*5fQo z-RjJ1Eva=-SH{)F03@^nLnDIqIIA$vwPme?x~S76SPU(}P*{Nj)1-}vauh?p29Mka zvf4*TPHJa~7MuCS42Wybjn)$#7#b0t$%JLin>whAI!)Zs9vaO?dTz9y=)mO8v;ZzK2>%tGqSp0j>B=u zgS^O-yj`0-?|Z?2Tl`bekCx)s`EbCwC7BTCb