From d37b56c1329d9b2e6dd6fbea3e39a8baafca34db Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Thu, 16 Nov 2023 15:25:01 +0300 Subject: [PATCH 1/3] godot4 --- scenes/canvas.tscn | 4 ++-- scenes/работа.tscn | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scenes/canvas.tscn b/scenes/canvas.tscn index 641236f..112ec0b 100644 --- a/scenes/canvas.tscn +++ b/scenes/canvas.tscn @@ -8,7 +8,7 @@ [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2bft1"] size = Vector2(1600, 1200) -[sub_resource type="ShaderMaterial" id="ShaderMaterial_ys1x2"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_51ay6"] resource_local_to_scene = true shader = ExtResource("4_q0nxn") shader_parameter/color = Color(1, 1, 1, 0.168627) @@ -26,6 +26,6 @@ centered = false script = ExtResource("2_clpjo") [node name="строб" parent="." instance=ExtResource("3_kddns")] -material = SubResource("ShaderMaterial_ys1x2") +material = SubResource("ShaderMaterial_51ay6") position = Vector2(560, 560) scale = Vector2(1100, 1100) diff --git a/scenes/работа.tscn b/scenes/работа.tscn index 23bebdc..42dbe7c 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -8,11 +8,11 @@ [ext_resource type="PackedScene" uid="uid://dymo732qc2doa" path="res://scenes/count_all_pad.tscn" id="6_e3re7"] [ext_resource type="PackedScene" uid="uid://bwti82byphl68" path="res://scenes/count_danger_pad.tscn" id="7_2arls"] [ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button-flat.tscn" id="8_k0iv2"] -[ext_resource type="PackedScene" uid="uid://0uqi1ghf7sma" path="res://scenes/btn_zoom.tscn" id="9_oey3x"] +[ext_resource type="PackedScene" uid="uid://0uqi1ghf7sma" path="res://scenes/btn_scale.tscn" id="9_oey3x"] [ext_resource type="PackedScene" uid="uid://bbq6nklh36yij" path="res://scenes/tilemap.tscn" id="10_gtwyg"] [ext_resource type="Shader" path="res://shaders/tilemap.gdshader" id="11_ekapd"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_idugi"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_jobxp"] resource_local_to_scene = true shader = ExtResource("11_ekapd") shader_parameter/radius = 0.39 @@ -45,7 +45,7 @@ offset_bottom = 1170.0 metadata/_edit_lock_ = true [node name="tilemap" parent="." instance=ExtResource("10_gtwyg")] -material = SubResource("ShaderMaterial_idugi") +material = SubResource("ShaderMaterial_jobxp") [node name="canvas" parent="." instance=ExtResource("4_lryxs")] metadata/_edit_lock_ = true From 5ab6ce9e343e53fa4a5661ab02ee8bffe0df91df Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Mon, 20 Nov 2023 13:51:26 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=92=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5/=D0=92=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85.=20=D0=92=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/canvas.tscn | 4 ++-- scenes/scroll-ecm-list.gd | 46 ++++++++++++++++++++++++++++++++++++++- scenes/работа.tscn | 4 ++-- scripts/interfer.gd | 19 ++++++++++------ 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/scenes/canvas.tscn b/scenes/canvas.tscn index 112ec0b..ea06dbd 100644 --- a/scenes/canvas.tscn +++ b/scenes/canvas.tscn @@ -8,7 +8,7 @@ [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2bft1"] size = Vector2(1600, 1200) -[sub_resource type="ShaderMaterial" id="ShaderMaterial_51ay6"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_lniyv"] resource_local_to_scene = true shader = ExtResource("4_q0nxn") shader_parameter/color = Color(1, 1, 1, 0.168627) @@ -26,6 +26,6 @@ centered = false script = ExtResource("2_clpjo") [node name="строб" parent="." instance=ExtResource("3_kddns")] -material = SubResource("ShaderMaterial_51ay6") +material = SubResource("ShaderMaterial_lniyv") position = Vector2(560, 560) scale = Vector2(1100, 1100) diff --git a/scenes/scroll-ecm-list.gd b/scenes/scroll-ecm-list.gd index 94086e6..1b4e4f5 100644 --- a/scenes/scroll-ecm-list.gd +++ b/scenes/scroll-ecm-list.gd @@ -19,6 +19,24 @@ const INTERFER_STATE = { 4: 'Неисправность', 5: 'Передача' } + +## Состояние выполнения сеанса помехи +const INTERFER_NAMES = { + 'off': 'Откл', + 'mchm1': 'МЧМ-1', + 'srni1': 'СРН-И1', + 'srnm2': 'СРН-М2', + 'pdm4': 'ПД-М4', + 'pdm2': 'ПД-М2', + 'lchm1': 'ЛЧМ-1', + 'pdm4s': 'ПД-М4С', + 'pdchm': 'ПД-ЧМ', + 'svi1': 'СВ-И1', + 'k1': 'K1', + 'svm2': 'СВ-М2', + 'ozp1': 'ОЗП-1'} + + ## Индексы колонок const COLUMN_NUMBER = 0 const COLUMN_NAME = 1 @@ -41,7 +59,33 @@ func init_table(): func on_interfer_new(ecm, table_index): - print_debug() + var row = map_th_to_row(ecm) + if table_index.has(ecm.ispp): + var i_row = table_index[ecm.ispp] + $table.set_row_text(i_row, row) + else: + var i_row = $table.get_rows_count() + $table.add_row(TABLE_ROW) + $table.set_row_text(i_row, row) + $table.set_row_editable(i_row, false) + $table.set_node_user_data(0, i_row, ecm) + table_index[ecm.ispp] = i_row + + +## Преобразует цель в строку таблицы +func map_th_to_row(ecm) -> Array: + var row: = Array() + row.resize(TABLE_ROW.size()) + row[COLUMN_NUMBER] = '%s' % ecm.ispp + row[COLUMN_NAME] = '' + if INTERFER_NAMES.has(ecm.krp): + row[COLUMN_NAME] = '%s' % ecm.krp + row[COLUMN_FREQ] = '%s' % ecm.params['freq'] + row[COLUMN_AOA] = '%s' % ecm.kni + row[COLUMN_STATE] = '' + if INTERFER_STATE.has(ecm.svk): + row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk] + return row # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/scenes/работа.tscn b/scenes/работа.tscn index 42dbe7c..dfa09c0 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -12,7 +12,7 @@ [ext_resource type="PackedScene" uid="uid://bbq6nklh36yij" path="res://scenes/tilemap.tscn" id="10_gtwyg"] [ext_resource type="Shader" path="res://shaders/tilemap.gdshader" id="11_ekapd"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_jobxp"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mds64"] resource_local_to_scene = true shader = ExtResource("11_ekapd") shader_parameter/radius = 0.39 @@ -45,7 +45,7 @@ offset_bottom = 1170.0 metadata/_edit_lock_ = true [node name="tilemap" parent="." instance=ExtResource("10_gtwyg")] -material = SubResource("ShaderMaterial_jobxp") +material = SubResource("ShaderMaterial_mds64") [node name="canvas" parent="." instance=ExtResource("4_lryxs")] metadata/_edit_lock_ = true diff --git a/scripts/interfer.gd b/scripts/interfer.gd index ac5a85f..3d49b65 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -19,6 +19,7 @@ const ITERFER_MODE = { 'ozp1': ['ОЗП-1', ['freq', 'width']] } const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей +const INTERFER_OFF = 'off' var msg_ss: int = 0 ## счётчик сообщений var id_array: Array ## Массив id воздействий var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия @@ -43,7 +44,7 @@ class Interfer: data_to_json['ss'] = ss data_to_json['ispp'] = ispp data_to_json['krp'] = krp - if krp != 'off': + if krp != INTERFER_OFF: data_to_json['kni'] = kni data_to_json['powp'] = powp # Необходимо добавить управление мощностью data_to_json['get'] = [] @@ -70,17 +71,17 @@ func _ready(): id_array.append(i+1) var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп') var unit = repnetwork.units[unit_key] + unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms)) signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit, ecms)) ## Производит приём состояния помех. [param unit] -> [param ecms] func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): - if not unit.json_dic.has('ts'): return - if not (unit.json_dic['ts'] is int): return - if unit.json_dic['ts'] != 5: return - if not unit.json_dic.has('msvk'): return + if not unit.json_dic.has('ts'): return + if not (unit.json_dic['ts'] is float): return + if unit.json_dic['ts'] != 5: return + if not unit.json_dic.has('msvk'): return if not (unit.json_dic['msvk'] is Array): return - var msvk = unit.json_dic['msvk'] var sz: = ecms.size() for dic_msvk in msvk: @@ -95,7 +96,9 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): else: var ecm = Interfer.new() ecm.set_from_dic(dic_msvk) - ecms[ispp] = ecm + ecm.krp = INTERFER_OFF + var json_data = ecm.get_msg6_data() + unit.tx_stack.append(json_data) ecm.tick_rx = unit.tick if sz != ecms.size(): call_deferred('emit_signal', 'interfer_resized', ecms) @@ -125,7 +128,9 @@ func on_interfer_create(btn, sel_threats, unit, ecms): ecm = ecms[ispp] else: ecm = Interfer.new() + ecm.svk = 5 # Подготовка к передаче сообщения ecm.ispp = ispp + ecms[ispp] = ecm ecm.ss = msg_ss ecm.kni = kni ecm.krp = interfer_name From 5dcaef9ea69984f388b5dffebce810291ea13d5d Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 29 Nov 2023 15:24:35 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=92=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5/=D0=92=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85.=20=D0=A2=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=87=D0=BA=D0=B0=20=D1=81=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B0=D0=BC=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=85=D0=B8.=20=D0=9B=D0=BE=D0=B3=20=D0=B6?= =?UTF-8?q?=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D0=B0=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D0=B2=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8E/=D0=BE=D1=82=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8E=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scenes/bip.gd | 13 ++++- scenes/bip.tscn | 3 +- scenes/frm_ecm_params.tscn | 8 +-- scenes/grd_btns.tscn | 15 +++++- scenes/nine-patch-button.gd | 8 ++- scenes/scroll-ecm-list.gd | 63 +++++++++++++++++++++++- scenes/scroll-ecm-params.gd | 97 +++++++++++++++++++++++++++++++++++++ scenes/scroll-params.gd | 7 +++ scenes/scroll-threats.gd | 17 +++++-- scenes/журнал.gd | 8 ++- scenes/работа.gd | 53 +++++++++++++++----- scenes/эмс.gd | 3 -- scripts/interfer.gd | 61 +++++++++++++++++++---- scripts/signaller.gd | 20 +++++++- scripts/threats.gd | 12 +++-- 16 files changed, 341 insertions(+), 48 deletions(-) create mode 100644 scenes/scroll-ecm-params.gd diff --git a/project.godot b/project.godot index 92217c1..ffae56a 100644 --- a/project.godot +++ b/project.godot @@ -26,6 +26,7 @@ config/map_image_width=512 config/map_minimum_zoom=5 config/map_maximum_zoom=19 config/map_server_addr="https://b.tile.openstreetmap.org" +interfer/resend_timeout=1000.0 [autoload] diff --git a/scenes/bip.gd b/scenes/bip.gd index 1f5b5a3..0264dff 100644 --- a/scenes/bip.gd +++ b/scenes/bip.gd @@ -1,5 +1,6 @@ extends Control +var selected: bool # Called when the node enters the scene tree for the first time. func _ready(): @@ -8,8 +9,16 @@ func _ready(): # Функция делает присваивает заданое значение видимости селектору func set_sel_visible(value: bool): + selected = value $selector.visible = value -func _on_bip_pressed(): - signaller.emit_signal('rto_threat_sel', self) +func _on_bip_gui_input(event): + if event is InputEventMouseButton and event.pressed: + match event.button_index: + MOUSE_BUTTON_LEFT: + signaller.emit_signal('rto_threat_sel', name.to_int()) + MOUSE_BUTTON_RIGHT: + if selected: + signaller.emit_signal('rto_threat_unsel', name.to_int()) + diff --git a/scenes/bip.tscn b/scenes/bip.tscn index 68b9d0f..e6ece75 100644 --- a/scenes/bip.tscn +++ b/scenes/bip.tscn @@ -141,6 +141,7 @@ layout_mode = 0 offset_right = 1.0 offset_bottom = 1.0 scale = Vector2(20, 20) +button_mask = 3 texture_normal = SubResource("PlaceholderTexture2D_w5pye") stretch_mode = 3 @@ -165,4 +166,4 @@ position = Vector2(10, 10) scale = Vector2(26, 26) texture = SubResource("PlaceholderTexture2D_svd33") -[connection signal="pressed" from="bip" to="." method="_on_bip_pressed"] +[connection signal="gui_input" from="bip" to="." method="_on_bip_gui_input"] diff --git a/scenes/frm_ecm_params.tscn b/scenes/frm_ecm_params.tscn index 2e904e7..cef92db 100644 --- a/scenes/frm_ecm_params.tscn +++ b/scenes/frm_ecm_params.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://b1o10yvgjpb0j"] +[gd_scene load_steps=4 format=3 uid="uid://b1o10yvgjpb0j"] [ext_resource type="Texture2D" uid="uid://cs6i1xwx0pmdk" path="res://data/рамка-панели.png" id="1_q1ow7"] [ext_resource type="Script" path="res://table/table.gd" id="2_82yax"] +[ext_resource type="Script" path="res://scenes/scroll-ecm-params.gd" id="2_sm6tk"] [node name="frm_ecm_params" type="NinePatchRect"] size_flags_horizontal = 3 @@ -27,9 +28,10 @@ vertical_alignment = 1 [node name="scroll" type="ScrollContainer" parent="."] layout_mode = 0 offset_left = 4.0 -offset_top = 51.0 +offset_top = 25.0 offset_right = 476.0 -offset_bottom = 282.0 +offset_bottom = 256.0 +script = ExtResource("2_sm6tk") [node name="table" type="GridContainer" parent="scroll"] layout_mode = 2 diff --git a/scenes/grd_btns.tscn b/scenes/grd_btns.tscn index a07c67a..56b6718 100644 --- a/scenes/grd_btns.tscn +++ b/scenes/grd_btns.tscn @@ -12,7 +12,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "Откл." -pressed = true +disabled = true metadata/rfi_name = "off" [node name="btn_auto_rfi" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -20,6 +20,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "Автомат" +disabled = true metadata/rfi_name = "auto" [node name="btn_p12" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -27,6 +28,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "МЧМ-1" +disabled = true metadata/rfi_name = "mchm1" [node name="btn_p16" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -34,6 +36,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "СРН-И1" +disabled = true metadata/rfi_name = "srni1" [node name="btn_p15" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -41,6 +44,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "СРН-М2" +disabled = true metadata/rfi_name = "srnm2" [node name="btn_p14" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -48,6 +52,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "ПД-М4" +disabled = true metadata/rfi_name = "pdm4" [node name="btn_p13" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -55,6 +60,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "ПД-М2" +disabled = true metadata/rfi_name = "pdm2" [node name="btn_p11" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -62,6 +68,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "ЛЧМ-1" +disabled = true metadata/rfi_name = "lchm1" [node name="btn_p10" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -69,6 +76,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "ПД-М4С" +disabled = true metadata/rfi_name = "pdm4s" [node name="btn_p9" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -76,6 +84,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "ПД-ЧМ" +disabled = true metadata/rfi_name = "pdchm" [node name="btn_p8" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -83,6 +92,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "СВ-И1" +disabled = true metadata/rfi_name = "svi1" [node name="btn_p7" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -90,6 +100,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "K1" +disabled = true metadata/rfi_name = "k1" [node name="btn_p6" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -97,6 +108,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "СВ-М2" +disabled = true metadata/rfi_name = "svm2" [node name="btn_p5" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_uiv1n")] @@ -104,4 +116,5 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 text = "ОЗП-1" +disabled = true metadata/rfi_name = "ozp1" diff --git a/scenes/nine-patch-button.gd b/scenes/nine-patch-button.gd index be728fe..cc31a7a 100644 --- a/scenes/nine-patch-button.gd +++ b/scenes/nine-patch-button.gd @@ -18,8 +18,13 @@ extends PanelContainer get: return $button.get_text() +@export var disabled: bool = false: + set(val): $button.set_disabled(val) + get: return $button.disabled + + @export var pressed: bool = false: - set(val): $button.set_pressed(val) + set(val): $button.set_pressed(val) get: return $button.is_pressed() @@ -32,6 +37,7 @@ extends PanelContainer func set_text(val: String): $button.set_text(val) func set_pressed(val: bool): $button.set_pressed(val) +func set_disabled(val: bool): $button.set_disabled(val) func button_connect(button_signal: String, proc: Callable): $button.connect(button_signal, proc) func get_text(): return $button.get_text() func is_pressed(): return $button.is_pressed() diff --git a/scenes/scroll-ecm-list.gd b/scenes/scroll-ecm-list.gd index da177ff..4bacd50 100644 --- a/scenes/scroll-ecm-list.gd +++ b/scenes/scroll-ecm-list.gd @@ -8,7 +8,7 @@ const TableHeader = preload('res://table/header.tscn') ## Ячейка за const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка. const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда. const TABLE_HEADERS_TEXT = ['Номер', 'Название', 'Частота, МГц', 'Пеленг', 'Состояние' ] ## Заголовки таблицы. -const TABLE_COLUMN_SIZE = [ 65, 80, 120, 80, 90 ] ## Ширины колонок. +const TABLE_COLUMN_SIZE = [ 65, 80, 120, 70, 100 ] ## Ширины колонок. ## Состояние выполнения сеанса помехи const INTERFER_STATE = { @@ -44,10 +44,41 @@ const COLUMN_FREQ = 2 const COLUMN_AOA = 3 const COLUMN_STATE = 4 + +## Вызывается при нажатии указателем мыши на выбранный ряд. +func on_row_pressed(i_row: int): + $table.clear_rows_selected() + $table.set_row_selected(i_row, true) + var ecm = $table.get_node_user_data(0, i_row) + if interfer.thrs.has(ecm.ispp): + signaller.emit_signal('rto_threat_sel', interfer.thrs[ecm.ispp]) + else: + signaller.emit_signal('interfer_selected', ecm) + + +## Вызывается при выборе цели +func on_rto_threat_sel(th_id: int, table_index): + var ecm_ispp = interfer.thrs.find_key(th_id) + var ecm = null + if ecm_ispp != null: + var i_row = table_index[int(ecm_ispp)] + ecm = $table.get_node_user_data(0, i_row) + $table.clear_rows_selected() + $table.set_row_selected(i_row, true) + else: + $table.clear_rows_selected() + signaller.emit_signal('interfer_selected', ecm) + + # Called when the node enters the scene tree for the first time. func _ready(): var table_index: = Dictionary() signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind(table_index)) + signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind(table_index)) + signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) + signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(table_index)) + interfer.connect('interfer_update', Callable(self, 'on_interfer_update').bind(table_index)) + $table.connect('row_pressed', Callable(self, 'on_row_pressed')) call_deferred('init_table') @@ -58,6 +89,13 @@ func init_table(): $table.pin_header(self, get_parent()) +func on_interfer_update(ecm, table_index): + var row = map_th_to_row(ecm) + if table_index.has(ecm.ispp): + var i_row = table_index[ecm.ispp] + $table.set_row_text(i_row, row) + + func on_interfer_new(ecm, table_index): var row = map_th_to_row(ecm) if table_index.has(ecm.ispp): @@ -70,6 +108,25 @@ func on_interfer_new(ecm, table_index): $table.set_row_editable(i_row, false) $table.set_node_user_data(0, i_row, ecm) table_index[ecm.ispp] = i_row + $table.clear_rows_selected() + $table.set_row_selected(i_row, true) + signaller.emit_signal('interfer_selected', ecm) + + +func on_interfer_off(ecm, ecms, thrs, table_index): + $table.remove_row(table_index[ecm.ispp]) + table_index.clear() + rehash(table_index) + ecms.erase(ecm.ispp) + thrs.erase(ecm.ispp) + + +## Перестраивает индекс таблицы. Вызывать при удалении строки +func rehash(table_index: Dictionary): + var rows_count = $table.get_rows_count() + for i_row in rows_count: + var item = $table.get_node2(0, i_row) + table_index[int(item.text)] = i_row ## Преобразует цель в строку таблицы @@ -79,7 +136,7 @@ func map_th_to_row(ecm) -> Array: row[COLUMN_NUMBER] = '%s' % ecm.ispp row[COLUMN_NAME] = '' if INTERFER_NAMES.has(ecm.krp): - row[COLUMN_NAME] = '%s' % ecm.krp + row[COLUMN_NAME] = '%s' % INTERFER_NAMES[ecm.krp] row[COLUMN_FREQ] = '%s' % ecm.params['freq'] row[COLUMN_AOA] = '%s' % ecm.kni row[COLUMN_STATE] = '' @@ -87,3 +144,5 @@ func map_th_to_row(ecm) -> Array: row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk] return row + +func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() diff --git a/scenes/scroll-ecm-params.gd b/scenes/scroll-ecm-params.gd new file mode 100644 index 0000000..15b97bc --- /dev/null +++ b/scenes/scroll-ecm-params.gd @@ -0,0 +1,97 @@ +extends ScrollContainer + +## Отображает список параметров помехи в таблице. + +const CellLineEdit = preload('res://scenes/ячейка-2.tscn') ## Ячейка таблицы. +const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы. + +const TABLE_HEADER = [ TableHeader, TableHeader ] ## Описание ряда заголовка. +const TABLE_ROW = [ CellLineEdit, CellLineEdit ] ## Описание ряда. +const TABLE_HEADERS_TEXT = ['Параметр', 'Значение' ] ## Назания колонок. +const TABLE_COLUMN_SIZE = [ 370, 85 ] ## Ширины колонок. + +const TABLE_PARAMS = { + 'kni': [0, 'Курсовой улог, гр.', false, 0.0, 360.0], + 'powp': [1, 'Мощность, %', true, 0.0, 100.0], + 'freq': [2, 'Частота, МГц', true, 400.0, 6000.0], + 'width': [3, 'Занимая полоса частот, МГц', true, 0.0, 120.0], + 'dur': [4, 'Длительность импульса, мкс', true, 0.0, 1000000.0], + 'period': [5, 'Период повтора, мкс', true, 0.0, 1000000.0] } + + +func init_table(): + for i in TABLE_PARAMS.size(): $table.add_row(TABLE_ROW) + for key in TABLE_PARAMS.keys(): + var p = TABLE_PARAMS[key] + $table.set_node_text(0, p[0], p[1]) + $table.set_node_alligment(0, p[0], HORIZONTAL_ALIGNMENT_LEFT) + $table.set_node_editable(0, p[0], false) + $table.set_node_editable(1, p[0], false) + $table.set_node_user_data(1, p[0], key) + $table.connect_columns(self, 'text_submitted', 'on_edit_entry', [1], []) + $table.set_columns_min_size(TABLE_COLUMN_SIZE) + $table.set_meta('id', 0) + + +# Called when the node enters the scene tree for the first time. +func _ready(): + signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected')) + signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) + call_deferred('init_table') + + +func on_edit_entry(text : String, entry): + var ecm = $table.get_meta('ecm') + if $table.has_meta('ecm') == false: return + var indexis = $table.get_key_indexes(entry[0].name) + var row_i = indexis[1] + var param = $table.get_node_user_data(1, row_i) + var p = TABLE_PARAMS[param] + var old_val = ecm.get_value(param) + var val = check_value(text, p[3], p[4], old_val) + ecm.set_value(val, param) + signaller.emit_signal('interfer_new', ecm) + + +func check_value(val, min_val, max_val, old_val): + if val.is_valid_float(): + if float(val) < min_val: return min_val + if float(val) > max_val: return max_val + return float(val) + else: return old_val + + +func on_interfer_selected(ecm): + if ecm != null: + $table.set_meta('ecm', ecm) + else: + $table.set_meta('ecm', null) + on_ecm_update() + + +func on_ecm_update(): + for item in range(len(TABLE_PARAMS)): + $table.set_node_text(1, item, '') + $table.set_node_editable(1, item, false) + if $table.has_meta('ecm') == false: return + var ecm: interfer.Interfer = $table.get_meta('ecm') + var mnms = tools.get_members_names(ecm) + for item in ecm['params'].keys(): + mnms.append(item) + for member_name in mnms: + if not TABLE_PARAMS.has(member_name): continue + var p = TABLE_PARAMS[member_name] + var val = ecm.get_value(member_name) + $table.set_node_text(1, p[0], '%s' % val) + $table.set_node_editable(1, p[0], p[2]) + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + + +func on_rto_threat_unsel(_th_id): + for item in range(len(TABLE_PARAMS)): + $table.set_node_text(1, item, '') + $table.set_node_editable(1, item, false) diff --git a/scenes/scroll-params.gd b/scenes/scroll-params.gd index 64df90c..835c9ac 100644 --- a/scenes/scroll-params.gd +++ b/scenes/scroll-params.gd @@ -42,6 +42,7 @@ func init_table(): func _ready() -> void: signaller.connect('threat_selected', Callable(self, 'on_threat_selected')) + signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) threats.connect('threat_update', Callable(self, 'on_threat_update')) call_deferred('init_table') @@ -49,6 +50,7 @@ func _ready() -> void: ## Обрабатывает сигнал [signal threats.threat_update]. ## Обновляет отображение только для выбранной цели. func on_threat_update(th): + if th.selected == false: return if th.id != $table.get_meta('id'): return var mnms = tools.get_members_names(th) for member_name in mnms: @@ -56,3 +58,8 @@ func on_threat_update(th): var p = TABLE_PARAMS[member_name] var val = th.get(member_name) $table.set_node_text(1, p[0], '%s' % val) + + +func on_rto_threat_unsel(_th_id): + for item in range(len(TABLE_PARAMS)): + $table.set_node_text(1, item, '') diff --git a/scenes/scroll-threats.gd b/scenes/scroll-threats.gd index 2c65589..dad4955 100644 --- a/scenes/scroll-threats.gd +++ b/scenes/scroll-threats.gd @@ -16,13 +16,17 @@ const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Вызывается при нажатии указателем мыши на выбранный ряд. func on_row_pressed(i_row: int): + row_pressed(i_row) + signaller.emit_signal('rto_threat_sel', $table.get_node_user_data(0, i_row).id) + + +func row_pressed(i_row: int): $table.clear_rows_selected() $table.set_row_selected(i_row, true) var threat = $table.get_node_user_data(0, i_row) signaller.emit_signal('threat_selected', threat) - func init_table(): $table.set_header(TABLE_HEADER) $table.set_header_text(TABLE_HEADERS_TEXT) @@ -36,6 +40,7 @@ func _ready() -> void: threats.connect('threat_lost', Callable(self, 'on_threat_lost').bind(table_index)) threats.connect('threat_update', Callable(self, 'on_threat_update').bind(table_index)) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind($table)) + signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) $table.connect('row_pressed', Callable(self, 'on_row_pressed')) call_deferred('init_table') @@ -85,10 +90,14 @@ func map_th_to_row(th) -> Array: ## Выделяет выбранную цель в таблице -func on_rto_threat_sel(bip, tbl): +func on_rto_threat_sel(th_id, tbl): for i in tbl.get_rows_count(): var node = tbl.get_node2(0, i) - if node.text.to_int() == bip.name.to_int(): - on_row_pressed(i) + if node.text.to_int() == th_id: + row_pressed(i) break + +## Снимает выделение цели +func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() + diff --git a/scenes/журнал.gd b/scenes/журнал.gd index 9b60e42..32b79fd 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -5,6 +5,11 @@ func on_line_changed(unit, addr): log.message(Logger.INFO, 'Состояние func on_command_fail(unit, addr): log.message(Logger.ERROR, 'Ошибка: команда не выполнена: %s %s' % [unit, addr]) func on_threats_changed(th: Object, msg: String): log.message(Logger.INFO, '%s: %s' % [msg, th.to_string()]) func on_parse_error(unit, msg: String): log.message(Logger.ERROR, '%s: %s' % [unit.to_string(), msg]) +func on_interfer_off(ecm, _ecms, _thrs,msg: String): log.message(Logger.INFO, '%s: %s' % [msg, ecm.to_string()]) + +func on_interfer_new(ecm, msg: String): + if ecm.krp != interfer.INTERFER_OFF: + log.message(Logger.INFO, '%s: %s' % [msg, ecm.to_string()]) func _enter_tree(): @@ -20,7 +25,8 @@ func _ready() -> void: log.info('Операционная система: %s' % [OS.get_distribution_name()]) threats.connect('threat_new', Callable(self, 'on_threats_changed').bind('Цель обнаружена')) threats.connect('threat_lost', Callable(self, 'on_threats_changed').bind('Цель потеряна')) - + signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind('Создан сеанс помехи')) + signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind('Сеанс помехи отключен')) func _on_clear_button_down() -> void: $content.clear() diff --git a/scenes/работа.gd b/scenes/работа.gd index f6531e9..87efccc 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -75,7 +75,6 @@ func _ready(): $btn_zoom.set_meta('zoom', min_zoom - 1) $btn_strob.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) $btn_view.button_connect('toggled', Callable(self, 'on_button_view_toggled')) - $grd_btns/btn_off.set_pressed(true) drag_fsm = DragFSM.OFF var nodes: Array = get_tree().get_nodes_in_group('группа-режим-помехи') nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes))) @@ -84,9 +83,10 @@ func _ready(): threats.connect('threats_resized', Callable(self, 'on_threats_resized')) threats.connect('threat_update', Callable(self, 'on_threat_update')) signaller.connect('zoom_complete', Callable(self, '_on_zoom_complete')) - signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel')) - signaller.connect('threat_selected', Callable(self, 'on_threat_selected')) - + signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes)) + signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes)) + signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes)) + signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes)) func on_enter_tree() -> void: call_deferred('_on_btn_scale_pressed') @@ -128,20 +128,31 @@ func on_threat_lost(th) -> void: ## Обработчик выбора РТО цели -func on_rto_threat_sel(bip): +func on_rto_threat_sel(th_id, ecm_btns): var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) for item in bips: - item.set_sel_visible(false) - bip.set_sel_visible(true) - - -func on_threat_selected(th): - var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) - for item in bips: - if th.id == item.name.to_int(): + if th_id == item.name.to_int(): item.set_sel_visible(true) else: item.set_sel_visible(false) + for btn in ecm_btns: + btn.set_disabled(false) + + +## Обработчик снятия выбора РТО цели +func on_rto_threat_unsel(th_id, ecm_btns): + var bips: Array = get_children().filter(func(item): return item.name.is_valid_int()) + for item in bips: + if th_id == item.name.to_int(): + item.set_sel_visible(false) + break + for btn in ecm_btns: + btn.set_pressed(false) + btn.set_disabled(true) + + +func on_threat_selected(th, ecm_btns): + on_rto_threat_sel(th.id, ecm_btns) ## Обработчик нажатия кнопки "Строб". Управляет отображением строба @@ -156,6 +167,22 @@ func on_button_pressed(btn_this, btn_others) -> void: signaller.emit_signal('interfer_init', btn_this) +## Управляет состоянием кнопок в радиогруппе при выборе помехи +func on_interfer_selected(ecm, btns) -> void: + var ecm_name: String + if ecm != null: + ecm_name = ecm.krp + else: + ecm_name = interfer.INTERFER_OFF + for btn in btns: + btn.set_disabled(false) + btn.get_meta('rfi_name') + if ecm_name == btn.get_meta('rfi_name'): + btn.set_pressed(true) + else: + btn.set_pressed(false) + + ## Возвращает ширину строба по направлению func get_strob_width(pos: Vector2, prev: float) -> float: var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width diff --git a/scenes/эмс.gd b/scenes/эмс.gd index 1c14344..0240d79 100644 --- a/scenes/эмс.gd +++ b/scenes/эмс.gd @@ -354,6 +354,3 @@ func on_row_pressed(i_row: int, tbl): var is_row_selected = tbl.is_row_selected(i_row) tbl.set_row_selected(i_row, not is_row_selected) - -func _process(_delta): - pass diff --git a/scripts/interfer.gd b/scripts/interfer.gd index d3159eb..29a8e49 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -5,6 +5,8 @@ extends Node ## Режимы помехи const ITERFER_MODE = { + 'off': ['Откл', ['freq', 'width']], + 'auto': ['АВТО', ['freq', 'width']], 'srni1': ['СРН-И1', ['freq', 'width']], 'srnm2': ['СРН-М2', ['freq', 'width']], 'lchm1': ['ЛЧМ-1', ['freq', 'width']], @@ -20,6 +22,7 @@ const ITERFER_MODE = { const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей const INTERFER_OFF = 'off' +const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен var msg_ss: int = 0 ## счётчик сообщений var id_array: Array ## Массив id воздействий var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия @@ -36,8 +39,11 @@ class Interfer: var params: = {} ## Параметры помехи. var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров). var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров. - var tick_rx: int ## Тик время обновления цели, мс. - + var tick_tx: int ## Тик время обновления цели, мс. + + func _to_string() -> String: + return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] + func get_msg6_data(): var data_to_json : Dictionary = {} data_to_json['ts'] = 6 @@ -57,7 +63,20 @@ class Interfer: var names: = tools.get_members_names(self) names.any(func(vn): if dic.has(vn): set(vn, dic[vn]); return false) - + func get_value(value_key): + var param = self.get(value_key) + if param == null: + if params.has(value_key): param = params[value_key] + return param + + func set_value(value, value_key): + var param = self.get(value_key) + if param == null: + params[value_key] = value + else: + self.set(value_key, value) + + signal interfer_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи. signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи. signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке. @@ -71,9 +90,24 @@ func _ready(): id_array.append(i+1) var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп') var unit = repnetwork.units[unit_key] + var timer_check_state: = Timer.new() + add_child(timer_check_state) + var resend_timeout = ProjectSettings.get_setting('application/interfer/resend_timeout', 1000.0) + timer_check_state.connect('timeout', Callable(self, 'on_timer_check_state').bind(unit, ecms, resend_timeout)) + timer_check_state.start(resend_timeout / 1000.0) unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms)) signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit, ecms)) + signaller.connect('interfer_new', Callable(self, 'send_ecm').bind(unit)) +# Проверяет состояние отправки пакета и если не доставлен, повторяет отправку +func on_timer_check_state(unit, ecms, resend_timeout): + var tick = Time.get_ticks_msec() + for ecm in ecms.values(): + if ecm.svk == STATE_TSMT: + if (tick - ecm.tick_tx) >= resend_timeout: + send_ecm(ecm, unit) + ecm.tick_tx = tick + ## Производит приём состояния помех. [param unit] -> [param ecms] func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): @@ -91,15 +125,12 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): if ecms.has(ispp): var ecm = ecms[ispp] ecm.set_from_dic(dic_msvk) - ecm.tick_rx = unit.tick call_deferred('emit_signal', 'interfer_update', ecm) else: var ecm = Interfer.new() ecm.set_from_dic(dic_msvk) ecm.krp = INTERFER_OFF - var json_data = ecm.get_msg6_data() - unit.tx_stack.append(json_data) - ecm.tick_rx = unit.tick + send_ecm(ecm, unit) if sz != ecms.size(): call_deferred('emit_signal', 'interfer_resized', ecms) @@ -120,6 +151,8 @@ func on_interfer_create(btn, sel_threats, unit, ecms): if key != null: ispp = key else: + if interfer_name == 'off': + return ispp = pop_id() if ispp == 0: return msg_ss += 1 @@ -128,18 +161,25 @@ func on_interfer_create(btn, sel_threats, unit, ecms): ecm = ecms[ispp] else: ecm = Interfer.new() - ecm.svk = 5 # Подготовка к передаче сообщения ecm.ispp = ispp ecms[ispp] = ecm + ecm.svk = STATE_TSMT # Подготовка к передаче сообщения ecm.ss = msg_ss ecm.kni = kni ecm.krp = interfer_name ecm.params = param ecm.powp = 100.0 # Необходимо добавить управление мощностью thrs[ispp] = item.id - var json_data = ecm.get_msg6_data() - unit.tx_stack.append(json_data) signaller.emit_signal('interfer_new', ecm) + if interfer_name == 'off': + signaller.emit_signal('interfer_off', ecm, ecms, thrs) + push_id(ecm.ispp) + ecm.tick_tx = Time.get_ticks_msec() + + +func send_ecm(ecm, unit): + var json_data = ecm.get_msg6_data() + unit.tx_stack.append(json_data) func pop_id(): @@ -152,3 +192,4 @@ func pop_id(): func push_id(id : int): id_array.append(id) + id_array.sort() diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 5f11b14..469abc8 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -23,8 +23,13 @@ signal full_screen(id: int) ## Вызывается, когда пользователь выбирает цель -## [param bip] - Отметка цели на экране -signal rto_threat_sel (bip: Control) +## [param th_id] - Отметка цели на экране +signal rto_threat_sel (th_id: int) + + +## Вызывается, когда пользователь снимает выделение с цели +## [param th_id] - Отметка цели на экране +signal rto_threat_unsel (th_id: int) ## Вызывается, когда пользователь выбирает помеху @@ -42,6 +47,17 @@ signal interfer_create (btn: PanelContainer, sel_threats: Array) signal interfer_new (ecm: interfer.Interfer) +## Вызывается, когда отключается действующая помеха +## [param ecm] - Новая помеха, [param ecms] - словарь помех +## [param ecms] - словарь id помех и связанных с ними целей +signal interfer_off (ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary) + + +## Вызывается, когда отключается действующая помеха +## [param ecm] - Выбранная помеха +signal interfer_selected (ecm: interfer.Interfer) + + ## Вызывается при запросе изменения уровня детализации карты ## [param zoom] - Вновь установленный уровень детализации signal zoom_changed(zoom: int) diff --git a/scripts/threats.gd b/scripts/threats.gd index b74c883..b83a4b9 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -29,7 +29,7 @@ class Threat: var selected: bool ## Флаг, что цель выбрана func _init(): clear_fflags() - func _to_string() -> String: return ': номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq] + func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq] func clear_fflags(): tools.get_members_names(self).any(func(vn): fflags[vn] = false) func set_from_dic(dic: Dictionary): @@ -54,6 +54,7 @@ func _ready() -> void: timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(repsettings.ThreatParams.time_lost, threats)) timer_check_lost.start(repsettings.ThreatParams.time_lost / 1000.0) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats)) + signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats)) signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats)) signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats)) @@ -69,11 +70,12 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary): call_deferred('emit_signal', 'threats_resized', threats) +## Снимает выделение с цели, если нажать по отметке цели. +func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false + + ## Выбирает цель, если нажать по отметке цели. -func on_rto_threat_sel(bip, threats): - for threat in threats.values(): - threat.selected = false - threats[bip.name.to_int()].selected = true +func on_rto_threat_sel(th_id, threats): on_threat_selected(threats[th_id], threats) ## Выбирает цель, если выбрать в таблице