diff --git a/.gitignore b/.gitignore index 0af181c..7cc0df2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ # Godot 4+ specific ignores .godot/ /android/ +/assets/* +!/assets/.gitkeep + diff --git a/assets/.gitkeep b/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/assets/sounds/CREDITS.txt b/assets/sounds/CREDITS.txt deleted file mode 100644 index 8beff6b..0000000 --- a/assets/sounds/CREDITS.txt +++ /dev/null @@ -1,3 +0,0 @@ -The following files are from Pixabay: - -- clock-tick-76039.mp3 diff --git a/assets/sounds/clock-tick-76039.mp3 b/assets/sounds/clock-tick-76039.mp3 deleted file mode 100644 index d0fbd66..0000000 Binary files a/assets/sounds/clock-tick-76039.mp3 and /dev/null differ diff --git a/assets/sounds/clock-tick-76039.mp3.import b/assets/sounds/clock-tick-76039.mp3.import deleted file mode 100644 index 228f02a..0000000 --- a/assets/sounds/clock-tick-76039.mp3.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="mp3" -type="AudioStreamMP3" -uid="uid://cs6l2t3jtags8" -path="res://.godot/imported/clock-tick-76039.mp3-7b65fd0a52c329ab567ab5301044e89b.mp3str" - -[deps] - -source_file="res://assets/sounds/clock-tick-76039.mp3" -dest_files=["res://.godot/imported/clock-tick-76039.mp3-7b65fd0a52c329ab567ab5301044e89b.mp3str"] - -[params] - -loop=true -loop_offset=0.0 -bpm=0.0 -beat_count=0 -bar_beats=4 diff --git a/core/audio/spatial_audio_player.gd b/core/audio/spatial_audio_player.gd index 874229d..38a9260 100644 --- a/core/audio/spatial_audio_player.gd +++ b/core/audio/spatial_audio_player.gd @@ -4,7 +4,7 @@ extends AudioStreamPlayer2D # EXPORTED VARS # detect every nth tick -@export var detect_mod: int = 4 +@export var audio_tick_interval: int = 4 @export_category("dampening effect") @export var n_pointcasts_to_player: int = 25 @@ -162,12 +162,12 @@ func _ready() -> void: create_audio_bus_effects() create_raycasts() -var tick: int = 0 +var audio_tick: int = 0 -func _physics_process(delta: float) -> void: - if tick == 0: +func _physics_process(_delta: float) -> void: + if audio_tick == 0: var reverb_params = determine_reverb_params() var blocked_amount = determine_distance_amount_blocked() update_reverb(reverb_params[0], reverb_params[1]) update_dampening(blocked_amount) - tick = (tick + 1) % detect_mod + audio_tick = (audio_tick + 1) % audio_tick_interval diff --git a/core/globals/levels.gd b/core/globals/levels_core.gd similarity index 76% rename from core/globals/levels.gd rename to core/globals/levels_core.gd index 6fd92ed..36baaab 100644 --- a/core/globals/levels.gd +++ b/core/globals/levels_core.gd @@ -1,12 +1,11 @@ extends Node -const mainmenu_player_pos: Vector2 = Vector2(0, 128 + 32) - class Entrypoint extends Object: var scene_name: String var player_position: Vector2 var keep_velocity: bool var initial_velocity: Vector2 + var lock_player: bool func _init( scene_name_: String, player_position_: Vector2, @@ -14,24 +13,15 @@ class Entrypoint extends Object: # if player velocity is zero, use initial_velocity keep_velocity_: bool = true, # initial player velocity - initial_velocity_: Vector2 = Vector2.ZERO + initial_velocity_: Vector2 = Vector2.ZERO, + # lock player movement + lock_player_: bool = false ) -> void: self.scene_name = scene_name_ self.player_position = player_position_ self.keep_velocity = keep_velocity_ self.initial_velocity = initial_velocity_ - -const SCENES = { - "menu": "uid://bqmpoix37kutp", - "intro": "uid://c6w7lrydi43ts", - "test": "uid://dqf665b540tfg", -} -var MENU_SCENE: PackedScene = preload("res://menu/menu.tscn") - -var ENTRYPOINTS = { - "intro_start": Entrypoint.new("intro", Vector2(0, 0)), - "test": Entrypoint.new("test", Vector2(1680, 200), false, Vector2(0, -500)), -} + self.lock_player = lock_player_ # load that stuff @@ -52,11 +42,11 @@ func load_scene(scn_name: String, force_reload: bool = false) -> bool: return true # nothing to do :) if not _pre_load_checks(): return false - if not scn_name in SCENES: + if not scn_name in LevelsDef.SCENES: push_error("Level " + scn_name + " doesn't exist.") return false unload_scene() - var scn: Node2D = load(SCENES[scn_name]).instantiate() + var scn: Node2D = load(LevelsDef.SCENES[scn_name]).instantiate() NodeRegistry.level_root_container.add_child(scn) return true @@ -66,17 +56,19 @@ func unload_scene(): c.queue_free() func load_entrypoint(ep_name: String) -> bool: # returns true on success - if not ep_name in ENTRYPOINTS: + if not ep_name in LevelsDef.ENTRYPOINTS: push_error("Entrypoint " + ep_name + " doesn't exist.") return false if not _pre_load_checks(): return false - var e: Entrypoint = ENTRYPOINTS[ep_name] + var e: Entrypoint = LevelsDef.ENTRYPOINTS[ep_name] if load_scene(e.scene_name): NodeRegistry.player.position = e.player_position NodeRegistry.player.camera.call_deferred("reset_smoothing") if not e.keep_velocity or NodeRegistry.player.velocity == Vector2.ZERO: NodeRegistry.player.velocity = e.initial_velocity + if e.lock_player: + NodeRegistry.player.locked = true Gamestate.last_entrypoint = ep_name Gamestate.save_slot() # save game return true @@ -87,5 +79,5 @@ func load_menu(): if not _pre_load_checks(): return false unload_scene() - NodeRegistry.player.position = mainmenu_player_pos + NodeRegistry.player.position = Vector2(0, 129) return load_scene("menu", true) diff --git a/player/player.gd b/core/player/player.gd similarity index 59% rename from player/player.gd rename to core/player/player.gd index 723f06c..8bf9040 100644 --- a/player/player.gd +++ b/core/player/player.gd @@ -5,41 +5,41 @@ extends CharacterBody2D # die func die(): - Levels.load_entrypoint(Gamestate.last_entrypoint) + LevelsCore.load_entrypoint(Gamestate.last_entrypoint) # movement and stuff @export var movement_speed = 300.0 @export var jump_velocity = -350.0 +@export var air_friction = 0.02 +@export var floor_friction = 0.1 @export var max_jumps: int = 2 @export var rigidbody_impulse_mult: float = 0.04 -@onready var ceiling_raycast1 = $RayCastUp1 -@onready var ceiling_raycast2 = $RayCastUp2 - -var jumps = 0 +var locked: bool = false +var jumps: int = 0 func _physics_process(delta: float) -> void: + var gravity = get_gravity() var dir = Input.get_axis("player_left", "player_right") var on_floor = is_on_floor() var on_wall = is_on_wall() - var on_ceiling = ceiling_raycast1.is_colliding() or ceiling_raycast2.is_colliding() # left right movement - if dir: - velocity.x = dir * movement_speed - else: - velocity.x = move_toward(velocity.x, 0, movement_speed) + if dir and not locked: + velocity.x = move_toward(velocity.x, dir * movement_speed, movement_speed*floor_friction) + elif on_floor:# or on_ceiling: + velocity.x = move_toward(velocity.x, 0, movement_speed*floor_friction) + elif not locked: + velocity.x = move_toward(velocity.x, 0, movement_speed*air_friction) # gravity - if not (on_floor or on_ceiling): - velocity += get_gravity() * delta + if not on_floor: + velocity += gravity * delta # reset number of jumps - if on_ceiling or on_floor or on_wall: + if on_floor or on_wall: jumps = 0 # jumping / dropping from ceiling - if Input.is_action_just_pressed("player_jump"): - if on_ceiling: # drop from ceiling - velocity += get_gravity() * delta - elif jumps < max_jumps: # (allows air jumps) + if Input.is_action_just_pressed("player_jump") and not locked: + if jumps < max_jumps: # (allows air jumps) velocity.y = jump_velocity jumps += 1 move_and_slide() diff --git a/player/player.tscn b/core/player/player.tscn similarity index 66% rename from player/player.tscn rename to core/player/player.tscn index 36e778a..3619327 100644 --- a/player/player.tscn +++ b/core/player/player.tscn @@ -1,38 +1,34 @@ [gd_scene load_steps=4 format=3 uid="uid://ebb4pfxklatj"] -[ext_resource type="Script" path="res://player/player.gd" id="1_fob34"] - -[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_p33ik"] -polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9) +[ext_resource type="Script" path="res://core/player/player.gd" id="1_fob34"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_7cq61"] size = Vector2(16, 16) +[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_p33ik"] +polygon = PackedVector2Array(-8.605, -17, -9, 1, 9, 1, 8.385, -17) + [node name="Player" type="CharacterBody2D"] collision_layer = 2 +slide_on_ceiling = false floor_block_on_wall = false script = ExtResource("1_fob34") +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, -8) +shape = SubResource("RectangleShape2D_7cq61") + +[node name="LightOccluder2D" type="LightOccluder2D" parent="."] +occluder = SubResource("OccluderPolygon2D_p33ik") + +[node name="Polygon2D" type="Polygon2D" parent="."] +polygon = PackedVector2Array(-8.605, -17, -9, 1, 9, 1, 8.385, -17) + [node name="Camera2D" type="Camera2D" parent="."] process_callback = 0 position_smoothing_enabled = true drag_horizontal_enabled = true drag_vertical_enabled = true +drag_top_margin = 0.3 +drag_bottom_margin = 0.3 editor_draw_drag_margin = true - -[node name="LightOccluder2D" type="LightOccluder2D" parent="."] -occluder = SubResource("OccluderPolygon2D_p33ik") - -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -shape = SubResource("RectangleShape2D_7cq61") - -[node name="RayCastUp1" type="RayCast2D" parent="."] -position = Vector2(-4, 0) -target_position = Vector2(0, -8.1) - -[node name="RayCastUp2" type="RayCast2D" parent="."] -position = Vector2(4, 0) -target_position = Vector2(0, -8.1) - -[node name="Polygon2D" type="Polygon2D" parent="."] -polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9) diff --git a/core/polygon/polygon.gd b/core/polygon/polygon.gd index 1e910e1..decea47 100644 --- a/core/polygon/polygon.gd +++ b/core/polygon/polygon.gd @@ -1,5 +1,5 @@ @tool -extends CollisionPolygon2D +class_name P extends CollisionPolygon2D @export var color: Color = Color.WHITE: set(v): @@ -8,18 +8,27 @@ extends CollisionPolygon2D get(): return color +var polygon_2d: Polygon2D = null +var light_occluder_2d: LightOccluder2D = null + @export var update: bool: set(v): update_polygon() func update_polygon(): - # normal polygon - $Polygon2D.polygon = polygon - $Polygon2D.color = color + if polygon_2d == null: + polygon_2d = Polygon2D.new() + self.add_child(polygon_2d) + if light_occluder_2d == null: + light_occluder_2d = LightOccluder2D.new() + self.add_child(light_occluder_2d) + # visible polygon + polygon_2d.polygon = polygon + polygon_2d.color = color # light occluder var lo_polygon = OccluderPolygon2D.new() lo_polygon.polygon = polygon - $LightOccluder2D.occluder = lo_polygon + light_occluder_2d.occluder = lo_polygon func _ready() -> void: update_polygon() diff --git a/core/polygon/polygon.tscn b/core/polygon/polygon.tscn index 8049033..0c74f91 100644 --- a/core/polygon/polygon.tscn +++ b/core/polygon/polygon.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://cbynoofsjcl45"] +[gd_scene load_steps=3 format=3 uid="uid://c7cflclgotwsr"] [ext_resource type="Script" path="res://core/polygon/polygon.gd" id="1_ga37f"] -[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_2cqf3"] +[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_b1ir8"] [node name="Polygon" type="CollisionPolygon2D"] script = ExtResource("1_ga37f") @@ -11,4 +11,4 @@ script = ExtResource("1_ga37f") [node name="LightOccluder2D" type="LightOccluder2D" parent="."] editor_description = "For particle collisions" -occluder = SubResource("OccluderPolygon2D_2cqf3") +occluder = SubResource("OccluderPolygon2D_b1ir8") diff --git a/core/shaders/distortion/distortion_shader.gdshader b/core/shaders/distortion/distortion_shader.gdshader index 740de52..476e708 100644 --- a/core/shaders/distortion/distortion_shader.gdshader +++ b/core/shaders/distortion/distortion_shader.gdshader @@ -8,8 +8,7 @@ uniform sampler2D vignette_mask; // constants -const float rgb_distortion_v_mult = 0.9; -const float rgb_distortion_v_exp = 2.0; +const float rgb_distortion_v_mult = 0.5; const float rgb_distortion_v_min = 0.04; const float rgb_distortion_v_max = 0.12; @@ -19,13 +18,13 @@ void fragment() { float v = texture(vignette_mask, SCREEN_UV).r; // rgb & blur distortion float v_ = clamp( - pow(v * rgb_distortion_v_mult, rgb_distortion_v_exp), + v * rgb_distortion_v_mult, rgb_distortion_v_min, rgb_distortion_v_max ); - vec2 screen_uv_r = SCREEN_UV - (v_ * 0.01); - vec2 screen_uv_g = SCREEN_UV + (v_ * 0.01); - vec2 screen_uv_b = SCREEN_UV; + vec2 screen_uv_r = SCREEN_UV + vec2(-v_ * 0.01, 0.0); + vec2 screen_uv_g = SCREEN_UV + vec2(0.0, v_ * 0.01); + vec2 screen_uv_b = SCREEN_UV + vec2(v_ * 0.01, -v_ * 0.01); COLOR.r = textureLod(screen_texture, screen_uv_r, v).r; COLOR.g = textureLod(screen_texture, screen_uv_g, v).g; COLOR.b = textureLod(screen_texture, screen_uv_b, v).b; diff --git a/core/shaders/distortion/vignette_mask.tres b/core/shaders/distortion/vignette_mask.tres index a53bcf5..0fbfa9c 100644 --- a/core/shaders/distortion/vignette_mask.tres +++ b/core/shaders/distortion/vignette_mask.tres @@ -1,6 +1,9 @@ [gd_resource type="GradientTexture2D" load_steps=2 format=3 uid="uid://bwlgypt4xjocj"] [sub_resource type="Gradient" id="Gradient_h26vj"] +interpolation_mode = 2 +offsets = PackedFloat32Array(0.0432099, 1) +colors = PackedColorArray(0.0768358, 0.0768358, 0.0768358, 1, 1, 1, 1, 1) [resource] gradient = SubResource("Gradient_h26vj") diff --git a/levels/intro.gd b/levels/intro.gd deleted file mode 100644 index aa1ba1f..0000000 --- a/levels/intro.gd +++ /dev/null @@ -1,9 +0,0 @@ -extends Node2D - -func _on_area_2d_body_entered(body: Node2D) -> void: - if body == NodeRegistry.player: - NodeRegistry.player.die() - -func _on_next_level_body_entered(body: Node2D) -> void: - if body == NodeRegistry.player: - Levels.load_entrypoint("test") diff --git a/levels/intro.tscn b/levels/intro.tscn deleted file mode 100644 index 41e6f55..0000000 --- a/levels/intro.tscn +++ /dev/null @@ -1,86 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://c6w7lrydi43ts"] - -[ext_resource type="PackedScene" uid="uid://cbynoofsjcl45" path="res://core/polygon/polygon.tscn" id="1_cup10"] -[ext_resource type="Script" path="res://levels/intro.gd" id="1_pgj82"] -[ext_resource type="Script" path="res://core/audio/spatial_audio_player.gd" id="3_3eqhh"] -[ext_resource type="AudioStream" uid="uid://cs6l2t3jtags8" path="res://assets/sounds/clock-tick-76039.mp3" id="3_6yss2"] - -[sub_resource type="Animation" id="Animation_h8pmj"] -resource_name = "audio" -length = 10.0 -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("AnimationPlayer/Polygon2D:position") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 1.96667, 4.46667, 6.46667, 6.76667, 7.23333, 8.13333), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(768, 328), Vector2(888, 178), Vector2(256, 208), Vector2(384, 328), Vector2(512, 336), Vector2(520, 408), Vector2(472, 408)] -} - -[sub_resource type="Animation" id="Animation_i0i2l"] -length = 0.001 - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ucyvg"] -_data = { -"RESET": SubResource("Animation_i0i2l"), -"audio": SubResource("Animation_h8pmj") -} - -[sub_resource type="GDScript" id="GDScript_e2u3o"] -script/source = "extends AnimationPlayer - -func _ready() -> void: - self.play(\"audio\") -" - -[node name="Intro" type="Node2D"] -script = ExtResource("1_pgj82") - -[node name="StaticBody2D" type="StaticBody2D" parent="."] - -[node name="Polygon" parent="StaticBody2D" instance=ExtResource("1_cup10")] -polygon = PackedVector2Array(64, 200, 64, 432, -176, 432, -176, 512, 960, 512, 960, 384, 648, 384, 648, 344, 704, 344, 704, 288, 616, 288, 616, 232, 408, 232, 408, 304, 544, 304, 544, 384, 544, 432, 408, 432, 408, 392, 488, 392, 488, 352, 360, 352, 360, 440, 256, 440, 256, 320, 192, 320, 192, 440, 128, 440, 128, 200) - -[node name="Polygon2" parent="StaticBody2D" instance=ExtResource("1_cup10")] -polygon = PackedVector2Array(448, 64, 448, 88, 512, 88, 512, 128, 384, 128, 384, 152, 640, 152, 640, 128, 688, 128, 688, 64) - -[node name="Area2D" type="Area2D" parent="."] - -[node name="Polygon" parent="Area2D" instance=ExtResource("1_cup10")] -polygon = PackedVector2Array(128, 384, 192, 384, 192, 440, 128, 440) -color = Color(1, 0.1, 0, 1) - -[node name="Polygon2" parent="Area2D" instance=ExtResource("1_cup10")] -polygon = PackedVector2Array(256, 384, 360, 384, 360, 440, 256, 440) -color = Color(1, 0.1, 0, 1) - -[node name="next_level" type="Area2D" parent="."] - -[node name="Polygon" parent="next_level" instance=ExtResource("1_cup10")] -polygon = PackedVector2Array(416, 400, 416, 424, 440, 424, 440, 400) -color = Color(0.484431, 0.687354, 1, 1) - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ucyvg") -} -script = SubResource("GDScript_e2u3o") - -[node name="Polygon2D" type="Polygon2D" parent="AnimationPlayer"] -position = Vector2(768, 328) -polygon = PackedVector2Array(0, -8, -8, 0, 0, 8, 8, 0) - -[node name="SpatialAudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="AnimationPlayer/Polygon2D"] -stream = ExtResource("3_6yss2") -volume_db = 5.0 -autoplay = true -script = ExtResource("3_3eqhh") -detect_mod = 2 - -[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"] -[connection signal="body_entered" from="next_level" to="." method="_on_next_level_body_entered"] diff --git a/levels/intro/intro.gd b/levels/intro/intro.gd new file mode 100644 index 0000000..c23162d --- /dev/null +++ b/levels/intro/intro.gd @@ -0,0 +1,13 @@ +extends Node2D + +func _on_next_level_body_entered(body: Node2D) -> void: + if body == NodeRegistry.player: + LevelsCore.load_entrypoint("test") + +func _on_unlock_player_body_entered(body: Node2D) -> void: + if body == NodeRegistry.player: + body.locked = false + +func _on_delete_bodies_body_entered(body: Node2D) -> void: + if body != NodeRegistry.player: + body.call_deferred("queue_free") diff --git a/levels/intro/intro.tscn b/levels/intro/intro.tscn new file mode 100644 index 0000000..bd19582 --- /dev/null +++ b/levels/intro/intro.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=8 format=3 uid="uid://c6w7lrydi43ts"] + +[ext_resource type="Script" path="res://levels/intro/intro.gd" id="1_pgj82"] +[ext_resource type="Script" path="res://reusable/conveyor/conveyor.gd" id="3_0til7"] +[ext_resource type="Script" path="res://core/polygon/polygon.gd" id="3_3lt07"] +[ext_resource type="Script" path="res://reusable/spawner.gd" id="4_xsg5s"] +[ext_resource type="PackedScene" uid="uid://cylmgbhvpdexh" path="res://reusable/aged_box/aged_box.tscn" id="5_hjicl"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_fkj57"] +size = Vector2(2288, 96) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_0hgjk"] +size = Vector2(14224, 656) + +[node name="Intro" type="Node2D"] +script = ExtResource("1_pgj82") + +[node name="StaticBody2D" type="StaticBody2D" parent="."] + +[node name="P" type="CollisionPolygon2D" parent="StaticBody2D"] +polygon = PackedVector2Array(-1216, 64, 32, 64, 32, 88, 0, 88, 0, 416, -448, 416, -448, 488, -32, 488, -32, 512, -64, 512, -64, 1664, 2240, 1664, 2240, 2624, -1856, 2624, -1856, 64) +script = ExtResource("3_3lt07") + +[node name="Conveyor" type="Node2D" parent="."] +position = Vector2(-1472, 66) +script = ExtResource("3_0til7") +conveyor_segments = 188 +speed_mult = 50.0 + +[node name="Spawner" type="Node2D" parent="."] +position = Vector2(-1440, 32) +script = ExtResource("4_xsg5s") +spawn_interval_secs = 7.0 +spawn_interval_rand = 0.5 +scene = ExtResource("5_hjicl") + +[node name="Conveyor2" type="Node2D" parent="."] +position = Vector2(-448, 490) +script = ExtResource("3_0til7") +conveyor_segments = 52 +speed_mult = 50.0 + +[node name="Spawner2" type="Node2D" parent="."] +position = Vector2(-413, 448) +script = ExtResource("4_xsg5s") +spawn_interval_secs = 10.0 +spawn_interval_rand = 0.5 +scene = ExtResource("5_hjicl") + +[node name="Marker2D" type="Marker2D" parent="."] +position = Vector2(-1440, 56) + +[node name="P" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(-1216, -576, -1216, 320, -1856, 320, -1856, -576) +script = ExtResource("3_3lt07") + +[node name="Spawner_pile" type="Node2D" parent="."] +position = Vector2(160, 928) +script = ExtResource("4_xsg5s") +spawn_interval_secs = 0.02 +stop_after_secs = 5.0 +amount_per_interval = 4 +jitter_spawnpoint = true +scene = ExtResource("5_hjicl") + +[node name="UnlockPlayer" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="UnlockPlayer"] +position = Vector2(1080, 688) +shape = SubResource("RectangleShape2D_fkj57") + +[node name="DeleteBodies" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DeleteBodies"] +position = Vector2(3232, 3032) +shape = SubResource("RectangleShape2D_0hgjk") + +[node name="P2" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(-352, 384, -352, 512, -512, 512, -512, 384) +script = ExtResource("3_3lt07") + +[connection signal="body_entered" from="UnlockPlayer" to="." method="_on_unlock_player_body_entered"] +[connection signal="body_entered" from="DeleteBodies" to="." method="_on_delete_bodies_body_entered"] diff --git a/levels/levels_def.gd b/levels/levels_def.gd new file mode 100644 index 0000000..d678654 --- /dev/null +++ b/levels/levels_def.gd @@ -0,0 +1,19 @@ +extends Node + +const SCENES = { + "menu": "uid://bqmpoix37kutp", + "intro": "uid://c6w7lrydi43ts", + "test": "uid://dqf665b540tfg", +} + +var ENTRYPOINTS = { + "intro_start": LevelsCore.Entrypoint.new( + "intro", + Vector2(-1440, 56), + false, Vector2.ZERO, + true), + "test": LevelsCore.Entrypoint.new( + "test", + Vector2(1680, 200), + false, Vector2(0, -500)), +} diff --git a/levels/test.tscn b/levels/test.tscn index 4a8739d..e9d8721 100644 --- a/levels/test.tscn +++ b/levels/test.tscn @@ -1,18 +1,20 @@ [gd_scene load_steps=3 format=3 uid="uid://dqf665b540tfg"] -[ext_resource type="PackedScene" uid="uid://cbynoofsjcl45" path="res://core/polygon/polygon.tscn" id="1_xm2ft"] [ext_resource type="PackedScene" uid="uid://b8cjp6hiqycxe" path="res://core/rain.tscn" id="2_31352"] +[ext_resource type="Script" path="res://core/polygon/polygon.gd" id="2_m4j53"] [node name="Test" type="Node2D"] position = Vector2(1680, 80) [node name="StaticBody2D" type="StaticBody2D" parent="."] -[node name="Polygon" parent="StaticBody2D" instance=ExtResource("1_xm2ft")] +[node name="P" type="CollisionPolygon2D" parent="StaticBody2D"] polygon = PackedVector2Array(-104, 232, -104, 320, 1024, 320, 1024, 232) +script = ExtResource("2_m4j53") -[node name="Polygon2" parent="StaticBody2D" instance=ExtResource("1_xm2ft")] +[node name="P2" type="CollisionPolygon2D" parent="StaticBody2D"] polygon = PackedVector2Array(-208, 184, -144, 184, -144, -400, 1008, -400, 1008, 176, 1072, 176, 1072, -464, -208, -464) +script = ExtResource("2_m4j53") [node name="Rain" parent="." instance=ExtResource("2_31352")] position = Vector2(433.72, -396.25) diff --git a/main/main.gd b/main/main.gd index 87f18ae..ce2f593 100644 --- a/main/main.gd +++ b/main/main.gd @@ -3,4 +3,4 @@ extends Node func _ready() -> void: NodeRegistry.player = %Player NodeRegistry.level_root_container = %LevelRootContainer - Levels.load_menu() + LevelsCore.load_menu() diff --git a/main/main.tscn b/main/main.tscn index e9048c8..54b1b70 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -4,7 +4,7 @@ [ext_resource type="PackedScene" uid="uid://dxp3dru2lrv6h" path="res://core/shaders/outline/outline_canvas_layer.tscn" id="2_ta1pa"] [ext_resource type="PackedScene" uid="uid://jmy11lqcs4c" path="res://core/shaders/distortion/distortion_canvas_layer.tscn" id="3_emkei"] [ext_resource type="Script" path="res://main/text_viewport.gd" id="4_hxymt"] -[ext_resource type="PackedScene" uid="uid://ebb4pfxklatj" path="res://player/player.tscn" id="5_0agpg"] +[ext_resource type="PackedScene" uid="uid://ebb4pfxklatj" path="res://core/player/player.tscn" id="5_0agpg"] [node name="Main" type="Control"] layout_mode = 3 diff --git a/menu/menu.gd b/main/menu/menu.gd similarity index 69% rename from menu/menu.gd rename to main/menu/menu.gd index 065949e..40795f3 100644 --- a/menu/menu.gd +++ b/main/menu/menu.gd @@ -2,4 +2,4 @@ extends Node2D func _physics_process(_delta: float) -> void: if NodeRegistry.player.position.y > 1000: - NodeRegistry.player.position = Vector2(0, 0) + LevelsCore.call_deferred("load_menu") diff --git a/menu/menu.tscn b/main/menu/menu.tscn similarity index 64% rename from menu/menu.tscn rename to main/menu/menu.tscn index 36cda4f..8c87029 100644 --- a/menu/menu.tscn +++ b/main/menu/menu.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://bqmpoix37kutp"] -[ext_resource type="PackedScene" uid="uid://cbynoofsjcl45" path="res://core/polygon/polygon.tscn" id="1_8p275"] -[ext_resource type="Script" path="res://menu/menu.gd" id="1_g2w4y"] -[ext_resource type="PackedScene" uid="uid://c40fli7qcma78" path="res://menu/slot/slot.tscn" id="3_rc4dm"] +[ext_resource type="Script" path="res://main/menu/menu.gd" id="1_g2w4y"] +[ext_resource type="Script" path="res://core/polygon/polygon.gd" id="2_tdbfk"] +[ext_resource type="PackedScene" uid="uid://c40fli7qcma78" path="res://main/menu/slot/slot.tscn" id="3_rc4dm"] [node name="Menu" type="Node2D"] position = Vector2(0, -1) @@ -10,18 +10,23 @@ script = ExtResource("1_g2w4y") [node name="StaticBody2D" type="StaticBody2D" parent="."] -[node name="Polygon" parent="StaticBody2D" instance=ExtResource("1_8p275")] -polygon = PackedVector2Array(-256, 209, 320, 209, 320, 193, -272, 193, -272, 601, -304, 601, -304, 617, -256, 617) +[node name="P" type="CollisionPolygon2D" parent="StaticBody2D"] +polygon = PackedVector2Array(768, 1345, 768, 193, -272, 193, -272, 601, -304, 601, -304, 1345) +script = ExtResource("2_tdbfk") + +[node name="P2" type="CollisionPolygon2D" parent="StaticBody2D"] +polygon = PackedVector2Array(-152, 41, 152, 41, 152, 57, -152, 57) +script = ExtResource("2_tdbfk") [node name="SaveGameSlots" type="Node2D" parent="."] position = Vector2(-448, 177) [node name="Saves" type="Label" parent="SaveGameSlots" groups=["text_viewport"]] -offset_left = -64.0 +offset_left = -192.0 offset_top = -176.0 -offset_right = 64.0 +offset_right = 80.0 offset_bottom = -112.0 -theme_override_font_sizes/font_size = 42 +theme_override_font_sizes/font_size = 32 text = "saves" horizontal_alignment = 1 vertical_alignment = 2 @@ -53,3 +58,6 @@ theme_override_font_sizes/font_size = 52 text = "rectangular" horizontal_alignment = 1 vertical_alignment = 2 + +[node name="Marker2D" type="Marker2D" parent="."] +position = Vector2(0, 129) diff --git a/menu/slot/slot.gd b/main/menu/slot/slot.gd similarity index 83% rename from menu/slot/slot.gd rename to main/menu/slot/slot.gd index b15cbae..f24090c 100644 --- a/menu/slot/slot.gd +++ b/main/menu/slot/slot.gd @@ -8,9 +8,9 @@ const COLOR_USED = Color.WHITE func update_color(): if Gamestate.is_slot_used(slot_idx): - $StaticBody2D/platform.color = COLOR_USED + $Platform/P.color = COLOR_USED else: - $StaticBody2D/platform.color = COLOR_NORMAL + $Platform/P.color = COLOR_NORMAL func _ready() -> void: $Label.text = str(slot_label) @@ -21,7 +21,7 @@ func _on_area_2d_load_body_entered(body: Node2D) -> void: if body == NodeRegistry.player: Gamestate.current_slot = slot_idx Gamestate.load_slot() - Levels.load_entrypoint(Gamestate.last_entrypoint) + LevelsCore.load_entrypoint(Gamestate.last_entrypoint) func _on_area_2d_delete_body_entered(body: Node2D) -> void: # reset slot on disk diff --git a/main/menu/slot/slot.tscn b/main/menu/slot/slot.tscn new file mode 100644 index 0000000..14767f7 --- /dev/null +++ b/main/menu/slot/slot.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=3 format=3 uid="uid://c40fli7qcma78"] + +[ext_resource type="Script" path="res://main/menu/slot/slot.gd" id="1_3dgi0"] +[ext_resource type="Script" path="res://core/polygon/polygon.gd" id="3_3d6ht"] + +[node name="Slot" type="Node2D"] +script = ExtResource("1_3dgi0") + +[node name="Platform" type="StaticBody2D" parent="."] + +[node name="P" type="CollisionPolygon2D" parent="Platform"] +polygon = PackedVector2Array(40, 16, -152, 16, -152, 48, -176, 48, -176, 16, -192, 16, -192, 56, 80, 56, 80, 16, 64, 16, 64, 48, 40, 48) +script = ExtResource("3_3d6ht") + +[node name="Area2D_Load" type="Area2D" parent="."] +collision_layer = 255 +collision_mask = 255 + +[node name="P" type="CollisionPolygon2D" parent="Area2D_Load"] +polygon = PackedVector2Array(40, 48, 64, 48, 64, 24, 40, 24) +script = ExtResource("3_3d6ht") +color = Color(0.301961, 1, 0, 1) + +[node name="Area2D_Delete" type="Area2D" parent="."] + +[node name="P" type="CollisionPolygon2D" parent="Area2D_Delete"] +polygon = PackedVector2Array(-176, 48, -152, 48, -152, 24, -176, 24) +script = ExtResource("3_3d6ht") +color = Color(1, 0, 0, 1) + +[node name="Label" type="Label" parent="." groups=["text_viewport"]] +offset_left = -192.0 +offset_top = -32.0 +offset_right = 80.0 +text = "_" +horizontal_alignment = 1 +vertical_alignment = 1 + +[connection signal="body_entered" from="Area2D_Load" to="." method="_on_area_2d_load_body_entered"] +[connection signal="body_entered" from="Area2D_Delete" to="." method="_on_area_2d_delete_body_entered"] diff --git a/menu/slot/slot.tscn b/menu/slot/slot.tscn deleted file mode 100644 index 62c74b1..0000000 --- a/menu/slot/slot.tscn +++ /dev/null @@ -1,35 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://c40fli7qcma78"] - -[ext_resource type="PackedScene" uid="uid://cbynoofsjcl45" path="res://core/polygon/polygon.tscn" id="1_2cb7u"] -[ext_resource type="Script" path="res://menu/slot/slot.gd" id="1_3dgi0"] - -[node name="Slot" type="Node2D"] -script = ExtResource("1_3dgi0") - -[node name="StaticBody2D" type="StaticBody2D" parent="."] - -[node name="platform" parent="StaticBody2D" instance=ExtResource("1_2cb7u")] -polygon = PackedVector2Array(44, 16, -44, 16, -44, 48, -64, 48, -64, 16, -80, 16, -80, 56, 80, 56, 80, 16, 64, 16, 64, 48, 44, 48) - -[node name="Area2D_Load" type="Area2D" parent="."] - -[node name="Polygon" parent="Area2D_Load" instance=ExtResource("1_2cb7u")] -polygon = PackedVector2Array(44, 48, 64, 48, 64, 24, 44, 24) -color = Color(0, 1, 0, 1) - -[node name="Area2D_Delete" type="Area2D" parent="."] - -[node name="Polygon" parent="Area2D_Delete" instance=ExtResource("1_2cb7u")] -polygon = PackedVector2Array(-64, 48, -44, 48, -44, 24, -64, 24) -color = Color(1, 0, 0, 1) - -[node name="Label" type="Label" parent="." groups=["text_viewport"]] -offset_left = -16.0 -offset_top = -32.0 -offset_right = 16.0 -text = "_" -horizontal_alignment = 1 -vertical_alignment = 1 - -[connection signal="body_entered" from="Area2D_Load" to="." method="_on_area_2d_load_body_entered"] -[connection signal="body_entered" from="Area2D_Delete" to="." method="_on_area_2d_delete_body_entered"] diff --git a/project.godot b/project.godot index e7a1e17..e38dc35 100644 --- a/project.godot +++ b/project.godot @@ -18,9 +18,10 @@ config/icon="res://icon.svg" [autoload] -Levels="*res://core/globals/levels.gd" +LevelsCore="*res://core/globals/levels_core.gd" NodeRegistry="*res://core/globals/node_registry.gd" Gamestate="*res://core/globals/gamestate.gd" +LevelsDef="*res://levels/levels_def.gd" [debug] diff --git a/reusable/aged_box/aged_box.gd b/reusable/aged_box/aged_box.gd new file mode 100644 index 0000000..2a03d5e --- /dev/null +++ b/reusable/aged_box/aged_box.gd @@ -0,0 +1,14 @@ +extends RigidBody2D + +@export var demolition_minmax: float = 0.1 + +func _ready() -> void: + var p: P = $P + for i in range(len(p.polygon)): + p.polygon[i].x = p.polygon[i].x * randf_range(1.0-demolition_minmax, 1.0+demolition_minmax) + p.polygon[i].y = p.polygon[i].y * randf_range(1.0-demolition_minmax, 1.0+demolition_minmax) + p.update_polygon() + # make visible polygon a bit bigger than collision polygon + for i in range(len(p.polygon_2d.polygon)): + p.polygon_2d.polygon[i].x += sign(p.polygon[i].x) # make bigger by 1 pixel + p.polygon_2d.polygon[i].y += sign(p.polygon[i].y) diff --git a/reusable/aged_box/aged_box.tscn b/reusable/aged_box/aged_box.tscn new file mode 100644 index 0000000..ce5bf1d --- /dev/null +++ b/reusable/aged_box/aged_box.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=3 uid="uid://cylmgbhvpdexh"] + +[ext_resource type="Script" path="res://core/polygon/polygon.gd" id="1_m3p7r"] +[ext_resource type="Script" path="res://reusable/aged_box/aged_box.gd" id="1_ul3hr"] + +[node name="AgedBox" type="RigidBody2D"] +script = ExtResource("1_ul3hr") + +[node name="P" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +script = ExtResource("1_m3p7r") diff --git a/reusable/conveyor/conveyor.gd b/reusable/conveyor/conveyor.gd new file mode 100644 index 0000000..0e994c0 --- /dev/null +++ b/reusable/conveyor/conveyor.gd @@ -0,0 +1,62 @@ +@tool +class_name Conveyor extends Node2D + +const GAP = 8.0 +const SPEED = 0.0041 # ~ the targeted physics tick time + +@export var conveyor_segments: int = 20: + set(v): + conveyor_segments = v + create_segments() + get: + return conveyor_segments + +@export var speed_mult: float = 20.0 + +var conveyor_seg_scn = preload("uid://be7ki66sskav5") +var segments_top: Array[Node2D] = [] +var segments_bottom: Array[Node2D] = [] + +func create_segments(): + for c in self.get_children(): + c.call_deferred("queue_free") + segments_top = [] + segments_bottom = [] + # top + for i in range(0, conveyor_segments + 1): + var c = conveyor_seg_scn.instantiate() + c.position.x = i*8.0 + self.segments_top.append(c) + self.add_child(c) + # bottom + for i in range(0, conveyor_segments + 1): + var c = conveyor_seg_scn.instantiate() + c.position.x = i*8.0 + c.position.y = 5.0 + self.segments_bottom.append(c) + self.add_child(c) + +func _ready() -> void: + create_segments() + +func _process(_delta: float) -> void: + if Engine.is_editor_hint(): + return + # make it NOT framerate-depedent bc this would fuck up the positioning over time + var s = sign(speed_mult) + for p in segments_top: + if s > 0.0: + if p.position.x > conveyor_segments * GAP: + p.position.x = 0.0 + else: + if p.position.x < 0.0: + p.position.x = conveyor_segments * GAP + p.position.x += SPEED * speed_mult + for p in segments_bottom: + if s > 0.0: + if p.position.x < 0.0: + p.position.x = conveyor_segments * GAP + else: + if p.position.x > conveyor_segments * GAP: + p.position.x = 0.0 + p.position.x -= SPEED * speed_mult diff --git a/reusable/conveyor/conveyor_segment.tscn b/reusable/conveyor/conveyor_segment.tscn new file mode 100644 index 0000000..a8e0fe7 --- /dev/null +++ b/reusable/conveyor/conveyor_segment.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://be7ki66sskav5"] + +[ext_resource type="Script" path="res://core/polygon/polygon.gd" id="2_hf2op"] + +[node name="ConveyorPart" type="AnimatableBody2D"] +sync_to_physics = false + +[node name="P" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(-3, -4, -3, -0.1, 3, -0.1, 3, -4) +script = ExtResource("2_hf2op") diff --git a/reusable/spawner.gd b/reusable/spawner.gd new file mode 100644 index 0000000..e7fbf01 --- /dev/null +++ b/reusable/spawner.gd @@ -0,0 +1,31 @@ +class_name Spawner extends Node2D + +@export var spawn_interval_secs: float = 1.0 +@export var spawn_interval_rand: float = 0.0 +@export var stop_after_secs: float = 0.0 +@export var amount_per_interval: int = 1 +@export var jitter_spawnpoint: bool = false +@export var scene: PackedScene = null + +func _ready() -> void: + pass # Replace with function body. + +var dt_total = 0.0 +var dt = 0.0 + +func _process(delta: float) -> void: + if stop_after_secs > 0.0 and dt_total < stop_after_secs: + dt_total += delta + if stop_after_secs > 0.0 and dt_total >= stop_after_secs: + return + dt += delta + if spawn_interval_rand > 0.0: + dt += randf_range(-spawn_interval_rand, spawn_interval_rand) + var spawn = dt > spawn_interval_secs + dt = fmod(dt, spawn_interval_secs) + if spawn and scene != null: + for i in range(amount_per_interval): + var c = scene.instantiate() + if jitter_spawnpoint: + c.position += Vector2(randf_range(-12, 12), randf_range(-12, 12)) + self.add_child(c)