diff --git a/src/equipment/point_spray/point_spray.tscn b/src/equipment/point_spray/point_spray.tscn index fa1575c..4f39504 100644 --- a/src/equipment/point_spray/point_spray.tscn +++ b/src/equipment/point_spray/point_spray.tscn @@ -97,8 +97,8 @@ process_material = SubResource("ParticleProcessMaterial_vwgy4") draw_pass_1 = SubResource("QuadMesh_fgb4j") [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) -size = Vector3(0.2, 2, 0.2) +transform = Transform3D(1, 0, 0, 0, -4.47035e-08, -1, 0, 1, -4.47035e-08, 0, 0, -1.5) +size = Vector3(0.2, 3, 0.2) texture_albedo = ExtResource("2_qcl8j") texture_emission = ExtResource("2_qcl8j") cull_mask = 1048573 diff --git a/src/game/game.gd b/src/game/game.gd index 4cf0637..a876c77 100644 --- a/src/game/game.gd +++ b/src/game/game.gd @@ -1,6 +1,9 @@ class_name Game extends Node ## Interface to the game as an application. +@export_category("Game Scenes") +@export var world_scene: PackedScene + ## Handy typed singleton access. static var manager: GameManagerType: get(): diff --git a/src/game/game.tscn b/src/game/game.tscn index a36050e..1d32396 100644 --- a/src/game/game.tscn +++ b/src/game/game.tscn @@ -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="PackedScene" uid="uid://884jqafhtrv0" path="res://src/world/world.tscn" id="2_s6lek"] [node name="Game" type="Node"] script = ExtResource("1_qnjlk") +world_scene = ExtResource("2_s6lek") diff --git a/src/game/game_manager.gd b/src/game/game_manager.gd index ffc186e..98f341e 100644 --- a/src/game/game_manager.gd +++ b/src/game/game_manager.gd @@ -18,6 +18,9 @@ signal alert_cleared ## Emitted after the player's grunk vault reaches a new milestone. signal milestone_reached(milestone: Milestone) +## Emitted as soon as the player dies. +signal player_dead + const MAX_ALERT := 6 ## 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: return milestone_amt return -1 + + +## Called by Player on death. +func on_player_death() -> void: + player_dead.emit() + # TODO reload from save? diff --git a/src/player/player.gd b/src/player/player.gd index 5afa53e..db7f4cc 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -3,6 +3,7 @@ class_name Player extends CharacterBody3D #region Exported Properties @export_category("Status") +@export var dead := false @export var movement_enabled := true @export var activity_enabled := true @export var look_enabled := true @@ -142,30 +143,34 @@ func toggle_crouch() -> void: ## Get fuckign grabbed, idiot! ## 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 activity_enabled = false look_enabled = false + dead = true uncrouch() grab_animation.play("get_grabbed") camera_pivot.reset_pitch(0.4) +func _signal_death() -> void: + # Called from the death animation + Game.manager.on_player_death() + + #endregion #region _physics_process func _physics_process(delta: float) -> void: - # REMOVEME + #REMOVEME if Input.is_action_just_pressed("ui_page_down"): - get_grabbed(Vector3.FORWARD) - if Input.is_action_just_pressed("ui_page_up"): - movement_enabled = true - activity_enabled = true - look_enabled = true - grab_animation.play("RESET") + get_grabbed() # Will be null if no valid interactor is selected. var interactive: Interactive = interact_ray.get_collider() as Interactive diff --git a/src/player/player.tscn b/src/player/player.tscn index bdc3dd4..225f258 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -436,7 +436,7 @@ length = 0.001 tracks/0/type = "bezier" tracks/0/imported = false 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/loop_wrap = true tracks/0/keys = { @@ -447,7 +447,7 @@ tracks/0/keys = { tracks/1/type = "bezier" tracks/1/imported = false 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/loop_wrap = true tracks/1/keys = { @@ -458,7 +458,7 @@ tracks/1/keys = { tracks/2/type = "bezier" tracks/2/imported = false 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/loop_wrap = true tracks/2/keys = { @@ -469,7 +469,7 @@ tracks/2/keys = { tracks/3/type = "bezier" tracks/3/imported = false 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/loop_wrap = true tracks/3/keys = { @@ -480,7 +480,7 @@ tracks/3/keys = { tracks/4/type = "bezier" tracks/4/imported = false 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/loop_wrap = true tracks/4/keys = { @@ -491,7 +491,7 @@ tracks/4/keys = { tracks/5/type = "bezier" tracks/5/imported = false 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/loop_wrap = true tracks/5/keys = { @@ -499,17 +499,6 @@ tracks/5/keys = { "points": PackedFloat32Array(0, -0.25, 0, 0.25, 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"] resource_name = "get_grabbed" @@ -517,80 +506,83 @@ length = 6.0 tracks/0/type = "bezier" tracks/0/imported = false 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/loop_wrap = true 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), "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) } -tracks/2/type = "bezier" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:position:z") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { "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), "times": PackedFloat32Array(0, 0.366667, 2.96667, 3.56667, 5.26667, 5.86667) } -tracks/3/type = "bezier" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:x") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { "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), "times": PackedFloat32Array(0, 0.333333, 0.566667, 0.8) } -tracks/4/type = "bezier" -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y") -tracks/4/interp = 1 -tracks/4/loop_wrap = true -tracks/4/keys = { +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:y") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { "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), "times": PackedFloat32Array(0, 0.8, 2.96667, 3.56667, 5.26667, 5.86667) } -tracks/5/type = "bezier" -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/keys = { +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("CameraPosition/CameraPivot/TransformedPosition:rotation:z") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { "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), "times": PackedFloat32Array(0, 0.566667, 0.733333, 2.96667, 3.66667, 5.26667, 5.96667) } -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 = { +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath(".:camera_rumble") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { "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), "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"] _data = { diff --git a/src/shaders/canvas_grunk.gdshader b/src/shaders/canvas_grunk.gdshader new file mode 100644 index 0000000..b7a8593 --- /dev/null +++ b/src/shaders/canvas_grunk.gdshader @@ -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); +} diff --git a/src/shaders/canvas_grunk.gdshader.uid b/src/shaders/canvas_grunk.gdshader.uid new file mode 100644 index 0000000..32563de --- /dev/null +++ b/src/shaders/canvas_grunk.gdshader.uid @@ -0,0 +1 @@ +uid://dnytoirugot2e diff --git a/src/ui/hud/player_hud.tscn b/src/ui/hud/player_hud.tscn index bae9d7b..08d2314 100644 --- a/src/ui/hud/player_hud.tscn +++ b/src/ui/hud/player_hud.tscn @@ -242,10 +242,10 @@ anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 -offset_left = -398.862 -offset_top = -301.076 -offset_right = -398.862 -offset_bottom = -301.076 +offset_left = -406.72 +offset_top = -295.754 +offset_right = -406.72 +offset_bottom = -295.754 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("4_ud8na") diff --git a/src/ui/menus/kill_screen/kill_screen.tscn b/src/ui/menus/kill_screen/kill_screen.tscn new file mode 100644 index 0000000..4bc88b5 --- /dev/null +++ b/src/ui/menus/kill_screen/kill_screen.tscn @@ -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" diff --git a/src/world/grunk_beast/behaviors/actions/grab_target.gd b/src/world/grunk_beast/behaviors/actions/grab_target.gd index 9109366..32c0857 100644 --- a/src/world/grunk_beast/behaviors/actions/grab_target.gd +++ b/src/world/grunk_beast/behaviors/actions/grab_target.gd @@ -16,5 +16,7 @@ func tick(_actor: Node, blackboard: Blackboard) -> int: # TODO print_debug("GET FUCKIGN GRABBED IDIOT!! ", target) + if target is Player: + (target as Player).get_grabbed() return SUCCESS diff --git a/src/world/world.gd b/src/world/world.gd index 5096ab6..fee04aa 100644 --- a/src/world/world.gd +++ b/src/world/world.gd @@ -10,6 +10,10 @@ class_name World extends Node @export var pause_scene: PackedScene +@export var kill_screen_scene: PackedScene + +var current_level: PackedScene + @onready var level_root: Node3D = %LevelRoot @onready var ui_root: Control = %UIRoot @@ -18,6 +22,7 @@ static var instance: World func _ready() -> void: World.instance = self + Game.manager.player_dead.connect(on_player_death) load_level(initial_level) @@ -40,4 +45,17 @@ func unpause() -> void: func load_level(level: PackedScene) -> void: for c: Node in level_root.get_children(): c.queue_free() + current_level = level 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) diff --git a/src/world/world.tscn b/src/world/world.tscn index 6cfc475..3d23aa4 100644 --- a/src/world/world.tscn +++ b/src/world/world.tscn @@ -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="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="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://c0uitm5cg88h1" path="res://src/ui/menus/kill_screen/kill_screen.tscn" id="6_l0av5"] [sub_resource type="Resource" id="Resource_43c6p"] script = ExtResource("2_bsf3i") @@ -16,6 +17,7 @@ script = ExtResource("1_1k4gi") spook_manager = SubResource("Resource_43c6p") initial_level = ExtResource("2_jte2u") pause_scene = ExtResource("2_6fy3g") +kill_screen_scene = ExtResource("6_l0av5") [node name="LevelRoot" type="Node3D" parent="."] unique_name_in_owner = true