many small changes, and few big ones
This commit is contained in:
parent
e8985f4e79
commit
a3ca623258
32 changed files with 391 additions and 247 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,6 @@
|
||||||
# Godot 4+ specific ignores
|
# Godot 4+ specific ignores
|
||||||
.godot/
|
.godot/
|
||||||
/android/
|
/android/
|
||||||
|
/assets/*
|
||||||
|
!/assets/.gitkeep
|
||||||
|
|
||||||
|
|
0
assets/.gitkeep
Normal file
0
assets/.gitkeep
Normal file
|
@ -1,3 +0,0 @@
|
||||||
The following files are from Pixabay:
|
|
||||||
|
|
||||||
- clock-tick-76039.mp3
|
|
Binary file not shown.
|
@ -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
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
|
@ -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()
|
|
@ -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)
|
|
|
@ -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()
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
|
|
@ -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
13
levels/intro/intro.gd
Normal 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
83
levels/intro/intro.tscn
Normal 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
19
levels/levels_def.gd
Normal 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)),
|
||||||
|
}
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
|
@ -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)
|
|
@ -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
40
main/menu/slot/slot.tscn
Normal 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"]
|
|
@ -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"]
|
|
|
@ -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]
|
||||||
|
|
||||||
|
|
14
reusable/aged_box/aged_box.gd
Normal file
14
reusable/aged_box/aged_box.gd
Normal 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)
|
11
reusable/aged_box/aged_box.tscn
Normal file
11
reusable/aged_box/aged_box.tscn
Normal 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")
|
62
reusable/conveyor/conveyor.gd
Normal file
62
reusable/conveyor/conveyor.gd
Normal 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
|
10
reusable/conveyor/conveyor_segment.tscn
Normal file
10
reusable/conveyor/conveyor_segment.tscn
Normal 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
31
reusable/spawner.gd
Normal 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)
|
Reference in a new issue