Many added feats:

Invincibility Shader (simple)
New Death Shader dissolving
Pit Areas
Invincibility fixes for spikes and flying laser cutters
Vending Machine
Better global and level stats tracking
This commit is contained in:
Jakob Feldmann 2023-04-04 16:45:38 +02:00
parent 349e8b332b
commit 4238855751
29 changed files with 645 additions and 247 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 539 B

View File

@ -1,16 +1,19 @@
extends Actor
const PhysicsFunc = preload("res://src/Utilities/Physic/PhysicsFunc.gd")
export var jump_buffer_filled := false
#TODO Switch to new unique node name method for referencing
onready var left_wall_raycasts = $WallRaycasts/LeftWallRaycast
onready var right_wall_raycasts = $WallRaycasts/RightWallRaycast
onready var effect_player = $BlobbyActionEffects/AnimationPlayer
onready var death_shader = preload("res://src/Actors/Blobby/DeathShader.tres")
onready var invincible_shader = preload("res://src/Actors/Blobby/InvincibleShader.tres")
onready var player_state_machine = $BlobbyStateMachine
onready var init_boost = player_state_machine.init_boost
onready var init_boost_type = player_state_machine.init_boost_type
export var jump_buffer_filled := false
var wall_touch_direction = 1
@ -18,18 +21,20 @@ var stomping = false
var floor_angle = Vector2(0,0)
var previous_rotation = 0
var snap_possible = true
var shielded = false
# When the Enemy stomp AREA enters the enemy collision area -> stomp
func _on_BlobbySkin_area_entered(area: Area2D) -> void:
if area.is_in_group("weakpoint"):
stomping = true
if area.is_in_group("harmful"):
if area.is_in_group("harmful") && !levelState.is_dead:
die()
if area.is_in_group("pit"):
shielded = false
die()
# When the Enemy collision BODY enters the enemy collision area -> die
func _on_BlobbySkin_body_entered(body: Node) -> void:
if body.is_in_group("harmful"):
if body.is_in_group("harmful") && !levelState.is_dead:
die()
@ -380,7 +385,7 @@ func execute_movement() -> void:
center_floor_rot = floor_rot
# snap when on slopes
if((abs(floor_rot) > 0.1 || abs(center_floor_rot) > 0.1) && snap_possible):
velocity = move_and_slide_with_snap(velocity.rotated(floor_rot*1.1),
velocity = move_and_slide_with_snap(velocity.rotated(floor_rot),
snap, FLOOR_NORMAL, true)
# normal slide on flat floor
else:
@ -400,8 +405,8 @@ func calculate_slope_rotation(onfloor: bool) -> float:
# avoid invalid angles and stay in rotation when touching ground completely
if(!(-PI/2 <= slope_angle_left && slope_angle_left <= PI/2)
|| !(-PI/2 <= slope_angle_right && slope_angle_right <= PI/2)
|| (abs(slope_angle_left) - abs(slope_angle_right) == 0 && onfloor)):
return previous_rotation if abs(previous_rotation) > 0.1 else 0.0
|| (is_equal_approx(abs(slope_angle_left), abs(slope_angle_right)))):
return previous_rotation if abs(rad2deg(previous_rotation)) > 1 && !is_equal_approx(slope_angle_left , 0) else 0.0
# downturn
if(abs(slope_angle_left) > abs(slope_angle_right) && velocity.x < -10||
abs(slope_angle_right) > abs(slope_angle_left) && velocity.x > 10):
@ -412,18 +417,35 @@ func calculate_slope_rotation(onfloor: bool) -> float:
var length_vector: Vector2 = $SlopeRaycastLeft.get_collision_point() - $SlopeRaycastRight.get_collision_point()
angle = length_vector.angle() - PI
previous_rotation = angle
if is_equal_approx(deg2rad(angle), 0):
pass
return angle
func receive_power_up(kind: String) -> void:
if kind == "shield":
$BubbleShieldViewport/IridescenceBall.visible = true
shielded = true
# TODO Maybe this should be a state in itself?
func die() -> void:
if shielded:
shielded = false
$BubbleShieldViewport/IridescenceBall.visible = false
$InvincibilityTimer.start()
$BlobbySprite.material = invincible_shader
return
elif !$InvincibilityTimer.is_stopped():
return
z_index = 1
levelState.is_dead = true
levelState.deaths += 1
$BlobbySprite.material = death_shader
signalManager.emit_signal("player_died")
$BlobbySprite/AnimationTree.active = false
$BlobbySprite/BlobbymationPlayer.play("dying3")
$BlobbySprite/BlobbymationPlayer.play("expandingDisolve")
# TODO Checkpoint system
func respawn() -> void:
# Is tied to the death animation
get_tree().reload_current_scene()
# This problem stems from trying to decelerate a walk
@ -446,3 +468,10 @@ func _on_BlobbySkin_body_exited(body:Node) -> void:
# This is for drop through platforms
if body.get_collision_mask_bit(7):
set_collision_mask_bit(7, true)
func _on_InvincibilityTimer_timeout() -> void:
$BlobbySprite.material = null
for area in $BlobbySkin.get_overlapping_areas():
if area.is_in_group("harmful"):
die()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=119 format=2]
[gd_scene load_steps=117 format=2]
[ext_resource path="res://assets/blobby/blobby-effects-spritesheet.png" type="Texture" id=1]
[ext_resource path="res://src/Actors/Blobby/BlobbyStateMachine.gd" type="Script" id=3]
@ -9,39 +9,6 @@
[sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 14.9127, 5.98593 )
[sub_resource type="Shader" id=190]
code = "shader_type canvas_item;
float random(vec2 uv) {
return fract(sin(dot(uv, vec2(12.9898, 78.233))) * 438.5453);
}
uniform float sensitivity : hint_range(0.0, 1.0) = 0.;
uniform float scale = 1.;
void fragment() {
// Get size of texture in pixels
float size_x = float(textureSize(TEXTURE, 0).x);
float size_y = float(textureSize(TEXTURE, 0).y);
//
vec4 pixelColor = texture(TEXTURE, UV);
// Create a new \"UV\" which remaps every UV value to a snapped pixel value
vec2 UVr = vec2(floor(UV.x*size_x)/size_x, floor(UV.y*size_y)/size_y);
// Determine whether pixel should be visible or not
float visible = step(sensitivity, random(UVr));
// Draw the pixel, or not depending on if it is visible or not
COLOR = vec4(pixelColor.r, pixelColor.g, pixelColor.b, min(visible, pixelColor.a));
}
void vertex () {
VERTEX = VERTEX * scale;
}"
[sub_resource type="ShaderMaterial" id=191]
shader = SubResource( 190 )
shader_param/sensitivity = 0.0
shader_param/scale = 1.0
[sub_resource type="StreamTexture" id=62]
load_path = "res://.import/blobby-spritesheet.png-205c8efc79bec685345a637ed2dcfc9b.stex"
@ -4573,6 +4540,7 @@ tracks/2/keys = {
}
[node name="Blobby" type="KinematicBody2D" groups=["player"]]
scale = Vector2( 0.879, 0.936 )
collision_mask = 248
collision/safe_margin = 0.001
script = ExtResource( 4 )
@ -4612,7 +4580,6 @@ transparent_bg = true
visible = false
[node name="BlobbySprite" type="Sprite" parent="."]
material = SubResource( 191 )
position = Vector2( 0, -16 )
scale = Vector2( -1, 1 )
texture = SubResource( 62 )
@ -4770,7 +4737,12 @@ one_shot = true
wait_time = 0.067
one_shot = true
[node name="InvincibilityTimer" type="Timer" parent="."]
wait_time = 1.618
one_shot = true
[connection signal="area_entered" from="BlobbySkin" to="." method="_on_BlobbySkin_area_entered"]
[connection signal="body_entered" from="BlobbySkin" to="." method="_on_BlobbySkin_body_entered"]
[connection signal="got_grounded" from="BlobbyStateMachine" to="." method="_on_Blobby_got_grounded"]
[connection signal="timeout" from="BlobbyStateMachine/JumpBufferTimer" to="." method="_on_JumpBufferTimer_timeout"]
[connection signal="timeout" from="InvincibilityTimer" to="." method="_on_InvincibilityTimer_timeout"]

View File

@ -0,0 +1,27 @@
shader_type canvas_item;
float random(vec2 uv) {
return fract(sin(dot(uv, vec2(12.9898, 78.233))) * 438.5453);
}
uniform float sensitivity : hint_range(0.0, 1.0) = 0.;
uniform float w_sens: hint_range(0., 5.) = 1.;
uniform float scale = 1.;
void fragment() {
// Get size of texture in pixels
float size_x = float(textureSize(TEXTURE, 0).x);
float size_y = float(textureSize(TEXTURE, 0).y);
//
vec4 pixelColor = texture(TEXTURE, UV);
// Create a new "UV" which remaps every UV value to a snapped pixel value
vec2 UVr = vec2(floor(UV.x*size_x)/size_x, floor(UV.y*size_y)/size_y);
// Determine whether pixel should be visible or not
float visible = step(sensitivity, random(UVr));
// Draw the pixel, or not depending on if it is visible or not
COLOR = vec4(pixelColor.r + sensitivity*w_sens, pixelColor.g + sensitivity*w_sens, pixelColor.b + sensitivity*w_sens, min(visible, pixelColor.a));
}
void vertex () {
VERTEX = VERTEX * scale;
}

View File

@ -0,0 +1,13 @@
shader_type canvas_item;
void fragment(){
vec4 pixelColor = texture(TEXTURE, UV);
if (pixelColor.a > 0.1)
{
vec3 shineColor = vec3(1.,1.,1.) * max(cos(TIME*8.),0.);
COLOR = pixelColor + vec4(shineColor, 1.);
}
else{
COLOR = pixelColor
}
}

View File

@ -20,6 +20,7 @@ var state_time := 0.0
# Adds the intial states
func _ready():
signalManager.connect("getback_timer_up", parent, "die")
signalManager.connect("power_up_collected", parent, "receive_power_up")
anim_player.play("RESET")
add_state("idle")
add_state("duck")

View File

@ -0,0 +1,9 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=2]
[ext_resource path="res://src/Actors/Blobby/BlobbyDeath.gdshader" type="Shader" id=1]
[resource]
shader = ExtResource( 1 )
shader_param/sensitivity = 0.0
shader_param/w_sens = 1.007
shader_param/scale = 1.0

View File

@ -0,0 +1,6 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=2]
[ext_resource path="res://src/Actors/Blobby/BlobbyInvincible.gdshader" type="Shader" id=1]
[resource]
shader = ExtResource( 1 )

View File

@ -44,12 +44,12 @@ func _ready():
_update_lighting_shader()
# TODO Trigger when needed
signalManager.connect("terminal_activated", self, "_on_SignalManager_terminal_activated")
signalManager.connect("player_died", self, "_death_cam")
func _on_SignalManager_terminal_activated():
get_node("LightAnimationPlayer").play("Pulsing")
func _physics_process(delta: float) -> void:
if(!levelState.is_dead):
if(anim_player.is_playing()):
position = blobby.position
prev_pos = position
@ -76,10 +76,6 @@ func _physics_process(delta: float) -> void:
_adapt_to_movement(player_vel)
position = blobby.position
prev_pos = position
#TODO Do this via a event or let it be to track blobbies movement better
else:
self.position = blobby.global_position
_death_cam()
_update_lighting_shader()
func _set_boundaries():

View File

@ -324,9 +324,9 @@ tracks/1/path = NodePath(".:limit_left")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 1 ),
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ -10000000 ]
@ -336,9 +336,9 @@ tracks/2/path = NodePath(".:limit_top")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 1 ),
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ -10000000 ]
@ -348,9 +348,9 @@ tracks/3/path = NodePath(".:limit_right")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/imported = false
tracks/3/enabled = false
tracks/3/enabled = true
tracks/3/keys = {
"times": PoolRealArray( 1 ),
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ 10000000 ]
@ -360,9 +360,9 @@ tracks/4/path = NodePath(".:limit_bottom")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/imported = false
tracks/4/enabled = false
tracks/4/enabled = true
tracks/4/keys = {
"times": PoolRealArray( 1 ),
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ 10000000 ]
@ -374,7 +374,7 @@ tracks/5/loop_wrap = true
tracks/5/imported = false
tracks/5/enabled = false
tracks/5/keys = {
"times": PoolRealArray( 1, 1.61 ),
"times": PoolRealArray( 0.06, 1.61 ),
"transitions": PoolRealArray( 1, 0.120742 ),
"update": 0,
"values": [ 0.0, 360.0 ]
@ -386,7 +386,7 @@ tracks/6/loop_wrap = true
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/keys = {
"times": PoolRealArray( 1.16 ),
"times": PoolRealArray( 1.1 ),
"transitions": PoolRealArray( 1 ),
"values": [ {
"args": [ ],
@ -828,12 +828,11 @@ z_index = 3
rotating = true
current = true
zoom = Vector2( 0.75, 0.75 )
limit_smoothed = true
drag_margin_h_enabled = true
drag_margin_v_enabled = true
drag_margin_left = 0.05
drag_margin_left = 0.1
drag_margin_top = 0.0
drag_margin_right = 0.05
drag_margin_right = 0.1
drag_margin_bottom = 0.25
editor_draw_drag_margin = true
script = ExtResource( 1 )
@ -863,6 +862,8 @@ motion_scale = Vector2( 0, 0 )
z_index = -1
texture = ExtResource( 4 )
[node name="Sprite2" type="Sprite" parent="ParallaxBackground/ParallaxLayer"]
[node name="ParallaxLayer2" type="ParallaxLayer" parent="ParallaxBackground"]
z_index = -1
motion_scale = Vector2( 0, 0 )
@ -938,10 +939,10 @@ texture = ExtResource( 8 )
[node name="AnimatedSprite" type="AnimatedSprite" parent="ParallaxBackground/ParallaxLayer5"]
visible = false
frames = SubResource( 7 )
frame = 5
frame = 7
playing = true
[node name="AnimatedSprite2" type="AnimatedSprite" parent="ParallaxBackground/ParallaxLayer5"]
frames = SubResource( 8 )
frame = 10
frame = 12
playing = true

View File

@ -3,6 +3,7 @@ extends Area2D
onready var anim_player: AnimationPlayer = $AnimationPlayer
onready var levelState := get_tree().root.get_child(1).get_node("%LevelState")
onready var signalManager := get_tree().root.get_child(1).get_node("%SignalManager")
onready var levelName := get_tree().get_current_scene().get_name()
export var next_scene: PackedScene
@ -11,24 +12,9 @@ export var next_scene: PackedScene
func _get_configuration_warning() -> String:
return "The next scene property can't be empty" if not next_scene else ""
func update_level_achievements() -> void:
var progress_dict : Dictionary = GlobalState.progress_dict
var levelProgress : Dictionary = {}
func level_completion() -> void:
signalManager.emit_signal("level_completed")
levelProgress["currency"] = levelState.currency
levelProgress["kills"] = levelState.kills
levelProgress["deaths"] = levelState.deaths
levelProgress["frees"] = levelState.frees
if !progress_dict.has(levelName):
progress_dict[levelName] = levelProgress
else:
progress_dict[levelName]["currency"] = progress_dict[levelName]["currency"] + levelState.currency
progress_dict[levelName]["kills"] = progress_dict[levelName]["kills"] + levelState.kills
progress_dict[levelName]["deaths"] = progress_dict[levelName]["deaths"] + levelState.deaths
progress_dict[levelName]["frees"] = progress_dict[levelName]["frees"] + levelState.frees
GlobalState.set_progress(progress_dict)
func teleport() -> void:
anim_player.play("fade_in")
@ -37,5 +23,5 @@ func teleport() -> void:
func _on_body_entered(_body: Node) -> void:
update_level_achievements()
level_completion()
teleport()

View File

@ -17,7 +17,8 @@ func _process(delta):
func selfActivate():
#TODO Is a event for blobby himself
blobby.get_node("BubbleShieldViewport/IridescenceBall").visible = true
#blobby.get_node("BubbleShieldViewport/IridescenceBall").visible = true
signalManager.emit_signal("power_up_collected", "shield")
#TODO dis importante
activatorArea.set_deferred("monitoring", false)

View File

@ -5,27 +5,28 @@ onready var blobby = get_node("%Blobby")
var last_distance: Vector2 = Vector2(100,100)
# TODO Incorporate other enteties and highlight mass differences
var time = 0
var time := 0.0
var radius = 15
export var v_radius = 15
export var draft_radius = 20
export var interact_power = 0.04
var rand = rand_range(1,1.2)
var rand = rand_range(1,1.3)
var displacement_coeff: Vector2 = Vector2(1.0,0)
var saved_displacement
var is_idle_swinging
var start_swing_time
var start_swing_time := 0.0
var begin_idle
func _ready():
# TODO This could probably fuck something up later? For other randomness based events
randomize()
func _physics_process(delta: float) -> void:
func _process(delta: float) -> void:
var distance: float = abs(global_position.x - blobby.global_position.x + 6)
var v_distance: float = abs(global_position.y - blobby.global_position.y + 11)
#Velocity relative to the grass, increasing distance is - velocity
var blobby_vel = (last_distance.x - distance)/delta
var blobby_v_vel = (last_distance.y - v_distance)/delta
var blobby_vert_vel = (last_distance.y - v_distance)/delta
var direction: Vector2 = Vector2(sign(global_position.x - blobby.global_position.x + 6),0)
# TODO This only gets more and more unreadable *facepalm*
var power = smoothstep(radius, 0, distance)
@ -39,15 +40,15 @@ func _physics_process(delta: float) -> void:
$Timer.stop()
# TODO v_distance could be a problem for upside down stuff
elif (distance < radius && distance > 1 && blobby_vel != 0 && v_distance < 14 && blobby_v_vel ==0):
elif (distance < radius && distance > 1 && abs(blobby_vel) > 0.1 && v_distance < 14 && abs(blobby_vert_vel) < 0.1):
displacement_coeff += direction * power/radius * 0.3 * blobby_vel * interact_power
displacement_coeff += direction * power * 2 * interact_power
saved_displacement = displacement_coeff.x
is_idle_swinging = false
$Timer.stop()
elif (v_distance < v_radius && distance < radius && blobby_v_vel != 0):
displacement_coeff += direction * v_power/v_radius * blobby_v_vel * interact_power
elif (v_distance < v_radius && distance < radius && abs(blobby_vert_vel) > 0.1):
displacement_coeff += direction * v_power/v_radius * blobby_vert_vel * interact_power
saved_displacement = displacement_coeff.x
is_idle_swinging = false
$Timer.stop()

View File

@ -1,22 +1,55 @@
[gd_scene load_steps=9 format=2]
[gd_scene load_steps=16 format=2]
[ext_resource path="res://assets/environment/decor/straight_straw.png" type="Texture" id=1]
[ext_resource path="res://src/Environment/ShaderGrass.gd" type="Script" id=2]
[ext_resource path="res://src/Environment/ShaderGrass.tres" type="Material" id=3]
[ext_resource path="res://assets/environment/decor/short_straw.png" type="Texture" id=4]
[ext_resource path="res://assets/environment/decor/bent_straw.png" type="Texture" id=5]
[ext_resource path="res://assets/environment/decor/bent_straw_2.png" type="Texture" id=6]
[ext_resource path="res://assets/environment/decor/bent_straw_leftt.png" type="Texture" id=7]
[ext_resource path="res://assets/environment/decor/bent_straw_left_2.png" type="Texture" id=8]
[ext_resource path="res://src/Environment/ShaderGrass.gdshader" type="Shader" id=9]
[sub_resource type="ShaderMaterial" id=1]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[sub_resource type="ShaderMaterial" id=2]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[sub_resource type="ShaderMaterial" id=3]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[sub_resource type="ShaderMaterial" id=4]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[sub_resource type="ShaderMaterial" id=5]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[sub_resource type="ShaderMaterial" id=6]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[sub_resource type="ShaderMaterial" id=7]
resource_local_to_scene = true
shader = ExtResource( 9 )
shader_param/displacement_coefficient_x = 0.0
[node name="ShaderGrass" type="Node2D"]
script = ExtResource( 2 )
v_radius = 20
draft_radius = 30
interact_power = 0.06
interact_power = 0.055
[node name="StraightStraw" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 1 )
position = Vector2( -2, 0 )
texture = ExtResource( 1 )
polygon = PoolVector2Array( 4.9375, 4.5625, 5, 1.6875, 8.125, 1.6875, 8.0625, 4.875, 8.0625, 8.4375, 8.125, 12.125, 4.8125, 12.0625, 4.8125, 8.5 )
@ -24,7 +57,7 @@ uv = PoolVector2Array( 4.9375, 4.5625, 5, 1.6875, 8.125, 1.6875, 8.0625, 4.875,
polygons = [ PoolIntArray( 1, 3, 0 ), PoolIntArray( 2, 3, 1 ), PoolIntArray( 0, 4, 3 ), PoolIntArray( 0, 7, 4 ), PoolIntArray( 6, 7, 5 ), PoolIntArray( 4, 5, 7 ) ]
[node name="ShortStraw" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 2 )
position = Vector2( -4, -1 )
texture = ExtResource( 4 )
polygon = PoolVector2Array( 5, 12.0625, 4.9375, 10.0625, 4.875, 8, 5.0625, 5.9375, 8.1875, 6, 8.0625, 8.0625, 8.0625, 10.1875, 8.0625, 12.125 )
@ -32,7 +65,7 @@ uv = PoolVector2Array( 5, 12.0625, 4.9375, 10.0625, 4.875, 8, 5.0625, 5.9375, 8.
polygons = [ PoolIntArray( 3, 5, 4 ), PoolIntArray( 2, 3, 5 ), PoolIntArray( 1, 2, 6 ), PoolIntArray( 5, 6, 2 ), PoolIntArray( 6, 0, 7 ), PoolIntArray( 6, 1, 0 ) ]
[node name="ShortStraw2" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 3 )
position = Vector2( 1, -2 )
texture = ExtResource( 4 )
polygon = PoolVector2Array( 5, 12.0625, 4.9375, 10.0625, 4.875, 8, 5.0625, 5.9375, 8.1875, 6, 8.0625, 8.0625, 8.0625, 10.1875, 8.0625, 12.125 )
@ -40,7 +73,7 @@ uv = PoolVector2Array( 5, 12.0625, 4.9375, 10.0625, 4.875, 8, 5.0625, 5.9375, 8.
polygons = [ PoolIntArray( 3, 5, 4 ), PoolIntArray( 2, 3, 5 ), PoolIntArray( 1, 2, 6 ), PoolIntArray( 5, 6, 2 ), PoolIntArray( 6, 0, 7 ), PoolIntArray( 6, 1, 0 ) ]
[node name="BentStrawRight" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 4 )
position = Vector2( 5, 0 )
texture = ExtResource( 5 )
polygon = PoolVector2Array( 1, 12, 0.9375, 9.0625, 2.75, 7.0625, 5, 5.75, 9.1875, 5.75, 9.125, 9.1875, 6, 10, 5.0625, 12.0625 )
@ -48,14 +81,14 @@ uv = PoolVector2Array( 1, 12, 0.9375, 9.0625, 2.75, 7.0625, 5, 5.75, 9.1875, 5.7
polygons = [ PoolIntArray( 1, 7, 0 ), PoolIntArray( 2, 7, 1 ), PoolIntArray( 6, 7, 2 ), PoolIntArray( 6, 3, 2 ), PoolIntArray( 3, 5, 6 ), PoolIntArray( 3, 4, 5 ) ]
[node name="BentStraw2Right" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 5 )
position = Vector2( 4, 0 )
texture = ExtResource( 6 )
polygon = PoolVector2Array( 0.875, 12, 0.875, 7.9375, 2.13287, 6.45765, 3, 5.4375, 4.625, 3.6875, 6.9375, 1.6875, 9.375, 4.25, 7, 6.25, 5.5625, 7.5, 4.75, 8.25, 4.6875, 11.875 )
uv = PoolVector2Array( 0.875, 12, 0.875, 7.9375, 3, 5.4375, 4.625, 3.6875, 6.9375, 1.6875, 9.375, 4.25, 7, 6.25, 5.5625, 7.5, 4.75, 8.25, 4.6875, 11.8125 )
[node name="BentStrawLeft" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 6 )
position = Vector2( -6, 0 )
texture = ExtResource( 7 )
polygon = PoolVector2Array( 5.0625, 11.9375, 3.9375, 10, 1, 8.9375, 0.875, 5.8125, 5.1875, 5.6875, 6.8125, 7.25, 8.9375, 8.6875, 8.875, 11.9375 )
@ -63,7 +96,7 @@ uv = PoolVector2Array( 5.0625, 11.9375, 3.9375, 10, 1, 8.9375, 0.875, 5.8125, 5.
polygons = [ PoolIntArray( 0, 6, 7 ), PoolIntArray( 1, 6, 0 ), PoolIntArray( 1, 5, 6 ), PoolIntArray( 1, 4, 5 ), PoolIntArray( 2, 1, 4 ), PoolIntArray( 3, 4, 2 ) ]
[node name="BentStraw2Left" type="Polygon2D" parent="."]
material = ExtResource( 3 )
material = SubResource( 7 )
position = Vector2( -4, 0 )
texture = ExtResource( 8 )
polygon = PoolVector2Array( 4.9375, 11.875, 5, 8.8125, 2.8125, 7, -0.375, 4.0625, 2.25, 1.9375, 4.75, 4.625, 8.0625, 7.9375, 8, 12.0625 )

File diff suppressed because one or more lines are too long

View File

@ -89,10 +89,10 @@ wait_time = 20.0
[node name="BlobbyCam" parent="." instance=ExtResource( 12 )]
[node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"]
frame = 8
frame = 6
[node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"]
frame = 13
frame = 11
[node name="Blobby" parent="." instance=ExtResource( 2 )]
unique_name_in_owner = true

View File

@ -96,7 +96,6 @@ margin_bottom = 0.456848
[node name="Blobby" parent="." instance=ExtResource( 4 )]
unique_name_in_owner = true
position = Vector2( 59, 112 )
scale = Vector2( 0.878906, 0.936025 )
[node name="AnimationTree" parent="Blobby/BlobbySprite" index="0"]
parameters/playback = SubResource( 4 )
@ -141,7 +140,7 @@ shape = SubResource( 3 )
position = Vector2( 0, 1.5 )
z_index = -1
frames = SubResource( 5 )
frame = 24
frame = 20
playing = true
[node name="Terminal" parent="." instance=ExtResource( 47 )]
@ -168,6 +167,7 @@ tile_data = PoolIntArray( 851970, 1, 0, 851971, 0, 0, 851973, 0, 0, 851975, 2, 0
[node name="Flyer" parent="." instance=ExtResource( 41 )]
position = Vector2( 496, 152 )
scale = Vector2( 0.879, 0.936 )
max_speed = 120
[node name="StateLabel" parent="Flyer" index="1"]
@ -180,6 +180,9 @@ parameters/playback = SubResource( 6 )
position = Vector2( 776, 320 )
movement_radius = 4
[node name="WhatAreFrog" parent="BoundFrog" index="0"]
scale = Vector2( 0.879, 0.936 )
[node name="FlyingPlatformClean" parent="." instance=ExtResource( 43 )]
position = Vector2( 496, 220 )
@ -202,5 +205,7 @@ visible = false
[editable path="UserInterface/HUD"]
[editable path="Blobby"]
[editable path="Flyer"]
[editable path="BoundFrog"]
[editable path="BoundFrog/RopeAnchor"]
[editable path="FlyingPlatformClean"]
[editable path="WhyButton"]

357
src/Levels/First Level.tscn Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -407,7 +407,7 @@ position = Vector2( 0, -2.52127 )
scale = Vector2( 0.149428, 0.151196 )
frames = SubResource( 4 )
animation = "rotate"
frame = 42
frame = 126
playing = true
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

View File

@ -0,0 +1,13 @@
[gd_scene load_steps=2 format=2]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 860.5, 11 )
[node name="PitArea" type="Node2D"]
[node name="Area2D" type="Area2D" parent="." groups=["pit"]]
collision_layer = 8
collision_mask = 3
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource( 1 )

View File

@ -1,11 +1,19 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://src/ObstacleObjects/DangerousBlockArea.tscn" type="PackedScene" id=1]
[ext_resource path="res://assets/obstacle object/speiku/speiku16.png" type="Texture" id=23]
[node name="Spikes" type="Node2D"]
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 11, 11 )
[node name="Spikes" type="StaticBody2D"]
collision_layer = 8
collision_mask = 0
[node name="DangerousBlockArea" parent="." instance=ExtResource( 1 )]
[node name="Sprite" type="Sprite" parent="."]
texture = ExtResource( 23 )
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )

View File

@ -9,6 +9,7 @@ onready var global_facing: Vector2 = local_facing.rotated(transform.get_rotation
onready var slide_friction = 1.5
var flyoff_triggered = false
var has_hit_player = false
var velocity = 1
var max_velocity = 200
var acceleration_force = 1200
@ -24,6 +25,9 @@ func _ready() -> void:
func _physics_process(delta: float) -> void:
if !flyoff_triggered:
for ray in trigger_rays:
# When player has been hit on the way
if (has_hit_player && body.position.x > 0):
break
if ray.is_colliding():
var collider = ray.get_collider()
if collider.is_in_group("player"):
@ -33,7 +37,9 @@ func _physics_process(delta: float) -> void:
if body.position.x > 0:
velocity=1
body.position.x += (max_velocity/3)*-1*delta
else:
elif body.position.x == 0:
has_hit_player = false
if flyoff_triggered:
velocity = PhysicsFunc.two_step_euler(
velocity, acceleration_force, mass, delta
)
@ -42,4 +48,6 @@ func _physics_process(delta: float) -> void:
if collision != null:
if !collision.collider.is_in_group("player"):
body.set("motion/sync_to_physics", true)
else:
has_hit_player = true
flyoff_triggered = false

View File

@ -45,6 +45,8 @@ margin_top = -59.0
margin_right = 352.0
margin_bottom = 11.0
size_flags_vertical = 1
text = "You saved up %s orbicles.
You died %s times, destroyed %s and freed %s beings."
align = 1
script = ExtResource( 8 )

View File

@ -10,7 +10,8 @@ onready var signalManager := $"../%SignalManager"
var paused := false setget set_paused
func _ready():
signalManager.connect("player_died", self, "_on_GlobalState_player_died")
#signalManager.connect("player_died", self, "_on_GlobalState_player_died")
pass
func _on_GlobalState_player_died() -> void:

View File

@ -11,10 +11,15 @@ var frees: = 0 setget set_frees
# TODO Rename probs
var is_dead: = false setget set_dead
func _ready() -> void:
signalManager.connect("level_completed", self, "_on_level_completed")
signalManager.connect("player_died", self, "player_dying")
func reset() -> void:
deaths = 0
kills = 0
currency = 0
frees = 0
func set_currency(value: int) -> void:
currency = value
@ -34,7 +39,11 @@ func set_frees(value: int) -> void:
func set_dead(value: bool) -> void:
is_dead = value
func _on_Level_tree_exiting() -> void:
func _on_level_completed():
update_global_state()
reset()
func update_global_state() -> void:
var progress_dict : Dictionary = GlobalState.progress_dict
var levelProgress : Dictionary = {}
@ -52,4 +61,12 @@ func _on_Level_tree_exiting() -> void:
progress_dict[levelName]["frees"] = progress_dict[levelName]["frees"] + frees
GlobalState.set_progress(progress_dict)
pass # Replace with function body.
func player_dying() -> void:
currency = 0
kills = 0
frees = 0
is_dead = true
deaths += 1
update_global_state()
deaths = 0

View File

@ -6,6 +6,8 @@ signal currency_updated()
signal kills_updated()
signal frees_updated()
signal player_died()
signal level_completed()
signal power_up_collected(kind)
func _on_Timer_timeout() -> void:
emit_signal("getback_timer_up")