Compare commits

...

12 Commits

Author SHA1 Message Date
1a4b2f4c19 Ended with remapping and removed old junk
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 20s
Create tag and build when new code gets to main / Export (push) Successful in 10m34s
2026-01-12 15:41:43 +01:00
52a9c3f120 Remapped some inputs and added slide, slam and parry mappings 2026-01-12 14:58:43 +01:00
2301884418 added a wall jump section in the GYM 2026-01-12 12:01:40 +01:00
04054cfeae Added ground-like movement (i.e. air control when close to ground) and wall jumping away from the wall is always possible even when facing it 2026-01-12 11:52:35 +01:00
66be7838bb buffered inputs revamped and added mantle jumps and dashed
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 21s
Create tag and build when new code gets to main / Export (push) Successful in 10m30s
2026-01-11 18:14:53 +01:00
1eb65d1520 some shader work and improved mantle feel 2026-01-11 17:09:58 +01:00
f2a39316ba shader changes that don't do anything
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 9m48s
2026-01-07 17:11:49 +01:00
fffd8c947b implementing jump input buffering on grounded
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 18s
Create tag and build when new code gets to main / Export (push) Successful in 9m47s
2026-01-07 09:58:18 +01:00
a1d57d6a1a some tuto fixing
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 9m49s
2026-01-06 16:35:17 +01:00
941205af2b small gravity and jump balancing, removed wall jumping coyote times
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 9m34s
2026-01-06 16:08:39 +01:00
6c2ad89687 fixing the manlting into geo
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 9m42s
2026-01-06 12:36:38 +01:00
59494f9e98 updating CI to build for linux as well
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 9m34s
2025-12-25 09:37:51 +01:00
26 changed files with 1113 additions and 1036 deletions

View File

@@ -54,27 +54,12 @@ jobs:
- name: Import resources and build solution - name: Import resources and build solution
run: | run: |
godot --headless --editor --build-solutions --quit --import --path $PWD godot --headless --editor --build-solutions --quit --import --path $PWD
- name: Build Windows - name: Build Windows
run: | run: |
mkdir -v -p build/windows mkdir -v -p build/windows
godot --headless --verbose --build-solutions --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe godot --headless --verbose --build-solutions --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
zip -r Windows.zip build/windows zip -r Windows.zip build/windows
- name: Build Windows ARM
run: |
mkdir -v -p build/windowsArm
godot --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe
zip -r WindowsArm.zip build/windowsArm
# - name: Linux Build
# run: |
# mkdir -v -p build/linux
# godot --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
# zip -r Linux.zip build/linux
- name: Mac Build
run: |
mkdir -v -p build/mac
godot --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
zip -r Mac.zip build/mac
- name: Upload to Itch - name: Upload to Itch
uses: KikimoraGames/itch-publish@v0.0.3 uses: KikimoraGames/itch-publish@v0.0.3
with: with:
@@ -84,6 +69,12 @@ jobs:
buildNumber: ${{ needs.BumpTag.outputs.tag_name }} buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
gameData: Windows.zip gameData: Windows.zip
buildChannel: windows buildChannel: windows
- name: Build Windows ARM
run: |
mkdir -v -p build/windowsArm
godot --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe
zip -r WindowsArm.zip build/windowsArm
- name: Upload to Itch - name: Upload to Itch
uses: KikimoraGames/itch-publish@v0.0.3 uses: KikimoraGames/itch-publish@v0.0.3
with: with:
@@ -93,15 +84,27 @@ jobs:
buildNumber: ${{ needs.BumpTag.outputs.tag_name }} buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
gameData: WindowsArm.zip gameData: WindowsArm.zip
buildChannel: windows-arm buildChannel: windows-arm
# - name: Upload to Itch
# uses: KikimoraGames/itch-publish@v0.0.3 - name: Linux Build
# with: run: |
# butlerApiKey: ${{ secrets.BUTLER_TOKEN }} mkdir -v -p build/linux
# itchUsername: ${{ env.ITCHIO_USERNAME }} godot --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
# itchGameId: ${{ env.ITCHIO_GAMEID }} zip -r Linux.zip build/linux
# buildNumber: ${{ needs.BumpTag.outputs.tag_name }} - name: Upload to Itch
# gameData: Linux.zip uses: KikimoraGames/itch-publish@v0.0.3
# buildChannel: linux with:
butlerApiKey: ${{ secrets.BUTLER_TOKEN }}
itchUsername: ${{ env.ITCHIO_USERNAME }}
itchGameId: ${{ env.ITCHIO_GAMEID }}
buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
gameData: Linux.zip
buildChannel: linux
- name: Mac Build
run: |
mkdir -v -p build/mac
godot --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
zip -r Mac.zip build/mac
- name: Upload to Itch - name: Upload to Itch
uses: KikimoraGames/itch-publish@v0.0.3 uses: KikimoraGames/itch-publish@v0.0.3
with: with:

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@
.import/ .import/
/builds /builds
/communication
# Imported translations (automatically generated from CSV files) # Imported translations (automatically generated from CSV files)
*.translation *.translation

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,7 @@ shader_parameter/floorRoughnessMap = ExtResource("4_rir86")
shader_parameter/floorNormalMap = ExtResource("3_f1b6h") shader_parameter/floorNormalMap = ExtResource("3_f1b6h")
shader_parameter/floorHeightMap = ExtResource("2_0e3id") shader_parameter/floorHeightMap = ExtResource("2_0e3id")
shader_parameter/floorUvScale = 0.5 shader_parameter/floorUvScale = 0.5
shader_parameter/enablePom = true shader_parameter/enablePom = false
shader_parameter/heightMinLayers = 8 shader_parameter/heightMinLayers = 8
shader_parameter/heightMaxLayers = 64 shader_parameter/heightMaxLayers = 64
shader_parameter/heightScale = 0.08 shader_parameter/heightScale = 0.08

View File

@@ -28,6 +28,7 @@ uniform float heightScale = 1.0;
varying vec3 worldPos; varying vec3 worldPos;
varying vec3 worldNormal; varying vec3 worldNormal;
varying vec3 diffuse;
void vertex() { void vertex() {
@@ -177,12 +178,14 @@ void fragment() {
// sample and output // sample and output
SPECULAR = specular; SPECULAR = specular;
ALBEDO = triplanarSample(texCoordX, texCoordY, texCoordZ, blend, yDot).rgb; ALBEDO = triplanarSample(texCoordX, texCoordY, texCoordZ, blend, yDot).rgb;
diffuse = ALBEDO;
ROUGHNESS = triplanarRoughness(texCoordX, texCoordY, texCoordZ, blend, yDot).r; ROUGHNESS = triplanarRoughness(texCoordX, texCoordY, texCoordZ, blend, yDot).r;
NORMAL = mix(worldNormal, triplanarNormal(yDot, texCoordX, texCoordY, texCoordZ, blend), normalMapStrength); NORMAL = mix(worldNormal, triplanarNormal(yDot, texCoordX, texCoordY, texCoordZ, blend), normalMapStrength);
NORMAL = normalize((VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz); NORMAL = normalize((VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
} }
//void light() { void light() {
// // Called for every pixel for every light affecting the material. float lambert = clamp(dot(NORMAL, LIGHT), 0.0, 1.0);
// // Uncomment to replace the default light processing function with this one. float halfLambert = pow(lambert*0.5 + 0.5, 5);
//} DIFFUSE_LIGHT += halfLambert * ATTENUATION * LIGHT_COLOR / PI;
}

View File

@@ -31,7 +31,7 @@ shader_parameter/floorRoughnessMap = ExtResource("4_4vhk1")
shader_parameter/floorNormalMap = ExtResource("3_ytvoj") shader_parameter/floorNormalMap = ExtResource("3_ytvoj")
shader_parameter/floorHeightMap = ExtResource("2_4vhk1") shader_parameter/floorHeightMap = ExtResource("2_4vhk1")
shader_parameter/floorUvScale = 0.5 shader_parameter/floorUvScale = 0.5
shader_parameter/enablePom = true shader_parameter/enablePom = false
shader_parameter/heightMinLayers = 8 shader_parameter/heightMinLayers = 8
shader_parameter/heightMaxLayers = 64 shader_parameter/heightMaxLayers = 64
shader_parameter/heightScale = 0.2 shader_parameter/heightScale = 0.2

View File

@@ -27,7 +27,7 @@ shader_parameter/floorRoughnessMap = ExtResource("4_ob11h")
shader_parameter/floorNormalMap = ExtResource("3_ff2cr") shader_parameter/floorNormalMap = ExtResource("3_ff2cr")
shader_parameter/floorHeightMap = ExtResource("2_roy1o") shader_parameter/floorHeightMap = ExtResource("2_roy1o")
shader_parameter/floorUvScale = 0.5 shader_parameter/floorUvScale = 0.5
shader_parameter/enablePom = true shader_parameter/enablePom = false
shader_parameter/heightMinLayers = 8 shader_parameter/heightMinLayers = 8
shader_parameter/heightMaxLayers = 64 shader_parameter/heightMaxLayers = 64
shader_parameter/heightScale = 1.0 shader_parameter/heightScale = 1.0

Binary file not shown.

Binary file not shown.

View File

@@ -159,6 +159,38 @@ text = "0.5m"
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -6.5) transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -6.5)
text = "1m" text = "1m"
[node name="Label3D22" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, 1)
text = "1.5m"
[node name="Label3D23" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -11)
text = "2m"
[node name="Label3D24" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -21.5)
text = "3m"
[node name="Label3D25" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -31)
text = "4m"
[node name="Label3D26" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -41.5)
text = "5m"
[node name="Label3D27" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -51.5)
text = "6m"
[node name="Label3D28" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -61)
text = "7m"
[node name="Label3D29" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -74.5)
text = "8m"
[node name="Label3D8" type="Label3D" parent="Greybox/JumpHeights"] [node name="Label3D8" type="Label3D" parent="Greybox/JumpHeights"]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -11.5) transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -11.5)
text = "1.5m" text = "1.5m"
@@ -324,9 +356,57 @@ size = Vector3(5, 17.5, 5)
material = ExtResource("3_vvhq3") material = ExtResource("3_vvhq3")
[node name="CSGBox3D29" type="CSGBox3D" parent="Greybox/JumpHeights"] [node name="CSGBox3D29" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 10, -76.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30.25, 10, -40)
use_collision = true use_collision = true
size = Vector3(5, 20, 5) size = Vector3(0.5, 20, 80)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D33" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.75, 10, -5)
use_collision = true
size = Vector3(7.5, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D34" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.5, 10, -15)
use_collision = true
size = Vector3(7, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D35" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24, 10, -25)
use_collision = true
size = Vector3(6, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D36" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5, 10, -35)
use_collision = true
size = Vector3(5, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D37" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23, 10, -45)
use_collision = true
size = Vector3(4, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D38" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.5, 10, -55)
use_collision = true
size = Vector3(3, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D39" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22, 10, -65)
use_collision = true
size = Vector3(2, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D40" type="CSGBox3D" parent="Greybox/JumpHeights"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.5, 10, -75)
use_collision = true
size = Vector3(1, 20, 10)
material = ExtResource("3_vvhq3") material = ExtResource("3_vvhq3")
[node name="Passageways" type="CSGCombiner3D" parent="Greybox"] [node name="Passageways" type="CSGCombiner3D" parent="Greybox"]
@@ -567,6 +647,12 @@ use_collision = true
size = Vector3(3, 1, 0.25) size = Vector3(3, 1, 0.25)
material = ExtResource("3_vvhq3") material = ExtResource("3_vvhq3")
[node name="CSGBox3D57" type="CSGBox3D" parent="Greybox/Mantles"]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -13, 3.5, -21.629175)
use_collision = true
size = Vector3(5, 1, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D54" type="CSGBox3D" parent="Greybox/Mantles"] [node name="CSGBox3D54" type="CSGBox3D" parent="Greybox/Mantles"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1, 20.125) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1, 20.125)
use_collision = true use_collision = true

View File

@@ -102,6 +102,7 @@ player = NodePath("../Player")
pause = ExtResource("10_0ari0") pause = ExtResource("10_0ari0")
[node name="TutorialController" type="Control" parent="."] [node name="TutorialController" type="Control" parent="."]
visible = false
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@@ -374,9 +375,10 @@ shadow_opacity = 0.95
shadow_blur = 2.435 shadow_blur = 2.435
[node name="Player" parent="." node_paths=PackedStringArray("TutorialWeaponTarget") instance=ExtResource("1_2vsi6")] [node name="Player" parent="." node_paths=PackedStringArray("TutorialWeaponTarget") instance=ExtResource("1_2vsi6")]
transform = Transform3D(0.054514527, 0, -0.9985129, 0, 1, 0, 0.9985129, 0, 0.054514527, 0, -132.75, 118) transform = Transform3D(0.054514527, 0, -0.9985129, 0, 1, 0, 0.9985129, 0, 0.054514527, -6, 75.5, -13.5)
collision_layer = 17 collision_layer = 17
TutorialWeaponTarget = NodePath("../PlacedTutorialWeapon/WeaponLocationTarget") TutorialWeaponTarget = NodePath("../PlacedTutorialWeapon/WeaponLocationTarget")
TutorialDone = true
AccelerationAir = 1.5 AccelerationAir = 1.5
[node name="DebugLayer" type="CanvasLayer" parent="."] [node name="DebugLayer" type="CanvasLayer" parent="."]

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=48 format=3 uid="uid://bei4nhkf8lwdo"] [gd_scene load_steps=49 format=3 uid="uid://bei4nhkf8lwdo"]
[ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"] [ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"]
[ext_resource type="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"] [ext_resource type="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"]
@@ -14,22 +14,22 @@
[ext_resource type="Script" uid="uid://dd1yrt7eiiyf4" path="res://player_controller/Scripts/CapsuleCollider.cs" id="8_lmtjd"] [ext_resource type="Script" uid="uid://dd1yrt7eiiyf4" path="res://player_controller/Scripts/CapsuleCollider.cs" id="8_lmtjd"]
[ext_resource type="Resource" uid="uid://c3e0ivgaxrsyb" path="res://systems/inputs/base_mode/aim_down.tres" id="8_obsfv"] [ext_resource type="Resource" uid="uid://c3e0ivgaxrsyb" path="res://systems/inputs/base_mode/aim_down.tres" id="8_obsfv"]
[ext_resource type="PackedScene" uid="uid://wq1okogkhc5l" path="res://systems/mantle/mantle_system.tscn" id="8_qu4wy"] [ext_resource type="PackedScene" uid="uid://wq1okogkhc5l" path="res://systems/mantle/mantle_system.tscn" id="8_qu4wy"]
[ext_resource type="Resource" uid="uid://7wm8ywvujwf" path="res://systems/inputs/base_mode/aim_cancel.tres" id="9_5p2qc"]
[ext_resource type="Resource" uid="uid://bebstkm608wxx" path="res://systems/inputs/base_mode/aim_pressed.tres" id="9_nob5r"] [ext_resource type="Resource" uid="uid://bebstkm608wxx" path="res://systems/inputs/base_mode/aim_pressed.tres" id="9_nob5r"]
[ext_resource type="Resource" uid="uid://bdit2jy5gbpts" path="res://systems/inputs/base_mode/jump.tres" id="10_4u7i3"] [ext_resource type="Resource" uid="uid://bdit2jy5gbpts" path="res://systems/inputs/base_mode/jump.tres" id="10_4u7i3"]
[ext_resource type="Script" uid="uid://g8idirw62qe0" path="res://player_controller/Scripts/Bobbing.cs" id="10_7wk1w"] [ext_resource type="Script" uid="uid://g8idirw62qe0" path="res://player_controller/Scripts/Bobbing.cs" id="10_7wk1w"]
[ext_resource type="Resource" uid="uid://b334rau1yxmm7" path="res://systems/inputs/base_mode/empower_down.tres" id="10_nodcl"]
[ext_resource type="Resource" uid="uid://b5gx3q8nvu72e" path="res://systems/inputs/base_mode/hit.tres" id="11_cresl"] [ext_resource type="Resource" uid="uid://b5gx3q8nvu72e" path="res://systems/inputs/base_mode/hit.tres" id="11_cresl"]
[ext_resource type="Resource" uid="uid://bbce5wfwxpns1" path="res://systems/inputs/base_mode/empower_release.tres" id="11_ruloh"]
[ext_resource type="PackedScene" uid="uid://0ysqmqphq6mq" path="res://systems/head/head_system.tscn" id="11_rxwoh"] [ext_resource type="PackedScene" uid="uid://0ysqmqphq6mq" path="res://systems/head/head_system.tscn" id="11_rxwoh"]
[ext_resource type="Resource" uid="uid://d2r0ur8k3cuu3" path="res://systems/inputs/base_mode/dash.tres" id="12_34snm"] [ext_resource type="Resource" uid="uid://d2r0ur8k3cuu3" path="res://systems/inputs/base_mode/dash.tres" id="12_34snm"]
[ext_resource type="Script" uid="uid://b6k73aj5povgv" path="res://player_controller/Scripts/FieldOfView.cs" id="12_m2mxi"] [ext_resource type="Script" uid="uid://b6k73aj5povgv" path="res://player_controller/Scripts/FieldOfView.cs" id="12_m2mxi"]
[ext_resource type="Resource" uid="uid://55b0dsvioj08" path="res://systems/inputs/base_mode/jump_pressed.tres" id="13_nob5r"] [ext_resource type="Resource" uid="uid://55b0dsvioj08" path="res://systems/inputs/base_mode/jump_pressed.tres" id="13_nob5r"]
[ext_resource type="Shape3D" uid="uid://keseacdcooot" path="res://player_controller/resources/PlayerShape.tres" id="13_r7i3q"] [ext_resource type="Shape3D" uid="uid://keseacdcooot" path="res://player_controller/resources/PlayerShape.tres" id="13_r7i3q"]
[ext_resource type="Resource" uid="uid://bw5k2gsv3jqcv" path="res://systems/inputs/base_mode/throw.tres" id="16_nob5r"]
[ext_resource type="Script" uid="uid://b5nk6ntlps3x0" path="res://systems/inputs/input_system.gd" id="16_v31n3"] [ext_resource type="Script" uid="uid://b5nk6ntlps3x0" path="res://systems/inputs/input_system.gd" id="16_v31n3"]
[ext_resource type="Resource" uid="uid://b334rau1yxmm7" path="res://systems/inputs/base_mode/slide.tres" id="17_6lejt"]
[ext_resource type="Resource" uid="uid://htqvokm8mufq" path="res://systems/inputs/base_mode/move.tres" id="17_h6vvl"] [ext_resource type="Resource" uid="uid://htqvokm8mufq" path="res://systems/inputs/base_mode/move.tres" id="17_h6vvl"]
[ext_resource type="PackedScene" uid="uid://cqduhd4opgwvm" path="res://systems/dash/dash_system.tscn" id="18_q5h8a"] [ext_resource type="PackedScene" uid="uid://cqduhd4opgwvm" path="res://systems/dash/dash_system.tscn" id="18_q5h8a"]
[ext_resource type="Resource" uid="uid://bbce5wfwxpns1" path="res://systems/inputs/base_mode/slide_pressed.tres" id="18_q14ux"]
[ext_resource type="Resource" uid="uid://spo3pbqjx0eb" path="res://systems/inputs/base_mode/parry.tres" id="18_ruloh"]
[ext_resource type="Resource" uid="uid://dxy0071ic1wdj" path="res://systems/inputs/base_mode/slam.tres" id="20_nob5r"]
[ext_resource type="PackedScene" uid="uid://dbe5f0p6lvqtr" path="res://systems/tween_queue/tween_queue_system.tscn" id="22_rpwev"] [ext_resource type="PackedScene" uid="uid://dbe5f0p6lvqtr" path="res://systems/tween_queue/tween_queue_system.tscn" id="22_rpwev"]
[ext_resource type="PackedScene" uid="uid://bcwkugn6v3oy7" path="res://addons/godot_state_charts/utilities/state_chart_debugger.tscn" id="24_q5h8a"] [ext_resource type="PackedScene" uid="uid://bcwkugn6v3oy7" path="res://addons/godot_state_charts/utilities/state_chart_debugger.tscn" id="24_q5h8a"]
[ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="25_wv70j"] [ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="25_wv70j"]
@@ -57,38 +57,39 @@ top_radius = 0.2
bottom_radius = 0.2 bottom_radius = 0.2
height = 1.0 height = 1.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_6lejt"]
radius = 1.0
height = 3.0
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_2q0ik"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_2q0ik"]
blend_mode = 1 blend_mode = 1
[node name="Player" type="CharacterBody3D"] [node name="Player" type="CharacterBody3D"]
script = ExtResource("1_poq2x") script = ExtResource("1_poq2x")
WalkSpeed = 7.5 WalkSpeed = 7.5
AccelerationAir = 2.0 AccelerationFloor = 4.0
DecelerationAir = 0.1 DecelerationFloor = 3.0
Weight = 5.0 AccelerationAir = 0.8
MantleTime = 0.2 DecelerationAir = 0.02
Weight = 4.0
MantlePath = ExtResource("2_6lejt") MantlePath = ExtResource("2_6lejt")
MantleDashStrength = 25.0
MantleJumpStartVelocity = 15.0
CoyoteTime = 0.3 CoyoteTime = 0.3
SimpleJumpStartVelocity = 8.0 InputBufferFrames = 5
SimpleJumpStartVelocity = 6.0
SimpleJumpHangTimeInFrames = 1 SimpleJumpHangTimeInFrames = 1
SimpleJumpGravityLesseningFactor = 2.5 SimpleJumpGravityLesseningFactor = 2.0
DoubleJumpStartVelocity = 15.0
DoubleJumpHangTimeInFrames = 3 DoubleJumpHangTimeInFrames = 3
DoubleJumpGravityLesseningFactor = 1.5 DoubleJumpGravityLesseningFactor = 1.5
MegaJumpStartVelocity = 30.0 WallJumpStartVelocity = 8.0
MegaJumpHangTimeInFrames = 12
MegaJumpGravityLesseningFactor = 1.2
WallJumpStartVelocity = 12.0
MaxNumberOfEmpoweredActions = 3 MaxNumberOfEmpoweredActions = 3
SimpleDashStrength = 15.0 SimpleDashStrength = 15.0
PoweredDashStrength = 30.0
AimedDashTime = 0.2 AimedDashTime = 0.2
PostDashSpeed = 30.0 PostDashSpeed = 30.0
WallHugGravityLesseningFactor = 15.0 WallHugGravityLesseningFactor = 15.0
WallHugDownwardMaxSpeed = 8.0 WallHugDownwardMaxSpeed = 8.0
WallHugHorizontalDeceleration = 0.5 WallHugHorizontalDeceleration = 0.5
WallRunAltitudeLossSpeed = 12.0
WallRunSpeedThreshold = 10.0
[node name="WallRunSnapper" type="RayCast3D" parent="."] [node name="WallRunSnapper" type="RayCast3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@@ -104,19 +105,19 @@ move_left = ExtResource("5_q14ux")
move_right = ExtResource("6_q7bng") move_right = ExtResource("6_q7bng")
move_front = ExtResource("7_m8gvy") move_front = ExtResource("7_m8gvy")
move_back = ExtResource("8_jb43f") move_back = ExtResource("8_jb43f")
rotate_y = ExtResource("4_rxwoh") rotate_vertical = ExtResource("4_rxwoh")
rotate_floorplane = ExtResource("5_4u7i3") rotate_floorplane = ExtResource("5_4u7i3")
aim_down = ExtResource("8_obsfv") aim_down = ExtResource("8_obsfv")
aim_pressed = ExtResource("9_nob5r") aim_pressed = ExtResource("9_nob5r")
aim_released = ExtResource("8_lhb11") aim_released = ExtResource("8_lhb11")
jump = ExtResource("10_4u7i3") jump = ExtResource("10_4u7i3")
jump_pressed = ExtResource("13_nob5r") jump_pressed = ExtResource("13_nob5r")
empower_down = ExtResource("10_nodcl") slide = ExtResource("17_6lejt")
empower_released = ExtResource("11_ruloh") slide_pressed = ExtResource("18_q14ux")
aim_canceled = ExtResource("9_5p2qc")
hit = ExtResource("11_cresl") hit = ExtResource("11_cresl")
parry = ExtResource("18_ruloh")
dash = ExtResource("12_34snm") dash = ExtResource("12_34snm")
throw = ExtResource("16_nob5r") slam = ExtResource("20_nob5r")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."] [node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.85, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.85, 0)
@@ -178,7 +179,6 @@ target_position = Vector3(0, 1, 0)
[node name="TweenQueueSystem" parent="." instance=ExtResource("22_rpwev")] [node name="TweenQueueSystem" parent="." instance=ExtResource("22_rpwev")]
[node name="WallHugSystem" type="Node3D" parent="."] [node name="WallHugSystem" type="Node3D" parent="."]
visible = false
script = ExtResource("27_n7qhm") script = ExtResource("27_n7qhm")
[node name="back" type="RayCast3D" parent="WallHugSystem"] [node name="back" type="RayCast3D" parent="WallHugSystem"]
@@ -235,7 +235,17 @@ visible = false
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, -1) transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, -1)
mesh = SubResource("CylinderMesh_nodcl") mesh = SubResource("CylinderMesh_nodcl")
[node name="GroundDetector" type="ShapeCast3D" parent="."]
shape = SubResource("CapsuleShape3D_6lejt")
target_position = Vector3(0, -0.5, 0)
collision_mask = 2
[node name="DashCooldown" type="Timer" parent="."] [node name="DashCooldown" type="Timer" parent="."]
wait_time = 0.8
one_shot = true
[node name="AirborneDashCooldown" type="Timer" parent="."]
wait_time = 0.5
one_shot = true one_shot = true
[node name="PowerCooldown" type="Timer" parent="."] [node name="PowerCooldown" type="Timer" parent="."]
@@ -252,10 +262,10 @@ offset_left = 1524.0
offset_top = 1.0 offset_top = 1.0
offset_right = -8.0 offset_right = -8.0
offset_bottom = 1.0 offset_bottom = 1.0
enabled = false
initial_node_to_watch = NodePath("../StateChart") initial_node_to_watch = NodePath("../StateChart")
[node name="UI" type="Control" parent="."] [node name="UI" type="Control" parent="."]
visible = false
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@@ -383,28 +393,6 @@ delay_in_seconds = "0.0"
[node name="Canceled" type="Node" parent="StateChart/Root/Aim"] [node name="Canceled" type="Node" parent="StateChart/Root/Aim"]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
[node name="Empower" type="Node" parent="StateChart/Root"]
script = ExtResource("26_infe6")
initial_state = NodePath("Off")
[node name="Off" type="Node" parent="StateChart/Root/Empower"]
script = ExtResource("27_34snm")
[node name="ToOn" type="Node" parent="StateChart/Root/Empower/Off"]
script = ExtResource("28_n7qhm")
to = NodePath("../../On")
event = &"empower_down"
delay_in_seconds = "0.0"
[node name="On" type="Node" parent="StateChart/Root/Empower"]
script = ExtResource("27_34snm")
[node name="ToOff" type="Node" parent="StateChart/Root/Empower/On"]
script = ExtResource("28_n7qhm")
to = NodePath("../../Off")
event = &"empower_released"
delay_in_seconds = "0.0"
[node name="PowerReserve" type="Node" parent="StateChart/Root"] [node name="PowerReserve" type="Node" parent="StateChart/Root"]
script = ExtResource("26_infe6") script = ExtResource("26_infe6")
initial_state = NodePath("Full") initial_state = NodePath("Full")
@@ -501,6 +489,12 @@ to = NodePath("../../Grounded")
event = &"grounded" event = &"grounded"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="OnMantleOtherSide" type="Node" parent="StateChart/Root/Movement/Mantling"]
script = ExtResource("28_n7qhm")
to = NodePath("../../OnWall/Hugging")
event = &"on_wall"
delay_in_seconds = "0.0"
[node name="Jump" type="Node" parent="StateChart/Root/Movement"] [node name="Jump" type="Node" parent="StateChart/Root/Movement"]
script = ExtResource("26_infe6") script = ExtResource("26_infe6")
initial_state = NodePath("SimpleJump") initial_state = NodePath("SimpleJump")
@@ -609,7 +603,7 @@ default_state = NodePath("../CoyoteEnabled")
[node name="OnWallRun" type="Node" parent="StateChart/Root/Movement/Airborne"] [node name="OnWallRun" type="Node" parent="StateChart/Root/Movement/Airborne"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../OnWall/RunningCoyoteEnabled") to = NodePath("../../OnWall/Running")
event = &"wall_run" event = &"wall_run"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
@@ -651,7 +645,6 @@ script = ExtResource("27_34snm")
[node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne/DoubleJumpEnabled"] [node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne/DoubleJumpEnabled"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../../OnWall/HuggingCoyoteEnabled")
event = &"wall_hug" event = &"wall_hug"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
@@ -672,7 +665,7 @@ script = ExtResource("27_34snm")
[node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne/Falling"] [node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne/Falling"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../../OnWall/HuggingCoyoteEnabled") to = NodePath("../../../OnWall/Hugging")
event = &"wall_hug" event = &"wall_hug"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
@@ -686,12 +679,6 @@ delay_in_seconds = "0.0"
script = ExtResource("26_infe6") script = ExtResource("26_infe6")
initial_state = NodePath("Hugging") initial_state = NodePath("Hugging")
[node name="OnDash" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("28_n7qhm")
to = NodePath("../../Dashing/Dash")
event = &"dash"
delay_in_seconds = "0.0"
[node name="OnGrounded" type="Node" parent="StateChart/Root/Movement/OnWall"] [node name="OnGrounded" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../Grounded") to = NodePath("../../Grounded")
@@ -716,90 +703,55 @@ to = NodePath("../../Mantling")
event = &"mantle" event = &"mantle"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="HuggingCoyoteEnabled" type="Node" parent="StateChart/Root/Movement/OnWall"] [node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("27_34snm")
[node name="OnExpiration" type="Node" parent="StateChart/Root/Movement/OnWall/HuggingCoyoteEnabled"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../Hugging") to = NodePath("../../Jump/DoubleJump")
event = &"coyote_expired"
delay_in_seconds = "0.0"
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/HuggingCoyoteEnabled"]
script = ExtResource("28_n7qhm")
to = NodePath("../../../Jump/DoubleJump")
event = &"jump" event = &"jump"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="Hugging" type="Node" parent="StateChart/Root/Movement/OnWall"] [node name="Hugging" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hugging"] [node name="OnDash" type="Node" parent="StateChart/Root/Movement/OnWall/Hugging"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../../Jump/SimpleJump") to = NodePath("../../../Dashing/Dash")
event = &"jump" event = &"dash"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="Hanging" type="Node" parent="StateChart/Root/Movement/OnWall"] [node name="Hanging" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hanging"] [node name="OnDash" type="Node" parent="StateChart/Root/Movement/OnWall/Hanging"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../../Jump/SimpleJump") to = NodePath("../../../Dashing/Dash")
event = &"jump" event = &"dash"
delay_in_seconds = "0.0"
[node name="RunningCoyoteEnabled" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("27_34snm")
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"]
script = ExtResource("28_n7qhm")
to = NodePath("../../../Jump/DoubleJump")
event = &"jump"
delay_in_seconds = "0.0"
[node name="OnExpiration" type="Node" parent="StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"]
script = ExtResource("28_n7qhm")
to = NodePath("../../Running")
event = &"coyote_expired"
delay_in_seconds = "0.0"
[node name="OnLeaveWall" type="Node" parent="StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"]
script = ExtResource("28_n7qhm")
to = NodePath("../../../Airborne/CoyoteEnabled")
event = &"start_falling"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="Running" type="Node" parent="StateChart/Root/Movement/OnWall"] [node name="Running" type="Node" parent="StateChart/Root/Movement/OnWall"]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Running"]
script = ExtResource("28_n7qhm")
to = NodePath("../../../Jump/SimpleJump")
event = &"jump"
delay_in_seconds = "0.0"
[node name="OnLeaveWall" type="Node" parent="StateChart/Root/Movement/OnWall/Running"] [node name="OnLeaveWall" type="Node" parent="StateChart/Root/Movement/OnWall/Running"]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../../Airborne/CoyoteEnabled") to = NodePath("../../../Airborne/CoyoteEnabled")
event = &"start_falling" event = &"start_falling"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[connection signal="input_aim_canceled" from="InputController" to="." method="OnInputAimCanceled"]
[connection signal="input_aim_down" from="InputController" to="." method="OnInputAimDown"] [connection signal="input_aim_down" from="InputController" to="." method="OnInputAimDown"]
[connection signal="input_aim_pressed" from="InputController" to="." method="OnInputAimPressed"] [connection signal="input_aim_pressed" from="InputController" to="." method="OnInputAimPressed"]
[connection signal="input_aim_released" from="InputController" to="." method="OnInputAimReleased"] [connection signal="input_aim_released" from="InputController" to="." method="OnInputAimReleased"]
[connection signal="input_dash" from="InputController" to="." method="OnInputDashPressed"] [connection signal="input_dash" from="InputController" to="." method="OnInputDashPressed"]
[connection signal="input_device_changed" from="InputController" to="." method="InputDeviceChanged"] [connection signal="input_device_changed" from="InputController" to="." method="InputDeviceChanged"]
[connection signal="input_empower_down" from="InputController" to="." method="OnInputEmpowerDown"]
[connection signal="input_empower_released" from="InputController" to="." method="OnInputEmpowerReleased"]
[connection signal="input_hit" from="InputController" to="." method="OnInputHitPressed"] [connection signal="input_hit" from="InputController" to="." method="OnInputHitPressed"]
[connection signal="input_jump_ended" from="InputController" to="." method="OnInputJumpEnded"] [connection signal="input_jump_ended" from="InputController" to="." method="OnInputJumpEnded"]
[connection signal="input_jump_ongoing" from="InputController" to="." method="OnInputJumpOngoing"] [connection signal="input_jump_ongoing" from="InputController" to="." method="OnInputJumpOngoing"]
[connection signal="input_jump_started" from="InputController" to="." method="OnInputJumpStarted"] [connection signal="input_jump_started" from="InputController" to="." method="OnInputJumpStarted"]
[connection signal="input_move" from="InputController" to="." method="OnInputMove"] [connection signal="input_move" from="InputController" to="." method="OnInputMove"]
[connection signal="input_move_keyboard" from="InputController" to="." method="OnInputMoveKeyboard"] [connection signal="input_move_keyboard" from="InputController" to="." method="OnInputMoveKeyboard"]
[connection signal="input_parry" from="InputController" to="." method="OnInputParryPressed"]
[connection signal="input_rotate_floorplane" from="InputController" to="." method="OnInputRotateFloorplane"] [connection signal="input_rotate_floorplane" from="InputController" to="." method="OnInputRotateFloorplane"]
[connection signal="input_rotate_y" from="InputController" to="." method="OnInputRotateY"] [connection signal="input_rotate_y" from="InputController" to="." method="OnInputRotateY"]
[connection signal="input_throw" from="InputController" to="." method="OnInputThrowPressed"] [connection signal="input_slam" from="InputController" to="." method="OnInputSlamPressed"]
[connection signal="input_slide_ended" from="InputController" to="." method="OnInputSlideEnded"]
[connection signal="input_slide_ongoing" from="InputController" to="." method="OnInputSlideOngoing"]
[connection signal="input_slide_started" from="InputController" to="." method="OnInputSlideStarted"]
[connection signal="WallDetected" from="WallHugSystem" to="." method="OnWallDetected"] [connection signal="WallDetected" from="WallHugSystem" to="." method="OnWallDetected"]

View File

@@ -16,6 +16,16 @@ public partial class PlayerController : CharacterBody3D
} }
private bool _isUsingGamepad; private bool _isUsingGamepad;
public enum BufferedActions
{
None,
Jump,
MantleJump,
Dash,
MantleDash
}
private BufferedActions _bufferedAction = BufferedActions.None;
// User API to important child nodes. // User API to important child nodes.
public HeadSystem HeadSystem; public HeadSystem HeadSystem;
public Bobbing Bobbing; public Bobbing Bobbing;
@@ -34,6 +44,7 @@ public partial class PlayerController : CharacterBody3D
public MeshInstance3D DashIndicatorMesh; public MeshInstance3D DashIndicatorMesh;
public CylinderMesh DashIndicatorMeshCylinder; public CylinderMesh DashIndicatorMeshCylinder;
public RayCast3D WallRunSnapper; public RayCast3D WallRunSnapper;
public ShapeCast3D GroundDetector;
private bool _movementEnabled = true; private bool _movementEnabled = true;
@@ -58,6 +69,7 @@ public partial class PlayerController : CharacterBody3D
// Timers // Timers
private Timer _timeScaleAimInAirTimer; private Timer _timeScaleAimInAirTimer;
private Timer _simpleDashCooldownTimer; private Timer _simpleDashCooldownTimer;
private Timer _airborneDashCooldownTimer;
private Timer _powerCooldownTimer; private Timer _powerCooldownTimer;
[Export] public Marker3D TutorialWeaponTarget; [Export] public Marker3D TutorialWeaponTarget;
@@ -78,16 +90,25 @@ public partial class PlayerController : CharacterBody3D
public float DecelerationAir = 1.0f; public float DecelerationAir = 1.0f;
[Export(PropertyHint.Range, "0,10,0.01,or_greater")] [Export(PropertyHint.Range, "0,10,0.01,or_greater")]
public float Weight { get; set; } = 3.0f; public float Weight { get; set; } = 3.0f;
// Mantle
[ExportGroup("Mantle")] [ExportGroup("Mantle")]
[Export(PropertyHint.Range, "0,1,0.01,or_greater")] [Export(PropertyHint.Range, "0,1,0.01,or_greater")]
public float MantleTime { get; set; } = 0.1f; public float MantleTime { get; set; } = 0.1f;
[Export] [Export]
public PackedScene MantlePath { get; set; } public PackedScene MantlePath { get; set; }
[Export(PropertyHint.Range, "0,50,0.1")]
public float MantleDashStrength { get; set; } = 15f;
[Export(PropertyHint.Range, "0,100,1,or_greater")]
public float MantleJumpStartVelocity { get; set; } = 20.0f;
// Jump // Jump
[ExportGroup("Jump")] [ExportGroup("Jump")]
[Export(PropertyHint.Range, "0,1,0.01")] [Export(PropertyHint.Range, "0,1,0.01")]
public float CoyoteTime { get; set; } = 0.2f; public float CoyoteTime { get; set; } = 0.2f;
[Export(PropertyHint.Range, "0,10,1,or_greater")]
public int InputBufferFrames { get; set; } = 3;
// Simple jump // Simple jump
[ExportSubgroup("Simple jump")] [ExportSubgroup("Simple jump")]
@@ -108,22 +129,10 @@ public partial class PlayerController : CharacterBody3D
[Export(PropertyHint.Range, "1,10,0.1,or_greater")] [Export(PropertyHint.Range, "1,10,0.1,or_greater")]
public float DoubleJumpGravityLesseningFactor { get; set; } = 3f; public float DoubleJumpGravityLesseningFactor { get; set; } = 3f;
// Mega jump
[ExportSubgroup("Mega jump")]
[Export(PropertyHint.Range, "0,100,1,or_greater")]
public float MegaJumpStartVelocity { get; set; } = 10.0f;
[Export(PropertyHint.Range, "0,10,1,or_greater")]
public int MegaJumpHangTimeInFrames { get; set; } = 5;
[Export(PropertyHint.Range, "1,10,0.1,or_greater")]
public float MegaJumpGravityLesseningFactor { get; set; } = 3f;
// Wall jump // Wall jump
[ExportSubgroup("Wall jump")] [ExportSubgroup("Wall jump")]
[Export(PropertyHint.Range, "0,100,1,or_greater")] [Export(PropertyHint.Range, "0,100,1,or_greater")]
public float WallJumpStartVelocity { get; set; } = 10.0f; public float WallJumpStartVelocity { get; set; } = 10.0f;
[Export(PropertyHint.Range, "0,100,1,or_greater")]
public float WallMegajumpStartVelocity { get; set; } = 20.0f;
// Dash // Dash
[ExportGroup("Dash")] [ExportGroup("Dash")]
@@ -133,12 +142,6 @@ public partial class PlayerController : CharacterBody3D
[ExportSubgroup("Simple")] [ExportSubgroup("Simple")]
[Export(PropertyHint.Range, "0,50,0.1")] [Export(PropertyHint.Range, "0,50,0.1")]
public float SimpleDashStrength { get; set; } = 10f; public float SimpleDashStrength { get; set; } = 10f;
// Powered Dash
[ExportSubgroup("Powered")]
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
public float PoweredDashTime { get; set; } = 0.3f;
[Export(PropertyHint.Range, "0,100,0.1")]
public float PoweredDashStrength { get; set; } = 10f;
// Aimed Dash // Aimed Dash
[ExportSubgroup("Special")] [ExportSubgroup("Special")]
[Export(PropertyHint.Range, "0,1,0.01,or_greater")] [Export(PropertyHint.Range, "0,1,0.01,or_greater")]
@@ -196,7 +199,6 @@ public partial class PlayerController : CharacterBody3D
private StateChart _playerState; private StateChart _playerState;
private StateChartState _aiming; private StateChartState _aiming;
private StateChartState _empowerOn;
private StateChartState _powerExpired; private StateChartState _powerExpired;
private StateChartState _powerRecharging; private StateChartState _powerRecharging;
private StateChartState _powerFull; private StateChartState _powerFull;
@@ -204,30 +206,21 @@ public partial class PlayerController : CharacterBody3D
private StateChartState _grounded; private StateChartState _grounded;
private StateChartState _airborne; private StateChartState _airborne;
private StateChartState _coyoteEnabled; private StateChartState _coyoteEnabled;
// private StateChartState _doubleJumpEnabled;
private StateChartState _simpleJump; private StateChartState _simpleJump;
private StateChartState _doubleJump; private StateChartState _doubleJump;
private StateChartState _megaJump;
private StateChartState _mantling; private StateChartState _mantling;
private StateChartState _simpleDash; private StateChartState _simpleDash;
private StateChartState _poweredDash;
private StateChartState _aimedDash; private StateChartState _aimedDash;
private StateChartState _onWall; private StateChartState _onWall;
private StateChartState _onWallHugging; private StateChartState _onWallHugging;
private StateChartState _onWallHuggingCoyoteEnabled;
private StateChartState _onWallHanging; private StateChartState _onWallHanging;
private StateChartState _onWallRunning; private StateChartState _onWallRunning;
private StateChartState _onWallRunningCoyoteEnabled;
private Transition _onJumpFromWallCoyote; private Transition _onJumpFromWall;
private Transition _onJumpFromWallRunCoyote;
private Transition _onJumpFromWall1;
private Transition _onJumpFromWall2;
private Transition _onJumpFromWall3;
private Transition _onMegajumpFromWall;
private Transition _onLeaveWallFromRunCoyote;
private Transition _onLeaveWallFromRun; private Transition _onLeaveWallFromRun;
private int _currentInputBufferFrames;
private float _playerHeight; private float _playerHeight;
private float _playerRadius; private float _playerRadius;
private bool _isJumpInputPressed; private bool _isJumpInputPressed;
@@ -275,6 +268,7 @@ public partial class PlayerController : CharacterBody3D
StairsSystem = GetNode<StairsSystem>("StairsSystem"); StairsSystem = GetNode<StairsSystem>("StairsSystem");
WallHugSystem = GetNode<WallHugSystem>("WallHugSystem"); WallHugSystem = GetNode<WallHugSystem>("WallHugSystem");
WallRunSnapper = GetNode<RayCast3D>("%WallRunSnapper"); WallRunSnapper = GetNode<RayCast3D>("%WallRunSnapper");
GroundDetector = GetNode<ShapeCast3D>("GroundDetector");
RayCast3D stairsBelowRayCast3D = GetNode<RayCast3D>("StairsBelowRayCast3D"); RayCast3D stairsBelowRayCast3D = GetNode<RayCast3D>("StairsBelowRayCast3D");
RayCast3D stairsAheadRayCast3D = GetNode<RayCast3D>("StairsAheadRayCast3D"); RayCast3D stairsAheadRayCast3D = GetNode<RayCast3D>("StairsAheadRayCast3D");
_headCollisionDetectors = new RayCast3D[NUM_OF_HEAD_COLLISION_DETECTORS]; _headCollisionDetectors = new RayCast3D[NUM_OF_HEAD_COLLISION_DETECTORS];
@@ -293,10 +287,8 @@ public partial class PlayerController : CharacterBody3D
_aiming = StateChartState.Of(GetNode("StateChart/Root/Aim/On")); _aiming = StateChartState.Of(GetNode("StateChart/Root/Aim/On"));
_simpleDash = StateChartState.Of(GetNode("StateChart/Root/Movement/Dashing/Dash")); _simpleDash = StateChartState.Of(GetNode("StateChart/Root/Movement/Dashing/Dash"));
_poweredDash = StateChartState.Of(GetNode("StateChart/Root/Movement/Dashing/PoweredDash"));
_aimedDash = StateChartState.Of(GetNode("StateChart/Root/Movement/Dashing/AimedDash")); _aimedDash = StateChartState.Of(GetNode("StateChart/Root/Movement/Dashing/AimedDash"));
// _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging")); // _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging"));
_empowerOn = StateChartState.Of(GetNode("StateChart/Root/Empower/On"));
_powerExpired = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Expired")); _powerExpired = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Expired"));
_powerRecharging = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/AtLeastOneCharge")); _powerRecharging = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/AtLeastOneCharge"));
_powerFull = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Full")); _powerFull = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Full"));
@@ -307,26 +299,18 @@ public partial class PlayerController : CharacterBody3D
// _doubleJumpEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/Airborne/DoubleJumpEnabled")); // _doubleJumpEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/Airborne/DoubleJumpEnabled"));
_simpleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/SimpleJump")); _simpleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/SimpleJump"));
_doubleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/DoubleJump")); _doubleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/DoubleJump"));
_megaJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/MegaJump"));
_mantling = StateChartState.Of(GetNode("StateChart/Root/Movement/Mantling")); _mantling = StateChartState.Of(GetNode("StateChart/Root/Movement/Mantling"));
_onJumpFromWallCoyote = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/HuggingCoyoteEnabled/OnJump")); _onJumpFromWall = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/OnJump"));
_onJumpFromWallRunCoyote = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled/OnJump"));
_onJumpFromWall1 = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Hugging/OnJump"));
_onJumpFromWall2 = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging/OnJump"));
_onJumpFromWall3 = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Running/OnJump"));
_onMegajumpFromWall = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/OnMegajump"));
_onWall = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall")); _onWall = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall"));
_onWallHuggingCoyoteEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/HuggingCoyoteEnabled"));
_onWallHugging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hugging")); _onWallHugging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hugging"));
_onWallHanging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging")); _onWallHanging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging"));
_onWallRunning = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Running")); _onWallRunning = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Running"));
_onWallRunningCoyoteEnabled = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled"));
_onLeaveWallFromRun = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Running/OnLeaveWall")); _onLeaveWallFromRun = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/Running/OnLeaveWall"));
_onLeaveWallFromRunCoyote = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/RunningCoyoteEnabled/OnLeaveWall"));
// State timers // State timers
_powerCooldownTimer = GetNode<Timer>("PowerCooldown"); _powerCooldownTimer = GetNode<Timer>("PowerCooldown");
_timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir"); _timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir");
_simpleDashCooldownTimer = GetNode<Timer>("DashCooldown"); _simpleDashCooldownTimer = GetNode<Timer>("DashCooldown");
_airborneDashCooldownTimer = GetNode<Timer>("AirborneDashCooldown");
/////////////////////////// ///////////////////////////
// Initialize components // // Initialize components //
@@ -381,44 +365,28 @@ public partial class PlayerController : CharacterBody3D
_doubleJump.StateEntered += OnDoubleJumpStarted; _doubleJump.StateEntered += OnDoubleJumpStarted;
_doubleJump.StatePhysicsProcessing += HandleDoubleJump; _doubleJump.StatePhysicsProcessing += HandleDoubleJump;
_megaJump.StateEntered += OnMegaJumpStarted;
_megaJump.StatePhysicsProcessing += HandleMegaJump;
_mantling.StateEntered += OnMantleStarted; _mantling.StateEntered += OnMantleStarted;
_mantling.StatePhysicsProcessing += HandleMantling; _mantling.StatePhysicsProcessing += HandleMantling;
_simpleDash.StateEntered += OnSimpleDashStarted; _simpleDash.StateEntered += OnSimpleDashStarted;
_simpleDash.StatePhysicsProcessing += HandleSimpleDash; _simpleDash.StatePhysicsProcessing += HandleSimpleDash;
_poweredDash.StateEntered += OnPoweredDashStarted;
_poweredDash.StatePhysicsProcessing += HandlePoweredDash;
_poweredDash.StateExited += OnPoweredDashFinished;
_aimedDash.StateEntered += OnAimedDashStarted; _aimedDash.StateEntered += OnAimedDashStarted;
_aimedDash.StateExited += OnAimedDashFinished; _aimedDash.StateExited += OnAimedDashFinished;
_simpleDashCooldownTimer.Timeout += DashCooldownTimeout; _simpleDashCooldownTimer.Timeout += DashCooldownTimeout;
_airborneDashCooldownTimer.Timeout += AirborneDashCooldownTimeout;
_onWall.StateEntered += OnWallStarted; _onWall.StateEntered += OnWallStarted;
_onWall.StateExited += OnWallStopped; _onWall.StateExited += OnWallStopped;
_onWallHuggingCoyoteEnabled.StateEntered += OnWallHuggingStarted;
_onWallHuggingCoyoteEnabled.StatePhysicsProcessing += HandleWallHugging;
_onWallHugging.StatePhysicsProcessing += HandleWallHugging; _onWallHugging.StatePhysicsProcessing += HandleWallHugging;
_onWallHanging.StatePhysicsProcessing += HandleWallHanging; _onWallHanging.StatePhysicsProcessing += HandleWallHanging;
_onWallRunningCoyoteEnabled.StateEntered += OnWallRunningStarted;
_onWallRunningCoyoteEnabled.StatePhysicsProcessing += HandleWallRunning;
_onWallRunning.StatePhysicsProcessing += HandleWallRunning; _onWallRunning.StatePhysicsProcessing += HandleWallRunning;
_onJumpFromWallCoyote.Taken += OnJumpFromWallCoyote; _onJumpFromWall.Taken += OnJumpFromWall;
_onJumpFromWallRunCoyote.Taken += OnJumpFromWallCoyote;
_onJumpFromWall1.Taken += OnJumpFromWall;
_onJumpFromWall2.Taken += OnJumpFromWall;
_onJumpFromWall3.Taken += OnJumpFromWall;
_onMegajumpFromWall.Taken += OnMegajumpFromWall;
_onLeaveWallFromRun.Taken += OnLeaveWallFromRun; _onLeaveWallFromRun.Taken += OnLeaveWallFromRun;
_onLeaveWallFromRunCoyote.Taken += OnLeaveWallFromRun;
} }
public void SetAllowedInputsAll() public void SetAllowedInputsAll()
{ {
CurrentlyAllowedInputs = AllowedInputs.All; CurrentlyAllowedInputs = AllowedInputs.All;
@@ -463,16 +431,48 @@ public partial class PlayerController : CharacterBody3D
if (_simpleDashCooldownTimer.IsStopped()) if (_simpleDashCooldownTimer.IsStopped())
_simpleDashCooldownTimer.Start(); _simpleDashCooldownTimer.Start();
if (_bufferedAction == BufferedActions.Jump && _currentInputBufferFrames > 0)
{
_currentInputBufferFrames = 0;
PerformJump();
}
if (_bufferedAction == BufferedActions.Dash && _currentInputBufferFrames > 0)
{
_currentInputBufferFrames = 0;
SimpleDash();
}
if (_bufferedAction == BufferedActions.MantleJump)
{
SimpleDash();
OnJumpStarted(MantleJumpStartVelocity);
}
if (_bufferedAction == BufferedActions.MantleDash)
{
SimpleDash(MantleDashStrength);
}
_bufferedAction = BufferedActions.None;
} }
public void DashCooldownTimeout() public void DashCooldownTimeout()
{ {
_canDash = true; _canDash = true;
} }
public void AirborneDashCooldownTimeout()
{
_canDashAirborne = true;
}
public bool IsPlayerInputtingForward()
{
return GetMoveInput().Z < -0.5f;
}
public bool IsTryingToMantle() public bool IsTryingToMantle()
{ {
return MantleSystem.IsMantlePossible && GetMoveInput().Z < -0.5f && _isJumpInputPressed; return MantleSystem.IsMantlePossible && IsPlayerInputtingForward() && _isJumpInputPressed;
} }
public void HandleGrounded(float delta) public void HandleGrounded(float delta)
@@ -485,15 +485,18 @@ public partial class PlayerController : CharacterBody3D
public void HandleAirborne(float delta) public void HandleAirborne(float delta)
{ {
var isGroundLike = GroundDetector.GetCollisionResult().Count > 0;
MoveInAir(delta); MoveInAir(delta, isGroundLike);
if (isOnFloorCustom()) if (isOnFloorCustom())
_playerState.SendEvent("grounded"); _playerState.SendEvent("grounded");
if (IsTryingToMantle()) _playerState.SendEvent("mantle"); if (IsTryingToMantle()) _playerState.SendEvent("mantle");
if (!WallHugSystem.IsWallHugging()) if (!WallHugSystem.IsWallHugging())
{
_isWallJumpAvailable = true; // reset wall jump if we left the wall
return; return;
}
// Going upwards, we stay simply airborne // Going upwards, we stay simply airborne
if (Velocity.AngleTo(Vector3.Up) < Math.PI / 4) if (Velocity.AngleTo(Vector3.Up) < Math.PI / 4)
@@ -526,20 +529,8 @@ public partial class PlayerController : CharacterBody3D
if (IsTryingToMantle()) _playerState.SendEvent("mantle"); if (IsTryingToMantle()) _playerState.SendEvent("mantle");
} }
public void OnWallHuggingStarted()
{
GetTree().CreateTimer(CoyoteTime).Timeout += CoyoteExpired;
}
public void OnWallRunningStarted()
{
GetTree().CreateTimer(CoyoteTime).Timeout += CoyoteExpired;
}
public void OnWallDetected() public void OnWallDetected()
{ {
FinishPoweredDash();
if (!_onWall.Active) if (!_onWall.Active)
return; return;
@@ -570,6 +561,9 @@ public partial class PlayerController : CharacterBody3D
public void HandleWallHugging(float delta) public void HandleWallHugging(float delta)
{ {
_canDash = true;
_canDashAirborne = true;
WallHug(delta); WallHug(delta);
if (isOnFloorCustom()) if (isOnFloorCustom())
_playerState.SendEvent("grounded"); _playerState.SendEvent("grounded");
@@ -585,6 +579,9 @@ public partial class PlayerController : CharacterBody3D
public void HandleWallRunning(float delta) public void HandleWallRunning(float delta)
{ {
_canDash = false;
_canDashAirborne = false;
// Find horizontal velocity projected on the current wall // Find horizontal velocity projected on the current wall
var hvel = new Vector3(Velocity.X, 0, Velocity.Z); var hvel = new Vector3(Velocity.X, 0, Velocity.Z);
var hvelProjected = hvel.Slide(_wallHugStartNormal); var hvelProjected = hvel.Slide(_wallHugStartNormal);
@@ -595,16 +592,14 @@ public partial class PlayerController : CharacterBody3D
// Adapt vertical speed // Adapt vertical speed
var verticalSpeed = Velocity.Y - WallRunAltitudeLossSpeed * delta; var verticalSpeed = Velocity.Y - WallRunAltitudeLossSpeed * delta;
Velocity = finalHVel + Vector3.Up*verticalSpeed; Velocity = finalHVel + Vector3.Up*verticalSpeed;
Velocity *= 0.995f; Velocity *= 0.999f;
_currentWallContactPoint = WallHugSystem.WallHugLocation.UnwrapOr(Vector3.Zero); _currentWallContactPoint = WallHugSystem.WallHugLocation.UnwrapOr(Vector3.Zero);
if (isOnFloorCustom()) if (isOnFloorCustom())
_playerState.SendEvent("grounded"); _playerState.SendEvent("grounded");
if (!WallHugSystem.IsWallHugging() || Velocity.Length() < WallRunSpeedThreshold) if (!WallHugSystem.IsWallHugging())
{
_playerState.SendEvent("start_falling"); _playerState.SendEvent("start_falling");
}
} }
public void WallHug(float delta) public void WallHug(float delta)
@@ -625,26 +620,29 @@ public partial class PlayerController : CharacterBody3D
// Jump // Jump
public void OnInputJumpStarted() public void OnInputJumpStarted()
{ {
_currentInputBufferFrames = InputBufferFrames;
_bufferedAction = _mantling.Active ? BufferedActions.MantleJump : BufferedActions.Jump;
_isJumpInputPressed = true; _isJumpInputPressed = true;
PerformJump();
}
public void PerformJump()
{
if (MantleSystem.IsMantlePossible) if (MantleSystem.IsMantlePossible)
{ {
_playerState.SendEvent("mantle"); _playerState.SendEvent("mantle");
return; return;
} }
if (_empowerOn.Active && CanPerformEmpoweredAction())
{
_playerState.SendEvent("megajump");
return;
}
if (_onWallHuggingCoyoteEnabled.Active || _onWallRunningCoyoteEnabled.Active)
{
if (!_isWallJumpAvailable) return;
}
_playerState.SendEvent("jump"); _playerState.SendEvent("jump");
} }
public bool IsFacingWall()
{
return _wallHugStartNormal.Dot(GetGlobalForwardFacingVector()) < -0.5f;
}
public void OnInputJumpOngoing() public void OnInputJumpOngoing()
{ {
} }
@@ -667,14 +665,9 @@ public partial class PlayerController : CharacterBody3D
public void OnDoubleJumpStarted() public void OnDoubleJumpStarted()
{ {
_canDash = true; _canDash = true;
_canDashAirborne = true; // _canDashAirborne = true;
OnJumpStarted(DoubleJumpStartVelocity); OnJumpStarted(DoubleJumpStartVelocity);
} }
public void OnMegaJumpStarted()
{
PerformEmpoweredAction();
OnJumpStarted(MegaJumpStartVelocity);
}
public void ComputeJumpFromWallHSpeed(float jumpStrength) public void ComputeJumpFromWallHSpeed(float jumpStrength)
{ {
@@ -691,19 +684,27 @@ public partial class PlayerController : CharacterBody3D
SetHorizontalVelocity(currentHorizontalVelocity + wallJumpHorizontalVelocity); SetHorizontalVelocity(currentHorizontalVelocity + wallJumpHorizontalVelocity);
} }
public void OnJumpFromWallCoyote()
{
_isWallJumpAvailable = false;
}
public void OnJumpFromWall() public void OnJumpFromWall()
{ {
ComputeJumpFromWallHSpeed(WallJumpStartVelocity); if (!IsFacingWall() || (!_isWallJumpAvailable && IsFacingWall()))
{
ComputeJumpFromWallHSpeed(WallJumpStartVelocity);
}
// Remove the ability to dash straight away so you cannot scale up the wall
_canDashAirborne = false;
_airborneDashCooldownTimer.Start();
_isWallJumpAvailable = false;
} }
public void OnMegajumpFromWall()
public void OnInputSlideStarted()
{
}
public void OnInputSlideOngoing()
{
}
public void OnInputSlideEnded()
{ {
ComputeJumpFromWallHSpeed(WallMegajumpStartVelocity);
} }
public void InputDeviceChanged(bool isUsingGamepad) public void InputDeviceChanged(bool isUsingGamepad)
@@ -762,6 +763,11 @@ public partial class PlayerController : CharacterBody3D
private Transform3D _customMantleStartTransform; private Transform3D _customMantleStartTransform;
private Curve3D _customMantleCurve; private Curve3D _customMantleCurve;
private Vector3 _mantleStartPosition; private Vector3 _mantleStartPosition;
private Vector3 _velocityOnMantleStarted = Vector3.Zero;
private bool _mantleEndedOnOtherSideOfWall;
private bool _mantleFoundGround;
public void OnMantleStarted() public void OnMantleStarted()
{ {
HeadSystem.OnMantle(); HeadSystem.OnMantle();
@@ -772,17 +778,22 @@ public partial class PlayerController : CharacterBody3D
GD.PrintErr("Failed to instantiate MantlePath"); GD.PrintErr("Failed to instantiate MantlePath");
return; return;
} }
_velocityOnMantleStarted = Velocity;
var transform = _customMantle ? _customMantleStartTransform : MantleSystem.GlobalTransform; var transform = _customMantle ? _customMantleStartTransform : MantleSystem.GlobalTransform;
var curve = _customMantle ? _customMantleCurve : MantleSystem.MantleCurve; var curve = _customMantle ? _customMantleCurve : MantleSystem.MantleCurve;
_mantleEndedOnOtherSideOfWall = _customMantle ? _mantleEndedOnOtherSideOfWall : MantleSystem.EndedOnOtherSideOfWall;
_mantleFoundGround = _customMantle ? _mantleFoundGround : MantleSystem.FoundGround;
GetTree().GetRoot().AddChild(_mantlePath); GetTree().GetRoot().AddChild(_mantlePath);
_mantlePath.Setup(transform, curve); _mantlePath.Setup(transform, curve);
_mantleStartPosition = GlobalPosition; _mantleStartPosition = GlobalPosition;
var curveLength = curve.GetBakedLength();
var tween = GetTree().CreateTween(); var tween = GetTree().CreateTween();
tween.SetTrans(Tween.TransitionType.Linear); tween.SetTrans(Tween.TransitionType.Linear);
tween.SetEase(Tween.EaseType.InOut); tween.SetEase(Tween.EaseType.In);
tween.TweenProperty(_mantlePath.PathFollow, "progress_ratio", 1, MantleTime); tween.TweenProperty(_mantlePath.PathFollow, "progress_ratio", 1, MantleTime*curveLength);
tween.Finished += MantleFinished; tween.Finished += MantleFinished;
} }
@@ -791,26 +802,31 @@ public partial class PlayerController : CharacterBody3D
GlobalPosition = _mantlePath.Target.GlobalPosition; GlobalPosition = _mantlePath.Target.GlobalPosition;
} }
public void SimpleDashInDirection(Vector3 direction) public void SimpleDashInDirection(Vector3 direction, float strength = -1)
{ {
SetVelocity(direction * SimpleDashStrength); if (strength < 0) strength = SimpleDashStrength;
SetVelocity(direction * strength);
} }
public void SimpleDash() public void SimpleDash(float strength = -1)
{ {
SimpleDashInDirection(GetInputGlobalHDirection()); SimpleDashInDirection(GetInputGlobalHDirection(), strength);
} }
public void MantleFinished() public void MantleFinished()
{ {
_mantlePath.Teardown(); _mantlePath.Teardown();
// SetVelocity(_finalCurveDirection.Normalized() * _speedOverCurve);
var isThereMovementInput = GetMoveInput().Length() > 0; var isThereMovementInput = GetMoveInput().Length() > 0;
if (isThereMovementInput) if (isThereMovementInput)
{ {
// If there's a movement input on Mantle, we dash in the direction the mantle took place // If there's a movement input on Mantle, we dash in the direction the mantle ended with
var positionDifference = GlobalPosition - _mantleStartPosition; var positionDifference = GlobalPosition - _mantleStartPosition;
var directionHorizontal = new Vector3(positionDifference.X, 0, positionDifference.Z); var directionHorizontal = new Vector3(positionDifference.X, 0, positionDifference.Z);
SimpleDashInDirection(directionHorizontal.Normalized()); // SimpleDashInDirection(directionHorizontal.Normalized());
SetVelocity(directionHorizontal.Normalized() * WalkSpeed);
} }
_customMantle = false; _customMantle = false;
@@ -847,8 +863,8 @@ public partial class PlayerController : CharacterBody3D
SetVerticalVelocity(Velocity.Y - 2.0f); SetVerticalVelocity(Velocity.Y - 2.0f);
} }
// Move back to Airborne state management when starting to go down again // Move back to Airborne state when starting to go down again or if input isn't held anymore (buffered jump)
if (_framesSinceJumpAtApex > hangFrames) if (_framesSinceJumpAtApex > hangFrames || !_isJumpInputPressed)
_playerState.SendEvent("jump_ended"); _playerState.SendEvent("jump_ended");
} }
public void HandleSimpleJump(float delta) public void HandleSimpleJump(float delta)
@@ -859,10 +875,6 @@ public partial class PlayerController : CharacterBody3D
{ {
HandleJump(delta, DoubleJumpGravityLesseningFactor, DoubleJumpHangTimeInFrames); HandleJump(delta, DoubleJumpGravityLesseningFactor, DoubleJumpHangTimeInFrames);
} }
public void HandleMegaJump(float delta)
{
HandleJump(delta, MegaJumpGravityLesseningFactor, MegaJumpHangTimeInFrames);
}
public void PowerRecharging(float delta) public void PowerRecharging(float delta)
{ {
@@ -931,14 +943,6 @@ public partial class PlayerController : CharacterBody3D
ThrowWeapon(); ThrowWeapon();
} }
} }
public void OnInputEmpowerDown()
{
// _playerState.SendEvent("empower_down");
}
public void OnInputEmpowerReleased()
{
// _playerState.SendEvent("empower_released");
}
public void OnInputDashPressed() public void OnInputDashPressed()
{ {
if (_aiming.Active && CanPerformEmpoweredAction()) if (_aiming.Active && CanPerformEmpoweredAction())
@@ -948,12 +952,6 @@ public partial class PlayerController : CharacterBody3D
_playerState.SendEvent("cancel_aim"); _playerState.SendEvent("cancel_aim");
return; return;
} }
if (_empowerOn.Active && CanPerformEmpoweredAction())
{
PerformEmpoweredAction();
_playerState.SendEvent("powered_dash");
return;
}
if (_airborne.Active) if (_airborne.Active)
{ {
@@ -961,14 +959,19 @@ public partial class PlayerController : CharacterBody3D
return; return;
_canDashAirborne = false; _canDashAirborne = false;
} }
_currentInputBufferFrames = InputBufferFrames;
_bufferedAction = _mantling.Active ? BufferedActions.MantleDash : BufferedActions.Dash;
_playerState.SendEvent("dash"); _playerState.SendEvent("dash");
} }
public void OnAimingEntered()
public void OnInputSlamPressed()
{
GD.Print("Slam pressed");
}
public void OnInputParryPressed()
{ {
if (!CanPerformEmpoweredAction())
return;
if (WeaponSystem.FlyingState.Active) if (WeaponSystem.FlyingState.Active)
{ {
DashToFlyingWeapon(); DashToFlyingWeapon();
@@ -980,10 +983,14 @@ public partial class PlayerController : CharacterBody3D
DashToPlantedWeapon(); DashToPlantedWeapon();
return; return;
} }
}
public void OnAimingEntered()
{
if (!CanPerformEmpoweredAction())
return;
DashSystem.StartPreparingDash(); DashSystem.StartPreparingDash();
DashIndicatorMesh.Visible = true; DashIndicatorMesh.Visible = true;
if (!isOnFloorCustom()) if (!isOnFloorCustom())
ReduceTimeScaleWhileAiming(); ReduceTimeScaleWhileAiming();
} }
@@ -1085,6 +1092,8 @@ public partial class PlayerController : CharacterBody3D
_customMantle = DashSystem.ShouldMantle; _customMantle = DashSystem.ShouldMantle;
_customMantleCurve = DashSystem.MantleSystem.MantleCurve; _customMantleCurve = DashSystem.MantleSystem.MantleCurve;
_customMantleStartTransform = DashSystem.MantleSystem.GlobalTransform; _customMantleStartTransform = DashSystem.MantleSystem.GlobalTransform;
_mantleEndedOnOtherSideOfWall = DashSystem.MantleSystem.EndedOnOtherSideOfWall;
_mantleFoundGround = DashSystem.MantleSystem.FoundGround;
} }
Tween CreatePositionTween(Vector3 targetLocation, float tweenTime) Tween CreatePositionTween(Vector3 targetLocation, float tweenTime)
@@ -1172,31 +1181,7 @@ public partial class PlayerController : CharacterBody3D
var direction = GetMoveInput(); var direction = GetMoveInput();
return new Vector3(direction.X, 0, direction.Z).Normalized(); return new Vector3(direction.X, 0, direction.Z).Normalized();
} }
public void OnPoweredDashStarted()
{
Velocity = GetInputGlobalHDirection() * PoweredDashStrength;
GetTree().CreateTimer(PoweredDashTime).Timeout += FinishPoweredDash;
}
public void OnPoweredDashFinished()
{
}
public void FinishPoweredDash()
{
_playerState.SendEvent("dash_finished");
}
public void HandlePoweredDash(float delta)
{
var collision = MoveAndCollide(Velocity * delta, maxCollisions: 10);
if (collision != null)
{
FinishPoweredDash();
}
}
public bool CanPerformEmpoweredAction() public bool CanPerformEmpoweredAction()
{ {
return EmpoweredActionsLeft > 0 && TutorialDone; return EmpoweredActionsLeft > 0 && TutorialDone;
@@ -1226,7 +1211,7 @@ public partial class PlayerController : CharacterBody3D
Vector2 inputLookDir = new Vector2(_inputRotateY, _inputRotateFloorplane); Vector2 inputLookDir = new Vector2(_inputRotateY, _inputRotateFloorplane);
var lookSensitivity = _isUsingGamepad ? _lookSensitivityMultiplier : _mouseSensitivityMultiplier; var lookSensitivity = _isUsingGamepad ? _lookSensitivityMultiplier : _mouseSensitivityMultiplier;
var wallHugContactPoint = _onWallRunning.Active || _onWallRunningCoyoteEnabled.Active ? _currentWallContactPoint : Vector3.Zero; var wallHugContactPoint = _onWallRunning.Active ? _currentWallContactPoint : Vector3.Zero;
var playerVelocity = GetGlobalMoveInput(); var playerVelocity = GetGlobalMoveInput();
HeadSystem.LookAround(delta, inputLookDir, playerVelocity, wallHugContactPoint, lookSensitivity); HeadSystem.LookAround(delta, inputLookDir, playerVelocity, wallHugContactPoint, lookSensitivity);
} }
@@ -1237,9 +1222,9 @@ public partial class PlayerController : CharacterBody3D
Velocity = new Vector3(horizontalVelocity.X, Velocity.Y, horizontalVelocity.Z); Velocity = new Vector3(horizontalVelocity.X, Velocity.Y, horizontalVelocity.Z);
} }
public void MoveInAir(double delta) public void MoveInAir(double delta, bool isGroundLike = false)
{ {
var horizontalVelocity = ComputeHVelocityAir((float) delta); var horizontalVelocity = isGroundLike ? ComputeHVelocityGround((float) delta) : ComputeHVelocityAir((float) delta);
var verticalVelocity = Velocity.Y - (CalculateGravityForce() * (float)delta); var verticalVelocity = Velocity.Y - (CalculateGravityForce() * (float)delta);
Velocity = new Vector3(horizontalVelocity.X, verticalVelocity, horizontalVelocity.Z); Velocity = new Vector3(horizontalVelocity.X, verticalVelocity, horizontalVelocity.Z);
} }
@@ -1306,7 +1291,7 @@ public partial class PlayerController : CharacterBody3D
Bobbing.CameraBobbingParams cameraBobbingParams = new Bobbing.CameraBobbingParams Bobbing.CameraBobbingParams cameraBobbingParams = new Bobbing.CameraBobbingParams
{ {
Delta = delta, Delta = delta,
IsOnFloorCustom = isOnFloorCustom() || _onWallRunning.Active || _onWallRunningCoyoteEnabled.Active, IsOnFloorCustom = isOnFloorCustom() || _onWallRunning.Active,
Velocity = Velocity, Velocity = Velocity,
SettingsMultiplier = _headBobbingMultiplier SettingsMultiplier = _headBobbingMultiplier
}; };
@@ -1361,17 +1346,23 @@ public partial class PlayerController : CharacterBody3D
{ {
WeaponRoot.SetRotation(HeadSystem.Rotation); WeaponRoot.SetRotation(HeadSystem.Rotation);
} }
public Vector3 GetGlobalForwardFacingVector()
{
return Transform.Basis * HeadSystem.Transform.Basis * Vector3.Forward;
}
/////////////////////////// ///////////////////////////
// Processes ////////////// // Processes //////////////
/////////////////////////// ///////////////////////////
public override void _PhysicsProcess(double delta) public override void _PhysicsProcess(double delta)
{ {
if (_currentInputBufferFrames > 0) _currentInputBufferFrames -= 1;
LookAround(delta); LookAround(delta);
CameraModifications((float) delta); CameraModifications((float) delta);
HandleStairs((float) delta); HandleStairs((float) delta);
MantleSystem.ProcessMantle(_grounded.Active); MantleSystem.ProcessMantle(_grounded.Active);
if (WeaponSystem.InHandState.Active) if (WeaponSystem.InHandState.Active)
RotateWeaponWithPlayer(); RotateWeaponWithPlayer();

View File

@@ -161,5 +161,6 @@ common/physics_interpolation=true
[rendering] [rendering]
textures/vram_compression/import_etc2_astc=true textures/vram_compression/import_etc2_astc=true
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5
environment/volumetric_fog/volume_size=256 environment/volumetric_fog/volume_size=256
environment/volumetric_fog/volume_depth=256 environment/volumetric_fog/volume_depth=256

View File

@@ -20,6 +20,6 @@ public partial class Path : Path3D
public void Teardown() public void Teardown()
{ {
QueueFree(); if (!IsQueuedForDeletion()) QueueFree();
} }
} }

View File

@@ -1,14 +0,0 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://7wm8ywvujwf"]
[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_36r6u"]
[resource]
script = ExtResource("1_36r6u")
name = &""
action_value_type = 0
block_lower_priority_actions = true
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""
metadata/_custom_type_script = "uid://cluhc11vixkf1"

View File

@@ -1,4 +1,4 @@
[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=155 format=3 uid="uid://bl5crtu1gkrtr"] [gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=157 format=3 uid="uid://bl5crtu1gkrtr"]
[ext_resource type="Script" uid="uid://cpplm41b5bt6m" path="res://addons/guide/guide_action_mapping.gd" id="1_qmhk6"] [ext_resource type="Script" uid="uid://cpplm41b5bt6m" path="res://addons/guide/guide_action_mapping.gd" id="1_qmhk6"]
[ext_resource type="Resource" uid="uid://htqvokm8mufq" path="res://systems/inputs/base_mode/move.tres" id="2_g6bbx"] [ext_resource type="Resource" uid="uid://htqvokm8mufq" path="res://systems/inputs/base_mode/move.tres" id="2_g6bbx"]
@@ -18,22 +18,22 @@
[ext_resource type="Script" uid="uid://b52rqq28tuqpg" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="15_fykw6"] [ext_resource type="Script" uid="uid://b52rqq28tuqpg" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="15_fykw6"]
[ext_resource type="Script" uid="uid://b4cdrn4paoj3i" path="res://addons/guide/triggers/guide_trigger_down.gd" id="15_g6bbx"] [ext_resource type="Script" uid="uid://b4cdrn4paoj3i" path="res://addons/guide/triggers/guide_trigger_down.gd" id="15_g6bbx"]
[ext_resource type="Script" uid="uid://cgy4anjdob2tp" path="res://addons/guide/modifiers/guide_modifier_window_relative.gd" id="15_rvpjj"] [ext_resource type="Script" uid="uid://cgy4anjdob2tp" path="res://addons/guide/modifiers/guide_modifier_window_relative.gd" id="15_rvpjj"]
[ext_resource type="Resource" uid="uid://b334rau1yxmm7" path="res://systems/inputs/base_mode/empower_down.tres" id="16_0qat1"]
[ext_resource type="Resource" uid="uid://bebstkm608wxx" path="res://systems/inputs/base_mode/aim_pressed.tres" id="16_li5ak"] [ext_resource type="Resource" uid="uid://bebstkm608wxx" path="res://systems/inputs/base_mode/aim_pressed.tres" id="16_li5ak"]
[ext_resource type="Resource" uid="uid://j1o5ud0plk4" path="res://systems/inputs/base_mode/aim_release.tres" id="16_rvpjj"] [ext_resource type="Resource" uid="uid://j1o5ud0plk4" path="res://systems/inputs/base_mode/aim_release.tres" id="16_rvpjj"]
[ext_resource type="Script" uid="uid://vgjlx6p007lp" path="res://addons/guide/inputs/guide_input_mouse_button.gd" id="17_kxb2c"] [ext_resource type="Script" uid="uid://vgjlx6p007lp" path="res://addons/guide/inputs/guide_input_mouse_button.gd" id="17_kxb2c"]
[ext_resource type="Script" uid="uid://biiggjw6tv4uq" path="res://addons/guide/triggers/guide_trigger_released.gd" id="17_s8kjn"] [ext_resource type="Script" uid="uid://biiggjw6tv4uq" path="res://addons/guide/triggers/guide_trigger_released.gd" id="17_s8kjn"]
[ext_resource type="Resource" uid="uid://7wm8ywvujwf" path="res://systems/inputs/base_mode/aim_cancel.tres" id="18_vibkn"]
[ext_resource type="Resource" uid="uid://bbce5wfwxpns1" path="res://systems/inputs/base_mode/empower_release.tres" id="19_li5ak"]
[ext_resource type="Script" uid="uid://rvttn472ix6v" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="19_qkgmj"] [ext_resource type="Script" uid="uid://rvttn472ix6v" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="19_qkgmj"]
[ext_resource type="Resource" uid="uid://bdit2jy5gbpts" path="res://systems/inputs/base_mode/jump.tres" id="21_818lq"] [ext_resource type="Resource" uid="uid://bdit2jy5gbpts" path="res://systems/inputs/base_mode/jump.tres" id="21_818lq"]
[ext_resource type="Resource" uid="uid://b5gx3q8nvu72e" path="res://systems/inputs/base_mode/hit.tres" id="22_2hs2y"] [ext_resource type="Resource" uid="uid://b5gx3q8nvu72e" path="res://systems/inputs/base_mode/hit.tres" id="22_2hs2y"]
[ext_resource type="Resource" uid="uid://d2r0ur8k3cuu3" path="res://systems/inputs/base_mode/dash.tres" id="23_g6bbx"] [ext_resource type="Resource" uid="uid://d2r0ur8k3cuu3" path="res://systems/inputs/base_mode/dash.tres" id="23_g6bbx"]
[ext_resource type="Script" uid="uid://dsa1dnifd6w32" path="res://addons/guide/guide_mapping_context.gd" id="23_llfhp"] [ext_resource type="Script" uid="uid://dsa1dnifd6w32" path="res://addons/guide/guide_mapping_context.gd" id="23_llfhp"]
[ext_resource type="Resource" uid="uid://bw5k2gsv3jqcv" path="res://systems/inputs/base_mode/throw.tres" id="24_yp12v"] [ext_resource type="Resource" uid="uid://bbce5wfwxpns1" path="res://systems/inputs/base_mode/slide_pressed.tres" id="23_rvpjj"]
[ext_resource type="Resource" uid="uid://b334rau1yxmm7" path="res://systems/inputs/base_mode/slide.tres" id="25_s8kjn"]
[ext_resource type="Resource" uid="uid://55b0dsvioj08" path="res://systems/inputs/base_mode/jump_pressed.tres" id="25_si4d4"] [ext_resource type="Resource" uid="uid://55b0dsvioj08" path="res://systems/inputs/base_mode/jump_pressed.tres" id="25_si4d4"]
[ext_resource type="Resource" uid="uid://dgluj0ql5vth7" path="res://systems/inputs/base_mode/pause.tres" id="29_q86qg"] [ext_resource type="Resource" uid="uid://dgluj0ql5vth7" path="res://systems/inputs/base_mode/pause.tres" id="29_q86qg"]
[ext_resource type="Script" uid="uid://cw71o87tvdx3q" path="res://addons/guide/inputs/guide_input_key.gd" id="30_cvxqo"] [ext_resource type="Script" uid="uid://cw71o87tvdx3q" path="res://addons/guide/inputs/guide_input_key.gd" id="30_cvxqo"]
[ext_resource type="Resource" uid="uid://spo3pbqjx0eb" path="res://systems/inputs/base_mode/parry.tres" id="30_rvpjj"]
[ext_resource type="Resource" uid="uid://dxy0071ic1wdj" path="res://systems/inputs/base_mode/slam.tres" id="32_s8kjn"]
[ext_resource type="Resource" uid="uid://s1l0n1iitc6m" path="res://systems/inputs/base_mode/move_back.tres" id="33_fykw6"] [ext_resource type="Resource" uid="uid://s1l0n1iitc6m" path="res://systems/inputs/base_mode/move_back.tres" id="33_fykw6"]
[ext_resource type="Resource" uid="uid://brswsknpgwal2" path="res://systems/inputs/base_mode/move_front.tres" id="34_rvpjj"] [ext_resource type="Resource" uid="uid://brswsknpgwal2" path="res://systems/inputs/base_mode/move_front.tres" id="34_rvpjj"]
[ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://systems/inputs/base_mode/move_left.tres" id="35_s8kjn"] [ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://systems/inputs/base_mode/move_left.tres" id="35_s8kjn"]
@@ -229,57 +229,54 @@ action = ExtResource("16_rvpjj")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_bkx7d"), SubResource("Resource_yxj6r")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_bkx7d"), SubResource("Resource_yxj6r")])
metadata/_guide_input_mappings_collapsed = false metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_fykw6"]
script = ExtResource("10_cvxqo")
axis = 5
[sub_resource type="Resource" id="Resource_rvpjj"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_s8kjn"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_fykw6")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_rvpjj")])
metadata/_guide_triggers_collapsed = false
[sub_resource type="Resource" id="Resource_vibkn"]
script = ExtResource("1_qmhk6")
action = ExtResource("16_0qat1")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_s8kjn")])
[sub_resource type="Resource" id="Resource_qkgmj"] [sub_resource type="Resource" id="Resource_qkgmj"]
script = ExtResource("10_cvxqo") script = ExtResource("10_cvxqo")
axis = 5 axis = 5
[sub_resource type="Resource" id="Resource_st2ej"] [sub_resource type="Resource" id="Resource_st2ej"]
script = ExtResource("17_s8kjn") script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_818lq"] [sub_resource type="Resource" id="Resource_s8kjn"]
script = ExtResource("3_yp12v") script = ExtResource("3_yp12v")
input = SubResource("Resource_qkgmj") input = SubResource("Resource_qkgmj")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_st2ej")]) triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_st2ej")])
metadata/_guide_triggers_collapsed = false
[sub_resource type="Resource" id="Resource_wcvib"]
script = ExtResource("30_cvxqo")
key = 4194326
[sub_resource type="Resource" id="Resource_imjft"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_wcvib")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_st2ej")])
metadata/_guide_triggers_collapsed = false
[sub_resource type="Resource" id="Resource_vibkn"]
script = ExtResource("1_qmhk6")
action = ExtResource("23_rvpjj")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_s8kjn"), SubResource("Resource_imjft")])
[sub_resource type="Resource" id="Resource_f3pn5"]
script = ExtResource("10_cvxqo")
axis = 5
[sub_resource type="Resource" id="Resource_818lq"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_f3pn5")
[sub_resource type="Resource" id="Resource_qksfw"]
script = ExtResource("30_cvxqo")
key = 4194326
[sub_resource type="Resource" id="Resource_woy8j"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_qksfw")
[sub_resource type="Resource" id="Resource_2hs2y"] [sub_resource type="Resource" id="Resource_2hs2y"]
script = ExtResource("1_qmhk6") script = ExtResource("1_qmhk6")
action = ExtResource("19_li5ak") action = ExtResource("25_s8kjn")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_818lq")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_818lq"), SubResource("Resource_woy8j")])
[sub_resource type="Resource" id="Resource_lfx76"]
script = ExtResource("19_qkgmj")
button = 2
[sub_resource type="Resource" id="Resource_oruo7"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_4ee3d"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_lfx76")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_oruo7")])
[sub_resource type="Resource" id="Resource_0s4kt"]
script = ExtResource("1_qmhk6")
action = ExtResource("18_vibkn")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_4ee3d")])
[sub_resource type="Resource" id="Resource_1fkas"] [sub_resource type="Resource" id="Resource_1fkas"]
script = ExtResource("19_qkgmj") script = ExtResource("19_qkgmj")
@@ -359,6 +356,35 @@ script = ExtResource("1_qmhk6")
action = ExtResource("22_2hs2y") action = ExtResource("22_2hs2y")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_500v3"), SubResource("Resource_a8sqk")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_500v3"), SubResource("Resource_a8sqk")])
[sub_resource type="Resource" id="Resource_kx31q"]
script = ExtResource("19_qkgmj")
button = 9
[sub_resource type="Resource" id="Resource_oux88"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_b7w5s"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_kx31q")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_oux88")])
[sub_resource type="Resource" id="Resource_jk2g8"]
script = ExtResource("30_cvxqo")
key = 70
[sub_resource type="Resource" id="Resource_y7p41"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_3uxou"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_jk2g8")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_y7p41")])
[sub_resource type="Resource" id="Resource_3frwi"]
script = ExtResource("1_qmhk6")
action = ExtResource("30_rvpjj")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_b7w5s"), SubResource("Resource_3uxou")])
[sub_resource type="Resource" id="Resource_g6bbx"] [sub_resource type="Resource" id="Resource_g6bbx"]
script = ExtResource("19_qkgmj") script = ExtResource("19_qkgmj")
button = 1 button = 1
@@ -383,52 +409,36 @@ script = ExtResource("3_yp12v")
input = SubResource("Resource_xbeov") input = SubResource("Resource_xbeov")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_rt8uw")]) triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_rt8uw")])
[sub_resource type="Resource" id="Resource_jk2g8"]
script = ExtResource("30_cvxqo")
key = 70
[sub_resource type="Resource" id="Resource_wcvib"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_imjft"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_jk2g8")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_wcvib")])
[sub_resource type="Resource" id="Resource_kx31q"]
script = ExtResource("30_cvxqo")
key = 4194326
[sub_resource type="Resource" id="Resource_oux88"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_b7w5s"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_kx31q")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_oux88")])
[sub_resource type="Resource" id="Resource_0qat1"] [sub_resource type="Resource" id="Resource_0qat1"]
script = ExtResource("1_qmhk6") script = ExtResource("1_qmhk6")
action = ExtResource("23_g6bbx") action = ExtResource("23_g6bbx")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_1rw8g"), SubResource("Resource_hj46p"), SubResource("Resource_imjft"), SubResource("Resource_b7w5s")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_1rw8g"), SubResource("Resource_hj46p")])
metadata/_guide_input_mappings_collapsed = false metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_j3axn"] [sub_resource type="Resource" id="Resource_o5yys"]
script = ExtResource("19_qkgmj") script = ExtResource("19_qkgmj")
button = 3 button = 2
[sub_resource type="Resource" id="Resource_kxb2c"] [sub_resource type="Resource" id="Resource_kxb2c"]
script = ExtResource("15_fykw6") script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_v2ywt"] [sub_resource type="Resource" id="Resource_v2ywt"]
script = ExtResource("3_yp12v") script = ExtResource("3_yp12v")
input = SubResource("Resource_j3axn") input = SubResource("Resource_o5yys")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_kxb2c")]) triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_kxb2c")])
[sub_resource type="Resource" id="Resource_qpgnj"]
script = ExtResource("30_cvxqo")
key = 69
[sub_resource type="Resource" id="Resource_s6d3g"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_qpgnj")
[sub_resource type="Resource" id="Resource_vtk18"] [sub_resource type="Resource" id="Resource_vtk18"]
script = ExtResource("1_qmhk6") script = ExtResource("1_qmhk6")
action = ExtResource("24_yp12v") action = ExtResource("32_s8kjn")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_v2ywt")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_v2ywt"), SubResource("Resource_s6d3g")])
[sub_resource type="Resource" id="Resource_s4bc4"] [sub_resource type="Resource" id="Resource_s4bc4"]
script = ExtResource("30_cvxqo") script = ExtResource("30_cvxqo")
@@ -526,5 +536,5 @@ input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_7io5e")])
[resource] [resource]
script = ExtResource("23_llfhp") script = ExtResource("23_llfhp")
mappings = Array[ExtResource("1_qmhk6")]([SubResource("Resource_88x08"), SubResource("Resource_tgr2g"), SubResource("Resource_iarn8"), SubResource("Resource_cvxqo"), SubResource("Resource_tb8ii"), SubResource("Resource_iihs4"), SubResource("Resource_vibkn"), SubResource("Resource_2hs2y"), SubResource("Resource_0s4kt"), SubResource("Resource_d2r0d"), SubResource("Resource_xt1x5"), SubResource("Resource_ew1hw"), SubResource("Resource_0qat1"), SubResource("Resource_vtk18"), SubResource("Resource_weyro"), SubResource("Resource_fjku4"), SubResource("Resource_odnhd"), SubResource("Resource_0eff7"), SubResource("Resource_gt77e")]) mappings = Array[ExtResource("1_qmhk6")]([SubResource("Resource_88x08"), SubResource("Resource_tgr2g"), SubResource("Resource_iarn8"), SubResource("Resource_cvxqo"), SubResource("Resource_tb8ii"), SubResource("Resource_iihs4"), SubResource("Resource_vibkn"), SubResource("Resource_2hs2y"), SubResource("Resource_d2r0d"), SubResource("Resource_xt1x5"), SubResource("Resource_ew1hw"), SubResource("Resource_3frwi"), SubResource("Resource_0qat1"), SubResource("Resource_vtk18"), SubResource("Resource_weyro"), SubResource("Resource_fjku4"), SubResource("Resource_odnhd"), SubResource("Resource_0eff7"), SubResource("Resource_gt77e")])
metadata/_custom_type_script = "uid://dsa1dnifd6w32" metadata/_custom_type_script = "uid://dsa1dnifd6w32"

View File

@@ -0,0 +1,7 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://spo3pbqjx0eb"]
[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_hlutc"]
[resource]
script = ExtResource("1_hlutc")
metadata/_custom_type_script = "uid://cluhc11vixkf1"

View File

@@ -0,0 +1,7 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dxy0071ic1wdj"]
[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_6evmc"]
[resource]
script = ExtResource("1_6evmc")
metadata/_custom_type_script = "uid://cluhc11vixkf1"

View File

@@ -1,14 +0,0 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bw5k2gsv3jqcv"]
[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_7f0q6"]
[resource]
script = ExtResource("1_7f0q6")
name = &""
action_value_type = 0
block_lower_priority_actions = true
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""
metadata/_custom_type_script = "uid://cluhc11vixkf1"

View File

@@ -10,7 +10,7 @@ class_name InputController
@export var move_right:GUIDEAction @export var move_right:GUIDEAction
@export var move_front:GUIDEAction @export var move_front:GUIDEAction
@export var move_back:GUIDEAction @export var move_back:GUIDEAction
@export var rotate_y:GUIDEAction @export var rotate_vertical:GUIDEAction
@export var rotate_floorplane:GUIDEAction @export var rotate_floorplane:GUIDEAction
@export_group("Trigger actions") @export_group("Trigger actions")
@@ -21,13 +21,14 @@ class_name InputController
@export_subgroup("Jump") @export_subgroup("Jump")
@export var jump:GUIDEAction @export var jump:GUIDEAction
@export var jump_pressed:GUIDEAction @export var jump_pressed:GUIDEAction
@export_subgroup("Slide")
@export var slide:GUIDEAction
@export var slide_pressed:GUIDEAction
@export_subgroup("Other") @export_subgroup("Other")
@export var empower_down:GUIDEAction
@export var empower_released:GUIDEAction
@export var aim_canceled:GUIDEAction
@export var hit:GUIDEAction @export var hit:GUIDEAction
@export var parry:GUIDEAction
@export var dash:GUIDEAction @export var dash:GUIDEAction
@export var throw:GUIDEAction @export var slam:GUIDEAction
signal input_device_changed(is_gamepad: bool) signal input_device_changed(is_gamepad: bool)
var _using_gamepad = false var _using_gamepad = false
@@ -46,13 +47,14 @@ signal input_aim_pressed
signal input_aim_down signal input_aim_down
signal input_aim_released signal input_aim_released
signal input_empower_down signal input_slide_started
signal input_empower_released signal input_slide_ongoing
signal input_aim_canceled signal input_slide_ended
signal input_hit signal input_hit
signal input_parry
signal input_dash signal input_dash
signal input_throw signal input_slam
func _ready() -> void: func _ready() -> void:
GUIDE.enable_mapping_context(base_mode) GUIDE.enable_mapping_context(base_mode)
@@ -60,53 +62,50 @@ func _ready() -> void:
aim_down.triggered.connect(on_input_aim_down) aim_down.triggered.connect(on_input_aim_down)
aim_pressed.triggered.connect(on_input_aim_pressed) aim_pressed.triggered.connect(on_input_aim_pressed)
aim_released.triggered.connect(on_input_aim_released) aim_released.triggered.connect(on_input_aim_released)
empower_down.triggered.connect(on_input_empower_down)
empower_released.triggered.connect(on_input_empower_released)
aim_canceled.triggered.connect(on_input_aim_canceled)
jump_pressed.triggered.connect(on_input_jump_started) jump_pressed.triggered.connect(on_input_jump_started)
jump.triggered.connect(on_input_jump_ongoing) jump.triggered.connect(on_input_jump_ongoing)
jump.completed.connect(on_input_jump_ended) jump.completed.connect(on_input_jump_ended)
hit.triggered.connect(on_input_hit) slide_pressed.triggered.connect(on_input_slide_started)
dash.triggered.connect(on_input_dash) slide.triggered.connect(on_input_slide_ongoing)
throw.triggered.connect(on_input_throw) slide.completed.connect(on_input_slide_ended)
func on_input_dash():
input_dash.emit()
func on_input_throw(): hit.triggered.connect(on_input_hit)
input_throw.emit() parry.triggered.connect(on_input_parry)
dash.triggered.connect(on_input_dash)
slam.triggered.connect(on_input_slam)
func on_input_hit(): func on_input_hit():
input_hit.emit() input_hit.emit()
func on_input_parry():
input_parry.emit()
func on_input_dash():
input_dash.emit()
func on_input_slam():
input_slam.emit()
func on_input_jump_started(): func on_input_jump_started():
input_jump_started.emit() input_jump_started.emit()
func on_input_jump_ongoing(): func on_input_jump_ongoing():
input_jump_ongoing.emit() input_jump_ongoing.emit()
func on_input_jump_ended(): func on_input_jump_ended():
input_jump_ended.emit() input_jump_ended.emit()
func on_input_aim_down(): func on_input_aim_down():
input_aim_down.emit() input_aim_down.emit()
func on_input_aim_pressed(): func on_input_aim_pressed():
input_aim_pressed.emit() input_aim_pressed.emit()
func on_input_aim_released(): func on_input_aim_released():
input_aim_released.emit() input_aim_released.emit()
func on_input_empower_down(): func on_input_slide_started():
input_empower_down.emit() input_slide_started.emit()
func on_input_slide_ongoing():
func on_input_empower_released(): input_slide_ongoing.emit()
input_empower_released.emit() func on_input_slide_ended():
input_slide_ended.emit()
func on_input_aim_canceled():
input_aim_canceled.emit()
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if event is InputEventKey: if event is InputEventKey:
@@ -130,5 +129,5 @@ func _process(_delta: float) -> void:
input_move_keyboard.emit(keyboard_input_vector) input_move_keyboard.emit(keyboard_input_vector)
input_move.emit(move.value_axis_3d) input_move.emit(move.value_axis_3d)
input_rotate_y.emit(rotate_y.value_axis_1d) input_rotate_y.emit(rotate_vertical.value_axis_1d)
input_rotate_floorplane.emit(rotate_floorplane.value_axis_1d) input_rotate_floorplane.emit(rotate_floorplane.value_axis_1d)

View File

@@ -21,6 +21,8 @@ public partial class MantleSystem: Node3D
public Vector3 FirstMantleProfilePoint { get; private set; } = Vector3.Zero; public Vector3 FirstMantleProfilePoint { get; private set; } = Vector3.Zero;
public bool IsMantlePossible { get; private set; } = false; public bool IsMantlePossible { get; private set; } = false;
public bool EndedOnOtherSideOfWall { get; private set; } = false;
public bool FoundGround { get; private set; } = false;
public const int WallProfileCastCount = 7; public const int WallProfileCastCount = 7;
private ShapeCast3D[] _wallProfileShapecasts = new ShapeCast3D[WallProfileCastCount]; private ShapeCast3D[] _wallProfileShapecasts = new ShapeCast3D[WallProfileCastCount];
@@ -55,15 +57,20 @@ public partial class MantleSystem: Node3D
// Reset state // Reset state
IsMantlePossible = false; IsMantlePossible = false;
EndedOnOtherSideOfWall = false;
FoundGround = false;
if (!isColliding) return; if (!isColliding) return;
// Check if collide with wall // Check if face something wall-like that should be climbable
var collisionNormal = isGrounded ? _groundedWallDetect.GetCollisionNormal(0) : _inAirWallDetect.GetCollisionNormal(0); var collisionNormal = isGrounded ? _groundedWallDetect.GetCollisionNormal(0) : _inAirWallDetect.GetCollisionNormal(0);
if (collisionNormal.Y > 0.9f) return; if (collisionNormal.Y > 0.7f) return;
var spaceState = GetWorld3D().DirectSpaceState;
MantleCurve = new Curve3D(); MantleCurve = new Curve3D();
MantleCurve.AddPoint(Vector3.Zero); MantleCurve.AddPoint(Vector3.Zero);
var hasFirstProfileHit = false; var hasFirstProfileHit = false;
var previousProfilePoint = GlobalPosition;
foreach (var wallProfileShapecast in _wallProfileShapecasts) foreach (var wallProfileShapecast in _wallProfileShapecasts)
{ {
// Haven't met the wall yet // Haven't met the wall yet
@@ -74,22 +81,43 @@ public partial class MantleSystem: Node3D
// Got to the other side of the wall, we stop there // Got to the other side of the wall, we stop there
if (!wallProfileShapecast.IsColliding()) if (!wallProfileShapecast.IsColliding())
{ {
MantleCurve.AddPoint(ToLocal(globalTargetPosition)); /*EndedOnOtherSideOfWall = true;
var origin = globalTargetPosition;
var end = origin + Vector3.Down*0.51f; // We check for the ground a bit below our target
var groundQuery = PhysicsRayQueryParameters3D.Create(origin, end, wallProfileShapecast.CollisionMask);
var groundResult = spaceState.IntersectRay(groundQuery);
if (groundResult.Count > 0)
{
// We found the ground, this is our final location
FoundGround = true;
Vector3 position = (Vector3) groundResult["position"];
MantleCurve.AddPoint(ToLocal(position));
}*/
break; break;
} }
var profilePoint = wallProfileShapecast.GetCollisionPoint(0); var profilePoint = wallProfileShapecast.GetCollisionPoint(0);
var profileNormal = wallProfileShapecast.GetCollisionNormal(0); var profileNormal = wallProfileShapecast.GetCollisionNormal(0);
var shape = wallProfileShapecast.Shape as SphereShape3D;
var shapeRadius = shape == null ? 0.125f : shape.Radius;
var centerOfShape = profilePoint + profileNormal * shapeRadius;
// Check if we collided parallel to a wall // Check if we collided parallel to a wall
var isCollisionSameAsTarget = globalTargetPosition.IsEqualApprox(profilePoint); var isCollisionSameAsTarget = globalTargetPosition.IsEqualApprox(centerOfShape);
var isCollidingWithWall = profileNormal.Y < 0.1f; var isCollidingWithWall = profileNormal.Y < 0.1f;
if (isCollisionSameAsTarget || isCollidingWithWall) continue; if (isCollisionSameAsTarget || isCollidingWithWall) continue;
// Check if the path from the previous point makes us go through a wall
var query = PhysicsRayQueryParameters3D.Create(previousProfilePoint, centerOfShape, wallProfileShapecast.CollisionMask);
var result = spaceState.IntersectRay(query);
if (result.Count > 0) break; // We are going through a wall, we stop there
// We have a valid collision // We have a valid collision
if (!hasFirstProfileHit) FirstMantleProfilePoint = profilePoint; if (!hasFirstProfileHit) FirstMantleProfilePoint = centerOfShape;
hasFirstProfileHit = true; hasFirstProfileHit = true;
MantleCurve.AddPoint(ToLocal(profilePoint)); previousProfilePoint = centerOfShape;
MantleCurve.AddPoint(ToLocal(centerOfShape));
} }
if (MantleCurve.PointCount == 1) return; if (MantleCurve.PointCount == 1) return;

View File

@@ -58,47 +58,47 @@ collision_mask = 2
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.5)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2
[node name="ShapeCast2" type="ShapeCast3D" parent="WallProfileShapeCasts"] [node name="ShapeCast2" type="ShapeCast3D" parent="WallProfileShapeCasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.75) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.75)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2
[node name="ShapeCast3" type="ShapeCast3D" parent="WallProfileShapeCasts"] [node name="ShapeCast3" type="ShapeCast3D" parent="WallProfileShapeCasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2
[node name="ShapeCast4" type="ShapeCast3D" parent="WallProfileShapeCasts"] [node name="ShapeCast4" type="ShapeCast3D" parent="WallProfileShapeCasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.25) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.25)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2
[node name="ShapeCast5" type="ShapeCast3D" parent="WallProfileShapeCasts"] [node name="ShapeCast5" type="ShapeCast3D" parent="WallProfileShapeCasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.5)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2
[node name="ShapeCast6" type="ShapeCast3D" parent="WallProfileShapeCasts"] [node name="ShapeCast6" type="ShapeCast3D" parent="WallProfileShapeCasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.75) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.75)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2
[node name="ShapeCast7" type="ShapeCast3D" parent="WallProfileShapeCasts"] [node name="ShapeCast7" type="ShapeCast3D" parent="WallProfileShapeCasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -2)
enabled = false enabled = false
shape = SubResource("SphereShape3D_i32qj") shape = SubResource("SphereShape3D_i32qj")
target_position = Vector3(0, -2.375, 0) target_position = Vector3(0, -2.125, 0)
collision_mask = 2 collision_mask = 2