Death
All checks were successful
linting & formatting / build (push) Successful in 21s
itch.io publish action / build (linux64, x86_64) (push) Successful in 2m6s
itch.io publish action / build (osx, app) (push) Successful in 2m10s
itch.io publish action / build (win64, exe) (push) Successful in 2m31s

This commit is contained in:
Rob Kelly 2025-04-19 16:18:12 -06:00
parent 127fb9be38
commit 5dba027b4c
13 changed files with 401 additions and 80 deletions

View File

@ -97,8 +97,8 @@ process_material = SubResource("ParticleProcessMaterial_vwgy4")
draw_pass_1 = SubResource("QuadMesh_fgb4j") draw_pass_1 = SubResource("QuadMesh_fgb4j")
[node name="Decal" type="Decal" parent="Muzzle"] [node name="Decal" type="Decal" parent="Muzzle"]
transform = Transform3D(1, 0, 0, 0, -4.47035e-08, -1, 0, 1, -4.47035e-08, 0, 0, -1) transform = Transform3D(1, 0, 0, 0, -4.47035e-08, -1, 0, 1, -4.47035e-08, 0, 0, -1.5)
size = Vector3(0.2, 2, 0.2) size = Vector3(0.2, 3, 0.2)
texture_albedo = ExtResource("2_qcl8j") texture_albedo = ExtResource("2_qcl8j")
texture_emission = ExtResource("2_qcl8j") texture_emission = ExtResource("2_qcl8j")
cull_mask = 1048573 cull_mask = 1048573

View File

@ -1,6 +1,9 @@
class_name Game extends Node class_name Game extends Node
## Interface to the game as an application. ## Interface to the game as an application.
@export_category("Game Scenes")
@export var world_scene: PackedScene
## Handy typed singleton access. ## Handy typed singleton access.
static var manager: GameManagerType: static var manager: GameManagerType:
get(): get():

View File

@ -1,6 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://qpq2cm1hgeha"] [gd_scene load_steps=3 format=3 uid="uid://qpq2cm1hgeha"]
[ext_resource type="Script" uid="uid://dxl25lkyped4" path="res://src/game/game.gd" id="1_qnjlk"] [ext_resource type="Script" uid="uid://dxl25lkyped4" path="res://src/game/game.gd" id="1_qnjlk"]
[ext_resource type="PackedScene" uid="uid://884jqafhtrv0" path="res://src/world/world.tscn" id="2_s6lek"]
[node name="Game" type="Node"] [node name="Game" type="Node"]
script = ExtResource("1_qnjlk") script = ExtResource("1_qnjlk")
world_scene = ExtResource("2_s6lek")

View File

@ -18,6 +18,9 @@ signal alert_cleared
## Emitted after the player's grunk vault reaches a new milestone. ## Emitted after the player's grunk vault reaches a new milestone.
signal milestone_reached(milestone: Milestone) signal milestone_reached(milestone: Milestone)
## Emitted as soon as the player dies.
signal player_dead
const MAX_ALERT := 6 const MAX_ALERT := 6
## Maximum amount of grunk the player can carry in their tank. ## Maximum amount of grunk the player can carry in their tank.
@ -118,3 +121,9 @@ func next_milestone_amount() -> int:
if grunk_vault < milestone_amt: if grunk_vault < milestone_amt:
return milestone_amt return milestone_amt
return -1 return -1
## Called by Player on death.
func on_player_death() -> void:
player_dead.emit()
# TODO reload from save?

View File

@ -3,6 +3,7 @@ class_name Player extends CharacterBody3D
#region Exported Properties #region Exported Properties
@export_category("Status") @export_category("Status")
@export var dead := false
@export var movement_enabled := true @export var movement_enabled := true
@export var activity_enabled := true @export var activity_enabled := true
@export var look_enabled := true @export var look_enabled := true
@ -142,30 +143,34 @@ func toggle_crouch() -> void:
## Get fuckign grabbed, idiot! ## Get fuckign grabbed, idiot!
## Begin grab death sequence animation. ## Begin grab death sequence animation.
func get_grabbed(look_target: Vector3) -> void: func get_grabbed() -> void:
if dead: # No double-grabsies
return
movement_enabled = false movement_enabled = false
activity_enabled = false activity_enabled = false
look_enabled = false look_enabled = false
dead = true
uncrouch() uncrouch()
grab_animation.play("get_grabbed") grab_animation.play("get_grabbed")
camera_pivot.reset_pitch(0.4) camera_pivot.reset_pitch(0.4)
func _signal_death() -> void:
# Called from the death animation
Game.manager.on_player_death()
#endregion #endregion
#region _physics_process #region _physics_process
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
# REMOVEME #REMOVEME
if Input.is_action_just_pressed("ui_page_down"): if Input.is_action_just_pressed("ui_page_down"):
get_grabbed(Vector3.FORWARD) get_grabbed()
if Input.is_action_just_pressed("ui_page_up"):
movement_enabled = true
activity_enabled = true
look_enabled = true
grab_animation.play("RESET")
# Will be null if no valid interactor is selected. # Will be null if no valid interactor is selected.
var interactive: Interactive = interact_ray.get_collider() as Interactive var interactive: Interactive = interact_ray.get_collider() as Interactive

View File

@ -436,7 +436,7 @@ length = 0.001
tracks/0/type = "bezier" tracks/0/type = "bezier"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:x") tracks/0/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:y")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@ -447,7 +447,7 @@ tracks/0/keys = {
tracks/1/type = "bezier" tracks/1/type = "bezier"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:y") tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@ -458,7 +458,7 @@ tracks/1/keys = {
tracks/2/type = "bezier" tracks/2/type = "bezier"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z") tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@ -469,7 +469,7 @@ tracks/2/keys = {
tracks/3/type = "bezier" tracks/3/type = "bezier"
tracks/3/imported = false tracks/3/imported = false
tracks/3/enabled = true tracks/3/enabled = true
tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x") tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y")
tracks/3/interp = 1 tracks/3/interp = 1
tracks/3/loop_wrap = true tracks/3/loop_wrap = true
tracks/3/keys = { tracks/3/keys = {
@ -480,7 +480,7 @@ tracks/3/keys = {
tracks/4/type = "bezier" tracks/4/type = "bezier"
tracks/4/imported = false tracks/4/imported = false
tracks/4/enabled = true tracks/4/enabled = true
tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y") tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z")
tracks/4/interp = 1 tracks/4/interp = 1
tracks/4/loop_wrap = true tracks/4/loop_wrap = true
tracks/4/keys = { tracks/4/keys = {
@ -491,7 +491,7 @@ tracks/4/keys = {
tracks/5/type = "bezier" tracks/5/type = "bezier"
tracks/5/imported = false tracks/5/imported = false
tracks/5/enabled = true tracks/5/enabled = true
tracks/5/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z") tracks/5/path = NodePath(".:camera_rumble")
tracks/5/interp = 1 tracks/5/interp = 1
tracks/5/loop_wrap = true tracks/5/loop_wrap = true
tracks/5/keys = { tracks/5/keys = {
@ -499,17 +499,6 @@ tracks/5/keys = {
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/6/type = "bezier"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath(".:camera_rumble")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
[sub_resource type="Animation" id="Animation_p6grl"] [sub_resource type="Animation" id="Animation_p6grl"]
resource_name = "get_grabbed" resource_name = "get_grabbed"
@ -517,80 +506,83 @@ length = 6.0
tracks/0/type = "bezier" tracks/0/type = "bezier"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:x") tracks/0/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:y")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 0.5)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:y")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0), "handle_modes": PackedInt32Array(0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.2, 0.00167316, -1.385, -0.0999666, 0.665918, 0.0333333, 0.566197, -1.385, -0.0416667, 0.6662, 0.0083333, 0.113592, -1.385, -0.0876723, -0.0501441, 0.25, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.2, 0.00167316, -1.385, -0.0999666, 0.665918, 0.0333333, 0.566197, -1.385, -0.0416667, 0.6662, 0.0083333, 0.113592, -1.385, -0.0876723, -0.0501441, 0.25, 0),
"times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8) "times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8)
} }
tracks/2/type = "bezier" tracks/1/type = "bezier"
tracks/2/imported = false tracks/1/imported = false
tracks/2/enabled = true tracks/1/enabled = true
tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z") tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z")
tracks/2/interp = 1 tracks/1/interp = 1
tracks/2/loop_wrap = true tracks/1/loop_wrap = true
tracks/2/keys = { tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), "handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.333333, -0.39514, -0.254137, -0.0666667, -0.000457972, 0.25, 0, -0.254137, -0.0666667, -0.000457972, 0.0601447, 0.231214, 0.304548, -0.563731, -0.0123209, 0.25, 0, 0.304548, -0.25, 0, 0.06, 0.231, 0.885, -0.563731, -0.0123209, 0.25, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.333333, -0.39514, -0.254137, -0.0666667, -0.000457972, 0.25, 0, -0.254137, -0.0666667, -0.000457972, 0.0601447, 0.231214, 0.304548, -0.563731, -0.0123209, 0.25, 0, 0.304548, -0.25, 0, 0.06, 0.231, 0.885, -0.563731, -0.0123209, 0.25, 0),
"times": PackedFloat32Array(0, 0.366667, 2.96667, 3.56667, 5.26667, 5.86667) "times": PackedFloat32Array(0, 0.366667, 2.96667, 3.56667, 5.26667, 5.86667)
} }
tracks/3/type = "bezier" tracks/2/type = "bezier"
tracks/3/imported = false tracks/2/imported = false
tracks/3/enabled = true tracks/2/enabled = true
tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x") tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x")
tracks/3/interp = 1 tracks/2/interp = 1
tracks/3/loop_wrap = true tracks/2/loop_wrap = true
tracks/3/keys = { tracks/2/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0), "handle_modes": PackedInt32Array(0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.05, 0, 0.133333, 2.74114, 0, -0.1, 0.428854, 0.0666667, 0.168909, 0, -0.0666667, 0.178293, 0.0083333, 0.0844504, -1.20654e-08, -0.0876723, -0.0331565, 0.25, 0), "points": PackedFloat32Array(0, -0.05, 0, 0.133333, 2.74114, 0, -0.1, 0.428854, 0.0666667, 0.168909, 0, -0.0666667, 0.178293, 0.0083333, 0.0844504, -1.20654e-08, -0.0876723, -0.0331565, 0.25, 0),
"times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8) "times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8)
} }
tracks/4/type = "bezier" tracks/3/type = "bezier"
tracks/4/imported = false tracks/3/imported = false
tracks/4/enabled = true tracks/3/enabled = true
tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y") tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y")
tracks/4/interp = 1 tracks/3/interp = 1
tracks/4/loop_wrap = true tracks/3/loop_wrap = true
tracks/4/keys = { tracks/3/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), "handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.333333, -0.0229232, -1.0426, -0.933333, -0.279974, 0.25, 0, -1.043, -0.25, 0, 0.0333333, 0.158983, -0.878928, -0.25, 0, 0.25, 0, -0.878928, -0.25, 0, 0.033, 0.159, -0.758089, -0.25, 0, 0.25, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.333333, -0.0229232, -1.0426, -0.933333, -0.279974, 0.25, 0, -1.043, -0.25, 0, 0.0333333, 0.158983, -0.878928, -0.25, 0, 0.25, 0, -0.878928, -0.25, 0, 0.033, 0.159, -0.758089, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 0.8, 2.96667, 3.56667, 5.26667, 5.86667) "times": PackedFloat32Array(0, 0.8, 2.96667, 3.56667, 5.26667, 5.86667)
} }
tracks/5/type = "bezier" tracks/4/type = "bezier"
tracks/5/imported = false tracks/4/imported = false
tracks/5/enabled = true tracks/4/enabled = true
tracks/5/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z") tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z")
tracks/5/interp = 1 tracks/4/interp = 1
tracks/5/loop_wrap = true tracks/4/loop_wrap = true
tracks/5/keys = { tracks/4/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0, 0), "handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1.5708, -0.0876722, 0.463211, 0.0344108, -0.0689299, 1.5708, -0.0322559, -0.00752902, 0.25, 0, 1.571, -0.25, 0, 0, 0.04, 1.68, -0.25, 0, 0.25, 0, 1.68, -0.25, 0, 0, 0.04, 1.71, -0.25, 0, 0.25, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1.5708, -0.0876722, 0.463211, 0.0344108, -0.0689299, 1.5708, -0.0322559, -0.00752902, 0.25, 0, 1.571, -0.25, 0, 0, 0.04, 1.68, -0.25, 0, 0.25, 0, 1.68, -0.25, 0, 0, 0.04, 1.71, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 0.566667, 0.733333, 2.96667, 3.66667, 5.26667, 5.96667) "times": PackedFloat32Array(0, 0.566667, 0.733333, 2.96667, 3.66667, 5.26667, 5.96667)
} }
tracks/6/type = "bezier" tracks/5/type = "bezier"
tracks/6/imported = false tracks/5/imported = false
tracks/6/enabled = true tracks/5/enabled = true
tracks/6/path = NodePath(".:camera_rumble") tracks/5/path = NodePath(".:camera_rumble")
tracks/6/interp = 1 tracks/5/interp = 1
tracks/6/loop_wrap = true tracks/5/loop_wrap = true
tracks/6/keys = { tracks/5/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0, 0), "handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0, 0.161517, 0, -0.767, 0, 0.25, 0, 0, -0.25, 0, 0, 0.02, 0, -0.5, 0, 0.25, 0, 0, -0.25, 0, 0, 0.02, 0, -0.5, 0, 0.25, 0), "points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0, 0.161517, 0, -0.767, 0, 0.25, 0, 0, -0.25, 0, 0, 0.02, 0, -0.5, 0, 0.25, 0, 0, -0.25, 0, 0, 0.02, 0, -0.5, 0, 0.25, 0),
"times": PackedFloat32Array(0, 0.3, 1, 2.96667, 3.66667, 5.26667, 5.96667) "times": PackedFloat32Array(0, 0.3, 1, 2.96667, 3.66667, 5.26667, 5.96667)
} }
tracks/6/type = "method"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath(".")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(2.96667),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"_signal_death"
}]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_e7e1q"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_e7e1q"]
_data = { _data = {

View File

@ -0,0 +1,66 @@
/* Gunk shader adapted to a canvas item */
shader_type canvas_item;
group_uniforms gunk_material;
uniform vec3 color_1: source_color = vec3(0.0, 0.03, 0.1);
uniform vec3 color_2: source_color = vec3(0.0, 0.1, 0.3);
uniform vec3 emission_color: source_color = vec3(0.25, 0.88, 1.0);
uniform float pixellation = 128.0;
uniform float time_pixellation = 30.0;
uniform float emission_strength = 0.05;
// Used ONLY by the gunk, does not affect the gunk mask.
uniform vec2 uv_scale = vec2(1.0);
uniform float time_scale = 1.0;
uniform sampler3D gunk_noise;
uniform sampler3D gunk_normal_map;
group_uniforms mask;
uniform float mask_progress : hint_range(0.0, 1.0, 0.01) = 0.0;
uniform sampler2D mask_noise : hint_default_white;
float hardstep(float value) {
float x = clamp(value, 0.0, 1.0);
return 0.5 * tanh( (20.0 * x - 10.0) * inversesqrt(x - x * x) ) + 0.5;
}
void fragment() {
vec2 aspect_ratio = vec2(SCREEN_PIXEL_SIZE.y / SCREEN_PIXEL_SIZE.x, 1.0);
vec2 scaled_pixellation = pixellation * aspect_ratio;
vec2 local_uv = floor(UV * uv_scale * scaled_pixellation) / scaled_pixellation;
float local_time = floor(TIME * time_scale * time_pixellation) / time_pixellation;
// swirl
vec3 uvt = vec3(local_uv.x, local_uv.y, local_time);
uvt.x += sin(uvt.y * 1.54 * PI + uvt.z) * cos(uvt.y * 1.31 * PI + uvt.z) * 0.2;
uvt.y += cos(uvt.x * 1.74 * PI + uvt.z) * -sin(uvt.y * 1.64 * PI + uvt.z) * 0.2;
float value = texture(gunk_noise, uvt).r;
vec3 color = mix(color_1, color_2, value);
vec3 emission = (1.0 - value) * emission_color * emission_strength;
color += emission;
NORMAL_MAP = texture(gunk_normal_map, uvt).xyz;
// Radial mask effect
float radius = 1.3 * length(local_uv - 0.5);
float offset = radius + texture(mask_noise, local_uv).r - 0.5;
float mask = 1.0 - clamp(offset - 1.0 + 2.0 * mask_progress, 0.0, 1.0);
//COLOR = vec4(mask, mask, mask, 1.0);
// soften edges
NORMAL_MAP *= smoothstep(1.0, 0.0, mask);
// Harderish edge
float alpha = hardstep(1.0 - mask);
COLOR = vec4(color, alpha);
// COLOR = vec4(mask, mask, mask, 1.0);
}

View File

@ -0,0 +1 @@
uid://dnytoirugot2e

View File

@ -242,10 +242,10 @@ anchor_left = 0.5
anchor_top = 0.5 anchor_top = 0.5
anchor_right = 0.5 anchor_right = 0.5
anchor_bottom = 0.5 anchor_bottom = 0.5
offset_left = -398.862 offset_left = -406.72
offset_top = -301.076 offset_top = -295.754
offset_right = -398.862 offset_right = -406.72
offset_bottom = -301.076 offset_bottom = -295.754
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
script = ExtResource("4_ud8na") script = ExtResource("4_ud8na")

View File

@ -0,0 +1,221 @@
[gd_scene load_steps=13 format=3 uid="uid://c0uitm5cg88h1"]
[ext_resource type="Shader" uid="uid://dnytoirugot2e" path="res://src/shaders/canvas_grunk.gdshader" id="1_28vyc"]
[ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="2_qsvii"]
[ext_resource type="Theme" uid="uid://b07fevr214mmr" path="res://src/ui/hud/hud_theme.tres" id="3_a6m17"]
[ext_resource type="Script" uid="uid://cjs2fen6jo0g0" path="res://src/ui/rumbler.gd" id="4_sv5d8"]
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_et0xc"]
width = 256
height = 256
seamless = true
seamless_blend_skirt = 0.5
noise = ExtResource("2_qsvii")
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_a6m17"]
width = 256
height = 256
seamless = true
seamless_blend_skirt = 0.5
noise = ExtResource("2_qsvii")
[sub_resource type="FastNoiseLite" id="FastNoiseLite_qsvii"]
frequency = 0.0006
fractal_type = 2
fractal_octaves = 4
fractal_gain = 0.667
domain_warp_type = 2
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_et0xc"]
width = 1024
height = 1024
noise = SubResource("FastNoiseLite_qsvii")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_qsvii"]
shader = ExtResource("1_28vyc")
shader_parameter/color_1 = Color(0, 0.03, 0.1, 1)
shader_parameter/color_2 = Color(0, 0.1, 0.3, 1)
shader_parameter/emission_color = Color(0.25, 0.88, 1, 1)
shader_parameter/pixellation = 50.0
shader_parameter/time_pixellation = 30.0
shader_parameter/emission_strength = 0.0
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/time_scale = 0.2
shader_parameter/gunk_noise = SubResource("NoiseTexture3D_et0xc")
shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_a6m17")
shader_parameter/mask_progress = 0.0
shader_parameter/mask_noise = SubResource("NoiseTexture2D_et0xc")
[sub_resource type="Animation" id="Animation_qsvii"]
resource_name = "transition_in"
length = 14.0
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Grunk:material:shader_parameter/mask_progress")
tracks/0/interp = 2
tracks/0/loop_wrap = false
tracks/0/keys = {
"times": PackedFloat32Array(0, 8),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Grunk/Rumbler:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 11.4667),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Blackout:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 13.9667),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, true]
}
tracks/3/type = "method"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(14),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"queue_free"
}]
}
[sub_resource type="Animation" id="Animation_et0xc"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Grunk:material:shader_parameter/mask_progress")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Grunk/Rumbler:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Blackout:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_a6m17"]
_data = {
&"RESET": SubResource("Animation_et0xc"),
&"transition_in": SubResource("Animation_qsvii")
}
[node name="KillScreen" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Grunk" type="ColorRect" parent="."]
clip_children = 2
material = SubResource("ShaderMaterial_qsvii")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="Rumbler" type="Control" parent="Grunk"]
visible = false
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 3.04544
offset_top = -0.292352
offset_right = 3.04541
offset_bottom = -0.292358
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
script = ExtResource("4_sv5d8")
intensity = 6.0
metadata/_custom_type_script = "uid://cjs2fen6jo0g0"
[node name="DeathMessage" type="Label" parent="Grunk/Rumbler"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -2519.0
offset_top = -930.0
offset_right = 2519.0
offset_bottom = 734.0
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.3, 1)
pivot_offset = Vector2(2519, 930)
theme = ExtResource("3_a6m17")
theme_type_variation = &"AlertLabel"
theme_override_font_sizes/font_size = 1300
text = "GRUNK"
horizontal_alignment = 1
vertical_alignment = 1
[node name="Blackout" type="ColorRect" parent="."]
visible = false
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(0, 0, 0, 1)
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_a6m17")
}
autoplay = "transition_in"

View File

@ -16,5 +16,7 @@ func tick(_actor: Node, blackboard: Blackboard) -> int:
# TODO # TODO
print_debug("GET FUCKIGN GRABBED IDIOT!! ", target) print_debug("GET FUCKIGN GRABBED IDIOT!! ", target)
if target is Player:
(target as Player).get_grabbed()
return SUCCESS return SUCCESS

View File

@ -10,6 +10,10 @@ class_name World extends Node
@export var pause_scene: PackedScene @export var pause_scene: PackedScene
@export var kill_screen_scene: PackedScene
var current_level: PackedScene
@onready var level_root: Node3D = %LevelRoot @onready var level_root: Node3D = %LevelRoot
@onready var ui_root: Control = %UIRoot @onready var ui_root: Control = %UIRoot
@ -18,6 +22,7 @@ static var instance: World
func _ready() -> void: func _ready() -> void:
World.instance = self World.instance = self
Game.manager.player_dead.connect(on_player_death)
load_level(initial_level) load_level(initial_level)
@ -40,4 +45,17 @@ func unpause() -> void:
func load_level(level: PackedScene) -> void: func load_level(level: PackedScene) -> void:
for c: Node in level_root.get_children(): for c: Node in level_root.get_children():
c.queue_free() c.queue_free()
current_level = level
level_root.add_child(level.instantiate()) level_root.add_child(level.instantiate())
func on_player_death() -> void:
var kill_screen: Control = kill_screen_scene.instantiate()
kill_screen.tree_exiting.connect(on_game_over)
ui_root.add_child(kill_screen)
func on_game_over() -> void:
# TODO: reload from last checkpoint
# in the mean time, just reload the level
load_level(current_level)

View File

@ -1,10 +1,11 @@
[gd_scene load_steps=7 format=3 uid="uid://884jqafhtrv0"] [gd_scene load_steps=8 format=3 uid="uid://884jqafhtrv0"]
[ext_resource type="Script" uid="uid://cgqmhtemibxc5" path="res://src/world/world.gd" id="1_1k4gi"] [ext_resource type="Script" uid="uid://cgqmhtemibxc5" path="res://src/world/world.gd" id="1_1k4gi"]
[ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="2_6fy3g"] [ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="2_6fy3g"]
[ext_resource type="PackedScene" uid="uid://ehf5sg3ahvbf" path="res://src/world/grunk_beast/grunk_beast.tscn" id="2_43c6p"] [ext_resource type="PackedScene" uid="uid://ehf5sg3ahvbf" path="res://src/world/grunk_beast/grunk_beast.tscn" id="2_43c6p"]
[ext_resource type="Script" uid="uid://bsn026pxqwkbc" path="res://src/world/spook_manager/spook_manager.gd" id="2_bsf3i"] [ext_resource type="Script" uid="uid://bsn026pxqwkbc" path="res://src/world/spook_manager/spook_manager.gd" id="2_bsf3i"]
[ext_resource type="PackedScene" uid="uid://bov4ok76woyc" path="res://levels/ghost_ship/ghost_ship.tscn" id="2_jte2u"] [ext_resource type="PackedScene" uid="uid://bov4ok76woyc" path="res://levels/ghost_ship/ghost_ship.tscn" id="2_jte2u"]
[ext_resource type="PackedScene" uid="uid://c0uitm5cg88h1" path="res://src/ui/menus/kill_screen/kill_screen.tscn" id="6_l0av5"]
[sub_resource type="Resource" id="Resource_43c6p"] [sub_resource type="Resource" id="Resource_43c6p"]
script = ExtResource("2_bsf3i") script = ExtResource("2_bsf3i")
@ -16,6 +17,7 @@ script = ExtResource("1_1k4gi")
spook_manager = SubResource("Resource_43c6p") spook_manager = SubResource("Resource_43c6p")
initial_level = ExtResource("2_jte2u") initial_level = ExtResource("2_jte2u")
pause_scene = ExtResource("2_6fy3g") pause_scene = ExtResource("2_6fy3g")
kill_screen_scene = ExtResource("6_l0av5")
[node name="LevelRoot" type="Node3D" parent="."] [node name="LevelRoot" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true