diff --git a/materials/hair.ptex b/materials/hair.ptex
index bee45fbc..d5652474 100644
--- a/materials/hair.ptex
+++ b/materials/hair.ptex
@@ -157,10 +157,10 @@
},
{
"a": 1,
- "b": 0.293732,
- "g": 0.558716,
+ "b": 0.317825,
+ "g": 0.449612,
"pos": 1,
- "r": 0.683594
+ "r": 0.511719
}
],
"type": "Gradient"
@@ -188,10 +188,10 @@
},
{
"a": 1,
- "b": 0.238342,
- "g": 0.431115,
+ "b": 0.194183,
+ "g": 0.320966,
"pos": 1,
- "r": 0.554688
+ "r": 0.394531
}
],
"type": "Gradient"
@@ -209,9 +209,9 @@
"parameters": {
"color": {
"a": 1,
- "b": 0.148543,
- "g": 0.40435,
- "r": 0.513205,
+ "b": 0.098557,
+ "g": 0.200086,
+ "r": 0.243821,
"type": "Color"
}
},
diff --git a/materials/leaves.ptex b/materials/leaves.ptex
index 83798112..910cd038 100644
--- a/materials/leaves.ptex
+++ b/materials/leaves.ptex
@@ -246,8 +246,8 @@
"opacity": 0,
"rotate": 33.6,
"scale": 0,
- "scale_x": 0.1,
- "scale_y": 0.1,
+ "scale_x": 0.08,
+ "scale_y": 0.08,
"select_inputs": 0,
"variations": false
},
@@ -363,15 +363,15 @@
"longdesc": "",
"name": "graph",
"node_position": {
- "x": -1656.337646,
- "y": 239.964798
+ "x": -1659.217529,
+ "y": 234.204788
},
"nodes": [
{
"name": "gradient",
"node_position": {
- "x": -1348.702759,
- "y": -153.089325
+ "x": -975.742798,
+ "y": -137.249329
},
"parameters": {
"gradient": {
@@ -410,8 +410,8 @@
{
"name": "profile",
"node_position": {
- "x": -1083.223633,
- "y": -554.144897
+ "x": -1011.223633,
+ "y": -529.664917
},
"parameters": {
"gradient": {
@@ -466,8 +466,8 @@
"generic_size": 1,
"name": "transform2",
"node_position": {
- "x": -840.445862,
- "y": -606.117126
+ "x": -755.48584,
+ "y": -525.477112
},
"parameters": {
"mode": 0,
@@ -483,7 +483,7 @@
{
"name": "mirror_2",
"node_position": {
- "x": -480.723633,
+ "x": -482.163635,
"y": -528.339417
},
"parameters": {
@@ -527,8 +527,8 @@
{
"name": "gradient_2",
"node_position": {
- "x": -1407.029297,
- "y": -349.533844
+ "x": -1034.069336,
+ "y": -333.693848
},
"parameters": {
"gradient": {
@@ -560,8 +560,8 @@
{
"name": "math_3",
"node_position": {
- "x": -1096.695801,
- "y": -304.339325
+ "x": -723.735779,
+ "y": -288.499329
},
"parameters": {
"clamp": true,
@@ -575,8 +575,8 @@
{
"name": "mirror",
"node_position": {
- "x": -867.75824,
- "y": -317.321564
+ "x": -494.798187,
+ "y": -301.481567
},
"parameters": {
"direction": 0,
@@ -652,8 +652,8 @@
{
"name": "colorize_2",
"node_position": {
- "x": 768.980774,
- "y": -574.599365
+ "x": 760.782471,
+ "y": -570.259094
},
"parameters": {
"gradient": {
@@ -661,31 +661,24 @@
"points": [
{
"a": 0,
- "b": 1,
- "g": 1,
- "pos": 0,
- "r": 1
- },
- {
- "a": 1,
- "b": 1,
- "g": 1,
- "pos": 0.000001,
- "r": 1
+ "b": 0,
+ "g": 0,
+ "pos": 0.016611,
+ "r": 0
},
{
"a": 1,
"b": 0.17453,
"g": 0.519531,
- "pos": 0.028095,
+ "pos": 0.0299,
"r": 0.201483
},
{
"a": 1,
- "b": 0.109985,
- "g": 0.207031,
- "pos": 0.821499,
- "r": 0.163057
+ "b": 0,
+ "g": 0,
+ "pos": 0.851905,
+ "r": 0
}
],
"type": "Gradient"
@@ -712,8 +705,8 @@
{
"name": "gen_outputs",
"node_position": {
- "x": 1041.897461,
- "y": -436.653137
+ "x": 1056.36499,
+ "y": -564.450195
},
"parameters": {
@@ -749,8 +742,8 @@
{
"name": "math",
"node_position": {
- "x": 721.161072,
- "y": -414.326324
+ "x": 755.883301,
+ "y": -499.202881
},
"parameters": {
"clamp": true,
diff --git a/materials/vignette.png b/materials/vignette.png
new file mode 100644
index 00000000..f24b9ad1
Binary files /dev/null and b/materials/vignette.png differ
diff --git a/materials/vignette.svg b/materials/vignette.svg
new file mode 100644
index 00000000..c2d4cb39
--- /dev/null
+++ b/materials/vignette.svg
@@ -0,0 +1,77 @@
+
+
+
+
diff --git a/modules/going/game_ui.cpp b/modules/going/game_ui.cpp
new file mode 100644
index 00000000..69b37c27
--- /dev/null
+++ b/modules/going/game_ui.cpp
@@ -0,0 +1,33 @@
+#include "game_ui.h"
+
+GameUI *GameUI::singleton_instance{nullptr};
+
+void GameUI::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("display_message", "text"), &self_type::display_message);
+ ClassDB::bind_static_method("GameUI", D_METHOD("get_singleton"), &self_type::get_singleton);
+}
+
+void GameUI::_notification(int what) {
+ if(Engine::get_singleton()->is_editor_hint()) {
+ return;
+ }
+ if(what == NOTIFICATION_ENTER_TREE) {
+ ERR_FAIL_COND_EDMSG(self_type::singleton_instance != nullptr, "GameUI instance already exists, deleting second instance");
+ self_type::singleton_instance = this;
+ } else if(what == NOTIFICATION_EXIT_TREE) {
+ self_type::singleton_instance = nullptr;
+ }
+ if(what == NOTIFICATION_READY) {
+ this->message = Object::cast_to(this->get_node(NodePath("%MessageLabel")));
+ this->clear_message_timer = Object::cast_to(this->get_node(NodePath("%ClearMessageTimer")));
+ }
+}
+
+GameUI *GameUI::get_singleton() {
+ return self_type::singleton_instance;
+}
+
+void GameUI::display_message(String text) {
+ this->message->set_text(text);
+ this->clear_message_timer->start(0.0);
+}
diff --git a/modules/going/game_ui.h b/modules/going/game_ui.h
new file mode 100644
index 00000000..648f628c
--- /dev/null
+++ b/modules/going/game_ui.h
@@ -0,0 +1,22 @@
+#ifndef GAME_UI_H
+#define GAME_UI_H
+
+#include "core/string/ustring.h"
+#include "scene/main/canvas_layer.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/main/timer.h"
+
+class GameUI : public CanvasLayer {
+ GDCLASS(GameUI, CanvasLayer);
+ static void _bind_methods();
+ void _notification(int what);
+ static GameUI *singleton_instance;
+public:
+ static GameUI *get_singleton();
+ void display_message(String text);
+private:
+ RichTextLabel *message{nullptr};
+ Timer *clear_message_timer{nullptr};
+};
+
+#endif // !GAME_UI_H
diff --git a/modules/going/player_body.cpp b/modules/going/player_body.cpp
index f6cb23ad..5d2e7df4 100644
--- a/modules/going/player_body.cpp
+++ b/modules/going/player_body.cpp
@@ -28,6 +28,8 @@ void PlayerBody::_bind_methods() {
BIND_PROPERTY(Variant::VECTOR2, jump_impulse);
BIND_PROPERTY(Variant::FLOAT, model_lean);
BIND_PROPERTY(Variant::FLOAT, model_lean_speed);
+ BIND_PROPERTY(Variant::FLOAT, game_over_speed);
+ BIND_PROPERTY(Variant::BOOL, can_jump);
}
void PlayerBody::_notification(int what) {
@@ -189,3 +191,19 @@ void PlayerBody::set_model_lean_speed(float value) {
float PlayerBody::get_model_lean_speed() const {
return this->model_lean_speed;
}
+
+void PlayerBody::set_game_over_speed(float value) {
+ this->game_over_speed = value;
+}
+
+float PlayerBody::get_game_over_speed() const {
+ return this->game_over_speed;
+}
+
+void PlayerBody::set_can_jump(bool value) {
+ this->can_jump = value;
+}
+
+bool PlayerBody::get_can_jump() const {
+ return this->can_jump;
+}
diff --git a/modules/going/player_body.h b/modules/going/player_body.h
index b1867c9c..677dda1a 100644
--- a/modules/going/player_body.h
+++ b/modules/going/player_body.h
@@ -44,6 +44,10 @@ public:
float get_model_lean() const;
void set_model_lean_speed(float value);
float get_model_lean_speed() const;
+ void set_game_over_speed(float value);
+ float get_game_over_speed() const;
+ void set_can_jump(bool value);
+ bool get_can_jump() const;
private:
Vector2 movement{0.f, 0.f};
@@ -65,6 +69,8 @@ private:
double max_delta_fov{100.f};
float model_lean{0.25f};
float model_lean_speed{0.25f};
+ double game_over_speed{1.0/4.0};
+ bool can_jump{false};
public:
static char *const split_step_action;
static char *const move_left_action;
diff --git a/modules/going/player_states.cpp b/modules/going/player_states.cpp
index 7ac7c1b7..3d51efe4 100644
--- a/modules/going/player_states.cpp
+++ b/modules/going/player_states.cpp
@@ -3,6 +3,8 @@
#include "core/math/math_funcs.h"
#include "core/typedefs.h"
#include "going/player_body.h"
+#include "scene/main/scene_tree.h"
+#include "servers/rendering_server.h"
PlayerBody *PlayerState::get_body() const {
@@ -21,6 +23,18 @@ PlayerState::StateID StandingState::get_next_state() const {
void StandingState::state_entered() {
this->get_body()->get_anim()->play("RESET", 0.1);
+ this->game_over_timer = 0.0;
+}
+
+void StandingState::process(double delta) {
+ this->game_over_timer += delta * this->get_body()->get_game_over_speed();
+ if(this->game_over_timer > 1.0) {
+ RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0);
+ SceneTree::get_singleton()->reload_current_scene();
+ } else {
+ RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, float(this->game_over_timer));
+ this->game_over_timer = MIN(this->game_over_timer, 1.f);
+ }
}
void StandingState::physics_process(double delta) {
@@ -29,6 +43,10 @@ void StandingState::physics_process(double delta) {
this->get_body()->set_velocity(current.move_toward(Vector3(), speed_delta));
}
+void StandingState::state_exited() {
+ RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0f);
+}
+
PlayerState::StateID RunningState::get_next_state() const {
Vector3 const velocity{this->get_body()->get_velocity()};
Vector3 const desired{this->get_body()->get_desired_velocity()};
@@ -47,7 +65,7 @@ void RunningState::state_entered() {
this->get_body()->get_anim()->play("run", 0.1);
}
-void RunningState::process(double delta) {
+void RunningState::process_lean(double delta) {
Vector3 const current{this->get_body()->get_velocity()};
if(!current.is_zero_approx()) {
Vector3 const cross{Vector3{0.f, 1.f, 0.f}.cross(current).normalized()};
@@ -77,6 +95,7 @@ void RunningState::physics_process(double delta) {
)
};
this->get_body()->set_velocity(current.move_toward(desired, speed_delta) + Vector3{0.f, -0.01f, 0.f});
+ this->process_lean(delta);
}
void RunningState::state_exited() {
@@ -91,7 +110,7 @@ void RunningState::state_exited() {
PlayerState::StateID SplitStepState::get_next_state() const {
if(!this->get_body()->is_on_floor()) {
return FallingState::get_class_static();
- } else if(this->timer <= 0.0 && Input::get_singleton()->is_action_pressed("jump")) {
+ } else if(this->get_body()->get_can_jump() && this->jump && this->timer <= 0.0) {
return JumpingState::get_class_static();
} else if(this->timer <= 0.0) {
return RunningState::get_class_static();
@@ -101,6 +120,7 @@ PlayerState::StateID SplitStepState::get_next_state() const {
}
void SplitStepState::state_entered() {
+ this->jump = false;
this->last_velocity = this->get_body()->get_velocity();
this->timer = this->get_body()->get_split_step_time();
this->get_body()->set_velocity(last_velocity.normalized() * this->get_body()->get_target_speed() * 0.75f);
@@ -111,17 +131,21 @@ void SplitStepState::process(double delta) {
this->timer -= delta;
this->get_body()->set_velocity(this->get_body()->get_velocity()
.move_toward(Vector3(), this->get_body()->get_target_speed() / this->get_body()->get_split_step_stop_time() * delta));
+ this->jump |= Input::get_singleton()->is_action_pressed("jump");
}
void SplitStepState::state_exited() {
- if(this->get_body()->is_on_floor()) {
- Vector3 const desired_direction{this->get_body()->get_desired_direction()};
- float const dot{this->last_velocity.normalized().dot(desired_direction)};
- this->get_body()->set_velocity(dot > -0.8f
- ? desired_direction * MAX(last_velocity.length(), this->get_body()->get_step_boost())
- : Vector3()
- );
+ Vector3 desired_direction{0.f, 0.f, 0.f};
+ if(this->jump) {
+ desired_direction = Vector3{last_velocity.x, 0.f, last_velocity.z}.normalized();
+ } else if(this->get_body()->is_on_floor()) {
+ desired_direction = this->get_body()->get_desired_direction();
}
+ float const dot{this->last_velocity.normalized().dot(desired_direction)};
+ this->get_body()->set_velocity(dot > -0.8f
+ ? desired_direction * MAX(last_velocity.length(), this->get_body()->get_step_boost())
+ : Vector3()
+ );
}
PlayerState::StateID FallingState::get_next_state() const {
@@ -133,13 +157,29 @@ PlayerState::StateID FallingState::get_next_state() const {
}
void FallingState::state_entered() {
+ this->game_over_timer = 0.0;
this->get_body()->get_anim()->play("falling", 0.1);
}
void FallingState::process(double delta) {
Vector3 const current{this->get_body()->get_velocity()};
Vector3 const flattened{current.x, 0.f, current.z};
- this->get_body()->set_velocity((flattened - (flattened * 0.025f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
+ this->get_body()->set_velocity((flattened - (flattened * 0.015f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
+ if(this->can_game_over_falling) {
+ this->game_over_timer += delta * this->get_body()->get_game_over_speed();
+ if(this->game_over_timer > 1.0) {
+ RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0);
+ SceneTree::get_singleton()->reload_current_scene();
+ } else {
+ RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, float(this->game_over_timer));
+ this->game_over_timer = MIN(this->game_over_timer, 1.f);
+ }
+ }
+}
+
+void FallingState::state_exited() {
+ RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0);
+ this->can_game_over_falling = true;
}
PlayerState::StateID JumpingState::get_next_state() const {
@@ -153,18 +193,17 @@ PlayerState::StateID JumpingState::get_next_state() const {
void JumpingState::state_entered() {
Vector3 const current{this->get_body()->get_velocity()};
Vector2 const impulse{this->get_body()->get_jump_impulse()};
- float const force{(Vector2{current.x, current.z}.length() / this->get_body()->get_target_speed())};
this->get_body()->set_velocity( (
Vector3{current.x, impulse.y, current.z}
+ current.normalized() * impulse.x
- ) * force);
+ ));
this->get_body()->get_anim()->play("jump");
}
void JumpingState::process(double delta) {
Vector3 const current{this->get_body()->get_velocity()};
Vector3 const flattened{current.x, 0.f, current.z};
- this->get_body()->set_velocity((flattened - (flattened * 0.025f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
+ this->get_body()->set_velocity((flattened - (flattened * 0.015f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
}
void PlayerStateMachine::_bind_methods() {
@@ -194,10 +233,10 @@ void PlayerStateMachine::ready() {
this->set_process(true);
this->set_physics_process(true);
this->body = Object::cast_to(this->get_parent());
+ this->add_state();
this->add_state();
this->add_state();
this->add_state();
- this->add_state();
this->add_state();
}
diff --git a/modules/going/player_states.h b/modules/going/player_states.h
index 786c6a64..ce265a1c 100644
--- a/modules/going/player_states.h
+++ b/modules/going/player_states.h
@@ -30,7 +30,12 @@ class StandingState : public PlayerState {
public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
+ virtual void process(double delta) override;
virtual void physics_process(double delta) override;
+ virtual void state_exited() override;
+private:
+ double game_over_timer{0.0};
+ StringName game_over_param{"game_over_percentage"};
};
class RunningState : public PlayerState {
@@ -38,7 +43,7 @@ class RunningState : public PlayerState {
public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
- virtual void process(double delta) override;
+ void process_lean(double delta);
virtual void physics_process(double delta) override;
virtual void state_exited() override;
private:
@@ -55,6 +60,7 @@ public:
private:
Vector3 last_velocity{0.f, 0.f, 0.f};
double timer{0.0};
+ bool jump{false};
};
class FallingState : public PlayerState {
@@ -63,6 +69,11 @@ public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
virtual void process(double delta) override;
+ virtual void state_exited() override;
+private:
+ bool can_game_over_falling{false};
+ double game_over_timer{0.0};
+ StringName game_over_param{"game_over_percentage"};
};
class JumpingState : public PlayerState {
diff --git a/modules/going/register_types.cpp b/modules/going/register_types.cpp
index 930c5d1d..fe44b840 100644
--- a/modules/going/register_types.cpp
+++ b/modules/going/register_types.cpp
@@ -1,6 +1,7 @@
#include "register_types.h"
#include "core/object/class_db.h"
+#include "going/game_ui.h"
#include "going/player_body.h"
#include "going/player_states.h"
@@ -16,6 +17,7 @@ void initialize_going_module(ModuleInitializationLevel p_level) {
ClassDB::register_class();
ClassDB::register_class();
ClassDB::register_class();
+ ClassDB::register_class();
}
void uninitialize_going_module(ModuleInitializationLevel p_level) {
diff --git a/project/materials/hair_albedo.png b/project/materials/hair_albedo.png
index 86d52008..dc02c9b9 100644
Binary files a/project/materials/hair_albedo.png and b/project/materials/hair_albedo.png differ
diff --git a/project/materials/leaves_albedo.png b/project/materials/leaves_albedo.png
index 8bcdc5f8..d03dd038 100644
Binary files a/project/materials/leaves_albedo.png and b/project/materials/leaves_albedo.png differ
diff --git a/project/materials/leaves_normal.png b/project/materials/leaves_normal.png
index c99f20b5..840ec20c 100644
Binary files a/project/materials/leaves_normal.png and b/project/materials/leaves_normal.png differ
diff --git a/project/models/pickups/twirly.blend b/project/models/pickups/twirly.blend
new file mode 100644
index 00000000..a85fcb8c
Binary files /dev/null and b/project/models/pickups/twirly.blend differ
diff --git a/project/models/pickups/twirly.blend.import b/project/models/pickups/twirly.blend.import
new file mode 100644
index 00000000..02400500
--- /dev/null
+++ b/project/models/pickups/twirly.blend.import
@@ -0,0 +1,53 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cdyr4yad84cp2"
+path="res://.godot/imported/twirly.blend-fad795a9868d207b62ee28c2ea4b5e16.scn"
+
+[deps]
+
+source_file="res://models/pickups/twirly.blend"
+dest_files=["res://.godot/imported/twirly.blend-fad795a9868d207b62ee28c2ea4b5e16.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+nodes/use_node_type_suffixes=true
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+animation/import_rest_as_RESET=false
+import_script/path=""
+_subresources={}
+blender/nodes/visible=0
+blender/nodes/active_collection_only=false
+blender/nodes/punctual_lights=true
+blender/nodes/cameras=true
+blender/nodes/custom_properties=true
+blender/nodes/modifiers=1
+blender/meshes/colors=false
+blender/meshes/uvs=true
+blender/meshes/normals=true
+blender/meshes/export_geometry_nodes_instances=false
+blender/meshes/tangents=true
+blender/meshes/skins=2
+blender/meshes/export_bones_deforming_mesh_only=false
+blender/materials/unpack_enabled=true
+blender/materials/export_materials=1
+blender/animation/limit_playback=true
+blender/animation/always_sample=true
+blender/animation/group_tracks=true
diff --git a/project/models/pickups/twirly.blend1 b/project/models/pickups/twirly.blend1
new file mode 100644
index 00000000..ddb1516c
Binary files /dev/null and b/project/models/pickups/twirly.blend1 differ
diff --git a/project/models/player/character.blend b/project/models/player/character.blend
index bd5b3dfb..e638fa08 100644
Binary files a/project/models/player/character.blend and b/project/models/player/character.blend differ
diff --git a/project/models/player/character.blend1 b/project/models/player/character.blend1
index e33465eb..15e56b0f 100644
Binary files a/project/models/player/character.blend1 and b/project/models/player/character.blend1 differ
diff --git a/project/models/props/evergreen.blend b/project/models/props/evergreen.blend
index 2df986f3..bf7228c5 100644
Binary files a/project/models/props/evergreen.blend and b/project/models/props/evergreen.blend differ
diff --git a/project/models/props/evergreen.blend1 b/project/models/props/evergreen.blend1
index 2ea8f611..e712b444 100644
Binary files a/project/models/props/evergreen.blend1 and b/project/models/props/evergreen.blend1 differ
diff --git a/project/models/props/evertree_cutout_texture.png b/project/models/props/evertree_cutout_texture.png
index ce6f46e1..bcf3a3a7 100644
Binary files a/project/models/props/evertree_cutout_texture.png and b/project/models/props/evertree_cutout_texture.png differ
diff --git a/project/models/props/evertree_cutout_texture.png.import b/project/models/props/evertree_cutout_texture.png.import
index f2a49443..6edc4005 100644
--- a/project/models/props/evertree_cutout_texture.png.import
+++ b/project/models/props/evertree_cutout_texture.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dg6wbdfd7t314"
-path="res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.ctex"
+path.s3tc="res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://models/props/evertree_cutout_texture.png"
-dest_files=["res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.ctex"]
+dest_files=["res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.s3tc.ctex"]
[params]
-compress/mode=0
+compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
-mipmaps/generate=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
-detect_3d/compress_to=1
+detect_3d/compress_to=0
diff --git a/project/models/props/tree.blend b/project/models/props/tree.blend
index 6c0e1b80..9e64ccde 100644
Binary files a/project/models/props/tree.blend and b/project/models/props/tree.blend differ
diff --git a/project/models/props/tree.blend1 b/project/models/props/tree.blend1
index f26d3738..9397dd55 100644
Binary files a/project/models/props/tree.blend1 and b/project/models/props/tree.blend1 differ
diff --git a/project/models/props/tree_cutout_texture.png b/project/models/props/tree_cutout_texture.png
index c27f87ff..d04710ac 100644
Binary files a/project/models/props/tree_cutout_texture.png and b/project/models/props/tree_cutout_texture.png differ
diff --git a/project/models/terrains/level.blend b/project/models/terrains/level.blend
index 6b2c807a..712100ed 100644
Binary files a/project/models/terrains/level.blend and b/project/models/terrains/level.blend differ
diff --git a/project/models/terrains/level.blend1 b/project/models/terrains/level.blend1
index 69f9d68f..a4f0012f 100644
Binary files a/project/models/terrains/level.blend1 and b/project/models/terrains/level.blend1 differ
diff --git a/project/objects/evertre.tscn b/project/objects/evertre.tscn
index 2486adc0..ef729697 100644
--- a/project/objects/evertre.tscn
+++ b/project/objects/evertre.tscn
@@ -1,7 +1,40 @@
-[gd_scene load_steps=2 format=3 uid="uid://dp48t6earfkm4"]
+[gd_scene load_steps=6 format=3 uid="uid://dp48t6earfkm4"]
[ext_resource type="PackedScene" uid="uid://cvu7bq8hur8yy" path="res://models/props/evergreen.blend" id="1_xfn5b"]
+[ext_resource type="Texture2D" uid="uid://dg6wbdfd7t314" path="res://models/props/evertree_cutout_texture.png" id="2_1mi82"]
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_1mi82"]
+top_radius = 0.0
+bottom_radius = 10.626
+height = 20.987
+cap_top = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_plvfv"]
+size = Vector2(34.74, 34.74)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bi1ef"]
+transparency = 2
+alpha_scissor_threshold = 0.709
+alpha_antialiasing_mode = 0
+shading_mode = 2
+specular_mode = 1
+albedo_texture = ExtResource("2_1mi82")
+disable_receive_shadows = true
+billboard_mode = 2
[node name="Evertre" type="Node3D"]
[node name="evergreen" parent="." instance=ExtResource("1_xfn5b")]
+visibility_parent = NodePath("../cutout")
+
+[node name="shadowmesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 23.702, 0)
+cast_shadow = 3
+visibility_range_begin = 99.0
+mesh = SubResource("CylinderMesh_1mi82")
+
+[node name="cutout" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17.7955, 0)
+visibility_range_begin = 100.0
+mesh = SubResource("QuadMesh_plvfv")
+surface_material_override/0 = SubResource("StandardMaterial3D_bi1ef")
diff --git a/project/objects/player.tscn b/project/objects/player.tscn
index 7f9d07f2..e5433c07 100644
--- a/project/objects/player.tscn
+++ b/project/objects/player.tscn
@@ -1,6 +1,7 @@
-[gd_scene load_steps=4 format=3 uid="uid://dcgsrdacswacl"]
+[gd_scene load_steps=5 format=3 uid="uid://dcgsrdacswacl"]
[ext_resource type="PackedScene" uid="uid://cl7a4q5m73vlw" path="res://models/player/character.blend" id="1_eqqp1"]
+[ext_resource type="PackedScene" uid="uid://dy4yl1paa8whs" path="res://ui/ui.tscn" id="2_ykyjo"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bxedw"]
radius = 0.339355
@@ -15,7 +16,7 @@ script/source = "extends Camera3D
func _ready():
self.top_level = true
-func _process(_delta):
+func _physics_process(_delta):
var target : Vector3 = get_parent().global_position + Vector3(0.0, pivot_height, 0.0)
var diff := self.global_position - target
if abs(diff).x + abs(diff.z) > 0.1:
@@ -50,4 +51,6 @@ look_target_height = 1.5
[node name="character" parent="." instance=ExtResource("1_eqqp1")]
unique_name_in_owner = true
+[node name="CanvasLayer" parent="." instance=ExtResource("2_ykyjo")]
+
[editable path="character"]
diff --git a/project/objects/tre.tscn b/project/objects/tre.tscn
index d65bbde4..6bc30e8f 100644
--- a/project/objects/tre.tscn
+++ b/project/objects/tre.tscn
@@ -7,11 +7,13 @@
size = Vector2(34.7, 34.7)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t4bw2"]
-transparency = 1
+transparency = 2
+alpha_scissor_threshold = 0.724
+alpha_antialiasing_mode = 0
shading_mode = 2
-diffuse_mode = 1
-specular_mode = 2
+specular_mode = 1
albedo_texture = ExtResource("2_t4bw2")
+disable_receive_shadows = true
billboard_mode = 2
[sub_resource type="SphereMesh" id="SphereMesh_t4bw2"]
@@ -21,15 +23,17 @@ height = 22.768
[node name="Tree" type="Node3D"]
[node name="tree" parent="." instance=ExtResource("1_n3f34")]
-visibility_parent = NodePath("../MeshInstance3D")
+visibility_parent = NodePath("../cutout")
-[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+[node name="cutout" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17.1601, 0)
visibility_range_begin = 100.0
mesh = SubResource("QuadMesh_n3f34")
surface_material_override/0 = SubResource("StandardMaterial3D_t4bw2")
-[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 22.6292, 0)
+[node name="shadowmesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 23.4137, 0)
cast_shadow = 3
+visibility_range_begin = 99.0
mesh = SubResource("SphereMesh_t4bw2")
+skeleton = NodePath("../tree")
diff --git a/project/objects/wall_enemy.tscn b/project/objects/wall_enemy.tscn
index c03f2416..712ffffd 100644
--- a/project/objects/wall_enemy.tscn
+++ b/project/objects/wall_enemy.tscn
@@ -36,10 +36,10 @@ func process_ahead():
var target : Vector3 = player.global_position + last_velocity
target.y = self.global_position.y
var forward : Vector3 = player.velocity.normalized()
- if player.global_position.distance_squared_to(self.global_position) < target_distance * target_distance or abs((player.global_position - global_position).dot(forward.cross(Vector3.UP))) < 0.25:
+ if player.global_position.distance_squared_to(self.global_position) < target_distance * target_distance or abs((player.global_position - global_position).dot(forward.cross(Vector3.UP))) <= 0.1:
self.velocity = Vector3()
return
- if !forward.is_zero_approx():
+ if !forward.is_zero_approx() and false:
last_velocity = player.velocity
forward.y = 0.0
forward = forward.normalized()
@@ -47,11 +47,12 @@ func process_ahead():
self.velocity = (target - self.global_position).normalized() * speed
func process_behind():
+ pass
var diff : Vector3 = player.global_position - global_position
var forward := diff.normalized()
var left := Vector3.UP.cross(forward)
self.velocity = forward + left * direction * min(10.0, diff.length())
- self.look_at(Vector3(player.global_position.x, global_position.y, player.global_position.z))
+# self.look_at(Vector3(player.global_position.x, global_position.y, player.global_position.z))
func _physics_process(_delta : float):
self.velocity += Vector3(0, -0.25, 0)
@@ -59,17 +60,20 @@ func _physics_process(_delta : float):
"
[sub_resource type="SphereShape3D" id="SphereShape3D_j6w7d"]
-radius = 1.83616
+radius = 1.4143
[sub_resource type="BoxShape3D" id="BoxShape3D_j6w7d"]
-size = Vector3(4.29688, 3.86325, 2.76758)
+size = Vector3(5.79102, 3.86325, 2.76758)
[node name="WallEnemy" type="CharacterBody3D"]
collision_layer = 2
+floor_snap_length = 10.0
script = SubResource("GDScript_j6w7d")
+target_distance = 4.0
+detect_distance = 20.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.83717, 0)
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.37512, 0)
shape = SubResource("SphereShape3D_j6w7d")
[node name="AnimatableBody3D" type="AnimatableBody3D" parent="."]
diff --git a/project/project.godot b/project/project.godot
index 2b5c9495..89752e94 100644
--- a/project/project.godot
+++ b/project/project.godot
@@ -11,7 +11,7 @@ config_version=5
[application]
config/name="going"
-run/main_scene="uid://sofv1apr4467"
+run/main_scene="uid://cnau7sr4mu3gf"
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
@@ -19,6 +19,7 @@ config/icon="res://icon.svg"
window/size/viewport_width=1920
window/size/viewport_height=1080
+window/size/mode=3
window/size/resizable=false
window/vsync/vsync_mode=0
@@ -74,3 +75,10 @@ camera/depth_of_field/depth_of_field_bokeh_shape=0
anti_aliasing/quality/screen_space_aa=1
anti_aliasing/quality/use_debanding=true
occlusion_culling/use_occlusion_culling=true
+
+[shader_globals]
+
+game_over_percentage={
+"type": "float",
+"value": 0.0
+}
diff --git a/project/scenes/main_menu.tscn b/project/scenes/main_menu.tscn
new file mode 100644
index 00000000..2ce60444
--- /dev/null
+++ b/project/scenes/main_menu.tscn
@@ -0,0 +1,33 @@
+[gd_scene load_steps=2 format=3 uid="uid://cnau7sr4mu3gf"]
+
+[sub_resource type="GDScript" id="GDScript_vue75"]
+script/source = "extends Button
+
+func _on_button_up() -> void:
+ self.get_tree().change_scene_to_file(\"res://scenes/valley.tscn\")
+"
+
+[node name="MainMenu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Button" type="Button" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 722.0
+offset_top = 400.0
+offset_right = -721.0
+offset_bottom = -399.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_font_sizes/font_size = 200
+text = "Start"
+script = SubResource("GDScript_vue75")
+
+[connection signal="button_up" from="Button" to="Button" method="_on_button_up"]
diff --git a/project/scenes/valley.tscn b/project/scenes/valley.tscn
index 91954516..94dd5a77 100644
--- a/project/scenes/valley.tscn
+++ b/project/scenes/valley.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=9 format=3 uid="uid://sofv1apr4467"]
+[gd_scene load_steps=12 format=3 uid="uid://sofv1apr4467"]
[ext_resource type="PackedScene" uid="uid://5cfl3xu1861l" path="res://models/terrains/level.blend" id="1_ch7jd"]
[ext_resource type="PackedScene" uid="uid://dcgsrdacswacl" path="res://objects/player.tscn" id="2_pvuhy"]
[ext_resource type="PackedScene" uid="uid://dqjurq1nq1fle" path="res://objects/tre.tscn" id="3_lj5yw"]
[ext_resource type="PackedScene" uid="uid://cdmksnsttot3j" path="res://objects/wall_enemy.tscn" id="4_kaqos"]
[ext_resource type="PackedScene" uid="uid://dp48t6earfkm4" path="res://objects/evertre.tscn" id="5_81e57"]
+[ext_resource type="PackedScene" uid="uid://cdyr4yad84cp2" path="res://models/pickups/twirly.blend" id="6_a2vvy"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_pvuhy"]
sky_top_color = Color(0.0825, 0.277292, 0.55, 1)
@@ -23,13 +24,52 @@ ambient_light_source = 3
ssao_radius = 16.0
glow_enabled = true
+[sub_resource type="GDScript" id="GDScript_a2vvy"]
+script/source = "extends Area3D
+
+func _on_body_entered(body: Node3D) -> void:
+ if body.is_class(\"PlayerBody\"):
+ body.set_can_jump(true)
+ queue_free()
+ GameUI.get_singleton().display_message(\"Jump by pressing F during a split-step\")
+
+func _process(delta):
+ $twirly.rotate_y(delta * 2.0)
+"
+
+[sub_resource type="SphereShape3D" id="SphereShape3D_a2vvy"]
+radius = 1.61546
+
[node name="Valley" type="Node3D"]
[node name="Player" parent="." instance=ExtResource("2_pvuhy")]
-transform = Transform3D(0.999996, 0, -0.0030368, 0, 1, 0, 0.0030368, 0, 0.999996, 4.19603, 31.6645, -39.4833)
+transform = Transform3D(0.999996, 0, -0.0030368, 0, 1, 0, 0.0030368, 0, 0.999996, 31.3342, 31.6645, -39.9581)
[node name="WallEnemy" parent="." instance=ExtResource("4_kaqos")]
-transform = Transform3D(-0.0472111, 0, -0.998885, 0, 1, 0, 0.998885, 0, -0.0472111, -33.2398, -0.00426483, 142.026)
+transform = Transform3D(-0.38249, 0, -0.923959, 0, 1, 0, 0.923959, 0, -0.38249, 135.071, -6.37696, 263.993)
+
+[node name="WallEnemy3" parent="." instance=ExtResource("4_kaqos")]
+transform = Transform3D(0.999926, 0, 0.0121468, 0, 1, 0, -0.0121468, 0, 0.999926, 168.538, -6.37696, 215.507)
+
+[node name="WallEnemy2" parent="." instance=ExtResource("4_kaqos")]
+transform = Transform3D(-0.991635, 0, 0.129073, 0, 1, 0, -0.129073, 0, -0.991635, 229.483, -6.38962, 232.319)
+speed = 4.0
+
+[node name="Label3D" type="Label3D" parent="WallEnemy2"]
+transform = Transform3D(0.994593, -0.103851, 0, -4.53949e-09, -4.3475e-08, 1, -0.103851, -0.994593, -4.37114e-08, 231.324, 6.54938, 243.387)
+pixel_size = 0.08
+text = " [W]
+A S D"
+
+[node name="Label3D2" type="Label3D" parent="WallEnemy2"]
+transform = Transform3D(0.965926, 0, 0.258819, 0, 1, 0, -0.258819, 0, 0.965926, 228.424, 8.2929, 214.064)
+pixel_size = 0.025
+text = "[Space] [D]"
+
+[node name="Label3D3" type="Label3D" parent="WallEnemy2"]
+transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 260.364, 8.2929, 215.45)
+pixel_size = 0.025
+text = "[Space] [A]"
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_lj5yw")
@@ -82,10 +122,10 @@ transform = Transform3D(-0.583853, 0, 0.811859, 0, 1, 0, -0.811859, 0, -0.583853
transform = Transform3D(-0.806857, 0, 0.590747, 0, 1, 0, -0.590747, 0, -0.806857, 12.0918, 0.326586, 19.9047)
[node name="Node3D17" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.729256, 0, -0.684242, 0, 1, 0, 0.684242, 0, -0.729256, 25.3264, 0.0781007, 1.97371)
+transform = Transform3D(-0.729256, 0, -0.684242, 0, 1, 0, 0.684242, 0, -0.729256, 25.1658, -0.570518, 3.70682)
[node name="Node3D19" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.63905, 0, -0.769166, 0, 1, 0, 0.769166, 0, -0.63905, 36.3753, 0.295401, 4.2828)
+transform = Transform3D(-0.63905, 0, -0.769166, 0, 1, 0, 0.769166, 0, -0.63905, 35.7514, -0.40734, 5.82252)
[node name="Node3D21" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(0.87511, -1.61731e-08, 0.483924, -2.43482e-08, 1, 7.74511e-08, -0.483924, -7.95609e-08, 0.87511, 17.2233, 0.574241, 11.9056)
@@ -349,7 +389,7 @@ transform = Transform3D(0.925203, -7.60956e-08, 0.379472, 3.51579e-08, 1, 1.1481
transform = Transform3D(0.395593, 9.15362e-08, -0.918426, 3.51579e-08, 1, 1.14811e-07, 0.918426, -7.77082e-08, 0.395593, -11.1774, -0.230842, 39.2564)
[node name="Node3D105" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.199709, -1.05476e-07, 0.979855, 3.51579e-08, 1, 1.14811e-07, -0.979855, 5.73785e-08, -0.199709, 3.23367, -0.230842, 53.8158)
+transform = Transform3D(-0.199709, -1.05476e-07, 0.979855, 3.51579e-08, 1, 1.14811e-07, -0.979855, 5.73785e-08, -0.199709, 3.21507, -0.298522, 43.3237)
[node name="Node3D58" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.573291, -7.39146e-08, 0.819353, 3.51579e-08, 1, 1.14811e-07, -0.819353, 9.46265e-08, -0.573291, 41.0137, 1.1686, 34.4092)
@@ -777,9 +817,6 @@ transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802
[node name="Node3D225" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802, -49.3032, 12.6146, 184.871)
-[node name="Node3D226" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802, -48.3955, 11.2669, 178.045)
-
[node name="Node3D227" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802, -47.6151, 8.45536, 169.048)
@@ -846,9 +883,6 @@ transform = Transform3D(-0.999984, 0, -0.00563782, 0, 1, 0, 0.00563782, 0, -0.99
[node name="Node3D211" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.890832, 0, -0.454333, 0, 1, 0, 0.454333, 0, -0.890832, -39.1819, 13.7524, 202.259)
-[node name="Node3D212" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -40.8661, 4.56589, 159.345)
-
[node name="Node3D213" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -46.8773, 3.83218, 159.091)
@@ -864,9 +898,6 @@ transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225,
[node name="Node3D217" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -13.0376, 6.92232, 157.9)
-[node name="Node3D218" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -23.1474, 6.80598, 161.031)
-
[node name="Node3D220" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -22.0954, 10.289, 171.149)
@@ -877,7 +908,7 @@ transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225,
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -1.87738, 7.83628, 154.856)
[node name="Node3D223" parent="level" instance=ExtResource("3_lj5yw")]
-transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, 4.71963, 11.8309, 165.954)
+transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, 5.2084, 11.3779, 162.47)
[node name="Node3D224" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, 24.9724, 13.0452, 151.413)
@@ -1036,3 +1067,29 @@ shadow_opacity = 0.74
shadow_blur = 0.973
directional_shadow_blend_splits = true
directional_shadow_max_distance = 1063.4
+
+[node name="Tree" parent="." instance=ExtResource("3_lj5yw")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 269.46, 0.341235, 236.781)
+
+[node name="Area3D" type="Area3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 259.242, 1.93115, 234.094)
+script = SubResource("GDScript_a2vvy")
+
+[node name="twirly" parent="Area3D" instance=ExtResource("6_a2vvy")]
+
+[node name="OmniLight3D" type="OmniLight3D" parent="Area3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.503185, 0)
+light_color = Color(0.880355, 0.555272, 0, 1)
+light_energy = 8.133
+omni_range = 3.15575
+
+[node name="OmniLight3D2" type="OmniLight3D" parent="Area3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.00915, 0)
+light_color = Color(0.880355, 0.555272, 0, 1)
+light_energy = 8.133
+omni_range = 3.15575
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
+shape = SubResource("SphereShape3D_a2vvy")
+
+[connection signal="body_entered" from="Area3D" to="Area3D" method="_on_body_entered"]
diff --git a/project/ui/ui.tscn b/project/ui/ui.tscn
new file mode 100644
index 00000000..a4e62691
--- /dev/null
+++ b/project/ui/ui.tscn
@@ -0,0 +1,59 @@
+[gd_scene load_steps=4 format=3 uid="uid://dy4yl1paa8whs"]
+
+[ext_resource type="Texture2D" uid="uid://bglfaie21avpt" path="res://ui/vignette.png" id="1_nb4k0"]
+
+[sub_resource type="Shader" id="Shader_ykyjo"]
+code = "shader_type canvas_item;
+global uniform float game_over_percentage = 0.0;
+
+void vertex() {
+ // Called for every vertex the material is visible on.
+}
+
+void fragment() {
+ COLOR.r = COLOR.g = COLOR.b = 0.0;
+ COLOR.a = clamp(COLOR.a + game_over_percentage * 2.0 - 1.0, 0.0, 1.0);
+}
+
+//void light() {
+// // Called for every pixel for every light affecting the CanvasItem.
+// // Uncomment to replace the default light processing function with this one.
+//}
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_uxov2"]
+shader = SubResource("Shader_ykyjo")
+
+[node name="CanvasLayer" type="GameUI"]
+
+[node name="Vignette" type="TextureRect" parent="."]
+material = SubResource("ShaderMaterial_uxov2")
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+texture = ExtResource("1_nb4k0")
+expand_mode = 2
+
+[node name="MessageLabel" type="RichTextLabel" parent="."]
+unique_name_in_owner = true
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 195.0
+grow_horizontal = 2
+theme_override_font_sizes/normal_font_size = 60
+text = "Good Luck!"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="ClearMessageTimer" type="Timer" parent="MessageLabel"]
+unique_name_in_owner = true
+wait_time = 5.0
+one_shot = true
+autostart = true
+ignore_time_scale = true
+
+[connection signal="timeout" from="MessageLabel/ClearMessageTimer" to="MessageLabel" method="set_text" flags=3 binds= [""]]
diff --git a/project/ui/vignette.png b/project/ui/vignette.png
new file mode 100644
index 00000000..3f8509f0
Binary files /dev/null and b/project/ui/vignette.png differ
diff --git a/project/ui/vignette.png.import b/project/ui/vignette.png.import
new file mode 100644
index 00000000..f34865ea
--- /dev/null
+++ b/project/ui/vignette.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bglfaie21avpt"
+path="res://.godot/imported/vignette.png-fcc9b969d140e62ae5a80701deb118ec.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/vignette.png"
+dest_files=["res://.godot/imported/vignette.png-fcc9b969d140e62ae5a80701deb118ec.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1