Compare commits

...

7 Commits

Author SHA1 Message Date
0e412c2a42 fixed level loading and starting to setup proper gyms, zoos and playtest levels
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 23s
Create tag and build when new code gets to main / Test (push) Successful in 8m23s
Create tag and build when new code gets to main / Export (push) Successful in 10m40s
2026-02-03 16:31:37 +01:00
8a3faff7d0 small refacto of dash actions 2026-02-03 15:10:22 +01:00
3525f0e3eb added a parry button and animation that lets player chose their enemy hit behaviour
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 22s
Create tag and build when new code gets to main / Test (push) Successful in 5m57s
Create tag and build when new code gets to main / Export (push) Successful in 7m43s
2026-01-30 13:19:28 +01:00
cc973b9f0d fixed spawners
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 22s
Create tag and build when new code gets to main / Test (push) Successful in 6m4s
Create tag and build when new code gets to main / Export (push) Successful in 8m2s
2026-01-28 19:14:05 +01:00
8a552f7993 #minor CI FIXED
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 23s
Create tag and build when new code gets to main / Test (push) Successful in 6m0s
Create tag and build when new code gets to main / Export (push) Successful in 7m58s
2026-01-28 18:28:40 +01:00
93841bc85d manually uploading to itch
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 / Test (push) Successful in 5m58s
Create tag and build when new code gets to main / Export (push) Successful in 7m52s
2026-01-28 18:15:15 +01:00
9ba8847626 changing itch action
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 22s
Create tag and build when new code gets to main / Test (push) Failing after 5m21s
Create tag and build when new code gets to main / Export (push) Failing after 7m11s
2026-01-28 17:56:59 +01:00
67 changed files with 1693 additions and 169 deletions

View File

@@ -36,7 +36,7 @@ jobs:
upload-report: false upload-report: false
- name: Upload test report - name: Upload test report
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v3-node20
with: with:
name: Test Report name: Test Report
path: ${{ github.workspace }}/reports/test-result.html path: ${{ github.workspace }}/reports/test-result.html

View File

@@ -60,7 +60,7 @@ jobs:
upload-report: false upload-report: false
- name: Upload test report - name: Upload test report
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v3-node20
with: with:
name: Test Report name: Test Report
path: ${{ github.workspace }}/reports/test-result.html path: ${{ github.workspace }}/reports/test-result.html
@@ -90,25 +90,27 @@ jobs:
mkdir -v -p build/windows mkdir -v -p build/windows
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe ${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
zip -r Windows.zip build/windows zip -r Windows.zip build/windows
ls -la
pwd
echo ${{ github.workspace }}
- uses: Oval-Tutu/publish-to-itch-with-butler@v1 - name: Setup Butler
with: shell: bash
api-key: ${{ secrets.BUTLER_TOKEN }} env:
itch_user: ${{ env.ITCHIO_USERNAME }} BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
itch_game: ${{ env.ITCHIO_GAMEID }} run: |
channel: windows mkdir ./tools 2>/dev/null || true
package: Windows.zip pushd tools
version: ${{ needs.BumpTag.outputs.tag_name }} curl -sSLfo ./butler.zip "https://broth.itch.zone/butler/linux-amd64/LATEST/archive/default"
unzip butler.zip
chmod +x ./butler
popd
./tools/butler -V
- name: Upload to itch.io
shell: bash
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
run: |
versionArgument="--userversion ${{ needs.BumpTag.outputs.tag_name }}"
./tools/butler push \
"Windows.zip" \
${{ env.ITCHIO_USERNAME }}/${{ env.ITCHIO_GAMEID }}:windows ${versionArgument}
# - name: Upload to Itch
# uses: KikimoraGames/itch-publish@v0.0.3
# with:
# butlerApiKey: ${{ secrets.BUTLER_TOKEN }}
# itchUsername: ${{ env.ITCHIO_USERNAME }}
# itchGameId: ${{ env.ITCHIO_GAMEID }}
# buildNumber: 0.1.0 # ${{ needs.BumpTag.outputs.tag_name }}
# gameData: ${{ github.workspace }}/Windows.zip
# buildChannel: windows

View File

@@ -42,62 +42,75 @@ jobs:
godot-version: '4.6' godot-version: '4.6'
dotnet-version: 'net9.0' dotnet-version: 'net9.0'
- name: Setup Butler
shell: bash
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
run: |
mkdir ./tools 2>/dev/null || true
pushd tools
curl -sSLfo ./butler.zip "https://broth.itch.zone/butler/linux-amd64/LATEST/archive/default"
unzip butler.zip
chmod +x ./butler
popd
./tools/butler -V
- 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: Upload to Itch - name: Upload Windows to itch.io
uses: KikimoraGames/itch-publish@v0.0.3 shell: bash
with: env:
butlerApiKey: ${{ secrets.BUTLER_TOKEN }} BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
itchUsername: ${{ env.ITCHIO_USERNAME }} run: |
itchGameId: ${{ env.ITCHIO_GAMEID }} versionArgument="--userversion ${{ needs.ReleaseName.outputs.release_name }}"
buildNumber: ${{ needs.ReleaseName.outputs.release_name }} ./tools/butler push \
gameData: Windows.zip "Windows.zip" \
buildChannel: windows ${{ env.ITCHIO_USERNAME }}/${{ env.ITCHIO_GAMEID }}:windows ${versionArgument}
- name: Build Windows ARM - name: Build Windows ARM
run: | run: |
mkdir -v -p build/windowsArm mkdir -v -p build/windowsArm
godot --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe godot --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe
zip -r WindowsArm.zip build/windowsArm zip -r WindowsArm.zip build/windowsArm
- name: Upload to Itch - name: Upload Windows to itch.io
uses: KikimoraGames/itch-publish@v0.0.3 shell: bash
with: env:
butlerApiKey: ${{ secrets.BUTLER_TOKEN }} BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
itchUsername: ${{ env.ITCHIO_USERNAME }} run: |
itchGameId: ${{ env.ITCHIO_GAMEID }} versionArgument="--userversion ${{ needs.ReleaseName.outputs.release_name }}"
buildNumber: ${{ needs.ReleaseName.outputs.release_name }} ./tools/butler push \
gameData: WindowsArm.zip "WindowsArm.zip" \
buildChannel: windows-arm ${{ env.ITCHIO_USERNAME }}/${{ env.ITCHIO_GAMEID }}:windows-arm ${versionArgument}
- name: Linux Build - name: Linux Build
run: | run: |
mkdir -v -p build/linux mkdir -v -p build/linux
godot --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64 godot --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
zip -r Linux.zip build/linux zip -r Linux.zip build/linux
- name: Upload to Itch - name: Upload Windows to itch.io
uses: KikimoraGames/itch-publish@v0.0.3 shell: bash
with: env:
butlerApiKey: ${{ secrets.BUTLER_TOKEN }} BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
itchUsername: ${{ env.ITCHIO_USERNAME }} run: |
itchGameId: ${{ env.ITCHIO_GAMEID }} versionArgument="--userversion ${{ needs.ReleaseName.outputs.release_name }}"
buildNumber: ${{ needs.ReleaseName.outputs.release_name }} ./tools/butler push \
gameData: Linux.zip "Linux.zip" \
buildChannel: linux ${{ env.ITCHIO_USERNAME }}/${{ env.ITCHIO_GAMEID }}:linux ${versionArgument}
- name: Mac Build - name: Mac Build
run: | run: |
mkdir -v -p build/mac mkdir -v -p build/mac
godot --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip godot --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
zip -r Mac.zip build/mac zip -r Mac.zip build/mac
- name: Upload to Itch - name: Upload Windows to itch.io
uses: KikimoraGames/itch-publish@v0.0.3 shell: bash
with: env:
butlerApiKey: ${{ secrets.BUTLER_TOKEN }} BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
itchUsername: ${{ env.ITCHIO_USERNAME }} run: |
itchGameId: ${{ env.ITCHIO_GAMEID }} versionArgument="--userversion ${{ needs.ReleaseName.outputs.release_name }}"
buildNumber: ${{ needs.ReleaseName.outputs.release_name }} ./tools/butler push \
gameData: Mac.zip "Mac.zip" \
buildChannel: mac ${{ env.ITCHIO_USERNAME }}/${{ env.ITCHIO_GAMEID }}:mac ${versionArgument}

BIN
assets/greybox/greybox_blue_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c4si5cetpfjsx"
path="res://.godot/imported/greybox_blue_grid.png-8cd3756907b9465009fdef23590a7e10.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_blue_grid.png"
dest_files=["res://.godot/imported/greybox_blue_grid.png-8cd3756907b9465009fdef23590a7e10.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_blue_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cubdmqt7mvofh"
path="res://.godot/imported/greybox_blue_solid.png-73fd2109ac26d63d4b465f9fdbf39c1d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_blue_solid.png"
dest_files=["res://.godot/imported/greybox_blue_solid.png-73fd2109ac26d63d4b465f9fdbf39c1d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_dark_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cv3b5gjslenlr"
path="res://.godot/imported/greybox_dark_grid.png-650326b02ce8de7b619b333b97451c9e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_dark_grid.png"
dest_files=["res://.godot/imported/greybox_dark_grid.png-650326b02ce8de7b619b333b97451c9e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_dark_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0fb4f41hssm5"
path="res://.godot/imported/greybox_dark_solid.png-b15b91f85aa45ac0ebbad03173c46e20.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_dark_solid.png"
dest_files=["res://.godot/imported/greybox_dark_solid.png-b15b91f85aa45ac0ebbad03173c46e20.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_green_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bkjusurqvb4q"
path="res://.godot/imported/greybox_green_grid.png-cb9366fe50966ade1eeb071d4a2016c4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_green_grid.png"
dest_files=["res://.godot/imported/greybox_green_grid.png-cb9366fe50966ade1eeb071d4a2016c4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_green_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bacqbuyggedyy"
path="res://.godot/imported/greybox_green_solid.png-add21b7e00a97e9ef0a7eede753d89ff.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_green_solid.png"
dest_files=["res://.godot/imported/greybox_green_solid.png-add21b7e00a97e9ef0a7eede753d89ff.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_grey_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bqqs6jweml03w"
path="res://.godot/imported/greybox_grey_grid.png-26095c1a41956f620b18195e2bc90091.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_grey_grid.png"
dest_files=["res://.godot/imported/greybox_grey_grid.png-26095c1a41956f620b18195e2bc90091.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_grey_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d35wx32padgp1"
path="res://.godot/imported/greybox_grey_solid.png-65bbc21ac3c6d5cf6c0ccf4750ce8a08.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_grey_solid.png"
dest_files=["res://.godot/imported/greybox_grey_solid.png-65bbc21ac3c6d5cf6c0ccf4750ce8a08.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_grey_solid_2.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bhvwhtsguc6g8"
path="res://.godot/imported/greybox_grey_solid_2.png-d23eac6cd5cfc0459188de4ea58a8ebb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_grey_solid_2.png"
dest_files=["res://.godot/imported/greybox_grey_solid_2.png-d23eac6cd5cfc0459188de4ea58a8ebb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_light_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d0qflfrscommy"
path="res://.godot/imported/greybox_light_grid.png-7eca13ef10388b7a948705824b3112ee.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_light_grid.png"
dest_files=["res://.godot/imported/greybox_light_grid.png-7eca13ef10388b7a948705824b3112ee.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_light_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://v6xb3yyu4bam"
path="res://.godot/imported/greybox_light_solid.png-cebdd2fedcee40d20355e5b9f3921fc2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_light_solid.png"
dest_files=["res://.godot/imported/greybox_light_solid.png-cebdd2fedcee40d20355e5b9f3921fc2.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_lime_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c74sh3woly0qb"
path="res://.godot/imported/greybox_lime_grid.png-73007e8b635010f9a4394691d1604216.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_lime_grid.png"
dest_files=["res://.godot/imported/greybox_lime_grid.png-73007e8b635010f9a4394691d1604216.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_lime_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d2w4kpdxjqs0v"
path="res://.godot/imported/greybox_lime_solid.png-9c448948d12ebcb271a2ca5469bcd48f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_lime_solid.png"
dest_files=["res://.godot/imported/greybox_lime_solid.png-9c448948d12ebcb271a2ca5469bcd48f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_orange_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bf2kevgw4gu03"
path="res://.godot/imported/greybox_orange_grid.png-9f4765cb2a776889705b67f169cac12f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_orange_grid.png"
dest_files=["res://.godot/imported/greybox_orange_grid.png-9f4765cb2a776889705b67f169cac12f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_orange_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bwt2ejfdvi505"
path="res://.godot/imported/greybox_orange_solid.png-b4529d3416b3e38d1ff6e3dc3184f0c6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_orange_solid.png"
dest_files=["res://.godot/imported/greybox_orange_solid.png-b4529d3416b3e38d1ff6e3dc3184f0c6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_purple_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://des0wknntv107"
path="res://.godot/imported/greybox_purple_grid.png-699ec8cec24b371f6d191fb0403f1413.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_purple_grid.png"
dest_files=["res://.godot/imported/greybox_purple_grid.png-699ec8cec24b371f6d191fb0403f1413.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_purple_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c3sh7e12tuphh"
path="res://.godot/imported/greybox_purple_solid.png-2834bf5e93ffb097572663d0b6711ab0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_purple_solid.png"
dest_files=["res://.godot/imported/greybox_purple_solid.png-2834bf5e93ffb097572663d0b6711ab0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_red_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bxdr0oajba7d2"
path="res://.godot/imported/greybox_red_grid.png-354bd18621a1d081151863b3288fac86.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_red_grid.png"
dest_files=["res://.godot/imported/greybox_red_grid.png-354bd18621a1d081151863b3288fac86.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_red_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cun7t30skbay6"
path="res://.godot/imported/greybox_red_solid.png-9fe18e9b535fb0ec00eb458b83a9b8e7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_red_solid.png"
dest_files=["res://.godot/imported/greybox_red_solid.png-9fe18e9b535fb0ec00eb458b83a9b8e7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_teal_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nvc7eq13ym8q"
path="res://.godot/imported/greybox_teal_grid.png-faf53fab39f3fd6e4971da5026ce1ba6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_teal_grid.png"
dest_files=["res://.godot/imported/greybox_teal_grid.png-faf53fab39f3fd6e4971da5026ce1ba6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_teal_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bn0gggbdrcpw"
path="res://.godot/imported/greybox_teal_solid.png-a6697a5a3b72246fb8772342dca6c5c5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_teal_solid.png"
dest_files=["res://.godot/imported/greybox_teal_solid.png-a6697a5a3b72246fb8772342dca6c5c5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_yellow_grid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0kfbwkede8q"
path="res://.godot/imported/greybox_yellow_grid.png-415f899edf065d8a8b02962f77950d93.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_yellow_grid.png"
dest_files=["res://.godot/imported/greybox_yellow_grid.png-415f899edf065d8a8b02962f77950d93.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/greybox_yellow_solid.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ehp3ggwyy8xn"
path="res://.godot/imported/greybox_yellow_solid.png-d0b55f895a8bba6a650ccf694b93fdc0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/greybox_yellow_solid.png"
dest_files=["res://.godot/imported/greybox_yellow_solid.png-d0b55f895a8bba6a650ccf694b93fdc0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/greybox/placeholder.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b305rs4ouva73"
path="res://.godot/imported/placeholder.png-3548d9618c59656d22cf299003541677.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/greybox/placeholder.png"
dest_files=["res://.godot/imported/placeholder.png-3548d9618c59656d22cf299003541677.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
using Godot; using Godot;
using System; using System;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_heart.png")] [GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_heart.png")]
public partial class CHealthbar : Sprite3D public partial class CHealthbar : Sprite3D
{ {
private Healthbar _healthbar; private Healthbar _healthbar;

View File

@@ -19,6 +19,11 @@ script = ExtResource("5_0k5xu")
GravityModifier = 5.0 GravityModifier = 5.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5" metadata/_custom_type_script = "uid://dtpxijlnb2c5"
[sub_resource type="Resource" id="Resource_p48l4"]
script = ExtResource("9_55uwi")
StartingHealth = 1000.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_epn1o"] [sub_resource type="Resource" id="Resource_epn1o"]
script = ExtResource("9_55uwi") script = ExtResource("9_55uwi")
StartingHealth = 1.0 StartingHealth = 1.0
@@ -26,10 +31,10 @@ metadata/_custom_type_script = "uid://baiapod3csndf"
[node name="Main" unique_id=1551129541 instance=ExtResource("1_w4y6q")] [node name="Main" unique_id=1551129541 instance=ExtResource("1_w4y6q")]
[node name="BackgroundMusicPlayer" parent="." index="0"] [node name="BackgroundMusicPlayer" parent="." index="0" unique_id=879496303]
autoplay = false autoplay = false
[node name="Player" parent="." index="5"] [node name="Player" parent="." index="5" unique_id=1309399929]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 2, 1.5, 9.5) transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 2, 1.5, 9.5)
[node name="Greybox" type="CSGCombiner3D" parent="." index="7" unique_id=646927976] [node name="Greybox" type="CSGCombiner3D" parent="." index="7" unique_id=646927976]
@@ -113,6 +118,7 @@ RMovement = SubResource("Resource_xixm3")
[node name="Enemy3" parent="." index="11" unique_id=271578597 node_paths=PackedStringArray("Target") instance=ExtResource("4_5mjy0")] [node name="Enemy3" parent="." index="11" unique_id=271578597 node_paths=PackedStringArray("Target") instance=ExtResource("4_5mjy0")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 4, -3.3368092) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 4, -3.3368092)
Target = NodePath("../Player") Target = NodePath("../Player")
RHealth = SubResource("Resource_p48l4")
RMovement = SubResource("Resource_xixm3") RMovement = SubResource("Resource_xixm3")
[node name="FlyingEnemy" parent="." index="12" unique_id=1167959205 node_paths=PackedStringArray("Target") instance=ExtResource("6_xuqf0")] [node name="FlyingEnemy" parent="." index="12" unique_id=1167959205 node_paths=PackedStringArray("Target") instance=ExtResource("6_xuqf0")]
@@ -125,18 +131,20 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 7, -16)
Target = NodePath("../Player") Target = NodePath("../Player")
RMovement = SubResource("Resource_xixm3") RMovement = SubResource("Resource_xixm3")
[node name="GroundedSpawner" parent="." index="14" unique_id=557145011 instance=ExtResource("7_ba7rw")] [node name="GroundedSpawner" parent="." index="14" unique_id=557145011 node_paths=PackedStringArray("Target") instance=ExtResource("7_ba7rw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.5, -15) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 2.5, -15)
EnemyToSpawn = ExtResource("4_5mjy0") EnemyToSpawn = ExtResource("4_5mjy0")
MovementInputs = ExtResource("8_cdhvi") MovementInputs = ExtResource("8_cdhvi")
HealthInputs = SubResource("Resource_epn1o") HealthInputs = SubResource("Resource_epn1o")
DamageInputs = ExtResource("10_xyaoo") DamageInputs = ExtResource("10_xyaoo")
Target = NodePath("../Player")
IsActiveOnStart = false IsActiveOnStart = false
[node name="FlyingSpawner" parent="." index="15" unique_id=974076606 instance=ExtResource("7_ba7rw")] [node name="FlyingSpawner" parent="." index="15" unique_id=974076606 node_paths=PackedStringArray("Target") instance=ExtResource("7_ba7rw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 11, -14) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 11, -14)
EnemyToSpawn = ExtResource("6_xuqf0") EnemyToSpawn = ExtResource("6_xuqf0")
MovementInputs = ExtResource("11_yug0s") MovementInputs = ExtResource("11_yug0s")
HealthInputs = ExtResource("12_qgrw7") HealthInputs = ExtResource("12_qgrw7")
DamageInputs = ExtResource("13_qulje") DamageInputs = ExtResource("13_qulje")
Target = NodePath("../Player")
IsActiveOnStart = false IsActiveOnStart = false

View File

@@ -1,4 +1,5 @@
extends Control extends Control
class_name LevelSelectMenu
## Loads a simple ItemList node within a margin container. SceneLister updates ## Loads a simple ItemList node within a margin container. SceneLister updates
## the available scenes in the directory provided. Activating a level will update ## the available scenes in the directory provided. Activating a level will update
@@ -29,5 +30,5 @@ func add_levels_to_container() -> void:
level_buttons_container.add_item(button_name) level_buttons_container.add_item(button_name)
func _on_level_buttons_container_item_activated(index: int) -> void: func _on_level_buttons_container_item_activated(index: int) -> void:
GameState.set_current_level(index) var level_to_load = scene_lister.files.get(index)
level_selected.emit() SceneLoader.load_scene(level_to_load)

View File

@@ -43,7 +43,7 @@ item_0/text = "1 - ExampleLevel"
[node name="SceneLister" type="Node" parent="." unique_id=149935027] [node name="SceneLister" type="Node" parent="." unique_id=149935027]
script = ExtResource("3_stdqw") script = ExtResource("3_stdqw")
files = Array[String](["res://maps/level1.tscn", "res://maps/city.tscn", "res://maps/GYMs/enemies.tscn", "res://maps/GYMs/metrics.tscn"]) files = Array[String](["res://maps/level1.tscn", "res://maps/city.tscn", "res://maps/GYMs/metrics.tscn"])
directory = "res://menus/scenes/game_scene/levels" directory = "res://maps"
[connection signal="item_activated" from="Control/LevelButtonsContainer" to="." method="_on_level_buttons_container_item_activated"] [connection signal="item_activated" from="Control/LevelButtonsContainer" to="." method="_on_level_buttons_container_item_activated"]

View File

@@ -4,7 +4,27 @@ class_name Toolbox
extends OverlaidMenu extends OverlaidMenu
@export var player: PlayerController @export var player: PlayerController
@export var level_selection_menu: PackedScene = preload("uid://fybssggvts5q")
@onready var player_invicible_toggle: CheckButton = %PlayerInvicibleToggle
func _ready() -> void:
player_invicible_toggle.button_pressed = player.IsInvincibleOverride
func _on_kill_player_button_pressed() -> void: func _on_kill_player_button_pressed() -> void:
get_tree().create_timer(1).timeout.connect(player.Kill) get_tree().create_timer(1).timeout.connect(player.Kill)
close() close()
func _on_player_invicible_toggled(toggled_on: bool) -> void:
player.IsInvincibleOverride = toggled_on
print(player.IsInvincible)
func _on_restart_current_level_pressed() -> void:
SceneLoader.reload_current_scene()
func _on_select_level_pressed() -> void:
var menu: LevelSelectMenu = level_selection_menu.instantiate()
add_child(menu)

View File

@@ -50,29 +50,69 @@ theme_override_font_sizes/font_size = 24
text = "Toolbox" text = "Toolbox"
horizontal_alignment = 1 horizontal_alignment = 1
[node name="PlayerSection" type="MarginContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer" unique_id=461792371] [node name="PlayerSectionMargin" type="MarginContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer" unique_id=461792371]
layout_mode = 2 layout_mode = 2
theme_override_constants/margin_top = 16 theme_override_constants/margin_top = 16
theme_override_constants/margin_bottom = 16 theme_override_constants/margin_bottom = 16
[node name="MenuButtons" type="BoxContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSection" unique_id=469432036] [node name="PlayerSection" type="BoxContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin" unique_id=469432036]
unique_name_in_owner = true
custom_minimum_size = Vector2(128, 0) custom_minimum_size = Vector2(128, 0)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 3 size_flags_vertical = 3
theme_override_constants/separation = 16 theme_override_constants/separation = 16
alignment = 1
vertical = true vertical = true
script = ExtResource("2_6ax4q")
[node name="PlayerSectionLabel" type="Label" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSection/MenuButtons" unique_id=1100827847] [node name="PlayerSectionLabel" type="Label" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=1100827847]
layout_mode = 2 layout_mode = 2
text = "Player" text = "Player"
[node name="KillPlayerButton" type="Button" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSection/MenuButtons" unique_id=472828424] [node name="PlayerUtilsContainer" type="HBoxContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=993608648]
layout_mode = 2
size_flags_horizontal = 4
theme_override_constants/separation = 8
[node name="PlayerInvicibleToggle" type="CheckButton" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlayerUtilsContainer" unique_id=960956060]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "Invincible"
script = ExtResource("2_6ax4q")
[node name="KillPlayerButton" type="Button" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlayerUtilsContainer" unique_id=472828424]
layout_mode = 2
text = "Kill in 1s" text = "Kill in 1s"
[connection signal="pressed" from="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSection/MenuButtons/KillPlayerButton" to="." method="_on_kill_player_button_pressed"] [node name="LevelSelectionMargin" type="MarginContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer" unique_id=517648431]
layout_mode = 2
theme_override_constants/margin_top = 16
theme_override_constants/margin_bottom = 16
[node name="LevelSelectionSection" type="BoxContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin" unique_id=2038380087]
custom_minimum_size = Vector2(128, 0)
layout_mode = 2
size_flags_vertical = 3
theme_override_constants/separation = 16
vertical = true
[node name="LevelSelectionLabel" type="Label" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin/LevelSelectionSection" unique_id=950442689]
layout_mode = 2
text = "Levels"
[node name="LevelSelectionContainer" type="HBoxContainer" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin/LevelSelectionSection" unique_id=1674253271]
layout_mode = 2
size_flags_horizontal = 4
theme_override_constants/separation = 8
[node name="RestartCurrentButton" type="Button" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin/LevelSelectionSection/LevelSelectionContainer" unique_id=1059727667]
layout_mode = 2
text = "Restart current
"
[node name="SelectLevel" type="Button" parent="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin/LevelSelectionSection/LevelSelectionContainer" unique_id=2015444126]
layout_mode = 2
text = "Select levet
"
[connection signal="toggled" from="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlayerUtilsContainer/PlayerInvicibleToggle" to="." method="_on_player_invicible_toggled"]
[connection signal="pressed" from="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlayerUtilsContainer/KillPlayerButton" to="." method="_on_kill_player_button_pressed"]
[connection signal="pressed" from="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin/LevelSelectionSection/LevelSelectionContainer/RestartCurrentButton" to="." method="_on_restart_current_level_pressed"]
[connection signal="pressed" from="MarginContainer/MenuPanelContainer/MarginContainer/BoxContainer/LevelSelectionMargin/LevelSelectionSection/LevelSelectionContainer/SelectLevel" to="." method="_on_select_level_pressed"]

View File

@@ -33,6 +33,13 @@ stream_2/stream = ExtResource("3_xfjxc")
stream_3/stream = ExtResource("4_ycvo6") stream_3/stream = ExtResource("4_ycvo6")
stream_4/stream = ExtResource("5_5bvpy") stream_4/stream = ExtResource("5_5bvpy")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_r7v0u"]
random_pitch = 1.0999973
streams_count = 3
stream_0/stream = ExtResource("14_qnngs")
stream_1/stream = ExtResource("15_3j1dm")
stream_2/stream = ExtResource("16_hln0b")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_i5yri"] [sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_i5yri"]
random_pitch = 1.1 random_pitch = 1.1
streams_count = 3 streams_count = 3
@@ -68,7 +75,7 @@ stream_0/stream = ExtResource("21_r7v0u")
stream_1/stream = ExtResource("22_l756u") stream_1/stream = ExtResource("22_l756u")
[resource] [resource]
clip_count = 10 clip_count = 11
clip_0/name = &"footsteps" clip_0/name = &"footsteps"
clip_0/stream = SubResource("AudioStreamRandomizer_rs8q3") clip_0/stream = SubResource("AudioStreamRandomizer_rs8q3")
clip_0/auto_advance = 0 clip_0/auto_advance = 0
@@ -99,6 +106,9 @@ clip_8/auto_advance = 0
clip_9/name = &"glide" clip_9/name = &"glide"
clip_9/stream = ExtResource("19_5bvpy") clip_9/stream = ExtResource("19_5bvpy")
clip_9/auto_advance = 0 clip_9/auto_advance = 0
clip_10/name = &"parry"
clip_10/stream = SubResource("AudioStreamRandomizer_r7v0u")
clip_10/auto_advance = 0
_transitions = { _transitions = {
Vector2i(-1, -1): { Vector2i(-1, -1): {
"fade_beats": 1.0, "fade_beats": 1.0,

View File

@@ -61,7 +61,7 @@ metadata/_custom_type_script = "uid://jitubgv6judn"
[sub_resource type="Resource" id="Resource_abfq8"] [sub_resource type="Resource" id="Resource_abfq8"]
script = ExtResource("3_cb2lu") script = ExtResource("3_cb2lu")
Modifier = 10.0 Modifier = 20.0
metadata/_custom_type_script = "uid://b44cse62qru7j" metadata/_custom_type_script = "uid://b44cse62qru7j"
[sub_resource type="Resource" id="Resource_ue7xq"] [sub_resource type="Resource" id="Resource_ue7xq"]
@@ -614,12 +614,24 @@ to = NodePath("../../StandardAttack")
event = &"standard_attack" event = &"standard_attack"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="ToStandardParry" type="Node" parent="StateChart/Root/Attack/Ready" unique_id=237786700]
script = ExtResource("28_n7qhm")
to = NodePath("../../StandardParry")
event = &"standard_parry"
delay_in_seconds = "0.0"
[node name="ToDashAttack" type="Node" parent="StateChart/Root/Attack/Ready" unique_id=505795999] [node name="ToDashAttack" type="Node" parent="StateChart/Root/Attack/Ready" unique_id=505795999]
script = ExtResource("28_n7qhm") script = ExtResource("28_n7qhm")
to = NodePath("../../DashAttack") to = NodePath("../../DashAttack")
event = &"dash_attack" event = &"dash_attack"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="ToDashParry" type="Node" parent="StateChart/Root/Attack/Ready" unique_id=39360094]
script = ExtResource("28_n7qhm")
to = NodePath("../../DashParry")
event = &"dash_parry"
delay_in_seconds = "0.0"
[node name="StandardAttack" type="Node" parent="StateChart/Root/Attack" unique_id=569485647] [node name="StandardAttack" type="Node" parent="StateChart/Root/Attack" unique_id=569485647]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
@@ -644,6 +656,30 @@ to = NodePath("../../Ready")
event = &"attack_finished" event = &"attack_finished"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="StandardParry" type="Node" parent="StateChart/Root/Attack" unique_id=1244610762]
script = ExtResource("27_34snm")
[node name="ToReady" type="Node" parent="StateChart/Root/Attack/StandardParry" unique_id=472222096]
script = ExtResource("28_n7qhm")
to = NodePath("../../Ready")
event = &"attack_finished"
delay_in_seconds = "0.0"
[node name="ToDashParry" type="Node" parent="StateChart/Root/Attack/StandardParry" unique_id=548221621]
script = ExtResource("28_n7qhm")
to = NodePath("../../DashParry")
event = &"dash_parry"
delay_in_seconds = "0.0"
[node name="DashParry" type="Node" parent="StateChart/Root/Attack" unique_id=898768175]
script = ExtResource("27_34snm")
[node name="ToReady" type="Node" parent="StateChart/Root/Attack/DashParry" unique_id=533843974]
script = ExtResource("28_n7qhm")
to = NodePath("../../Ready")
event = &"attack_finished"
delay_in_seconds = "0.0"
[node name="Movement" type="Node" parent="StateChart/Root" unique_id=1029421869] [node name="Movement" type="Node" parent="StateChart/Root" unique_id=1029421869]
script = ExtResource("26_infe6") script = ExtResource("26_infe6")
initial_state = NodePath("Grounded") initial_state = NodePath("Grounded")

View File

@@ -12,19 +12,16 @@ public partial class PlayerUi : Control
public enum TargetState public enum TargetState
{ {
NoTarget, NoTarget,
TargetTooFar, TargetWouldNotKill,
TargetInRange, TargetWouldKill
TargetDashThrough
} }
public record TargetProperties(TargetState State, Vector2 Position); public record TargetProperties(TargetState State, Vector2 Position);
[Export] [Export]
public Color DashThroughColor { get; set; } = new Color("009c8f"); public Color WouldKillColor { get; set; } = new Color("009c8f");
[Export] [Export]
public Color DashBlockedColor { get; set; } = new Color("fc001c"); public Color WouldNotKillColor { get; set; } = new Color("fc001c");
[Export]
public Color DashOutOfRangeColor { get; set; } = new Color("ffffff");
public override void _Ready() public override void _Ready()
{ {
@@ -49,10 +46,9 @@ public partial class PlayerUi : Control
var modulation = state switch var modulation = state switch
{ {
TargetState.TargetTooFar => DashOutOfRangeColor, TargetState.TargetWouldNotKill => WouldNotKillColor,
TargetState.TargetInRange => DashBlockedColor, TargetState.TargetWouldKill => WouldKillColor,
TargetState.TargetDashThrough => DashThroughColor, _ => WouldNotKillColor
_ => DashOutOfRangeColor
}; };
_enemyTarget.SetVisible(visible); _enemyTarget.SetVisible(visible);
_enemyTarget.SetPosition(position - _enemyTarget.Size / 2); _enemyTarget.SetPosition(position - _enemyTarget.Size / 2);

View File

@@ -336,6 +336,8 @@ public partial class PlayerController : CharacterBody3D,
private StateChartState _attackStandard; private StateChartState _attackStandard;
private StateChartState _attackDash; private StateChartState _attackDash;
private StateChartState _parryStandard;
private StateChartState _parryDash;
private Transition _onJumpFromWall; private Transition _onJumpFromWall;
private Transition _onJumpFromWallFalling; private Transition _onJumpFromWallFalling;
@@ -352,6 +354,13 @@ public partial class PlayerController : CharacterBody3D,
public float CurrentHealth { get; set; } public float CurrentHealth { get; set; }
private bool _isInvincible; private bool _isInvincible;
public bool IsInvincibleOverride { get; set; }
public bool IsInvincible
{
get => _isInvincible || IsInvincibleOverride;
set => _isInvincible = value;
}
private readonly List<IDamageable> _hitEnemies = new List<IDamageable>(); private readonly List<IDamageable> _hitEnemies = new List<IDamageable>();
private ShapeCast3D _closeEnemyDetector; private ShapeCast3D _closeEnemyDetector;
@@ -481,6 +490,8 @@ public partial class PlayerController : CharacterBody3D,
// Attack states // Attack states
_attackStandard = StateChartState.Of(GetNode("StateChart/Root/Attack/StandardAttack")); _attackStandard = StateChartState.Of(GetNode("StateChart/Root/Attack/StandardAttack"));
_attackDash = StateChartState.Of(GetNode("StateChart/Root/Attack/DashAttack")); _attackDash = StateChartState.Of(GetNode("StateChart/Root/Attack/DashAttack"));
_parryStandard = StateChartState.Of(GetNode("StateChart/Root/Attack/StandardParry"));
_parryDash = StateChartState.Of(GetNode("StateChart/Root/Attack/DashParry"));
// State timers // State timers
_powerCooldownTimer = GetNode<Timer>("PowerCooldown"); _powerCooldownTimer = GetNode<Timer>("PowerCooldown");
@@ -597,6 +608,8 @@ public partial class PlayerController : CharacterBody3D,
// Attack states // Attack states
_attackStandard.StateEntered += OnStandardAttackStarted; _attackStandard.StateEntered += OnStandardAttackStarted;
_attackDash.StateEntered += OnDashAttackStarted; _attackDash.StateEntered += OnDashAttackStarted;
_parryStandard.StateEntered += OnStandardParryStarted;
_parryDash.StateEntered += OnDashParryStarted;
// Testing out kill // Testing out kill
// GetTree().CreateTimer(2).Timeout += () => Kill(this); // GetTree().CreateTimer(2).Timeout += () => Kill(this);
@@ -1432,7 +1445,7 @@ public partial class PlayerController : CharacterBody3D,
SetupSlideCollision(); SetupSlideCollision();
SlidingEnemyDetector.Monitoring = true; SlidingEnemyDetector.Monitoring = true;
_isInvincible = true; IsInvincible = true;
} }
public bool CanStandUpFromSlide() public bool CanStandUpFromSlide()
@@ -1559,7 +1572,7 @@ public partial class PlayerController : CharacterBody3D,
public void SlideEnded() public void SlideEnded()
{ {
SlidingEnemyDetector.Monitoring = false; SlidingEnemyDetector.Monitoring = false;
_isInvincible = false; IsInvincible = false;
SetupStandingCollision(); SetupStandingCollision();
_audioStream!.SwitchToClipByName("footsteps"); _audioStream!.SwitchToClipByName("footsteps");
@@ -1709,16 +1722,8 @@ public partial class PlayerController : CharacterBody3D,
/////////////////////////// ///////////////////////////
public void OnInputParryPressed() public void OnInputParryPressed()
{ {
if (WeaponSystem.FlyingState.Active) var attackToDo = _isEnemyInDashAttackRange ? "dash_parry" : "standard_parry";
{ _playerState.SendEvent(attackToDo);
DashToFlyingWeapon();
return;
}
if (WeaponSystem.PlantedState.Active)
{
DashToPlantedWeapon();
}
} }
/////////////////////////// ///////////////////////////
@@ -1965,7 +1970,7 @@ public partial class PlayerController : CharacterBody3D,
if (DashSystem.CanDashThroughTarget && DashSystem.CollidedObject is ITargetable dashTarget) if (DashSystem.CanDashThroughTarget && DashSystem.CollidedObject is ITargetable dashTarget)
{ {
enemyTargetState = PlayerUi.TargetState.TargetDashThrough; enemyTargetState = PlayerUi.TargetState.TargetWouldKill;
_targetLocation = dashTarget.GetTargetGlobalPosition(); _targetLocation = dashTarget.GetTargetGlobalPosition();
positionOnScreen = _camera.UnprojectPosition(_targetLocation); positionOnScreen = _camera.UnprojectPosition(_targetLocation);
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
@@ -1991,25 +1996,20 @@ public partial class PlayerController : CharacterBody3D,
// var targetDistance = _targetLocation.DistanceTo(GlobalPosition); // var targetDistance = _targetLocation.DistanceTo(GlobalPosition);
positionOnScreen = _camera.UnprojectPosition(_targetLocation); positionOnScreen = _camera.UnprojectPosition(_targetLocation);
_isEnemyInDashAttackRange = true; //targetDistance < TargetInRangeDistance; // Removing the "almost dash" UI var wouldKill = false;
if (_isEnemyInDashAttackRange) if (_targetObject is IHealthable h and IDamageable d)
{ {
enemyTargetState = PlayerUi.TargetState.TargetDashThrough; var wouldBeDamage = d.ComputeDamage(new DamageRecord(GlobalPosition, RDamage));
if (_targetObject is IDamageable damageable and IHealthable healthable) if (h.CurrentHealth < wouldBeDamage.Damage.DamageDealt) wouldKill = true;
{
var wouldBeDamage = damageable.ComputeDamage(new DamageRecord(GlobalPosition, RDamage));
if (wouldBeDamage.Damage.DamageDealt < healthable.CurrentHealth)
enemyTargetState = PlayerUi.TargetState.TargetInRange;
}
} }
else enemyTargetState = PlayerUi.TargetState.TargetTooFar; _isEnemyInDashAttackRange = true;
enemyTargetState = wouldKill ? PlayerUi.TargetState.TargetWouldKill : PlayerUi.TargetState.TargetWouldNotKill;
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
} }
public DamageRecord TakeDamage(DamageRecord damageRecord) public DamageRecord TakeDamage(DamageRecord damageRecord)
{ {
if (_isInvincible) if (IsInvincible)
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) }; return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
var finalDamage = CDamageable.TakeDamage(damageRecord); var finalDamage = CDamageable.TakeDamage(damageRecord);
@@ -2030,7 +2030,7 @@ public partial class PlayerController : CharacterBody3D,
public void OnHitInvincibility() public void OnHitInvincibility()
{ {
_isInvincible = true; IsInvincible = true;
_invincibilityTimer.Start(); _invincibilityTimer.Start();
} }
@@ -2041,15 +2041,22 @@ public partial class PlayerController : CharacterBody3D,
_audioStream!.SwitchToClipByName("attacks"); _audioStream!.SwitchToClipByName("attacks");
} }
private PhysicsDirectSpaceState3D _spaceState; public void OnStandardParryStarted()
public void OnDashAttackStarted()
{ {
_audioStream!.SwitchToClipByName("attacks"); _attackCooldown.Start();
HeadSystem.OnParry();
_audioStream!.SwitchToClipByName("parry");
}
_isInvincible = true; private PhysicsDirectSpaceState3D _spaceState;
public void StartDashAction(bool isParry)
{
var streamName = isParry ? "parry" : "attacks";
_audioStream!.SwitchToClipByName(streamName);
IsInvincible = true;
var plannedDashLocation = _targetLocation + Vector3.Down*HeadSystem.Position.Y; var plannedDashLocation = _targetLocation + Vector3.Down*HeadSystem.Position.Y;
var query = PhysicsRayQueryParameters3D.Create(HeadSystem.GlobalPosition, plannedDashLocation, DashSystem.DashCast3D.CollisionMask); var query = PhysicsRayQueryParameters3D.Create(HeadSystem.GlobalPosition, plannedDashLocation, DashSystem.DashCast3D.CollisionMask);
var result = _spaceState.IntersectRay(query); var result = _spaceState.IntersectRay(query);
if (result.Count > 0) if (result.Count > 0)
@@ -2057,41 +2064,50 @@ public partial class PlayerController : CharacterBody3D,
plannedDashLocation = (Vector3) result["position"]; plannedDashLocation = (Vector3) result["position"];
} }
var travel = plannedDashLocation - GlobalPosition; var travel = plannedDashLocation - (GlobalPosition + Vector3.Up*_playerHeight/2);
_preDashVelocity = Velocity; _preDashVelocity = Velocity;
_dashDirection = travel.Normalized(); _dashDirection = travel.Normalized();
var dashTween = CreatePositionTween(plannedDashLocation, AimedDashTime); var dashTween = CreatePositionTween(plannedDashLocation, AimedDashTime);
dashTween.Finished += OnDashAttackEnded; if (isParry) dashTween.Finished += OnDashParryEnded;
else dashTween.Finished += OnDashAttackEnded;
}
public void OnDashAttackStarted()
{
StartDashAction(isParry: false);
}
public void OnDashParryStarted()
{
StartDashAction(isParry: true);
} }
public void OnDashAttackEnded() public void StopDashAction()
{ {
if (_targetObject is IDamageable damageable) if (_targetObject is IDamageable damageable)
{ {
_hitEnemies.Add(damageable); _hitEnemies.Add(damageable);
TriggerDamage(); TriggerDamage();
} }
if (_targetObject is IStunnable stunnable) if (_targetObject is IStunnable stunnable)
{ {
stunnable.Stun(); stunnable.Stun();
} }
IsInvincible = false;
var shouldKnockback = _targetObject is IHealthable { CurrentHealth: > 0 };
if (shouldKnockback)
{
Velocity = -_dashDirection*RKnockback.Modifier;
}
else
{
GlobalPosition = ComputePositionAfterTargetedDash(_targetLocation, _targetHitLocation);
var postDashVelocity = _preDashVelocity.Length() > PostDashSpeed ? _preDashVelocity.Length() : PostDashSpeed;
Velocity = _dashDirection * postDashVelocity;
}
_isInvincible = false;
_playerState.SendEvent("attack_finished"); _playerState.SendEvent("attack_finished");
} }
public void OnDashAttackEnded()
{
StopDashAction();
GlobalPosition = ComputePositionAfterTargetedDash(_targetLocation, _targetHitLocation);
var postDashVelocity = _preDashVelocity.Length() > PostDashSpeed ? _preDashVelocity.Length() : PostDashSpeed;
Velocity = _dashDirection * postDashVelocity;
}
public void OnDashParryEnded()
{
StopDashAction();
Velocity = -_dashDirection*RKnockback.Modifier;
}
public static Vector3 ComputePositionAfterTargetedDash(Vector3 targetLocation, Vector3 targetHitLocation) public static Vector3 ComputePositionAfterTargetedDash(Vector3 targetLocation, Vector3 targetHitLocation)
{ {
return targetLocation + (targetLocation - targetHitLocation); return targetLocation + (targetLocation - targetHitLocation);
@@ -2104,6 +2120,16 @@ public partial class PlayerController : CharacterBody3D,
ThrowWeapon(); ThrowWeapon();
return; return;
} }
if (WeaponSystem.FlyingState.Active)
{
DashToFlyingWeapon();
return;
}
if (WeaponSystem.PlantedState.Active)
{
DashToPlantedWeapon();
return;
}
var attackToDo = _isEnemyInDashAttackRange ? "dash_attack" : "standard_attack"; var attackToDo = _isEnemyInDashAttackRange ? "dash_attack" : "standard_attack";
_playerState.SendEvent(attackToDo); _playerState.SendEvent(attackToDo);
@@ -2185,9 +2211,10 @@ public partial class PlayerController : CharacterBody3D,
public void ResetInvincibility() public void ResetInvincibility()
{ {
_isInvincible = false; IsInvincible = false;
} }
// Sound // Sound
public void OnFootStepped() public void OnFootStepped()
{ {

View File

@@ -22,21 +22,14 @@ public partial class Spawner : Node3D
[Export] [Export]
public bool IsActiveOnStart { get; set; } = true; public bool IsActiveOnStart { get; set; } = true;
private float _spawnTimer; private Timer _timer;
private bool _isActive;
public override void _Ready() public override void _Ready()
{ {
_isActive = IsActiveOnStart; _timer = GetNode<Timer>("Timer");
_spawnTimer = SpawnInterval; _timer.WaitTime = SpawnInterval;
} _timer.Timeout += Spawn;
if (IsActiveOnStart) StartSpawning();
public override void _Process(double delta)
{
if (!_isActive) return;
_spawnTimer -= (float) delta;
if (_spawnTimer <= 0) Spawn();
} }
public void Spawn() public void Spawn()
@@ -45,26 +38,23 @@ public partial class Spawner : Node3D
if (EnemyToSpawn.Instantiate() is not Enemy spawnedInstance) return; if (EnemyToSpawn.Instantiate() is not Enemy spawnedInstance) return;
GetTree().GetCurrentScene().AddChild(spawnedInstance);
spawnedInstance.GlobalPosition = GlobalPosition;
spawnedInstance.Target = Target; spawnedInstance.Target = Target;
spawnedInstance.RMovement = MovementInputs; spawnedInstance.RMovement = MovementInputs;
spawnedInstance.RDamage = DamageInputs; spawnedInstance.RDamage = DamageInputs;
spawnedInstance.RHealth = HealthInputs; spawnedInstance.RHealth = HealthInputs;
spawnedInstance.Initialize(); spawnedInstance.Initialize();
GetTree().GetCurrentScene().AddChild(spawnedInstance);
spawnedInstance.GlobalPosition = GlobalPosition;
_spawnTimer = SpawnInterval;
} }
public void StartSpawning() public void StartSpawning()
{ {
_isActive = true; _timer.Start();
_spawnTimer = SpawnInterval;
} }
public void StopSpawning() public void StopSpawning()
{ {
_isActive = false; _timer.Stop();
} }
} }

View File

@@ -6,3 +6,5 @@
script = ExtResource("1_2otbo") script = ExtResource("1_2otbo")
[node name="Marker3D" type="Marker3D" parent="." unique_id=610854505] [node name="Marker3D" type="Marker3D" parent="." unique_id=610854505]
[node name="Timer" type="Timer" parent="." unique_id=1842357493]

View File

@@ -12,6 +12,11 @@ public partial class HeadSystem : Node3D
[Signal] [Signal]
public delegate void HitboxDeactivatedEventHandler(); public delegate void HitboxDeactivatedEventHandler();
[Signal]
public delegate void ParryboxActivatedEventHandler();
[Signal]
public delegate void ParryboxDeactivatedEventHandler();
[Signal] [Signal]
public delegate void HitTargetEventHandler(); public delegate void HitTargetEventHandler();
[Signal] [Signal]
@@ -80,6 +85,8 @@ public partial class HeadSystem : Node3D
[ExportGroup("First Person rig")] [ExportGroup("First Person rig")]
private Node3D _fpRig; private Node3D _fpRig;
private Node3D _rightHandedWeapon;
private Node3D _leftHandedWeapon;
private Node3D _fpDisplacedRig; private Node3D _fpDisplacedRig;
private Vector3 _fpDisplacedRigInitialRotation; private Vector3 _fpDisplacedRigInitialRotation;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")] [Export(PropertyHint.Range, "0,10,0.1,or_greater")]
@@ -110,6 +117,8 @@ public partial class HeadSystem : Node3D
_animationTree = GetNode<AnimationTree>("AnimationTree"); _animationTree = GetNode<AnimationTree>("AnimationTree");
_fpRig = GetNode<Node3D>("FPRig"); _fpRig = GetNode<Node3D>("FPRig");
_rightHandedWeapon = GetNode<Node3D>("FPRig/Sword");
_leftHandedWeapon = GetNode<Node3D>("FPRig/Parry");
_fpDisplacedRig = GetNode<Node3D>("FPRig/Sword"); _fpDisplacedRig = GetNode<Node3D>("FPRig/Sword");
_fpDisplacedRigInitialRotation = _fpDisplacedRig.Rotation; _fpDisplacedRigInitialRotation = _fpDisplacedRig.Rotation;
@@ -133,6 +142,10 @@ public partial class HeadSystem : Node3D
{ {
_animationTree.Set("parameters/OnHit/request", (int) AnimationNodeOneShot.OneShotRequest.Fire); _animationTree.Set("parameters/OnHit/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
} }
public void OnParry()
{
_animationTree.Set("parameters/OnParry/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
}
public void OnStartDeathAnimation() public void OnStartDeathAnimation()
{ {
_isPlayingForcingAnim = true; _isPlayingForcingAnim = true;
@@ -162,6 +175,15 @@ public partial class HeadSystem : Node3D
EmitSignalHitboxDeactivated(); EmitSignalHitboxDeactivated();
} }
public void OnParryboxActivated()
{
EmitSignalHitboxActivated();
}
public void OnParryboxDeactivated()
{
EmitSignalHitboxDeactivated();
}
private bool _footstepEmitted; private bool _footstepEmitted;
private bool _isPlayingForcingAnim; private bool _isPlayingForcingAnim;
@@ -300,11 +322,11 @@ public partial class HeadSystem : Node3D
public void HideWeapon() public void HideWeapon()
{ {
_fpRig.Visible = false; _rightHandedWeapon.Visible = false;
} }
public void ShowWeapon() public void ShowWeapon()
{ {
_fpRig.Visible = true; _rightHandedWeapon.Visible = true;
} }
public float ComputeCameraInclineFactor(Vector3 direction) public float ComputeCameraInclineFactor(Vector3 direction)

View File

@@ -25,6 +25,11 @@ filters = ["..:position", "..:rotation"]
filter_enabled = true filter_enabled = true
filters = ["..:position", "..:rotation", "..:rotation:x", "..:rotation:z"] filters = ["..:position", "..:rotation", "..:rotation:x", "..:rotation:z"]
[sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_lwjon"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_calte"]
animation = &"parry"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_23rmc"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_23rmc"]
animation = &"hit1" animation = &"hit1"
@@ -38,8 +43,8 @@ animation = &"jump_start"
animation = &"mantle" animation = &"mantle"
[resource] [resource]
graph_offset = Vector2(149.92139, -71.126785) graph_offset = Vector2(-363.5551, -25.864124)
nodes/output/position = Vector2(1700, -40) nodes/output/position = Vector2(2020, -40)
nodes/AnimationNodeStateMachine/node = ExtResource("1_knaxl") nodes/AnimationNodeStateMachine/node = ExtResource("1_knaxl")
nodes/AnimationNodeStateMachine/position = Vector2(-560, 180) nodes/AnimationNodeStateMachine/position = Vector2(-560, 180)
nodes/Idle/node = SubResource("AnimationNodeAnimation_knaxl") nodes/Idle/node = SubResource("AnimationNodeAnimation_knaxl")
@@ -64,4 +69,8 @@ nodes/OnDie/node = SubResource("AnimationNodeOneShot_ao3u1")
nodes/OnDie/position = Vector2(1500, -60) nodes/OnDie/position = Vector2(1500, -60)
nodes/Die/node = SubResource("AnimationNodeAnimation_1hkum") nodes/Die/node = SubResource("AnimationNodeAnimation_1hkum")
nodes/Die/position = Vector2(1280, 340) nodes/Die/position = Vector2(1280, 340)
node_connections = [&"output", 0, &"OnDie", &"OnHit", 0, &"OnMantle", &"OnHit", 1, &"hit1", &"OnJumpStart", 0, &"Idle", &"OnJumpStart", 1, &"jump_start", &"OnJumpEnd", 0, &"OnJumpStart", &"OnJumpEnd", 1, &"jump_end", &"OnMantle", 0, &"OnJumpEnd", &"OnMantle", 1, &"mantle", &"OnDie", 0, &"OnHit", &"OnDie", 1, &"Die"] nodes/OnParry/node = SubResource("AnimationNodeOneShot_lwjon")
nodes/OnParry/position = Vector2(1780, -40)
nodes/Parry/node = SubResource("AnimationNodeAnimation_calte")
nodes/Parry/position = Vector2(1600, 300)
node_connections = [&"output", 0, &"OnParry", &"OnHit", 0, &"OnMantle", &"OnHit", 1, &"hit1", &"OnJumpStart", 0, &"Idle", &"OnJumpStart", 1, &"jump_start", &"OnJumpEnd", 0, &"OnJumpStart", &"OnJumpEnd", 1, &"jump_end", &"OnMantle", 0, &"OnJumpEnd", &"OnMantle", 1, &"mantle", &"OnDie", 0, &"OnHit", &"OnDie", 1, &"Die", &"OnParry", 0, &"OnDie", &"OnParry", 1, &"Parry"]

View File

@@ -2,6 +2,7 @@
[ext_resource type="Script" uid="uid://dtkdrnsmlwm67" path="res://systems/head/HeadSystem.cs" id="1_8abgy"] [ext_resource type="Script" uid="uid://dtkdrnsmlwm67" path="res://systems/head/HeadSystem.cs" id="1_8abgy"]
[ext_resource type="ArrayMesh" uid="uid://ckr26s4e3fj1m" path="res://assets/swords/resources/fp_sword23.tres" id="2_c5qep"] [ext_resource type="ArrayMesh" uid="uid://ckr26s4e3fj1m" path="res://assets/swords/resources/fp_sword23.tres" id="2_c5qep"]
[ext_resource type="ArrayMesh" uid="uid://dogiv0piqfmfu" path="res://assets/swords/resources/fp_sword20.tres" id="3_1ay6d"]
[ext_resource type="AnimationNodeBlendTree" uid="uid://c26yvcyyyj811" path="res://systems/head/fp_blend_tree.tres" id="3_r0h40"] [ext_resource type="AnimationNodeBlendTree" uid="uid://c26yvcyyyj811" path="res://systems/head/fp_blend_tree.tres" id="3_r0h40"]
[ext_resource type="Script" uid="uid://dnlxsrumw6ygp" path="res://addons/shaker/src/Vector3/shaker_component3D.gd" id="3_ubhf8"] [ext_resource type="Script" uid="uid://dnlxsrumw6ygp" path="res://addons/shaker/src/Vector3/shaker_component3D.gd" id="3_ubhf8"]
[ext_resource type="Script" uid="uid://0tu2q57qqu4s" path="res://addons/shaker/data/Vector3/BaseShakerType3D.gd" id="4_1ay6d"] [ext_resource type="Script" uid="uid://0tu2q57qqu4s" path="res://addons/shaker/data/Vector3/BaseShakerType3D.gd" id="4_1ay6d"]
@@ -133,6 +134,87 @@ tracks/4/keys = {
"update": 0, "update": 0,
"values": [Vector3(0, 0, 0)] "values": [Vector3(0, 0, 0)]
} }
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("../../FPRig/Parry:position")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(-0.22145952, -0.19867475, -1.3653086)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("../../FPRig/Parry:rotation")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.9350104, 3.0957325, -1.9789876)]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("../../FPRig/Parry:visible")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/8/type = "bezier"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("../../FPRig/Parry:rotation:x")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0.9350104, -0.15, 0, 0.15, 0),
"times": PackedFloat32Array(0)
}
tracks/9/type = "bezier"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("../../FPRig/Parry:rotation:y")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(3.0957325, -0.15, 0, 0.15, 0),
"times": PackedFloat32Array(0)
}
tracks/10/type = "bezier"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("../../FPRig/Parry:rotation:z")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(-1.9789876, -0.15, 0, 0.15, 0),
"times": PackedFloat32Array(0)
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("../../FPRig/Parry:scale")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1.2, 1.2, 1.2)]
}
[sub_resource type="Animation" id="Animation_sdjj3"] [sub_resource type="Animation" id="Animation_sdjj3"]
resource_name = "die" resource_name = "die"
@@ -199,6 +281,42 @@ tracks/4/keys = {
"update": 0, "update": 0,
"values": [Vector3(0, 0, 0.00011616433), Vector3(0, 0, -0.092299014), Vector3(0, 0, 1.2653637)] "values": [Vector3(0, 0, 0.00011616433), Vector3(0, 0, -0.092299014), Vector3(0, 0, 1.2653637)]
} }
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("../../FPRig/Parry:position")
tracks/5/interp = 2
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 0.2),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(-0.22145952, -0.19867475, -1.3653086), Vector3(-1.3323143, -0.19867463, -1.7020192)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("../../FPRig/Parry:rotation")
tracks/6/interp = 2
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.2),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0.9350104, 3.0957325, -1.9789876), Vector3(0.5242357, 2.32568, -3.0527115)]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("../../FPRig/Parry:visible")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 0.2),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
[sub_resource type="Animation" id="Animation_r0h40"] [sub_resource type="Animation" id="Animation_r0h40"]
resource_name = "hit1" resource_name = "hit1"
@@ -269,6 +387,18 @@ tracks/4/keys = {
"method": &"OnHitboxDeactivated" "method": &"OnHitboxDeactivated"
}] }]
} }
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("../../FPRig/Parry:position")
tracks/5/interp = 2
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 0.033333335, 0.083333336, 0.16666667, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(-0.22145952, -0.19867475, -1.3653086), Vector3(-0.0715476, -0.16325326, -0.8197592), Vector3(-0.36483923, -0.26392323, -1.3945884), Vector3(-0.8528395, -0.26392323, -1.2049117), Vector3(-0.8528395, -0.26392323, -1.2049117)]
}
[sub_resource type="Animation" id="Animation_0hyrq"] [sub_resource type="Animation" id="Animation_0hyrq"]
resource_name = "idle" resource_name = "idle"
@@ -298,6 +428,30 @@ tracks/1/keys = {
"update": 0, "update": 0,
"values": [Vector3(-0.083978735, -1.136043, 0.19867715), Vector3(-0.06987281, -1.1365474, 0.20524277), Vector3(-0.05990464, -1.1368362, 0.20987195), Vector3(-0.06303402, -1.1367121, 0.2084137), Vector3(-0.083978735, -1.136043, 0.19867715)] "values": [Vector3(-0.083978735, -1.136043, 0.19867715), Vector3(-0.06987281, -1.1365474, 0.20524277), Vector3(-0.05990464, -1.1368362, 0.20987195), Vector3(-0.06303402, -1.1367121, 0.2084137), Vector3(-0.083978735, -1.136043, 0.19867715)]
} }
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("../../FPRig/Parry:position")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.3, 0.8000001),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(-0.22145952, -0.19867475, -1.3653086), Vector3(-0.221, -0.211, -1.365), Vector3(-0.221, -0.16, -1.365)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../../FPRig/Parry:rotation")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.3, 0.8000001),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0.9350104, 3.0957325, -1.9789876), Vector3(0.93194425, 3.0397656, -2.0486145), Vector3(0.9362563, 3.1298003, -1.9366695)]
}
[sub_resource type="Animation" id="Animation_1ay6d"] [sub_resource type="Animation" id="Animation_1ay6d"]
resource_name = "jump_end" resource_name = "jump_end"
@@ -371,6 +525,121 @@ tracks/0/keys = {
"values": [Vector3(0, 0, 0.00011616433), Vector3(-0.5235988, 0, 0), Vector3(0, 0, 0)] "values": [Vector3(0, 0, 0.00011616433), Vector3(-0.5235988, 0, 0), Vector3(0, 0, 0)]
} }
[sub_resource type="Animation" id="Animation_ll12k"]
resource_name = "parry"
length = 0.3
step = 0.016666668
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../../FPRig/Parry:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.083333336, 0.13333334, 0.16666667, 0.20000002, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(-0.22145952, -0.19867475, -1.3653086), Vector3(0.08582078, -0.10871372, -0.57329714), Vector3(0.23993218, -0.07025133, -0.8836378), Vector3(0.2783246, -0.07025109, -0.9678366), Vector3(0.2897812, -0.07025109, -0.8572479), Vector3(-0.22145952, -0.19867475, -1.3653086)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../../FPRig/Sword:position")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.06666667, 0.15, 0.21666668, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0.53640664, -0.7880347, -1.9288678), Vector3(0.35144368, -0.7880347, -0.88497114), Vector3(0.87958574, -0.7880347, -1.4807583), Vector3(0.87958574, -0.7880347, -1.4807583), Vector3(0.53640664, -0.7880347, -1.9288678)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("../../FPRig/Sword:rotation")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.06666667, 0.15, 0.21666668, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(-0.083978735, -1.136043, 0.19867715), Vector3(0.012032291, -1.1376454, 0.24317425), Vector3(0.012032287, -1.8018653, 0.24317427), Vector3(0.012032287, -1.8018653, 0.24317427), Vector3(-0.083978735, -1.136043, 0.19867715)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("..:rotation")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.016666666, 0.1, 0.16666667, 0.2, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, 0), Vector3(0, 0, 0.05235988), Vector3(0, -0.05235988, -0.10471976), Vector3(0, 0.02617994, 0.05235988), Vector3(0, 0, 0)]
}
tracks/4/type = "method"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("../..")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.06666667, 0.18333334),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [],
"method": &"OnParryboxActivated"
}, {
"args": [],
"method": &"OnParryboxDeactivated"
}]
}
tracks/5/type = "bezier"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("../../FPRig/Parry:rotation:x")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"handle_modes": PackedInt32Array(0, 0, 2, 2, 2, 0),
"points": PackedFloat32Array(0.9350104, -0.15, 0, 0.033333335, 0.17374629, 0.98194534, -0.01666667, 0.016720235, 0, 0, 1.4891908, -0.03333334, -0.06340563, 0, 0, 1.5010982, -0.005555555, 0, 0, 0, 1.3694806, -0.008333336, 0.021936258, 0, 0, 0.9350104, -0.03333333, 0.17374629, 0.033333335, 0.17374629),
"times": PackedFloat32Array(0, 0.083333336, 0.13333334, 0.16666667, 0.21666668, 0.3)
}
tracks/6/type = "bezier"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("../../FPRig/Parry:rotation:y")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"handle_modes": PackedInt32Array(0, 0, 2, 2, 2, 0),
"points": PackedFloat32Array(3.0957325, -0.15, 0, 0.05, -0.045176744, 2.8761902, -0.033333335, 0.30117726, 0, 0, 2.9792244, -0.03333334, -0.25362277, 0, 0, 2.9158187, -0.016666666, 0.11096001, 0, 0, 2.8365617, -0.01666668, -0.18834376, 0, 0, 3.0957325, -0.050000012, -0.21161652, 0.05, -0.045176744),
"times": PackedFloat32Array(0, 0.083333336, 0.13333334, 0.16666667, 0.21666668, 0.3)
}
tracks/7/type = "bezier"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("../../FPRig/Parry:rotation:z")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"handle_modes": PackedInt32Array(0, 0, 2, 2, 2, 0),
"points": PackedFloat32Array(-1.9789876, -0.15, 0, 0.016666668, 0.6069969, -1.5225792, -0.01666667, 0.26527464, 0, 0, -0.9026986, -0.011111112, -0.101292565, 0, 0, -0.90269864, -0.005555555, 9.934108e-09, 0, 0, -1.642684, -0.008333336, 0.1233309, 0, 0, -1.9789876, -0.050000012, 0.13937998, 0.016666668, 0.6069969),
"times": PackedFloat32Array(0, 0.083333336, 0.13333334, 0.16666667, 0.21666668, 0.3)
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("../../FPRig/Parry:scale")
tracks/8/interp = 2
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0, 0.083333336, 0.13333334, 0.16666667, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(1.2, 1.2, 1.2), Vector3(1.65, 1, 1), Vector3(1, 1, 1), Vector3(1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_0hyrq"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_0hyrq"]
_data = { _data = {
&"RESET": SubResource("Animation_urko7"), &"RESET": SubResource("Animation_urko7"),
@@ -379,7 +648,8 @@ _data = {
&"idle": SubResource("Animation_0hyrq"), &"idle": SubResource("Animation_0hyrq"),
&"jump_end": SubResource("Animation_1ay6d"), &"jump_end": SubResource("Animation_1ay6d"),
&"jump_start": SubResource("Animation_ubhf8"), &"jump_start": SubResource("Animation_ubhf8"),
&"mantle": SubResource("Animation_8abgy") &"mantle": SubResource("Animation_8abgy"),
&"parry": SubResource("Animation_ll12k")
} }
[node name="HeadSystem" type="Node3D" unique_id=2067407038] [node name="HeadSystem" type="Node3D" unique_id=2067407038]
@@ -399,6 +669,12 @@ transform = Transform3D(1, 0, 0, 0, 0.99999994, 0, 0, 0, 1, 0, 0, 0)
cast_shadow = 0 cast_shadow = 0
mesh = ExtResource("2_c5qep") mesh = ExtResource("2_c5qep")
[node name="Parry" type="Node3D" parent="FPRig" unique_id=1218775403]
transform = Transform3D(0.43521196, -1.1178209, 0.03266725, -0.65402746, -0.2828554, -0.96552634, 0.9071047, 0.33236945, -0.711823, -0.22145952, -0.19867475, -1.3653086)
[node name="ParryMesh" type="MeshInstance3D" parent="FPRig/Parry" unique_id=1993291456]
mesh = ExtResource("3_1ay6d")
[node name="CameraSmooth" type="Node3D" parent="." unique_id=2072010960] [node name="CameraSmooth" type="Node3D" parent="." unique_id=2072010960]
transform = Transform3D(0.9999998, -0.00011616429, 0, 0.00011616431, 0.99999964, 0, 0, 0, 0.99999976, 0, 0, 0) transform = Transform3D(0.9999998, -0.00011616429, 0, 0.00011616431, 0.99999964, 0, 0, 0, 0.99999976, 0, 0, 0)
@@ -451,6 +727,9 @@ parameters/OnMantle/request = 0
parameters/OnDie/active = false parameters/OnDie/active = false
parameters/OnDie/internal_active = false parameters/OnDie/internal_active = false
parameters/OnDie/request = 0 parameters/OnDie/request = 0
parameters/OnParry/active = false
parameters/OnParry/internal_active = false
parameters/OnParry/request = 0
[connection signal="GotHit" from="." to="CameraSmooth/Camera3D/OnGetHitShaker" method="play_shake"] [connection signal="GotHit" from="." to="CameraSmooth/Camera3D/OnGetHitShaker" method="play_shake"]
[connection signal="HitTarget" from="." to="CameraSmooth/Camera3D/OnHitShaker" method="play_shake"] [connection signal="HitTarget" from="." to="CameraSmooth/Camera3D/OnHitShaker" method="play_shake"]