oil_tanker: add dialogues
This commit is contained in:
parent
46e6815abc
commit
29dcc1630c
5
dialogues/game1.json
Normal file
5
dialogues/game1.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
{"name": "Herbert", "text": "As I was on my daily morning walk, I saw something strange."},
|
||||||
|
{"name": "Herbert", "text": "There was some sort of weird goo floating around."},
|
||||||
|
{"name": "Herbert", "text": "So I decided to look for the source."}
|
||||||
|
]
|
5
dialogues/oilTanker1.json
Normal file
5
dialogues/oilTanker1.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
{"name": "Herbert", "text": "Finally I found the source.", "timer": 4, "auto": true, "upside_down": true},
|
||||||
|
{"name": "Herbert", "text": "It was a recently sunk oil tanker.", "timer": 5, "auto": true, "upside_down": true},
|
||||||
|
{"name": "Herbert", "text": "I had to investigate further.", "timer": 3, "auto": true, "upside_down": true}
|
||||||
|
]
|
3
dialogues/oilTanker2.json
Normal file
3
dialogues/oilTanker2.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[
|
||||||
|
{"name": "Herbert", "text": "The closer I got, the more oil there was.", "timer": 4, "auto": true, "upside_down": true}
|
||||||
|
]
|
5
dialogues/oilTanker3.json
Normal file
5
dialogues/oilTanker3.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
{"name": "Herbert", "text": "The inside was full of oil, I was really close.", "upside_down": true},
|
||||||
|
{"name": "Herbert", "text": "And there it was, one of the tank was damaged.", "upside_down": true},
|
||||||
|
{"name": "Herbert", "text": "I'm just a crab, I couldn't do anything about it.", "upside_down": true, "animation": "fadeout", "timer": 2}
|
||||||
|
]
|
5
dialogues/oilTanker4.json
Normal file
5
dialogues/oilTanker4.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
{"name": "Herbert", "text": "Back at my home, there was goo everywhere.", "expression": "black"},
|
||||||
|
{"animation": "fadein", "timer": 2, "auto": true},
|
||||||
|
{"name": "Herbert", "text": "My friends and I were forced to move..."}
|
||||||
|
]
|
@ -1,4 +1,4 @@
|
|||||||
[gd_resource type="SpriteFrames" load_steps=8 format=2]
|
[gd_resource type="SpriteFrames" load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://images/campfire/Choice.png" type="Texture" id=1]
|
[ext_resource path="res://images/campfire/Choice.png" type="Texture" id=1]
|
||||||
|
|
||||||
@ -14,18 +14,10 @@ region = Rect2( 192, 0, 192, 108 )
|
|||||||
atlas = ExtResource( 1 )
|
atlas = ExtResource( 1 )
|
||||||
region = Rect2( 384, 0, 192, 108 )
|
region = Rect2( 384, 0, 192, 108 )
|
||||||
|
|
||||||
[sub_resource type="AtlasTexture" id=4]
|
|
||||||
atlas = ExtResource( 1 )
|
|
||||||
region = Rect2( 192, 0, 192, 108 )
|
|
||||||
|
|
||||||
[sub_resource type="AtlasTexture" id=5]
|
[sub_resource type="AtlasTexture" id=5]
|
||||||
atlas = ExtResource( 1 )
|
atlas = ExtResource( 1 )
|
||||||
region = Rect2( 576, 0, 192, 108 )
|
region = Rect2( 576, 0, 192, 108 )
|
||||||
|
|
||||||
[sub_resource type="AtlasTexture" id=6]
|
|
||||||
atlas = ExtResource( 1 )
|
|
||||||
region = Rect2( 192, 0, 192, 108 )
|
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
animations = [ {
|
animations = [ {
|
||||||
"frames": [ SubResource( 1 ), SubResource( 2 ) ],
|
"frames": [ SubResource( 1 ), SubResource( 2 ) ],
|
||||||
@ -33,12 +25,12 @@ animations = [ {
|
|||||||
"name": "default",
|
"name": "default",
|
||||||
"speed": 2.0
|
"speed": 2.0
|
||||||
}, {
|
}, {
|
||||||
"frames": [ SubResource( 3 ), SubResource( 4 ) ],
|
"frames": [ SubResource( 3 ) ],
|
||||||
"loop": true,
|
"loop": true,
|
||||||
"name": "truth",
|
"name": "truth",
|
||||||
"speed": 2.0
|
"speed": 2.0
|
||||||
}, {
|
}, {
|
||||||
"frames": [ SubResource( 5 ), SubResource( 6 ) ],
|
"frames": [ SubResource( 5 ) ],
|
||||||
"loop": true,
|
"loop": true,
|
||||||
"name": "lie",
|
"name": "lie",
|
||||||
"speed": 2.0
|
"speed": 2.0
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.3 KiB |
@ -26,8 +26,6 @@ __meta__ = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[node name="Dialogue" parent="UI" instance=ExtResource( 4 )]
|
[node name="Dialogue" parent="UI" instance=ExtResource( 4 )]
|
||||||
name_label_path = NodePath("../Dialogue/MarginContainer/VBoxContainer/MarginContainer/MarginContainer/CharacterName")
|
|
||||||
text_label_path = NodePath("../Dialogue/MarginContainer/VBoxContainer/MarginContainer2/MarginContainer/DialogText")
|
|
||||||
|
|
||||||
[node name="TheChoice" type="AnimatedSprite" parent="."]
|
[node name="TheChoice" type="AnimatedSprite" parent="."]
|
||||||
visible = false
|
visible = false
|
||||||
|
@ -77,8 +77,8 @@ script = ExtResource( 3 )
|
|||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
name_label_path = NodePath("MarginContainer/VBoxContainer/MarginContainer/MarginContainer/CharacterName")
|
name_label_path = NodePath("MarginContainer/VBoxContainer/NameContainer/MarginContainer/CharacterName")
|
||||||
text_label_path = NodePath("MarginContainer/VBoxContainer/MarginContainer2/MarginContainer/DialogText")
|
text_label_path = NodePath("MarginContainer/VBoxContainer/TextContainer/MarginContainer/DialogText")
|
||||||
|
|
||||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
@ -100,7 +100,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"]
|
[node name="NameContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"]
|
||||||
margin_top = 47.0
|
margin_top = 47.0
|
||||||
margin_right = 22.0
|
margin_right = 22.0
|
||||||
margin_bottom = 80.0
|
margin_bottom = 80.0
|
||||||
@ -112,7 +112,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="DialogBackground" type="NinePatchRect" parent="MarginContainer/VBoxContainer/MarginContainer"]
|
[node name="DialogBackground" type="NinePatchRect" parent="MarginContainer/VBoxContainer/NameContainer"]
|
||||||
show_behind_parent = true
|
show_behind_parent = true
|
||||||
material = SubResource( 5 )
|
material = SubResource( 5 )
|
||||||
margin_left = 4.0
|
margin_left = 4.0
|
||||||
@ -127,7 +127,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/MarginContainer"]
|
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/NameContainer"]
|
||||||
margin_left = 4.0
|
margin_left = 4.0
|
||||||
margin_right = 18.0
|
margin_right = 18.0
|
||||||
margin_bottom = 33.0
|
margin_bottom = 33.0
|
||||||
@ -135,7 +135,7 @@ size_flags_horizontal = 0
|
|||||||
custom_constants/margin_right = 4
|
custom_constants/margin_right = 4
|
||||||
custom_constants/margin_left = 4
|
custom_constants/margin_left = 4
|
||||||
|
|
||||||
[node name="CharacterName" type="RichTextLabel" parent="MarginContainer/VBoxContainer/MarginContainer/MarginContainer"]
|
[node name="CharacterName" type="RichTextLabel" parent="MarginContainer/VBoxContainer/NameContainer/MarginContainer"]
|
||||||
margin_left = 4.0
|
margin_left = 4.0
|
||||||
margin_right = 10.0
|
margin_right = 10.0
|
||||||
margin_bottom = 33.0
|
margin_bottom = 33.0
|
||||||
@ -150,7 +150,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="MarginContainer2" type="MarginContainer" parent="MarginContainer/VBoxContainer"]
|
[node name="TextContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"]
|
||||||
show_behind_parent = true
|
show_behind_parent = true
|
||||||
margin_top = 80.0
|
margin_top = 80.0
|
||||||
margin_right = 184.0
|
margin_right = 184.0
|
||||||
@ -159,7 +159,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="DialogBackground2" type="NinePatchRect" parent="MarginContainer/VBoxContainer/MarginContainer2"]
|
[node name="DialogBackground2" type="NinePatchRect" parent="MarginContainer/VBoxContainer/TextContainer"]
|
||||||
show_behind_parent = true
|
show_behind_parent = true
|
||||||
material = SubResource( 5 )
|
material = SubResource( 5 )
|
||||||
margin_right = 184.0
|
margin_right = 184.0
|
||||||
@ -173,7 +173,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/MarginContainer2"]
|
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/TextContainer"]
|
||||||
margin_right = 184.0
|
margin_right = 184.0
|
||||||
margin_bottom = 28.0
|
margin_bottom = 28.0
|
||||||
custom_constants/margin_right = 6
|
custom_constants/margin_right = 6
|
||||||
@ -184,7 +184,7 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="DialogText" type="RichTextLabel" parent="MarginContainer/VBoxContainer/MarginContainer2/MarginContainer"]
|
[node name="DialogText" type="RichTextLabel" parent="MarginContainer/VBoxContainer/TextContainer/MarginContainer"]
|
||||||
margin_left = 6.0
|
margin_left = 6.0
|
||||||
margin_top = 2.0
|
margin_top = 2.0
|
||||||
margin_right = 178.0
|
margin_right = 178.0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[gd_scene load_steps=37 format=2]
|
[gd_scene load_steps=40 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scripts/oil_tanker.gd" type="Script" id=1]
|
[ext_resource path="res://scripts/oil_tanker.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://images/oil_tanker/OilTanker.tres" type="SpriteFrames" id=2]
|
[ext_resource path="res://images/oil_tanker/OilTanker.tres" type="SpriteFrames" id=2]
|
||||||
@ -8,6 +8,8 @@
|
|||||||
[ext_resource path="res://scripts/GooEmitter.gd" type="Script" id=6]
|
[ext_resource path="res://scripts/GooEmitter.gd" type="Script" id=6]
|
||||||
[ext_resource path="res://images/oil_tanker/HerbertMustGo.tres" type="SpriteFrames" id=7]
|
[ext_resource path="res://images/oil_tanker/HerbertMustGo.tres" type="SpriteFrames" id=7]
|
||||||
[ext_resource path="res://images/goo/BigGoo1.tres" type="Resource" id=8]
|
[ext_resource path="res://images/goo/BigGoo1.tres" type="Resource" id=8]
|
||||||
|
[ext_resource path="res://scenes/dialogue.tscn" type="PackedScene" id=9]
|
||||||
|
[ext_resource path="res://scripts/UI.gd" type="Script" id=10]
|
||||||
[ext_resource path="res://images/goo/BigGoo2.tres" type="Resource" id=11]
|
[ext_resource path="res://images/goo/BigGoo2.tres" type="Resource" id=11]
|
||||||
[ext_resource path="res://images/goo/goo5.tres" type="Resource" id=12]
|
[ext_resource path="res://images/goo/goo5.tres" type="Resource" id=12]
|
||||||
[ext_resource path="res://images/goo/goo8.tres" type="Resource" id=13]
|
[ext_resource path="res://images/goo/goo8.tres" type="Resource" id=13]
|
||||||
@ -67,8 +69,15 @@ b = Vector2( 107.673, 44.0238 )
|
|||||||
[sub_resource type="RectangleShape2D" id=19]
|
[sub_resource type="RectangleShape2D" id=19]
|
||||||
extents = Vector2( 4.85875, 16.0913 )
|
extents = Vector2( 4.85875, 16.0913 )
|
||||||
|
|
||||||
|
[sub_resource type="RectangleShape2D" id=21]
|
||||||
|
extents = Vector2( 4.85875, 16.0913 )
|
||||||
|
|
||||||
[node name="Node2D" type="Node2D"]
|
[node name="Node2D" type="Node2D"]
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
dialogue_1 = "res://dialogues/oilTanker1.json"
|
||||||
|
dialogue_2 = "res://dialogues/oilTanker2.json"
|
||||||
|
dialogue_3 = "res://dialogues/oilTanker3.json"
|
||||||
|
dialogue_4 = "res://dialogues/oilTanker4.json"
|
||||||
|
|
||||||
[node name="HerbertMustGo" type="AnimatedSprite" parent="."]
|
[node name="HerbertMustGo" type="AnimatedSprite" parent="."]
|
||||||
frames = ExtResource( 7 )
|
frames = ExtResource( 7 )
|
||||||
@ -251,6 +260,23 @@ shape = SubResource( 18 )
|
|||||||
position = Vector2( 197.689, 97.7763 )
|
position = Vector2( 197.689, 97.7763 )
|
||||||
shape = SubResource( 19 )
|
shape = SubResource( 19 )
|
||||||
|
|
||||||
|
[node name="DialogueTrigger" type="Area2D" parent="InsideOilTanker"]
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="InsideOilTanker/DialogueTrigger"]
|
||||||
|
position = Vector2( 84.0628, 97.7763 )
|
||||||
|
shape = SubResource( 21 )
|
||||||
|
|
||||||
[node name="OilTanker" type="AnimatedSprite" parent="."]
|
[node name="OilTanker" type="AnimatedSprite" parent="."]
|
||||||
frames = ExtResource( 2 )
|
frames = ExtResource( 2 )
|
||||||
centered = false
|
centered = false
|
||||||
|
|
||||||
|
[node name="UI" type="Control" parent="."]
|
||||||
|
margin_right = 192.0
|
||||||
|
margin_bottom = 108.0
|
||||||
|
script = ExtResource( 10 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Dialog" parent="UI" instance=ExtResource( 9 )]
|
||||||
|
visible = false
|
||||||
|
@ -82,14 +82,21 @@ func update() -> void:
|
|||||||
music_player.play(audio)
|
music_player.play(audio)
|
||||||
|
|
||||||
# UI
|
# UI
|
||||||
|
var upside_down = line.get('upside_down', false)
|
||||||
|
if upside_down:
|
||||||
|
$MarginContainer/VBoxContainer.alignment = BoxContainer.ALIGN_BEGIN
|
||||||
|
$MarginContainer/VBoxContainer.add_child_below_node($MarginContainer/VBoxContainer/TextContainer, $MarginContainer/VBoxContainer/NameContainer)
|
||||||
|
else:
|
||||||
|
$MarginContainer/VBoxContainer.alignment = BoxContainer.ALIGN_END
|
||||||
|
$MarginContainer/VBoxContainer.add_child_below_node($MarginContainer/VBoxContainer/NameContainer, $MarginContainer/VBoxContainer/TextContainer)
|
||||||
|
|
||||||
|
if text != '' and character_name != '':
|
||||||
name_label.bbcode_text = character_name
|
name_label.bbcode_text = character_name
|
||||||
name_label.rect_min_size.x = name_label.get_font('normal_font').get_string_size(name_label.text).x
|
name_label.rect_min_size.x = name_label.get_font('normal_font').get_string_size(name_label.text).x
|
||||||
text_label.bbcode_text = text
|
text_label.bbcode_text = text
|
||||||
|
|
||||||
if text == "":
|
if text == "": hide()
|
||||||
hide()
|
else: show()
|
||||||
else:
|
|
||||||
show()
|
|
||||||
|
|
||||||
emit_signal('update')
|
emit_signal('update')
|
||||||
|
|
||||||
|
5
scripts/UI.gd
Normal file
5
scripts/UI.gd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
extends Control
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
var origin = get_tree().root.get_viewport().canvas_transform.get_origin()
|
||||||
|
rect_position.x = -origin.x
|
@ -50,5 +50,6 @@ func _process(delta):
|
|||||||
$Sprite.play('left')
|
$Sprite.play('left')
|
||||||
|
|
||||||
func _physics_process(delta : float):
|
func _physics_process(delta : float):
|
||||||
|
if sleep: return
|
||||||
apply_central_impulse(dir.normalized() * 10)
|
apply_central_impulse(dir.normalized() * 10)
|
||||||
|
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
|
|
||||||
|
onready var dialogue_box = $UI/Dialog
|
||||||
|
|
||||||
#0
|
#0
|
||||||
onready var oil_tanker = $OilTanker
|
onready var oil_tanker = $OilTanker
|
||||||
|
export (String, FILE, "*.json") var dialogue_1
|
||||||
|
|
||||||
#1
|
#1
|
||||||
onready var oil_tanker_inside_1 = $InsideOilTanker
|
onready var oil_tanker_inside_1 = $InsideOilTanker
|
||||||
onready var player_1 = $InsideOilTanker/Player
|
onready var player_1 = $InsideOilTanker/Player
|
||||||
onready var next_trigger_1 = $InsideOilTanker/NextTrigger
|
onready var next_trigger_1 = $InsideOilTanker/NextTrigger
|
||||||
|
onready var dialogue_trigger_1 = $InsideOilTanker/DialogueTrigger
|
||||||
|
export (String, FILE, "*.json") var dialogue_2
|
||||||
|
|
||||||
#2
|
#2
|
||||||
onready var oil_tanker_inside_2 = $InsideOilTanker2
|
onready var oil_tanker_inside_2 = $InsideOilTanker2
|
||||||
@ -15,18 +20,35 @@ onready var player_2 = $InsideOilTanker2/Player
|
|||||||
onready var prop1 = $InsideOilTanker2/Parallax/Prop1
|
onready var prop1 = $InsideOilTanker2/Parallax/Prop1
|
||||||
onready var prop2 = $InsideOilTanker2/Parallax/Prop2
|
onready var prop2 = $InsideOilTanker2/Parallax/Prop2
|
||||||
onready var next_trigger_2 = $InsideOilTanker2/NextTrigger
|
onready var next_trigger_2 = $InsideOilTanker2/NextTrigger
|
||||||
|
export (String, FILE, "*.json") var dialogue_3
|
||||||
|
|
||||||
#3
|
#3
|
||||||
onready var herbert_must_go_3 = $HerbertMustGo
|
onready var herbert_must_go_3 = $HerbertMustGo
|
||||||
|
export (String, FILE, "*.json") var dialogue_4
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
assert(dialogue_1 != null)
|
||||||
|
assert(dialogue_2 != null)
|
||||||
|
assert(dialogue_3 != null)
|
||||||
|
assert(dialogue_4 != null)
|
||||||
|
|
||||||
oil_tanker.connect('animation_finished', self, 'end_step_0')
|
oil_tanker.connect('animation_finished', self, 'end_step_0')
|
||||||
next_trigger_1.connect("body_entered", self, 'end_step_1')
|
next_trigger_1.connect("body_entered", self, 'end_step_1')
|
||||||
|
dialogue_trigger_1.connect("body_entered", self, 'dialogue_2')
|
||||||
next_trigger_2.connect("body_entered", self, 'end_step_2')
|
next_trigger_2.connect("body_entered", self, 'end_step_2')
|
||||||
|
|
||||||
|
yield(get_tree().create_timer(1), "timeout")
|
||||||
|
yield(dialogue_box.start_dialogue(dialogue_1), 'end')
|
||||||
|
|
||||||
# oil_tanker.frame = 12
|
# oil_tanker.frame = 12
|
||||||
# end_step_0()
|
# end_step_0()
|
||||||
# end_step_1(player_1)
|
# end_step_1(player_1)
|
||||||
|
# end_step_2(player_2)
|
||||||
|
|
||||||
|
func dialogue_2(body : Node):
|
||||||
|
print('end_step_1')
|
||||||
|
if body.name == "Player":
|
||||||
|
yield(dialogue_box.start_dialogue(dialogue_2), 'end')
|
||||||
|
|
||||||
func end_step_0():
|
func end_step_0():
|
||||||
print('end_step_0')
|
print('end_step_0')
|
||||||
@ -45,10 +67,13 @@ func end_step_1(body : Node):
|
|||||||
func end_step_2(body : Node):
|
func end_step_2(body : Node):
|
||||||
print('end_step_2')
|
print('end_step_2')
|
||||||
if body.name == "Player":
|
if body.name == "Player":
|
||||||
|
player_2.sleep = true
|
||||||
|
yield(dialogue_box.start_dialogue(dialogue_3), 'end')
|
||||||
oil_tanker_inside_2.queue_free()
|
oil_tanker_inside_2.queue_free()
|
||||||
herbert_must_go_3.play('default')
|
herbert_must_go_3.play('default')
|
||||||
|
|
||||||
yield(get_tree().create_timer(5), "timeout")
|
yield(get_tree().create_timer(1), "timeout")
|
||||||
|
yield(dialogue_box.start_dialogue(dialogue_4), 'end')
|
||||||
get_tree().change_scene("res://scenes/campfire2.tscn")
|
get_tree().change_scene("res://scenes/campfire2.tscn")
|
||||||
|
|
||||||
func _input(event):
|
func _input(event):
|
||||||
|
Loading…
Reference in New Issue
Block a user