many small changes, and few big ones

This commit is contained in:
ChaoticByte 2024-10-16 20:23:53 +02:00
parent e8985f4e79
commit a3ca623258
No known key found for this signature in database
32 changed files with 391 additions and 247 deletions

3
.gitignore vendored
View file

@ -1,3 +1,6 @@
# Godot 4+ specific ignores # Godot 4+ specific ignores
.godot/ .godot/
/android/ /android/
/assets/*
!/assets/.gitkeep

0
assets/.gitkeep Normal file
View file

View file

@ -1,3 +0,0 @@
The following files are from Pixabay:
- clock-tick-76039.mp3

Binary file not shown.

View file

@ -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

View file

@ -4,7 +4,7 @@ extends AudioStreamPlayer2D
# EXPORTED VARS # EXPORTED VARS
# detect every nth tick # detect every nth tick
@export var detect_mod: int = 4 @export var audio_tick_interval: int = 4
@export_category("dampening effect") @export_category("dampening effect")
@export var n_pointcasts_to_player: int = 25 @export var n_pointcasts_to_player: int = 25
@ -162,12 +162,12 @@ func _ready() -> void:
create_audio_bus_effects() create_audio_bus_effects()
create_raycasts() create_raycasts()
var tick: int = 0 var audio_tick: int = 0
func _physics_process(delta: float) -> void: func _physics_process(_delta: float) -> void:
if tick == 0: if audio_tick == 0:
var reverb_params = determine_reverb_params() var reverb_params = determine_reverb_params()
var blocked_amount = determine_distance_amount_blocked() var blocked_amount = determine_distance_amount_blocked()
update_reverb(reverb_params[0], reverb_params[1]) update_reverb(reverb_params[0], reverb_params[1])
update_dampening(blocked_amount) update_dampening(blocked_amount)
tick = (tick + 1) % detect_mod audio_tick = (audio_tick + 1) % audio_tick_interval

View file

@ -1,12 +1,11 @@
extends Node extends Node
const mainmenu_player_pos: Vector2 = Vector2(0, 128 + 32)
class Entrypoint extends Object: class Entrypoint extends Object:
var scene_name: String var scene_name: String
var player_position: Vector2 var player_position: Vector2
var keep_velocity: bool var keep_velocity: bool
var initial_velocity: Vector2 var initial_velocity: Vector2
var lock_player: bool
func _init( func _init(
scene_name_: String, scene_name_: String,
player_position_: Vector2, player_position_: Vector2,
@ -14,24 +13,15 @@ class Entrypoint extends Object:
# if player velocity is zero, use initial_velocity # if player velocity is zero, use initial_velocity
keep_velocity_: bool = true, keep_velocity_: bool = true,
# initial player velocity # initial player velocity
initial_velocity_: Vector2 = Vector2.ZERO initial_velocity_: Vector2 = Vector2.ZERO,
# lock player movement
lock_player_: bool = false
) -> void: ) -> void:
self.scene_name = scene_name_ self.scene_name = scene_name_
self.player_position = player_position_ self.player_position = player_position_
self.keep_velocity = keep_velocity_ self.keep_velocity = keep_velocity_
self.initial_velocity = initial_velocity_ self.initial_velocity = initial_velocity_
self.lock_player = lock_player_
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)),
}
# load that stuff # load that stuff
@ -52,11 +42,11 @@ func load_scene(scn_name: String, force_reload: bool = false) -> bool:
return true # nothing to do :) return true # nothing to do :)
if not _pre_load_checks(): if not _pre_load_checks():
return false return false
if not scn_name in SCENES: if not scn_name in LevelsDef.SCENES:
push_error("Level " + scn_name + " doesn't exist.") push_error("Level " + scn_name + " doesn't exist.")
return false return false
unload_scene() 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) NodeRegistry.level_root_container.add_child(scn)
return true return true
@ -66,17 +56,19 @@ func unload_scene():
c.queue_free() c.queue_free()
func load_entrypoint(ep_name: String) -> bool: # returns true on success 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.") push_error("Entrypoint " + ep_name + " doesn't exist.")
return false return false
if not _pre_load_checks(): if not _pre_load_checks():
return false return false
var e: Entrypoint = ENTRYPOINTS[ep_name] var e: Entrypoint = LevelsDef.ENTRYPOINTS[ep_name]
if load_scene(e.scene_name): if load_scene(e.scene_name):
NodeRegistry.player.position = e.player_position NodeRegistry.player.position = e.player_position
NodeRegistry.player.camera.call_deferred("reset_smoothing") NodeRegistry.player.camera.call_deferred("reset_smoothing")
if not e.keep_velocity or NodeRegistry.player.velocity == Vector2.ZERO: if not e.keep_velocity or NodeRegistry.player.velocity == Vector2.ZERO:
NodeRegistry.player.velocity = e.initial_velocity NodeRegistry.player.velocity = e.initial_velocity
if e.lock_player:
NodeRegistry.player.locked = true
Gamestate.last_entrypoint = ep_name Gamestate.last_entrypoint = ep_name
Gamestate.save_slot() # save game Gamestate.save_slot() # save game
return true return true
@ -87,5 +79,5 @@ func load_menu():
if not _pre_load_checks(): if not _pre_load_checks():
return false return false
unload_scene() unload_scene()
NodeRegistry.player.position = mainmenu_player_pos NodeRegistry.player.position = Vector2(0, 129)
return load_scene("menu", true) return load_scene("menu", true)

View file

@ -5,41 +5,41 @@ extends CharacterBody2D
# die # die
func die(): func die():
Levels.load_entrypoint(Gamestate.last_entrypoint) LevelsCore.load_entrypoint(Gamestate.last_entrypoint)
# movement and stuff # movement and stuff
@export var movement_speed = 300.0 @export var movement_speed = 300.0
@export var jump_velocity = -350.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 max_jumps: int = 2
@export var rigidbody_impulse_mult: float = 0.04 @export var rigidbody_impulse_mult: float = 0.04
@onready var ceiling_raycast1 = $RayCastUp1 var locked: bool = false
@onready var ceiling_raycast2 = $RayCastUp2 var jumps: int = 0
var jumps = 0
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
var gravity = get_gravity()
var dir = Input.get_axis("player_left", "player_right") var dir = Input.get_axis("player_left", "player_right")
var on_floor = is_on_floor() var on_floor = is_on_floor()
var on_wall = is_on_wall() var on_wall = is_on_wall()
var on_ceiling = ceiling_raycast1.is_colliding() or ceiling_raycast2.is_colliding()
# left right movement # left right movement
if dir: if dir and not locked:
velocity.x = dir * movement_speed velocity.x = move_toward(velocity.x, dir * movement_speed, movement_speed*floor_friction)
else: elif on_floor:# or on_ceiling:
velocity.x = move_toward(velocity.x, 0, movement_speed) 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 # gravity
if not (on_floor or on_ceiling): if not on_floor:
velocity += get_gravity() * delta velocity += gravity * delta
# reset number of jumps # reset number of jumps
if on_ceiling or on_floor or on_wall: if on_floor or on_wall:
jumps = 0 jumps = 0
# jumping / dropping from ceiling # jumping / dropping from ceiling
if Input.is_action_just_pressed("player_jump"): if Input.is_action_just_pressed("player_jump") and not locked:
if on_ceiling: # drop from ceiling if jumps < max_jumps: # (allows air jumps)
velocity += get_gravity() * delta
elif jumps < max_jumps: # (allows air jumps)
velocity.y = jump_velocity velocity.y = jump_velocity
jumps += 1 jumps += 1
move_and_slide() move_and_slide()

View file

@ -1,38 +1,34 @@
[gd_scene load_steps=4 format=3 uid="uid://ebb4pfxklatj"] [gd_scene load_steps=4 format=3 uid="uid://ebb4pfxklatj"]
[ext_resource type="Script" path="res://player/player.gd" id="1_fob34"] [ext_resource type="Script" path="res://core/player/player.gd" id="1_fob34"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_p33ik"]
polygon = PackedVector2Array(-9, -9, -9, 9, 9, 9, 9, -9)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_7cq61"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_7cq61"]
size = Vector2(16, 16) 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"] [node name="Player" type="CharacterBody2D"]
collision_layer = 2 collision_layer = 2
slide_on_ceiling = false
floor_block_on_wall = false floor_block_on_wall = false
script = ExtResource("1_fob34") 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="."] [node name="Camera2D" type="Camera2D" parent="."]
process_callback = 0 process_callback = 0
position_smoothing_enabled = true position_smoothing_enabled = true
drag_horizontal_enabled = true drag_horizontal_enabled = true
drag_vertical_enabled = true drag_vertical_enabled = true
drag_top_margin = 0.3
drag_bottom_margin = 0.3
editor_draw_drag_margin = true 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)

View file

@ -1,5 +1,5 @@
@tool @tool
extends CollisionPolygon2D class_name P extends CollisionPolygon2D
@export var color: Color = Color.WHITE: @export var color: Color = Color.WHITE:
set(v): set(v):
@ -8,18 +8,27 @@ extends CollisionPolygon2D
get(): get():
return color return color
var polygon_2d: Polygon2D = null
var light_occluder_2d: LightOccluder2D = null
@export var update: bool: @export var update: bool:
set(v): set(v):
update_polygon() update_polygon()
func update_polygon(): func update_polygon():
# normal polygon if polygon_2d == null:
$Polygon2D.polygon = polygon polygon_2d = Polygon2D.new()
$Polygon2D.color = color 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 # light occluder
var lo_polygon = OccluderPolygon2D.new() var lo_polygon = OccluderPolygon2D.new()
lo_polygon.polygon = polygon lo_polygon.polygon = polygon
$LightOccluder2D.occluder = lo_polygon light_occluder_2d.occluder = lo_polygon
func _ready() -> void: func _ready() -> void:
update_polygon() update_polygon()

View file

@ -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"] [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"] [node name="Polygon" type="CollisionPolygon2D"]
script = ExtResource("1_ga37f") script = ExtResource("1_ga37f")
@ -11,4 +11,4 @@ script = ExtResource("1_ga37f")
[node name="LightOccluder2D" type="LightOccluder2D" parent="."] [node name="LightOccluder2D" type="LightOccluder2D" parent="."]
editor_description = "For particle collisions" editor_description = "For particle collisions"
occluder = SubResource("OccluderPolygon2D_2cqf3") occluder = SubResource("OccluderPolygon2D_b1ir8")

View file

@ -8,8 +8,7 @@ uniform sampler2D vignette_mask;
// constants // constants
const float rgb_distortion_v_mult = 0.9; const float rgb_distortion_v_mult = 0.5;
const float rgb_distortion_v_exp = 2.0;
const float rgb_distortion_v_min = 0.04; const float rgb_distortion_v_min = 0.04;
const float rgb_distortion_v_max = 0.12; const float rgb_distortion_v_max = 0.12;
@ -19,13 +18,13 @@ void fragment() {
float v = texture(vignette_mask, SCREEN_UV).r; float v = texture(vignette_mask, SCREEN_UV).r;
// rgb & blur distortion // rgb & blur distortion
float v_ = clamp( 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_min,
rgb_distortion_v_max rgb_distortion_v_max
); );
vec2 screen_uv_r = SCREEN_UV - (v_ * 0.01); vec2 screen_uv_r = SCREEN_UV + vec2(-v_ * 0.01, 0.0);
vec2 screen_uv_g = SCREEN_UV + (v_ * 0.01); vec2 screen_uv_g = SCREEN_UV + vec2(0.0, v_ * 0.01);
vec2 screen_uv_b = SCREEN_UV; vec2 screen_uv_b = SCREEN_UV + vec2(v_ * 0.01, -v_ * 0.01);
COLOR.r = textureLod(screen_texture, screen_uv_r, v).r; COLOR.r = textureLod(screen_texture, screen_uv_r, v).r;
COLOR.g = textureLod(screen_texture, screen_uv_g, v).g; COLOR.g = textureLod(screen_texture, screen_uv_g, v).g;
COLOR.b = textureLod(screen_texture, screen_uv_b, v).b; COLOR.b = textureLod(screen_texture, screen_uv_b, v).b;

View file

@ -1,6 +1,9 @@
[gd_resource type="GradientTexture2D" load_steps=2 format=3 uid="uid://bwlgypt4xjocj"] [gd_resource type="GradientTexture2D" load_steps=2 format=3 uid="uid://bwlgypt4xjocj"]
[sub_resource type="Gradient" id="Gradient_h26vj"] [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] [resource]
gradient = SubResource("Gradient_h26vj") gradient = SubResource("Gradient_h26vj")

View file

@ -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")

View file

@ -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"]

13
levels/intro/intro.gd Normal file
View file

@ -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")

83
levels/intro/intro.tscn Normal file
View file

@ -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"]

19
levels/levels_def.gd Normal file
View file

@ -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)),
}

View file

@ -1,18 +1,20 @@
[gd_scene load_steps=3 format=3 uid="uid://dqf665b540tfg"] [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="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"] [node name="Test" type="Node2D"]
position = Vector2(1680, 80) position = Vector2(1680, 80)
[node name="StaticBody2D" type="StaticBody2D" parent="."] [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) 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) 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")] [node name="Rain" parent="." instance=ExtResource("2_31352")]
position = Vector2(433.72, -396.25) position = Vector2(433.72, -396.25)

View file

@ -3,4 +3,4 @@ extends Node
func _ready() -> void: func _ready() -> void:
NodeRegistry.player = %Player NodeRegistry.player = %Player
NodeRegistry.level_root_container = %LevelRootContainer NodeRegistry.level_root_container = %LevelRootContainer
Levels.load_menu() LevelsCore.load_menu()

View file

@ -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://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="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="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"] [node name="Main" type="Control"]
layout_mode = 3 layout_mode = 3

View file

@ -2,4 +2,4 @@ extends Node2D
func _physics_process(_delta: float) -> void: func _physics_process(_delta: float) -> void:
if NodeRegistry.player.position.y > 1000: if NodeRegistry.player.position.y > 1000:
NodeRegistry.player.position = Vector2(0, 0) LevelsCore.call_deferred("load_menu")

View file

@ -1,8 +1,8 @@
[gd_scene load_steps=4 format=3 uid="uid://bqmpoix37kutp"] [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://main/menu/menu.gd" id="1_g2w4y"]
[ext_resource type="Script" path="res://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://menu/slot/slot.tscn" id="3_rc4dm"] [ext_resource type="PackedScene" uid="uid://c40fli7qcma78" path="res://main/menu/slot/slot.tscn" id="3_rc4dm"]
[node name="Menu" type="Node2D"] [node name="Menu" type="Node2D"]
position = Vector2(0, -1) position = Vector2(0, -1)
@ -10,18 +10,23 @@ script = ExtResource("1_g2w4y")
[node name="StaticBody2D" type="StaticBody2D" parent="."] [node name="StaticBody2D" type="StaticBody2D" parent="."]
[node name="Polygon" parent="StaticBody2D" instance=ExtResource("1_8p275")] [node name="P" type="CollisionPolygon2D" parent="StaticBody2D"]
polygon = PackedVector2Array(-256, 209, 320, 209, 320, 193, -272, 193, -272, 601, -304, 601, -304, 617, -256, 617) 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="."] [node name="SaveGameSlots" type="Node2D" parent="."]
position = Vector2(-448, 177) position = Vector2(-448, 177)
[node name="Saves" type="Label" parent="SaveGameSlots" groups=["text_viewport"]] [node name="Saves" type="Label" parent="SaveGameSlots" groups=["text_viewport"]]
offset_left = -64.0 offset_left = -192.0
offset_top = -176.0 offset_top = -176.0
offset_right = 64.0 offset_right = 80.0
offset_bottom = -112.0 offset_bottom = -112.0
theme_override_font_sizes/font_size = 42 theme_override_font_sizes/font_size = 32
text = "saves" text = "saves"
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 2 vertical_alignment = 2
@ -53,3 +58,6 @@ theme_override_font_sizes/font_size = 52
text = "rectangular" text = "rectangular"
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 2 vertical_alignment = 2
[node name="Marker2D" type="Marker2D" parent="."]
position = Vector2(0, 129)

View file

@ -8,9 +8,9 @@ const COLOR_USED = Color.WHITE
func update_color(): func update_color():
if Gamestate.is_slot_used(slot_idx): if Gamestate.is_slot_used(slot_idx):
$StaticBody2D/platform.color = COLOR_USED $Platform/P.color = COLOR_USED
else: else:
$StaticBody2D/platform.color = COLOR_NORMAL $Platform/P.color = COLOR_NORMAL
func _ready() -> void: func _ready() -> void:
$Label.text = str(slot_label) $Label.text = str(slot_label)
@ -21,7 +21,7 @@ func _on_area_2d_load_body_entered(body: Node2D) -> void:
if body == NodeRegistry.player: if body == NodeRegistry.player:
Gamestate.current_slot = slot_idx Gamestate.current_slot = slot_idx
Gamestate.load_slot() 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: func _on_area_2d_delete_body_entered(body: Node2D) -> void:
# reset slot on disk # reset slot on disk

40
main/menu/slot/slot.tscn Normal file
View file

@ -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"]

View file

@ -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"]

View file

@ -18,9 +18,10 @@ config/icon="res://icon.svg"
[autoload] [autoload]
Levels="*res://core/globals/levels.gd" LevelsCore="*res://core/globals/levels_core.gd"
NodeRegistry="*res://core/globals/node_registry.gd" NodeRegistry="*res://core/globals/node_registry.gd"
Gamestate="*res://core/globals/gamestate.gd" Gamestate="*res://core/globals/gamestate.gd"
LevelsDef="*res://levels/levels_def.gd"
[debug] [debug]

View file

@ -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)

View file

@ -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")

View file

@ -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

View file

@ -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")

31
reusable/spawner.gd Normal file
View file

@ -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)