Compare commits

..

8 commits

Author SHA1 Message Date
Sara
f7e07797c8 feat: implemented basic third person movement 2025-07-04 16:01:56 +02:00
Sara
062633c742 feat: reorienting prototype goals 2025-07-04 15:59:45 +02:00
Sara
049ac16541 feat: started work on actors and party members 2025-06-27 00:54:15 +02:00
Sara
80a948686f feat: started designing monarchist camp locale 2025-06-25 13:48:55 +02:00
Sara
8d07ee03fa feat: implemented singleton fully for game state 2025-06-24 14:20:06 +02:00
Sara
1828ebbe21 feat: first game code 2025-06-23 19:48:52 +02:00
Sara
f6e6cf9e55 feat: set engine version to latest 4.4 2025-06-23 19:48:33 +02:00
Sara
37b3a63ae6 feat: initialized template 2025-06-23 19:48:13 +02:00
108 changed files with 892 additions and 1754 deletions

View file

@ -1,6 +0,0 @@
((c++-mode . ((mode . clang-format-on-save)))
(c-mode . ((mode . c++)))
(nil . ((projectile-project-compilation-cmd . "just build")
(projectile-project-run-cmd . "engine/bin/godot.linuxbsd.editor.dev.x86_64.llvm --path project")
(projectile-project-configure-cmd . "engine/bin/godot.linuxbsd.editor.dev.x86_64.llvm --path project -e")
(projectile-project-test-cmd . "engine/bin/godot.linuxbsd.editor.dev.x86.llvm --path project"))))

10
.gitignore vendored
View file

@ -5,18 +5,16 @@
# When configure fails, SCons outputs these
config.log
.sconf_temp
.config
# build artifacts
# build artefacts
.cache/
*.o
compile_commands.json
engine/.github
project/.godot
build/authority.pck
build/authority.x86_64
build/authority.exe
build.zip
# general-purpose cache folder (used by e.g clangd)
.cache
__pycache__

Binary file not shown.

Binary file not shown.

183
design/monarchist_camp.svg Normal file
View file

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="297mm"
height="210mm"
viewBox="0 0 297 210"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="monarchist_camp.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.640567"
inkscape:cx="483.67425"
inkscape:cy="468.43562"
inkscape:window-width="2540"
inkscape:window-height="1367"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
style="display:inline">
<circle
style="fill:none;stroke:none;stroke-width:2"
id="path1"
r="26.849329"
cy="-22.617027"
cx="144.71928"
transform="rotate(30.90333)" />
<circle
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path3"
cx="197.15057"
cy="12.570523"
r="59.961803"
transform="rotate(30.90333)" />
<circle
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path4"
cx="170.88332"
cy="42.191242"
r="20.471628"
transform="rotate(30.90333)" />
<circle
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path5"
cx="157.94936"
cy="3.7319982"
r="19.529419"
transform="rotate(30.90333)" />
<circle
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path6"
cx="223.90398"
cy="-0.37947115"
r="30.321995"
transform="rotate(30.90333)" />
<ellipse
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path7"
cx="174.47501"
cy="77.630127"
rx="6.205318"
ry="59.151665"
transform="rotate(11.27939)" />
<circle
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path8"
cx="193.49632"
cy="-33.014153"
r="13.619201"
transform="rotate(30.90333)" />
<circle
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
id="path9"
cx="224.58922"
cy="46.388348"
r="16.617136"
transform="rotate(30.90333)" />
<path
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
d="m 144.06991,169.24883 -7.19465,31.03241"
id="path10" />
<path
style="fill:none;stroke:#ff3a00;stroke-width:2;stroke-opacity:1"
d="m 166.80343,51.882914 5.05932,-22.12813"
id="path11" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<rect
style="fill:#000000;stroke:none;stroke-width:2;stroke-opacity:1"
id="rect11"
width="17.086163"
height="26.649414"
x="202.4292"
y="92.027176"
transform="rotate(4.15663)" />
<rect
style="fill:#000000;stroke:none;stroke-width:2;stroke-opacity:1"
id="rect11-3"
width="16.747086"
height="23.300817"
x="211.42197"
y="-116.61307"
transform="rotate(67.03562)" />
<rect
style="fill:#000000;stroke:none;stroke-width:2;stroke-opacity:1"
id="rect11-3-1"
width="16.747086"
height="23.300817"
x="153.35806"
y="52.250866"
transform="rotate(25.13231)" />
<rect
style="fill:#000000;stroke:none;stroke-width:2;stroke-opacity:1"
id="rect11-3-1-3"
width="16.747086"
height="23.300817"
x="139.8774"
y="30.531561"
transform="rotate(16.66083)" />
<rect
style="fill:#000000;stroke:none;stroke-width:2;stroke-opacity:1"
id="rect11-3-1-3-6"
width="13.885768"
height="15.52168"
x="-177.2769"
y="-109.64846"
transform="rotate(170.10507)" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-opacity:1"
d="m 168.51515,87.048444 49.7405,-10.74439 -11.59163,-23.78924 -34.05085,-6.36336 z"
id="path12"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-opacity:1"
d="m 167.90348,92.072994 -6.81162,32.060266 3.42606,9.03285 50.86591,9.20609 4.78459,-60.134606 z"
id="path13"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-opacity:1"
d="m 161.76062,139.13159 -9.82191,20.20953 4.20318,13.74019 19.43214,4.89741 29.11417,-13.30994 8.46487,-16.33574 z"
id="path14"
sodipodi:nodetypes="ccccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-opacity:1"
d="m 131.20919,159.8118 8.99249,-4.41574 7.79771,-39.28515 -43.81905,-9.86931 -3.00506,27.21896 17.64521,22.70473 z"
id="path15"
sodipodi:nodetypes="ccccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-opacity:1"
d="m 107.52909,93.556844 c 0.58795,0.35194 40.17069,12.855976 40.17069,12.855976 l 11.52783,-43.543596 -33.50469,-1.2183 z"
id="path16"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#000000;stroke:none;stroke-width:2;stroke-opacity:1"
d="M -10.027839,166.80916 -0.34598048,166.54137 7.8424327,122.34249 25.872585,93.782258 34.797274,63.284639 65.815884,30.44139 108.46648,12.423235 l 8.387,-18.0823962 -127.760166,0.1592669 z"
id="path17"
sodipodi:nodetypes="cccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6 KiB

2
engine

@ -1 +1 @@
Subproject commit 6b76a5a8dc011723033cc8ad2ba3da345daab039
Subproject commit e531f3eb7b13a9adaaf5b15ac9b3aebc4c2030cd

View file

@ -37,8 +37,9 @@ release-windows: build
initialize-template projectname:
# Initializing Template {{projectname}}
sed -i -e "s/PROJECT/{{projectname}}/g" ./modules/PROJECT/register_types.h ./modules/PROJECT/register_types.cpp ./project/project.godot ./project/export_presets.cfg .gitignore
sed -i -e "s/authority/{{projectname}}/" ./justfile
sed "s/change_me/{{projectname}}/" ./justfile
mv ./modules/PROJECT ./modules/{{projectname}}
# Done Initializing, you will still have to update BUILD_NAME in your justfile
format:
# Formatting Custom Modules

Binary file not shown.

View file

@ -0,0 +1,81 @@
#include "actor_body.h"
#include "core/config/engine.h"
#include "core/object/object.h"
#include "macros.h"
void ActorBody::_bind_methods() {
BIND_HPROPERTY(Variant::FLOAT, movement_speed, PROPERTY_HINT_RANGE, "0.0,20.0");
}
void ActorBody::physics_process(double delta) {
if (this->teleport_on_process) {
set_global_position(this->teleport_target);
this->teleport_on_process = false;
force_update_transform();
}
set_velocity(get_movement_direction() * this->movement_speed);
move_and_slide();
}
void ActorBody::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
set_physics_process(true);
set_as_top_level(true);
case NOTIFICATION_PHYSICS_PROCESS:
physics_process(get_physics_process_delta_time());
return;
}
}
void ActorBody::set_movement_direction(Vector3 direction) {
this->mode = Direction;
this->movement_vector = Vector3(direction.x, 0.f, direction.z).normalized();
}
Vector3 ActorBody::get_movement_direction() const {
switch (this->mode) {
case Position: {
Vector3 const direction_3d{ get_global_position().direction_to(get_movement_target()) };
return Vector3{ direction_3d.x, 0.f, direction_3d.z };
} break;
case Direction:
return this->movement_vector;
}
}
void ActorBody::set_movement_target(Vector3 location) {
this->mode = Position;
this->movement_vector = { location.x, 0.f, location.z };
}
Vector3 ActorBody::get_movement_target() const {
switch (this->mode) {
case Position:
return this->movement_vector;
case Direction:
return get_global_position() + this->movement_vector;
}
}
void ActorBody::teleport(Vector3 target) {
this->teleport_target = target;
this->teleport_on_process = true;
}
void ActorBody::set_movement_speed(float speed) {
this->movement_speed = speed;
}
float ActorBody::get_movement_speed() const {
return this->movement_speed;
}
ActorBody::MovementMode ActorBody::get_movement_mode() const {
return this->mode;
}

View file

@ -0,0 +1,37 @@
#ifndef ACTOR_BODY_H
#define ACTOR_BODY_H
#include "scene/3d/physics/character_body_3d.h"
class ActorBody : public CharacterBody3D {
GDCLASS(ActorBody, CharacterBody3D);
static void _bind_methods();
void physics_process(double delta);
public:
// support both directional and positional movement modes
enum MovementMode {
Direction,
Position
};
void _notification(int what);
void set_movement_direction(Vector3 direction);
Vector3 get_movement_direction() const;
void set_movement_target(Vector3 location);
Vector3 get_movement_target() const;
void teleport(Vector3 target);
void set_movement_speed(float speed);
float get_movement_speed() const;
MovementMode get_movement_mode() const;
private:
float movement_speed{ 3.f };
Vector3 movement_vector{ 0.f, 0.f, 0.f };
MovementMode mode{ Direction };
bool teleport_on_process{ false };
Vector3 teleport_target{};
};
#endif //! ACTOR_BODY_H

View file

@ -1,155 +0,0 @@
#include "character.h"
#include "authority/macros.h"
#include "core/config/engine.h"
void CharacterData::_bind_methods() {
BIND_PROPERTY(Variant::FLOAT, speed);
}
void Character::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, data, PROPERTY_HINT_RESOURCE_TYPE, "CharacterData");
}
void Character::physics_process(double delta) {
Vector3 const velocity{ get_velocity() };
Vector3 new_velocity{ velocity };
new_velocity.x = this->world_movement_direction.x;
new_velocity.z = this->world_movement_direction.y;
set_velocity(new_velocity);
if (!velocity.is_zero_approx()) {
move_and_slide();
}
}
void Character::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint() || !this->data.is_valid()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
set_physics_process(true);
return;
case NOTIFICATION_PHYSICS_PROCESS:
physics_process(get_physics_process_delta_time());
return;
}
}
PackedStringArray Character::get_configuration_warnings() const {
PackedStringArray warnings{ super_type::get_configuration_warnings() };
if (this->data.is_null()) {
warnings.push_back("Character requires 'data' to be initialised. To avoid crashes consider adding a placeholder if you intend to programmatically initialise it.");
}
return warnings;
}
void Character::set_movement(Vector2 movement) {
this->world_movement_direction = movement;
}
bool Character::is_moving() const {
return !this->world_movement_direction.is_zero_approx();
}
void CharacterState::_bind_methods() {
BIND_PROPERTY(Variant::BOOL, start_active);
}
void CharacterState::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
this->character = cast_to<Character>(get_parent());
ERR_FAIL_COND_EDMSG(this->character == nullptr, "CharacterState requires parent to be of type Character");
return;
case NOTIFICATION_READY:
if (start_active) {
callable_mp(this, &self_type::set_state_active).call_deferred(true);
}
return;
}
}
PackedStringArray CharacterState::get_configuration_warnings() const {
PackedStringArray warnings{ super_type::get_configuration_warnings() };
if (cast_to<Character>(get_parent()) == nullptr) {
warnings.push_back("CharacterState requires direct Character parent");
}
return warnings;
}
void CharacterState::switch_to_state(String value) {
if (!this->state_active) {
print_error(vformat("Attempt to switch from inactive state %s to new state %s", get_path(), value));
return;
}
set_state_active(false);
stack_state_independent(value);
}
void CharacterState::stack_state_dependent(String value) {
if (!this->state_active) {
print_error(vformat("Attempt to stack dependent state %s from inactive state %s", value, get_path()));
return;
}
Node *node{ get_parent()->get_node(value) };
if (CharacterState * state{ cast_to<CharacterState>(node) }) {
state->depending_state = this;
this->dependent_states.insert(state);
state->set_state_active(true);
}
}
void CharacterState::notify_dependent_inactive(CharacterState *state) {
if (!this->state_active) {
print_error(vformat("Received notification that dependent state %s became inactive, while depending state %s was inactive", state->get_path(), get_path()));
return;
}
this->dependent_states.erase(state);
}
void CharacterState::stack_state_independent(String value) {
if (!this->state_active) {
print_error(vformat("Attempt to stack state %s from inactive state %s", value, get_path()));
return;
}
Node *node{ get_parent()->get_node(value) };
if (CharacterState * state{ cast_to<CharacterState>(node) }) {
state->set_state_active(true);
} else {
print_error(vformat("Attempt to stack nonexistent state %s from %s", value, get_path()));
}
}
void CharacterState::set_state_active(bool active) {
if (this->state_active != active) {
this->state_active = active;
if (active) {
state_entered();
} else {
state_exited();
if (this->depending_state && this->depending_state->state_active) {
this->depending_state->notify_dependent_inactive(this);
}
this->depending_state = nullptr;
for (CharacterState *state : this->dependent_states) {
state->set_state_active(false);
}
this->dependent_states.clear();
}
}
}
bool CharacterState::get_state_active() const {
return this->state_active;
}
Character *CharacterState::get_character() const {
return this->character;
}

View file

@ -1,69 +0,0 @@
#pragma once
#include "authority/macros.h"
#include "core/io/resource.h"
#include "core/templates/hash_set.h"
#include "scene/3d/physics/character_body_3d.h"
class CharacterData : public Resource {
GDCLASS(CharacterData, Resource);
static void _bind_methods();
private:
float speed{};
public:
GET_SET_FNS(float, speed);
};
class Character : public CharacterBody3D {
GDCLASS(Character, CharacterBody3D);
protected:
static void _bind_methods();
void physics_process(double delta);
void _notification(int what);
PackedStringArray get_configuration_warnings() const override;
public:
void set_movement(Vector2 movement);
bool is_moving() const;
private:
Ref<CharacterData> data{};
Vector2 world_movement_direction{};
public:
GET_SET_FNS(Ref<CharacterData>, data);
};
class CharacterState : public Node {
GDCLASS(CharacterState, Node);
static void _bind_methods();
protected:
void _notification(int what);
PackedStringArray get_configuration_warnings() const override;
void switch_to_state(String state);
void stack_state_dependent(String state);
void notify_dependent_inactive(CharacterState *dependent);
void stack_state_independent(String state);
virtual void state_entered() {}
virtual void state_exited() {}
public:
void set_state_active(bool active);
bool get_state_active() const;
Character *get_character() const;
private:
bool start_active{ false };
bool state_active{ false };
Character *character{ nullptr };
HashSet<CharacterState *> dependent_states{};
CharacterState *depending_state{ nullptr };
public:
GET_SET_FNS(bool, start_active);
};

View file

@ -0,0 +1,18 @@
#include "game_state.h"
#include "macros.h"
GameState *GameState::singleton_instance{ nullptr };
void GameState::_bind_methods() {}
GameState::GameState() {
self_type::singleton_instance = this;
}
GameState::~GameState() {
self_type::singleton_instance = nullptr;
}
GameState *GameState::get_singleton() {
return self_type::singleton_instance;
}

View file

@ -0,0 +1,19 @@
#ifndef GAME_STATE_H
#define GAME_STATE_H
#include "core/object/class_db.h"
#include "core/object/object.h"
#include "core/templates/vector.h"
class GameState : public Object {
GDCLASS(GameState, Object);
static void _bind_methods();
static GameState *singleton_instance;
public:
GameState();
virtual ~GameState();
static GameState *get_singleton();
};
#endif // !GAME_STATE_H

View file

@ -17,12 +17,4 @@
ADD_PROPERTY(PropertyInfo(m_type, #m_property), "set_" #m_property, \
"get_" #m_property)
#define GET_SET_FNS(m_type, m_property) \
m_type get_##m_property() const { \
return this->m_property; \
} \
void set_##m_property(m_type value) { \
this->m_property = value; \
}
#endif // !GODOT_EXTRA_MACROS_H

View file

@ -1,13 +0,0 @@
#include "nav_marker.h"
void NavMarker::_bind_methods() {}
void NavMarker::_notification(int what) {
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
this->set_gizmo_extents(3);
return;
}
}

View file

@ -1,19 +0,0 @@
#pragma once
#include "authority/macros.h"
#include "scene/3d/marker_3d.h"
class Character;
class NavMarker : public Marker3D {
GDCLASS(NavMarker, Marker3D);
static void _bind_methods();
protected:
void _notification(int what);
private:
Character *claimed{ nullptr };
public:
GET_SET_FNS(Character *, claimed);
};

View file

@ -1,84 +0,0 @@
#include "party_member_states.h"
#include "authority/nav_marker.h"
#include "authority/player_character.h"
#include "core/config/engine.h"
#include "core/error/error_macros.h"
#include "core/templates/vector.h"
void PartyMemberFollow::_bind_methods() {}
void PartyMemberFollow::process_position_target() {
Vector3 const marker_position{ this->claimed_marker->get_global_position() };
Vector3 const nav_target{ this->nav->get_target_position() };
Vector3 const global_position{ get_character()->get_global_position() };
if (global_position.distance_squared_to(marker_position) < 0.5) {
return;
}
if (nav_target.distance_squared_to(marker_position) > 0.25) {
this->nav->set_target_position(marker_position);
}
if (this->nav->is_navigation_finished()) {
return;
}
Vector3 velocity{ global_position.direction_to(this->nav->get_next_path_position()) };
velocity.y = 0;
if (this->nav->get_avoidance_enabled()) {
this->nav->set_velocity(velocity * get_character()->get_data()->get_speed());
} else {
push_movement_direction(velocity * get_character()->get_data()->get_speed());
}
}
void PartyMemberFollow::push_movement_direction(Vector3 velocity) {
get_character()->set_movement(Vector2{ velocity.x, velocity.z });
}
void PartyMemberFollow::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
this->nav = cast_to<NavigationAgent3D>(get_parent()->get_node(NodePath("%NavigationAgent3D")));
ERR_FAIL_COND_EDMSG(this->nav == nullptr, "PartyMemberFollow cannot initialise without a navigation agent");
return;
case NOTIFICATION_PROCESS:
process_position_target();
return;
}
}
PackedStringArray PartyMemberFollow::get_configuration_warnings() const {
PackedStringArray warnings{ super_type::get_configuration_warnings() };
if (!get_parent()->has_node(NodePath("%NavigationAgent3D")) || !cast_to<NavigationAgent3D>(get_parent()->get_node(NodePath("%NavigationAgent3D")))) {
warnings.push_back("PartyMemberFollow expects a scene sibling of type NavigationAgent3D named with unique name '%NavigationAgent3D'");
}
return warnings;
}
void PartyMemberFollow::state_entered() {
Vector<NavMarker *> const &markers{ PlayerCharacter::get_singleton()->get_party_follow_markers() };
for (NavMarker *marker : markers) {
if (marker->get_claimed() == nullptr) {
marker->set_claimed(get_character());
this->claimed_marker = marker;
if (this->nav->get_avoidance_enabled()) {
this->nav->connect("velocity_computed", callable_mp(this, &self_type::push_movement_direction));
}
set_process(true);
return;
}
}
ERR_FAIL_EDMSG("PartyMemberFollow could not find an unclaimed player follow marker");
set_state_active(false);
}
void PartyMemberFollow::state_exited() {
if (this->claimed_marker) {
this->claimed_marker->set_claimed(nullptr);
this->nav->disconnect("velocity_computed", callable_mp(this, &self_type::push_movement_direction));
set_process(false);
}
}

View file

@ -1,22 +0,0 @@
#pragma once
#include "authority/character.h"
#include "authority/nav_marker.h"
#include "scene/3d/navigation/navigation_agent_3d.h"
class PartyMemberFollow : public CharacterState {
GDCLASS(PartyMemberFollow, CharacterState);
static void _bind_methods();
void process_position_target();
void push_movement_direction(Vector3 velocity);
protected:
void _notification(int what);
PackedStringArray get_configuration_warnings() const override;
void state_entered() override;
void state_exited() override;
private:
NavigationAgent3D *nav{ nullptr };
NavMarker *claimed_marker{ nullptr };
};

View file

@ -0,0 +1,42 @@
#include "player_actor.h"
#include "authority/game_state.h"
#include "authority/player_input.h"
#include "scene/main/viewport.h"
void PlayerActor::_bind_methods() {
}
void PlayerActor::ready() {
PlayerInput *input{ cast_to<PlayerInput>(get_node(NodePath("%PlayerInput"))) };
input->connect(PlayerInput::signal_movement, callable_mp(this, &self_type::input_move));
set_process(true);
}
void PlayerActor::process(double delta) {
Basis const basis{ this->get_viewport()->get_camera_3d()->get_global_basis() };
Vector3 x{ basis.get_column(0) };
x = Vector3{ x.x, 0.f, x.z }.normalized();
Vector3 z{ basis.get_column(2) };
z = Vector3{ z.x, 0.f, z.z }.normalized();
set_movement_direction(x * this->move_input.x + z * this->move_input.y);
}
void PlayerActor::input_move(Vector2 movement) {
this->move_input = movement;
}
void PlayerActor::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
ready();
return;
case NOTIFICATION_PROCESS:
process(get_process_delta_time());
return;
}
}

View file

@ -0,0 +1,20 @@
#ifndef PLAYER_ACTOR_H
#define PLAYER_ACTOR_H
#include "actor_body.h"
class PlayerActor : public ActorBody {
GDCLASS(PlayerActor, ActorBody);
static void _bind_methods();
void ready();
void process(double delta);
void input_move(Vector2 movement);
public:
void _notification(int what);
private:
Vector2 move_input{ 0.f, 0.f };
};
#endif // !PLAYER_ACTOR_H

View file

@ -1,8 +0,0 @@
#pragma once
#include "scene/3d/camera_3d.h"
class PlayerCamera : public Camera3D {
GDCLASS(PlayerCamera, Camera3D);
static void _bind_methods();
};

View file

@ -1,36 +0,0 @@
#include "player_character.h"
#include "authority/nav_marker.h"
void PlayerCharacter::_bind_methods() {}
void PlayerCharacter::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
instance = this;
return;
case NOTIFICATION_READY:
for (Variant var : find_children("*", "NavMarker")) {
if (NavMarker * marker{ cast_to<NavMarker>(var) }) {
this->party_follow_markers.push_back(marker);
}
}
ERR_FAIL_COND_EDMSG(this->party_follow_markers.size() < 4, "PlayerCharacter should have at least 4 follow NavMarkers for party members");
return;
case NOTIFICATION_EXIT_TREE:
if (instance == this) {
instance = nullptr;
}
return;
}
}
PlayerCharacter *PlayerCharacter::instance{ nullptr };
PlayerCharacter *PlayerCharacter::get_singleton() {
return instance;
}

View file

@ -1,21 +0,0 @@
#pragma once
#include "authority/character.h"
#include "authority/macros.h"
#include "authority/nav_marker.h"
class PlayerCharacter : public Character {
GDCLASS(PlayerCharacter, Character);
static void _bind_methods();
protected:
void _notification(int what);
private:
Vector<NavMarker *> party_follow_markers{};
static PlayerCharacter *instance;
public:
static PlayerCharacter *get_singleton();
GET_SET_FNS(Vector<NavMarker *> const &, party_follow_markers);
};

View file

@ -0,0 +1,146 @@
#include "player_input.h"
#include "core/input/input_event.h"
#include "macros.h"
String const PlayerInput::signal_movement{ "movement" };
String const PlayerInput::signal_look{ "look" };
String const PlayerInput::signal_mouselook{ "mouselook" };
void PlayerInput::_bind_methods() {
BIND_PROPERTY(Variant::STRING, action_move_left);
BIND_PROPERTY(Variant::STRING, action_move_right);
BIND_PROPERTY(Variant::STRING, action_move_forward);
BIND_PROPERTY(Variant::STRING, action_move_back);
BIND_PROPERTY(Variant::STRING, action_look_left);
BIND_PROPERTY(Variant::STRING, action_look_right);
BIND_PROPERTY(Variant::STRING, action_look_up);
BIND_PROPERTY(Variant::STRING, action_look_down);
ADD_SIGNAL(MethodInfo(self_type::signal_movement, PropertyInfo(Variant::VECTOR2, "movement_directions")));
ADD_SIGNAL(MethodInfo(self_type::signal_look, PropertyInfo(Variant::VECTOR2, "look_delta")));
ADD_SIGNAL(MethodInfo(self_type::signal_mouselook, PropertyInfo(Variant::VECTOR2, "mouse_delta")));
}
void PlayerInput::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
set_process_unhandled_input(true);
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
return;
}
}
void PlayerInput::unhandled_input(Ref<InputEvent> const &event) {
Input *input{ Input::get_singleton() };
bool is_movement_action{ event->is_action(self_type::action_move_left) };
is_movement_action |= event->is_action(self_type::action_move_right);
is_movement_action |= event->is_action(self_type::action_move_forward);
is_movement_action |= event->is_action(self_type::action_move_back);
if (is_movement_action) {
float const h_axis{ input->get_axis(self_type::action_move_left, self_type::action_move_right) };
float const v_axis{ input->get_axis(self_type::action_move_forward, self_type::action_move_back) };
emit_signal(self_type::signal_movement, Vector2{ h_axis, v_axis });
}
bool is_look_action{ event->is_action(self_type::action_look_left) };
is_look_action |= event->is_action(self_type::action_look_right);
is_look_action |= event->is_action(self_type::action_look_up);
is_look_action |= event->is_action(self_type::action_look_down);
if (is_look_action) {
float const h_axis{ input->get_axis(self_type::action_look_right, self_type::action_look_left) };
float const v_axis{ input->get_axis(self_type::action_look_down, self_type::action_look_up) };
emit_signal(self_type::signal_look, Vector2{ h_axis, v_axis } * this->look_speed);
}
Ref<InputEventMouseMotion> mouse_motion_action{ event };
if (mouse_motion_action.is_valid()) {
Vector2 const velocity{ mouse_motion_action->get_relative() };
emit_signal(self_type::signal_mouselook, velocity * this->mouselook_speed);
}
}
void PlayerInput::set_mouselook_speed(Vector2 speed) {
this->mouselook_speed = speed;
}
Vector2 PlayerInput::get_mouselook_speed() const {
return this->mouselook_speed;
}
void PlayerInput::set_look_speed(Vector2 speed) {
this->look_speed = speed;
}
Vector2 PlayerInput::get_look_speed() const {
return this->look_speed;
}
void PlayerInput::set_action_move_left(String action) {
this->action_move_left = action;
}
String PlayerInput::get_action_move_left() const {
return this->action_move_left;
}
void PlayerInput::set_action_move_right(String action) {
this->action_move_right = action;
}
String PlayerInput::get_action_move_right() const {
return this->action_move_right;
}
void PlayerInput::set_action_move_forward(String action) {
this->action_move_forward = action;
}
String PlayerInput::get_action_move_forward() const {
return this->action_move_forward;
}
void PlayerInput::set_action_move_back(String action) {
this->action_move_back = action;
}
String PlayerInput::get_action_move_back() const {
return this->action_move_back;
}
void PlayerInput::set_action_look_left(String action) {
this->action_look_left = action;
}
String PlayerInput::get_action_look_left() const {
return this->action_look_left;
}
void PlayerInput::set_action_look_right(String action) {
this->action_look_right = action;
}
String PlayerInput::get_action_look_right() const {
return this->action_look_right;
}
void PlayerInput::set_action_look_up(String action) {
this->action_look_up = action;
}
String PlayerInput::get_action_look_up() const {
return this->action_look_up;
}
void PlayerInput::set_action_look_down(String action) {
this->action_look_down = action;
}
String PlayerInput::get_action_look_down() const {
return this->action_look_down;
}

View file

@ -0,0 +1,58 @@
#ifndef PLAYER_INPUT_H
#define PLAYER_INPUT_H
#include "core/input/input_event.h"
#include "scene/main/node.h"
class PlayerInput : public Node {
GDCLASS(PlayerInput, Node);
static void _bind_methods();
public:
void _notification(int what);
virtual void unhandled_input(Ref<InputEvent> const &event) override;
void set_mouselook_speed(Vector2 speed);
Vector2 get_mouselook_speed() const;
void set_look_speed(Vector2 speed);
Vector2 get_look_speed() const;
void set_action_move_left(String action);
String get_action_move_left() const;
void set_action_move_right(String action);
String get_action_move_right() const;
void set_action_move_forward(String action);
String get_action_move_forward() const;
void set_action_move_back(String action);
String get_action_move_back() const;
void set_action_look_left(String action);
String get_action_look_left() const;
void set_action_look_right(String action);
String get_action_look_right() const;
void set_action_look_up(String action);
String get_action_look_up() const;
void set_action_look_down(String action);
String get_action_look_down() const;
public:
static String const signal_movement;
static String const signal_look;
static String const signal_mouselook;
private:
Vector2 mouselook_speed{ 0.001f, 0.001f };
Vector2 look_speed{ 1.75f, 1.75f };
String action_move_left{ "move_left" };
String action_move_right{ "move_right" };
String action_move_forward{ "move_forward" };
String action_move_back{ "move_back" };
String action_look_left{ "look_left" };
String action_look_right{ "look_right" };
String action_look_up{ "look_up" };
String action_look_down{ "look_down" };
};
#endif // !PLAYER_INPUT_H

View file

@ -1,75 +0,0 @@
#include "player_states.h"
#include "core/input/input.h"
#include "core/math/basis.h"
#include "scene/3d/camera_3d.h"
#include "scene/main/viewport.h"
void PlayerInputState::_bind_methods() {}
void PlayerInputState::unhandled_input(Ref<InputEvent> const &what) {
bool const is_move_vertical{ what->is_action("move_forward") || what->is_action("move_backward") };
bool const is_move_horizontal{ what->is_action("move_right") || what->is_action("move_left") };
if (is_move_vertical || is_move_horizontal) {
stack_state_dependent("PlayerMovementState");
get_viewport()->set_input_as_handled();
}
}
void PlayerInputState::state_entered() {
set_process_unhandled_input(true);
}
void PlayerInputState::state_exited() {
set_process_unhandled_input(false);
}
void PlayerMovementState::_bind_methods() {}
void PlayerMovementState::process(double delta) {
Basis const basis{ get_viewport()->get_camera_3d()->get_global_basis() };
Vector2 backward{ basis.get_column(0).x, basis.get_column(0).z };
if (backward.is_zero_approx()) {
backward = Vector2{ basis.get_column(1).x, basis.get_column(1).z };
}
Vector2 const right{ basis.get_column(2).x, basis.get_column(2).z };
get_character()->set_movement((backward.normalized() * this->movement.x + right.normalized() * this->movement.y) * get_character()->get_data()->get_speed());
}
void PlayerMovementState::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
set_process_input(true);
return;
case NOTIFICATION_PROCESS:
process(get_process_delta_time());
return;
}
}
void PlayerMovementState::input(Ref<InputEvent> const &what) {
bool const is_move_vertical{ what->is_action("move_forward") || what->is_action("move_backward") };
bool const is_move_horizontal{ what->is_action("move_right") || what->is_action("move_left") };
if (is_move_vertical || is_move_horizontal) {
this->movement = {
Input::get_singleton()->get_axis("move_left", "move_right"),
Input::get_singleton()->get_axis("move_forward", "move_backward")
};
this->movement.normalize();
}
if (this->get_state_active() && this->movement.is_zero_approx()) {
set_state_active(false);
}
}
void PlayerMovementState::state_entered() {
set_process(true);
}
void PlayerMovementState::state_exited() {
set_process(false);
}

View file

@ -1,29 +0,0 @@
#pragma once
#include "authority/character.h"
class PlayerInputState : public CharacterState {
GDCLASS(PlayerInputState, CharacterState);
static void _bind_methods();
protected:
void unhandled_input(Ref<InputEvent> const &event) override;
void state_entered() override;
void state_exited() override;
};
class PlayerMovementState : public CharacterState {
GDCLASS(PlayerMovementState, CharacterState);
static void _bind_methods();
void ready();
void process(double delta);
protected:
void _notification(int what);
void input(Ref<InputEvent> const &event) override;
void state_entered() override;
void state_exited() override;
private:
Vector2 movement{};
};

View file

@ -1,28 +1,34 @@
#include "register_types.h"
#include "authority/character.h"
#include "authority/nav_marker.h"
#include "authority/party_member_states.h"
#include "authority/player_character.h"
#include "authority/player_states.h"
#include "authority/actor_body.h"
#include "authority/game_state.h"
#include "authority/player_actor.h"
#include "authority/player_input.h"
#include "authority/third_person_camera.h"
#include "core/config/engine.h"
#include "core/object/class_db.h"
GameState *game_state{ nullptr };
void initialize_authority_module(ModuleInitializationLevel p_level) {
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
return;
}
ClassDB::register_class<CharacterData>();
ClassDB::register_class<Character>();
ClassDB::register_class<CharacterState>();
ClassDB::register_class<PlayerCharacter>();
ClassDB::register_class<PlayerInputState>();
ClassDB::register_class<PlayerMovementState>();
ClassDB::register_class<NavMarker>();
ClassDB::register_class<PartyMemberFollow>();
GDREGISTER_CLASS(GameState);
GDREGISTER_CLASS(ActorBody);
GDREGISTER_CLASS(PlayerActor);
GDREGISTER_CLASS(PlayerInput);
GDREGISTER_CLASS(ThirdPersonCamera);
game_state = memnew(GameState);
Engine::get_singleton()->add_singleton(Engine::Singleton("GameState", GameState::get_singleton()));
}
void uninitialize_authority_module(ModuleInitializationLevel p_level) {
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
return;
}
if (game_state) {
memdelete(game_state);
}
}

View file

@ -0,0 +1,54 @@
#include "third_person_camera.h"
#include "player_input.h"
void ThirdPersonCamera::_bind_methods() {
}
void ThirdPersonCamera::ready() {
set_process(true);
if (PlayerInput * player_input{ cast_to<PlayerInput>(get_node(NodePath("%PlayerInput"))) }) {
player_input->connect(PlayerInput::signal_look, callable_mp(this, &self_type::on_look_input));
player_input->connect(PlayerInput::signal_mouselook, callable_mp(this, &self_type::on_mouselook_input));
}
}
void ThirdPersonCamera::process(double delta) {
this->look_rotation += look_rotation_motion * delta;
this->look_rotation.y = CLAMP(this->look_rotation.y, -Math_PI / 2.5, Math_PI / 2.5);
Vector3 pivot{ get_parent_node_3d()->get_global_position() };
pivot.y += this->height;
Vector3 offset{ 0.f, 0.f, this->distance };
offset.rotate({ 1.f, 0.f, 0.f }, this->look_rotation.y);
offset.rotate({ 0.f, 1.f, 0.f }, this->look_rotation.x);
look_at_from_position(pivot + offset, pivot);
}
void ThirdPersonCamera::on_look_input(Vector2 input) {
this->look_rotation_motion = input;
}
void ThirdPersonCamera::on_mouselook_input(Vector2 input) {
this->look_rotation -= input;
}
void ThirdPersonCamera::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
case NOTIFICATION_READY:
ready();
break;
case NOTIFICATION_PROCESS:
process(get_process_delta_time());
break;
}
}
void ThirdPersonCamera::set_base_rotation_speed(Vector2 value) {
this->base_rotation_speed = value;
}
Vector2 ThirdPersonCamera::get_base_rotation_speed() const {
return this->base_rotation_speed;
}

View file

@ -0,0 +1,29 @@
#ifndef THIRD_PERSON_CAMERA_H
#define THIRD_PERSON_CAMERA_H
#include "scene/3d/camera_3d.h"
class ThirdPersonCamera : public Camera3D {
GDCLASS(ThirdPersonCamera, Camera3D);
static void _bind_methods();
void ready();
void process(double delta);
void on_look_input(Vector2 input);
void on_mouselook_input(Vector2 input);
public:
void _notification(int what);
void set_base_rotation_speed(Vector2 value);
Vector2 get_base_rotation_speed() const;
private:
Vector2 look_rotation_motion{ 0.f, 0.f };
Vector2 look_rotation{ 0.f, 0.f };
Vector2 base_rotation_speed{ 0.1f, 0.1f };
float distance{ 3.f };
float height{ 2.2f };
};
#endif // !THIRD_PERSON_CAMERA_H

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://grb3q5nd2uds"
path="res://.godot/imported/character_fem.blend-e169cb46816e89cf00aa8e7f988a0574.scn"
[deps]
source_file="res://assets/characters/player_fem/character_fem.blend"
dest_files=["res://.godot/imported/character_fem.blend-e169cb46816e89cf00aa8e7f988a0574.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://biqq268lccpng"
path.s3tc="res://.godot/imported/Face.png-08c0111f3b71fa077c35243a4c740f6e.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/characters/player_fem/textures/Face.png"
dest_files=["res://.godot/imported/Face.png-08c0111f3b71fa077c35243a4c740f6e.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cwqc2g4616eun"
path.s3tc="res://.godot/imported/Texture.png-98af1a158e1830cbcd0a13178176c442.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/characters/player_fem/textures/Texture.png"
dest_files=["res://.godot/imported/Texture.png-98af1a158e1830cbcd0a13178176c442.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bsdvnyn6nhiaa"
path="res://.godot/imported/character_masc.blend-0037c94467e2e85d7ec685a838d7e95d.scn"
[deps]
source_file="res://assets/characters/player_masc/character_masc.blend"
dest_files=["res://.godot/imported/character_masc.blend-0037c94467e2e85d7ec685a838d7e95d.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b7n0rgtlub4r7"
path.s3tc="res://.godot/imported/Face.png-f5f833f7c71137a9e4aac5fe268e4dd4.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/characters/player_masc/textures/Face.png"
dest_files=["res://.godot/imported/Face.png-f5f833f7c71137a9e4aac5fe268e4dd4.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://lea3dgv2585y"
path.s3tc="res://.godot/imported/Texture.png-51f4b86d2d244a13f05f399cc30a0d6b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/characters/player_masc/textures/Texture.png"
dest_files=["res://.godot/imported/Texture.png-51f4b86d2d244a13f05f399cc30a0d6b.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dw4p3s74f1pdg"
path="res://.godot/imported/cliffs_blockout.blend-f86a374f2c48645fd5614df18445a45a.scn"
[deps]
source_file="res://assets/environments/blockouts/cliffs_blockout.blend"
dest_files=["res://.godot/imported/cliffs_blockout.blend-f86a374f2c48645fd5614df18445a45a.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dwmur2qflotv6"
path.bptc="res://.godot/imported/terrain.png-52ea7eaf6b989ed8d9fc2c0c5a398fdf.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/environments/blockouts/terrain.png"
dest_files=["res://.godot/imported/terrain.png-52ea7eaf6b989ed8d9fc2c0c5a398fdf.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dyt1mwbep2012"
path="res://.godot/imported/flower.blend-a54f993c4db9e1bce792f272b6b1a837.scn"
[deps]
source_file="res://assets/environments/props/flower.blend"
dest_files=["res://.godot/imported/flower.blend-a54f993c4db9e1bce792f272b6b1a837.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://uujfed6yrp8p"
path.s3tc="res://.godot/imported/grass_a.png-df3280112d606c2f3fb6a8ca84baa85d.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/environments/props/grass_a.png"
dest_files=["res://.godot/imported/grass_a.png-df3280112d606c2f3fb6a8ca84baa85d.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://db6ddpj53gl5w"
path="res://.godot/imported/rock_a.blend-b8d8f34d9e140f1b8adb493b605dd07e.scn"
[deps]
source_file="res://assets/environments/props/rock_a.blend"
dest_files=["res://.godot/imported/rock_a.blend-b8d8f34d9e140f1b8adb493b605dd07e.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://517yqaw110pf"
path="res://.godot/imported/rock_b.blend-d76791249d4c14d1c951b842f0208090.scn"
[deps]
source_file="res://assets/environments/props/rock_b.blend"
dest_files=["res://.godot/imported/rock_b.blend-d76791249d4c14d1c951b842f0208090.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://8n8fduklxduk"
path="res://.godot/imported/rock_c.blend-26ab78e8b85061bd62ef5331656df04c.scn"
[deps]
source_file="res://assets/environments/props/rock_c.blend"
dest_files=["res://.godot/imported/rock_c.blend-26ab78e8b85061bd62ef5331656df04c.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bnm0go8negvo7"
path="res://.godot/imported/tree.blend-20cb45b772c5003289278d8ec4060a00.scn"
[deps]
source_file="res://assets/environments/props/tree.blend"
dest_files=["res://.godot/imported/tree.blend-20cb45b772c5003289278d8ec4060a00.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

View file

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cvfsvh8tdpflf"
path.bptc="res://.godot/imported/tree.png-b3baca9a70a35e7b7075603680fb265f.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/environments/props/tree.png"
dest_files=["res://.godot/imported/tree.png-b3baca9a70a35e7b7075603680fb265f.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View file

@ -1,16 +0,0 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://cd4vnmrmj8cj7"]
[resource]
transparency = 2
alpha_scissor_threshold = 0.5
alpha_antialiasing_mode = 0
cull_mode = 1
shading_mode = 0
diffuse_mode = 3
specular_mode = 2
vertex_color_use_as_albedo = true
albedo_color = Color(0.121152334, 0.121152334, 0.121152334, 1)
grow = true
grow_amount = 0.02
proximity_fade_distance = 0.1
stencil_outline_thickness = 0.029

View file

@ -1,17 +0,0 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://02s3lq67141v"]
[resource]
transparency = 2
alpha_scissor_threshold = 0.94
alpha_antialiasing_mode = 0
cull_mode = 1
shading_mode = 0
diffuse_mode = 3
specular_mode = 2
vertex_color_use_as_albedo = true
albedo_color = Color(0.121152334, 0.121152334, 0.121152334, 1)
grow = true
grow_amount = 0.02
proximity_fade_enabled = true
proximity_fade_distance = 0.3
stencil_outline_thickness = 0.029

View file

@ -1,36 +0,0 @@
@tool
extends EditorScenePostImport
var regular_outline_material : StandardMaterial3D
var detail_outline_material : StandardMaterial3D
var thin_outline_material : StandardMaterial3D
func _post_import(root : Node):
regular_outline_material = ResourceLoader.load("res://assets/style/base_outline_material.tres") as StandardMaterial3D
detail_outline_material = ResourceLoader.load("res://assets/style/detail_outline_material.tres") as StandardMaterial3D
thin_outline_material = ResourceLoader.load("res://assets/style/thin_outline_material.tres") as StandardMaterial3D
apply_outline_recursive(root)
return root
func get_flag(node : Node, flag : String) -> bool:
if node.name.contains(flag):
node.name = node.name.erase(node.name.find(flag), flag.length())
return true
else:
return false
func apply_outline_recursive(node : Node):
if node != null:
var outline : bool = not get_flag(node, "-nooutline")
if outline and node is MeshInstance3D:
var detail : bool = get_flag(node, "-detailoutline")
var thin : bool = get_flag(node, "-thinoutline")
var mesh : MeshInstance3D = (node as MeshInstance3D)
if detail and detail_outline_material:
mesh.material_overlay = detail_outline_material
elif thin and thin_outline_material:
mesh.material_overlay = thin_outline_material
elif regular_outline_material:
mesh.material_overlay = regular_outline_material
for child in node.get_children():
apply_outline_recursive(child)

View file

@ -1 +0,0 @@
uid://ba7qlhj5ylm3d

View file

@ -1,22 +0,0 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://vo4kk73alewq"]
[ext_resource type="Material" uid="uid://02s3lq67141v" path="res://assets/style/detail_outline_material.tres" id="1_jjhui"]
[resource]
next_pass = ExtResource("1_jjhui")
transparency = 2
alpha_scissor_threshold = 0.9
alpha_antialiasing_mode = 0
cull_mode = 1
shading_mode = 0
diffuse_mode = 3
specular_mode = 2
vertex_color_use_as_albedo = true
albedo_color = Color(0.121152334, 0.121152334, 0.121152334, 1)
grow = true
grow_amount = 0.007
proximity_fade_distance = 0.1
distance_fade_mode = 1
distance_fade_min_distance = 10.0
distance_fade_max_distance = 9.0
stencil_outline_thickness = 0.029

Binary file not shown.

View file

@ -1,60 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dkq8b07op54lx"
path="res://.godot/imported/bike.blend-8d249f74417ff10660977200f19cdfc5.scn"
[deps]
source_file="res://assets/vehicles/bike.blend"
dest_files=["res://.godot/imported/bike.blend-8d249f74417ff10660977200f19cdfc5.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path="uid://ba7qlhj5ylm3d"
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/gpu_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,4 +0,0 @@
[gd_resource type="CharacterData" format=3 uid="uid://d28pn4xekwh6p"]
[resource]
speed = 2.0

View file

@ -1,4 +0,0 @@
[gd_resource type="CharacterData" format=3 uid="uid://bmudhddb0vedg"]
[resource]
speed = 2.0

View file

@ -18,8 +18,6 @@ dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.cte
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
@ -27,10 +25,6 @@ mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false

View file

@ -0,0 +1,13 @@
[gd_scene load_steps=3 format=3 uid="uid://dkgep77ogr1tv"]
[ext_resource type="Material" uid="uid://cupy5mpdsngcl" path="res://materials/grids/tent.tres" id="1_yfc7x"]
[sub_resource type="BoxMesh" id="BoxMesh_dudpm"]
size = Vector3(3, 1.3, 2)
[node name="Tent" type="Node3D"]
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.658981, 0)
material_override = ExtResource("1_yfc7x")
mesh = SubResource("BoxMesh_dudpm")

39
project/locales/city.tscn Normal file
View file

@ -0,0 +1,39 @@
[gd_scene load_steps=6 format=3 uid="uid://bqaoxvqgrbi3v"]
[ext_resource type="Material" uid="uid://cbuk8uxxuj7j5" path="res://materials/grids/grass.tres" id="1_etye1"]
[ext_resource type="PackedScene" uid="uid://cykd1a23ria6k" path="res://objects/characters/player_actor.tscn" id="3_vuk2b"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_sb1vi"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
[sub_resource type="Sky" id="Sky_vuk2b"]
sky_material = SubResource("ProceduralSkyMaterial_sb1vi")
[sub_resource type="Environment" id="Environment_wwygw"]
background_mode = 2
sky = SubResource("Sky_vuk2b")
tonemap_mode = 2
glow_enabled = true
[node name="City" type="Node"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_wwygw")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0)
shadow_enabled = true
[node name="CampEntrance" type="Node3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.2797, -0.00393486, -42.0831)
[node name="PlayerActor" parent="." instance=ExtResource("3_vuk2b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0171704, -0.00572681, 0.28793)
[node name="CSGBox3D" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.505729, 0)
use_collision = true
size = Vector3(100, 1, 100)
material = ExtResource("1_etye1")

View file

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://ke4yek3xtin5"]
[ext_resource type="Texture2D" uid="uid://cd4cchmulwnc5" path="res://textures/grids/bricks.png" id="1_ustix"]
[resource]
albedo_texture = ExtResource("1_ustix")
uv1_triplanar = true

View file

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cbuk8uxxuj7j5"]
[ext_resource type="Texture2D" uid="uid://f8djywm2jlah" path="res://textures/grids/grass.png" id="1_lqti4"]
[resource]
albedo_texture = ExtResource("1_lqti4")
uv1_triplanar = true

View file

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://blcccgo88gl7c"]
[ext_resource type="Texture2D" uid="uid://br64q04tpxmli" path="res://textures/grids/mud.png" id="1_kexk5"]
[resource]
albedo_texture = ExtResource("1_kexk5")
uv1_triplanar = true

View file

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cupy5mpdsngcl"]
[ext_resource type="Texture2D" uid="uid://bh68a5vqm5h7l" path="res://textures/grids/tent.png" id="1_ifivq"]
[resource]
albedo_texture = ExtResource("1_ifivq")
uv1_triplanar = true

View file

@ -0,0 +1,21 @@
[gd_scene load_steps=3 format=3 uid="uid://cykd1a23ria6k"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_7py3r"]
[sub_resource type="CylinderMesh" id="CylinderMesh_66ixd"]
[node name="PlayerActor" type="PlayerActor"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_7py3r")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
mesh = SubResource("CylinderMesh_66ixd")
[node name="PlayerInput" type="PlayerInput" parent="."]
unique_name_in_owner = true
[node name="Camera3D" type="ThirdPersonCamera" parent="."]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 4.76837e-07, 1.8675, -2.90407)

View file

@ -1,24 +0,0 @@
[gd_scene format=3 uid="uid://dfbdn64i7vfuc"]
[ext_resource type="CharacterData" uid="uid://d28pn4xekwh6p" path="res://data/character_data/fallback_character_data.tres" id="1_0torn"]
[sub_resource type="CylinderMesh" id="CylinderMesh_0torn"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_4iifp"]
[node name="PartyMember" type="Character" unique_id=2124931928]
data = ExtResource("1_0torn")
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=2087924260]
mesh = SubResource("CylinderMesh_0torn")
skeleton = NodePath("../CollisionShape3D")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=705075802]
shape = SubResource("CapsuleShape3D_4iifp")
[node name="PartyMemberFollow" type="PartyMemberFollow" parent="." unique_id=1261360781]
start_active = true
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="." unique_id=1509674092]
unique_name_in_owner = true
avoidance_enabled = true

View file

@ -1,42 +0,0 @@
[gd_scene format=3 uid="uid://dcqd0wo5y5a1g"]
[ext_resource type="CharacterData" uid="uid://bmudhddb0vedg" path="res://data/default_player_character.tres" id="1_jy05a"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vcg8s"]
[sub_resource type="CylinderMesh" id="CylinderMesh_5kd2n"]
[node name="PlayerCharacter" type="PlayerCharacter" unique_id=159035892]
data = ExtResource("1_jy05a")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=511026275]
shape = SubResource("CapsuleShape3D_vcg8s")
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=957221075]
mesh = SubResource("CylinderMesh_5kd2n")
[node name="Camera3D" type="Camera3D" parent="." unique_id=932811285]
transform = Transform3D(-1, 5.660465e-08, -6.662324e-08, 0, 0.762081, 0.64748174, 8.742278e-08, 0.64748174, -0.762081, 9.536743e-07, 5.8584056, -4.4809494)
current = true
far = 1000.0
[node name="PlayerInputState" type="PlayerInputState" parent="." unique_id=1290843255]
start_active = true
[node name="PlayerMovementState" type="PlayerMovementState" parent="." unique_id=71639209]
[node name="NavMarker" type="NavMarker" parent="." unique_id=2076207950]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 2.0248106, 0, -1.4610382)
gizmo_extents = 3.0
[node name="NavMarker2" type="NavMarker" parent="." unique_id=786944405]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -0.54701775, 9.536743e-07, -2.7108493)
gizmo_extents = 3.0
[node name="NavMarker4" type="NavMarker" parent="." unique_id=1781147686]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.8027056, 9.536743e-07, -2.7077246)
gizmo_extents = 3.0
[node name="NavMarker3" type="NavMarker" parent="." unique_id=430426412]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -2.0046833, 9.536743e-07, -1.4623514)
gizmo_extents = 3.0

View file

@ -1,78 +0,0 @@
[gd_scene format=3 uid="uid://bedet0our63p0"]
[ext_resource type="PackedScene" uid="uid://dkq8b07op54lx" path="res://assets/vehicles/bike.blend" id="1_qt1cm"]
[ext_resource type="PackedScene" uid="uid://grb3q5nd2uds" path="res://assets/characters/player_fem/character_fem.blend" id="2_buo3h"]
[sub_resource type="BoxShape3D" id="BoxShape3D_7eqww"]
size = Vector3(0.36328125, 0.5884735, 0.9517517)
[sub_resource type="BoxShape3D" id="BoxShape3D_we6jx"]
size = Vector3(0.21679688, 0.29020843, 0.87223816)
[sub_resource type="BoxShape3D" id="BoxShape3D_kok0e"]
size = Vector3(0.8516388, 0.81409013, 1.4329796)
[sub_resource type="BoxShape3D" id="BoxShape3D_khxbi"]
size = Vector3(0.7451172, 0.59351885, 0.5995445)
[node name="PlayerVehicle" type="VehicleBody3D" unique_id=2037675333]
mass = 400.0
[node name="bike" parent="." unique_id=1819523012 instance=ExtResource("1_qt1cm")]
transform = Transform3D(1.0000004, 0, 0, 0, 1.0000001, 0, 0, 0, 0.9999994, -0.48627073, 0, 0)
[node name="character_fem" parent="bike" unique_id=111626287 instance=ExtResource("2_buo3h")]
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1803684826]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.48627073, 0.7048377, 0.074576735)
shape = SubResource("BoxShape3D_7eqww")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="." unique_id=781828471]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.48627073, 0.8603005, 0.938115)
shape = SubResource("BoxShape3D_we6jx")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="." unique_id=1277628977]
transform = Transform3D(1, 0, 0, 0, 0.9983196, 0.057947356, 0, -0.057947356, 0.9983196, 0.2234863, 0.62375516, 0.6136677)
shape = SubResource("BoxShape3D_kok0e")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="." unique_id=2030366048]
transform = Transform3D(1, 0, 0, 0, 0.72955376, -0.6839234, 0, 0.6839234, 0.72955376, 0.2234863, 0.5898677, -0.092960924)
shape = SubResource("BoxShape3D_khxbi")
[node name="SidecarWheel" type="VehicleWheel3D" parent="." unique_id=1869360183]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.7563137, 0.37474027, 0.7443161)
wheel_roll_influence = 0.3
wheel_radius = 0.389
wheel_rest_length = 0.05
wheel_friction_slip = 1.0
suspension_travel = 0.1
suspension_stiffness = 500.0
suspension_max_force = 10500.0
damping_compression = 10.0
damping_relaxation = 11.0
[node name="BackWheel" type="VehicleWheel3D" parent="." unique_id=128773497]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -0.4791991, 0.37716705, 0.9504494)
use_as_traction = true
wheel_roll_influence = 0.3
wheel_radius = 0.389
wheel_rest_length = 0.05
wheel_friction_slip = 1.0
suspension_travel = 0.1
suspension_stiffness = 500.0
suspension_max_force = 10500.0
damping_compression = 10.0
damping_relaxation = 11.0
[node name="FrontWheel" type="VehicleWheel3D" parent="." unique_id=1222187628]
transform = Transform3D(-1, 6.4255117e-09, 8.7186315e-08, 4.371139e-08, 0.90043265, 0.43499538, -7.5710346e-08, 0.43499538, -0.90043265, -0.479199, 0.3713468, -0.73007745)
use_as_steering = true
wheel_roll_influence = 0.3
wheel_radius = 0.389
wheel_rest_length = 0.05
wheel_friction_slip = 1.0
suspension_travel = 0.1
suspension_stiffness = 500.0
suspension_max_force = 10500.0
damping_compression = 10.0
damping_relaxation = 11.0

View file

@ -8,53 +8,60 @@
config_version=5
[animation]
compatibility/default_parent_skeleton_in_mesh_instance_3d=true
[application]
config/name="authority"
run/main_scene="uid://1qvpc2ej32pd"
config/features=PackedStringArray("4.6", "Forward Plus")
run/main_scene="uid://bqaoxvqgrbi3v"
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
[display]
window/size/viewport_width=1920
window/size/viewport_height=1080
window/vsync/vsync_mode=2
[input]
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)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_right={
"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":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
]
}
move_forward={
"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":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
]
}
move_backward={
move_back={
"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":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
look_left={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null)
]
}
look_right={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null)
]
}
look_up={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null)
]
}
look_down={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
]
}
[physics]
3d/physics_engine="Jolt Physics"
[rendering]
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=3
lights_and_shadows/positional_shadow/soft_shadow_filter_quality=3
shading/overrides/force_vertex_shading=true
anti_aliasing/quality/msaa_3d=1
anti_aliasing/quality/use_debanding=true

View file

@ -1,50 +0,0 @@
[gd_scene format=3 uid="uid://cv0ub3llm3jew"]
[ext_resource type="PackedScene" uid="uid://dcqd0wo5y5a1g" path="res://objects/player_character.tscn" id="1_kyfjp"]
[ext_resource type="PackedScene" uid="uid://dfbdn64i7vfuc" path="res://objects/party_member.tscn" id="2_amxg5"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_kyfjp"]
sky_horizon_color = Color(0.66224277, 0.6717428, 0.6867428, 1)
ground_horizon_color = Color(0.66224277, 0.6717428, 0.6867428, 1)
[sub_resource type="Sky" id="Sky_amxg5"]
sky_material = SubResource("ProceduralSkyMaterial_kyfjp")
[sub_resource type="Environment" id="Environment_3263u"]
background_mode = 2
sky = SubResource("Sky_amxg5")
tonemap_mode = 2
glow_enabled = true
[sub_resource type="NavigationMesh" id="NavigationMesh_amxg5"]
vertices = PackedVector3Array(-8.5, 0.5, -9, -6.5, 0.5, -9, -6.5, 0.5, -49.5, -49.5, 0.5, -7.5, -8.75, 0.5, -7.25, -49.5, 0.5, -49.5, -4.25, 0.5, -9, -4.25, 0.5, -49.5, -2, 0.5, -8.75, 49.5, 0.5, -6.5, 49.5, 0.5, -49.5, -2, 0.5, -6.5, -7.75, 2.5, -8, -7.75, 2.5, -5.25, -3, 2.5, -5.25, -3, 2.5, -8, -49.5, 0.5, -5.75, -8.75, 0.5, -6, -2, 0.5, -4.5, -3.75, 0.5, -4.25, -3.5, 0.5, 49.5, 49.5, 0.5, 49.5, -8.75, 0.5, -4.5, -7, 0.5, -4.25, -49.5, 0.5, 49.5, -7.25, 0.5, 49.5)
polygons = [PackedInt32Array(2, 1, 0), PackedInt32Array(4, 3, 0), PackedInt32Array(0, 3, 5), PackedInt32Array(0, 5, 2), PackedInt32Array(2, 7, 1), PackedInt32Array(1, 7, 6), PackedInt32Array(6, 7, 8), PackedInt32Array(8, 7, 10), PackedInt32Array(8, 10, 9), PackedInt32Array(9, 11, 8), PackedInt32Array(15, 14, 12), PackedInt32Array(12, 14, 13), PackedInt32Array(17, 16, 4), PackedInt32Array(4, 16, 3), PackedInt32Array(18, 11, 9), PackedInt32Array(18, 9, 19), PackedInt32Array(19, 9, 20), PackedInt32Array(20, 9, 21), PackedInt32Array(16, 17, 22), PackedInt32Array(22, 23, 16), PackedInt32Array(16, 23, 25), PackedInt32Array(16, 25, 24), PackedInt32Array(23, 19, 25), PackedInt32Array(25, 19, 20)]
[node name="TestWorld" type="Node3D" unique_id=262419127]
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1185961481]
environment = SubResource("Environment_3263u")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1382994887]
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
shadow_enabled = true
[node name="PlayerCharacter" parent="." unique_id=1435471129 instance=ExtResource("1_kyfjp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
[node name="PartyMember" parent="." unique_id=2124931928 instance=ExtResource("2_amxg5")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 5)
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="." unique_id=357996274]
navigation_mesh = SubResource("NavigationMesh_amxg5")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="NavigationRegion3D" unique_id=885387983]
use_collision = true
[node name="CSGBox3D" type="CSGBox3D" parent="NavigationRegion3D/CSGCombiner3D" unique_id=1853081325]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
size = Vector3(100, 1, 100)
[node name="CSGBox3D2" type="CSGBox3D" parent="NavigationRegion3D/CSGCombiner3D" unique_id=40055740]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.293318, 1.1054688, -6.6544046)
size = Vector3(5.5302734, 2.2109375, 3.6298828)

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -2,8 +2,8 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://csscfssydx1n4"
path.s3tc="res://.godot/imported/sidecar.png-10b8daaf663ef9108162d2fab75bc493.s3tc.ctex"
uid="uid://cd4cchmulwnc5"
path.s3tc="res://.godot/imported/bricks.png-217e783fed9aafaab4854f1be96e4aed.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
@ -11,16 +11,14 @@ metadata={
[deps]
source_file="res://assets/vehicles/sidecar.png"
dest_files=["res://.godot/imported/sidecar.png-10b8daaf663ef9108162d2fab75bc493.s3tc.ctex"]
source_file="res://textures/grids/bricks.png"
dest_files=["res://.godot/imported/bricks.png-217e783fed9aafaab4854f1be96e4aed.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
@ -28,10 +26,6 @@ mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false

Some files were not shown because too many files have changed in this diff Show more