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:
parent
349e8b332b
commit
4238855751
Binary file not shown.
|
Before Width: | Height: | Size: 350 B After Width: | Height: | Size: 327 B |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 527 B After Width: | Height: | Size: 539 B |
@ -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()
|
||||
|
||||
@ -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"]
|
||||
|
||||
27
src/Actors/Blobby/BlobbyDeath.gdshader
Normal file
27
src/Actors/Blobby/BlobbyDeath.gdshader
Normal 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;
|
||||
}
|
||||
13
src/Actors/Blobby/BlobbyInvincible.gdshader
Normal file
13
src/Actors/Blobby/BlobbyInvincible.gdshader
Normal 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
|
||||
}
|
||||
}
|
||||
@ -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")
|
||||
|
||||
9
src/Actors/Blobby/DeathShader.tres
Normal file
9
src/Actors/Blobby/DeathShader.tres
Normal 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
|
||||
6
src/Actors/Blobby/InvincibleShader.tres
Normal file
6
src/Actors/Blobby/InvincibleShader.tres
Normal 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 )
|
||||
@ -43,43 +43,39 @@ func _ready():
|
||||
# TODO Test Performance
|
||||
_update_lighting_shader()
|
||||
# TODO Trigger when needed
|
||||
signalManager.connect("terminal_activated", self, "_on_SignalManager_terminal_activated")
|
||||
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
|
||||
_update_lighting_shader()
|
||||
return
|
||||
var player_vel = (blobby.position - prev_pos)/delta
|
||||
# TODO Take average of velocity here
|
||||
if(abs(player_vel.x) >= blobby.max_velocity["walk"] * 0.97
|
||||
&& (sign(player_vel.x) == sign(target_offset.x) || target_offset.x == 0)):
|
||||
if(player_vel.x > 0):
|
||||
right_move_time += delta
|
||||
left_move_time = max(0, left_move_time - delta)
|
||||
slow_time = max(0, slow_time - delta)
|
||||
else:
|
||||
left_move_time += delta
|
||||
right_move_time = max(0, right_move_time - delta)
|
||||
slow_time = max(0, slow_time - delta)
|
||||
elif(abs(player_vel.x) <= blobby.max_velocity["walk"] * 0.9
|
||||
|| sign(player_vel.x) != sign(target_offset.x) || target_offset.x == 0):
|
||||
slow_time += delta
|
||||
left_move_time = max(0, left_move_time - delta)
|
||||
right_move_time = max(0, right_move_time - delta)
|
||||
|
||||
_adapt_to_movement(player_vel)
|
||||
if(anim_player.is_playing()):
|
||||
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()
|
||||
return
|
||||
var player_vel = (blobby.position - prev_pos)/delta
|
||||
# TODO Take average of velocity here
|
||||
if(abs(player_vel.x) >= blobby.max_velocity["walk"] * 0.97
|
||||
&& (sign(player_vel.x) == sign(target_offset.x) || target_offset.x == 0)):
|
||||
if(player_vel.x > 0):
|
||||
right_move_time += delta
|
||||
left_move_time = max(0, left_move_time - delta)
|
||||
slow_time = max(0, slow_time - delta)
|
||||
else:
|
||||
left_move_time += delta
|
||||
right_move_time = max(0, right_move_time - delta)
|
||||
slow_time = max(0, slow_time - delta)
|
||||
elif(abs(player_vel.x) <= blobby.max_velocity["walk"] * 0.9
|
||||
|| sign(player_vel.x) != sign(target_offset.x) || target_offset.x == 0):
|
||||
slow_time += delta
|
||||
left_move_time = max(0, left_move_time - delta)
|
||||
right_move_time = max(0, right_move_time - delta)
|
||||
|
||||
_adapt_to_movement(player_vel)
|
||||
position = blobby.position
|
||||
prev_pos = position
|
||||
_update_lighting_shader()
|
||||
|
||||
func _set_boundaries():
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 = {}
|
||||
|
||||
levelProgress["currency"] = levelState.currency
|
||||
levelProgress["kills"] = levelState.kills
|
||||
levelProgress["deaths"] = levelState.deaths
|
||||
levelProgress["frees"] = levelState.frees
|
||||
func level_completion() -> void:
|
||||
signalManager.emit_signal("level_completed")
|
||||
|
||||
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()
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
@ -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
|
||||
|
||||
@ -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
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
@ -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"]
|
||||
|
||||
13
src/ObstacleObjects/PitArea.tscn
Normal file
13
src/ObstacleObjects/PitArea.tscn
Normal 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 )
|
||||
@ -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 )
|
||||
|
||||
@ -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)
|
||||
flyoff_triggered = false
|
||||
else:
|
||||
has_hit_player = true
|
||||
flyoff_triggered = false
|
||||
|
||||
@ -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 )
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user