diff --git a/pulsjam2025/NPC/penguin/group.gd b/pulsjam2025/NPC/penguin/group.gd index 370d21aa81b1a13af0613ac5d4a5d1d680ed8d90..784042e60e2773b7d4c8ecb3b3390bbec0a54d17 100644 --- a/pulsjam2025/NPC/penguin/group.gd +++ b/pulsjam2025/NPC/penguin/group.gd @@ -10,6 +10,7 @@ var penguin_scene: PackedScene = load("res://NPC/penguin/penguin.tscn") var penguins : Array[Penguin] = [] func _ready() -> void: + Globals.pengu_group = self timer.connect("timeout", Callable(self, "_on_timer_timeout")) start_random_timer() diff --git a/pulsjam2025/NPC/penguin/penguin.gd b/pulsjam2025/NPC/penguin/penguin.gd index 90c18643b233dcaec492df32989c09f858bd6803..aa27a0e8ce16135d65cc46ec915638df112e40f1 100644 --- a/pulsjam2025/NPC/penguin/penguin.gd +++ b/pulsjam2025/NPC/penguin/penguin.gd @@ -64,6 +64,8 @@ func _process(delta: float) -> void: var dir = (target - position).normalized() var bump_dir = Vector2.ZERO + self.rotation = -get_parent().rotation + var near_areas: Array[Area2D] = $Area2D.get_overlapping_areas(); cluster_score = 0 for area in near_areas: diff --git a/pulsjam2025/Player/PlayerScene.tscn b/pulsjam2025/Player/PlayerScene.tscn index fd78fcbce1465642628442cfd71fa0544d5e289e..e4c60ccba3e83fe04dcdbd09d8894031cdea6898 100644 --- a/pulsjam2025/Player/PlayerScene.tscn +++ b/pulsjam2025/Player/PlayerScene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=22 format=3 uid="uid://cwmunv68b7txk"] +[gd_scene load_steps=23 format=3 uid="uid://cwmunv68b7txk"] [ext_resource type="Script" uid="uid://babk78kqf724a" path="res://Player/PlayerMovement.gd" id="1_ihrqt"] [ext_resource type="PackedScene" uid="uid://dfe8d0dg2yioj" path="res://Player/FishScene.tscn" id="2_rded7"] @@ -11,6 +11,7 @@ [ext_resource type="Texture2D" uid="uid://c771pbnvtsr6t" path="res://Player/bird_up_2.png" id="9_dplev"] [ext_resource type="Texture2D" uid="uid://0il2dq67vsbg" path="res://Player/bird_down.png" id="10_7d6og"] [ext_resource type="Texture2D" uid="uid://uc2v17mafr6n" path="res://Player/bird_down_2.png" id="11_183bc"] +[ext_resource type="PackedScene" uid="uid://bx2qxdfk08ti8" path="res://Player/camera/camera_2d.tscn" id="12_183bc"] [sub_resource type="GDScript" id="GDScript_yjw77"] @@ -311,8 +312,6 @@ area2D = NodePath("Area2D") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_ihrqt") -[node name="AudioListener2D" type="AudioListener2D" parent="."] - [node name="FishCooldownTimer" type="Timer" parent="."] one_shot = true @@ -342,6 +341,8 @@ libraries = { } speed_scale = 1.5 +[node name="Camera" parent="." instance=ExtResource("12_183bc")] + [connection signal="timeout" from="FishCooldownTimer" to="." method="_on_fish_cooldown_timer_timeout"] [connection signal="timeout" from="FishDespawnTimer" to="." method="_on_fish_despawn_timer_timeout"] [connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"] diff --git a/pulsjam2025/Player/TestScene.tscn b/pulsjam2025/Player/TestScene.tscn index 368a71e0756f8c6a06e1052fd40e2dd9c6fa88fb..2a51d25e50d8cd5de4fd3a67ad002b882c339aa9 100644 --- a/pulsjam2025/Player/TestScene.tscn +++ b/pulsjam2025/Player/TestScene.tscn @@ -5,9 +5,6 @@ [node name="TestScene" type="Node2D"] -[node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(591, 335) - [node name="SchollenSpektakel" parent="." instance=ExtResource("2_oh42m")] position = Vector2(-17, 66) diff --git a/pulsjam2025/Player/camera/camera_2d.tscn b/pulsjam2025/Player/camera/camera_2d.tscn new file mode 100644 index 0000000000000000000000000000000000000000..39d8a6ce98f7df4f33c147f4d98c2ebcf15feff0 --- /dev/null +++ b/pulsjam2025/Player/camera/camera_2d.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=3 format=3 uid="uid://bx2qxdfk08ti8"] + +[ext_resource type="PackedScene" uid="uid://coryu5r8revlm" path="res://hud/hud.tscn" id="1_hmhh6"] + +[sub_resource type="GDScript" id="GDScript_etdkj"] +script/source = "extends Node + +@onready var player = get_parent() +@onready var base_zoom: Vector2 = %Cam.zoom +@onready var min_zoom := Vector2(0.5, 0.5) +@onready var max_zoom := Vector2(0.9, 0.9) + +# ScreenShake logic +@export var max_offset: float = 5.0 +@export var max_roll: float = 10.0 +@export var shakeReduction: float = 2.5 + +@export var move_factor := 30.0 + +var stress: float = 0.0 +var shake: float = 0.0 + +var extra_zoom := Vector2.ZERO +var zoom_accel := Vector2.ZERO + +func _ready() -> void: + Globals.camera = self + +func _physics_process(delta: float) -> void: + if not Globals.level_center: + return + + # Position + var pos = Globals.level_center.global_position + (player.global_position + Globals.level_center.global_position) / move_factor + %Cam.offset = pos -Vector2.ONE * 50 + #print(%Cam.global_position) + + # Zoom + zoom_accel = zoom_accel / 2.0 + zoom_accel += Vector2(player.velocity.length(), player.velocity.length()) / 1000000 - Vector2.ONE / 2000 + var distance = player.global_position.distance_to(Globals.level_center.global_position) + extra_zoom = -Vector2(distance, distance) / 100000 + extra_zoom = clamp(extra_zoom + zoom_accel, min_zoom - base_zoom, max_zoom - base_zoom) + + #print(extra_zoom, zoom_accel, distance, pos, %Cam.global_position) + + %Cam.zoom = base_zoom + extra_zoom + _process_shake(delta) + +func _process_shake(delta) -> void: + # Lerp to normal position/rotation + %Cam.rotation_degrees = lerp( %Cam.rotation_degrees, 0.0, delta * 5.0) + + %Cam.position.x = lerp( %Cam.position.x, 0.0, delta * 5.0) + %Cam.position.y = lerp( %Cam.position.y, 0.0, delta * 5.0) + + # Shake logic + shake = stress * stress + + # Rotation + %Cam.rotation_degrees += max_roll * shake * _get_noise(randi(), delta) * 100 + + # Position + var offset_x = max_offset * shake * _get_noise(randi(), delta + 1.0) + var offset_y = max_offset * shake * _get_noise(randi(), delta + 2.0) + + %Cam.position = Vector2(offset_x, offset_y) * 10 + + # Shake reduction + stress -= shakeReduction * delta + stress = max(0, stress) + +func _get_noise(noise_seed, time) -> float: + var n = FastNoiseLite.new() + n.seed = noise_seed + + return n.get_noise_1d(time) + +func add_stress(amount: float) -> void: + stress += amount + stress = max(0, stress) +" + +[node name="Camera" type="Node"] +script = SubResource("GDScript_etdkj") + +[node name="Cam" type="Camera2D" parent="."] +unique_name_in_owner = true + +[node name="CanvasLayer" type="CanvasLayer" parent="Cam"] + +[node name="HUD" parent="Cam/CanvasLayer" instance=ExtResource("1_hmhh6")] diff --git a/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png new file mode 100644 index 0000000000000000000000000000000000000000..becd10576834e1cd5441d5fae8cd19fa7d9cd1a8 Binary files /dev/null and b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png differ diff --git a/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import new file mode 100644 index 0000000000000000000000000000000000000000..845d2dc858f29ce241939841836d5f813e7509ce --- /dev/null +++ b/pulsjam2025/Screenshot 2025-03-15 at 22.17.23.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgcrh2gh8dd7d" +path="res://.godot/imported/Screenshot 2025-03-15 at 22.17.23.png-d8fba5094fe8ec212930d27b8114ca90.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Screenshot 2025-03-15 at 22.17.23.png" +dest_files=["res://.godot/imported/Screenshot 2025-03-15 at 22.17.23.png-d8fba5094fe8ec212930d27b8114ca90.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 diff --git a/pulsjam2025/globals.gd b/pulsjam2025/globals.gd index 69e617d509f1a90266d23b072470eafb9bf3e9b6..6bdf9d8494680cb21e3456ae607e58f8b2ee5435 100644 --- a/pulsjam2025/globals.gd +++ b/pulsjam2025/globals.gd @@ -1,19 +1,32 @@ extends Node signal score_changed +signal highscore_changed var level_center: Node2D = null var ice_floes: Array[IceFloe] = [] +var camera: Node = null + var score: int = 0: set(val): score = val emit_signal("score_changed", val) +var highscore: int = 0: + set(val): + score = val + emit_signal("highscore_changed", val) + +var pengu_group: Node + var _score_timer := Timer.new() func start_round(): + if not pengu_group: + printerr("Cant start - No pengu group") + return add_child(_score_timer) - _score_timer.timeout.connect(func(): score += 1) + _score_timer.timeout.connect(func(): score += pengu_group.n_penguins) _score_timer.start(1.0) diff --git a/pulsjam2025/hud/hud.tscn b/pulsjam2025/hud/hud.tscn index 756b81527ef73be305cf4c65ea8c0d6c2567f5fe..e36ffa6c0d6bef8920406a497e21a1177afa23b6 100644 --- a/pulsjam2025/hud/hud.tscn +++ b/pulsjam2025/hud/hud.tscn @@ -1,20 +1,34 @@ -[gd_scene load_steps=4 format=3 uid="uid://coryu5r8revlm"] +[gd_scene load_steps=6 format=3 uid="uid://coryu5r8revlm"] [ext_resource type="FontFile" uid="uid://2c10u3pux7je" path="res://Winter Minie.ttf" id="1_6ca3a"] +[ext_resource type="Texture2D" uid="uid://bgcrh2gh8dd7d" path="res://Screenshot 2025-03-15 at 22.17.23.png" id="2_2gk58"] [sub_resource type="GDScript" id="GDScript_6ca3a"] script/source = "extends Control func _ready() -> void: Globals.score_changed.connect(update_score) + Globals.highscore_changed.connect(update_highscore) func update_score(score) -> void: - $MarginContainer/ScoreLabel.text = str(score) + %ScoreLabel.text = str(score) + %SCORE.text = str(score) + +func update_highscore(score) -> void: + %HIGHSCORE.text = str(score) " [sub_resource type="LabelSettings" id="LabelSettings_2gk58"] font = ExtResource("1_6ca3a") font_size = 86 +shadow_size = 5 +shadow_color = Color(0, 0, 0, 0.21) + +[sub_resource type="LabelSettings" id="LabelSettings_318vg"] +font = ExtResource("1_6ca3a") +font_size = 36 +shadow_size = 11 +shadow_color = Color(0, 0, 0, 0.21) [node name="HUD" type="Control"] layout_mode = 3 @@ -27,7 +41,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 script = SubResource("GDScript_6ca3a") -[node name="MarginContainer" type="MarginContainer" parent="."] +[node name="Gameplay" type="MarginContainer" parent="."] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -37,9 +51,124 @@ grow_vertical = 2 theme_override_constants/margin_left = 20 theme_override_constants/margin_top = 20 -[node name="ScoreLabel" type="Label" parent="MarginContainer"] +[node name="ScoreLabel" type="Label" parent="Gameplay"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 0 size_flags_vertical = 0 text = "0" label_settings = SubResource("LabelSettings_2gk58") + +[node name="Start" type="MarginContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 + +[node name="TextureRect" type="TextureRect" parent="Start"] +layout_mode = 2 +size_flags_vertical = 0 +texture = ExtResource("2_2gk58") +stretch_mode = 3 + +[node name="CenterContainer" type="CenterContainer" parent="Start"] +layout_mode = 2 + +[node name="label" type="Label" parent="Start/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +text = " + + + +Press any key to +Start" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="GameOver" type="MarginContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 + +[node name="CenterContainer" type="CenterContainer" parent="GameOver"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="GameOver/CenterContainer"] +layout_mode = 2 +alignment = 1 + +[node name="ScoreLabel" type="Label" parent="GameOver/CenterContainer/VBoxContainer"] +modulate = Color(0.999969, 0.614075, 0.555964, 1) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "-Game Over-" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="HBoxContainer2" type="HBoxContainer" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ScoreLabel2" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer2"] +modulate = Color(0.819655, 0.819655, 0.819655, 1) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Score:" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="SCORE" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 10 +size_flags_vertical = 0 +text = "0" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ScoreLabel2" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer"] +modulate = Color(0.819655, 0.819655, 0.819655, 1) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Highscore:" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 1 + +[node name="HIGHSCORE" type="Label" parent="GameOver/CenterContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 10 +size_flags_vertical = 0 +text = "0" +label_settings = SubResource("LabelSettings_2gk58") +horizontal_alignment = 2 + +[node name="HSeparator" type="HSeparator" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ScoreLabel2" type="Label" parent="GameOver/CenterContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = " +Press SPACE to continue" +label_settings = SubResource("LabelSettings_318vg") +horizontal_alignment = 1 diff --git a/pulsjam2025/project.godot b/pulsjam2025/project.godot index 026e724e4fa6bdcdf53e8d626881e8e622789390..976f7b58f6d4d9696ef6995b3c8ad40384e19eda 100644 --- a/pulsjam2025/project.godot +++ b/pulsjam2025/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="PulsJam2025" -run/main_scene="uid://ch1i0q8d6r4f0" +run/main_scene="uid://byb21wlyercnu" config/features=PackedStringArray("4.4") [autoload] diff --git a/pulsjam2025/schollen_spektakel.tscn b/pulsjam2025/schollen_spektakel.tscn index e513534a9834dbf6ec3ce6a71fc23fec23c63792..794540e0f949749da39369cf702c69d3c299b5ad 100644 --- a/pulsjam2025/schollen_spektakel.tscn +++ b/pulsjam2025/schollen_spektakel.tscn @@ -1,11 +1,10 @@ -[gd_scene load_steps=10 format=3 uid="uid://ch1i0q8d6r4f0"] +[gd_scene load_steps=9 format=3 uid="uid://ch1i0q8d6r4f0"] [ext_resource type="Script" uid="uid://cik8umdfv5587" path="res://schollen_spektakel.gd" id="1_ij3xc"] [ext_resource type="PackedScene" uid="uid://d1vv1o7g2lp01" path="res://water/water.tscn" id="2_hycu0"] [ext_resource type="PackedScene" uid="uid://diilm3qbp1tly" path="res://ice_floe/ice_floe.tscn" id="2_ij3xc"] [ext_resource type="PackedScene" uid="uid://b23bxmjrcknm3" path="res://center_pos.tscn" id="4_6ndi4"] [ext_resource type="PackedScene" uid="uid://cgkfkbiyl02yl" path="res://ice_floe/floe_area.tscn" id="5_doghl"] -[ext_resource type="PackedScene" uid="uid://coryu5r8revlm" path="res://hud/hud.tscn" id="6_2ljra"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_doghl"] resource_local_to_scene = true @@ -55,11 +54,3 @@ script = SubResource("GDScript_2ljra") [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="FloeArea"] polygon = PackedVector2Array(-7071, -5132, 10762, -5282, 9681, 5706, -7101, 5466, -24, 690, 1193, 681, 1196, -60, -43, -63, -41, 697, -7131, 5464) - -[node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(591, 335) - -[node name="CanvasLayer" type="CanvasLayer" parent="Camera2D"] - -[node name="HUD" parent="Camera2D/CanvasLayer" instance=ExtResource("6_2ljra")] -metadata/_edit_use_anchors_ = true