Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
6e91407
Import LoreJam Team 13's project from Backstitch
wjt Jun 25, 2026
84f63ec
Lore Jam quest: Instantiate Teleporter scene
manuq Jul 20, 2026
b719e1d
Lore Jam quest: Remove test scene and script
manuq Jul 20, 2026
93c5f9b
Lore Jam quest: Update to GameState changes
manuq Jul 20, 2026
5607ca2
Lore Jam quest: Give a name to the new ability and use it in dialogue
manuq Jul 20, 2026
209db54
Fix/licensing and filenames (#2606)
xXLeopoldoXx Jul 28, 2026
8e8bc65
Lore Jam quest: Add SPDX license headers to dialogue files (#2624)
GianPierooo Jul 30, 2026
c2f5908
quest_004: Add .license files for AI-referenced assets, remove unused…
GianPierooo Jul 30, 2026
5204431
quest_004: Fix intro book not starting at the start of Mythical Meado…
GianPierooo Jul 30, 2026
7371832
fix(quest004): improve gameplay, update scene paths, translate script…
xXLeopoldoXx Aug 5, 2026
3a45775
Fix/quest004 gameplay and path fixes (#2673)
xXLeopoldoXx Aug 10, 2026
952665f
quest_004: Redesign horizontal door passage as vertical to use the do…
GianPierooo Aug 18, 2026
469fdbe
Merge main into lorejam-team-13
GianPierooo Sep 23, 2026
0913ee3
quest_004: Update dialogue imports for Dialogue Manager 4
GianPierooo Sep 23, 2026
a5c3c43
Repel: Add Hum as a modifier of Repel
GianPierooo Sep 23, 2026
772bc8c
quest_004: Use Hum as a modifier of Repel
GianPierooo Sep 23, 2026
0e68489
Repel: Adjust the default hum wave radius
GianPierooo Sep 24, 2026
cd5b93a
quest_004: Adjust menhir collision shapes and hum radius in house_wit…
GianPierooo Sep 24, 2026
1a47fdb
Merge branch 'main' into lorejam-team-13
xXLeopoldoXx Nov 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ dest_files=["res://.godot/imported/EternalLoomShort.ogg-ab8f9e3e604ea4b59b0bc347

[params]

loop=false
loop=true
loop_offset=0
bpm=0
beat_count=0
Expand Down
2 changes: 1 addition & 1 deletion scenes/dev/enemy_interaction/gym_area/gym_area_test.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,6 @@ debug_mode = true

[connection signal="body_entered" from="OnTheGround/CharacterBody2D/Area2D" to="OnTheGround/CharacterBody2D/Area2D" method="_on_body_entered"]
[connection signal="timeout" from="OnTheGround/CharacterBody2D2/Timer" to="OnTheGround/CharacterBody2D2/ThrowProjectileBehavior" method="throw"]
[connection signal="running_changed" from="OnTheGround/CharacterBody2D4/InputWalkBehavior" to="OnTheGround/CharacterBody2D4/GPUParticles2D" method="_on_input_walk_behavior_running_changed"]
[connection signal="running_changed" from="OnTheGround/CharacterBody2D4/InputWalkBehavior" to="OnTheGround/CharacterBody2D4/AnimationPlayer/CharacterAnimationPlayerBehavior" method="on_running_changed"]
[connection signal="running_changed" from="OnTheGround/CharacterBody2D4/InputWalkBehavior" to="OnTheGround/CharacterBody2D4/GPUParticles2D" method="_on_input_walk_behavior_running_changed"]
[connection signal="running_changed" from="OnTheGround/CharacterBody2D6/NavigationFollowWalkBehavior" to="OnTheGround/CharacterBody2D6/AnimatedSprite2D/CharacterSpriteBehavior" method="on_running_changed"]
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,6 @@ unique_name_in_owner = true
time_scale = 1440.0
show_debug_label = true

[connection signal="interaction_started" from="OnTheGround/FabricRock/InteractAreaMorning" to="." method="_on_set_time" flags=18 unbinds=2 binds= [6.0]]
[connection signal="interaction_started" from="OnTheGround/FabricRock2/InteractAreaEvening" to="." method="_on_set_time" flags=18 unbinds=2 binds= [18.0]]
[connection signal="interaction_started" from="OnTheGround/FabricRock3/InteractAreaNight" to="." method="_on_set_time" flags=18 unbinds=2 binds= [22.0]]
[connection signal="interaction_started" from="OnTheGround/FabricRock/InteractAreaMorning" to="." method="_on_set_time" flags=18 unbinds=2 binds=[6.0]]
[connection signal="interaction_started" from="OnTheGround/FabricRock2/InteractAreaEvening" to="." method="_on_set_time" flags=18 unbinds=2 binds=[18.0]]
[connection signal="interaction_started" from="OnTheGround/FabricRock3/InteractAreaNight" to="." method="_on_set_time" flags=18 unbinds=2 binds=[22.0]]
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,15 @@ texture_region_size = Vector2i(64, 64)
texture = ExtResource("14_yxe0x")
texture_region_size = Vector2i(64, 64)
0:0/0 = 0
1:0/0 = 0
2:0/0 = 0

[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_gewbp"]
texture = ExtResource("15_gvyts")
texture_region_size = Vector2i(64, 64)
0:0/0 = 0
1:0/0 = 0
2:0/0 = 0

[sub_resource type="TileSetScenesCollectionSource" id="TileSetScenesCollectionSource_bwjee"]
resource_name = "spools"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
size = Vector2(68, 20)

[sub_resource type="CircleShape2D" id="CircleShape2D_8l6e1"]
radius = 96.0
radius = 89.005615

[sub_resource type="Resource" id="Resource_2dnul"]
script = ExtResource("3_45we0")
Expand Down
Git LFS file not shown
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[remap]

importer="wav"
type="AudioStreamWAV"
uid="uid://bsdwhfbfx8k8p"
path="res://.godot/imported/humEffect.wav-92606116d016a95ae8450bb4fd51a1fa.sample"

[deps]

source_file="res://scenes/game_elements/characters/player/components/humEffect.wav"
dest_files=["res://.godot/imported/humEffect.wav-92606116d016a95ae8450bb4fd51a1fa.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
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
SPDX-FileCopyrightText: pgameart
SPDX-License-Identifier: CC0-1.0

This sound effect was downloaded from https://freesound.org/people/pgameart/sounds/558154/, released under CC0 1.0.
26 changes: 26 additions & 0 deletions scenes/game_elements/characters/player/components/hum_wave.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# SPDX-FileCopyrightText: The Threadbare Authors
# SPDX-License-Identifier: MPL-2.0
class_name HumWave
extends Node2D
## An expanding ring with a burst of particles, displayed when the player hums.

@export var color: Color = Color(0.95, 0.85, 0.45, 0.8)

var _radius: float = 0.0:
set(value):
_radius = value
queue_redraw()


func play(max_radius: float, grow_time: float) -> void:
var tween := create_tween().set_parallel(true)
tween.tween_property(self, "_radius", max_radius, grow_time).set_ease(Tween.EASE_OUT)
tween.tween_property(self, "color:a", 0.0, grow_time).set_ease(Tween.EASE_IN)
await tween.finished
queue_free()


func _draw() -> void:
if _radius <= 0.0:
return
draw_arc(Vector2.ZERO, _radius, 0.0, TAU, 64, color, 3.0, true)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://bfaats0xr2r5w
42 changes: 42 additions & 0 deletions scenes/game_elements/characters/player/components/hum_wave.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
[gd_scene format=3 uid="uid://bqpo5rvmvgyt8"]

[ext_resource type="Script" uid="uid://bfaats0xr2r5w" path="res://scenes/game_elements/characters/player/components/hum_wave.gd" id="1_hw"]
[ext_resource type="Texture2D" uid="uid://b5ooaiyxdrp6a" path="res://scenes/game_elements/components/light_texture_256x256.tres" id="2_hw"]

[sub_resource type="CanvasItemMaterial" id="CIM_add"]
blend_mode = 1

[sub_resource type="Gradient" id="Grad_hw"]
offsets = PackedFloat32Array(0, 0.3, 1)
colors = PackedColorArray(0.65, 0.88, 1, 1, 0.45, 0.72, 1, 0.85, 0.4, 0.65, 1, 0)

[sub_resource type="GradientTexture1D" id="GradTex_hw"]
gradient = SubResource("Grad_hw")

[sub_resource type="ParticleProcessMaterial" id="PPM_hw"]
emission_shape = 1
emission_sphere_radius = 8.0
direction = Vector3(0, -1, 0)
spread = 180.0
initial_velocity_min = 35.0
initial_velocity_max = 90.0
gravity = Vector3(0, 0, 0)
damping_min = 25.0
damping_max = 45.0
scale_min = 0.04
scale_max = 0.11
color_ramp = SubResource("GradTex_hw")

[node name="HumWave" type="Node2D" unique_id=1806902150]
script = ExtResource("1_hw")
color = Color(0.5, 0.78, 1, 0.8)

[node name="Burst" type="GPUParticles2D" parent="." unique_id=1276377685]
material = SubResource("CIM_add")
emitting = false
amount = 28
texture = ExtResource("2_hw")
lifetime = 0.5
one_shot = true
explosiveness = 0.95
process_material = SubResource("PPM_hw")
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ var _system_controllers: Array[Node] = []

@onready var input_walk_behavior: InputWalkBehavior = %InputWalkBehavior
@onready var player_interaction: PlayerInteraction = %PlayerInteraction
@onready var player_repel: Node2D = %PlayerRepel
@onready var player_repel: PlayerRepel = %PlayerRepel
@onready var player_hook: PlayerHook = %PlayerHook
@onready var player_sprite: AnimatedSprite2D = %PlayerSprite
@onready var player_dust_particles: GPUParticles2D = %PlayerDustParticles
Expand Down Expand Up @@ -256,6 +256,10 @@ func _toggle_abilities() -> void:
var can_grapple := GameState.player.has_ability(Enums.PlayerAbilities.ABILITY_B)
_toggle_player_behavior(player_repel, can_repel)
_toggle_player_behavior(player_hook, can_grapple)
if can_repel:
player_repel.hum_enabled = GameState.player.has_ability(
Enums.PlayerAbilities.ABILITY_A_MODIFIER_1
)
if can_grapple:
var has_longer_hook := GameState.player.has_ability(
Enums.PlayerAbilities.ABILITY_B_MODIFIER_1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,31 @@ signal repelling_changed(repelling: bool)

const REPEL_ANTICIPATION_TIME: float = 0.3

const HUM_WAVE_SCENE: PackedScene = preload(
"res://scenes/game_elements/characters/player/components/hum_wave.tscn"
)
const HUM_WAVE_DURATION: float = 0.3

## If false, [member repelling] should be changed by other means.
@export var player_controlled: bool = true

## If controlled by the player, which input action triggers the repel.
@export var input_action: StringName = &"repel"

## Current state of the repel.
@export var repelling: bool = false:
set = _set_repelling

@export_group("Hum")
@export var hum_enabled: bool = false

## The sound to play when humming.
@export var hum_sound: AudioStream = preload(
"res://scenes/game_elements/characters/player/components/humEffect.wav"
)

## The radius the hum wave grows to.
@export_range(0.0, 1000.0, 1.0, "or_greater") var hum_wave_radius: float = 400.0

@onready var air_stream: Area2D = %AirStream
@onready var repel_animation: AnimationPlayer = %RepelAnimation

Expand Down Expand Up @@ -51,6 +66,24 @@ func _on_air_stream_body_entered(body: Node2D) -> void:
body.got_repelled(direction)


## Play the hum sound and wave, if [member hum_enabled].
## This is called by the repel animation, at the moment the air stream is released.
func hum() -> void:
if not hum_enabled:
return

var wave: HumWave = HUM_WAVE_SCENE.instantiate()
add_child(wave)
wave.play(hum_wave_radius, HUM_WAVE_DURATION)

var sound := AudioStreamPlayer2D.new()
sound.stream = hum_sound
sound.bus = &"SFX"
add_child(sound)
sound.play()
sound.finished.connect(sound.queue_free)


func _animate() -> void:
# The repel animation is already ongoing. Prevent starting it again by smashing the buttons.
if repel_animation.current_animation == &"repel":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,20 @@ tracks/5/keys = {
"method": &"play"
}]
}
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath(".")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0.3),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"hum"
}]
}

[sub_resource type="AnimationLibrary" id="AnimationLibrary_ubfef"]
_data = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
[sub_resource type="Gradient" id="Gradient_5j6h7"]
interpolation_mode = 2
interpolation_color_space = 2
colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1)
offsets = PackedFloat32Array(0, 0.032738097, 1)
colors = PackedColorArray(1, 1, 1, 1, 0.7856058, 0.78560585, 0.78560567, 1, 0, 0, 0, 1)

[resource]
gradient = SubResource("Gradient_5j6h7")
Expand All @@ -13,3 +14,4 @@ fill = 1
fill_from = Vector2(0.5, 0.5)
fill_to = Vector2(0, 0.5)
metadata/_snap_enabled = true
metadata/_snap_count = 15
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
[gd_resource type="SpriteFrames" format=3 uid="uid://c301x17j2mgnb"]

[ext_resource type="Texture2D" uid="uid://csk7me5fhad60" path="res://assets/first_party/wildlife/butterfly/butterfly_flower_loop_1_blue.png" id="1_v3dtu"]
[ext_resource type="Texture2D" uid="uid://cdgk5axv7f4lb" path="res://assets/first_party/wildlife/butterfly/butterfly_flower_loop_1_pink.png" id="1_a5j1n"]

[sub_resource type="AtlasTexture" id="AtlasTexture_cbbth"]
atlas = ExtResource("1_v3dtu")
[sub_resource type="AtlasTexture" id="AtlasTexture_eira1"]
atlas = ExtResource("1_a5j1n")
region = Rect2(0, 0, 128, 128)

[sub_resource type="AtlasTexture" id="AtlasTexture_c66t1"]
atlas = ExtResource("1_v3dtu")
[sub_resource type="AtlasTexture" id="AtlasTexture_a5j1n"]
atlas = ExtResource("1_a5j1n")
region = Rect2(128, 0, 128, 128)

[sub_resource type="AtlasTexture" id="AtlasTexture_8neng"]
atlas = ExtResource("1_v3dtu")
[sub_resource type="AtlasTexture" id="AtlasTexture_lxi6w"]
atlas = ExtResource("1_a5j1n")
region = Rect2(256, 0, 128, 128)

[sub_resource type="AtlasTexture" id="AtlasTexture_704a1"]
atlas = ExtResource("1_v3dtu")
[sub_resource type="AtlasTexture" id="AtlasTexture_v3dtu"]
atlas = ExtResource("1_a5j1n")
region = Rect2(384, 0, 128, 128)

[resource]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_cbbth")
"texture": SubResource("AtlasTexture_eira1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_c66t1")
"texture": SubResource("AtlasTexture_a5j1n")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8neng")
"texture": SubResource("AtlasTexture_lxi6w")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_704a1")
"texture": SubResource("AtlasTexture_v3dtu")
}],
"loop": 1,
"name": &"default",
Expand Down
3 changes: 3 additions & 0 deletions scenes/game_elements/props/door/noria-Sheet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
40 changes: 40 additions & 0 deletions scenes/game_elements/props/door/noria-Sheet.png.import
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
[remap]

importer="texture"
type="CompressedTexture2D"
uid="uid://b5tyybxc7trbg"
path="res://.godot/imported/noria-Sheet.png-256ba2e0f9e87ab6ad3e79c19a0f0f2c.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://scenes/game_elements/props/door/noria-Sheet.png"
dest_files=["res://.godot/imported/noria-Sheet.png-256ba2e0f9e87ab6ad3e79c19a0f0f2c.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
1 change: 1 addition & 0 deletions scenes/globals/lore_info/lore_info.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class_name LoreInfo
## ability! Repel".
const ABILITIES_NAMES: Dictionary[Enums.PlayerAbilities, String] = {
Enums.PlayerAbilities.ABILITY_A: "Repel",
Enums.PlayerAbilities.ABILITY_A_MODIFIER_1: "Hum",
Enums.PlayerAbilities.ABILITY_B: "Grapple",
Enums.PlayerAbilities.ABILITY_B_MODIFIER_1: "Longer Thread",
}
Original file line number Diff line number Diff line change
Expand Up @@ -250,5 +250,5 @@ position_smoothing_enabled = true
editor_draw_limits = true

[connection signal="cinematic_finished" from="Cinematic" to="FillGameLogic" method="start"]
[connection signal="goal_reached" from="FillGameLogic" to="FillGameLogic/LevelCompletedAnimation" method="play" binds= ["goal_completed"]]
[connection signal="goal_reached" from="FillGameLogic" to="FillGameLogic/LevelCompletedAnimation" method="play" binds=["goal_completed"]]
[connection signal="collected" from="OnTheGround/RepelPowerup" to="." method="_on_repel_powerup_collected"]
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,4 @@ position_smoothing_enabled = true
editor_draw_limits = true

[connection signal="cinematic_finished" from="Cinematic" to="FillGameLogic" method="start"]
[connection signal="goal_reached" from="FillGameLogic" to="FillGameLogic/LevelCompletedAnimation" method="play" binds= ["goal_completed"]]
[connection signal="goal_reached" from="FillGameLogic" to="FillGameLogic/LevelCompletedAnimation" method="play" binds=["goal_completed"]]
Original file line number Diff line number Diff line change
Expand Up @@ -220,4 +220,4 @@ position_smoothing_enabled = true
editor_draw_limits = true

[connection signal="goal_reached" from="FillGameLogic" to="BackgroundMusic/ClipSwitcher" method="switch"]
[connection signal="goal_reached" from="FillGameLogic" to="FillGameLogic/LevelCompletedAnimation" method="play" binds= ["goal_completed"]]
[connection signal="goal_reached" from="FillGameLogic" to="FillGameLogic/LevelCompletedAnimation" method="play" binds=["goal_completed"]]
Loading
Loading