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")};
|
char *const PlayerBody::move_back_action{const_cast<char*>("move_back")};
|
||||||
|
|
||||||
void PlayerBody::_bind_methods() {
|
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_velocity"), &self_type::get_desired_velocity);
|
||||||
ClassDB::bind_method(D_METHOD("get_desired_direction"), &self_type::get_desired_direction);
|
ClassDB::bind_method(D_METHOD("get_desired_direction"), &self_type::get_desired_direction);
|
||||||
ClassDB::bind_method(D_METHOD("save_checkpoint"), &self_type::save_checkpoint);
|
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, split_step_stop_time);
|
||||||
BIND_PROPERTY(Variant::FLOAT, bash_speed);
|
BIND_PROPERTY(Variant::FLOAT, bash_speed);
|
||||||
BIND_PROPERTY(Variant::FLOAT, bash_time);
|
BIND_PROPERTY(Variant::FLOAT, bash_time);
|
||||||
|
BIND_PROPERTY(Variant::FLOAT, extra_bash_time);
|
||||||
BIND_PROPERTY(Variant::VECTOR2, jump_impulse);
|
BIND_PROPERTY(Variant::VECTOR2, jump_impulse);
|
||||||
BIND_PROPERTY(Variant::FLOAT, model_lean);
|
BIND_PROPERTY(Variant::FLOAT, model_lean);
|
||||||
BIND_PROPERTY(Variant::FLOAT, model_lean_speed);
|
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_jump);
|
||||||
BIND_PROPERTY(Variant::BOOL, can_bash);
|
BIND_PROPERTY(Variant::BOOL, can_bash);
|
||||||
}
|
}
|
||||||
|
@ -97,7 +98,7 @@ void PlayerBody::load_checkpoint() {
|
||||||
this->last_checkpoint->load(this);
|
this->last_checkpoint->load(this);
|
||||||
this->force_update_transform();
|
this->force_update_transform();
|
||||||
this->set_velocity(Vector3{});
|
this->set_velocity(Vector3{});
|
||||||
this->state->force_state<FallingState>();
|
this->state->_force_state<FallingState>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 PlayerBody::get_desired_direction() const {
|
Vector3 PlayerBody::get_desired_direction() const {
|
||||||
|
@ -210,6 +211,14 @@ double PlayerBody::get_bash_time() const {
|
||||||
return this->bash_time;
|
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) {
|
void PlayerBody::set_jump_impulse(Vector2 value) {
|
||||||
this->jump_impulse = value;
|
this->jump_impulse = value;
|
||||||
}
|
}
|
||||||
|
@ -234,14 +243,6 @@ float PlayerBody::get_model_lean_speed() const {
|
||||||
return this->model_lean_speed;
|
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) {
|
void PlayerBody::set_can_jump(bool value) {
|
||||||
this->can_jump = value;
|
this->can_jump = value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,14 +47,14 @@ public:
|
||||||
float get_bash_speed() const;
|
float get_bash_speed() const;
|
||||||
void set_bash_time(double value);
|
void set_bash_time(double value);
|
||||||
double get_bash_time() const;
|
double get_bash_time() const;
|
||||||
|
void set_extra_bash_time(double value);
|
||||||
|
double get_extra_bash_time() const;
|
||||||
void set_jump_impulse(Vector2 value);
|
void set_jump_impulse(Vector2 value);
|
||||||
Vector2 get_jump_impulse() const;
|
Vector2 get_jump_impulse() const;
|
||||||
void set_model_lean(float value);
|
void set_model_lean(float value);
|
||||||
float get_model_lean() const;
|
float get_model_lean() const;
|
||||||
void set_model_lean_speed(float value);
|
void set_model_lean_speed(float value);
|
||||||
float get_model_lean_speed() const;
|
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);
|
void set_can_jump(bool value);
|
||||||
bool get_can_jump() const;
|
bool get_can_jump() const;
|
||||||
void set_can_bash(bool value);
|
void set_can_bash(bool value);
|
||||||
|
@ -76,13 +76,13 @@ private:
|
||||||
double split_step_stop_time{0.5};
|
double split_step_stop_time{0.5};
|
||||||
float bash_speed{100.f};
|
float bash_speed{100.f};
|
||||||
double bash_time{0.25};
|
double bash_time{0.25};
|
||||||
|
double extra_bash_time{0.25};
|
||||||
Vector2 jump_impulse{5.f, 5.f};
|
Vector2 jump_impulse{5.f, 5.f};
|
||||||
float max_speed_fov{100.f};
|
float max_speed_fov{100.f};
|
||||||
float min_fov{80.f};
|
float min_fov{80.f};
|
||||||
double max_delta_fov{100.f};
|
double max_delta_fov{100.f};
|
||||||
float model_lean{0.25f};
|
float model_lean{0.25f};
|
||||||
float model_lean_speed{0.25f};
|
float model_lean_speed{0.25f};
|
||||||
double game_over_speed{1.0/4.0};
|
|
||||||
bool can_bash{false};
|
bool can_bash{false};
|
||||||
bool can_jump{false};
|
bool can_jump{false};
|
||||||
Ref<Checkpoint> last_checkpoint{nullptr};
|
Ref<Checkpoint> last_checkpoint{nullptr};
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "core/typedefs.h"
|
#include "core/typedefs.h"
|
||||||
#include "going/player_body.h"
|
#include "going/player_body.h"
|
||||||
#include "scene/main/scene_tree.h"
|
#include "scene/main/scene_tree.h"
|
||||||
#include "servers/rendering_server.h"
|
|
||||||
|
|
||||||
|
|
||||||
PlayerBody *PlayerState::get_body() const {
|
PlayerBody *PlayerState::get_body() const {
|
||||||
|
@ -24,18 +23,6 @@ PlayerState::StateID StandingState::get_next_state() const {
|
||||||
|
|
||||||
void StandingState::state_entered() {
|
void StandingState::state_entered() {
|
||||||
this->get_body()->get_anim()->play("RESET", 0.1);
|
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) {
|
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));
|
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 {
|
PlayerState::StateID RunningState::get_next_state() const {
|
||||||
Vector3 const velocity{this->get_body()->get_velocity()};
|
Vector3 const velocity{this->get_body()->get_velocity()};
|
||||||
Vector3 const desired{this->get_body()->get_desired_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}
|
Vector3{current.x * impulse.x, impulse.y, current.z * impulse.x}
|
||||||
));
|
));
|
||||||
this->get_body()->get_anim()->play("jump");
|
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) {
|
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});
|
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 {
|
PlayerState::StateID BashState::get_next_state() const {
|
||||||
if(!this->get_body()->is_on_floor()) {
|
if(!this->get_body()->is_on_floor()) {
|
||||||
return FallingState::get_class_static();
|
return FallingState::get_class_static();
|
||||||
} else if (this->timer < 0.0) {
|
} else if(Input::get_singleton()->is_action_just_pressed(PlayerBody::split_step_action)) {
|
||||||
return StandingState::get_class_static();
|
return SplitStepState::get_class_static();
|
||||||
|
} else if(this->timer < 0.0) {
|
||||||
|
return RunningState::get_class_static();
|
||||||
}
|
}
|
||||||
return this->get_class();
|
return this->get_class();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BashState::state_entered() {
|
void BashState::state_entered() {
|
||||||
this->get_body()->get_anim()->play("bash");
|
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->timer = this->get_body()->get_bash_time();
|
||||||
this->speed = this->get_body()->get_bash_speed();
|
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);
|
(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) {
|
void BashState::process(double delta) {
|
||||||
this->timer -= delta;
|
this->timer -= delta;
|
||||||
}
|
}
|
||||||
|
@ -245,13 +240,37 @@ void BashState::physics_process(double delta) {
|
||||||
|
|
||||||
void BashState::state_exited() {
|
void BashState::state_exited() {
|
||||||
this->vfx->set_visible(false);
|
this->vfx->set_visible(false);
|
||||||
if(!this->get_body()->is_on_floor()) {
|
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()->set_velocity(this->get_body()->get_velocity() / 2.f);
|
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() {
|
void PlayerStateMachine::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_current_state"), &self_type::get_current_state);
|
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) {
|
void PlayerStateMachine::_notification(int what) {
|
||||||
|
@ -284,6 +303,7 @@ void PlayerStateMachine::ready() {
|
||||||
this->add_state<SplitStepState>();
|
this->add_state<SplitStepState>();
|
||||||
this->add_state<JumpingState>();
|
this->add_state<JumpingState>();
|
||||||
this->add_state<BashState>();
|
this->add_state<BashState>();
|
||||||
|
this->add_state<VictoryState>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerStateMachine::try_transition() {
|
void PlayerStateMachine::try_transition() {
|
||||||
|
@ -298,3 +318,13 @@ void PlayerStateMachine::try_transition() {
|
||||||
StringName PlayerStateMachine::get_current_state() const {
|
StringName PlayerStateMachine::get_current_state() const {
|
||||||
return this->current_state->get_class();
|
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/object/object.h"
|
||||||
#include "core/templates/hash_map.h"
|
#include "core/templates/hash_map.h"
|
||||||
|
#include "core/variant/callable.h"
|
||||||
|
#include "scene/3d/camera_3d.h"
|
||||||
#include "scene/main/node.h"
|
#include "scene/main/node.h"
|
||||||
class PlayerBody;
|
class PlayerBody;
|
||||||
|
|
||||||
|
@ -30,12 +32,7 @@ class StandingState : public PlayerState {
|
||||||
public:
|
public:
|
||||||
virtual StateID get_next_state() const override;
|
virtual StateID get_next_state() const override;
|
||||||
virtual void state_entered() override;
|
virtual void state_entered() override;
|
||||||
virtual void process(double delta) override;
|
|
||||||
virtual void physics_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 {
|
class RunningState : public PlayerState {
|
||||||
|
@ -81,6 +78,9 @@ public:
|
||||||
virtual StateID get_next_state() const override;
|
virtual StateID get_next_state() const override;
|
||||||
virtual void state_entered() override;
|
virtual void state_entered() override;
|
||||||
virtual void physics_process(double delta) override;
|
virtual void physics_process(double delta) override;
|
||||||
|
virtual void state_exited() override;
|
||||||
|
private:
|
||||||
|
Node3D *vfx{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
class BashState : public PlayerState {
|
class BashState : public PlayerState {
|
||||||
|
@ -88,16 +88,29 @@ class BashState : public PlayerState {
|
||||||
public:
|
public:
|
||||||
virtual StateID get_next_state() const override;
|
virtual StateID get_next_state() const override;
|
||||||
virtual void state_entered() override;
|
virtual void state_entered() override;
|
||||||
|
void on_obstacle_broken();
|
||||||
virtual void process(double delta) override;
|
virtual void process(double delta) override;
|
||||||
virtual void physics_process(double delta) override;
|
virtual void physics_process(double delta) override;
|
||||||
virtual void state_exited() override;
|
virtual void state_exited() override;
|
||||||
private:
|
private:
|
||||||
|
Callable on_obstacle_broken_cal{callable_mp(this, &self_type::on_obstacle_broken)};
|
||||||
NodePath vfx_path{"character/bash_attack"};
|
NodePath vfx_path{"character/bash_attack"};
|
||||||
Node3D *vfx{nullptr};
|
Node3D *vfx{nullptr};
|
||||||
double timer{0.0};
|
double timer{0.0};
|
||||||
float speed{0.f};
|
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 {
|
class PlayerStateMachine : public Node {
|
||||||
GDCLASS(PlayerStateMachine, Node);
|
GDCLASS(PlayerStateMachine, Node);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
@ -108,8 +121,9 @@ class PlayerStateMachine : public Node {
|
||||||
void add_state();
|
void add_state();
|
||||||
public:
|
public:
|
||||||
StringName get_current_state() const;
|
StringName get_current_state() const;
|
||||||
|
void force_state(StringName name);
|
||||||
template <class TState>
|
template <class TState>
|
||||||
void force_state();
|
void _force_state();
|
||||||
private:
|
private:
|
||||||
PlayerBody *body{nullptr};
|
PlayerBody *body{nullptr};
|
||||||
PlayerState *current_state{nullptr};
|
PlayerState *current_state{nullptr};
|
||||||
|
@ -128,12 +142,10 @@ void PlayerStateMachine::add_state() {
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class TState>
|
template <class TState>
|
||||||
void PlayerStateMachine::force_state() {
|
void PlayerStateMachine::_force_state() {
|
||||||
PlayerState::StateID next{TState::get_class_static()};
|
PlayerState::StateID next{TState::get_class_static()};
|
||||||
if(!next.is_empty()) {
|
if(!next.is_empty()) {
|
||||||
this->current_state->state_exited();
|
this->force_state(next);
|
||||||
this->current_state = this->states[TState::get_class_static()];
|
|
||||||
this->current_state->state_entered();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
|
|
||||||
#include "core/object/class_db.h"
|
#include "core/object/class_db.h"
|
||||||
#include "going/checkpoint.h"
|
#include "going/checkpoint.h"
|
||||||
|
#include "going/game_over_effect.h"
|
||||||
#include "going/game_ui.h"
|
#include "going/game_ui.h"
|
||||||
#include "going/player_body.h"
|
#include "going/player_body.h"
|
||||||
#include "going/player_states.h"
|
#include "going/player_states.h"
|
||||||
|
#include "going/valley_root.h"
|
||||||
|
|
||||||
void initialize_going_module(ModuleInitializationLevel p_level) {
|
void initialize_going_module(ModuleInitializationLevel p_level) {
|
||||||
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
|
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<Checkpoint>();
|
||||||
ClassDB::register_class<CheckpointArea>();
|
ClassDB::register_class<CheckpointArea>();
|
||||||
ClassDB::register_class<ReloadArea>();
|
ClassDB::register_class<ReloadArea>();
|
||||||
|
ClassDB::register_class<GameOverEffect>();
|
||||||
|
ClassDB::register_class<ValleyRoot>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninitialize_going_module(ModuleInitializationLevel p_level) {
|
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]
|
||||||
resource_name = "leaves"
|
resource_name = "leaves"
|
||||||
transparency = 4
|
transparency = 2
|
||||||
|
alpha_scissor_threshold = 0.5
|
||||||
|
alpha_antialiasing_mode = 0
|
||||||
cull_mode = 2
|
cull_mode = 2
|
||||||
shading_mode = 2
|
|
||||||
specular_mode = 2
|
specular_mode = 2
|
||||||
albedo_texture = ExtResource("1_5c4eu")
|
albedo_texture = ExtResource("1_5c4eu")
|
||||||
|
|
|
@ -33,6 +33,12 @@ animation/remove_immutable_tracks=true
|
||||||
animation/import_rest_as_RESET=false
|
animation/import_rest_as_RESET=false
|
||||||
import_script/path=""
|
import_script/path=""
|
||||||
_subresources={
|
_subresources={
|
||||||
|
"materials": {
|
||||||
|
"leaves": {
|
||||||
|
"use_external/enabled": true,
|
||||||
|
"use_external/path": "uid://bx0x66slifwki"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"PATH:Cube": {
|
"PATH:Cube": {
|
||||||
"mesh_instance/cast_shadow": 0,
|
"mesh_instance/cast_shadow": 0,
|
||||||
|
|
|
@ -9,7 +9,7 @@ func _on_body_entered(body: Node3D) -> void:
|
||||||
if body.is_class(\"PlayerBody\"):
|
if body.is_class(\"PlayerBody\"):
|
||||||
body.can_bash = true
|
body.can_bash = true
|
||||||
queue_free()
|
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()
|
(body as PlayerBody).save_checkpoint()
|
||||||
|
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
script/source = "extends Node3D
|
script/source = "extends Node3D
|
||||||
|
|
||||||
func _on_area_3d_body_entered(body: Node3D) -> void:
|
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\":
|
if body.is_class(\"PlayerBody\") and body.get_node(\"PlayerStateMachine\").get_current_state() == \"BashState\":
|
||||||
|
body.emit_signal(\"obstacle_broken\")
|
||||||
queue_free()
|
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://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"]
|
[sub_resource type="Animation" id="Animation_g0g6w"]
|
||||||
script/source = "extends Node3D
|
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
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_iqt14"]
|
||||||
@export var trees : Array[Node3D]
|
_data = {
|
||||||
|
&"game_over": SubResource("Animation_g0g6w")
|
||||||
|
}
|
||||||
|
|
||||||
func _process(delta: float):
|
[node name="GameOverEffect" type="GameOverEffect"]
|
||||||
pass
|
|
||||||
"
|
|
||||||
|
|
||||||
[node name="GameOverEffect" type="Node3D" node_paths=PackedStringArray("trees")]
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||||
script = SubResource("GDScript_g0g6w")
|
callback_mode_process = 0
|
||||||
trees = [NodePath("Tree"), NodePath("Tree3"), NodePath("Tree4"), NodePath("Tree2")]
|
libraries = {
|
||||||
|
&"": SubResource("AnimationLibrary_iqt14")
|
||||||
|
}
|
||||||
|
autoplay = "game_over"
|
||||||
|
speed_scale = 0.0
|
||||||
|
|
||||||
[node name="Tree" parent="." instance=ExtResource("1_g0g6w")]
|
[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")]
|
[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")]
|
[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")]
|
[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\"):
|
if body.is_class(\"PlayerBody\"):
|
||||||
body.can_jump = true
|
body.can_jump = true
|
||||||
queue_free()
|
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()
|
(body as PlayerBody).save_checkpoint()
|
||||||
|
|
||||||
func _physics_process(delta):
|
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://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://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"]
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bxedw"]
|
||||||
radius = 0.339355
|
radius = 0.339355
|
||||||
|
@ -33,11 +34,15 @@ collision_mask = 3
|
||||||
wall_min_slide_angle = 0.785398
|
wall_min_slide_angle = 0.785398
|
||||||
floor_max_angle = 0.460767
|
floor_max_angle = 0.460767
|
||||||
floor_snap_length = 0.35
|
floor_snap_length = 0.35
|
||||||
acceleration = 15.0
|
stopping_deceleration = 40.0
|
||||||
target_speed = 25.0
|
start_speed = 10.0
|
||||||
split_step_time = 0.35
|
acceleration = 13.0
|
||||||
split_step_stop_time = 0.34
|
split_step_time = 0.3
|
||||||
jump_impulse = Vector2(0.9, 5)
|
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="."]
|
[node name="PlayerStateMachine" type="PlayerStateMachine" parent="."]
|
||||||
unique_name_in_owner = true
|
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
|
fov = 100.0
|
||||||
script = SubResource("GDScript_eqqp1")
|
script = SubResource("GDScript_eqqp1")
|
||||||
dist = 1.75
|
dist = 1.75
|
||||||
pivot_height = 2.0
|
pivot_height = 2.1
|
||||||
look_target_height = 1.5
|
look_target_height = 2.2
|
||||||
|
|
||||||
[node name="character" parent="." instance=ExtResource("1_eqqp1")]
|
[node name="character" parent="." instance=ExtResource("1_eqqp1")]
|
||||||
unique_name_in_owner = true
|
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)
|
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 6.60846e-09, 1.19557, 0.0755919)
|
||||||
visible = false
|
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"]
|
[editable path="character"]
|
||||||
|
|
|
@ -17,13 +17,47 @@ config/icon="res://icon.svg"
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/size/viewport_width=1440
|
window/size/mode=3
|
||||||
window/size/viewport_height=810
|
|
||||||
window/size/resizable=false
|
|
||||||
window/vsync/vsync_mode=0
|
window/vsync/vsync_mode=0
|
||||||
|
|
||||||
[input]
|
[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={
|
move_left={
|
||||||
"deadzone": 0.2,
|
"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)
|
"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={
|
bash={
|
||||||
"deadzone": 0.2,
|
"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)
|
"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"]
|
[sub_resource type="GDScript" id="GDScript_vue75"]
|
||||||
script/source = "extends Button
|
script/source = "extends Button
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
self.grab_focus()
|
||||||
|
preload(\"res://scenes/valley.tscn\")
|
||||||
|
|
||||||
func _on_button_up() -> void:
|
func _on_button_up() -> void:
|
||||||
self.get_tree().change_scene_to_file(\"res://scenes/valley.tscn\")
|
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"]
|
[node name="MainMenu" type="Control"]
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
anchors_preset = 15
|
anchors_preset = 15
|
||||||
|
@ -15,19 +68,105 @@ anchor_bottom = 1.0
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
grow_vertical = 2
|
grow_vertical = 2
|
||||||
|
|
||||||
[node name="Button" type="Button" parent="."]
|
[node name="SubViewportContainer" type="SubViewportContainer" parent="."]
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
anchors_preset = 15
|
anchors_preset = 15
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 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_horizontal = 2
|
||||||
grow_vertical = 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"
|
text = "Start"
|
||||||
script = SubResource("GDScript_vue75")
|
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="."]
|
[node name="MessageLabel" type="RichTextLabel" parent="."]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
anchors_preset = 10
|
anchors_preset = 15
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
offset_bottom = 195.0
|
anchor_bottom = 1.0
|
||||||
|
offset_top = 317.0
|
||||||
grow_horizontal = 2
|
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!"
|
text = "Good Luck!"
|
||||||
horizontal_alignment = 1
|
horizontal_alignment = 1
|
||||||
vertical_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
|