summaryrefslogtreecommitdiff
path: root/stage
diff options
context:
space:
mode:
Diffstat (limited to 'stage')
-rw-r--r--stage/dice_throw/dice.tscn9
-rw-r--r--stage/dice_throw/dice_face.gd5
-rw-r--r--stage/dice_throw/dice_face.gd.uid1
-rw-r--r--stage/dice_throw/dice_face.tscn6
-rw-r--r--stage/dice_throw/dice_throw.gd6
-rw-r--r--stage/grid_selector/grid_selector.gd12
-rw-r--r--stage/grid_selector/grid_selector.tscn1
-rw-r--r--stage/grid_selector/state_cube_placement.gd9
-rw-r--r--stage/grid_selector/state_move_mode.gd8
-rw-r--r--stage/hud_main.gd10
-rw-r--r--stage/hud_move_mode.gd20
-rw-r--r--stage/hud_move_mode.gd.uid1
-rw-r--r--stage/hud_unit.gd2
-rw-r--r--stage/stage.gd116
-rw-r--r--stage/stage.tscn39
-rw-r--r--stage/team.gd9
-rw-r--r--stage/team.gd.uid1
17 files changed, 211 insertions, 44 deletions
diff --git a/stage/dice_throw/dice.tscn b/stage/dice_throw/dice.tscn
index 75fb93c..38f13d0 100644
--- a/stage/dice_throw/dice.tscn
+++ b/stage/dice_throw/dice.tscn
@@ -1,7 +1,8 @@
-[gd_scene load_steps=12 format=3 uid="uid://dnq7fpof6w0mj"]
+[gd_scene load_steps=13 format=3 uid="uid://dnq7fpof6w0mj"]
[ext_resource type="Script" uid="uid://bajtxq3ucs8f4" path="res://stage/dice_throw/dice.gd" id="1_gwnix"]
[ext_resource type="Texture2D" uid="uid://blanietpri1be" path="res://icon.svg" id="2_6tbdd"]
+[ext_resource type="PackedScene" uid="uid://y1hkmpd41rrq" path="res://stage/dice_throw/dice_face.tscn" id="2_ee854"]
[ext_resource type="Texture2D" uid="uid://dtltt171temec" path="res://stage/assets/tinyBlocks.png" id="3_t0umq"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_m7tx2"]
@@ -44,11 +45,11 @@ shape = SubResource("BoxShape3D_tqijt")
[node name="Faces" type="Node3D" parent="."]
-[node name="Sprite3D" type="Sprite3D" parent="Faces"]
+[node name="DiceFace" parent="Faces" instance=ExtResource("2_ee854")]
transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0.51)
texture = ExtResource("2_6tbdd")
-metadata/up = Vector3(-90, 0, 0)
-metadata/type = "move"
+up_rotation = Vector3(-90, 0, 0)
+type = "move"
[node name="Sprite3D2" type="Sprite3D" parent="Faces"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.51)
diff --git a/stage/dice_throw/dice_face.gd b/stage/dice_throw/dice_face.gd
new file mode 100644
index 0000000..6403a4c
--- /dev/null
+++ b/stage/dice_throw/dice_face.gd
@@ -0,0 +1,5 @@
+extends Sprite3D
+
+
+@export var up_rotation: Vector3
+@export var type: String
diff --git a/stage/dice_throw/dice_face.gd.uid b/stage/dice_throw/dice_face.gd.uid
new file mode 100644
index 0000000..785acfa
--- /dev/null
+++ b/stage/dice_throw/dice_face.gd.uid
@@ -0,0 +1 @@
+uid://qvqdbngedxd3
diff --git a/stage/dice_throw/dice_face.tscn b/stage/dice_throw/dice_face.tscn
new file mode 100644
index 0000000..913b133
--- /dev/null
+++ b/stage/dice_throw/dice_face.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://y1hkmpd41rrq"]
+
+[ext_resource type="Script" uid="uid://qvqdbngedxd3" path="res://stage/dice_throw/dice_face.gd" id="1_63pm6"]
+
+[node name="DiceFace" type="Sprite3D"]
+script = ExtResource("1_63pm6")
diff --git a/stage/dice_throw/dice_throw.gd b/stage/dice_throw/dice_throw.gd
index e612dc2..d06a8f7 100644
--- a/stage/dice_throw/dice_throw.gd
+++ b/stage/dice_throw/dice_throw.gd
@@ -6,6 +6,8 @@ signal throw_finished
func _ready() -> void:
%Side.position.x = -%Side.size.x
+
+ %move.text = "Move: %s" % str(Network.current_player.current_move_points)
func _on_dice_throw_3d_throw_finished() -> void:
@@ -61,6 +63,10 @@ func _on_dice_throw_3d_throw_finished() -> void:
var p3d = %Camera3D.project_position(node.position + node.size * 0.5, 1)
tween.tween_property(dice, "position", p3d, 0.25)
tween.tween_property(dice, "scale", Vector3(0.1, 0.1, 0.1), 0.25)
+
+ if top_faces[idx].get_meta("type") == "move":
+ Network.current_player.set_current_move_points(Network.current_player.current_move_points + 1)
+ %move.text = "Move: %s" % str(Network.current_player.current_move_points)
await tween.finished
for dice in dices:
diff --git a/stage/grid_selector/grid_selector.gd b/stage/grid_selector/grid_selector.gd
index a2c3932..dd2f1e4 100644
--- a/stage/grid_selector/grid_selector.gd
+++ b/stage/grid_selector/grid_selector.gd
@@ -2,8 +2,11 @@ class_name GridSelector
extends Node2D
+signal state_changed
+signal moved(grid_position: Vector2i)
signal selected(node: Node2D)
signal placed_tiles(grid_positions: Array)
+signal move_mode_changed(path: Array)
signal move_mode_confirmed(path: Array)
signal move_mode_exited
signal range_select_confirmed(grid_position: Vector2i, entity: Node2D)
@@ -40,6 +43,9 @@ var current_entity: Node2D
@export var range_select_current_range: int
@export_flags_2d_physics var range_select_collision_mask: int
+@export_group("Move Mode", "move_mode")
+@export var move_mode_max_range: int
+
@onready var visual: Node2D = $Visual
@onready var state_cube_placement: GridSelectorStateCubePlacement = $StateCubePlacement
@onready var state_select: GridSelectorStateSelect = $StateSelect
@@ -69,6 +75,7 @@ func _process(delta: float) -> void:
movement_delta_threshold += delta * movement_delta_speed
current_state.draw(ground_map.local_to_map(base_position) + Vector2i(input_vector))
+ moved.emit(ground_map.local_to_map(base_position))
else:
movement_delta = 0
movement_delta_threshold = 0
@@ -81,6 +88,7 @@ func set_current_state(value: Node):
current_state = value
value.process_mode = Node.PROCESS_MODE_INHERIT
current_state._state_enter()
+ state_changed.emit()
func adjust_height(selector_tile: Sprite2D) -> void:
@@ -132,6 +140,10 @@ func _on_state_move_mode_exited() -> void:
move_mode_exited.emit()
+func _on_state_move_mode_changed(path: Array) -> void:
+ move_mode_changed.emit(path)
+
+
func _on_state_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void:
range_select_confirmed.emit(grid_position, entity)
diff --git a/stage/grid_selector/grid_selector.tscn b/stage/grid_selector/grid_selector.tscn
index d8b59d4..d2541ed 100644
--- a/stage/grid_selector/grid_selector.tscn
+++ b/stage/grid_selector/grid_selector.tscn
@@ -89,6 +89,7 @@ y_sort_enabled = true
[connection signal="placed_tiles" from="StateCubePlacement" to="." method="_on_state_cube_placement_placed_tiles"]
[connection signal="selected" from="StateSelect" to="." method="_on_state_select_selected"]
+[connection signal="changed" from="StateMoveMode" to="." method="_on_state_move_mode_changed"]
[connection signal="confirmed" from="StateMoveMode" to="." method="_on_state_move_mode_confirmed"]
[connection signal="exited" from="StateMoveMode" to="." method="_on_state_move_mode_exited"]
[connection signal="confirmed" from="StateRangeSelect" to="." method="_on_state_range_select_confirmed"]
diff --git a/stage/grid_selector/state_cube_placement.gd b/stage/grid_selector/state_cube_placement.gd
index 3f1d2e7..d238437 100644
--- a/stage/grid_selector/state_cube_placement.gd
+++ b/stage/grid_selector/state_cube_placement.gd
@@ -196,16 +196,7 @@ func place_tiles():
positions.append(node.global_position)
var grid_positions = positions.map(func(p): return ground_map.local_to_map(p))
- for p in grid_positions:
- floor_map.set_cell(
- p,
- grid_selector.placement_tile_source_id,
- grid_selector.placement_tile_atlas_coordinates,
- grid_selector.placement_tile_alternative_tile
- )
-
placed_tiles.emit(grid_positions)
- draw(ground_map.local_to_map(grid_selector.global_position))
func can_place() -> bool:
diff --git a/stage/grid_selector/state_move_mode.gd b/stage/grid_selector/state_move_mode.gd
index 25936c6..f903926 100644
--- a/stage/grid_selector/state_move_mode.gd
+++ b/stage/grid_selector/state_move_mode.gd
@@ -3,6 +3,7 @@ extends Node2D
signal confirmed(path: Array)
+signal changed(path: Array)
signal exited
var current_path: Array
@@ -28,16 +29,19 @@ func draw(grid_position: Vector2i) -> void:
if floor_map.get_cell_tile_data(grid_position) == null:
return
- current_path = grid.get_point_path(
+ var calculated_path := grid.get_point_path(
ground_map.local_to_map(grid_selector.global_position),
grid_position
)
- if current_path.is_empty():
+ if calculated_path.is_empty() or (calculated_path.size() - 1) > grid_selector.move_mode_max_range:
return
grid_selector.base_position = ground_map.map_to_local(grid_position)
+ current_path = calculated_path
+ changed.emit(current_path)
+
# remove starting position
var working_path := current_path.slice(1)
diff --git a/stage/hud_main.gd b/stage/hud_main.gd
index 2aea87e..b80b514 100644
--- a/stage/hud_main.gd
+++ b/stage/hud_main.gd
@@ -37,3 +37,13 @@ func _on_button_pressed() -> void:
grid_selector.current_state = grid_selector.state_cube_placement
)
get_tree().current_scene.process_mode = PROCESS_MODE_DISABLED
+
+
+func _on_button_2_pressed() -> void:
+ visible = false
+
+ Network.set_current_player(Network.player_order[
+ (Network.player_order.find(Network.current_player.id) + 1) % Network.player_order.size()
+ ])
+
+ grid_selector.process_mode = Node.PROCESS_MODE_INHERIT
diff --git a/stage/hud_move_mode.gd b/stage/hud_move_mode.gd
new file mode 100644
index 0000000..fad6ba2
--- /dev/null
+++ b/stage/hud_move_mode.gd
@@ -0,0 +1,20 @@
+extends CanvasLayer
+
+
+@onready var grid_selector: GridSelector = get_tree().get_first_node_in_group("grid_selector")
+
+
+func _ready() -> void:
+ grid_selector.move_mode_changed.connect(_on_grid_selector_move_mode_changed)
+ grid_selector.state_changed.connect(_on_grid_selector_state_changed)
+
+func _on_grid_selector_move_mode_changed(path: Array) -> void:
+ $PanelContainer/Label.text = "%s / %s" % [max(0, path.size() - 1), Network.current_player.current_move_points]
+
+
+func _on_grid_selector_state_changed() -> void:
+ if grid_selector.current_state == grid_selector.state_move_mode:
+ _on_grid_selector_move_mode_changed([])
+ visible = true
+ else:
+ visible = false
diff --git a/stage/hud_move_mode.gd.uid b/stage/hud_move_mode.gd.uid
new file mode 100644
index 0000000..db3017d
--- /dev/null
+++ b/stage/hud_move_mode.gd.uid
@@ -0,0 +1 @@
+uid://bm0yvrdltu4n1
diff --git a/stage/hud_unit.gd b/stage/hud_unit.gd
index b8351f7..bb8f8d8 100644
--- a/stage/hud_unit.gd
+++ b/stage/hud_unit.gd
@@ -11,7 +11,7 @@ func _ready() -> void:
grid_selector.process_mode = Node.PROCESS_MODE_DISABLED
visible = true
- if node.current_team == grid_selector.current_team:
+ if node.current_team == grid_selector.current_team and Network.is_my_turn():
$PanelContainer/VBoxContainer/Button.visible = true
$PanelContainer/VBoxContainer/Button2.visible = true
$PanelContainer/VBoxContainer/Button.grab_focus()
diff --git a/stage/stage.gd b/stage/stage.gd
index b2d4736..9b1689f 100644
--- a/stage/stage.gd
+++ b/stage/stage.gd
@@ -3,11 +3,11 @@ extends Node2D
var grid := AStarGrid2D.new()
+var teams: Dictionary[String, Team] = {}
@onready var grid_selector: GridSelector = %GridSelector
-# Called when the node enters the scene tree for the first time.
func _ready() -> void:
grid.region = $Ground.get_used_rect()
grid.cell_size = $Floor.tile_set.tile_size
@@ -21,59 +21,123 @@ func _ready() -> void:
# pre-set floor tiles as walkable
for tile in $Floor.get_used_cells():
grid.set_point_solid(tile, false)
-
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(_delta: float) -> void:
- pass
+
+ grid_selector.move_mode_max_range = Network.current_player.current_move_points
+
+ # teams
+ var team_one := Team.new()
+ team_one.placement_tile_source_id = 1
+ team_one.placement_tile_atlas_coordinates = Vector2(1, 6)
+ team_one.placement_tile_alternative_tile = 0
+ var team_two := Team.new()
+ team_two.placement_tile_source_id = 1
+ team_two.placement_tile_atlas_coordinates = Vector2(3, 6)
+ team_two.placement_tile_alternative_tile = 0
+ teams["1"] = team_one
+ teams["2"] = team_two
+
+ if multiplayer.is_server():
+ Network.local_player.set_current_team_name("1")
+ else:
+ Network.local_player.set_current_team_name("2")
+
+ grid_selector.current_team = Network.local_player.current_team_name
+
+ # remote selector
+ Network.current_player_changed.connect(func():
+ if Network.is_my_turn():
+ %RemoteSelector.visible = false
+ _on_grid_selector_moved($Ground.local_to_map(%GridSelector.global_position))
+ else:
+ await get_tree().process_frame
+ %RemoteSelector.modulate = Network.current_player.get_color()
+ %RemoteSelector.visible = true
+ )
+ %RemoteSelector.modulate = Network.current_player.get_color()
+ if Network.is_my_turn():
+ %RemoteSelector.visible = false
func _input(event: InputEvent) -> void:
- if event.is_action_pressed("menu"):
+ if event.is_action_pressed("menu") and Network.is_my_turn():
$HUDMain.visible = true
grid_selector.process_mode = Node.PROCESS_MODE_DISABLED
$HUDMain/PanelContainer/VBoxContainer/Button.grab_focus()
-
- if event.is_action_pressed("test_4"):
- var teams := ["1", "2"]
- var tiles := [Vector2i(1,6), Vector2i(3,6)]
- grid_selector.placement_tile_atlas_coordinates = tiles[(tiles.find(grid_selector.placement_tile_atlas_coordinates) + 1) % tiles.size()]
- grid_selector.current_team = teams[(teams.find(grid_selector.current_team) + 1) % teams.size()]
-func _on_grid_selector_placed_tiles(grid_positions: Array) -> void:
+@rpc("any_peer", "call_local")
+func place_tiles(grid_positions: Array, team: String) -> void:
+ for p in grid_positions:
+ $Floor.set_cell(
+ p,
+ teams[team].placement_tile_source_id,
+ teams[team].placement_tile_atlas_coordinates,
+ teams[team].placement_tile_alternative_tile
+ )
+
for p in grid_positions:
grid.set_point_solid(p, false)
+ grid_selector.current_state.draw($Ground.local_to_map(grid_selector.base_position))
+ grid_selector.adjust_height(%RemoteSelector)
+
+
+@rpc("any_peer", "call_local")
+func place_unit(unit_position: Vector2, team: String) -> void:
var unit = preload("res://unit/unit.tscn").instantiate()
- unit.global_position = %GridSelector.global_position + $Floor.position
- unit.current_team = grid_selector.current_team
- add_child(unit)
+ unit.global_position = unit_position + $Floor.position
+ unit.current_team = team
+ unit.modulate = Network.current_player.get_color()
+ add_child(unit, true)
# block unit tile for movement
- grid.set_point_solid($Ground.local_to_map(%GridSelector.global_position), true)
+ grid.set_point_solid($Ground.local_to_map(unit_position), true)
+
+
+@rpc("any_peer", "call_remote")
+func move_unit(unit_node_path: String, path: Array) -> void:
+ var unit: Node2D = get_node(unit_node_path)
+ var tween = get_tree().create_tween()
+ for p in path.slice(1): # remove starting position
+ tween.tween_property(unit, "global_position", p + $Floor.position, 0.1)
+ await tween.finished
+
+ # clear previous tile and set new tile solid
+ grid.set_point_solid($Ground.local_to_map(path[0]), false)
+ grid.set_point_solid($Ground.local_to_map(path[path.size() - 1]), true)
+
+
+func _on_grid_selector_placed_tiles(grid_positions: Array) -> void:
+ place_tiles.rpc(grid_positions, Network.current_player.current_team_name)
+ place_unit.rpc(%GridSelector.global_position, Network.current_player.current_team_name)
grid_selector.current_state = grid_selector.state_select
func _on_grid_selector_move_mode_confirmed(path: Array) -> void:
grid_selector.process_mode = Node.PROCESS_MODE_DISABLED
- var unit: Node2D = grid_selector.current_entity
- var tween = get_tree().create_tween()
- for p in path.slice(1): # remove starting position
- tween.tween_property(unit, "global_position", p + $Floor.position, 0.1)
+ move_unit.rpc(grid_selector.current_entity.get_path(), path)
+ await move_unit(grid_selector.current_entity.get_path(), path)
- await tween.finished
grid_selector.process_mode = Node.PROCESS_MODE_INHERIT
grid_selector.current_state = grid_selector.get_node("StateSelect")
grid_selector.current_state.draw($Ground.local_to_map(path[path.size() - 1]))
- # clear previous tile and set new tile solid
- grid.set_point_solid($Ground.local_to_map(path[0]), false)
- grid.set_point_solid($Ground.local_to_map(path[path.size() - 1]), true)
+ Network.current_player.set_current_move_points(Network.current_player.current_move_points - (path.size() - 1))
+ grid_selector.move_mode_max_range = Network.current_player.current_move_points
func _on_grid_selector_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void:
entity.queue_free()
grid.set_point_solid(grid_position, false)
+
+
+func _on_grid_selector_moved(grid_position: Vector2i) -> void:
+ if Network.is_my_turn():
+ move_remote_selector.rpc(grid_position)
+
+@rpc("any_peer", "call_remote")
+func move_remote_selector(grid_position: Vector2i) -> void:
+ %RemoteSelector.global_position = $Ground.map_to_local(grid_position)
+ grid_selector.adjust_height(%RemoteSelector)
diff --git a/stage/stage.tscn b/stage/stage.tscn
index 7a2c83a..0490231 100644
--- a/stage/stage.tscn
+++ b/stage/stage.tscn
@@ -1,10 +1,22 @@
-[gd_scene load_steps=6 format=4 uid="uid://btphwdkbxijnr"]
+[gd_scene load_steps=10 format=4 uid="uid://btphwdkbxijnr"]
[ext_resource type="TileSet" uid="uid://dl0umywqpu3m8" path="res://stage/assets/tilemap.tres" id="1_0isyp"]
[ext_resource type="Script" uid="uid://do2ktbmxsqjvj" path="res://stage/stage.gd" id="1_ccrgc"]
[ext_resource type="PackedScene" uid="uid://dfhnxccd41wo0" path="res://stage/grid_selector/grid_selector.tscn" id="3_e6w2r"]
[ext_resource type="Script" uid="uid://dp6j6hjfrx2l4" path="res://stage/hud_unit.gd" id="4_e13a1"]
+[ext_resource type="Shader" uid="uid://d4hua7o4d6n1m" path="res://stage/grid_selector/grid_selector_item.gdshader" id="4_u7g2e"]
+[ext_resource type="Texture2D" uid="uid://db0v50mdroaox" path="res://stage/assets/isometric-tile.png" id="5_h4sia"]
[ext_resource type="Script" uid="uid://dydykm70ex0q0" path="res://stage/hud_main.gd" id="5_x0v28"]
+[ext_resource type="Script" uid="uid://bm0yvrdltu4n1" path="res://stage/hud_move_mode.gd" id="6_cxybx"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_fwirk"]
+shader = ExtResource("4_u7g2e")
+shader_parameter/color = Color(9.14484e-06, 0.808187, 0, 1)
+shader_parameter/color2 = Color(1.06369e-05, 0.734862, 9.62615e-07, 1)
+shader_parameter/width = 1.0
+shader_parameter/pattern = 0
+shader_parameter/inside = true
+shader_parameter/add_margins = false
[node name="Stage" type="Node2D"]
y_sort_enabled = true
@@ -30,13 +42,19 @@ unique_name_in_owner = true
stage = NodePath("..")
ground_map = NodePath("../Ground")
floor_map = NodePath("../Floor")
-current_team = "1"
selection_collision_mask = 2
placement_tile_source_id = 1
placement_tile_atlas_coordinates = Vector2i(1, 6)
range_select_current_range = 2
range_select_collision_mask = 2
+[node name="RemoteSelector" type="Sprite2D" parent="."]
+unique_name_in_owner = true
+modulate = Color(0.92549, 0.92549, 0, 1)
+texture_filter = 1
+material = SubResource("ShaderMaterial_fwirk")
+texture = ExtResource("5_h4sia")
+
[node name="HUDUnit" type="CanvasLayer" parent="."]
visible = false
script = ExtResource("4_e13a1")
@@ -84,9 +102,26 @@ theme_override_constants/separation = 0
layout_mode = 2
text = "Roll"
+[node name="Button2" type="Button" parent="HUDMain/PanelContainer/VBoxContainer"]
+layout_mode = 2
+text = "End Turn"
+
+[node name="HUDMoveMode" type="CanvasLayer" parent="."]
+visible = false
+script = ExtResource("6_cxybx")
+
+[node name="PanelContainer" type="PanelContainer" parent="HUDMoveMode"]
+offset_right = 40.0
+offset_bottom = 40.0
+
+[node name="Label" type="Label" parent="HUDMoveMode/PanelContainer"]
+layout_mode = 2
+
[connection signal="move_mode_confirmed" from="GridSelector" to="." method="_on_grid_selector_move_mode_confirmed"]
+[connection signal="moved" from="GridSelector" to="." method="_on_grid_selector_moved"]
[connection signal="placed_tiles" from="GridSelector" to="." method="_on_grid_selector_placed_tiles"]
[connection signal="range_select_confirmed" from="GridSelector" to="." method="_on_grid_selector_range_select_confirmed"]
[connection signal="pressed" from="HUDUnit/PanelContainer/VBoxContainer/Button" to="HUDUnit" method="_on_button_pressed"]
[connection signal="pressed" from="HUDUnit/PanelContainer/VBoxContainer/Button2" to="HUDUnit" method="_on_button_2_pressed"]
[connection signal="pressed" from="HUDMain/PanelContainer/VBoxContainer/Button" to="HUDMain" method="_on_button_pressed"]
+[connection signal="pressed" from="HUDMain/PanelContainer/VBoxContainer/Button2" to="HUDMain" method="_on_button_2_pressed"]
diff --git a/stage/team.gd b/stage/team.gd
new file mode 100644
index 0000000..5c66f51
--- /dev/null
+++ b/stage/team.gd
@@ -0,0 +1,9 @@
+class_name Team
+
+
+@export var name: String
+
+@export_group("Placement Tile", "placement_tile")
+@export var placement_tile_source_id: int
+@export var placement_tile_atlas_coordinates: Vector2i
+@export var placement_tile_alternative_tile: int
diff --git a/stage/team.gd.uid b/stage/team.gd.uid
new file mode 100644
index 0000000..05fcf1c
--- /dev/null
+++ b/stage/team.gd.uid
@@ -0,0 +1 @@
+uid://c0k88psw6lf7q