feat: finishing touches
445
materials/title.svg
Normal file
After Width: | Height: | Size: 54 KiB |
200
materials/water.ptex
Normal 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"
|
||||
}
|
67
modules/going/game_over_effect.cpp
Normal 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);
|
||||
}
|
||||
}
|
27
modules/going/game_over_effect.h
Normal 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
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
29
modules/going/valley_root.cpp
Normal 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;
|
||||
}
|
16
modules/going/valley_root.h
Normal 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
|
BIN
project/materials/water_albedo.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
35
project/materials/water_albedo.png.import
Normal 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
|
BIN
project/materials/water_normal.png
Normal file
After Width: | Height: | Size: 3.2 MiB |
35
project/materials/water_normal.png.import
Normal 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
|
|
@ -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")
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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()
|
||||
"
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
@ -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"]
|
||||
|
|
|
@ -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)
|
||||
]
|
||||
}
|
||||
|
||||
|
|
|
@ -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"]
|
||||
|
|
6
project/ui/switch_buttons_down_outline.svg
Normal 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 |
37
project/ui/switch_buttons_down_outline.svg.import
Normal 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
|
6
project/ui/switch_buttons_left_outline.svg
Normal 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 |
37
project/ui/switch_buttons_left_outline.svg.import
Normal 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
After Width: | Height: | Size: 49 KiB |
37
project/ui/title.svg.import
Normal 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
|
|
@ -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
|
||||
|
|
6
project/ui/xbox_rb_outline.svg
Normal 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 |
37
project/ui/xbox_rb_outline.svg.import
Normal 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
|