feat: finishing touches

This commit is contained in:
Sara 2025-06-17 02:52:26 +02:00
parent cebae80b5c
commit 6d4a961423
39 changed files with 4028 additions and 2162 deletions

445
materials/title.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 54 KiB

200
materials/water.ptex Normal file
View file

@ -0,0 +1,200 @@
{
"connections": [
{
"from": "colorize",
"from_port": 0,
"to": "Material",
"to_port": 0
},
{
"from": "fbm2_2",
"from_port": 0,
"to": "colorize",
"to_port": 0
},
{
"from": "normal_map2",
"from_port": 0,
"to": "Material",
"to_port": 4
},
{
"from": "fbm2_3",
"from_port": 0,
"to": "math",
"to_port": 0
},
{
"from": "math",
"from_port": 0,
"to": "normal_map2",
"to_port": 0
},
{
"from": "fbm2_4",
"from_port": 0,
"to": "math",
"to_port": 1
}
],
"label": "Graph",
"longdesc": "",
"name": "@@369",
"node_position": {
"x": 0,
"y": 0
},
"nodes": [
{
"export_paths": {
},
"name": "Material",
"node_position": {
"x": 0,
"y": 0
},
"parameters": {
"albedo_color": {
"a": 1,
"b": 1,
"g": 1,
"r": 1,
"type": "Color"
},
"ao": 1,
"depth_scale": 0.5,
"emission_energy": 1,
"flags_transparent": true,
"metallic": 0,
"normal": 1,
"roughness": 0,
"size": 11,
"sss": 1
},
"seed_int": 0,
"type": "material"
},
{
"name": "fbm2_2",
"node_position": {
"x": -850.963745,
"y": 6.877337
},
"parameters": {
"folds": 0,
"iterations": 3,
"noise": 1,
"offset": 0,
"persistence": 0.52,
"scale_x": 5,
"scale_y": 5
},
"seed_int": 4012603136,
"type": "fbm2"
},
{
"name": "colorize",
"node_position": {
"x": -349.60199,
"y": -4.478811
},
"parameters": {
"gradient": {
"interpolation": 1,
"points": [
{
"a": 1,
"b": 0.289062,
"g": 0.228088,
"pos": 0,
"r": 0
},
{
"a": 1,
"b": 0.702849,
"g": 0.730469,
"pos": 1,
"r": 0.562119
}
],
"type": "Gradient"
}
},
"seed_int": 0,
"type": "colorize"
},
{
"name": "fbm2_3",
"node_position": {
"x": -857.81073,
"y": 244.661926
},
"parameters": {
"folds": 0,
"iterations": 3,
"noise": 1,
"offset": 0,
"persistence": 0.52,
"scale_x": 15,
"scale_y": 15
},
"seed_int": 634376768,
"type": "fbm2"
},
{
"name": "normal_map2",
"node_position": {
"x": -279.893982,
"y": 224.078552
},
"parameters": {
"buffer": 1,
"param2": 0,
"size": 11,
"strength": 1
},
"seed_int": 0,
"type": "normal_map2"
},
{
"name": "fbm2_4",
"node_position": {
"x": -860.903809,
"y": 472.729126
},
"parameters": {
"folds": 0,
"iterations": 3,
"noise": 1,
"offset": 0,
"persistence": 0.52,
"scale_x": 1,
"scale_y": 1
},
"seed_int": 3974494,
"type": "fbm2"
},
{
"name": "math",
"node_position": {
"x": -574.827332,
"y": 263.39502
},
"parameters": {
"clamp": false,
"default_in1": 0,
"default_in2": 0,
"op": 2
},
"seed_int": 0,
"type": "math"
}
],
"parameters": {
},
"seed_int": 0,
"shortdesc": "",
"type": "graph"
}

View file

@ -0,0 +1,67 @@
#include "game_over_effect.h"
#include "core/config/engine.h"
#include "core/typedefs.h"
#include "going/player_body.h"
void GameOverEffect::_bind_methods() {
}
void GameOverEffect::_notification(int what) {
if(Engine::get_singleton()->is_editor_hint()) {
return;
}
switch(what) {
default:
return;
case NOTIFICATION_READY:
this->ready();
return;
case NOTIFICATION_PROCESS:
this->process(this->get_process_delta_time());
return;
case NOTIFICATION_PHYSICS_PROCESS:
this->physics_process(this->get_physics_process_delta_time());
return;
case NOTIFICATION_EXIT_TREE:
RenderingServer::get_singleton()->global_shader_parameter_set("game_over_percentage", this->game_over_percentage);
return;
}
}
void GameOverEffect::ready() {
this->set_process(true);
this->set_physics_process(true);
this->body = Object::cast_to<PlayerBody>(this->get_parent());
this->anim = Object::cast_to<AnimationPlayer>(this->get_node(NodePath("AnimationPlayer")));
this->camera = Object::cast_to<Camera3D>(this->get_node(NodePath("../Camera3D")));
this->anim->play("game_over", -1, 0.0);
this->set_visible(false);
}
void GameOverEffect::process(double delta) {
this->anim->seek(MIN(this->game_over_percentage * 2.f, 1.0f), true);
RenderingServer::get_singleton()->global_shader_parameter_set("game_over_percentage", this->game_over_percentage);
this->set_visible(this->game_over_percentage > 0.1);
if(this->game_over_percentage >= 1.0) {
this->body->load_checkpoint();
this->game_over_percentage = 0.0;
}
}
void GameOverEffect::physics_process(double delta) {
Vector3 const delta_position{this->get_global_position() - this->last_frame_point};
if(delta_position.length() / delta > this->game_over_max_delta) { // convert per-frame movement to approximate movement/second
this->game_over_percentage = 0.f;
} else {
this->game_over_percentage += delta * this->game_over_speed;
}
this->last_frame_point = this->get_global_position();
Vector3 const position{this->body->get_global_position()};
Vector3 camera_position{this->camera->get_global_position()};
camera_position.y = this->get_global_position().y;
this->set_global_position(position);
Vector3 const target{position - (camera_position - position)};
if(!target.is_equal_approx(position)) {
this->look_at(target);
}
}

View file

@ -0,0 +1,27 @@
#ifndef GAME_OVER_EFFECT_H
#define GAME_OVER_EFFECT_H
#include "scene/3d/camera_3d.h"
#include "scene/3d/node_3d.h"
#include "scene/animation/animation_player.h"
class PlayerBody;
class GameOverEffect : public Node3D {
GDCLASS(GameOverEffect, Node3D);
static void _bind_methods();
void _notification(int what);
void ready();
void process(double delta);
void physics_process(double delta);
private:
Vector3 last_frame_point{};
float game_over_max_delta{1.0};
float game_over_speed{1.0/2.0};
double game_over_percentage{0.f};
AnimationPlayer *anim{nullptr};
PlayerBody *body{nullptr};
Camera3D *camera{nullptr};
};
#endif // !GAME_OVER_EFFECT_H

View file

@ -16,6 +16,7 @@ char *const PlayerBody::move_forward_action{const_cast<char*>("move_forward")};
char *const PlayerBody::move_back_action{const_cast<char*>("move_back")};
void PlayerBody::_bind_methods() {
ADD_SIGNAL(MethodInfo("obstacle_broken"));
ClassDB::bind_method(D_METHOD("get_desired_velocity"), &self_type::get_desired_velocity);
ClassDB::bind_method(D_METHOD("get_desired_direction"), &self_type::get_desired_direction);
ClassDB::bind_method(D_METHOD("save_checkpoint"), &self_type::save_checkpoint);
@ -31,10 +32,10 @@ void PlayerBody::_bind_methods() {
BIND_PROPERTY(Variant::FLOAT, split_step_stop_time);
BIND_PROPERTY(Variant::FLOAT, bash_speed);
BIND_PROPERTY(Variant::FLOAT, bash_time);
BIND_PROPERTY(Variant::FLOAT, extra_bash_time);
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);
BIND_PROPERTY(Variant::BOOL, can_bash);
}
@ -97,7 +98,7 @@ void PlayerBody::load_checkpoint() {
this->last_checkpoint->load(this);
this->force_update_transform();
this->set_velocity(Vector3{});
this->state->force_state<FallingState>();
this->state->_force_state<FallingState>();
}
Vector3 PlayerBody::get_desired_direction() const {
@ -210,6 +211,14 @@ double PlayerBody::get_bash_time() const {
return this->bash_time;
}
void PlayerBody::set_extra_bash_time(double value) {
this->extra_bash_time = value;
}
double PlayerBody::get_extra_bash_time() const {
return this->extra_bash_time;
}
void PlayerBody::set_jump_impulse(Vector2 value) {
this->jump_impulse = value;
}
@ -234,14 +243,6 @@ 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;
}

View file

@ -47,14 +47,14 @@ public:
float get_bash_speed() const;
void set_bash_time(double value);
double get_bash_time() const;
void set_extra_bash_time(double value);
double get_extra_bash_time() const;
void set_jump_impulse(Vector2 value);
Vector2 get_jump_impulse() const;
void set_model_lean(float value);
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;
void set_can_bash(bool value);
@ -76,13 +76,13 @@ private:
double split_step_stop_time{0.5};
float bash_speed{100.f};
double bash_time{0.25};
double extra_bash_time{0.25};
Vector2 jump_impulse{5.f, 5.f};
float max_speed_fov{100.f};
float min_fov{80.f};
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_bash{false};
bool can_jump{false};
Ref<Checkpoint> last_checkpoint{nullptr};

View file

@ -5,7 +5,6 @@
#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 {
@ -24,18 +23,6 @@ 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);
this->get_body()->load_checkpoint();
} 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) {
@ -44,10 +31,6 @@ 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()};
@ -202,6 +185,8 @@ void JumpingState::state_entered() {
Vector3{current.x * impulse.x, impulse.y, current.z * impulse.x}
));
this->get_body()->get_anim()->play("jump");
this->vfx = cast_to<Node3D>(this->get_body()->get_node(NodePath("character/jump_effect")));
this->vfx->set_visible(true);
}
void JumpingState::physics_process(double delta) {
@ -210,23 +195,33 @@ void JumpingState::physics_process(double delta) {
this->get_body()->set_velocity((flattened - (flattened * 0.015f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
}
void JumpingState::state_exited() {
this->vfx->set_visible(false);
}
PlayerState::StateID BashState::get_next_state() const {
if(!this->get_body()->is_on_floor()) {
return FallingState::get_class_static();
} else if (this->timer < 0.0) {
return StandingState::get_class_static();
} else if(Input::get_singleton()->is_action_just_pressed(PlayerBody::split_step_action)) {
return SplitStepState::get_class_static();
} else if(this->timer < 0.0) {
return RunningState::get_class_static();
}
return this->get_class();
}
void BashState::state_entered() {
this->get_body()->get_anim()->play("bash");
this->get_body()->connect("obstacle_broken", this->on_obstacle_broken_cal);
this->timer = this->get_body()->get_bash_time();
this->speed = this->get_body()->get_bash_speed();
(this->vfx = Object::cast_to<Node3D>(this->get_body()->get_node(this->vfx_path)))->set_visible(true);
}
void BashState::on_obstacle_broken() {
this->timer += this->get_body()->get_extra_bash_time();
}
void BashState::process(double delta) {
this->timer -= delta;
}
@ -245,13 +240,37 @@ void BashState::physics_process(double delta) {
void BashState::state_exited() {
this->vfx->set_visible(false);
if(!this->get_body()->is_on_floor()) {
this->get_body()->set_velocity(this->get_body()->get_velocity() / 2.f);
this->get_body()->set_velocity(this->get_body()->get_model()->get_global_basis().get_column(2) * this->get_body()->get_target_speed());
this->get_body()->disconnect("obstacle_broken", this->on_obstacle_broken_cal);
}
void VictoryState::state_entered() {
this->camera = cast_to<Camera3D>(this->get_body()->get_node(NodePath("Camera3D")));
this->camera->set_process(false);
this->camera->set_physics_process(false);
this->get_body()->get_node(NodePath("GameOverEffect"))->queue_free();
this->get_body()->get_anim()->play("victory");
this->camera_target = this->camera->get_global_position() - this->camera->get_global_basis().get_column(2) * 3.f;
}
void VictoryState::process(double delta) {
if(this->get_body()->get_velocity().length() < 0.05) {
this->get_body()->set_velocity(Vector3{});
}
float fov{this->camera->get_fov()};
this->camera->set_fov(Math::move_toward(fov, 30.f, 20.f * (float)delta));
}
void VictoryState::physics_process(double delta) {
Vector3 const velocity{this->get_body()->get_velocity() * 0.8};
this->get_body()->set_velocity(velocity + Vector3{0.f, -50.f, 0.f});
this->camera->look_at(this->camera_target);
this->camera_target.y = MIN(this->camera_target.y + delta * 0.2, 30.f);
}
void PlayerStateMachine::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_current_state"), &self_type::get_current_state);
ClassDB::bind_method(D_METHOD("force_state"), &self_type::force_state);
}
void PlayerStateMachine::_notification(int what) {
@ -284,6 +303,7 @@ void PlayerStateMachine::ready() {
this->add_state<SplitStepState>();
this->add_state<JumpingState>();
this->add_state<BashState>();
this->add_state<VictoryState>();
}
void PlayerStateMachine::try_transition() {
@ -298,3 +318,13 @@ void PlayerStateMachine::try_transition() {
StringName PlayerStateMachine::get_current_state() const {
return this->current_state->get_class();
}
void PlayerStateMachine::force_state(StringName name) {
if(this->states.has(name)) {
this->current_state->state_exited();
this->current_state = this->states[name];
this->current_state->state_entered();
} else {
ERR_FAIL_EDMSG("Attempt to force switch to state that is not registered");
}
}

View file

@ -3,6 +3,8 @@
#include "core/object/object.h"
#include "core/templates/hash_map.h"
#include "core/variant/callable.h"
#include "scene/3d/camera_3d.h"
#include "scene/main/node.h"
class PlayerBody;
@ -30,12 +32,7 @@ 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 {
@ -81,6 +78,9 @@ public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
virtual void physics_process(double delta) override;
virtual void state_exited() override;
private:
Node3D *vfx{nullptr};
};
class BashState : public PlayerState {
@ -88,16 +88,29 @@ class BashState : public PlayerState {
public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
void on_obstacle_broken();
virtual void process(double delta) override;
virtual void physics_process(double delta) override;
virtual void state_exited() override;
private:
Callable on_obstacle_broken_cal{callable_mp(this, &self_type::on_obstacle_broken)};
NodePath vfx_path{"character/bash_attack"};
Node3D *vfx{nullptr};
double timer{0.0};
float speed{0.f};
};
class VictoryState : public PlayerState {
GDCLASS(VictoryState, PlayerState);
public:
virtual void state_entered() override;
virtual void process(double delta) override;
virtual void physics_process(double delta) override;
private:
Camera3D *camera{nullptr};
Vector3 camera_target{};
};
class PlayerStateMachine : public Node {
GDCLASS(PlayerStateMachine, Node);
static void _bind_methods();
@ -108,8 +121,9 @@ class PlayerStateMachine : public Node {
void add_state();
public:
StringName get_current_state() const;
void force_state(StringName name);
template <class TState>
void force_state();
void _force_state();
private:
PlayerBody *body{nullptr};
PlayerState *current_state{nullptr};
@ -128,12 +142,10 @@ void PlayerStateMachine::add_state() {
}
template <class TState>
void PlayerStateMachine::force_state() {
void PlayerStateMachine::_force_state() {
PlayerState::StateID next{TState::get_class_static()};
if(!next.is_empty()) {
this->current_state->state_exited();
this->current_state = this->states[TState::get_class_static()];
this->current_state->state_entered();
this->force_state(next);
}
}

View file

@ -2,9 +2,11 @@
#include "core/object/class_db.h"
#include "going/checkpoint.h"
#include "going/game_over_effect.h"
#include "going/game_ui.h"
#include "going/player_body.h"
#include "going/player_states.h"
#include "going/valley_root.h"
void initialize_going_module(ModuleInitializationLevel p_level) {
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
@ -23,6 +25,8 @@ void initialize_going_module(ModuleInitializationLevel p_level) {
ClassDB::register_class<Checkpoint>();
ClassDB::register_class<CheckpointArea>();
ClassDB::register_class<ReloadArea>();
ClassDB::register_class<GameOverEffect>();
ClassDB::register_class<ValleyRoot>();
}
void uninitialize_going_module(ModuleInitializationLevel p_level) {

View file

@ -0,0 +1,29 @@
#include "valley_root.h"
#include "scene/gui/subviewport_container.h"
double ValleyRoot::render_factor{1.0};
void ValleyRoot::_bind_methods() {
ClassDB::bind_static_method("ValleyRoot", D_METHOD("set_render_factor", "value"), &self_type::set_render_factor);
}
void ValleyRoot::_notification(int what) {
if(Engine::get_singleton()->is_editor_hint()) {
return;
}
switch(what) {
case NOTIFICATION_READY:
this->ready();
break;
}
}
void ValleyRoot::ready() {
if(SubViewportContainer *container{cast_to<SubViewportContainer>(this->get_node(NodePath("SubViewportContainer")))}) {
container->set_stretch_shrink(this->render_factor);
}
}
void ValleyRoot::set_render_factor(double factor) {
self_type::render_factor = factor;
}

View file

@ -0,0 +1,16 @@
#ifndef VALLEY_ROOT_H
#define VALLEY_ROOT_H
#include "scene/main/node.h"
class ValleyRoot : public Node {
GDCLASS(ValleyRoot, Node);
static void _bind_methods();
void _notification(int what);
void ready();
private:
static double render_factor;
public:
static void set_render_factor(double factor);
};
#endif // !VALLEY_ROOT_H

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View file

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b0s8ie05x430t"
path.s3tc="res://.godot/imported/water_albedo.png-d07098f12467bba0e47f29381854daf9.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://materials/water_albedo.png"
dest_files=["res://.godot/imported/water_albedo.png-d07098f12467bba0e47f29381854daf9.s3tc.ctex"]
[params]
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=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

View file

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bwhpeufw6ajnb"
path.s3tc="res://.godot/imported/water_normal.png-c219368caeb27a75b46a8c9459c925d1.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://materials/water_normal.png"
dest_files=["res://.godot/imported/water_normal.png-c219368caeb27a75b46a8c9459c925d1.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://materials/water_normal.png"
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=0

View file

@ -4,8 +4,9 @@
[resource]
resource_name = "leaves"
transparency = 4
transparency = 2
alpha_scissor_threshold = 0.5
alpha_antialiasing_mode = 0
cull_mode = 2
shading_mode = 2
specular_mode = 2
albedo_texture = ExtResource("1_5c4eu")

View file

@ -33,6 +33,12 @@ animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={
"materials": {
"leaves": {
"use_external/enabled": true,
"use_external/path": "uid://bx0x66slifwki"
}
},
"nodes": {
"PATH:Cube": {
"mesh_instance/cast_shadow": 0,

Binary file not shown.

Binary file not shown.

View file

@ -9,7 +9,7 @@ func _on_body_entered(body: Node3D) -> void:
if body.is_class(\"PlayerBody\"):
body.can_bash = true
queue_free()
GameUI.get_singleton().display_message(\"Bash through obstacles by pressing (X) during a split-step\")
GameUI.get_singleton().display_message(\"Bash through obstacles by pressing [img height=\\\"100\\\"]uid://baw7deolvkudx[/img] and [img height=\\\"100\\\"]uid://cfy8lgh61hsxg[/img] simultaneously\")
(body as PlayerBody).save_checkpoint()
func _physics_process(delta):

View file

@ -6,8 +6,8 @@
script/source = "extends Node3D
func _on_area_3d_body_entered(body: Node3D) -> void:
print(\"Body entered \", body.get_path())
if body.is_class(\"PlayerBody\") and body.get_node(\"PlayerStateMachine\").get_current_state() == \"BashState\":
body.emit_signal(\"obstacle_broken\")
queue_free()
"

View file

@ -1,29 +1,190 @@
[gd_scene load_steps=3 format=3 uid="uid://c6p8iu3mpsbwv"]
[gd_scene load_steps=5 format=3 uid="uid://c6p8iu3mpsbwv"]
[ext_resource type="PackedScene" uid="uid://dqjurq1nq1fle" path="res://objects/tre.tscn" id="1_g0g6w"]
[ext_resource type="PackedScene" uid="uid://bwdsh1pco7bf1" path="res://models/props/vines.blend" id="2_iqt14"]
[sub_resource type="GDScript" id="GDScript_g0g6w"]
script/source = "extends Node3D
[sub_resource type="Animation" id="Animation_g0g6w"]
resource_name = "game_over"
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Tree2")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, -7.26657, -8.656, -1.63025, 1, 1, -5.437, -4, -2.488)
tracks/1/type = "rotation_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Tree2")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.288312, 0.538113, 0.762333, 0.214846, 1, 1, 0, 0, 0, 1)
tracks/2/type = "scale_3d"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Tree2")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1)
tracks/3/type = "position_3d"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Tree")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -4.11348, -8.44742, -5.51347, 1, 1, -2.123, -4, -6.727)
tracks/4/type = "rotation_3d"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Tree")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.792182, 0.104192, 0.254308, 0.544903, 1, 1, 0, 0, 0, 1)
tracks/5/type = "scale_3d"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Tree")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, 0.190917, 0.190917, 0.190917, 1, 1, 1, 1, 1)
tracks/6/type = "position_3d"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Tree4")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, 6.3913, -5.60759, -1.16465, 1, 1, 5.118, -4, -1.293)
tracks/7/type = "rotation_3d"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Tree4")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = PackedFloat32Array(0, 1, 0.885791, 0.349205, 0.171122, -0.253273, 1, 1, 0, -0.70826, 0, 0.705952)
tracks/8/type = "scale_3d"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Tree4")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = PackedFloat32Array(0, 1, 0.150617, 0.150617, 0.150617, 1, 1, 1, 1, 1)
tracks/9/type = "position_3d"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("Tree3")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = PackedFloat32Array(0, 1, 2.23542, -9.87989, -1.31789, 1, 1, 1.325, -4, -6.535)
tracks/10/type = "rotation_3d"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("Tree3")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = PackedFloat32Array(0, 1, 0.906533, 0.0410827, 0.307121, -0.286683, 1, 1, 0, 0, 0, 1)
tracks/11/type = "scale_3d"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("Tree3")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = PackedFloat32Array(0, 1, 0.13533, 0.13533, 0.13533, 1, 1, 1, 1, 1)
tracks/12/type = "position_3d"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("vines")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = PackedFloat32Array(0, 1, -3.84568, -5.77872, -3.44804, 1, 1, -2.085, -1, -2.146)
tracks/13/type = "rotation_3d"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("vines")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = PackedFloat32Array(0, 1, 0.815395, -0.170462, -0.424158, -0.355194, 1, 1, 0, 0.455312, 0, 0.890332)
tracks/14/type = "scale_3d"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("vines")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = PackedFloat32Array(0, 1, 0.244831, 0.244831, 0.244831, 1, 1, 1.5, 1.5, 1.5)
tracks/15/type = "position_3d"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("vines2")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = PackedFloat32Array(0, 1, -0.180626, -8.10766, -4.2077, 1, 1, -0.028, -1, -2.888)
tracks/16/type = "rotation_3d"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("vines2")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = PackedFloat32Array(0, 1, 0.95634, 0, 0, -0.292255, 1, 1, 0, 0, 0, 1)
tracks/17/type = "scale_3d"
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/path = NodePath("vines2")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/keys = PackedFloat32Array(0, 1, 0.262036, 0.262036, 0.262036, 1, 1, 1.5, 1.5, 1.5)
tracks/18/type = "position_3d"
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/path = NodePath("vines3")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/keys = PackedFloat32Array(0, 1, 3.39978, -5.91485, -1.31423, 1, 1, 2.925, -1, -1.503)
tracks/19/type = "rotation_3d"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("vines3")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = PackedFloat32Array(0, 1, 0.801512, 0.216846, 0.34856, -0.434812, 1, 1, 0, -0.423211, 0, 0.906031)
tracks/20/type = "scale_3d"
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/path = NodePath("vines3")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/keys = PackedFloat32Array(0, 1, 0.182257, 0.182257, 0.182257, 1, 1, 1.5, 1.5, 1.5)
@export var camera : Camera3D
@export var trees : Array[Node3D]
[sub_resource type="AnimationLibrary" id="AnimationLibrary_iqt14"]
_data = {
&"game_over": SubResource("Animation_g0g6w")
}
func _process(delta: float):
pass
"
[node name="GameOverEffect" type="GameOverEffect"]
[node name="GameOverEffect" type="Node3D" node_paths=PackedStringArray("trees")]
script = SubResource("GDScript_g0g6w")
trees = [NodePath("Tree"), NodePath("Tree3"), NodePath("Tree4"), NodePath("Tree2")]
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
callback_mode_process = 0
libraries = {
&"": SubResource("AnimationLibrary_iqt14")
}
autoplay = "game_over"
speed_scale = 0.0
[node name="Tree" parent="." instance=ExtResource("1_g0g6w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.38125, 0, -6.61966)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.123, -4, -6.727)
[node name="Tree3" parent="." instance=ExtResource("1_g0g6w")]
transform = Transform3D(-0.398413, 0, -0.917206, 0, 1, 0, 0.917206, 0, -0.398413, 2.8449, 0, -4.31524)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.325, -4, -6.535)
[node name="Tree4" parent="." instance=ExtResource("1_g0g6w")]
transform = Transform3D(-0.00326398, 0, -0.999995, 0, 1, 0, 0.999995, 0, -0.00326398, 5.11824, 0, -1.29329)
transform = Transform3D(-0.00326411, 0, -0.999995, 0, 1, 0, 0.999995, 0, -0.00326411, 5.118, -4, -1.293)
[node name="Tree2" parent="." instance=ExtResource("1_g0g6w")]
transform = Transform3D(-0.487951, 0, 0.872871, 0, 1, 0, -0.872871, 0, -0.487951, -5.43739, 1.90735e-06, -2.48827)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.437, -4, -2.488)
[node name="vines" parent="." instance=ExtResource("2_iqt14")]
transform = Transform3D(0.878073, 0, 1.21614, 0, 1.5, 0, -1.21614, 0, 0.878073, -2.085, -1, -2.146)
[node name="vines2" parent="." instance=ExtResource("2_iqt14")]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, -0.028, -1, -2.888)
[node name="vines3" parent="." instance=ExtResource("2_iqt14")]
transform = Transform3D(0.962677, 0, -1.15033, 0, 1.5, 0, 1.15033, 0, 0.962677, 2.925, -1, -1.503)

View file

@ -9,7 +9,7 @@ func _on_body_entered(body: Node3D) -> void:
if body.is_class(\"PlayerBody\"):
body.can_jump = true
queue_free()
GameUI.get_singleton().display_message(\"Jump by pressing (A) during a split-step\")
GameUI.get_singleton().display_message(\"Jump by pressing [img height=\\\"100\\\"]uid://baw7deolvkudx[/img] and [img height=\\\"100\\\"]uid://d1kw2owusg8fn[/img] simultaneously\")
(body as PlayerBody).save_checkpoint()
func _physics_process(delta):

2031
project/objects/level.tscn Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,9 @@
[gd_scene load_steps=6 format=3 uid="uid://dcgsrdacswacl"]
[gd_scene load_steps=7 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://clspx5suh5ywx" path="res://models/player/bash_attack.blend" id="2_uxov2"]
[ext_resource type="PackedScene" uid="uid://dy4yl1paa8whs" path="res://ui/ui.tscn" id="2_ykyjo"]
[ext_resource type="PackedScene" uid="uid://cdyr4yad84cp2" path="res://models/pickups/twirly.blend" id="3_nmc1l"]
[ext_resource type="PackedScene" uid="uid://c6p8iu3mpsbwv" path="res://objects/game_over_effect.tscn" id="4_nmc1l"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bxedw"]
radius = 0.339355
@ -33,11 +34,15 @@ collision_mask = 3
wall_min_slide_angle = 0.785398
floor_max_angle = 0.460767
floor_snap_length = 0.35
acceleration = 15.0
target_speed = 25.0
split_step_time = 0.35
split_step_stop_time = 0.34
jump_impulse = Vector2(0.9, 5)
stopping_deceleration = 40.0
start_speed = 10.0
acceleration = 13.0
split_step_time = 0.3
split_step_stop_time = 0.25
bash_speed = 75.0
bash_time = 0.4
extra_bash_time = 0.2
jump_impulse = Vector2(0.7, 5)
[node name="PlayerStateMachine" type="PlayerStateMachine" parent="."]
unique_name_in_owner = true
@ -51,8 +56,8 @@ transform = Transform3D(-1, -6.18173e-08, -6.18173e-08, -6.71313e-08, 0.99594, 0
fov = 100.0
script = SubResource("GDScript_eqqp1")
dist = 1.75
pivot_height = 2.0
look_target_height = 1.5
pivot_height = 2.1
look_target_height = 2.2
[node name="character" parent="." instance=ExtResource("1_eqqp1")]
unique_name_in_owner = true
@ -61,6 +66,15 @@ unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 6.60846e-09, 1.19557, 0.0755919)
visible = false
[node name="CanvasLayer" parent="." instance=ExtResource("2_ykyjo")]
[node name="jump_effect" type="Node3D" parent="character"]
visible = false
[node name="twirly" parent="character/jump_effect" instance=ExtResource("3_nmc1l")]
transform = Transform3D(0.321382, -0.0898554, 0.0472911, -0.0208723, 0.0951608, 0.322654, -0.099372, -0.310592, 0.085175, -0.190964, 1.56847, 0.0617094)
[node name="twirly2" parent="character/jump_effect" instance=ExtResource("3_nmc1l")]
transform = Transform3D(-0.225283, 0.241709, -0.0664951, -0.11224, -0.0173125, 0.317332, 0.224158, 0.234252, 0.0920642, 0.165191, 1.56847, 0.0617094)
[node name="GameOverEffect" parent="." instance=ExtResource("4_nmc1l")]
[editable path="character"]

View file

@ -17,13 +17,47 @@ config/icon="res://icon.svg"
[display]
window/size/viewport_width=1440
window/size/viewport_height=810
window/size/resizable=false
window/size/mode=3
window/vsync/vsync_mode=0
[input]
ui_accept={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null)
]
}
ui_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
]
}
ui_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
]
}
ui_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
]
}
ui_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
move_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
@ -63,6 +97,7 @@ jump={
bash={
"deadzone": 0.2,
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":true,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null)
]
}

View file

@ -1,12 +1,65 @@
[gd_scene load_steps=2 format=3 uid="uid://cnau7sr4mu3gf"]
[gd_scene load_steps=9 format=3 uid="uid://cnau7sr4mu3gf"]
[ext_resource type="PackedScene" uid="uid://d0w3tum281vei" path="res://objects/level.tscn" id="1_l6cm7"]
[ext_resource type="Texture2D" uid="uid://qxwsryrw0ny4" path="res://rendering/kloppenheim_06_4k.exr" id="2_ekxnf"]
[ext_resource type="Texture2D" uid="uid://pa0il6ab7wn5" path="res://ui/title.svg" id="3_bqqt6"]
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_bqqt6"]
panorama = ExtResource("2_ekxnf")
energy_multiplier = 0.25
[sub_resource type="Sky" id="Sky_x4b8f"]
sky_material = SubResource("PanoramaSkyMaterial_bqqt6")
[sub_resource type="Environment" id="Environment_wu84c"]
background_mode = 2
background_energy_multiplier = 1.84
sky = SubResource("Sky_x4b8f")
ambient_light_source = 3
ssao_radius = 16.0
glow_enabled = true
fog_enabled = true
fog_mode = 1
fog_light_color = Color(0.272901, 0.471156, 0.543814, 1)
fog_light_energy = 2.98
fog_sun_scatter = 0.28
fog_density = 0.0105
fog_sky_affect = 0.0
fog_depth_curve = 1.07178
[sub_resource type="GDScript" id="GDScript_vue75"]
script/source = "extends Button
func _ready():
self.grab_focus()
preload(\"res://scenes/valley.tscn\")
func _on_button_up() -> void:
self.get_tree().change_scene_to_file(\"res://scenes/valley.tscn\")
"
[sub_resource type="GDScript" id="GDScript_ekxnf"]
script/source = "extends HBoxContainer
@onready var container := $\"../../../SubViewportContainer\"
func _ready():
updated_scale()
func updated_scale():
ValleyRoot.set_render_factor(container.stretch_shrink)
$Label.text = \"%.2fx\" % (1.0/container.stretch_shrink)
func _on_lower_pressed() -> void:
container.stretch_shrink += 1
updated_scale()
func _on_increase_pressed() -> void:
container.stretch_shrink -= 1
updated_scale()
"
[node name="MainMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
@ -15,19 +68,105 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Button" type="Button" parent="."]
[node name="SubViewportContainer" type="SubViewportContainer" 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
stretch = true
[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"]
handle_input_locally = false
size = Vector2i(1152, 648)
render_target_update_mode = 4
[node name="Node3D" type="Node3D" parent="SubViewportContainer/SubViewport"]
[node name="Level" parent="SubViewportContainer/SubViewport/Node3D" instance=ExtResource("1_l6cm7")]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="SubViewportContainer/SubViewport/Node3D"]
transform = Transform3D(-0.881476, -0.298896, -0.365596, 7.45058e-09, -0.774194, 0.632949, -0.472228, 0.557929, 0.682434, 0, 2.39942, 0)
light_energy = 1.972
shadow_enabled = true
shadow_opacity = 0.55
shadow_blur = 0.973
directional_shadow_split_1 = 0.039
directional_shadow_split_2 = 0.091
directional_shadow_split_3 = 0.17
directional_shadow_max_distance = 1063.4
[node name="WorldEnvironment" type="WorldEnvironment" parent="SubViewportContainer/SubViewport/Node3D"]
environment = SubResource("Environment_wu84c")
[node name="Camera3D" type="Camera3D" parent="SubViewportContainer/SubViewport/Node3D"]
transform = Transform3D(-0.672263, 0.223072, 0.705904, -3.00783e-08, 0.953523, -0.301321, -0.740312, -0.202567, -0.641018, 311.829, 46.925, 423.07)
[node name="PanelContainer" type="PanelContainer" parent="."]
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -163.0
offset_right = 316.0
grow_vertical = 0
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
layout_mode = 2
[node name="Button" type="Button" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
focus_neighbor_bottom = NodePath("../Resolution/Lower")
theme_override_font_sizes/font_size = 50
text = "Start"
script = SubResource("GDScript_vue75")
[connection signal="button_up" from="Button" to="Button" method="_on_button_up"]
[node name="Label2" type="Label" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
theme_override_font_sizes/font_size = 25
text = "Resolution"
[node name="Resolution" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
script = SubResource("GDScript_ekxnf")
[node name="Lower" type="Button" parent="PanelContainer/VBoxContainer/Resolution"]
layout_mode = 2
focus_neighbor_top = NodePath("../../Button")
focus_neighbor_right = NodePath("../Increase")
theme_override_font_sizes/font_size = 25
text = "<"
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/Resolution"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 25
text = "1x"
horizontal_alignment = 1
[node name="Increase" type="Button" parent="PanelContainer/VBoxContainer/Resolution"]
layout_mode = 2
focus_neighbor_left = NodePath("../Lower")
focus_neighbor_top = NodePath("../../Button")
theme_override_font_sizes/font_size = 25
text = ">"
[node name="TextureRect" type="TextureRect" parent="."]
layout_mode = 1
anchors_preset = 13
anchor_left = 0.5
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -430.0
offset_right = 430.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("3_bqqt6")
expand_mode = 2
stretch_mode = 4
[connection signal="button_up" from="PanelContainer/VBoxContainer/Button" to="PanelContainer/VBoxContainer/Button" method="_on_button_up"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/Resolution/Lower" to="PanelContainer/VBoxContainer/Resolution" method="_on_lower_pressed"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/Resolution/Increase" to="PanelContainer/VBoxContainer/Resolution" method="_on_increase_pressed"]

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,6 @@
<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs/>
<g>
<path stroke="none" fill="#FFFFFF" d="M51.5 28.45 Q50 27 48 27 45.95 27 44.5 28.45 43 29.95 43 32 43 34 44.5 35.45 L44.5 35.5 Q45.95 37 48 37 50 37 51.45 35.5 L51.5 35.45 Q53 34 53 32 53 29.95 51.5 28.5 L51.5 28.45 M40 16 Q40 19.25 37.6 21.6 35.25 24 32 24 28.7 24 26.35 21.6 24 19.25 24 16 24 12.7 26.35 10.35 28.7 8 32 8 35.25 8 37.6 10.35 40 12.7 40 16 M56 32 Q56 35.25 53.6 37.6 51.25 40 48 40 44.7 40 42.35 37.6 40 35.25 40 32 40 28.7 42.35 26.35 44.7 24 48 24 51.25 24 53.6 26.35 56 28.7 56 32 M28.5 19.5 Q29.95 21 32 21 34 21 35.45 19.5 L35.5 19.45 Q37 18 37 16 37 13.95 35.5 12.5 L35.5 12.45 Q34 11 32 11 29.95 11 28.5 12.45 27 13.95 27 16 27 18 28.5 19.45 L28.5 19.5 M12.5 28.45 Q11 29.95 11 32 11 34 12.5 35.45 L12.5 35.5 Q13.95 37 16 37 18 37 19.45 35.5 L19.5 35.45 Q21 34 21 32 21 29.95 19.5 28.5 L19.5 28.45 Q18 27 16 27 13.95 27 12.5 28.45 M40 48 Q40 51.25 37.6 53.6 35.25 56 32 56 28.7 56 26.35 53.6 24 51.25 24 48 24 44.7 26.35 42.35 28.7 40 32 40 35.25 40 37.6 42.35 40 44.7 40 48 M24 32 Q24 35.25 21.6 37.6 19.25 40 16 40 12.7 40 10.35 37.6 8 35.25 8 32 8 28.7 10.35 26.35 12.7 24 16 24 19.25 24 21.6 26.35 24 28.7 24 32"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d1kw2owusg8fn"
path="res://.godot/imported/switch_buttons_down_outline.svg-1a3fd03e9583baf36775de11555aa585.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/switch_buttons_down_outline.svg"
dest_files=["res://.godot/imported/switch_buttons_down_outline.svg-1a3fd03e9583baf36775de11555aa585.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View file

@ -0,0 +1,6 @@
<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs/>
<g>
<path stroke="none" fill="#FFFFFF" d="M44.5 28.5 Q43 29.95 43 32 43 34 44.5 35.45 L44.55 35.5 Q46 37 48 37 50.05 37 51.5 35.5 L51.55 35.5 Q53 34 53 32 53 29.95 51.55 28.5 50.05 27 48 27 46 27 44.55 28.5 L44.5 28.5 M32 24 Q28.75 24 26.4 21.6 24 19.25 24 16 24 12.7 26.4 10.35 28.75 8 32 8 35.3 8 37.65 10.35 40 12.7 40 16 40 19.25 37.65 21.6 35.3 24 32 24 M48 40 Q44.75 40 42.4 37.6 40 35.25 40 32 40 28.7 42.4 26.35 44.75 24 48 24 51.3 24 53.65 26.35 56 28.7 56 32 56 35.25 53.65 37.6 51.3 40 48 40 M35.55 12.5 Q34.05 11 32 11 30 11 28.55 12.5 L28.5 12.5 Q27 13.95 27 16 27 18 28.5 19.45 L28.55 19.5 Q30 21 32 21 34.05 21 35.5 19.5 L35.55 19.5 Q37 18 37 16 37 13.95 35.55 12.5 M16 40 Q12.75 40 10.4 37.6 8 35.25 8 32 8 28.7 10.4 26.35 12.75 24 16 24 19.3 24 21.65 26.35 24 28.7 24 32 24 35.25 21.65 37.6 19.3 40 16 40 M35.55 51.5 Q37 50 37 48 37 45.95 35.55 44.5 34.05 43 32 43 30 43 28.55 44.5 L28.5 44.5 Q27 45.95 27 48 27 50 28.5 51.45 L28.55 51.5 Q30 53 32 53 34.05 53 35.5 51.5 L35.55 51.5 M32 56 Q28.75 56 26.4 53.6 24 51.25 24 48 24 44.7 26.4 42.35 28.75 40 32 40 35.3 40 37.65 42.35 40 44.7 40 48 40 51.25 37.65 53.6 35.3 56 32 56"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfy8lgh61hsxg"
path="res://.godot/imported/switch_buttons_left_outline.svg-85d33baaf9585cc38f3af0151be2d4e3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/switch_buttons_left_outline.svg"
dest_files=["res://.godot/imported/switch_buttons_left_outline.svg-85d33baaf9585cc38f3af0151be2d4e3.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

339
project/ui/title.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 49 KiB

View file

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://pa0il6ab7wn5"
path="res://.godot/imported/title.svg-121a9f6119771c07da42669f5b9da685.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/title.svg"
dest_files=["res://.godot/imported/title.svg-121a9f6119771c07da42669f5b9da685.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View file

@ -40,11 +40,14 @@ expand_mode = 2
[node name="MessageLabel" type="RichTextLabel" parent="."]
unique_name_in_owner = true
anchors_preset = 10
anchors_preset = 15
anchor_right = 1.0
offset_bottom = 195.0
anchor_bottom = 1.0
offset_top = 317.0
grow_horizontal = 2
theme_override_font_sizes/normal_font_size = 60
grow_vertical = 2
theme_override_font_sizes/normal_font_size = 74
bbcode_enabled = true
text = "Good Luck!"
horizontal_alignment = 1
vertical_alignment = 1

View file

@ -0,0 +1,6 @@
<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs/>
<g>
<path stroke="none" fill="#FFFFFF" d="M40 39 L33 39 33 26 40 26 Q41.6 26 42.8 27.2 44 28.4 44 30 44 31.45 43.1 32.5 44 33.6 44 35 44 36.65 42.8 37.8 41.6 39 40 39 M40 31 Q40.45 31 40.7 30.7 L41 30 40.7 29.3 Q40.45 29 40 29 L36 29 36 31 40 31 M16 16 L40 16 Q46.6 16 51.3 20.7 56 25.4 56 32 L56 40 Q56 48 48 48 L16 48 Q8 48 8 40 L8 24 Q8 16 16 16 M40 36 Q40.45 36 40.7 35.7 L41 35 40.7 34.3 Q40.45 34 40 34 L36 34 36 36 40 36 M16 19 Q11 19 11 24 L11 40 Q11 45 16 45 L48 45 Q53 45 53 40 L53 32 Q53 26.65 49.2 22.85 45.35 19 40 19 L16 19 M22 33 L25.05 33 Q25.85 33 26.4 32.4 27 31.85 27 31 27 30.15 26.4 29.55 25.85 29 25 29 L22 29 22 33 M25 36 L22 36 22 39 19 39 19 26 25 26 Q27.05 26 28.5 27.45 30 28.95 30 31 30 33.05 28.5 34.5 L30 39 27 39 26 36 26 35.9 25 36"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 903 B

View file

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://baw7deolvkudx"
path="res://.godot/imported/xbox_rb_outline.svg-5702c48c2cdbf439e00a2a3dd66bfe94.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/xbox_rb_outline.svg"
dest_files=["res://.godot/imported/xbox_rb_outline.svg-5702c48c2cdbf439e00a2a3dd66bfe94.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false