add lore feedback

This commit is contained in:
betalars 2025-05-30 16:10:44 +02:00
parent 0d012766af
commit 7bc780ebc2
12 changed files with 281 additions and 14 deletions

BIN
src/base-environments/youth_room/audio/board_completed.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bywmf3patoe56"
path="res://.godot/imported/board_completed.wav-5729ec7ec6afa4c9611784f034fcb0d1.sample"
[deps]
source_file="res://base-environments/youth_room/audio/board_completed.wav"
dest_files=["res://.godot/imported/board_completed.wav-5729ec7ec6afa4c9611784f034fcb0d1.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

BIN
src/base-environments/youth_room/audio/board_incomplete.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dj8fpajqhj4k7"
path="res://.godot/imported/board_incomplete.wav-49b228daaa12eb0be66520e1d2f3a349.sample"
[deps]
source_file="res://base-environments/youth_room/audio/board_incomplete.wav"
dest_files=["res://.godot/imported/board_incomplete.wav-49b228daaa12eb0be66520e1d2f3a349.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

BIN
src/base-environments/youth_room/audio/board_unfitting.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://brolrc3lhaeid"
path="res://.godot/imported/board_unfitting.wav-afbf1c6abdc3ac1e4cd8ff645b647e50.sample"
[deps]
source_file="res://base-environments/youth_room/audio/board_unfitting.wav"
dest_files=["res://.godot/imported/board_unfitting.wav-afbf1c6abdc3ac1e4cd8ff645b647e50.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=112 format=4 uid="uid://b3b0gyvklqn50"]
[gd_scene load_steps=113 format=4 uid="uid://b3b0gyvklqn50"]
[ext_resource type="Script" uid="uid://belkrno67sft0" path="res://base-environments/youth_room/room_handle.gd" id="1_aitp0"]
[ext_resource type="PackedScene" uid="uid://c0i4ydmxtxfho" path="res://base-environments/youth_room/import/youth_room.glb" id="1_jf3oi"]
@ -901,6 +901,9 @@ radius = 0.469631
[sub_resource type="ViewportTexture" id="ViewportTexture_hdmps"]
viewport_path = NodePath("logic/MindBoard/UiWrapper/UiSprite/SubViewport")
[sub_resource type="ViewportTexture" id="ViewportTexture_v3447"]
viewport_path = NodePath("logic/Door/UiWrapper/UiSprite/SubViewport")
[sub_resource type="Animation" id="Animation_xum02"]
length = 0.001
tracks/0/type = "value"
@ -1781,6 +1784,7 @@ size = Vector2i(400, 350)
render_target_update_mode = 4
[node name="CollectableUi" parent="logic/MaskMemento/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
is_exit = null
[node name="HoverDetect" type="CollisionShape3D" parent="logic/MaskMemento"]
shape = SubResource("CapsuleShape3D_72g2i")
@ -1818,6 +1822,7 @@ render_target_update_mode = 4
[node name="CollectableUi" parent="logic/ClothesMemento/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
scene = 3
is_exit = null
[node name="HoverDetect" type="CollisionShape3D" parent="logic/ClothesMemento"]
transform = Transform3D(1, 0, 2.98023e-08, 0, 1, 0, -2.98023e-08, 0, 1, 0, -0.237872, 0)
@ -1856,6 +1861,7 @@ render_target_update_mode = 4
[node name="CollectableUi" parent="logic/ComicMemento/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
scene = 2
is_exit = null
[node name="HoverDetect" type="CollisionShape3D" parent="logic/ComicMemento"]
transform = Transform3D(1, 0, 2.98023e-08, 0, 1, 0, -2.98023e-08, 0, 1, 0, -0.237872, 0)
@ -1895,6 +1901,7 @@ render_target_update_mode = 4
[node name="CollectableUi" parent="logic/CeilingMemento/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
scene = 0
is_exit = null
[node name="HoverDetect" type="CollisionShape3D" parent="logic/CeilingMemento"]
transform = Transform3D(1, 0, 2.98023e-08, 0, 1, 0, -2.98023e-08, 0, 1, 0, -0.237872, 0)
@ -1933,11 +1940,50 @@ render_target_update_mode = 4
[node name="CollectableUi" parent="logic/MindBoard/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
is_board = true
is_exit = null
[node name="HoverDetect" type="CollisionShape3D" parent="logic/MindBoard"]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0)
shape = SubResource("CapsuleShape3D_72g2i")
[node name="Door" type="Area3D" parent="logic" groups=["interactables"]]
unique_name_in_owner = true
transform = Transform3D(0.999999, 0, 4.9738e-14, 0, 1, 0, -4.9738e-14, 0, 0.999999, 0.115203, 1.3931, -0.954428)
collision_layer = 16
script = ExtResource("11_6fwv8")
[node name="collectable_particles" parent="logic/Door" instance=ExtResource("12_qxx2k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00898492, -0.14171, 0.152755)
visible = false
[node name="UiWrapper" type="Area3D" parent="logic/Door"]
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
script = ExtResource("11_7uxd8")
billboard = false
[node name="UI_click_collider" type="CollisionShape3D" parent="logic/Door/UiWrapper"]
transform = Transform3D(2.56, -5.96046e-08, 4.76837e-07, 1.78814e-07, 2.56, -4.17233e-07, -2.38419e-07, -5.96046e-08, 2.56, 0, 1.90735e-06, 0.238397)
shape = SubResource("BoxShape3D_cb3g8")
[node name="UiSprite" type="Sprite3D" parent="logic/Door/UiWrapper"]
transform = Transform3D(1, 0, 2.4869e-14, 0, 1, 0, -2.4869e-14, 0, 1, -1.0693e-14, 0, 0.180784)
modulate = Color(0.941183, 0.904347, 0.886647, 1)
pixel_size = 0.015
texture = SubResource("ViewportTexture_v3447")
[node name="SubViewport" type="SubViewport" parent="logic/Door/UiWrapper/UiSprite"]
transparent_bg = true
use_hdr_2d = true
size = Vector2i(400, 350)
render_target_update_mode = 4
[node name="CollectableUi" parent="logic/Door/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
is_exit = true
[node name="HoverDetect" type="CollisionShape3D" parent="logic/Door"]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0)
shape = SubResource("CapsuleShape3D_72g2i")
[node name="DoorTrigger" type="Area3D" parent="logic" groups=["interactables"]]
unique_name_in_owner = true
process_mode = 4
@ -1971,6 +2017,7 @@ size = Vector2i(400, 350)
render_target_update_mode = 4
[node name="CollectableUi" parent="logic/DoorTrigger/UiWrapper/UiSprite/SubViewport" instance=ExtResource("25_ghmim")]
is_exit = null
[node name="HoverDetect" type="CollisionShape3D" parent="logic/DoorTrigger"]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0)
@ -2293,7 +2340,6 @@ light_array = Array[Vector3]([Vector3(-0.545, 0.915, 1.035), Vector3(-0.47, 0.85
[connection signal="body_exited" from="logic/Bed and Ladders/reset_failover" to="logic/PlayerController" method="_on_bed_exit"]
[connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending_button" method="hide"]
[connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending" method="show"]
[connection signal="board_completed" from="logic/UI/Board" to="logic/UI/ending_button" method="show"]
[connection signal="emit_thunder" from="logic/ScenePlayer/JuiJutsu" to="AnimationPlayer" method="play" binds= ["lighting_and_thunder"]]
[connection signal="finished" from="logic/ScenePlayer/draven" to="logic/ScenePlayer" method="on_draeven_done"]
[connection signal="input_event" from="logic/MaskMemento/UiWrapper" to="logic/MaskMemento/UiWrapper" method="_on_input_event"]
@ -2306,4 +2352,7 @@ light_array = Array[Vector3]([Vector3(-0.545, 0.915, 1.035), Vector3(-0.47, 0.85
[connection signal="scene_skipped" from="logic/CeilingMemento/UiWrapper/UiSprite/SubViewport/CollectableUi" to="logic/UI/Board" method="on_scene_skipped"]
[connection signal="input_event" from="logic/MindBoard/UiWrapper" to="logic/MindBoard/UiWrapper" method="_on_input_event"]
[connection signal="open_board" from="logic/MindBoard/UiWrapper/UiSprite/SubViewport/CollectableUi" to="logic/UI/Board" method="claim_focus"]
[connection signal="input_event" from="logic/Door/UiWrapper" to="logic/Door/UiWrapper" method="_on_input_event"]
[connection signal="open_board" from="logic/Door/UiWrapper/UiSprite/SubViewport/CollectableUi" to="logic/UI/Board" method="claim_focus"]
[connection signal="input_event" from="logic/DoorTrigger/UiWrapper" to="logic/DoorTrigger/UiWrapper" method="_on_input_event"]
[connection signal="exit_room" from="logic/DoorTrigger/UiWrapper/UiSprite/SubViewport/CollectableUi" to="logic/UI/ending" method="show"]

View File

@ -5,7 +5,7 @@ func _ready() -> void:
update_mix_target()
func update_mix_target():
if State.force_stereo:
if State.force_stereo or true:
mix_target = AudioStreamPlayer.MIX_TARGET_STEREO
else:
mix_target = AudioStreamPlayer.MIX_TARGET_CENTER

View File

@ -129,11 +129,10 @@ func _ready():
dropzone_size = get_viewport_rect().size - Vector2(dropzone_padding + size_reference.minimum_size.x, dropzone_padding)
if get_parent() == get_tree().root:
populate_board(["c_void", 'c_joy', "p_wet", "p_effort"])
populate_board(["c_void", 'c_joy', "p_wet", "p_worried_mother"])
populate_board(["c_jui_jutsu", 'c_hit', "p_girly", "p_vent"])
populate_board(["c_comic_heroes", 'c_teasing', "p_agent_q", "p_good_intended"])
populate_board(["c_out_of_world", 'c_confusion', "p_outer_conflict", "p_unique"])
mementos_collected = 2
has_stage = has_stage
@ -238,7 +237,7 @@ func handle_mouse_button(input: InputEventMouseButton, to_handle = currently_act
if sticky_note_container.get_child_count() > 0:
sticky_note_container.get_child(current_sticky_note_id).clear_if_empty()
current_context = NAVIGATE
if is_board_complete(): board_completed.emit()
check_board_comnpletion()
return
else:
var i: int = 0
@ -281,7 +280,18 @@ func _return_sticky_notes_to_panels():
if node is StickyNote:
node.is_dragable = true
func is_board_complete() -> bool:
var board_was_completed: bool = false
func check_board_comnpletion():
if is_board_complete():
for child:StickyNotePanel in sticky_note_container.get_children():
child.clear_if_empty()
if not board_was_completed:
board_was_completed = true
board_completed.emit()
if board_was_completed:
give_lore_feedback()
func is_board_complete():
if mementos_collected == 4:
for card in dropzone.get_children():
if card is Card:
@ -290,6 +300,35 @@ func is_board_complete() -> bool:
return true
return false
var unfitting: bool = false
var incomplete: bool = false
var complete: bool = false
func give_lore_feedback():
var fitting_card_count: int = 0
var total_card_count: int = 0
for child in dropzone.get_children():
if child is Card:
if child.has_sticky_note_attached():
fitting_card_count += int(child.card_id == child.get_attached_sticky_note().parent_id)
total_card_count += 1
if float(fitting_card_count) / float(total_card_count) < 0.2:
instructions.text = "You can move on, but you may not have understood Lisa."
if not unfitting:
$AnimationPlayer.play("unfitting")
unfitting = true
elif fitting_card_count != total_card_count or total_card_count != dropzone.get_child_count() or sticky_note_container.get_child_count() != 0:
instructions.text = TranslationServer.translate("You may leave the room, but Lisa only agrees with %d of the %d connections.") % [fitting_card_count, total_card_count]
if not incomplete:
$AnimationPlayer.play("incomplete")
incomplete = true
else:
instructions.text = "Lisa would like you to leave her room and move on."
if not complete:
$AnimationPlayer.play("complete")
complete = true
func is_board_lore() -> bool:
for card in dropzone.get_children():
if card is Card:
@ -392,7 +431,7 @@ func _input(event):
current_context = NAVIGATE
current_sticky_note_id += 1
current_dropzone_id = find_first_free_card()
if is_board_complete(): emit_signal("board_completed")
check_board_comnpletion()
else:
if !focus_stickies and card.has_sticky_note_attached():
currently_active_node = card.remove_sticky_note()

View File

@ -1,9 +1,13 @@
[gd_scene load_steps=9 format=3 uid="uid://bnskiyx1sksww"]
[gd_scene load_steps=18 format=3 uid="uid://bnskiyx1sksww"]
[ext_resource type="Texture2D" uid="uid://bi3xqdknw5tpe" path="res://logic-scenes/board/board-texture/Cork002_2K_Color.png" id="1_8brxc"]
[ext_resource type="Shader" uid="uid://kyd37e0s6fdu" path="res://logic-scenes/board/physics-board.gdshader" id="1_ggnth"]
[ext_resource type="Script" uid="uid://cqsor57nvowni" path="res://logic-scenes/board/card-board.gd" id="3_8v4c4"]
[ext_resource type="AudioStream" uid="uid://bywmf3patoe56" path="res://base-environments/youth_room/audio/board_completed.wav" id="5_qjqy3"]
[ext_resource type="AudioStream" uid="uid://dj8fpajqhj4k7" path="res://base-environments/youth_room/audio/board_incomplete.wav" id="6_vtvtf"]
[ext_resource type="Script" uid="uid://ddy8kb2hjvgss" path="res://logic-scenes/board/card collider.gd" id="6_wpxls"]
[ext_resource type="AudioStream" uid="uid://brolrc3lhaeid" path="res://base-environments/youth_room/audio/board_unfitting.wav" id="7_0phgc"]
[ext_resource type="Script" uid="uid://c1oub0cs7cph6" path="res://dev-util/stereo-switch.gd" id="8_ni75f"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ttqei"]
shader = ExtResource("1_ggnth")
@ -18,6 +22,74 @@ size = Vector2(4262, 766.5)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ivo5o"]
size = Vector2(4249, 766.5)
[sub_resource type="Animation" id="Animation_2qppy"]
resource_name = "complete"
length = 14.5
tracks/0/type = "audio"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimationPlayer/LisaFeedback")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.42,
"stream": ExtResource("5_qjqy3")
}],
"times": PackedFloat32Array(0.1)
}
tracks/0/use_blend = true
[sub_resource type="Animation" id="Animation_kvxnu"]
resource_name = "incomplete"
length = 12.0
tracks/0/type = "audio"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimationPlayer/LisaFeedback")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.36,
"stream": ExtResource("6_vtvtf")
}],
"times": PackedFloat32Array(0.1)
}
tracks/0/use_blend = true
[sub_resource type="Animation" id="Animation_k5h0q"]
resource_name = "unfitting"
length = 9.0
tracks/0/type = "audio"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimationPlayer/LisaFeedback")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"clips": [{
"end_offset": 1.06,
"start_offset": 0.59,
"stream": ExtResource("7_0phgc")
}],
"times": PackedFloat32Array(0.333333)
}
tracks/0/use_blend = true
[sub_resource type="Animation" id="Animation_qjqy3"]
length = 0.001
[sub_resource type="AnimationLibrary" id="AnimationLibrary_htay1"]
_data = {
&"RESET": SubResource("Animation_qjqy3"),
&"complete": SubResource("Animation_2qppy"),
&"incomplete": SubResource("Animation_kvxnu"),
&"unfitting": SubResource("Animation_k5h0q")
}
[node name="board" type="PanelContainer"]
material = SubResource("ShaderMaterial_ttqei")
clip_contents = true
@ -128,3 +200,13 @@ custom_minimum_size = Vector2(15, 0)
layout_mode = 2
[node name="Timer" type="Timer" parent="."]
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_htay1")
}
[node name="LisaFeedback" type="AudioStreamPlayer" parent="AnimationPlayer"]
mix_target = 2
bus = &"text"
script = ExtResource("8_ni75f")

View File

@ -77,8 +77,8 @@ var on_board: bool = false
func _init(sticky_name: String = "sticky_note", card_id: StringName = "-1") -> void:
name = sticky_name
text = sticky_name
parent_id = card_id
sticky_id = StringName( "%s.%s" % [parent_id, sticky_name] )
parent_id = StringName(card_id.rsplit(".", false, 1)[0])
sticky_id = card_id
func _ready() -> void:
if get_child_count() == 0:

View File

@ -125,8 +125,20 @@ class_name CollectableUi extends CenterContainer
else:
scene = scene
collected_box.show()
@export var is_exit:bool = false:
set(exit):
is_exit = exit
if is_inside_tree():
if exit:
if title_override == "": title_label.text = "Move on"
collected_box.hide()
else:
scene = scene
collected_box.show()
signal open_board
signal exit_room
#TODO implement proper scene skipping
signal scene_skipped(i: int)
@ -149,6 +161,7 @@ func _on_context_updated():
func update_state():
scene = scene
is_board = is_board
is_exit = is_exit
_on_context_updated()
func reveal():
@ -172,11 +185,14 @@ func _input(event: InputEvent) -> void:
print("handle input")
if not visible: return
if event.is_action_pressed("collect_memento_ui"):
if not is_board:
if not (is_board or is_exit):
collect_memento()
get_viewport().set_input_as_handled()
else:
open_board.emit()
if is_board:
open_board.emit()
if is_exit:
exit_room.emit()
elif event.is_action_pressed("option_memento_ui"):
is_expanded = true
get_viewport().set_input_as_handled()