Compare commits

...

36 Commits

Author SHA1 Message Date
cc7cb90041 Moving to Godot 4.6.2
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 / Export (push) Has been cancelled
2026-04-04 12:29:15 +02:00
7a787a36d6 Moved the exploding sword forge object from the code only hardcoded stuff to the resource based stuff
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Failing after 3m55s
2026-04-04 12:06:48 +02:00
bfa1f251dd Replaced the entire mana usage and inhibition with the provided forge resources 2026-04-03 16:35:15 +02:00
673368a200 Added rider plugin and turned Empowered Action into a forge-resources-managed ability 2026-04-03 15:33:46 +02:00
c1108e96d7 moving further through forge godot-available resources and interfaces
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 25s
Create tag and build when new code gets to main / Export (push) Failing after 3h11m2s
2026-04-01 15:53:38 +02:00
15cb80d045 Using provided ForgeManager singleton and forge_data resource for tags 2026-04-01 15:07:28 +02:00
1d298b3080 more encapsulated effect application 2026-04-01 10:00:22 +02:00
42ff38f39b yow it's working or wat
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Failing after 4m23s
2026-03-29 17:30:14 +02:00
dafb0c96cc fix manabar cue issue 2026-03-28 18:40:03 +01:00
ef454e9502 Trying custom execution periodic data 2026-03-28 18:20:47 +01:00
cc70fb361b WIP: integrating forge systems into the game, now trying periodic abilities 2026-03-28 11:43:34 +01:00
7bf19868e7 Setup the base for abilities and events
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Successful in 5m6s
2026-03-22 16:28:57 +01:00
d1f83525b1 updating mana through cues 2026-03-18 16:59:52 +01:00
4bcbda9690 fix: inputs were eaten by a tutorial text because of node ordering
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Successful in 5m12s
Create tag and build when new code gets to main / ReleaseName (push) Successful in 3s
Create tag and build when new code gets to main / Release (push) Successful in 13m52s
2026-03-18 11:10:06 +01:00
e51ef5a517 probably fixed stuttering of the camera and weapon animations 2026-03-18 11:02:08 +01:00
50de6abb5d mana bar 2026-03-15 21:26:59 +01:00
95616f61fc Implemented mana regeneration
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 40s
Create tag and build when new code gets to main / Export (push) Successful in 5m18s
2026-03-11 16:29:09 +01:00
b15a4fef95 empowered action as a forge ability 2026-03-11 15:56:17 +01:00
14d29d68bb Setup empowered action as a Forge ability 2026-03-10 09:22:39 +01:00
9d612682ec created a normal process function
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 41s
Create tag and build when new code gets to main / Export (push) Successful in 4m39s
2026-03-08 18:12:57 +01:00
9bfe37af62 trying cache
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 30s
Create tag and build when new code gets to main / Export (push) Successful in 4m56s
2026-03-08 10:08:06 +01:00
55eba7fcc8 trying to remove xunit
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 27s
Create tag and build when new code gets to main / Export (push) Failing after 3m37s
2026-03-08 09:49:18 +01:00
7a3e61b86f added lights in dark tutorial area 2026-03-08 09:46:33 +01:00
8153ec07e7 Revert "removing tests because they might break the solution"
This reverts commit 3a21f00528.
2026-03-08 09:44:02 +01:00
ddc85655be Revert "removed internal"
This reverts commit 5408f455af.
2026-03-08 09:43:38 +01:00
c92eb19a1c Revert "removed null!"
This reverts commit 290f79afd4.
2026-03-08 09:43:12 +01:00
290f79afd4 removed null!
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 4m52s
2026-02-26 19:18:27 +01:00
5408f455af removed internal
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 5m2s
2026-02-26 18:56:50 +01:00
3a21f00528 removing tests because they might break the solution
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 4m50s
2026-02-26 18:42:46 +01:00
22e8c27878 trying somthing
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 5m3s
2026-02-26 18:36:18 +01:00
6c4454848a removed something that has nothing to do on the vcs
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 25s
Create tag and build when new code gets to main / Export (push) Successful in 4m52s
2026-02-26 18:15:50 +01:00
175e67d2d6 export fix
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 4m53s
2026-02-26 17:55:02 +01:00
ab69fa9323 trying to fix export
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 / Export (push) Successful in 5m24s
2026-02-26 17:36:33 +01:00
263990b086 more tuts
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 5m8s
Create tag and build when new code gets to main / ReleaseName (push) Successful in 4s
Create tag and build when new code gets to main / Release (push) Successful in 10m59s
2026-02-25 10:27:28 +01:00
5da2aa31ab basic forge setup and refactored for some warning
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 30s
Create tag and build when new code gets to main / Export (push) Successful in 5m10s
2026-02-24 10:27:57 +01:00
4f64139d61 removed useless stuff
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Successful in 4m59s
2026-02-23 15:29:08 +01:00
97 changed files with 3179 additions and 2479 deletions

View File

@@ -83,6 +83,8 @@ jobs:
Export:
runs-on: godot
env:
RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache
needs:
- BumpTag
@@ -105,6 +107,7 @@ jobs:
run: |
mkdir -v -p build/windows
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
ls -la build/windows
# - name: Setup Butler
# shell: bash

View File

@@ -63,6 +63,7 @@ jobs:
run: |
mkdir -v -p build/windows
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --build-solutions --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
ls -la build/windows
zip -r Windows.zip build/windows
- name: Upload Windows to itch.io
shell: bash
@@ -79,7 +80,7 @@ jobs:
mkdir -v -p build/windowsArm
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe
zip -r WindowsArm.zip build/windowsArm
- name: Upload Windows to itch.io
- name: Upload Windows ARM to itch.io
shell: bash
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
@@ -94,7 +95,7 @@ jobs:
mkdir -v -p build/linux
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
zip -r Linux.zip build/linux
- name: Upload Windows to itch.io
- name: Upload Linux to itch.io
shell: bash
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
@@ -109,7 +110,7 @@ jobs:
mkdir -v -p build/mac
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
zip -r Mac.zip build/mac
- name: Upload Windows to itch.io
- name: Upload Mac to itch.io
shell: bash
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}

2
.gitignore vendored
View File

@@ -19,7 +19,9 @@
*.suo
*.user
*.csproj.old*
_ReSharper.*
*.DotSettings.user
bin
obj
packages

View File

@@ -1,4 +1,4 @@
<Project Sdk="Godot.NET.Sdk/4.6.0">
<Project Sdk="Godot.NET.Sdk/4.6.2">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
@@ -125,27 +125,14 @@
</ItemGroup>
<ItemGroup>
<Folder Include="addons\" />
<Folder Include="tests\components\" />
<Folder Include="tests\enemies\" />
<Folder Include="tests\" />
<Folder Include="tools\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="RustyOptions" Version="0.10.1" />
</ItemGroup>
<Import Project="addons/forge/Forge.props" />
<!-- XUnit -->
<ItemGroup>
<Content Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="xunit.v3.mtp-v2" Version="3.2.2" />
</ItemGroup>
<!-- gdUnit4 package dependencies -->
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />

View File

@@ -1,131 +0,0 @@
<Project Sdk="Godot.NET.Sdk/4.4.1">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>Movementtests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Content Include="export_presets.cfg" />
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png" />
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png.import" />
<Content Include="menus\assets\git_logo\LICENSE.txt" />
<Content Include="menus\assets\godot_engine_logo\LICENSE.txt" />
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png" />
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png.import" />
<Content Include="menus\assets\icon.png" />
<Content Include="menus\assets\icon.png.import" />
<Content Include="menus\ATTRIBUTION.md" />
<Content Include="menus\resources\themes\expedition.tres" />
<Content Include="menus\resources\themes\gravity.tres" />
<Content Include="menus\resources\themes\grow.tres" />
<Content Include="menus\resources\themes\lab.tres" />
<Content Include="menus\resources\themes\lore.tres" />
<Content Include="menus\resources\themes\steal_this_theme.tres" />
<Content Include="menus\scenes\credits\scrollable_credits.gd" />
<Content Include="menus\scenes\credits\scrollable_credits.gd.uid" />
<Content Include="menus\scenes\credits\scrollable_credits.tscn" />
<Content Include="menus\scenes\credits\scrolling_credits.gd" />
<Content Include="menus\scenes\credits\scrolling_credits.gd.uid" />
<Content Include="menus\scenes\credits\scrolling_credits.tscn" />
<Content Include="menus\scenes\end_credits\end_credits.gd" />
<Content Include="menus\scenes\end_credits\end_credits.gd.uid" />
<Content Include="menus\scenes\end_credits\end_credits.tscn" />
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd" />
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd.uid" />
<Content Include="menus\scenes\game_scene\game_ui.tscn" />
<Content Include="menus\scenes\game_scene\input_display_label.gd" />
<Content Include="menus\scenes\game_scene\input_display_label.gd.uid" />
<Content Include="menus\scenes\game_scene\levels\level.gd" />
<Content Include="menus\scenes\game_scene\levels\level.gd.uid" />
<Content Include="menus\scenes\game_scene\levels\level_1.tscn" />
<Content Include="menus\scenes\game_scene\levels\level_2.tscn" />
<Content Include="menus\scenes\game_scene\levels\level_3.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_1.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_2.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_3.tscn" />
<Content Include="menus\scenes\game_scene\tutorial_manager.gd" />
<Content Include="menus\scenes\game_scene\tutorial_manager.gd.uid" />
<Content Include="menus\scenes\loading_screen\level_loading_screen.tscn" />
<Content Include="menus\scenes\loading_screen\loading_screen.gd" />
<Content Include="menus\scenes\loading_screen\loading_screen.gd.uid" />
<Content Include="menus\scenes\loading_screen\loading_screen.tscn" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd.uid" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.tscn" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd.uid" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.tscn" />
<Content Include="menus\scenes\menus\main_menu\main_menu.gd" />
<Content Include="menus\scenes\menus\main_menu\main_menu.gd.uid" />
<Content Include="menus\scenes\menus\main_menu\main_menu.tscn" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd.uid" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.tscn" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.tscn" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_extras_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu_with_mouse_sensitivity.tscn" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu_with_tabs.tscn" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.tscn" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu_with_extras.tscn" />
<Content Include="menus\scenes\opening\opening.gd" />
<Content Include="menus\scenes\opening\opening.gd.uid" />
<Content Include="menus\scenes\opening\opening.tscn" />
<Content Include="menus\scenes\opening\opening_with_logo.tscn" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\mini_options_overlaid_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.tscn" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.tscn" />
<Content Include="menus\scripts\game_state.gd" />
<Content Include="menus\scripts\game_state.gd.uid" />
<Content Include="menus\scripts\level_list_and_state_manager.gd" />
<Content Include="menus\scripts\level_list_and_state_manager.gd.uid" />
<Content Include="menus\scripts\level_state.gd" />
<Content Include="menus\scripts\level_state.gd.uid" />
</ItemGroup>
<ItemGroup>
<Folder Include="addons\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="RustyOptions" Version="0.10.1" />
</ItemGroup>
</Project>

View File

@@ -1,142 +0,0 @@
<Project Sdk="Godot.NET.Sdk/4.5.0">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>Movementtests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Content Include=".runsettings" />
<Content Include="export_presets.cfg" />
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png" />
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png.import" />
<Content Include="menus\assets\git_logo\LICENSE.txt" />
<Content Include="menus\assets\godot_engine_logo\LICENSE.txt" />
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png" />
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png.import" />
<Content Include="menus\assets\icon.png" />
<Content Include="menus\assets\icon.png.import" />
<Content Include="menus\ATTRIBUTION.md" />
<Content Include="menus\resources\themes\expedition.tres" />
<Content Include="menus\resources\themes\gravity.tres" />
<Content Include="menus\resources\themes\grow.tres" />
<Content Include="menus\resources\themes\lab.tres" />
<Content Include="menus\resources\themes\lore.tres" />
<Content Include="menus\resources\themes\steal_this_theme.tres" />
<Content Include="menus\scenes\credits\scrollable_credits.gd" />
<Content Include="menus\scenes\credits\scrollable_credits.gd.uid" />
<Content Include="menus\scenes\credits\scrollable_credits.tscn" />
<Content Include="menus\scenes\credits\scrolling_credits.gd" />
<Content Include="menus\scenes\credits\scrolling_credits.gd.uid" />
<Content Include="menus\scenes\credits\scrolling_credits.tscn" />
<Content Include="menus\scenes\end_credits\end_credits.gd" />
<Content Include="menus\scenes\end_credits\end_credits.gd.uid" />
<Content Include="menus\scenes\end_credits\end_credits.tscn" />
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd" />
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd.uid" />
<Content Include="menus\scenes\game_scene\game_ui.tscn" />
<Content Include="menus\scenes\game_scene\input_display_label.gd" />
<Content Include="menus\scenes\game_scene\input_display_label.gd.uid" />
<Content Include="menus\scenes\game_scene\levels\level.gd" />
<Content Include="menus\scenes\game_scene\levels\level.gd.uid" />
<Content Include="menus\scenes\game_scene\levels\level_1.tscn" />
<Content Include="menus\scenes\game_scene\levels\level_2.tscn" />
<Content Include="menus\scenes\game_scene\levels\level_3.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_1.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_2.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_3.tscn" />
<Content Include="menus\scenes\game_scene\tutorial_manager.gd" />
<Content Include="menus\scenes\game_scene\tutorial_manager.gd.uid" />
<Content Include="menus\scenes\loading_screen\level_loading_screen.tscn" />
<Content Include="menus\scenes\loading_screen\loading_screen.gd" />
<Content Include="menus\scenes\loading_screen\loading_screen.gd.uid" />
<Content Include="menus\scenes\loading_screen\loading_screen.tscn" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd.uid" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.tscn" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd.uid" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.tscn" />
<Content Include="menus\scenes\menus\main_menu\main_menu.gd" />
<Content Include="menus\scenes\menus\main_menu\main_menu.gd.uid" />
<Content Include="menus\scenes\menus\main_menu\main_menu.tscn" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd.uid" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.tscn" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.tscn" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_extras_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu_with_mouse_sensitivity.tscn" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu_with_tabs.tscn" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.tscn" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu_with_extras.tscn" />
<Content Include="menus\scenes\opening\opening.gd" />
<Content Include="menus\scenes\opening\opening.gd.uid" />
<Content Include="menus\scenes\opening\opening.tscn" />
<Content Include="menus\scenes\opening\opening_with_logo.tscn" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\mini_options_overlaid_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.tscn" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.tscn" />
<Content Include="menus\scripts\game_state.gd" />
<Content Include="menus\scripts\game_state.gd.uid" />
<Content Include="menus\scripts\level_list_and_state_manager.gd" />
<Content Include="menus\scripts\level_list_and_state_manager.gd.uid" />
<Content Include="menus\scripts\level_state.gd" />
<Content Include="menus\scripts\level_state.gd.uid" />
</ItemGroup>
<ItemGroup>
<Folder Include="addons\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="RustyOptions" Version="0.10.1" />
</ItemGroup>
<!-- gdUnit4 package dependencies -->
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0"/>
<PackageReference Include="gdUnit4.api" Version="5.1.0-rc3"/>
<PackageReference Include="gdUnit4.test.adapter" Version="3.0.0"/>
<PackageReference Include="gdUnit4.analyzers" Version="1.0.0">
<PrivateAssets>none</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeEditing/SuppressNullableWarningFix/Enabled/@EntryValue">False</s:Boolean></wpf:ResourceDictionary>

View File

@@ -1,14 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAction_00601_002Ecs_002Fl_003AC_0021_003FUsers_003FMinimata_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F7c0f83388bfc4d2c9d09befcec9dd79bc90908_003Fb8_003F4d300c4d_003FAction_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAction_00602_002Ecs_002Fl_003AC_0021_003FUsers_003FMinimata_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F7c0f83388bfc4d2c9d09befcec9dd79bc90908_003F87_003Fded27e2d_003FAction_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEnemy_005FScriptMethods_002Egenerated_002Ecs_002Fl_003AC_0021_003FUsers_003FMinimata_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F8e71dc81611862c01a2cb998a1f327de14747655_003FEnemy_005FScriptMethods_002Egenerated_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode_002Ecs_002Fl_003AC_0021_003FUsers_003FMinimata_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F716d154fef5cbe863cd637bd32beda6e3cec5f12e8fed2dc5b2d8149a0d558ab_003FNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode_002Ecs_002Fl_003AC_0021_003FUsers_003FMinimata_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fdf73a4db74df89d59655c5fb6326406f47fbfa9af1fa81518fe0a07c49d34133_003FNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASceneTree_002Ecs_002Fl_003AC_0021_003FUsers_003FMinimata_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F8d6960554e939a669841b1ece03d27df4ab42f92bb80be3767eaec8cdaccf84b_003FSceneTree_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=dd9a7ac6_002Dbb9b_002D4001_002Db145_002D15e6509b7e78/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from Solution" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;&#xD;
&lt;Solution /&gt;&#xD;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestRunner/RunConfigurationFilename/@EntryValue">D:\Godot\Projects\movement-tests\.runsettings</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=floorplane/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@@ -1,7 +1,7 @@
[gd_resource type="Resource" load_steps=2 format=3 uid="uid://8j4xg16o3qnl"]
[gd_resource type="Resource" format=3 uid="uid://8j4xg16o3qnl"]
[ext_resource type="Script" uid="uid://bq4vlbfx00hea" path="res://addons/forge/core/ForgeData.cs" id="1_x0pne"]
[resource]
script = ExtResource("1_x0pne")
RegisteredTags = Array[String](["effect.fire", "effect.wet", "cue.floating.text", "cue.vfx.fire", "cue.vfx.wet", "cue.vfx.regen", "cooldown.enemy.attack", "set_by_caller.damage", "event.damage", "cooldown", "cooldown.skill.projectile", "cooldown.skill.shield", "cooldown.skill.dash", "movement.block", "immunity.damage", "effect.mana_shield", "cue.vfx.shield", "event.damage.taken", "event.damage.dealt", "event", "set_by_caller", "trait.flammable", "trait.healable", "trait.damageable", "trait.wettable", "cue.vfx.reflect", "cue.vfx", "cooldown.skill", "cooldown.skill.reflect"])
RegisteredTags = Array[String](["character.player", "character.enemy", "weapon", "status.stunned", "status.burning", "status.frozen", "abilities.weapon.land", "abilities.weapon.flying", "abilities.weapon.left", "events.combat.damage", "events.combat.hit", "events.weapon.flyingTick", "events.weapon.startedFlying", "events.weapon.stoppedFlying", "events.weapon.handToFlying", "events.weapon.flyingToHand", "events.weapon.plantedToHand", "events.weapon.plantedToFlying", "events.weapon.planted", "cooldown.empoweredAction", "cooldown.empoweredSwordThrow", "cues.resources.mana", "events.player.empowered_action_used", "character.player.mana", "character.player.mana.regen", "character.player.mana.regen.inhibited"])

View File

@@ -0,0 +1,33 @@
# Contribution
Hello, thanks for taking time and helping out with the addon!
Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. Please sign the CLA before sending the PR: https://www.jetbrains.com/agreements/cla/.
#### Local setup
Open the `godot-editor-plugin/CMakeLists.txt` in Rider 2026.1+, select `rider-gdextension` target in the run configuration selector.
There are some more fixes coming in 2026.2, which will allow working on gdscript and cpp files within the same workspace.
#### Signing the binaries
Plugin binaries need to be signed to comply with modern operating system security requirements. Unsigned dynamic libraries may fail to load or trigger security warnings:
- **macOS**: Requires code signing (and often notarization) for `.dylib` files. Unsigned libraries may simply fail to load.
- **Windows**: SmartScreen may block unsigned binaries, and corporate environments often enforce signed code only.
- **Linux**: Generally allows unsigned `.so` files, but some sandboxed environments (Flatpak, Snap) impose restrictions.
**How signing is implemented:**
1. **TeamCity Configuration**: [ijplatform_master_Net_Deploy_Plugins_Public_Godot](https://buildserver.labs.intellij.net/buildConfiguration/ijplatform_master_Net_Deploy_Plugins_Public_Godot) (internal JetBrains link)
- Note: The automatic trigger on new tags is currently not working, so manual triggering is required.
2. **Release Process**:
- First, use your GitHub Action to prepare a **pre-release** with a tag
- Manually trigger the TeamCity configuration on the necessary branch/tag
- The configuration will download assets, sign them, and upload them back (removing the pre-release flag)
- The pre-release flag is required at the start; otherwise, the signing configuration will skip the release (protection against double signing)
3. **Signing existing releases**:
- You can run signing on already existing old releases/tags
- Mark them as pre-release first, then run the configuration on the necessary tag

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 JetBrains
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,51 @@
# JetBrains Rider Integration Godot addon
This addon currently provides two features:
1. Finds all Rider installations in the system and provides a selector on the `Text Editor` -> `External` tab in the settings to select one.
2. Provides the "Use Rider" toggle in the Godot toolbar and, when enabled, applies a set of editor settings recommended for working with JetBrains Rider. The goal is to make it trivial to switch between Rideroptimized settings and stock Godot settings with a single click.
## Quick start
Requirements:
- Godot 4.2.2+
Install:
1. Inside the Godot editor, it can be installed from the AssetLib view or [downloaded](https://godotengine.org/asset-library/asset/4576)
2. [Optional] Change the initial value of `active` in the plugin.cfg
3. [Optional] Change the initial values in the presets.json file.
4. Enable "JetBrains Rider External Editor" plugin in the Project → Project Settings… → Plugins tab.
Use:
- A toolbar toggle named "Use Rider" will appear. Click it to turn the preset On/Off.
Screenshot:
![Toolbar toggle](screenshots/Toolbar.png)
## What the toggle changes
The preset values live in `presets.json`.
When ON:
- Write the values from the "on" preset into the Editor Settings.
When OFF:
- Write the values from the "off" preset into the Editor Settings.
Note: The plugin does not currently autoset Riders executable path or flags. See Plans below.
## Setting Rider to be the external editor
The plugin automatically detects installed Rider versions on your system and provides a convenient dropdown menu to
select which installation to use as your external editor.
- The plugin scans common installation locations for Rider on Windows, macOS, and Linux.
- Detected installations appear in the "Select Rider" dropdown in the toolbar.
- When you select a Rider installation, the plugin automatically updates the `dotnet/editor/external_editor_path` editor
setting.
## License
See `addons/rider-plugin/LICENCE`.
## Acknowledgements
Created by JetBrains to streamline using Rider with Godot.
Initial idea https://github.com/sszigeti/toggle_external_editor

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.0"
id="katman_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
xml:space="preserve"
sodipodi:docname="JetBrains Rider Icon.svg"
width="512"
height="512"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs43" /><sodipodi:namedview
id="namedview41"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="1.0980553"
inkscape:cx="256.36233"
inkscape:cy="212.19333"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="katman_1" />
<style
type="text/css"
id="style2">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_00000130622934180993703410000017420799098261276343_);}
.st2{fill:url(#SVGID_00000060739771362873723200000017991140373209755022_);}
.st3{fill:#FFFFFF;}
</style>
<symbol
id="rider"
viewBox="-35 -35 70 70">
<linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="30.4897"
y1="5.1188998"
x2="-23.4683"
y2="-25.8451">
<stop
offset="0"
style="stop-color:#DD1265"
id="stop4" />
<stop
offset="0.483"
style="stop-color:#DD1265"
id="stop6" />
<stop
offset="0.942"
style="stop-color:#FDB60D"
id="stop8" />
</linearGradient>
<path
class="st0"
d="M 35,-7.7 -14.1,-35 18.8,13.9 25.5,9.5 Z"
id="path11" />
<linearGradient
id="SVGID_00000169517474296634577950000016895268102491994795_"
gradientUnits="userSpaceOnUse"
x1="-1.5839"
y1="-28.888"
x2="19.805099"
y2="30.174999">
<stop
offset="0.139"
style="stop-color:#087CFA"
id="stop13" />
<stop
offset="0.476"
style="stop-color:#DD1265"
id="stop15" />
<stop
offset="0.958"
style="stop-color:#087CFA"
id="stop17" />
</linearGradient>
<path
style="fill:url(#SVGID_00000169517474296634577950000016895268102491994795_)"
d="M 15.5,-18.9 9.3,-33.9 -4.3,-20.5 1.2,28.1 14.4,35 35,23 Z"
id="path20" />
<linearGradient
id="SVGID_00000135668350575375336630000014638141720088491653_"
gradientUnits="userSpaceOnUse"
x1="-17.5865"
y1="-27.071199"
x2="-1.7875"
y2="29.073799">
<stop
offset="0.278"
style="stop-color:#DD1265"
id="stop22" />
<stop
offset="0.968"
style="stop-color:#FDB60D"
id="stop24" />
</linearGradient>
<path
style="fill:url(#SVGID_00000135668350575375336630000014638141720088491653_)"
d="m -14.1,-35 -20.9,14.1 7.8,48.1 20.1,7.7 26,-21 z"
id="path27" />
<path
d="M 21,-21 H -21 V 21 H 21 Z"
id="path29" />
<path
class="st3"
d="m -0.6,13.6 h -15.8 v 2.7 h 15.8 z"
id="path31" />
<path
class="st3"
d="m 0.5,-15.8 h 6.2 c 5,0 8.4,3.4 8.4,7.7 0,4.4 -3.4,7.9 -8.4,7.9 L 0.5,0 Z m 3.5,3.2 v 9.5 h 2.7 c 2.8,0 4.8,-1.9 4.8,-4.6 0,-2.8 -1.9,-4.7 -4.8,-4.7 z"
id="path33" />
<path
class="st3"
d="m -15.7,-15.8 h 7.2 c 2,0 3.5,0.6 4.6,1.6 0.9,0.9 1.3,2.1 1.3,3.6 v 0.1 c 0,1.3 -0.3,2.3 -0.9,3.1 -0.6,0.8 -1.4,1.4 -2.4,1.8 L -2,0 h -4.1 l -3.3,-4.8 h -2.9 V 0 h -3.5 z m 7,7.7 c 0.8,0 1.5,-0.2 2,-0.6 0.5,-0.4 0.7,-1 0.7,-1.6 v -0.1 c 0,-0.8 -0.2,-1.3 -0.7,-1.7 -0.5,-0.3 -1.1,-0.6 -2,-0.6 h -3.4 v 4.5 h 3.4 z"
id="path35" />
</symbol>
<use
xlink:href="#rider"
width="70"
height="70"
x="-35"
y="-35"
transform="matrix(7.0682519,0,0,7.2481031,256,256)"
style="overflow:visible"
id="use38" />
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://wrdrj6wednn8"
path="res://.godot/imported/icon.svg-45c914cff7482ba9564963fe65b548e4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rider-plugin/icons/icon.svg"
dest_files=["res://.godot/imported/icon.svg-45c914cff7482ba9564963fe65b548e4.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,12 @@
[plugin]
name="JetBrains Rider External Editor"
description="Provides a toolbar toggle, to switch a set of settings on and off. Default set of settings helps to enable/disable the following settings recommended by the Rider documentation https://www.jetbrains.com/help/rider/Godot.html#optimize-godot-editor-for-rider"
author="JetBrains"
version="1.0.0"
script="rider-plugin.gd"
[presets]
active="on"
presets="presets.json"

View File

@@ -0,0 +1,15 @@
{
"on": {
"text_editor/external/use_external_editor": true,
"interface/editor/import_resources_when_unfocused": true,
"interface/editor/save_on_focus_loss": true,
"text_editor/behavior/files/auto_reload_scripts_on_external_change": true,
"run/window_placement/game_embed_mode": -1
},
"off": {
"text_editor/external/use_external_editor": false,
"interface/editor/import_resources_when_unfocused": false,
"interface/editor/save_on_focus_loss": false,
"text_editor/behavior/files/auto_reload_scripts_on_external_change": false
}
}

View File

@@ -0,0 +1,66 @@
@tool
extends EditorPlugin
var editor_settings: EditorSettings
var checkbutton: CheckButton
var _preset_applier: PresetApplier
var _settings_service: EditorSettingsService
var _locator_service: RiderLocatorService
var _plugin_cfg_path: String
var _presets_json_path: String
func _enter_tree() -> void:
editor_settings = EditorInterface.get_editor_settings()
var script_path := (get_script() as Script).resource_path
var plugin_dir := script_path.get_base_dir()
_plugin_cfg_path = plugin_dir + "/plugin.cfg"
var cfg := ConfigFile.new()
var err := cfg.load(_plugin_cfg_path)
if err != OK:
push_warning("Failed to load plugin.cfg: %s" % [err])
return
var active_str := str(cfg.get_value("presets", "active", "on"))
var is_active := active_str == "on"
var presets_rel_path := str(cfg.get_value("presets", "presets", "presets.json"))
_presets_json_path = plugin_dir + "/" + presets_rel_path
# Build UI
checkbutton = CheckButton.new()
checkbutton.text = "Use Rider"
checkbutton.tooltip_text = "Shortcut for setting recommended settings"
checkbutton.button_pressed = is_active
checkbutton.pressed.connect(_on_checkbutton_pressed)
add_control_to_container(EditorPlugin.CONTAINER_TOOLBAR, checkbutton)
# Initialize services and panel
_settings_service = EditorSettingsService.new()
_locator_service = RiderLocatorService.new()
_preset_applier = PresetApplier.new(_presets_json_path)
_locator_service.add_selector_in_editor_interface(_settings_service)
# Ensure settings reflect current state on startup
_preset_applier.apply_preset(editor_settings, is_active)
func _on_checkbutton_pressed() -> void:
var cfg := ConfigFile.new()
if cfg.load(_plugin_cfg_path) != OK:
push_warning("Failed to load plugin.cfg to update state")
return
var is_active := checkbutton.button_pressed
var key := _preset_applier.get_preset_key(is_active)
cfg.set_value("presets", "active", key)
var save_err := cfg.save(_plugin_cfg_path)
if save_err != OK:
push_warning("Failed to save plugin.cfg: %s" % [save_err])
# Apply selected preset to editor settings
_preset_applier.apply_preset(editor_settings, is_active)
func _exit_tree() -> void:
if checkbutton != null:
remove_control_from_container(EditorPlugin.CONTAINER_TOOLBAR, checkbutton)
checkbutton.queue_free()
var args = OS.get_cmdline_args()
if "--rider-addon-tests" in args:
print("==== rider-addon-tests finished ====")

View File

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

BIN
addons/rider-plugin/screenshots/Toolbar.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cypcl8lffxy6r"
path="res://.godot/imported/Toolbar.png-a521e2493bd3c08a829245b3129bb58f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rider-plugin/screenshots/Toolbar.png"
dest_files=["res://.godot/imported/Toolbar.png-a521e2493bd3c08a829245b3129bb58f.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

View File

@@ -0,0 +1,23 @@
@tool
## Simple JSON helpers for editor/runtime use.
## Keeps file and JSON parsing concerns out of feature code.
class_name JsonUtils
static func load_from_file(path: String) -> Variant:
# Returns parsed JSON value (Dictionary/Array/etc.) or null on error.
var file := FileAccess.open(path, FileAccess.READ)
if file == null:
push_warning("JsonUtils: Failed to open file: %s" % path)
return null
var text := file.get_as_text()
file.close()
var data: Variant = JSON.parse_string(text)
if data == null:
push_warning("JsonUtils: Invalid JSON in file: %s" % path)
return null
return data
static func load_dict_from_file(path: String) -> Dictionary:
# Returns Dictionary or empty {} on error.
var data := load_from_file(path) as Dictionary
return data

View File

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

View File

@@ -0,0 +1,112 @@
@tool
extends RefCounted
class_name RiderLocatorService
var _installations_found: Array = []
var _thread: Thread = null
func get_installations() -> Array:
var result: Array = RiderLocator.new().get_installations() # from the gdextension
return result
# todo
func fix_external_editor_if_supplied_in_commandline(_settings_service: EditorSettingsService, editor_settings: EditorSettings) -> bool:
# When Godot is started from Rider (or vice versa), we may receive the Rider path
# via command-line so we can keep Godot's external editor setting in sync.
# Supported form (only this one):
# --my_rider_path="/absolute/path/to/rider with possible spaces"
var args : Array = OS.get_cmdline_args()
var provided_rider_path := ""
for a_raw in args:
var a: String = str(a_raw)
if a.begins_with("--my_rider_path="):
provided_rider_path = a.substr("--my_rider_path=".length())
break
if provided_rider_path.is_empty():
return false
provided_rider_path = trim_quotes(provided_rider_path)
# Validate existence (file or dir)
var looks_existing := FileAccess.file_exists(provided_rider_path) || DirAccess.dir_exists_absolute(provided_rider_path)
if looks_existing:
_settings_service.set_external_editor_path(editor_settings, provided_rider_path)
print("Rider path provided via CLI (my_rider_path): ", provided_rider_path)
return true
else:
push_warning("my_rider_path was provided but does not exist: %s" % [provided_rider_path])
return false
func trim_quotes(s: String) -> String:
if s.begins_with('"') and s.ends_with('"') and s.length() >= 2:
return s.substr(1, s.length() - 2)
return s
func add_selector_in_editor_interface(_settings_service: EditorSettingsService):
_update_selector(_installations_found)
if _installations_found.is_empty() and _thread == null:
_thread = Thread.new()
_thread.start(_load_installations)
func _load_installations() -> void:
var array: Array = get_installations()
call_deferred("_on_installations_loaded", array)
func _on_installations_loaded(array: Array):
_installations_found = array
if _thread:
_thread.wait_to_finish()
_thread = null
_update_selector(_installations_found)
func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE and _thread != null:
_thread.wait_to_finish()
func _update_selector(array: Array):
var name := "text_editor/external/editor"
var settings := EditorInterface.get_editor_settings()
if !(settings.has_setting(name)):
settings.set(name, 0)
var installations: Array = ["Custom"]
for element in array:
var display_name: String = element.get("display", "")
# Replace special characters that break PROPERTY_HINT_ENUM format
# Comma is the enum delimiter, colon is used for explicit value assignment
display_name = display_name.replace(",", "").replace(":", " -")
installations.append(display_name)
var options :String = ",".join(installations)
settings.add_property_info({
"name": name,
"type":TYPE_INT,
"hint":PROPERTY_HINT_ENUM,
"hint_string": options
})
# Connect to settings changes to update external editor path when selection changes
if not settings.settings_changed.is_connected(_on_selection_changed):
settings.settings_changed.connect(_on_selection_changed.bind())
func _on_selection_changed() -> void:
var name := "text_editor/external/editor"
var settings := EditorInterface.get_editor_settings()
var selected_index: int = settings.get_setting(name)
# Index 0 is "Custom", so user manages the path manually
if selected_index == 0:
return
# Map to actual installation (offset by 1 because of "Custom" at index 0)
var installation_index := selected_index - 1
var installations_array = _installations_found
if installation_index >= 0 and installation_index < installations_array.size():
var installation = installations_array[installation_index]
var new_path: String = installation.get("path", "")
if not new_path.is_empty():
EditorSettingsService.new().set_external_editor_path(settings, new_path)

View File

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

View File

@@ -0,0 +1,35 @@
@tool
extends RefCounted
class_name PresetApplier
var presets_path: String
func _init(p_path: String) -> void:
presets_path = p_path
func get_preset_key(is_active: bool) -> String:
return "on" if is_active else "off"
func apply_preset(editor_settings: EditorSettings, is_active: bool) -> void:
var data: Dictionary = JsonUtils.load_dict_from_file(presets_path)
if data.is_empty():
push_warning("Failed to load presets: %s" % presets_path)
return
var new_preset_key := get_preset_key(is_active)
var previous_preset_key := get_preset_key(not is_active)
if not data.has(new_preset_key):
push_warning("Preset '%s' not found in presets.json" % new_preset_key)
return
var new_preset := data[new_preset_key] as Dictionary
# Reset keys from previous preset that are missing in the new preset
if data.has(previous_preset_key):
var previous_preset := data[previous_preset_key] as Dictionary
for key in previous_preset:
if not new_preset.has(key):
editor_settings.set_setting(str(key), editor_settings.property_get_revert(str(key)))
# Apply the new preset
for key in new_preset:
editor_settings.set_setting(str(key), new_preset[key])

View File

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

View File

@@ -0,0 +1,17 @@
@tool
extends RefCounted
class_name EditorSettingsService
func set_external_editor_path(editor_settings: EditorSettings, path: String) -> void:
editor_settings.set_setting("text_editor/external/exec_path", path)
func has_valid_external_editor_path(editor_settings: EditorSettings) -> bool:
var has_setting: bool = editor_settings.has_setting("text_editor/external/exec_path")
if not has_setting:
return false
var path : String = editor_settings.get_setting("text_editor/external/exec_path")
var exists := not path.is_empty() && (FileAccess.file_exists(path) || DirAccess.dir_exists_absolute(path))
return exists
func set_use_external_editor(editor_settings: EditorSettings, enabled: bool) -> void:
editor_settings.set_setting("text_editor/external/use_external_editor", enabled)

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -3,19 +3,21 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://goerc3svgoqd"
path="res://.godot/imported/keyboard_escape_outline.svg-5abd6c168b832eae20b6e1164ac06548.ctex"
path.s3tc="res://.godot/imported/keyboard_escape_outline.svg-5abd6c168b832eae20b6e1164ac06548.s3tc.ctex"
path.etc2="res://.godot/imported/keyboard_escape_outline.svg-5abd6c168b832eae20b6e1164ac06548.etc2.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_escape_outline.svg"
dest_files=["res://.godot/imported/keyboard_escape_outline.svg-5abd6c168b832eae20b6e1164ac06548.ctex"]
dest_files=["res://.godot/imported/keyboard_escape_outline.svg-5abd6c168b832eae20b6e1164ac06548.s3tc.ctex", "res://.godot/imported/keyboard_escape_outline.svg-5abd6c168b832eae20b6e1164ac06548.etc2.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
@@ -23,7 +25,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -37,7 +39,7 @@ 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
detect_3d/compress_to=0
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -3,19 +3,21 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b580m114ivbse"
path="res://.godot/imported/xbox_button_menu_outline.svg-505b86f2a024b9e033f596e6a1373a04.ctex"
path.s3tc="res://.godot/imported/xbox_button_menu_outline.svg-505b86f2a024b9e033f596e6a1373a04.s3tc.ctex"
path.etc2="res://.godot/imported/xbox_button_menu_outline.svg-505b86f2a024b9e033f596e6a1373a04.etc2.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_button_menu_outline.svg"
dest_files=["res://.godot/imported/xbox_button_menu_outline.svg-505b86f2a024b9e033f596e6a1373a04.ctex"]
dest_files=["res://.godot/imported/xbox_button_menu_outline.svg-505b86f2a024b9e033f596e6a1373a04.s3tc.ctex", "res://.godot/imported/xbox_button_menu_outline.svg-505b86f2a024b9e033f596e6a1373a04.etc2.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
@@ -23,7 +25,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -37,7 +39,7 @@ 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
detect_3d/compress_to=0
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -46,7 +46,7 @@ kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true
dotnet/embed_build_outputs=false
dotnet/embed_build_outputs=true
texture_format/bptc=true
texture_format/s3tc=true
texture_format/etc=false
@@ -125,7 +125,7 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
Remove-Item -Recurse -Force '{temp_dir}'"
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true
dotnet/embed_build_outputs=false
dotnet/embed_build_outputs=true
texture_format/bptc=true
texture_format/s3tc=true
texture_format/etc=false
@@ -472,4 +472,4 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
Remove-Item -Recurse -Force '{temp_dir}'"
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true
dotnet/embed_build_outputs=false
dotnet/embed_build_outputs=true

View File

@@ -0,0 +1,42 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
namespace Movementtests.forge.abilities;
public class EffectApplicationBehavior(EffectData effectData) : IAbilityBehavior
{
private ActiveEffectHandle? _effectHandle;
public void OnStarted(AbilityBehaviorContext context)
{
GD.Print("This is applying the periodic effect to the flying weapon");
_effectHandle = context.Owner.EffectsManager.ApplyEffect(new Effect(effectData, new EffectOwnership(context.Owner, context.Owner)));
context.AbilityHandle.CommitAbility();
}
public void OnEnded(AbilityBehaviorContext context)
{
GD.Print("This is removing the periodic effect from the flying weapon");
if (_effectHandle is not null)
context.Owner.EffectsManager.RemoveEffect(_effectHandle);
context.InstanceHandle.End();
}
}
[Tool]
[GlobalClass]
public partial class ForgeEffectApplicationBehavior : ForgeAbilityBehavior
{
[Export] public ForgeEffectData? EffectData { get; set; }
public override IAbilityBehavior GetBehavior()
{
if (EffectData == null)
throw new System.ArgumentException("EffectData is null");
return new EffectApplicationBehavior(EffectData.GetEffectData());
}
}

View File

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

View File

@@ -0,0 +1,59 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Godot.Nodes;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
namespace Movementtests.forge.abilities;
public class ExplodingSwordBehavior(PackedScene explosion) : IAbilityBehavior
{
public void OnStarted(AbilityBehaviorContext context)
{
if (context.Owner is not Node3D owner)
{
context.InstanceHandle.End();
return;
}
if (explosion.Instantiate() is not Explosion explosion1)
{
GD.Print("Cannot instantiate");
context.InstanceHandle.End();
return;
}
if (!owner.IsInsideTree())
{
GD.Print("Not inside tree");
context.InstanceHandle.End();
return;
}
GD.Print("EXPLOSION");
explosion1.Radius = 6f;
owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explosion1);
explosion1.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition);
context.AbilityHandle.CommitAbility();
context.InstanceHandle.End();
}
public void OnEnded(AbilityBehaviorContext context)
{
}
}
[Tool]
[GlobalClass]
public partial class ForgeExplodingSwordBehavior : ForgeAbilityBehavior
{
[Export] public PackedScene? Explosion { get; set; }
public override IAbilityBehavior GetBehavior()
{
if (Explosion == null)
throw new System.ArgumentException("Explosion is null");
return new ExplodingSwordBehavior(Explosion);
}
}

View File

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

View File

@@ -0,0 +1,23 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
namespace Movementtests.forge.abilities;
public class InstantEndBehavior : IAbilityBehavior
{
public void OnStarted(AbilityBehaviorContext context)
{
context.AbilityHandle.CommitAbility();
context.InstanceHandle.End();
}
public void OnEnded(AbilityBehaviorContext context) {}
}
[Tool]
[GlobalClass]
public partial class ForgeInstantEndBehavior : ForgeAbilityBehavior
{
public override IAbilityBehavior GetBehavior() => new InstantEndBehavior();
}

View File

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

View File

@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using Gamesmiths.Forge.Attributes;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Magnitudes;
using Gamesmiths.Forge.Effects.Modifiers;
using Gamesmiths.Forge.Events;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Calculators;
using Gamesmiths.Forge.Tags;
using Godot;
using Movementtests.systems;
namespace Movementtests.tools.calculators;
public class FlyingWeaponExecution(TagContainer eventTags) : CustomExecution
{
public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
{
GD.Print("Custom execution executed");
var owner = effect.Ownership.Owner;
if (owner == null) return [];
owner.Events.Raise(new EventData
{
EventTags = eventTags,
Source = owner,
EventMagnitude = 12f
});
return [];
}
}
[GlobalClass]
public partial class ForgeRaiseEventTagExecution : ForgeCustomExecution
{
[Export] ForgeTagContainer EventTags { get; set; } = new();
public override CustomExecution GetExecutionClass()
{
return new FlyingWeaponExecution(EventTags.GetTagContainer());
}
}

View File

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

7
forge/forge_data.tres Normal file
View File

@@ -0,0 +1,7 @@
[gd_resource type="Resource" format=3 uid="uid://dugyoyn4fda3s"]
[ext_resource type="Script" uid="uid://bq4vlbfx00hea" path="res://addons/forge/core/ForgeData.cs" id="1_l686n"]
[resource]
script = ExtResource("1_l686n")
RegisteredTags = Array[String](["effect.fire", "effect.wet", "cue.floating.text", "cue.vfx.fire", "cue.vfx.wet", "cue.vfx.regen", "cooldown.enemy.attack", "set_by_caller.damage", "event.damage", "cooldown", "cooldown.skill.projectile", "cooldown.skill.shield", "cooldown.skill.dash", "movement.block", "immunity.damage", "effect.mana_shield", "cue.vfx.shield", "event", "event.player.empowered_action_used", "event.damage.taken", "event.damage.dealt", "set_by_caller", "trait.flammable", "trait.healable", "trait.damageable", "trait.wettable", "cue.vfx.reflect", "cue.vfx", "cooldown.skill", "cooldown.skill.reflect"])

View File

@@ -1,5 +0,0 @@
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}

View File

@@ -0,0 +1,12 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Tags;
using Godot;
namespace Movementtests.interfaces;
public interface IAbilityBase<TCreation, TPayload>
{
AbilityData Ability(TCreation creationData, TagContainer? tags);
IAbilityBehavior<TPayload> Behavior(TCreation creationData);
}

View File

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

View File

@@ -10,7 +10,7 @@ public interface IHealthable
event Action<IHealthable, HealthChangedRecord> HealthChanged;
event Action<IHealthable> HealthDepleted;
[Export] RHealth RHealth { get; set; }
[Export] RHealth? RHealth { get; set; }
float CurrentHealth { get; set; }

View File

@@ -6,7 +6,7 @@ public record KnockbackRecord(DamageRecord DamageRecord, float ForceMultiplier =
public interface IKnockbackable
{
[Export] RKnockback RKnockback { get; set;}
[Export] RKnockback? RKnockback { get; set;}
public void RegisterKnockback(KnockbackRecord record);
public Vector3 ComputeKnockback();

View File

@@ -451,6 +451,7 @@ MovementInputs = SubResource("Resource_pxspk")
HealthInputs = ExtResource("27_lgco8")
DamageInputs = ExtResource("28_51ivn")
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="Spawner2" parent="." unique_id=717610670 node_paths=PackedStringArray("Target") instance=ExtResource("24_qwuk2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 31, 7.5, -88)
@@ -459,6 +460,7 @@ MovementInputs = ExtResource("30_3w3wd")
HealthInputs = ExtResource("31_5hbxb")
DamageInputs = ExtResource("32_hmdts")
Target = NodePath("../Player")
IsActiveOnStart = false
[connection signal="timeout" from="TutorialController/WaitToShowBlockingTuto" to="TutorialController" method="_show_weapon_tutorial"]
[connection signal="body_exited" from="TutoTriggers/TriggerTutoMove" to="TutorialController" method="hide_tutorials"]

View File

@@ -15,6 +15,8 @@
[ext_resource type="Texture2D" uid="uid://2h3y7dj0iwet" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_stick_l_up.svg" id="12_pu6f4"]
[ext_resource type="Texture2D" uid="uid://bsxtadecl3657" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_shift_outline.svg" id="13_6rkcg"]
[ext_resource type="Texture2D" uid="uid://crw70luu8rge" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_arrows_up_outline.svg" id="13_rbrma"]
[ext_resource type="Texture2D" uid="uid://b580m114ivbse" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_button_menu_outline.svg" id="16_8xoi0"]
[ext_resource type="Texture2D" uid="uid://goerc3svgoqd" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_escape_outline.svg" id="17_atuqk"]
[sub_resource type="BoxShape3D" id="BoxShape3D_6c6r2"]
size = Vector3(6.5, 9, 7.5)
@@ -34,6 +36,9 @@ size = Vector3(10, 6.5, 3)
[sub_resource type="BoxShape3D" id="BoxShape3D_p8dgc"]
size = Vector3(3, 6.5, 5.5)
[sub_resource type="BoxShape3D" id="BoxShape3D_7hd1j"]
size = Vector3(6.75, 8.25, 7.25)
[node name="Main" unique_id=955321579 instance=ExtResource("1_jyq54")]
[node name="DirectionalLight3D" parent="." index="5" unique_id=1357990191]
@@ -1032,6 +1037,16 @@ tuto_text = "Dash"
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, -3.75)
shape = SubResource("BoxShape3D_p8dgc")
[node name="TutoTrigger10" parent="Tutorials" index="8" unique_id=1955529780 instance=ExtResource("7_r26ni")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.904569, 25, -48.72998)
first_input_icon = ExtResource("16_8xoi0")
first_input_icon_keyboard = ExtResource("17_atuqk")
tuto_text = "Select next level when ready"
[node name="CollisionShape3D" type="CollisionShape3D" parent="Tutorials/TutoTrigger10" index="1" unique_id=1398626070]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.875, 1.125, -4.625)
shape = SubResource("BoxShape3D_7hd1j")
[node name="Player" parent="." index="11" unique_id=1309399929]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, -0.5, 0.4102497, 0.5415039)
HasSword = false

View File

@@ -1,51 +1,53 @@
[gd_scene format=3 uid="uid://e81wsmpen58r"]
[ext_resource type="PackedScene" uid="uid://55wehh6xombr" path="res://maps/_templates/main_scene_template.tscn" id="1_8n6bu"]
[ext_resource type="PackedScene" uid="uid://y77cdg7gg3y7" path="res://maps/levels/_arenas/playtest_1.tscn" id="2_wsc2c"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="3_wsc2c"]
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="4_invhv"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="5_ofbe2"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="6_cgfmf"]
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="7_hr4qv"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="8_dkfm7"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="9_ofbe2"]
[ext_resource type="PackedScene" uid="uid://b8aet6m4m2i83" path="res://scenes/tuto_trigger/TutoTrigger.tscn" id="10_dkfm7"]
[ext_resource type="Texture2D" uid="uid://nrhxjdpuje3f" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_lt_outline.svg" id="11_xy0m1"]
[ext_resource type="Texture2D" uid="uid://dx2mk8qd6g8uh" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/mouse_right_outline.svg" id="12_t5o40"]
[ext_resource type="Texture2D" uid="uid://cjh5cnvdbq5ku" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_button_b_outline.svg" id="13_t5o40"]
[ext_resource type="Texture2D" uid="uid://bsxtadecl3657" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_shift_outline.svg" id="14_prjj8"]
[ext_resource type="Texture2D" uid="uid://dyjvbsvbriii4" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_rb_outline.svg" id="15_05lnh"]
[ext_resource type="Texture2D" uid="uid://bhlrmh5v3fa2n" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/mouse_left_outline.svg" id="16_t5o40"]
[ext_resource type="Texture2D" uid="uid://db6uqhcmcfs5t" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_lb_outline.svg" id="17_prjj8"]
[ext_resource type="Texture2D" uid="uid://ybwqghk70io" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_f_outline.svg" id="18_1opdv"]
[ext_resource type="PackedScene" uid="uid://55wehh6xombr" path="res://maps/_templates/main_scene_template.tscn" id="1_8yh7j"]
[ext_resource type="PackedScene" uid="uid://y77cdg7gg3y7" path="res://maps/levels/_arenas/playtest_1.tscn" id="2_eiocl"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="3_4m8g1"]
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="4_4u5eu"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="5_dl1un"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="6_465vr"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="7_egib5"]
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="8_a01g8"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="9_doqxp"]
[ext_resource type="PackedScene" uid="uid://b8aet6m4m2i83" path="res://scenes/tuto_trigger/TutoTrigger.tscn" id="10_vqwwk"]
[ext_resource type="Texture2D" uid="uid://nrhxjdpuje3f" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_lt_outline.svg" id="11_bdsxx"]
[ext_resource type="Texture2D" uid="uid://dx2mk8qd6g8uh" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/mouse_right_outline.svg" id="12_2usyc"]
[ext_resource type="Texture2D" uid="uid://cjh5cnvdbq5ku" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_button_b_outline.svg" id="13_ocbap"]
[ext_resource type="Texture2D" uid="uid://bsxtadecl3657" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_shift_outline.svg" id="14_4hfom"]
[ext_resource type="Texture2D" uid="uid://dyjvbsvbriii4" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_rb_outline.svg" id="15_1s3jl"]
[ext_resource type="Texture2D" uid="uid://bhlrmh5v3fa2n" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/mouse_left_outline.svg" id="16_ca01l"]
[ext_resource type="Texture2D" uid="uid://b580m114ivbse" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_button_menu_outline.svg" id="17_5461m"]
[ext_resource type="Texture2D" uid="uid://goerc3svgoqd" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_escape_outline.svg" id="18_22eiu"]
[ext_resource type="Texture2D" uid="uid://db6uqhcmcfs5t" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_lb_outline.svg" id="19_ci5dp"]
[ext_resource type="Texture2D" uid="uid://ybwqghk70io" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_f_outline.svg" id="20_4ouww"]
[sub_resource type="Resource" id="Resource_nwk5u"]
script = ExtResource("6_cgfmf")
script = ExtResource("6_465vr")
GravityModifier = 5.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5"
[sub_resource type="Resource" id="Resource_xy0m1"]
script = ExtResource("7_hr4qv")
script = ExtResource("8_a01g8")
StartingHealth = 100.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_invhv"]
script = ExtResource("7_hr4qv")
script = ExtResource("8_a01g8")
StartingHealth = 1.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_cgfmf"]
script = ExtResource("9_ofbe2")
script = ExtResource("9_doqxp")
DamageType = 2
metadata/_custom_type_script = "uid://jitubgv6judn"
[sub_resource type="Resource" id="Resource_05lnh"]
script = ExtResource("7_hr4qv")
script = ExtResource("8_a01g8")
StartingHealth = 100.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_t5o40"]
script = ExtResource("7_hr4qv")
script = ExtResource("8_a01g8")
StartingHealth = 100.0
metadata/_custom_type_script = "uid://baiapod3csndf"
@@ -64,263 +66,266 @@ size = Vector3(5.5, 4.5, 2)
[sub_resource type="BoxShape3D" id="BoxShape3D_prjj8"]
size = Vector3(2, 3.25, 5.25)
[sub_resource type="BoxShape3D" id="BoxShape3D_trte5"]
size = Vector3(6.75, 8.25, 7.25)
[sub_resource type="BoxShape3D" id="BoxShape3D_1opdv"]
size = Vector3(8.25, 3.25, 2.75)
[node name="Main" unique_id=955321579 instance=ExtResource("1_8n6bu")]
[node name="Main" unique_id=955321579 instance=ExtResource("1_8yh7j")]
[node name="Playground" type="Node3D" parent="." index="7" unique_id=2099606598]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -8.25, 13, 58.5)
[node name="PlaytestArena" parent="Playground" index="0" unique_id=664535670 instance=ExtResource("2_wsc2c")]
[node name="PlaytestArena" parent="Playground" index="0" unique_id=664535670 instance=ExtResource("2_eiocl")]
[node name="CSGBox3D108" type="CSGBox3D" parent="Playground/PlaytestArena" index="88" unique_id=47922109]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 8.75, 2.25)
use_collision = true
size = Vector3(1, 17.5, 9.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="Targets" type="Node3D" parent="Playground" index="1" unique_id=1727473773]
[node name="FixedDashthroughTarget" parent="Playground/Targets" index="0" unique_id=1291663508 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget" parent="Playground/Targets" index="0" unique_id=1291663508 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 17, 13.5, -9)
[node name="FixedDashthroughTarget8" parent="Playground/Targets" index="1" unique_id=475406577 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget8" parent="Playground/Targets" index="1" unique_id=475406577 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 17, 23, -34)
[node name="FixedDashthroughTarget9" parent="Playground/Targets" index="2" unique_id=168635463 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget9" parent="Playground/Targets" index="2" unique_id=168635463 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 35.5, 30.5, -42.5)
[node name="FixedDashthroughTarget10" parent="Playground/Targets" index="3" unique_id=119396227 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget10" parent="Playground/Targets" index="3" unique_id=119396227 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 26, 30.5, -42.5)
[node name="FixedDashthroughTarget7" parent="Playground/Targets" index="4" unique_id=282429016 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget7" parent="Playground/Targets" index="4" unique_id=282429016 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 10.5, 5.5, -9)
[node name="FixedDashthroughTarget6" parent="Playground/Targets" index="5" unique_id=437890277 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget6" parent="Playground/Targets" index="5" unique_id=437890277 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 8, 6, -30.5)
[node name="FixedDashthroughTarget4" parent="Playground/Targets" index="6" unique_id=1484691271 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget4" parent="Playground/Targets" index="6" unique_id=1484691271 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 30.5, 5, -33.5)
[node name="FixedDashthroughTarget5" parent="Playground/Targets" index="7" unique_id=434257222 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget5" parent="Playground/Targets" index="7" unique_id=434257222 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 26.5, 9.5, -44)
[node name="FixedDashthroughTarget2" parent="Playground/Targets" index="8" unique_id=272400108 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget2" parent="Playground/Targets" index="8" unique_id=272400108 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 27, 13.5, -9)
[node name="FixedDashthroughTarget3" parent="Playground/Targets" index="9" unique_id=1008201593 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget3" parent="Playground/Targets" index="9" unique_id=1008201593 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 43, 6, -8.5)
[node name="FlyingEnemies" type="Node3D" parent="Playground" index="2" unique_id=1518759273]
[node name="FlyingEnemy" parent="Playground/FlyingEnemies" index="0" unique_id=2090203407 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy" parent="Playground/FlyingEnemies" index="0" unique_id=2090203407 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.5, 7, -9)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy10" parent="Playground/FlyingEnemies" index="1" unique_id=1610354388 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy10" parent="Playground/FlyingEnemies" index="1" unique_id=1610354388 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 32.5, 7, 0.5)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy11" parent="Playground/FlyingEnemies" index="2" unique_id=1671862122 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy11" parent="Playground/FlyingEnemies" index="2" unique_id=1671862122 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 28, 7, 1.5)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy4" parent="Playground/FlyingEnemies" index="3" unique_id=665537400 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy4" parent="Playground/FlyingEnemies" index="3" unique_id=665537400 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 33, 6, -12)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy5" parent="Playground/FlyingEnemies" index="4" unique_id=1592183094 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy5" parent="Playground/FlyingEnemies" index="4" unique_id=1592183094 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 45, 6, -12)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy9" parent="Playground/FlyingEnemies" index="5" unique_id=842890582 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy9" parent="Playground/FlyingEnemies" index="5" unique_id=842890582 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 45, 6, -1.5)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy2" parent="Playground/FlyingEnemies" index="6" unique_id=188061312 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy2" parent="Playground/FlyingEnemies" index="6" unique_id=188061312 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.5, 11, -24)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy12" parent="Playground/FlyingEnemies" index="7" unique_id=821624940 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy12" parent="Playground/FlyingEnemies" index="7" unique_id=821624940 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 8.5, -24)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy3" parent="Playground/FlyingEnemies" index="8" unique_id=412581083 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy3" parent="Playground/FlyingEnemies" index="8" unique_id=412581083 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7, 14, -32.5)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy6" parent="Playground/FlyingEnemies" index="9" unique_id=779578466 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy6" parent="Playground/FlyingEnemies" index="9" unique_id=779578466 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26, 23.5, -23)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy7" parent="Playground/FlyingEnemies" index="10" unique_id=1163439326 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy7" parent="Playground/FlyingEnemies" index="10" unique_id=1163439326 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 34, 23.5, -23)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="FlyingEnemy8" parent="Playground/FlyingEnemies" index="11" unique_id=1979706254 node_paths=PackedStringArray("Target") instance=ExtResource("8_dkfm7")]
[node name="FlyingEnemy8" parent="Playground/FlyingEnemies" index="11" unique_id=1979706254 node_paths=PackedStringArray("Target") instance=ExtResource("5_dl1un")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 43, 23.5, -23)
Target = NodePath("../../../Player")
RMovement = SubResource("Resource_nwk5u")
[node name="GroundedEnemies" type="Node3D" parent="Playground" index="3" unique_id=1101330520]
[node name="Enemy3" parent="Playground/GroundedEnemies" index="0" unique_id=1159989424 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy3" parent="Playground/GroundedEnemies" index="0" unique_id=1159989424 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 25, 0, -8.336809)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy11" parent="Playground/GroundedEnemies" index="1" unique_id=1747444936 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy11" parent="Playground/GroundedEnemies" index="1" unique_id=1747444936 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 17, 8, 3.6631908)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy12" parent="Playground/GroundedEnemies" index="2" unique_id=283117081 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy12" parent="Playground/GroundedEnemies" index="2" unique_id=283117081 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 11, -4.836809)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy13" parent="Playground/GroundedEnemies" index="3" unique_id=970022638 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy13" parent="Playground/GroundedEnemies" index="3" unique_id=970022638 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 12, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy18" parent="Playground/GroundedEnemies" index="4" unique_id=2077088475 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy18" parent="Playground/GroundedEnemies" index="4" unique_id=2077088475 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 12, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy19" parent="Playground/GroundedEnemies" index="5" unique_id=2023773341 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy19" parent="Playground/GroundedEnemies" index="5" unique_id=2023773341 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 7.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy25" parent="Playground/GroundedEnemies" index="6" unique_id=1101329723 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy25" parent="Playground/GroundedEnemies" index="6" unique_id=1101329723 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 46, 7.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy26" parent="Playground/GroundedEnemies" index="7" unique_id=855220553 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy26" parent="Playground/GroundedEnemies" index="7" unique_id=855220553 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 46, 12, -35.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy20" parent="Playground/GroundedEnemies" index="8" unique_id=1255215986 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy20" parent="Playground/GroundedEnemies" index="8" unique_id=1255215986 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 7.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy21" parent="Playground/GroundedEnemies" index="9" unique_id=2098915426 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy21" parent="Playground/GroundedEnemies" index="9" unique_id=2098915426 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 0.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy22" parent="Playground/GroundedEnemies" index="10" unique_id=246912749 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy22" parent="Playground/GroundedEnemies" index="10" unique_id=246912749 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 0.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy14" parent="Playground/GroundedEnemies" index="11" unique_id=211015190 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy14" parent="Playground/GroundedEnemies" index="11" unique_id=211015190 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 41, 17.5, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy15" parent="Playground/GroundedEnemies" index="12" unique_id=1164179421 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy15" parent="Playground/GroundedEnemies" index="12" unique_id=1164179421 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 31, 17.5, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy16" parent="Playground/GroundedEnemies" index="13" unique_id=1169725422 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy16" parent="Playground/GroundedEnemies" index="13" unique_id=1169725422 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 24.5, 17.5, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy17" parent="Playground/GroundedEnemies" index="14" unique_id=1951666189 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy17" parent="Playground/GroundedEnemies" index="14" unique_id=1951666189 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 17.5, 17.5, -22.836807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy23" parent="Playground/GroundedEnemies" index="15" unique_id=1348057502 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy23" parent="Playground/GroundedEnemies" index="15" unique_id=1348057502 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 17.5, 24.5, -43.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy24" parent="Playground/GroundedEnemies" index="16" unique_id=2068813971 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy24" parent="Playground/GroundedEnemies" index="16" unique_id=2068813971 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 45, 24.5, -43.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy4" parent="Playground/GroundedEnemies" index="17" unique_id=366059658 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy4" parent="Playground/GroundedEnemies" index="17" unique_id=366059658 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 10.5, 0, -18.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy7" parent="Playground/GroundedEnemies" index="18" unique_id=1389063523 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy7" parent="Playground/GroundedEnemies" index="18" unique_id=1389063523 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 25.5, 4, -27.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy27" parent="Playground/GroundedEnemies" index="19" unique_id=854456486 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy27" parent="Playground/GroundedEnemies" index="19" unique_id=854456486 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 20, 0, -44.836807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy10" parent="Playground/GroundedEnemies" index="20" unique_id=836898496 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy10" parent="Playground/GroundedEnemies" index="20" unique_id=836898496 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 11, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy8" parent="Playground/GroundedEnemies" index="21" unique_id=1015624071 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy8" parent="Playground/GroundedEnemies" index="21" unique_id=1015624071 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 34.5, 1.5, -27.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy9" parent="Playground/GroundedEnemies" index="22" unique_id=827865590 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy9" parent="Playground/GroundedEnemies" index="22" unique_id=827865590 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 46.5, 0, -27.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy5" parent="Playground/GroundedEnemies" index="23" unique_id=1267116862 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy5" parent="Playground/GroundedEnemies" index="23" unique_id=1267116862 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4, 0, -18.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy6" parent="Playground/GroundedEnemies" index="24" unique_id=1147823180 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy6" parent="Playground/GroundedEnemies" index="24" unique_id=1147823180 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 16.5, 7, -17.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
@@ -331,27 +336,27 @@ use_collision = true
collision_layer = 256
collision_mask = 65553
[node name="FixedDashthroughTarget11" parent="Tutorial" index="0" unique_id=2053952229 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget11" parent="Tutorial" index="0" unique_id=2053952229 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -7.25, 20.5, -27.5)
[node name="FixedDashthroughTarget13" parent="Tutorial" index="1" unique_id=1470128508 instance=ExtResource("4_invhv")]
[node name="FixedDashthroughTarget13" parent="Tutorial" index="1" unique_id=1470128508 instance=ExtResource("4_4u5eu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1.3647223, 23.75, -13.75)
[node name="Enemy28" parent="Tutorial" index="2" unique_id=1765389924 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy28" parent="Tutorial" index="2" unique_id=1765389924 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -5, 22, 16.5)
Target = NodePath("../../Player")
RHealth = SubResource("Resource_invhv")
RDamage = SubResource("Resource_cgfmf")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy29" parent="Tutorial" index="3" unique_id=1071267369 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy29" parent="Tutorial" index="3" unique_id=1071267369 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -10, 22, 28.75)
Target = NodePath("../../Player")
RHealth = SubResource("Resource_05lnh")
RDamage = SubResource("Resource_cgfmf")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy30" parent="Tutorial" index="4" unique_id=1982933011 node_paths=PackedStringArray("Target") instance=ExtResource("5_ofbe2")]
[node name="Enemy30" parent="Tutorial" index="4" unique_id=1982933011 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0.25, 22, 28.75)
Target = NodePath("../../Player")
RHealth = SubResource("Resource_t5o40")
@@ -360,12 +365,12 @@ RMovement = SubResource("Resource_nwk5u")
[node name="Triggers" type="Node3D" parent="Tutorial" index="5" unique_id=1531131828]
[node name="TutoTrigger5" parent="Tutorial/Triggers" index="0" unique_id=840713937 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger5" parent="Tutorial/Triggers" index="0" unique_id=840713937 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 23.25, -24.25)
first_input_icon = ExtResource("11_xy0m1")
first_input_icon_keyboard = ExtResource("12_t5o40")
second_input_icon = ExtResource("13_t5o40")
second_input_icon_keyboard = ExtResource("14_prjj8")
first_input_icon = ExtResource("11_bdsxx")
first_input_icon_keyboard = ExtResource("12_2usyc")
second_input_icon = ExtResource("13_ocbap")
second_input_icon_keyboard = ExtResource("14_4hfom")
input_related_text = "while aiming at target"
tuto_text = "Blink through"
@@ -373,22 +378,22 @@ tuto_text = "Blink through"
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.75, 0.625, 1.75)
shape = SubResource("BoxShape3D_xy0m1")
[node name="TutoTrigger" parent="Tutorial/Triggers" index="1" unique_id=1215265305 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger" parent="Tutorial/Triggers" index="1" unique_id=1215265305 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 0, -4.5)
first_input_icon = ExtResource("11_xy0m1")
first_input_icon_keyboard = ExtResource("12_t5o40")
second_input_icon = ExtResource("13_t5o40")
second_input_icon_keyboard = ExtResource("14_prjj8")
first_input_icon = ExtResource("11_bdsxx")
first_input_icon_keyboard = ExtResource("12_2usyc")
second_input_icon = ExtResource("13_ocbap")
second_input_icon_keyboard = ExtResource("14_4hfom")
tuto_text = "Blink"
[node name="CollisionShape3D" type="CollisionShape3D" parent="Tutorial/Triggers/TutoTrigger" index="1" unique_id=1774867326]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, -3.75, -6.75)
shape = SubResource("BoxShape3D_05lnh")
[node name="TutoTrigger3" parent="Tutorial/Triggers" index="2" unique_id=460767120 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger3" parent="Tutorial/Triggers" index="2" unique_id=460767120 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.75, 7, -49)
first_input_icon = ExtResource("11_xy0m1")
first_input_icon_keyboard = ExtResource("12_t5o40")
first_input_icon = ExtResource("11_bdsxx")
first_input_icon_keyboard = ExtResource("12_2usyc")
input_related_text = "in air"
tuto_text = "slows down time"
@@ -396,10 +401,10 @@ tuto_text = "slows down time"
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0.625, 0.875)
shape = SubResource("BoxShape3D_dkfm7")
[node name="TutoTrigger4" parent="Tutorial/Triggers" index="3" unique_id=321542244 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger4" parent="Tutorial/Triggers" index="3" unique_id=321542244 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.5, 17.75, -27.5)
first_input_icon = ExtResource("15_05lnh")
first_input_icon_keyboard = ExtResource("16_t5o40")
first_input_icon = ExtResource("15_1s3jl")
first_input_icon_keyboard = ExtResource("16_ca01l")
input_related_text = "at target"
tuto_text = "dash through"
@@ -407,10 +412,10 @@ tuto_text = "dash through"
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1.75, 0)
shape = SubResource("BoxShape3D_nwk5u")
[node name="TutoTrigger6" parent="Tutorial/Triggers" index="4" unique_id=26112457 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger6" parent="Tutorial/Triggers" index="4" unique_id=26112457 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.75, 22.75, 11.25)
first_input_icon = ExtResource("15_05lnh")
first_input_icon_keyboard = ExtResource("16_t5o40")
first_input_icon = ExtResource("15_1s3jl")
first_input_icon_keyboard = ExtResource("16_ca01l")
input_related_text = "at enemy"
tuto_text = "dash through"
@@ -418,22 +423,32 @@ tuto_text = "dash through"
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.625, 1.75, -0.75)
shape = SubResource("BoxShape3D_prjj8")
[node name="TutoTrigger7" parent="Tutorial/Triggers" index="5" unique_id=271532103 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger7" parent="Tutorial/Triggers" index="5" unique_id=271532103 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 22.75, 30.25)
first_input_icon = ExtResource("11_xy0m1")
first_input_icon_keyboard = ExtResource("12_t5o40")
second_input_icon = ExtResource("15_05lnh")
second_input_icon_keyboard = ExtResource("16_t5o40")
first_input_icon = ExtResource("11_bdsxx")
first_input_icon_keyboard = ExtResource("12_2usyc")
second_input_icon = ExtResource("15_1s3jl")
second_input_icon_keyboard = ExtResource("16_ca01l")
tuto_text = "throw weapon"
[node name="CollisionShape3D" type="CollisionShape3D" parent="Tutorial/Triggers/TutoTrigger7" index="1" unique_id=1932556219]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.875, 4)
shape = SubResource("BoxShape3D_prjj8")
[node name="TutoTrigger8" parent="Tutorial/Triggers" index="6" unique_id=36196488 instance=ExtResource("10_dkfm7")]
[node name="TutoTrigger10" parent="Tutorial/Triggers" index="6" unique_id=71362747 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.779568, 25, 66.52002)
first_input_icon = ExtResource("17_5461m")
first_input_icon_keyboard = ExtResource("18_22eiu")
tuto_text = "Select next level when ready"
[node name="CollisionShape3D" type="CollisionShape3D" parent="Tutorial/Triggers/TutoTrigger10" index="1" unique_id=1583388762]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.875, 1.125, -4.625)
shape = SubResource("BoxShape3D_trte5")
[node name="TutoTrigger8" parent="Tutorial/Triggers" index="7" unique_id=36196488 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 21.75, 28.25)
first_input_icon = ExtResource("17_prjj8")
first_input_icon_keyboard = ExtResource("18_1opdv")
first_input_icon = ExtResource("19_ci5dp")
first_input_icon_keyboard = ExtResource("20_4ouww")
input_related_text = "at enemy"
tuto_text = "knockback"
@@ -448,310 +463,317 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9, 0, -36.5)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -4.75, 4)
use_collision = true
size = Vector3(9, 8.5, 6)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D112" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="1" unique_id=565292599]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -6.25, 0)
use_collision = true
size = Vector3(9, 5.5, 2)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D113" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="2" unique_id=28433553]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -7.75, -2)
use_collision = true
size = Vector3(9, 2.5, 2)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D110" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="3" unique_id=731833071]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 6, -12.125)
use_collision = true
size = Vector3(5, 1, 4.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D115" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="4" unique_id=173458015]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 5.625, -14)
use_collision = true
size = Vector3(9, 29.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D116" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="5" unique_id=1750512788]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 7, -12.125)
use_collision = true
size = Vector3(1, 1, 4.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D117" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="6" unique_id=391729778]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 7, -12.125)
use_collision = true
size = Vector3(1, 1, 4.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D134" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="7" unique_id=1136091363]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 21.5, 46.125)
use_collision = true
size = Vector3(5, 1, 4.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D135" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="8" unique_id=748140231]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 22.5, 46.125)
use_collision = true
size = Vector3(1, 1, 4.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D136" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="9" unique_id=436209430]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 22.5, 46.125)
use_collision = true
size = Vector3(1, 1, 4.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D137" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="10" unique_id=1930091014]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 22.5, 58)
use_collision = true
size = Vector3(1, 1, 11)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D138" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="11" unique_id=1299444131]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 22.5, 58)
use_collision = true
size = Vector3(1, 1, 11)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D139" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="12" unique_id=1708119368]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 22.5, 68.625)
use_collision = true
size = Vector3(1, 1, 3.25)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D140" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="13" unique_id=762102441]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 22.5, 68.625)
use_collision = true
size = Vector3(1, 1, 3.25)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D120" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="14" unique_id=1446497915]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 17, 6.75)
use_collision = true
size = Vector3(1, 2, 6.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D127" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="15" unique_id=1731176595]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7, 17, 10.5)
use_collision = true
size = Vector3(4, 2, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D119" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="16" unique_id=1284139577]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.5, 0.625, 10)
use_collision = true
size = Vector3(3, 2.25, 6)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D114" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="17" unique_id=1204742131]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 16.5, 4.75)
use_collision = true
size = Vector3(12, 1, 2.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D118" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="18" unique_id=1985192046]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 23.125, 6.5)
use_collision = true
size = Vector3(18, 12.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D130" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="19" unique_id=1502907002]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.25, 23.125, 44)
use_collision = true
size = Vector3(7.5, 12.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D131" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="20" unique_id=632272709]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.25, 23.125, 43)
use_collision = true
size = Vector3(7.5, 12.25, 3)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D123" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="21" unique_id=696789507]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.375, 23.125, 10.5)
use_collision = true
size = Vector3(7.25, 12.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D125" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="22" unique_id=1937274848]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.375, 23.125, 7.5)
use_collision = true
size = Vector3(7.25, 12.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D132" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="23" unique_id=249644458]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 29.625, 25.25)
use_collision = true
size = Vector3(18, 0.75, 38.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D126" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="24" unique_id=1606556480]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.125, 18.25, 9)
use_collision = true
size = Vector3(7.75, 2.5, 4)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D128" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="25" unique_id=1927103381]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.375, 25.375, 9)
use_collision = true
size = Vector3(7.25, 7.75, 2)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D124" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="26" unique_id=1068505352]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.5, 19.487345, 11.25)
use_collision = true
size = Vector3(3, 5, 8.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D129" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="27" unique_id=302301078]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.25, 19.487345, 38.625)
use_collision = true
size = Vector3(9.5, 5, 11.75)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D133" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="28" unique_id=672467040]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 21.487345, 58)
use_collision = true
size = Vector3(5, 1, 11)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D141" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="29" unique_id=1207463075]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 21.487345, 70.5)
use_collision = true
size = Vector3(5, 1, 7)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D121" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="30" unique_id=302433684]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.875, 23.125, 26.25)
use_collision = true
size = Vector3(13.75, 12.25, 30.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D122" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="31" unique_id=1125662345]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 23.125, 25.25)
use_collision = true
size = Vector3(1, 12.25, 36.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D111" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="32" unique_id=923535141]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -11.125, -3.75)
use_collision = true
size = Vector3(9, 4.25, 21.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D142" type="CSGBox3D" parent="Tutorial" index="7" unique_id=886061699]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 22, 34)
use_collision = true
size = Vector3(2, 2, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D145" type="CSGBox3D" parent="Tutorial" index="8" unique_id=1440927327]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 12.25, 34)
use_collision = true
size = Vector3(12, 17.5, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D139" type="CSGBox3D" parent="Tutorial" index="9" unique_id=1561729125]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 21.5, 28.75)
use_collision = true
size = Vector3(12, 1, 3.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D146" type="CSGBox3D" parent="Tutorial" index="10" unique_id=1614862969]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.75, 23, 55.75)
use_collision = true
size = Vector3(19.5, 1, 3.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D147" type="CSGBox3D" parent="Tutorial" index="11" unique_id=1320459108]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.875, 23, 67.25)
use_collision = true
size = Vector3(3.25, 1, 19.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D140" type="CSGBox3D" parent="Tutorial" index="12" unique_id=124463390]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.5, 25.125, 34)
use_collision = true
size = Vector3(5, 8.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D141" type="CSGBox3D" parent="Tutorial" index="13" unique_id=164888540]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 25.125, 34)
use_collision = true
size = Vector3(5, 8.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D114" type="CSGBox3D" parent="Tutorial" index="14" unique_id=1217279859]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -4.75, 0)
use_collision = true
size = Vector3(9, 8.5, 14)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D116" type="CSGBox3D" parent="Tutorial" index="15" unique_id=720911926]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 9.375, -11.75)
use_collision = true
size = Vector3(18, 15.25, 37.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D115" type="CSGBox3D" parent="Tutorial" index="16" unique_id=995233474]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -1, -26.5)
use_collision = true
size = Vector3(18, 1, 6)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D119" type="CSGBox3D" parent="Tutorial" index="17" unique_id=1412582714]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.875, -3.75, -30)
use_collision = true
size = Vector3(11.75, 11, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D121" type="CSGBox3D" parent="Tutorial" index="18" unique_id=697302898]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 0.125, -30)
use_collision = true
size = Vector3(3, 3.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D117" type="CSGBox3D" parent="Tutorial" index="19" unique_id=603171965]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -6.25, -8)
use_collision = true
size = Vector3(9, 5.5, 2)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D123" type="CSGBox3D" parent="Tutorial" index="20" unique_id=765166179]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.625, 6)
use_collision = true
size = Vector3(9, 2.25, 2)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D118" type="CSGBox3D" parent="Tutorial" index="21" unique_id=1950738925]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -7.75, -10)
use_collision = true
size = Vector3(9, 2.5, 2)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D120" type="CSGBox3D" parent="Tutorial" index="22" unique_id=1024529143]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -21.75, -11.75)
use_collision = true
size = Vector3(9, 25.5, 37.5)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D122" type="CSGBox3D" parent="Tutorial" index="23" unique_id=1261455320]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.5, 16.5, -28.5)
use_collision = true
size = Vector3(3, 1, 4)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="CSGBox3D143" type="CSGBox3D" parent="Tutorial" index="24" unique_id=1090375546]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 27.625, 34)
use_collision = true
size = Vector3(2, 3.25, 1)
material = ExtResource("3_wsc2c")
material = ExtResource("3_4m8g1")
[node name="Player" parent="." index="9" unique_id=1309399929]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, -0.5, 0, 0)
[node name="PlayerFellRespawn" parent="." index="10" unique_id=479136076]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1.5, 0)
[node name="OmniLight3D" type="OmniLight3D" parent="." index="13" unique_id=702421172]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 25, 4)
[node name="OmniLight3D2" type="OmniLight3D" parent="." index="14" unique_id=2016820716]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 25, -9.5)
omni_range = 12.0

View File

@@ -13,6 +13,10 @@
[ext_resource type="Resource" uid="uid://dg1xbjhyhgnnk" path="res://scenes/enemies/flying_enemy/flying_enemy_health.tres" id="11_5jlg7"]
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="12_pjgox"]
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="13_iq67o"]
[ext_resource type="PackedScene" uid="uid://b8aet6m4m2i83" path="res://scenes/tuto_trigger/TutoTrigger.tscn" id="14_lthgu"]
[sub_resource type="BoxShape3D" id="BoxShape3D_lthgu"]
size = Vector3(7.5, 3.75, 10.25)
[node name="Main" unique_id=955321579 instance=ExtResource("1_k7f42")]
@@ -101,5 +105,12 @@ transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 27, 13.5, -9)
[node name="FixedDashthroughTarget3" parent="Targets" index="9" unique_id=1106453232 instance=ExtResource("13_iq67o")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 43, 6, -8.5)
[node name="Player" parent="." index="14" unique_id=1309399929]
[node name="TutoTrigger5" parent="." index="14" unique_id=840713937 instance=ExtResource("14_lthgu")]
tuto_text = "Try to survive!"
[node name="CollisionShape3D" type="CollisionShape3D" parent="TutoTrigger5" index="1" unique_id=1820790391]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0.625, -1.875)
shape = SubResource("BoxShape3D_lthgu")
[node name="Player" parent="." index="15" unique_id=1309399929]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 3, 0, 0)

View File

@@ -17,18 +17,14 @@ func _ready() -> void:
## A fresh level list is propgated into the ItemList, and the file names are cleaned
func add_levels_to_container() -> void:
level_buttons_container.clear()
var max_level_reached := GameState.get_max_level_reached()
var level_iter := 0
for file_path in scene_lister.files:
# if level_iter > max_level_reached : break
level_iter += 1
var file_name := file_path.get_file() # e.g., "level_1.tscn"
file_name = file_name.trim_suffix(".tscn") # Remove the ".tscn" extension
file_name = file_name.replace("_", " ") # Replace underscores with spaces
file_name = file_name.capitalize() # Convert to proper case
if file_path.contains("/gyms/"): file_name = "[GYM] " + file_name
if file_path.contains("/museums/"): file_name = "[MUS] " + file_name
if file_path.contains("/zoos/"): file_name = "[ZOO] " + file_name
if file_path.contains("/gyms/"): continue # file_name = "[GYM] " + file_name
if file_path.contains("/museums/"): continue # file_name = "[MUS] " + file_name
if file_path.contains("/zoos/"): continue # file_name = "[ZOO] " + file_name
var button_name := str(file_name)
level_buttons_container.add_item(button_name)

View File

@@ -43,7 +43,7 @@ item_0/text = "1 - ExampleLevel"
[node name="SceneLister" type="Node" parent="." unique_id=149935027]
script = ExtResource("3_stdqw")
files = Array[String](["res://maps/gyms/metrics.tscn", "res://maps/levels/tuto_enemies.tscn", "res://maps/levels/tuto_movement.tscn", "res://maps/levels/tuto_sword_parry.tscn", "res://maps/zoos/grounded_flying_ennemies.tscn"])
files = Array[String](["res://maps/levels/1 - tuto_movement.tscn", "res://maps/levels/2 - tuto_sword.tscn", "res://maps/levels/3 - tuto_enemies.tscn", "res://maps/zoos/grounded_flying_ennemies.tscn", "res://maps/gyms/metrics.tscn"])
directory = "res://maps"
[connection signal="item_activated" from="Control/LevelButtonsContainer" to="." method="_on_level_buttons_container_item_activated"]

View File

@@ -1 +1,11 @@
extends PauseMenu
@export var level_selection_menu: PackedScene = preload("uid://fybssggvts5q")
func _on_select_level_pressed() -> void:
var menu: LevelSelectMenu = level_selection_menu.instantiate()
menu.level_selected.connect(_on_level_selected)
add_child(menu)
func _on_level_selected() -> void:
close()

View File

@@ -3,12 +3,20 @@
[ext_resource type="PackedScene" uid="uid://b5cd6sa8qq4vc" path="res://addons/maaacks_game_template/base/scenes/overlaid_menu/menus/pause_menu.tscn" id="1_0paax"]
[ext_resource type="Script" uid="uid://bwvomv4eww4fg" path="res://menus/scenes/overlaid_menus/pause_menu.gd" id="2_ek1hy"]
[ext_resource type="PackedScene" uid="uid://dim045la3mijk" path="res://menus/scenes/overlaid_menus/mini_options_overlaid_menu.tscn" id="3_e0t2r"]
[ext_resource type="PackedScene" uid="uid://fybssggvts5q" path="res://menus/scenes/menus/level_select_menu/level_select_menu.tscn" id="3_nfx08"]
[node name="PauseMenu" unique_id=750750590 instance=ExtResource("1_0paax")]
top_level = true
script = ExtResource("2_ek1hy")
level_selection_menu = ExtResource("3_nfx08")
options_packed_scene = ExtResource("3_e0t2r")
main_menu_scene = "res://menus/scenes/menus/main_menu/main_menu_with_animations.tscn"
[node name="SelectLevel" type="Button" parent="MenuPanelContainer/MarginContainer/BoxContainer/MenuButtonsMargin/MenuButtons" parent_id_path=PackedInt32Array(738685969) index="2" unique_id=1879165831]
layout_mode = 2
text = "Select level
"
[connection signal="tree_entered" from="." to="." method="on_enter_tree"]
[connection signal="tree_exited" from="." to="." method="on_exit_tree"]
[connection signal="pressed" from="MenuPanelContainer/MarginContainer/BoxContainer/MenuButtonsMargin/MenuButtons/SelectLevel" to="." method="_on_select_level_pressed"]

View File

@@ -1,79 +0,0 @@
{
"format": 1,
"restore": {
"D:\\Godot\\Projects\\movement-tests\\movement-tests.csproj": {}
},
"projects": {
"D:\\Godot\\Projects\\movement-tests\\movement-tests.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\Godot\\Projects\\movement-tests\\movement-tests.csproj",
"projectName": "movement-tests",
"projectPath": "D:\\Godot\\Projects\\movement-tests\\movement-tests.csproj",
"packagesPath": "C:\\Users\\Minimata\\.nuget\\packages\\",
"outputPath": "D:\\Godot\\Projects\\movement-tests\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\Minimata\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"xunit.v3.mtp-v2": {
"target": "Package",
"version": "[3.2.2, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.301/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Minimata\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Minimata\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.testing.platform\2.0.2\buildTransitive\net8.0\Microsoft.Testing.Platform.props" Condition="Exists('$(NuGetPackageRoot)microsoft.testing.platform\2.0.2\buildTransitive\net8.0\Microsoft.Testing.Platform.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.testing.platform.msbuild\2.0.2\buildTransitive\Microsoft.Testing.Platform.MSBuild.props" Condition="Exists('$(NuGetPackageRoot)microsoft.testing.platform.msbuild\2.0.2\buildTransitive\Microsoft.Testing.Platform.MSBuild.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.testing.extensions.telemetry\2.0.2\buildTransitive\net8.0\Microsoft.Testing.Extensions.Telemetry.props" Condition="Exists('$(NuGetPackageRoot)microsoft.testing.extensions.telemetry\2.0.2\buildTransitive\net8.0\Microsoft.Testing.Extensions.Telemetry.props')" />
<Import Project="$(NuGetPackageRoot)xunit.v3.core.mtp-v2\3.2.2\buildTransitive\xunit.v3.core.mtp-v2.props" Condition="Exists('$(NuGetPackageRoot)xunit.v3.core.mtp-v2\3.2.2\buildTransitive\xunit.v3.core.mtp-v2.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Pkgxunit_analyzers Condition=" '$(Pkgxunit_analyzers)' == '' ">C:\Users\Minimata\.nuget\packages\xunit.analyzers\1.27.0</Pkgxunit_analyzers>
</PropertyGroup>
</Project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.testing.platform\2.0.2\buildTransitive\net8.0\Microsoft.Testing.Platform.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.testing.platform\2.0.2\buildTransitive\net8.0\Microsoft.Testing.Platform.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.testing.platform.msbuild\2.0.2\buildTransitive\Microsoft.Testing.Platform.MSBuild.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.testing.platform.msbuild\2.0.2\buildTransitive\Microsoft.Testing.Platform.MSBuild.targets')" />
<Import Project="$(NuGetPackageRoot)xunit.v3.core.mtp-v2\3.2.2\buildTransitive\xunit.v3.core.mtp-v2.targets" Condition="Exists('$(NuGetPackageRoot)xunit.v3.core.mtp-v2\3.2.2\buildTransitive\xunit.v3.core.mtp-v2.targets')" />
</ImportGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,28 +0,0 @@
{
"version": 2,
"dgSpecHash": "C+vE0OBbgVo=",
"success": true,
"projectFilePath": "D:\\Godot\\Projects\\movement-tests\\movement-tests.csproj",
"expectedPackageFiles": [
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.applicationinsights\\2.23.0\\microsoft.applicationinsights.2.23.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.bcl.asyncinterfaces\\6.0.0\\microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.netcore.platforms\\5.0.0\\microsoft.netcore.platforms.5.0.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.testing.extensions.telemetry\\2.0.2\\microsoft.testing.extensions.telemetry.2.0.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.testing.extensions.trxreport.abstractions\\2.0.2\\microsoft.testing.extensions.trxreport.abstractions.2.0.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.testing.platform\\2.0.2\\microsoft.testing.platform.2.0.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.testing.platform.msbuild\\2.0.2\\microsoft.testing.platform.msbuild.2.0.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\microsoft.win32.registry\\5.0.0\\microsoft.win32.registry.5.0.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\system.diagnostics.diagnosticsource\\5.0.0\\system.diagnostics.diagnosticsource.5.0.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\system.security.accesscontrol\\5.0.0\\system.security.accesscontrol.5.0.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.analyzers\\1.27.0\\xunit.analyzers.1.27.0.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.assert\\3.2.2\\xunit.v3.assert.3.2.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.common\\3.2.2\\xunit.v3.common.3.2.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.core.mtp-v2\\3.2.2\\xunit.v3.core.mtp-v2.3.2.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.extensibility.core\\3.2.2\\xunit.v3.extensibility.core.3.2.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.mtp-v2\\3.2.2\\xunit.v3.mtp-v2.3.2.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.runner.common\\3.2.2\\xunit.v3.runner.common.3.2.2.nupkg.sha512",
"C:\\Users\\Minimata\\.nuget\\packages\\xunit.v3.runner.inproc.console\\3.2.2\\xunit.v3.runner.inproc.console.3.2.2.nupkg.sha512"
],
"logs": []
}

View File

@@ -46,7 +46,7 @@ movie_writer/movie_file="D:/Godot/Projects/movement-tests/communication/movie.av
[editor_plugins]
enabled=PackedStringArray("res://addons/csg_toolkit/plugin.cfg", "res://addons/forge/plugin.cfg", "res://addons/gdUnit4/plugin.cfg", "res://addons/godot_state_charts/plugin.cfg", "res://addons/guide/plugin.cfg", "res://addons/maaacks_game_template/plugin.cfg", "res://addons/shaker/plugin.cfg")
enabled=PackedStringArray("res://addons/csg_toolkit/plugin.cfg", "res://addons/forge/plugin.cfg", "res://addons/gdUnit4/plugin.cfg", "res://addons/godot_state_charts/plugin.cfg", "res://addons/guide/plugin.cfg", "res://addons/maaacks_game_template/plugin.cfg", "res://addons/rider-plugin/plugin.cfg", "res://addons/shaker/plugin.cfg")
[gui]

View File

@@ -3,14 +3,10 @@ using System;
using Movementtests.interfaces;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_heart.png")]
public partial class RHealth : Resource
public partial class RHealth(float startingHealth) : Resource
{
[Export]
public float StartingHealth { get; set;}
public float StartingHealth { get; set;} = startingHealth;
public RHealth() : this(100.0f) {}
public RHealth(float startingHealth)
{
StartingHealth = startingHealth;
}
}

View File

@@ -1,7 +1,16 @@
using System;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Events;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Godot.Nodes;
using Gamesmiths.Forge.Tags;
using Godot;
using Movementtests.interfaces;
using Movementtests.scenes.enemies;
using Movementtests.scenes.player_controller.scripts;
using Movementtests.systems;
using Movementtests.tools;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_beetle.png")]
public partial class Enemy : CharacterBody3D,
@@ -13,7 +22,8 @@ public partial class Enemy : CharacterBody3D,
ISpawnable,
IKnockbackable,
ITargetable,
IStunnable
IStunnable,
IForgeEntity
{
// Signals and events
public event Action<IDamageable, DamageRecord> DamageTaken = null!;
@@ -55,10 +65,38 @@ public partial class Enemy : CharacterBody3D,
set => CHealth.CurrentHealth = value;
}
// Perfectly forward the IForgeEntity interface to the ForgeEntity component
public EntityAttributes Attributes
{
get => _forgeEntity.Attributes;
set => _forgeEntity.Attributes = value;
}
public EntityTags Tags
{
get => _forgeEntity.Tags;
set => _forgeEntity.Tags = value;
}
public EffectsManager EffectsManager
{
get => _forgeEntity.EffectsManager;
set => _forgeEntity.EffectsManager = value;
}
public EntityAbilities Abilities
{
get => _forgeEntity.Abilities;
set => _forgeEntity.Abilities = value;
}
public EventManager Events
{
get => _forgeEntity.Events;
set => _forgeEntity.Events = value;
}
// Private stuff
private Area3D _damageBox = null!;
internal Node3D _target = null!;
private Healthbar _healthbar = null!;
private ForgeEntity _forgeEntity;
public override void _Ready()
{
@@ -70,6 +108,7 @@ public partial class Enemy : CharacterBody3D,
{
_damageBox = GetNode<Area3D>("DamageBox");
_target = GetNode<Node3D>("CTarget");
_forgeEntity = GetNode<ForgeEntity>("ForgeEntity");
CDamageable = (GetNode<Node>("CDamageable") as IDamageable)!;
CMovement = (GetNode<Node>("CMovement") as IMoveable)!;

View File

@@ -0,0 +1,16 @@
using Gamesmiths.Forge.Attributes;
namespace Movementtests.scenes.enemies;
public class EnemyAttributeSet : AttributeSet
{
public EntityAttribute Health { get; }
public EntityAttribute Strength { get; }
public EntityAttribute Speed { get; }
public EnemyAttributeSet()
{
Health = InitializeAttribute(nameof(Health), 100, 0, 150);
Strength = InitializeAttribute(nameof(Strength), 10, 0, 99);
Speed = InitializeAttribute(nameof(Speed), 5, 0, 10);
}
}

View File

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

View File

@@ -6,14 +6,34 @@
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="2_on7rt"]
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="4_dejyg"]
[ext_resource type="Script" uid="uid://bjwrpv3jpsc1e" path="res://scenes/components/health/CHealth.cs" id="4_ys4jv"]
[ext_resource type="Script" uid="uid://8uj04dfe8oql" path="res://addons/forge/nodes/ForgeEntity.cs" id="6_wxisp"]
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="7_2digf"]
[ext_resource type="PackedScene" uid="uid://dmw5ibwrb483f" path="res://scenes/components/movement/CFlyingMovement.tscn" id="7_vaeds"]
[ext_resource type="PackedScene" uid="uid://bwx2um43k0ou4" path="res://scenes/components/health/CHealthbar.tscn" id="7_ykkxn"]
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="8_46wn3"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="8_on7rt"]
[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/components/damage/CDamageable.cs" id="8_uotso"]
[ext_resource type="PackedScene" uid="uid://bctpe34ddamg5" path="res://scenes/components/knockback/CKnockback.tscn" id="10_dejyg"]
[ext_resource type="Resource" uid="uid://dt7a1io5o0b8s" path="res://scenes/enemies/flying_enemy/flying_enemy_knockback.tres" id="11_mpa2u"]
[sub_resource type="ViewportTexture" id="ViewportTexture_ykkxn"]
[sub_resource type="Resource" id="Resource_oj1ws"]
script = ExtResource("8_46wn3")
Default = 50
Max = 100
[sub_resource type="Resource" id="Resource_yk4hc"]
script = ExtResource("8_46wn3")
Default = 1
Min = 1
Max = 100
[sub_resource type="Resource" id="Resource_wxisp"]
script = ExtResource("8_46wn3")
Default = 2
Min = 1
Max = 100
[sub_resource type="ViewportTexture" id="ViewportTexture_hf6k8"]
viewport_path = NodePath("SubViewport")
[sub_resource type="Resource" id="Resource_jnv07"]
@@ -62,6 +82,20 @@ RDamage = ExtResource("2_on7rt")
RKnockback = ExtResource("11_mpa2u")
RMovement = ExtResource("4_dejyg")
[node name="ForgeEntity" type="Node" parent="." unique_id=622209781]
script = ExtResource("6_wxisp")
metadata/_custom_type_script = "uid://8uj04dfe8oql"
[node name="ForgeAttributeSet" type="Node" parent="ForgeEntity" unique_id=1840910245]
script = ExtResource("7_2digf")
AttributeSetClass = "EnemyAttributeSet"
InitialAttributeValues = Dictionary[String, ExtResource("8_46wn3")]({
"Health": SubResource("Resource_oj1ws"),
"Speed": SubResource("Resource_wxisp"),
"Strength": SubResource("Resource_yk4hc")
})
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
[node name="CHealth" type="Node" parent="." unique_id=1717035166]
script = ExtResource("4_ys4jv")
RHealth = ExtResource("2_ma2bq")
@@ -69,7 +103,7 @@ metadata/_custom_type_script = "uid://bjwrpv3jpsc1e"
[node name="CHealthBar" parent="." unique_id=1635725931 instance=ExtResource("7_ykkxn")]
transform = Transform3D(0.3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.70000005, 0)
texture = SubResource("ViewportTexture_ykkxn")
texture = SubResource("ViewportTexture_hf6k8")
[node name="CDamageable" type="Node" parent="." unique_id=1785297232]
script = ExtResource("8_uotso")

View File

@@ -6,14 +6,34 @@
[ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://scenes/components/damage/RDamageModifier.cs" id="2_r3cnf"]
[ext_resource type="Resource" uid="uid://bohbojc68j7y1" path="res://scenes/enemies/grounded_enemy/grounded_enemy_health.tres" id="2_w4lm8"]
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="4_na24f"]
[ext_resource type="Script" uid="uid://8uj04dfe8oql" path="res://addons/forge/nodes/ForgeEntity.cs" id="6_x50ya"]
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="6_yk4hc"]
[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/components/damage/CDamageable.cs" id="7_1tw73"]
[ext_resource type="PackedScene" uid="uid://bwx2um43k0ou4" path="res://scenes/components/health/CHealthbar.tscn" id="7_18xwy"]
[ext_resource type="PackedScene" uid="uid://dbr7ioio158ew" path="res://scenes/components/movement/CGroundedMovement.tscn" id="7_qyswd"]
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="7_x50ya"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="8_6d4gl"]
[ext_resource type="PackedScene" uid="uid://bctpe34ddamg5" path="res://scenes/components/knockback/CKnockback.tscn" id="10_jqqi6"]
[ext_resource type="Resource" uid="uid://cektf6waf4s04" path="res://scenes/enemies/grounded_enemy/grounded_enemy_knockback.tres" id="11_8k3xb"]
[sub_resource type="ViewportTexture" id="ViewportTexture_18xwy"]
[sub_resource type="Resource" id="Resource_f22p3"]
script = ExtResource("7_x50ya")
Default = 100
Max = 100
[sub_resource type="Resource" id="Resource_yk4hc"]
script = ExtResource("7_x50ya")
Default = 1
Min = 1
Max = 100
[sub_resource type="Resource" id="Resource_x50ya"]
script = ExtResource("7_x50ya")
Default = 1
Min = 1
Max = 100
[sub_resource type="ViewportTexture" id="ViewportTexture_0mf3g"]
viewport_path = NodePath("SubViewport")
[sub_resource type="Resource" id="Resource_qj0ob"]
@@ -62,6 +82,20 @@ RDamage = ExtResource("2_bn56u")
RKnockback = ExtResource("11_8k3xb")
RMovement = ExtResource("4_na24f")
[node name="ForgeEntity" type="Node" parent="." unique_id=432521027]
script = ExtResource("6_x50ya")
metadata/_custom_type_script = "uid://8uj04dfe8oql"
[node name="ForgeAttributeSet" type="Node" parent="ForgeEntity" unique_id=804252284]
script = ExtResource("6_yk4hc")
AttributeSetClass = "EnemyAttributeSet"
InitialAttributeValues = Dictionary[String, ExtResource("7_x50ya")]({
"Health": SubResource("Resource_f22p3"),
"Speed": SubResource("Resource_x50ya"),
"Strength": SubResource("Resource_yk4hc")
})
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
[node name="CHealth" type="Node" parent="." unique_id=188153645]
script = ExtResource("2_gsmti")
RHealth = ExtResource("2_w4lm8")
@@ -69,7 +103,7 @@ metadata/_custom_type_script = "uid://bjwrpv3jpsc1e"
[node name="CHealthBar" parent="." unique_id=1278247727 instance=ExtResource("7_18xwy")]
transform = Transform3D(0.4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.2, 0)
texture = SubResource("ViewportTexture_18xwy")
texture = SubResource("ViewportTexture_0mf3g")
[node name="CDamageable" type="Node" parent="." unique_id=1601518000]
script = ExtResource("7_1tw73")

View File

@@ -9,12 +9,14 @@
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="4_abfq8"]
[ext_resource type="Resource" uid="uid://bjyd801wvverk" path="res://scenes/player_controller/resources/player_health.tres" id="4_m8gvy"]
[ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://inputs/base_mode/rotate_y.tres" id="4_rxwoh"]
[ext_resource type="Resource" uid="uid://dh437cuxgjv6b" path="res://scenes/player_controller/resources/forge/mana_regeneration.tres" id="5_2rkt1"]
[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"]
[ext_resource type="PackedScene" uid="uid://hpsg4fqwrx1u" path="res://scenes/components/damage/CDamageable.tscn" id="5_jb43f"]
[ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://inputs/base_mode/move_left.tres" id="5_q14ux"]
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="5_ue7xq"]
[ext_resource type="Resource" uid="uid://dyru7mxo121w6" path="res://scenes/player_controller/resources/player_normal_damage_mod.tres" id="6_cmijs"]
[ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://inputs/base_mode/move_right.tres" id="6_q7bng"]
[ext_resource type="Resource" uid="uid://cffil4tic3ysg" path="res://scenes/player_controller/resources/forge/inhibit_mana_regen_temporarily.tres" id="6_u8yay"]
[ext_resource type="Script" uid="uid://cwbvxlfvmocc1" path="res://scenes/player_controller/scripts/StairsSystem.cs" id="7_bmt5a"]
[ext_resource type="Resource" uid="uid://brswsknpgwal2" path="res://inputs/base_mode/move_front.tres" id="7_m8gvy"]
[ext_resource type="PackedScene" uid="uid://bctpe34ddamg5" path="res://scenes/components/knockback/CKnockback.tscn" id="7_x835q"]
@@ -25,9 +27,13 @@
[ext_resource type="PackedScene" uid="uid://wq1okogkhc5l" path="res://scenes/player_controller/components/mantle/mantle_system.tscn" id="8_qu4wy"]
[ext_resource type="AudioStream" uid="uid://clfggn87oeg1s" path="res://scenes/player_controller/audio/InteractiveSFX.tres" id="9_jb43f"]
[ext_resource type="Resource" uid="uid://bebstkm608wxx" path="res://inputs/base_mode/aim_pressed.tres" id="9_nob5r"]
[ext_resource type="Resource" uid="uid://dccuj66egxfwh" path="res://scenes/player_controller/resources/forge/empowered_action.tres" id="10_2rkt1"]
[ext_resource type="Resource" uid="uid://bdit2jy5gbpts" path="res://inputs/base_mode/jump.tres" id="10_4u7i3"]
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="10_pw5r7"]
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="11_2rkt1"]
[ext_resource type="Resource" uid="uid://b5gx3q8nvu72e" path="res://inputs/base_mode/hit.tres" id="11_cresl"]
[ext_resource type="PackedScene" uid="uid://0ysqmqphq6mq" path="res://scenes/player_controller/components/head/head_system.tscn" id="11_rxwoh"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="11_u8yay"]
[ext_resource type="Resource" uid="uid://d2r0ur8k3cuu3" path="res://inputs/base_mode/dash.tres" id="12_34snm"]
[ext_resource type="Resource" uid="uid://55b0dsvioj08" path="res://inputs/base_mode/jump_pressed.tres" id="13_nob5r"]
[ext_resource type="Shape3D" uid="uid://keseacdcooot" path="res://scenes/player_controller/resources/PlayerShape.tres" id="13_r7i3q"]
@@ -53,6 +59,11 @@
[ext_resource type="Texture2D" uid="uid://c40orhfdgsim" path="res://assets/ui/IconGodotNode/white/icon_circle.png" id="45_u8rdp"]
[ext_resource type="PackedScene" uid="uid://cyw8p0p6a78tl" path="res://scenes/ui/healthbar/healthbar.tscn" id="47_76kmc"]
[sub_resource type="Resource" id="Resource_5gbhg"]
script = ExtResource("11_u8yay")
Tag = "events.player.empowered_action_used"
metadata/_custom_type_script = "uid://dpakv7agvir6y"
[sub_resource type="Resource" id="Resource_cb2lu"]
script = ExtResource("2_x835q")
DamageDealt = 10.0
@@ -68,6 +79,28 @@ script = ExtResource("4_abfq8")
StartingHealth = 10.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_u8yay"]
script = ExtResource("11_2rkt1")
Default = 100
Max = 100
[sub_resource type="Resource" id="Resource_uqalc"]
script = ExtResource("11_2rkt1")
Default = 100
Max = 100
[sub_resource type="Resource" id="Resource_cn5a8"]
script = ExtResource("11_2rkt1")
Default = 1
Min = 1
Max = 100
[sub_resource type="Resource" id="Resource_b0xmb"]
script = ExtResource("11_2rkt1")
Default = 1
Min = 1
Max = 100
[sub_resource type="CapsuleMesh" id="CapsuleMesh_xc2g5"]
height = 1.7
@@ -109,9 +142,16 @@ radius = 1.5
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_2q0ik"]
blend_mode = 1
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n24vh"]
bg_color = Color(0.15869555, 0.64034444, 0.906125, 1)
[node name="Player" type="CharacterBody3D" unique_id=709076448]
collision_mask = 272
script = ExtResource("1_poq2x")
EmpoweredActionUsed = SubResource("Resource_5gbhg")
EmpoweredActionAbility = ExtResource("10_2rkt1")
DefaultPermanentEffects = [ExtResource("5_2rkt1")]
EmpoweredActionEffects = [ExtResource("6_u8yay")]
AimAssistStrength = 0.3
AimAssistReductionWhenCloseToTarget = 0.1
AimAssistReductionStartDistance = 8.0
@@ -163,6 +203,17 @@ MinimumWallRunHorizontalSpeed = 8.0
WallRunAltitudeLossSpeed = 8.0
WallRunSpeedThreshold = 1.0
[node name="PlayerAttributeSet" type="Node" parent="." unique_id=421846088]
script = ExtResource("10_pw5r7")
AttributeSetClass = "PlayerAttributeSet"
InitialAttributeValues = Dictionary[String, ExtResource("11_2rkt1")]({
"Health": SubResource("Resource_u8yay"),
"Mana": SubResource("Resource_uqalc"),
"Speed": SubResource("Resource_cn5a8"),
"Strength": SubResource("Resource_b0xmb")
})
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
[node name="CHealth" parent="." unique_id=1244478698 instance=ExtResource("3_q7bng")]
RHealth = ExtResource("4_m8gvy")
@@ -223,12 +274,10 @@ debug_color = Color(0, 0.6, 0.701961, 0.341176)
[node name="HeadSystem" parent="." unique_id=1203743757 instance=ExtResource("11_rxwoh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0)
LookSensitivity = 0.16
CameraInclineAcceleration = 20.0
GroundedCameraIncline = 3.0
SlidingJitterAmplitude = 0.2
WeaponSway = 8.0
WeaponLookRotation = 10.0
WeaponAdjustmentSpeed = 1.0
[node name="MantleSystem" parent="HeadSystem" unique_id=98905505 instance=ExtResource("8_qu4wy")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.6, 0)
@@ -551,6 +600,22 @@ offset_bottom = -71.99939
grow_horizontal = 2
grow_vertical = 0
[node name="Manabar" parent="UI" unique_id=1713862004 instance=ExtResource("47_76kmc")]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -859.0
offset_top = -84.0
offset_right = -347.0
offset_bottom = -72.0
grow_horizontal = 2
grow_vertical = 0
BarStyle = SubResource("StyleBoxFlat_n24vh")
[node name="StateChart" type="Node" parent="." unique_id=1675830632]
script = ExtResource("25_wv70j")
metadata/_custom_type_script = "uid://couw105c3bde4"

View File

@@ -1,13 +1,19 @@
using Godot;
using System;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Cues;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Tags;
using Movementtests.interfaces;
using Movementtests.tools;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_text_panel.png")]
public partial class PlayerUi : Control
public partial class PlayerUi : Control, ICueHandler
{
internal TextureRect[] _dashIcons = new TextureRect[3];
private TextureRect _enemyTarget;
private Healthbar _healthbar;
internal TextureRect[] DashIcons = new TextureRect[3];
private TextureRect _enemyTarget = null!;
private Healthbar _healthbar = null!;
private Healthbar _manabar = null!;
public enum TargetState
{
@@ -25,17 +31,23 @@ public partial class PlayerUi : Control
public override void _Ready()
{
_dashIcons[0] = GetNode<TextureRect>("%Dash1");
_dashIcons[1] = GetNode<TextureRect>("%Dash2");
_dashIcons[2] = GetNode<TextureRect>("%Dash3");
DashIcons[0] = GetNode<TextureRect>("%Dash1");
DashIcons[1] = GetNode<TextureRect>("%Dash2");
DashIcons[2] = GetNode<TextureRect>("%Dash3");
_enemyTarget = GetNode<TextureRect>("%EnemyTarget");
_healthbar = GetNode<Healthbar>("%Healthbar");
_manabar = GetNode<Healthbar>("%Manabar");
var tagsManager = ForgeManagers.Instance.TagsManager;
var cuesManager = ForgeManagers.Instance.CuesManager;
cuesManager.RegisterCue(Tag.RequestTag(tagsManager, "cues.resources.mana"), this);
}
public void Initialize(float initialHealth)
public void Initialize(float initialHealth, float initialMana)
{
_healthbar.Initialize(initialHealth);
_manabar.Initialize(initialMana);
}
public void SetEnemyTargetProperties(TargetProperties targetProperties)
@@ -59,7 +71,7 @@ public partial class PlayerUi : Control
public void SetNumberOfDashesLeft(int numberOfDashes)
{
int index = 1;
foreach (var dashIcon in _dashIcons)
foreach (var dashIcon in DashIcons)
{
dashIcon.SetVisible(index <= numberOfDashes);
index++;
@@ -70,4 +82,29 @@ public partial class PlayerUi : Control
{
_healthbar.CurrentHealth = healthChanged.CurrentHealth;
}
public void OnManaChanged(float newValue)
{
_manabar.CurrentHealth = newValue;
}
public void OnExecute(IForgeEntity? target, CueParameters? parameters)
{
if (target == null || !parameters.HasValue || !IsInstanceValid(_manabar)) return;
float magnitude = parameters.Value.Magnitude;
_manabar.CurrentHealth += magnitude;
}
public void OnApply(IForgeEntity? target, CueParameters? parameters)
{
}
public void OnRemove(IForgeEntity? target, bool interrupted)
{
}
public void OnUpdate(IForgeEntity? target, CueParameters? parameters)
{
}
}

View File

@@ -19,28 +19,26 @@ public partial class DashSystem: Node3D
public Vector3 TargetLocation { get; set; }
public Vector3 CollisionPoint { get; set; }
public Vector3 CollisionNormal { get; set; }
public GodotObject CollidedObject { get; set; }
public GodotObject? CollidedObject { get; set; }
public Vector3 PlannedLocation { get; set; }
public bool ShouldMantle { get; set; }
public Vector3 PlannedMantleLocation { get; set; }
public MantleSystem MantleSystem { get; set; }
public MantleSystem MantleSystem { get; set; } = null!;
internal HeadSystem _head;
public ShapeCast3D DashCast3D;
internal Camera3D _camera;
internal Vector3 _dashDirection = Vector3.Zero;
internal HeadSystem Head = null!;
public ShapeCast3D DashCast3D = null!;
internal Camera3D Camera = null!;
internal Vector3 DashDirection = Vector3.Zero;
internal ShapeCast3D _dashCastDrop;
internal MeshInstance3D _dashDropIndicator;
internal MeshInstance3D _dashDropLocationIndicator;
internal ShapeCast3D DashCastDrop = null!;
internal MeshInstance3D DashDropIndicator = null!;
internal MeshInstance3D DashDropLocationIndicator = null!;
internal MeshInstance3D DashTarget = null!;
internal CpuParticles3D DashIndicator = null!;
internal AnimationPlayer DashIndicatorAnim = null!;
internal MeshInstance3D _dashTarget;
internal CpuParticles3D _dashIndicator;
internal AnimationPlayer _dashIndicatorAnim;
[Export]
public PackedScene DashIndicatorScene { get; set; }
[Export] public PackedScene DashIndicatorScene { get; set; } = null!;
[Signal]
public delegate void DashStartedEventHandler();
@@ -59,22 +57,22 @@ public partial class DashSystem: Node3D
var dashShape = DashCast3D.GetShape() as SphereShape3D;
DashCastRadius = dashShape!.Radius;
_dashCastDrop = GetNode<ShapeCast3D>("DashCastDrop");
_dashDropIndicator = GetNode<MeshInstance3D>("DashDropIndicator");
_dashDropIndicator.Visible = false;
_dashDropLocationIndicator = GetNode<MeshInstance3D>("DashDropLocationIndicator");
_dashDropLocationIndicator.Visible = false;
DashCastDrop = GetNode<ShapeCast3D>("DashCastDrop");
DashDropIndicator = GetNode<MeshInstance3D>("DashDropIndicator");
DashDropIndicator.Visible = false;
DashDropLocationIndicator = GetNode<MeshInstance3D>("DashDropLocationIndicator");
DashDropLocationIndicator.Visible = false;
_head = head;
_camera = camera;
Head = head;
Camera = camera;
MantleSystem = GetNode<MantleSystem>("MantleSystem");
MantleSystem.Init();
_dashTarget = GetNode<MeshInstance3D>("DashTarget");
_dashTarget.SetVisible(false);
_dashIndicator = GetNode<CpuParticles3D>("DashIndicator");
_dashIndicatorAnim = GetNode<AnimationPlayer>("DashIndicator/AnimationPlayer");
DashTarget = GetNode<MeshInstance3D>("DashTarget");
DashTarget.SetVisible(false);
DashIndicator = GetNode<CpuParticles3D>("DashIndicator");
DashIndicatorAnim = GetNode<AnimationPlayer>("DashIndicator/AnimationPlayer");
}
internal DashLocation ComputeDashLocation()
@@ -98,13 +96,13 @@ public partial class DashSystem: Node3D
public void PrepareDash()
{
DashCast3D.SetRotation(_head.GetGlobalLookRotation());
DashCast3D.SetRotation(Head.GetGlobalLookRotation());
(HasHit, PlannedLocation, CollisionPoint, CollisionNormal, CollidedObject) = ComputeDashLocation();
CanDashThroughTarget = false;
if (CollidedObject is ITargetable targetable)
if (CollidedObject is ITargetable)
{
_dashTarget.SetVisible(false);
DashTarget.SetVisible(false);
CanDashThroughTarget = true;
return;
}
@@ -112,7 +110,7 @@ public partial class DashSystem: Node3D
MantleSystem.SetGlobalPosition(PlannedLocation);
MantleSystem.SetRotation(new Vector3(
MantleSystem.Rotation.X,
_head.Rotation.Y,
Head.Rotation.Y,
MantleSystem.Rotation.Z));
MantleSystem.ProcessMantle(false);
ShouldMantle = MantleSystem.IsMantlePossible;
@@ -120,41 +118,18 @@ public partial class DashSystem: Node3D
// Setup dash target
var targetColor = HasHit ? new Color(1f, 0.2f, 0.2f) : new Color(1f, 1f, 1f);
targetColor = ShouldMantle ? new Color(0.2f, 0.2f, 1f) : targetColor;
var targetMaterial = (StandardMaterial3D) _dashTarget.GetSurfaceOverrideMaterial(0);
var targetMaterial = (StandardMaterial3D) DashTarget.GetSurfaceOverrideMaterial(0);
targetMaterial.SetAlbedo(targetColor);
_dashTarget.SetVisible(true);
DashTarget.SetVisible(true);
var targetLocation = ShouldMantle ? MantleSystem.FirstMantleProfilePoint : PlannedLocation;
_dashTarget.SetGlobalPosition(targetLocation);
return;
var shouldShowDropIndicator = !HasHit && !ShouldMantle;
_dashDropIndicator.SetVisible(shouldShowDropIndicator);
_dashDropLocationIndicator.SetVisible(shouldShowDropIndicator);
if (shouldShowDropIndicator)
{
_dashCastDrop.GlobalPosition = targetLocation; // Place drop indication cast at dash location
var startDropLocation = targetLocation; // Start of the drop is the dash target location
// End of the drop is either max cast distance or first collision
var hasDropLocationHit = _dashCastDrop.IsColliding();
var endDropLocation = hasDropLocationHit ? _dashCastDrop.GetCollisionPoint(0) : _dashCastDrop.ToGlobal(DashCast3D.TargetPosition);
// Only show drop location indicator if drop cast has hit
_dashDropLocationIndicator.SetVisible(hasDropLocationHit);
_dashDropLocationIndicator.SetGlobalPosition(endDropLocation);
var dropLength = (endDropLocation - startDropLocation).Length();
var dropDirection = (endDropLocation - startDropLocation).Normalized();
_dashDropIndicator.SetScale(new Vector3(1, dropLength, 1));
_dashDropIndicator.SetGlobalPosition(startDropLocation + dropDirection * dropLength * 0.5f);
}
DashTarget.SetGlobalPosition(targetLocation);
}
public void StopPreparingDash()
{
CanDashThroughTarget = false;
_dashTarget.SetVisible(false);
_dashDropIndicator.SetVisible(false);
_dashDropLocationIndicator.SetVisible(false);
DashTarget.SetVisible(false);
DashDropIndicator.SetVisible(false);
DashDropLocationIndicator.SetVisible(false);
}
}

View File

@@ -39,12 +39,12 @@ public partial class HeadSystem : Node3D
float BobbingMultiplier,
float FovMultiplier);
internal Camera3D _camera;
internal Marker3D _cameraAnchor;
internal AnimationPlayer _animationPlayer;
internal AnimationTree _animationTree;
internal Camera3D Camera = null!;
internal Node3D CameraAnchor = null!;
internal AnimationPlayer AnimationPlayer = null!;
internal AnimationTree AnimationTree = null!;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
public float LookSensitivity { get; set; } = 1f;
[ExportGroup("Camera incline")]
@@ -84,78 +84,75 @@ public partial class HeadSystem : Node3D
public float FovMaxedOutSpeed { get; set; } = 20f;
[ExportGroup("First Person rig")]
internal Node3D _fpRig;
internal Node3D _rightHandedWeapon;
internal Node3D _leftHandedWeapon;
internal Node3D _fpDisplacedRig;
internal Vector3 _fpDisplacedRigInitialRotation;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float WeaponSway { get; set; } = 5f;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float WeaponLookRotation { get; set; } = 1f;
internal Node3D FpRig = null!;
internal Node3D RightHandedWeapon = null!;
internal Vector3 RightHandedWeaponInitialRotation = Vector3.Zero;
internal Node3D LeftHandedWeapon = null!;
internal Vector3 LeftHandedWeaponInitialRotation = Vector3.Zero;
[Export(PropertyHint.Range, "0,20,1,or_greater")]
public float WeaponSway { get; set; } = 15f;
[Export(PropertyHint.Range, "0,200,1,or_greater")]
public float WeaponMoveRotation { get; set; } = 80f;
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public float WeaponAdjustmentSpeed { get; set; } = 10f;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float DisplacedWeaponSway { get; set; } = 5f;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float DisplacedWeaponLookRotation { get; set; } = 1f;
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
[Export(PropertyHint.Range, "0,20,1,or_greater")]
public float WeaponAdjustmentSpeed { get; set; } = 1f;
[Export(PropertyHint.Range, "0,2,0.01,or_greater")]
public float DisplacedWeaponSway { get; set; } = 0.8f;
[Export(PropertyHint.Range, "0,0.5,0.01,or_greater")]
public float DisplacedWeaponMoveRotation { get; set; } = 0.1f;
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public float DisplacedWeaponAdjustmentSpeed { get; set; } = 10f;
[Export(PropertyHint.Range, "0,20,1,or_greater")]
public float DisplacedWeaponAdjustmentSpeed { get; set; } = 12f;
public void Init()
{
_isPlayingForcingAnim = false;
IsPlayingForcingAnim = false;
Input.SetMouseMode(Input.MouseModeEnum.Captured);
_camera = GetNode<Camera3D>("CameraSmooth/Camera3D");
_cameraAnchor = GetNode<Marker3D>("CameraAnchor");
_animationPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
_animationTree = GetNode<AnimationTree>("AnimationTree");
_fpRig = GetNode<Node3D>("FPRig");
_rightHandedWeapon = GetNode<Node3D>("FPRig/Sword");
_leftHandedWeapon = GetNode<Node3D>("FPRig/Parry");
_fpDisplacedRig = GetNode<Node3D>("FPRig/Sword");
_fpDisplacedRigInitialRotation = _fpDisplacedRig.Rotation;
Camera = GetNode<Camera3D>("CameraSmooth/Camera3D");
CameraAnchor = GetNode<Node3D>("CameraSmooth/CameraAnchor");
//_cameraAnchor = GetNode<Camera3D>("CameraSmooth/Camera3D");
AnimationPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
AnimationTree = GetNode<AnimationTree>("AnimationTree");
FpRig = GetNode<Node3D>("FPRig");
RightHandedWeapon = GetNode<Node3D>("FPRig/Sword/SwordMesh");
RightHandedWeaponInitialRotation = RightHandedWeapon.Rotation;
LeftHandedWeapon = GetNode<Node3D>("FPRig/Parry/ParryMesh");
LeftHandedWeaponInitialRotation = LeftHandedWeapon.Rotation;
_slidingNoise.NoiseType = FastNoiseLite.NoiseTypeEnum.Perlin;
_slidingNoise.SetFrequency(SlidingJitterFrequency);
}
public void SetWeaponsVisible(bool swordVisible, bool parryVisible)
{
_rightHandedWeapon.Visible = swordVisible;
_leftHandedWeapon.Visible = parryVisible;
RightHandedWeapon.Visible = swordVisible;
LeftHandedWeapon.Visible = parryVisible;
}
public void OnMantle()
{
_animationTree.Set("parameters/OnMantle/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
AnimationTree.Set("parameters/OnMantle/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
}
public void OnJumpStarted()
{
_animationTree.Set("parameters/OnJumpStart/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
AnimationTree.Set("parameters/OnJumpStart/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
}
public void OnJumpEnded()
{
_animationTree.Set("parameters/OnJumpEnd/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
AnimationTree.Set("parameters/OnJumpEnd/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
}
public void OnHit()
{
_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);
AnimationTree.Set("parameters/OnParry/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
}
public void OnStartDeathAnimation()
{
_isPlayingForcingAnim = true;
_animationTree.Set("parameters/OnDie/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
IsPlayingForcingAnim = true;
AnimationTree.Set("parameters/OnDie/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
}
public void OnDeathAnimationFinished()
@@ -190,8 +187,8 @@ public partial class HeadSystem : Node3D
EmitSignalHitboxDeactivated();
}
internal bool _footstepEmitted;
internal bool _isPlayingForcingAnim;
internal bool FootstepEmitted;
internal bool IsPlayingForcingAnim;
public void ResetHeadBobbing()
{
@@ -200,10 +197,10 @@ public partial class HeadSystem : Node3D
public void LookAround(CameraParameters inputs)
{
if (_isPlayingForcingAnim)
if (IsPlayingForcingAnim)
{
_camera.Position = Vector3.Zero;
_camera.Rotation = Vector3.Zero;
Camera.Position = Vector3.Zero;
Camera.Rotation = Vector3.Zero;
return;
}
@@ -223,7 +220,7 @@ public partial class HeadSystem : Node3D
RotateY(angleForHorizontalRotation);
// Vertical movement of head
Vector3 currentCameraRotation = _cameraAnchor.Rotation;
Vector3 currentCameraRotation = CameraAnchor.Rotation;
currentCameraRotation.X += Convert.ToSingle(lookDir.Y * LookSensitivity * sensitivitMultiplier);
currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f));
@@ -242,18 +239,18 @@ public partial class HeadSystem : Node3D
cameraIncline = Mathf.DegToRad(GroundedCameraIncline * cameraInclineFactor * -1.0f);
}
currentCameraRotation.Z = (float) Mathf.Lerp(currentCameraRotation.Z, cameraIncline, delta * CameraInclineAcceleration);
_cameraAnchor.Rotation = currentCameraRotation;
CameraAnchor.Rotation = currentCameraRotation;
if (withCameraJitter)
{
_cameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset;
CameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset;
float noise1D = _slidingNoise.GetNoise1D(Time.GetTicksMsec());
float noiseAmplitude = SlidingJitterAmplitude*Mathf.Clamp(playerVelocity.Length(), 0f, 1f);
_cameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude;
CameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude;
}
else
{
_cameraAnchor.Position = Vector3.Zero;
CameraAnchor.Position = Vector3.Zero;
}
Vector3 newPositionForCamera = Vector3.Zero;
@@ -268,76 +265,79 @@ public partial class HeadSystem : Node3D
newPositionForCamera.Y = Mathf.Sin(_bobbingAccumulator * BobbingFrequency) * BobbingAmplitude * bobbingMultiplier;
newPositionForCamera.X = Mathf.Cos(_bobbingAccumulator * BobbingFrequency / 2.0f) * BobbingAmplitude * bobbingMultiplier;
if (newPositionForCamera.Y < -0.07 && !_footstepEmitted) Footstep();
if (newPositionForCamera.Y > 0) _footstepEmitted = false;
if (newPositionForCamera.Y < -0.07 * bobbingMultiplier && !FootstepEmitted) Footstep();
if (newPositionForCamera.Y > 0) FootstepEmitted = false;
// Offset bobbing for weapon rig
newPositionForRig.Y = Mathf.Cos(_bobbingAccumulator * BobbingFrequency) * BobbingAmplitude * bobbingMultiplier * 0.2f;
newPositionForRig.X = Mathf.Sin(_bobbingAccumulator * BobbingFrequency / 2.0f) * BobbingAmplitude * bobbingMultiplier * 0.2f;
}
_cameraAnchor.Position += newPositionForCamera;
_camera.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated();
CameraAnchor.Position += newPositionForCamera;
Camera.GlobalTransform = CameraAnchor.GetGlobalTransformInterpolated();
// First person rig adjustments
_fpRig.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated();
FpRig.GlobalTransform = Camera.GlobalTransform;
// Apply bobbing
_fpRig.Position += newPositionForRig;
FpRig.Position += newPositionForRig;
// Rotate the whole rig based on movement input
var newRigRotation = _fpRig.Rotation;
var camTilt = Mathf.Lerp(_fpRig.Rotation.Z, cameraIncline*WeaponMoveRotation, delta*WeaponAdjustmentSpeed);
var newRigRotation = FpRig.Rotation;
var camTilt = Mathf.Lerp(FpRig.Rotation.Z, CameraAnchor.Rotation.Z*WeaponMoveRotation, delta * WeaponAdjustmentSpeed);
newRigRotation.Z = (float) camTilt;
// Rotate the whole rig based on camera rotation input
newRigRotation.X = Mathf.Lerp(newRigRotation.X, -lookDir.Y*WeaponSway, (float) delta*WeaponAdjustmentSpeed);
newRigRotation.Y = Mathf.Lerp(newRigRotation.Y, -lookDir.X*WeaponSway, (float) delta*WeaponAdjustmentSpeed);
newRigRotation.X = Mathf.Lerp(newRigRotation.X, -lookDir.Y*WeaponSway, (float) delta * WeaponAdjustmentSpeed);
newRigRotation.Y = Mathf.Lerp(newRigRotation.Y, -lookDir.X*WeaponSway, (float) delta * WeaponAdjustmentSpeed);
// Apply
_fpRig.Rotation = newRigRotation;
FpRig.Rotation = newRigRotation;
// Compute displaced rig adjustments, starting with movement input
var newDisplacedRigRotation = _fpDisplacedRig.Rotation;
var howMuchForward = ComputeHowMuchInputForward(playerInput);
var howMuchSideways = ComputeHowMuchInputSideways(playerInput);
var displacedCamTiltForward = Mathf.Lerp(newDisplacedRigRotation.Z,
_fpDisplacedRigInitialRotation.Z + howMuchForward*DisplacedWeaponMoveRotation,
delta*DisplacedWeaponAdjustmentSpeed);
var displacedCamTiltSide = Mathf.Lerp(newDisplacedRigRotation.X,
_fpDisplacedRigInitialRotation.X - howMuchSideways*DisplacedWeaponMoveRotation,
delta*DisplacedWeaponAdjustmentSpeed);
newDisplacedRigRotation.X = (float) displacedCamTiltSide;
newDisplacedRigRotation.Z = (float) displacedCamTiltForward;
var displacedSwayY = Mathf.Lerp(newDisplacedRigRotation.Y,
_fpDisplacedRigInitialRotation.Y - lookDir.X*DisplacedWeaponSway,
delta*DisplacedWeaponAdjustmentSpeed);
newDisplacedRigRotation.Y = (float) displacedSwayY;
// Apply
_fpDisplacedRig.Rotation = newDisplacedRigRotation;
// Compute sword meshes procedural adjustments
RightHandedWeapon.Rotation = ComputeRotationForFpMesh(RightHandedWeapon, RightHandedWeaponInitialRotation, playerInput, lookDir, (float) delta);
LeftHandedWeapon.Rotation = ComputeRotationForFpMesh(LeftHandedWeapon, LeftHandedWeaponInitialRotation, playerInput, lookDir, (float) delta);
// Camera adjustments
float velocityClamped = Mathf.Clamp(playerVelocity.Length(), 0.5f, FovMaxedOutSpeed);
float targetFov = BaseFov + FovChangeFactor * velocityClamped * fovMultiplier;
_camera.Fov = Mathf.Lerp(_camera.Fov, targetFov, (float) delta * FovChangeSpeed);
Camera.Fov = Mathf.Lerp(Camera.Fov, targetFov, (float) delta * FovChangeSpeed);
}
public Vector3 ComputeRotationForFpMesh(Node3D mesh, Vector3 initialRotation, Vector3 playerInput, Vector2 lookDir, float delta)
{
var newMeshRotation = mesh.Rotation;
var howMuchForward = ComputeHowMuchInputForward(playerInput);
var howMuchSideways = ComputeHowMuchInputSideways(playerInput);
var displacedCamTiltForward = Mathf.Lerp(newMeshRotation.Z,
initialRotation.Z + howMuchForward*DisplacedWeaponMoveRotation,
delta * DisplacedWeaponAdjustmentSpeed);
var displacedCamTiltSide = Mathf.Lerp(newMeshRotation.X,
initialRotation.X - howMuchSideways*DisplacedWeaponMoveRotation,
delta * DisplacedWeaponAdjustmentSpeed);
newMeshRotation.X = displacedCamTiltSide;
newMeshRotation.Z = displacedCamTiltForward;
var displacedSwayY = Mathf.Lerp(newMeshRotation.Y,
initialRotation.Y - lookDir.X*DisplacedWeaponSway,
delta * DisplacedWeaponAdjustmentSpeed);
newMeshRotation.Y = displacedSwayY;
return newMeshRotation;
}
public void Footstep()
{
_footstepEmitted = true;
FootstepEmitted = true;
EmitSignalStepFoot();
}
public void HideWeapon()
{
_rightHandedWeapon.Visible = false;
RightHandedWeapon.Visible = false;
}
public void ShowWeapon()
{
_rightHandedWeapon.Visible = true;
RightHandedWeapon.Visible = true;
}
public float ComputeCameraInclineFactor(Vector3 direction)
@@ -368,15 +368,15 @@ public partial class HeadSystem : Node3D
public Vector3 GetGlobalForwardVector()
{
return _camera.GlobalBasis.Z;
return Camera.GlobalBasis.Z;
}
public Vector3 GetGlobalLookRotation()
{
return new Vector3(
_camera.Rotation.X,
Camera.Rotation.X,
Rotation.Y,
_camera.Rotation.Z);
Camera.Rotation.Z);
}
public void SetHeight(float height)

View File

@@ -654,9 +654,6 @@ _data = {
[node name="HeadSystem" type="Node3D" unique_id=2067407038]
script = ExtResource("1_8abgy")
WeaponMoveRotation = 20.0
DisplacedWeaponSway = 1.0
DisplacedWeaponAdjustmentSpeed = 8.0
[node name="FPRig" type="Node3D" parent="." unique_id=922968399]
transform = Transform3D(0.9999998, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000002, 0, 0, 0)
@@ -678,6 +675,9 @@ mesh = ExtResource("3_1ay6d")
[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)
[node name="CameraAnchor" type="Marker3D" parent="CameraSmooth" unique_id=1554357312]
transform = Transform3D(1.0000002, 0.00011616435, 0, -0.000116164374, 1.0000004, 0, 0, 0, 1.0000002, 0, 0, 0)
[node name="Camera3D" type="Camera3D" parent="CameraSmooth" unique_id=544372058]
transform = Transform3D(1, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000001, 0, 0, 0)
current = true
@@ -702,8 +702,6 @@ fade_out = 0.5547845
shakerPreset = SubResource("Resource_se3kf")
metadata/_custom_type_script = "uid://dnlxsrumw6ygp"
[node name="CameraAnchor" type="Marker3D" parent="." unique_id=1554357312]
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1831491746]
root_node = NodePath("../CameraSmooth/Camera3D")
libraries/ = SubResource("AnimationLibrary_0hyrq")

View File

@@ -0,0 +1,13 @@
using Gamesmiths.Forge.Attributes;
namespace Movementtests.scenes.player_controller.components.weapon;
public class WeaponAttributeSet : AttributeSet
{
public EntityAttribute Level { get; }
public WeaponAttributeSet()
{
Level = InitializeAttribute(nameof(Level), 1, 1, 10);
}
}

View File

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

View File

@@ -1,13 +1,35 @@
using System;
using System.Collections.Generic;
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Attributes;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Components;
using Gamesmiths.Forge.Effects.Duration;
using Gamesmiths.Forge.Effects.Magnitudes;
using Gamesmiths.Forge.Effects.Periodic;
using Gamesmiths.Forge.Events;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Godot.Nodes;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Gamesmiths.Forge.Tags;
using Godot;
using GodotStateCharts;
using Movementtests.addons.godot_state_charts.csharp;
using Movementtests.forge.abilities;
using Movementtests.interfaces;
using Movementtests.scenes.player_controller.components.weapon;
using Movementtests.systems.damage;
using Movementtests.tools;
using Movementtests.tools.calculators;
namespace Movementtests.systems;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_sword.png")]
public partial class WeaponSystem : RigidBody3D, IDamageDealer
public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
{
[Signal]
public delegate void WeaponThrownEventHandler();
@@ -15,6 +37,11 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
[Signal]
public delegate void WeaponRetrievedEventHandler();
[Export]
public ForgeTagContainer BaseTags { get; set; } = new();
[Export] public ForgeAbilityData[] WeaponAbilities { get; set; } = Array.Empty<ForgeAbilityData>();
[Export] public ForgeAbilityData FlyingTickAbility { get; set; } = new();
[Export]
public RDamage RDamage { get; set; }
[Export(PropertyHint.Range, "0,100,1,or_greater")]
@@ -22,12 +49,24 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
[Export(PropertyHint.Range, "0,0.2,0.01,or_greater")]
public float StraightThrowDuration { get; set; } = 0.1f;
private StateChart _weaponState;
public StateChartState InHandState;
public StateChartState FlyingState;
public StateChartState PlantedState;
public EntityAttributes Attributes { get; set; } = null!;
public EntityTags Tags { get; set; } = null!;
public EffectsManager EffectsManager { get; set; } = null!;
public EntityAbilities Abilities { get; set; } = null!;
public EventManager Events { get; set; } = null!;
private ShapeCast3D _dashCast3D;
private StateChart _weaponState = null!;
public StateChartState InHandState = null!;
public StateChartState FlyingState = null!;
public StateChartState PlantedState = null!;
private Transition _handToFlying = null!;
private Transition _flyingToHand = null!;
private Transition _plantedToHand = null!;
private Transition _plantedToFlying = null!;
private Transition _toPlanted = null!;
private ShapeCast3D _dashCast3D = null!;
public Timer WeaponFlyingTick = null!;
private Transform3D _startTransform;
private Vector3 _startMeshRotation;
@@ -35,11 +74,28 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
private Vector3 _throwDirection;
public Vector3 PlantLocation { get; set; }
public Vector3 PlantNormal { get; set; }
public Node PlantObject { get; set; }
public Node? PlantObject { get; set; }
public MeshInstance3D WeaponLocationIndicator { get; set; } = null!;
public StandardMaterial3D WeaponLocationIndicatorMaterial { get; set; } = null!;
public MeshInstance3D WeaponMesh { get; set; } = null!;
public Tag WeaponFlyingTickEventTag;
public Tag WeaponStartedFlyingEventTag;
public Tag WeaponStoppedFlyingEventTag;
public Tag WeaponHandToFlyingEventTag;
public Tag WeaponFlyingToHandEventTag;
public Tag WeaponPlantedToHandEventTag;
public Tag WeaponPlantedToFlyingEventTag;
public Tag WeaponPlantedEventTag;
public MeshInstance3D WeaponLocationIndicator { get; set; }
public StandardMaterial3D WeaponLocationIndicatorMaterial { get; set; }
public MeshInstance3D WeaponMesh { get; set; }
public Tag WeaponInHandStatusTag;
public Tag WeaponFlyingStatusTag;
public Tag WeaponPlantedStatusTag;
public Tag WeaponFlyingAbilityTag;
private AbilityHandle? _weaponFlyingAbility;
public void Init()
{
@@ -47,10 +103,17 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
InHandState = StateChartState.Of(GetNode("StateChart/Root/InHand"));
FlyingState = StateChartState.Of(GetNode("StateChart/Root/Flying"));
PlantedState = StateChartState.Of(GetNode("StateChart/Root/Planted"));
_handToFlying = Transition.Of(GetNode("StateChart/Root/InHand/ToFlying"));
_flyingToHand = Transition.Of(GetNode("StateChart/Root/Flying/ToHand"));
_plantedToHand = Transition.Of(GetNode("StateChart/Root/Planted/ToHand"));
_plantedToFlying = Transition.Of(GetNode("StateChart/Root/Planted/ToFlying"));
_toPlanted = Transition.Of(GetNode("StateChart/Root/ToPlanted"));
WeaponLocationIndicator = GetNode<MeshInstance3D>("WeaponLocationIndicator");
WeaponLocationIndicator.Visible = false;
WeaponLocationIndicatorMaterial = WeaponLocationIndicator.GetActiveMaterial(0) as StandardMaterial3D;
WeaponLocationIndicatorMaterial = (WeaponLocationIndicator.GetActiveMaterial(0) as StandardMaterial3D)!;
WeaponFlyingTick = GetNode<Timer>("WeaponFlyingTick");
WeaponMesh = GetNode<MeshInstance3D>("Weapon");
_startMeshRotation = WeaponMesh.Rotation;
@@ -58,11 +121,144 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
_startTransform = Transform;
Freeze = true;
Visible = false;
// Forge
var tagsManager = ForgeManagers.Instance.TagsManager;
var cuesManager = ForgeManagers.Instance.CuesManager;
WeaponFlyingTickEventTag = Tag.RequestTag(tagsManager, "events.weapon.flyingTick");
WeaponStartedFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.startedFlying");
WeaponStoppedFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.stoppedFlying");
WeaponHandToFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.handToFlying");
WeaponFlyingToHandEventTag = Tag.RequestTag(tagsManager, "events.weapon.flyingToHand");
WeaponPlantedToHandEventTag = Tag.RequestTag(tagsManager, "events.weapon.plantedToHand");
WeaponPlantedToFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.plantedToFlying");
WeaponPlantedEventTag = Tag.RequestTag(tagsManager, "events.weapon.planted");
// WeaponInHandStatusTag = Tag.RequestTag(tagsManager, "status.weapon.inHand");
// WeaponFlyingStatusTag = Tag.RequestTag(tagsManager, "status.weapon.flying");
// WeaponPlantedStatusTag = Tag.RequestTag(tagsManager, "status.weapon.planted");
WeaponFlyingAbilityTag = Tag.RequestTag(tagsManager,"abilities.weapon.flying");
List<AttributeSet> attributeSetList = [];
foreach (Node node in GetChildren())
{
if (node is ForgeAttributeSet attributeSetNode)
{
AttributeSet? attributeSet = attributeSetNode.GetAttributeSet();
if (attributeSet is not null)
{
attributeSetList.Add(attributeSet);
}
}
}
Attributes = new EntityAttributes([.. attributeSetList]);
Tags = new(BaseTags.GetTagContainer());
EffectsManager = new EffectsManager(this, cuesManager);
Abilities = new(this);
Events = new();
// TODO: Waiting on bug resolve
// _weaponFlyingAbility = Abilities.GrantAbilityPermanently(FlyingTickAbility.GetAbilityData(), 1, LevelComparison.None, this);
foreach (var ability in WeaponAbilities)
{
var leftGrantAbilityConfig = new GrantAbilityConfig(
ability.GetAbilityData(),
ScalableLevel: new ScalableInt(1),
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
TryActivateOnGrant: false,
TryActivateOnEnable: false,
LevelOverridePolicy: LevelComparison.Higher);
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
var leftGrantEffect = new EffectData(
"Grant Weapon Ability",
new DurationData(DurationType.Infinite),
effectComponents: [leftGrantComponent]);
EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
}
BodyEntered += OnThrownWeaponReachesGround;
InHandState.StateExited += WeaponLeft;
InHandState.StateEntered += WeaponBack;
_handToFlying.Taken += () =>
{
Events.Raise(new EventData
{
EventTags = WeaponHandToFlyingEventTag.GetSingleTagContainer()!,
Source = this
});
Events.Raise(new EventData
{
EventTags = WeaponStartedFlyingEventTag.GetSingleTagContainer()!,
Source = this
});
};
_flyingToHand.Taken += () =>
{
Events.Raise(new EventData
{
EventTags = WeaponFlyingToHandEventTag.GetSingleTagContainer()!,
Source = this
});
Events.Raise(new EventData
{
EventTags = WeaponStoppedFlyingEventTag.GetSingleTagContainer()!,
Source = this
});
};
_plantedToHand.Taken += () =>
{
Events.Raise(new EventData
{
EventTags = WeaponPlantedToHandEventTag.GetSingleTagContainer()!,
Source = this
});
};
_plantedToFlying.Taken += () =>
{
Events.Raise(new EventData
{
EventTags = WeaponPlantedToFlyingEventTag.GetSingleTagContainer()!,
Source = this
});
Events.Raise(new EventData
{
EventTags = WeaponStartedFlyingEventTag.GetSingleTagContainer()!,
Source = this
});
};
_toPlanted.Taken += () =>
{
Events.Raise(new EventData
{
EventTags = WeaponPlantedEventTag.GetSingleTagContainer()!,
Source = this,
Target = _plantedEntity
});
Events.Raise(new EventData
{
EventTags = WeaponStoppedFlyingEventTag.GetSingleTagContainer()!,
Source = this
});
};
Events.Subscribe(WeaponStoppedFlyingEventTag, data =>
{
// TODO: Waiting on bug resolve
// _weaponFlyingAbility.Cancel();
});
}
public void WeaponLeft()
@@ -90,17 +286,13 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
public void ThrowWeapon(Vector3 end, bool hasHit, Vector3 collisionLocation, Vector3 collisionNormal, Node collidedObject)
{
_weaponState.SendEvent("throw");
// WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 1f, 1f);
_throwDirection = (end - GlobalPosition).Normalized();
PlantLocation = collisionLocation;
PlantNormal = collisionNormal;
LookAt(end);
var tween = GetTree().CreateTween();
tween.SetParallel(true);
tween.TweenProperty(this, "global_position", end, StraightThrowDuration);
if (hasHit)
{
@@ -111,11 +303,15 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
tween.Finished += ThrowWeaponOnCurve;
}
private IForgeEntity? _plantedEntity;
public void PlantInEnemy(Node3D enemy)
{
GetTree().GetRoot().CallDeferred(Node.MethodName.RemoveChild, this);
enemy.CallDeferred(Node.MethodName.AddChild, this);
if (enemy is IForgeEntity victim) _plantedEntity = victim;
else _plantedEntity = null;
if (enemy is IDamageable damageable)
{
damageable.TakeDamage(new DamageRecord(GlobalPosition, RDamage));
@@ -125,6 +321,7 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
public void RethrowWeapon()
{
_weaponState.SendEvent("throw");
_throwDirection = Vector3.Up;
ThrowWeaponOnCurve();
}
@@ -137,16 +334,15 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
public void PlantWeaponInWall()
{
_weaponState.SendEvent("plant");
Freeze = true;
WeaponMesh.Rotation = _startMeshRotation;
// WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 0.2f, 0.2f);
if (PlantObject is Node3D node)
{
PlantInEnemy(node);
}
_weaponState.SendEvent("plant");
CallDeferred(Node3D.MethodName.SetGlobalPosition, PlantLocation);
CallDeferred(Node3D.MethodName.LookAt, GlobalTransform.Origin + PlantNormal, Vector3.Up, true);
}

View File

@@ -2,8 +2,13 @@
[ext_resource type="Script" uid="uid://iii3wfto4t5b" path="res://scenes/player_controller/components/weapon/WeaponSystem.cs" id="1_csqwk"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="2_m0v1h"]
[ext_resource type="Resource" uid="uid://cu0685gspk2fk" path="res://scenes/player_controller/resources/forge/exploding_sword_weapon_land.tres" id="2_pgbtr"]
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="3_3xjpi"]
[ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="3_5owyf"]
[ext_resource type="Resource" uid="uid://busdbvfi3jiic" path="res://scenes/player_controller/resources/forge/exploding_sword_weapon_left.tres" id="3_7bruw"]
[ext_resource type="ArrayMesh" uid="uid://cho5fixitrbds" path="res://assets/meshes/swords/resources/sword23.tres" id="3_svc06"]
[ext_resource type="Resource" uid="uid://btnnpqann3ktp" path="res://scenes/player_controller/resources/forge/weapon_flying_tick_ability.tres" id="4_7bruw"]
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="4_q6xv7"]
[ext_resource type="Script" uid="uid://jk2jm1g6q853" path="res://addons/godot_state_charts/compound_state.gd" id="4_svc06"]
[ext_resource type="Script" uid="uid://cytafq8i1y8qm" path="res://addons/godot_state_charts/atomic_state.gd" id="5_m0v1h"]
[ext_resource type="Script" uid="uid://cf1nsco3w0mf6" path="res://addons/godot_state_charts/transition.gd" id="6_jpdh0"]
@@ -13,6 +18,12 @@ script = ExtResource("2_m0v1h")
DamageDealt = 2.0
metadata/_custom_type_script = "uid://jitubgv6judn"
[sub_resource type="Resource" id="Resource_pgbtr"]
script = ExtResource("4_q6xv7")
Default = 1
Min = 1
Max = 100
[sub_resource type="CylinderShape3D" id="CylinderShape3D_avini"]
height = 1.0
radius = 0.1
@@ -48,8 +59,21 @@ continuous_cd = true
contact_monitor = true
max_contacts_reported = 1
script = ExtResource("1_csqwk")
WeaponAbilities = [ExtResource("2_pgbtr"), ExtResource("3_7bruw")]
FlyingTickAbility = ExtResource("4_7bruw")
RDamage = SubResource("Resource_jpdh0")
[node name="WeaponAttributeSet" type="Node" parent="." unique_id=14845649]
script = ExtResource("3_3xjpi")
AttributeSetClass = "WeaponAttributeSet"
InitialAttributeValues = Dictionary[String, ExtResource("4_q6xv7")]({
"Level": SubResource("Resource_pgbtr")
})
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
[node name="WeaponFlyingTick" type="Timer" parent="." unique_id=656309486]
wait_time = 0.2
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=884463982]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
shape = SubResource("CylinderShape3D_avini")

View File

@@ -0,0 +1,143 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://dccuj66egxfwh"]
[ext_resource type="Resource" uid="uid://crgwob8t8yysq" path="res://scenes/player_controller/resources/forge/instant_end_behavior.tres" id="1_x7d0c"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_prg0a"]
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="3_k72m0"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_5fdax"]
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="5_5qmmj"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="6_yi0bg"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="7_0rp6y"]
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://scenes/player_controller/resources/forge/player_mana_changed_cue.tres" id="8_0olwd"]
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="9_wluo0"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="10_2sq4o"]
[sub_resource type="Resource" id="Resource_h116a"]
script = ExtResource("2_prg0a")
ContainerTags = Array[String](["cooldown.empoweredaction"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_mgrka"]
script = ExtResource("3_k72m0")
TagsToAdd = SubResource("Resource_h116a")
metadata/_custom_type_script = "uid://dngf30hxy5go4"
[sub_resource type="Resource" id="Resource_ekcln"]
script = ExtResource("4_5fdax")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_odwcb"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_psy6a"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_j4bwy"]
script = ExtResource("4_5fdax")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_s60jg"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_wdif6"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_inx6r"]
script = ExtResource("4_5fdax")
BaseValue = 0.5
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_4jm88"]
script = ExtResource("5_5qmmj")
ScalableFloat = SubResource("Resource_inx6r")
Coefficient = SubResource("Resource_j4bwy")
PreMultiplyAdditiveValue = SubResource("Resource_wdif6")
PostMultiplyAdditiveValue = SubResource("Resource_s60jg")
CalculatorCoefficient = SubResource("Resource_ekcln")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_psy6a")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_odwcb")
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
[sub_resource type="Resource" id="Resource_lmnuh"]
script = ExtResource("6_yi0bg")
BaseValue = 1
[sub_resource type="Resource" id="Resource_xp6fe"]
script = ExtResource("6_yi0bg")
BaseValue = 1
[sub_resource type="Resource" id="Resource_egh2b"]
script = ExtResource("7_0rp6y")
Name = "Empowered Action Cooldown"
Modifiers = []
Components = Array[Object]([SubResource("Resource_mgrka")])
Executions = []
DurationType = 2
Duration = SubResource("Resource_4jm88")
StackLimit = SubResource("Resource_xp6fe")
InitialStack = SubResource("Resource_lmnuh")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"
[sub_resource type="Resource" id="Resource_8dsdw"]
script = ExtResource("6_yi0bg")
BaseValue = 1
[sub_resource type="Resource" id="Resource_clulf"]
script = ExtResource("4_5fdax")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_4kkx2"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_5vdhj"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_nx5he"]
script = ExtResource("4_5fdax")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_st5kh"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_wl5ql"]
script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_uv4a1"]
script = ExtResource("4_5fdax")
BaseValue = -30.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_dhni4"]
script = ExtResource("9_wluo0")
Attribute = "PlayerAttributeSet.Mana"
ScalableFloat = SubResource("Resource_uv4a1")
Coefficient = SubResource("Resource_nx5he")
PreMultiplyAdditiveValue = SubResource("Resource_wl5ql")
PostMultiplyAdditiveValue = SubResource("Resource_st5kh")
CalculatorCoefficient = SubResource("Resource_clulf")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_5vdhj")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_4kkx2")
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
[sub_resource type="Resource" id="Resource_w5rmc"]
script = ExtResource("6_yi0bg")
BaseValue = 1
[sub_resource type="Resource" id="Resource_mtef8"]
script = ExtResource("7_0rp6y")
Name = "Empowered Action Cost"
Modifiers = Array[Object]([SubResource("Resource_dhni4")])
Components = []
Executions = []
StackLimit = SubResource("Resource_w5rmc")
InitialStack = SubResource("Resource_8dsdw")
Cues = Array[Object]([ExtResource("8_0olwd")])
metadata/_custom_type_script = "uid://b83hf13nj37k3"
[resource]
script = ExtResource("10_2sq4o")
Name = "Empowered Action"
CooldownEffects = [SubResource("Resource_egh2b")]
CostEffect = SubResource("Resource_mtef8")
AbilityBehavior = ExtResource("1_x7d0c")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeExplodingSwordBehavior" format=3 uid="uid://ifeavnlps7hy"]
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="1_mnals"]
[ext_resource type="Script" uid="uid://bnee6amtc2bhj" path="res://forge/abilities/ForgeExplodingSwordBehavior.cs" id="1_ot53g"]
[resource]
script = ExtResource("1_ot53g")
Explosion = ExtResource("1_mnals")

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://bl0mng4kl1xy8"]
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="1_postf"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_km5rh"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="3_spdwn"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="4_cm86c"]
[sub_resource type="Resource" id="Resource_ixeut"]
script = ExtResource("2_km5rh")
ContainerTags = Array[String](["abilities.weapon.land"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_6c3kr"]
script = ExtResource("3_spdwn")
Tag = "events.weapon.flyingtick"
metadata/_custom_type_script = "uid://dpakv7agvir6y"
[resource]
script = ExtResource("4_cm86c")
Name = "Exploding Sword on Weapon Flight"
CooldownEffects = []
AbilityBehavior = ExtResource("1_postf")
TriggerSource = 1
TriggerTag = SubResource("Resource_6c3kr")
AbilityTags = SubResource("Resource_ixeut")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://cu0685gspk2fk"]
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="1_l4v7e"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_6c3kr"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="2_l4v7e"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="3_ixeut"]
[sub_resource type="Resource" id="Resource_ixeut"]
script = ExtResource("2_6c3kr")
ContainerTags = Array[String](["abilities.weapon.land"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_6c3kr"]
script = ExtResource("2_l4v7e")
Tag = "events.weapon.stoppedflying"
metadata/_custom_type_script = "uid://dpakv7agvir6y"
[resource]
script = ExtResource("3_ixeut")
Name = "Exploding Sword on Weapon Land"
CooldownEffects = []
AbilityBehavior = ExtResource("1_l4v7e")
TriggerSource = 1
TriggerTag = SubResource("Resource_6c3kr")
AbilityTags = SubResource("Resource_ixeut")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://busdbvfi3jiic"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="1_85dnt"]
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="1_m0rkb"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_u5iw7"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="3_u5iw7"]
[sub_resource type="Resource" id="Resource_cjh4j"]
script = ExtResource("2_u5iw7")
ContainerTags = Array[String](["abilities.weapon.left"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_mtsda"]
script = ExtResource("3_u5iw7")
Tag = "events.weapon.startedflying"
metadata/_custom_type_script = "uid://dpakv7agvir6y"
[resource]
script = ExtResource("1_85dnt")
Name = "Exploding Sword on Weapon Left"
CooldownEffects = []
AbilityBehavior = ExtResource("1_m0rkb")
TriggerSource = 1
TriggerTag = SubResource("Resource_mtsda")
AbilityTags = SubResource("Resource_cjh4j")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,75 @@
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://cffil4tic3ysg"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_bi1d8"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_qae83"]
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="1_scapu"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_scapu"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_fp8ou"]
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="4_xxxse"]
[sub_resource type="Resource" id="Resource_gi65x"]
script = ExtResource("1_bi1d8")
ContainerTags = Array[String](["character.player.mana.regen.inhibited"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_bi1d8"]
script = ExtResource("1_scapu")
TagsToAdd = SubResource("Resource_gi65x")
metadata/_custom_type_script = "uid://dngf30hxy5go4"
[sub_resource type="Resource" id="Resource_pqllu"]
script = ExtResource("3_fp8ou")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_1inmd"]
script = ExtResource("3_fp8ou")
[sub_resource type="Resource" id="Resource_cv55m"]
script = ExtResource("3_fp8ou")
[sub_resource type="Resource" id="Resource_68n87"]
script = ExtResource("3_fp8ou")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_og1rv"]
script = ExtResource("3_fp8ou")
[sub_resource type="Resource" id="Resource_cqegr"]
script = ExtResource("3_fp8ou")
[sub_resource type="Resource" id="Resource_mbpss"]
script = ExtResource("3_fp8ou")
BaseValue = 1.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_exi3e"]
script = ExtResource("4_xxxse")
ScalableFloat = SubResource("Resource_mbpss")
Coefficient = SubResource("Resource_68n87")
PreMultiplyAdditiveValue = SubResource("Resource_cqegr")
PostMultiplyAdditiveValue = SubResource("Resource_og1rv")
CalculatorCoefficient = SubResource("Resource_pqllu")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_cv55m")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_1inmd")
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
[sub_resource type="Resource" id="Resource_1go02"]
script = ExtResource("1_qae83")
BaseValue = 1
[sub_resource type="Resource" id="Resource_ijayu"]
script = ExtResource("1_qae83")
BaseValue = 1
[resource]
script = ExtResource("2_scapu")
Name = "Inhibit Player Mana Regen Temp"
Modifiers = []
Components = Array[Object]([SubResource("Resource_bi1d8")])
Executions = []
DurationType = 2
Duration = SubResource("Resource_exi3e")
StackLimit = SubResource("Resource_ijayu")
InitialStack = SubResource("Resource_1go02")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"

View File

@@ -0,0 +1,7 @@
[gd_resource type="Resource" script_class="ForgeInstantEndBehavior" format=3 uid="uid://crgwob8t8yysq"]
[ext_resource type="Script" uid="uid://c7s5v7ii4nujg" path="res://forge/abilities/ForgeInstantEndBehavior.cs" id="1_hly5b"]
[resource]
script = ExtResource("1_hly5b")
metadata/_custom_type_script = "uid://c7s5v7ii4nujg"

View File

@@ -0,0 +1,83 @@
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://dh437cuxgjv6b"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_mlifq"]
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://scenes/player_controller/resources/forge/player_mana_changed_cue.tres" id="1_nsr3v"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_q8tml"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_5tp50"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="2_pm3n3"]
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="2_xbgy2"]
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="3_nsr3v"]
[sub_resource type="Resource" id="Resource_5yygy"]
script = ExtResource("1_q8tml")
ContainerTags = Array[String](["character.player.mana.regen.inhibited"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_ncjx6"]
script = ExtResource("2_xbgy2")
OngoingIgnoredTags = SubResource("Resource_5yygy")
metadata/_custom_type_script = "uid://b0eq12mjqfage"
[sub_resource type="Resource" id="Resource_pm3n3"]
script = ExtResource("1_mlifq")
BaseValue = 1
[sub_resource type="Resource" id="Resource_q8tml"]
script = ExtResource("2_pm3n3")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_xbgy2"]
script = ExtResource("2_pm3n3")
[sub_resource type="Resource" id="Resource_rhldn"]
script = ExtResource("2_pm3n3")
[sub_resource type="Resource" id="Resource_p6h8c"]
script = ExtResource("2_pm3n3")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_yqxv4"]
script = ExtResource("2_pm3n3")
[sub_resource type="Resource" id="Resource_b6opn"]
script = ExtResource("2_pm3n3")
[sub_resource type="Resource" id="Resource_5frso"]
script = ExtResource("2_pm3n3")
BaseValue = 2.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_okenf"]
script = ExtResource("3_nsr3v")
Attribute = "PlayerAttributeSet.Mana"
ScalableFloat = SubResource("Resource_5frso")
Coefficient = SubResource("Resource_p6h8c")
PreMultiplyAdditiveValue = SubResource("Resource_b6opn")
PostMultiplyAdditiveValue = SubResource("Resource_yqxv4")
CalculatorCoefficient = SubResource("Resource_q8tml")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_rhldn")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_xbgy2")
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
[sub_resource type="Resource" id="Resource_w35mq"]
script = ExtResource("2_pm3n3")
BaseValue = 0.1
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_nsr3v"]
script = ExtResource("1_mlifq")
BaseValue = 1
[resource]
script = ExtResource("2_5tp50")
Name = "Mana Regeneration"
Modifiers = Array[Object]([SubResource("Resource_okenf")])
Components = [SubResource("Resource_ncjx6")]
Executions = []
DurationType = 1
HasPeriodicApplication = true
Period = SubResource("Resource_w35mq")
StackLimit = SubResource("Resource_nsr3v")
InitialStack = SubResource("Resource_pm3n3")
Cues = Array[Object]([ExtResource("1_nsr3v")])
metadata/_custom_type_script = "uid://b83hf13nj37k3"

View File

@@ -0,0 +1,17 @@
[gd_resource type="Resource" script_class="ForgeCue" format=3 uid="uid://dn7b8frkoxpxr"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_lbula"]
[ext_resource type="Script" uid="uid://cmrsxccn0ei4j" path="res://addons/forge/resources/ForgeCue.cs" id="2_jijlk"]
[sub_resource type="Resource" id="Resource_4mhqs"]
script = ExtResource("1_lbula")
ContainerTags = Array[String](["cues.resources.mana"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[resource]
script = ExtResource("2_jijlk")
CueKeys = SubResource("Resource_4mhqs")
MaxValue = 100
MagnitudeType = 2
MagnitudeAttribute = "PlayerAttributeSet.Mana"
metadata/_custom_type_script = "uid://cmrsxccn0ei4j"

View File

@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="ForgeRaiseEventTagExecution" format=3 uid="uid://oe2suroa1klj"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_iqjlm"]
[ext_resource type="Script" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="2_am2ak"]
[sub_resource type="Resource" id="Resource_sxbq4"]
script = ExtResource("1_iqjlm")
ContainerTags = Array[String](["events.weapon.flyingtick"])
[resource]
script = ExtResource("2_am2ak")
metadata/_custom_type_script = "uid://br7ut4lbau66w"

View File

@@ -0,0 +1,55 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://btnnpqann3ktp"]
[ext_resource type="Resource" uid="uid://oe2suroa1klj" path="res://scenes/player_controller/resources/forge/raise_flying_tick_event.tres" id="1_pdt6v"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="1_vh0wp"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="2_xkoyb"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_j2gem"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="4_e2sm2"]
[ext_resource type="Script" uid="uid://cl5hudinl1rex" path="res://forge/abilities/ForgeEffectApplicationBehavior.cs" id="5_trglf"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="6_napws"]
[sub_resource type="Resource" id="Resource_dgkld"]
script = ExtResource("2_xkoyb")
BaseValue = 1
[sub_resource type="Resource" id="Resource_1ften"]
script = ExtResource("3_j2gem")
BaseValue = 0.2
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_l278c"]
script = ExtResource("2_xkoyb")
BaseValue = 1
[sub_resource type="Resource" id="Resource_esyoj"]
script = ExtResource("4_e2sm2")
Modifiers = []
Components = []
Executions = Array[Object]([ExtResource("1_pdt6v")])
DurationType = 1
HasPeriodicApplication = true
Period = SubResource("Resource_1ften")
ExecuteOnApplication = true
StackLimit = SubResource("Resource_l278c")
InitialStack = SubResource("Resource_dgkld")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"
[sub_resource type="Resource" id="Resource_0xegy"]
script = ExtResource("5_trglf")
EffectData = SubResource("Resource_esyoj")
metadata/_custom_type_script = "uid://cl5hudinl1rex"
[sub_resource type="Resource" id="Resource_4aw8y"]
script = ExtResource("6_napws")
Tag = "events.weapon.startedflying"
metadata/_custom_type_script = "uid://dpakv7agvir6y"
[resource]
script = ExtResource("1_vh0wp")
Name = "Weapon Flying Tick"
CooldownEffects = []
AbilityBehavior = SubResource("Resource_0xegy")
TriggerSource = 1
TriggerTag = SubResource("Resource_4aw8y")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,19 @@
using Gamesmiths.Forge.Attributes;
namespace Movementtests.scenes.player_controller.scripts;
public class PlayerAttributeSet : AttributeSet
{
public EntityAttribute Health { get; }
public EntityAttribute Mana { get; }
public EntityAttribute Strength { get; }
public EntityAttribute Speed { get; }
public PlayerAttributeSet()
{
Health = InitializeAttribute(nameof(Health), 100, 0, 150);
Mana = InitializeAttribute(nameof(Mana), 100, 0, 100);
Strength = InitializeAttribute(nameof(Strength), 10, 0, 99);
Speed = InitializeAttribute(nameof(Speed), 5, 0, 10);
}
}

View File

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

View File

@@ -1,19 +1,44 @@
using System;
using System.Collections.Generic;
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Attributes;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Components;
using Gamesmiths.Forge.Effects.Duration;
using Gamesmiths.Forge.Effects.Magnitudes;
using Gamesmiths.Forge.Effects.Modifiers;
using Gamesmiths.Forge.Effects.Periodic;
using Gamesmiths.Forge.Events;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Godot.Nodes;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Gamesmiths.Forge.Tags;
using Godot;
using GodotStateCharts;
using Movementtests.addons.godot_state_charts.csharp;
using Movementtests.interfaces;
using Movementtests.systems;
using Movementtests.player_controller.Scripts;
using Movementtests.scenes.player_controller.scripts;
using Movementtests.tools;
using Movementtests.forge.abilities;
using Movementtests.tools.calculators;
using RustyOptions;
public record struct EmpoweredActionPayload;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_character.png")]
public partial class PlayerController : CharacterBody3D,
IDamageable,
IDamageDealer,
IHealthable,
IKnockbackable
IKnockbackable,
IForgeEntity
{
// Enums
public enum AllowedInputs
@@ -42,43 +67,69 @@ public partial class PlayerController : CharacterBody3D,
[Signal]
public delegate void PlayerDiedEventHandler();
public event Action<IDamageable, DamageRecord> DamageTaken;
public event Action<IHealthable, HealthChangedRecord> HealthChanged;
public event Action<IHealthable> HealthDepleted;
public event Action<IDamageable, DamageRecord> DamageTaken = null!;
public event Action<IHealthable, HealthChangedRecord> HealthChanged = null!;
public event Action<IHealthable> HealthDepleted = null!;
///////////////////////////
// Public stuff //
///////////////////////////
public HeadSystem HeadSystem;
public StairsSystem StairsSystem;
public MantleSystem MantleSystem;
public DashSystem DashSystem;
public CollisionShape3D StandingCollider;
public CollisionShape3D SlideCollider;
public WeaponSystem WeaponSystem;
public WallHugSystem WallHugSystem;
public PlayerUi PlayerUi;
public TextureRect DashIndicator;
public ColorRect PowerCooldownIndicator;
public Node3D DashIndicatorNode;
public MeshInstance3D DashIndicatorMesh;
public CylinderMesh DashIndicatorMeshCylinder;
public RayCast3D WallRunSnapper;
public ShapeCast3D GroundDetector;
public ShapeCast3D CeilingDetector;
public RayCast3D DirectGroundDetector;
public Area3D WeaponHitbox;
public AudioStreamPlayer3D SfxPlayer;
public HeadSystem HeadSystem = null!;
public StairsSystem StairsSystem = null!;
public MantleSystem MantleSystem = null!;
public DashSystem DashSystem = null!;
public CollisionShape3D StandingCollider = null!;
public CollisionShape3D SlideCollider = null!;
public WeaponSystem WeaponSystem = null!;
public WallHugSystem WallHugSystem = null!;
public PlayerUi PlayerUi = null!;
public TextureRect DashIndicator = null!;
public ColorRect PowerCooldownIndicator = null!;
public Node3D DashIndicatorNode = null!;
public MeshInstance3D DashIndicatorMesh = null!;
public CylinderMesh DashIndicatorMeshCylinder = null!;
public RayCast3D WallRunSnapper = null!;
public ShapeCast3D GroundDetector = null!;
public ShapeCast3D CeilingDetector = null!;
public RayCast3D DirectGroundDetector = null!;
public Area3D WeaponHitbox = null!;
public AudioStreamPlayer3D SfxPlayer = null!;
public ShapeCast3D DashDamageDetector;
public Area3D SlidingEnemyDetector;
public ShapeCast3D DashDamageDetector = null!;
public Area3D SlidingEnemyDetector = null!;
public EntityAttributes Attributes { get; set; } = null!;
public EntityTags Tags { get; set; } = null!;
public EffectsManager EffectsManager { get; set; } = null!;
public EntityAbilities Abilities { get; set; } = null!;
public EventManager Events { get; set; } = null!;
// Inspector stuff
[Export] public Marker3D TutorialWeaponTarget;
[Export] public Marker3D TutorialWeaponTarget = null!;
[Export] public bool TutorialDone { get; set; }
[Export] public bool HasSword { get; set; } = true;
[Export] public bool HasParry { get; set; } = true;
// Forge stuff
[ExportCategory("Forge")]
[ExportGroup("General")]
[Export]
public ForgeTagContainer BaseTags { get; set; } = new();
[Export] public ForgeTag EmpoweredActionUsed;
[ExportGroup("Abilities")]
[ExportSubgroup("Common and defaults")]
[Export] public ForgeAbilityData EmpoweredActionAbility = null!;
[Export] public ForgeAbilityData[] DefaultPermanentAbilities = [];
[ExportSubgroup("WeaponThrow")]
[Export] public ForgeAbilityData[] AbilityLoadout = [];
[ExportGroup("Effects")]
[ExportSubgroup("Common and defaults")]
[Export] public ForgeEffectData[] DefaultPermanentEffects = [];
[ExportSubgroup("Applied on Empowered Action used")]
[Export] public ForgeEffectData[] EmpoweredActionEffects = [];
// Combat stuff
[ExportCategory("Combat")]
[ExportGroup("General")]
@@ -88,11 +139,10 @@ public partial class PlayerController : CharacterBody3D,
public float AimAssistReductionWhenCloseToTarget { get; set; } = 0.3f;
[Export(PropertyHint.Range, "0,10f,0.1,or_greater")]
public float AimAssistReductionStartDistance { get; set; } = 10f;
[ExportGroup("Damage")]
[Export] public RDamage RDamage { get; set; }
[Export] public RKnockback RKnockback { get; set; }
[Export] public RHealth RHealth { get; set; }
[ExportGroup("Damage")] [Export] public RDamage RDamage { get; set; } = null!;
[Export] public RKnockback? RKnockback { get; set; } = null!;
[Export] public RHealth? RHealth { get; set; } = null!;
[ExportGroup("Targeting")]
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
@@ -102,7 +152,7 @@ public partial class PlayerController : CharacterBody3D,
[ExportGroup("Instantiation")]
[Export]
public PackedScene Explosion { get; set; }
public PackedScene Explosion { get; set; } = null!;
// Movement stuff
[ExportCategory("Movement")]
@@ -129,7 +179,7 @@ public partial class PlayerController : CharacterBody3D,
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
public float MantleTime { get; set; } = 0.1f;
[Export]
public PackedScene MantlePath { get; set; }
public PackedScene MantlePath { get; set; } = null!;
[Export(PropertyHint.Range, "0,50,0.1")]
public float MantleDashStrength { get; set; } = 15f;
@@ -254,8 +304,8 @@ public partial class PlayerController : CharacterBody3D,
// Stairs and shit
private float _lastFrameWasOnFloor = -Mathf.Inf;
private const int NumOfHeadCollisionDetectors = 4;
private RayCast3D[] _headCollisionDetectors;
private AudioStreamPlaybackInteractive _audioStream;
private RayCast3D[] _headCollisionDetectors = null!;
private AudioStreamPlaybackInteractive _audioStream = null!;
// Basic movement
private bool _movementEnabled = true;
@@ -265,8 +315,8 @@ public partial class PlayerController : CharacterBody3D,
private float _inputRotateFloorplane;
// Basic falling
internal float _targetSpeed;
internal float _gravity;
internal float TargetSpeed;
internal float Gravity;
// Jump stuff
private int _currentInputBufferFrames;
@@ -276,10 +326,10 @@ public partial class PlayerController : CharacterBody3D,
// Mantle stuff
private bool _shouldMantleOnDashEnded;
private Path _mantlePath;
private Path? _mantlePath;
private bool _customMantle;
private Transform3D _customMantleStartTransform;
private Curve3D _customMantleCurve;
private Curve3D _customMantleCurve = null!;
private Vector3 _mantleStartPosition;
private Vector3 _velocityOnMantleStarted = Vector3.Zero;
@@ -290,7 +340,7 @@ public partial class PlayerController : CharacterBody3D,
private Vector3 _currentWallContactPoint = Vector3.Zero;
// Dash stuff
internal bool _canDash = true;
internal bool CanDash = true;
private bool _canDashAirborne = true;
private float _playerHeight;
private float _playerRadius;
@@ -316,61 +366,61 @@ public partial class PlayerController : CharacterBody3D,
private float _aimAssistMultiplier = 1.0f;
// Timers
private Timer _timeScaleAimInAirTimer;
private Timer _weaponThrowUncatchableTimer;
private Timer _simpleDashCooldownTimer;
private Timer _airborneDashCooldownTimer;
private Timer _powerCooldownTimer;
private Timer _invincibilityTimer;
private Timer _attackCooldown;
private Timer _timeScaleAimInAirTimer = null!;
private Timer _weaponThrowUncatchableTimer = null!;
private Timer _simpleDashCooldownTimer = null!;
private Timer _airborneDashCooldownTimer = null!;
private Timer _powerCooldownTimer = null!;
private Timer _invincibilityTimer = null!;
private Timer _attackCooldown = null!;
// State chart
private StateChart _playerState;
private StateChart _playerState = null!;
private StateChartState _aiming;
private StateChartState _powerExpired;
private StateChartState _powerRecharging;
private StateChartState _powerFull;
private StateChartState _aiming = null!;
private StateChartState _powerExpired = null!;
private StateChartState _powerRecharging = null!;
private StateChartState _powerFull = null!;
private StateChartState _grounded;
private StateChartState _airborne;
private StateChartState _coyoteEnabled;
private StateChartState _jumping;
private StateChartState _simpleJump;
private StateChartState _doubleJump;
private StateChartState _mantling;
private StateChartState _simpleDash;
private StateChartState _aimedDash;
private StateChartState _weaponDash;
private StateChartState _sliding;
private StateChartState _groundSliding;
private StateChartState _airGliding;
private StateChartState _airGlidingDoubleJump;
private StateChartState _slideCanceled;
private StateChartState _slamming;
private StateChartState _onWall;
private StateChartState _onWallHugging;
private StateChartState _onWallHanging;
private StateChartState _onWallRunning;
private StateChartState _grounded = null!;
private StateChartState _airborne = null!;
private StateChartState _coyoteEnabled = null!;
private StateChartState _jumping = null!;
private StateChartState _simpleJump = null!;
private StateChartState _doubleJump = null!;
private StateChartState _mantling = null!;
private StateChartState _simpleDash = null!;
private StateChartState _aimedDash = null!;
private StateChartState _weaponDash = null!;
private StateChartState _sliding = null!;
private StateChartState _groundSliding = null!;
private StateChartState _airGliding = null!;
private StateChartState _airGlidingDoubleJump = null!;
private StateChartState _slideCanceled = null!;
private StateChartState _slamming = null!;
private StateChartState _onWall = null!;
private StateChartState _onWallHugging = null!;
private StateChartState _onWallHanging = null!;
private StateChartState _onWallRunning = null!;
private StateChartState _attackStandard;
private StateChartState _attackDash;
private StateChartState _parryStandard;
private StateChartState _parryDash;
private StateChartState _attackStandard = null!;
private StateChartState _attackDash = null!;
private StateChartState _parryStandard = null!;
private StateChartState _parryDash = null!;
private Transition _onJumpFromWall;
private Transition _onJumpFromWallFalling;
private Transition _onJumpFromWallRunning;
private Transition _onLeaveWallFromRun;
private Transition _onAirborneToGrounded;
private Transition _onJumpFromWall = null!;
private Transition _onJumpFromWallFalling = null!;
private Transition _onJumpFromWallRunning = null!;
private Transition _onLeaveWallFromRun = null!;
private Transition _onAirborneToGrounded = null!;
private Transition _onGroundSlideJump;
private Transition _onAirGlideDoubleJump;
private Transition _onGroundSlideJump = null!;
private Transition _onAirGlideDoubleJump = null!;
// Damage
public CDamageable CDamageable { get; set; }
public CHealth CHealth { get; set; }
public CKnockback CKnockback { get; set; }
public CDamageable? CDamageable { get; set; }
public CHealth? CHealth { get; set; }
public CKnockback? CKnockback { get; set; }
public float CurrentHealth { get; set; }
private bool _isInvincible;
@@ -383,9 +433,11 @@ public partial class PlayerController : CharacterBody3D,
private readonly List<IDamageable> _hitEnemies = new List<IDamageable>();
private ShapeCast3D _closeEnemyDetector;
private RayCast3D _aimAssisRayCast;
private Camera3D _camera;
private ShapeCast3D _closeEnemyDetector = null!;
private RayCast3D _aimAssisRayCast = null!;
private Camera3D _camera = null!;
private AbilityHandle? _empoweredActionHandle;
public override void _Ready()
{
@@ -402,18 +454,70 @@ public partial class PlayerController : CharacterBody3D,
_aimAssisRayCast = GetNode<RayCast3D>("AimAssistRayCast");
_aimAssisRayCast.TargetPosition = _aimAssisRayCast.TargetPosition.Normalized() * (TargetingDistance*1.5f);
// Forge stuff
var tagsManager = ForgeManagers.Instance.TagsManager;
var cuesManager = ForgeManagers.Instance.CuesManager;
List<AttributeSet> attributeSetList = [];
foreach (Node node in GetChildren())
{
if (node is ForgeAttributeSet attributeSetNode)
{
AttributeSet? attributeSet = attributeSetNode.GetAttributeSet();
if (attributeSet is not null)
{
attributeSetList.Add(attributeSet);
}
}
}
Attributes = new EntityAttributes([.. attributeSetList]);
Tags = new(BaseTags.GetTagContainer());
EffectsManager = new EffectsManager(this, cuesManager);
Abilities = new(this);
Events = new();
_empoweredActionHandle = Abilities.GrantAbilityPermanently(
EmpoweredActionAbility.GetAbilityData(),
abilityLevel: 1,
levelOverridePolicy: LevelComparison.None,
sourceEntity: this);
foreach (var ability in DefaultPermanentAbilities)
{
Abilities.GrantAbilityPermanently(
ability.GetAbilityData(),
abilityLevel: 1,
levelOverridePolicy: LevelComparison.None,
sourceEntity: this);
}
// Apply all default effects
foreach (var effect in DefaultPermanentEffects)
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
}
// Subscribe default empowered actions effects to the Empowered Action Used event
foreach (var effect in EmpoweredActionEffects)
{
Events.Subscribe<EmpoweredActionPayload>(EmpoweredActionUsed.GetTag(), data =>
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
});
}
// DashIndicator = GetNode<TextureRect>("%DashIndicator");
PowerCooldownIndicator = GetNode<ColorRect>("%DashCooldownIndicator");
PowerCooldownIndicator.Visible = false;
EmpoweredActionsLeft = MaxNumberOfEmpoweredActions;
_targetSpeed = WalkSpeed;
TargetSpeed = WalkSpeed;
DashIndicatorNode = GetNode<Node3D>("DashIndicator");
DashIndicatorMesh = GetNode<MeshInstance3D>("DashIndicator/DashIndicatorMesh");
DashIndicatorMeshCylinder = DashIndicatorMesh.Mesh as CylinderMesh;
DashIndicatorMeshCylinder = (DashIndicatorMesh.Mesh as CylinderMesh)!;
DashIndicatorMesh.Visible = false;
SfxPlayer = GetNode<AudioStreamPlayer3D>("SFXPlayer");
_audioStream = SfxPlayer.GetStreamPlayback() as AudioStreamPlaybackInteractive;
_audioStream = (SfxPlayer.GetStreamPlayback() as AudioStreamPlaybackInteractive)!;
// Camera stuff
HeadSystem = GetNode<HeadSystem>("HeadSystem");
@@ -466,7 +570,7 @@ public partial class PlayerController : CharacterBody3D,
}
if (RKnockback != null) CKnockback!.RKnockback = RKnockback;
PlayerUi.Initialize(CHealth.CurrentHealth);
PlayerUi.Initialize(CHealth.CurrentHealth, Attributes["PlayerAttributeSet.Mana"].BaseValue);
CDamageable.DamageTaken += (damageable, record) => ReduceHealth(damageable, record);
CDamageable.DamageTaken += (_, record) => RegisterKnockback(new KnockbackRecord(record));
CHealth.HealthChanged += PlayerUi.OnHealthChanged;
@@ -539,7 +643,7 @@ public partial class PlayerController : CharacterBody3D,
// Movement stuff
// Getting universal setting from GODOT editor to be in sync
_gravity = (float)ProjectSettings.GetSetting("physics/3d/default_gravity");
Gravity = (float)ProjectSettings.GetSetting("physics/3d/default_gravity");
MantleSystem.Init();
StairsSystem.Init(stairsBelowRayCast3D, stairsAheadRayCast3D, cameraSmooth);
DashSystem.Init(HeadSystem, _camera);
@@ -640,9 +744,56 @@ public partial class PlayerController : CharacterBody3D,
_attackDash.StateEntered += OnDashAttackStarted;
_parryStandard.StateEntered += OnStandardParryStarted;
_parryDash.StateEntered += OnDashParryStarted;
foreach (var weaponLandAbility in AbilityLoadout)
{
var leftGrantAbilityConfig = new GrantAbilityConfig(
weaponLandAbility.GetAbilityData(),
ScalableLevel: new ScalableInt(1),
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
TryActivateOnGrant: false,
TryActivateOnEnable: false,
LevelOverridePolicy: LevelComparison.Higher);
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
var leftGrantEffect = new EffectData(
"Grant Weapon Left Ability",
new DurationData(DurationType.Infinite),
effectComponents: [leftGrantComponent]);
EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
}
// GetTree().CreateTimer(5).Timeout += () => WeaponSystem.GrantNewAbilityForWeaponFly(weaponLandAbility);
// Forge events
var weaponLeftToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStartedFlyingEventTag, OnWeaponLeft);
var weaponLandedToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStoppedFlyingEventTag, OnWeaponLanded);
}
public void OnWeaponLeft(EventData data)
{
var target = data.Target;
var tagsManager = ForgeManagers.Instance.TagsManager;
var weaponLeftTag = Tag.RequestTag(tagsManager, "abilities.weapon.left").GetSingleTagContainer();
if (weaponLeftTag == null) return;
Abilities.TryActivateAbilitiesByTag(weaponLeftTag, target, out var landedFailures);
}
public void OnWeaponLanded(EventData data)
{
var source = data.Source;
var target = data.Target;
var magnitude = data.EventMagnitude;
var weaponLandPayload = data.Payload;
var tagsManager = ForgeManagers.Instance.TagsManager;
// Testing out kill
// GetTree().CreateTimer(2).Timeout += () => Kill(this);
var weaponLandTag = Tag.RequestTag(tagsManager, "abilities.weapon.land").GetSingleTagContainer();
if (weaponLandTag == null) return;
var anyActivated = Abilities.TryActivateAbilitiesByTag(
weaponLandTag,
target,
out var failures);
}
///////////////////////////
@@ -701,8 +852,8 @@ public partial class PlayerController : CharacterBody3D,
public void SetPlayerHealthOverride(float newHealthValue)
{
RHealth.StartingHealth = newHealthValue;
CHealth.CurrentHealth = newHealthValue;
PlayerUi.Initialize(CHealth.CurrentHealth);
CHealth!.CurrentHealth = newHealthValue;
PlayerUi.Initialize(CHealth.CurrentHealth, Attributes["PlayerAttributeSet.Mana"].BaseValue);
}
public void SetPlayerDamageOverride(float newDamageValue)
{
@@ -734,7 +885,7 @@ public partial class PlayerController : CharacterBody3D,
return;
}
_canDash = true;
CanDash = true;
_canDashAirborne = true;
_playerState.SendEvent("dash");
}
@@ -761,7 +912,7 @@ public partial class PlayerController : CharacterBody3D,
public void OnAirborneToGrounded()
{
HeadSystem.OnJumpEnded();
_audioStream!.SwitchToClipByName("land");
_audioStream.SwitchToClipByName("land");
}
public bool IsGroundLike()
@@ -968,7 +1119,7 @@ public partial class PlayerController : CharacterBody3D,
// Utilities //
///////////////////////////
public float CalculateGravityForce() => _gravity * Weight;
public float CalculateGravityForce() => Gravity * Weight;
// Camera stuff
private Vector2 ComputeAimAssist()
@@ -1031,8 +1182,8 @@ public partial class PlayerController : CharacterBody3D,
var acceleration = dir.Length() > 0 ? accelerationFactor : decelerationFactor;
float xAcceleration = Mathf.Lerp(Velocity.X, dir.X * _targetSpeed, delta * acceleration);
float zAcceleration = Mathf.Lerp(Velocity.Z, dir.Z * _targetSpeed, delta * acceleration);
float xAcceleration = Mathf.Lerp(Velocity.X, dir.X * TargetSpeed, delta * acceleration);
float zAcceleration = Mathf.Lerp(Velocity.Z, dir.Z * TargetSpeed, delta * acceleration);
return new Vector3(xAcceleration, 0, zAcceleration);
}
public Vector3 ComputeHVelocityGround(float delta)
@@ -1091,7 +1242,7 @@ public partial class PlayerController : CharacterBody3D,
///////////////////////////
public void DashCooldownTimeout()
{
_canDash = true;
CanDash = true;
}
public void AirborneDashCooldownTimeout()
{
@@ -1124,8 +1275,8 @@ public partial class PlayerController : CharacterBody3D,
return;
}
if (!_canDash) return;
_canDash = false;
if (!CanDash) return;
CanDash = false;
_simpleDashCooldownTimer.Start();
_playerState.SendEvent("dash");
}
@@ -1166,7 +1317,7 @@ public partial class PlayerController : CharacterBody3D,
if (MantleSystem.IsMantlePossible && IsPlayerInputtingForward())
{
// _bufferedAction = BufferedActions.MantleDash;
_canDash = true; // Restore dash ability
CanDash = true; // Restore dash ability
_playerState.SendEvent("mantle");
}
}
@@ -1203,7 +1354,7 @@ public partial class PlayerController : CharacterBody3D,
public void OnWallStarted()
{
if (_simpleDashCooldownTimer.IsStopped())
_canDash = true;
CanDash = true;
else
_simpleDashCooldownTimer.Start();
@@ -1452,7 +1603,7 @@ public partial class PlayerController : CharacterBody3D,
public void OnJumpStarted(float verticalVelocity)
{
HeadSystem.OnJumpStarted();
_audioStream!.SwitchToClipByName("jump");
_audioStream.SwitchToClipByName("jump");
_framesSinceJumpAtApex = 0;
var angle = GetFloorAngle();
@@ -1474,7 +1625,7 @@ public partial class PlayerController : CharacterBody3D,
}
public void OnDoubleJumpStarted()
{
_canDash = true;
CanDash = true;
// _canDashAirborne = true;
OnJumpStarted(DoubleJumpStartVelocity);
_bufferedAction = BufferedActions.None;
@@ -1559,7 +1710,7 @@ public partial class PlayerController : CharacterBody3D,
public void OnMantleStarted()
{
HeadSystem.OnMantle();
_audioStream!.SwitchToClipByName("mantle");
_audioStream.SwitchToClipByName("mantle");
_mantlePath = MantlePath.Instantiate() as Path;
if (_mantlePath == null)
@@ -1584,11 +1735,11 @@ public partial class PlayerController : CharacterBody3D,
}
public void HandleMantling(float delta)
{
GlobalPosition = _mantlePath.Target.GlobalPosition;
GlobalPosition = _mantlePath!.Target.GlobalPosition;
}
public void MantleFinished()
{
_mantlePath.Teardown();
_mantlePath!.Teardown();
// SetVelocity(_finalCurveDirection.Normalized() * _speedOverCurve);
@@ -1667,8 +1818,8 @@ public partial class PlayerController : CharacterBody3D,
}
public void SlideStarted()
{
_targetSpeed = Velocity.Length();
_audioStream!.SwitchToClipByName("glide");
TargetSpeed = Velocity.Length();
_audioStream.SwitchToClipByName("glide");
SetupSlideCollision();
SlidingEnemyDetector.Monitoring = true;
@@ -1741,7 +1892,7 @@ public partial class PlayerController : CharacterBody3D,
public void OnSlideCanceled()
{
SetupStandingCollision();
_targetSpeed = WalkSpeed;
TargetSpeed = WalkSpeed;
}
public void HandleSlideCanceled(float delta)
{
@@ -1802,8 +1953,8 @@ public partial class PlayerController : CharacterBody3D,
IsInvincible = false;
SetupStandingCollision();
_audioStream!.SwitchToClipByName("footsteps");
_targetSpeed = WalkSpeed;
_audioStream.SwitchToClipByName("footsteps");
TargetSpeed = WalkSpeed;
}
public void EnemyHitWhileSliding(Node enemy)
@@ -1836,7 +1987,7 @@ public partial class PlayerController : CharacterBody3D,
{
SetHorizontalVelocity(Vector2.Zero);
SetVerticalVelocity(-SlamSpeed);
_audioStream!.SwitchToClipByName("dash");
_audioStream.SwitchToClipByName("dash");
}
public void HandleSlam(float delta)
{
@@ -1845,7 +1996,7 @@ public partial class PlayerController : CharacterBody3D,
public void SlamEnded()
{
HeadSystem.OnGetHit();
_audioStream!.SwitchToClipByName("slam");
_audioStream.SwitchToClipByName("slam");
if (Explosion.Instantiate() is not Explosion explosion) return;
explosion.Radius = 10f;
@@ -1880,14 +2031,64 @@ public partial class PlayerController : CharacterBody3D,
public bool CanPerformEmpoweredAction()
{
if(_empoweredActionHandle == null) return false;
var cooldowns = _empoweredActionHandle.GetCooldownData();
foreach (var cd in cooldowns)
{
//GD.Print($"Cooldown remaining: {cd.RemainingTime}");
}
var costs = _empoweredActionHandle.GetCostData();
foreach (var cost in costs)
{
// Assuming you want to check Mana costs
if (cost.Attribute == "PlayerAttributeSet.Mana")
{
//GD.Print($"Mana Cost: {cost.Cost}");
}
}
var canActivate = _empoweredActionHandle.CanActivate(out var failures);
if (!canActivate)
{
GD.PrintErr($"Cannot activate empowered action: {failures}");
if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown");
if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana");
}
return canActivate;
return EmpoweredActionsLeft > 0 && TutorialDone;
}
public void PerformEmpoweredAction()
{
if(_empoweredActionHandle == null) return;
var canActivate = _empoweredActionHandle.Activate(out var failures);
if (!canActivate)
{
GD.PrintErr($"Cannot activate empowered action: {failures}");
if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown");
if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana");
}
else
{
GD.Print($"Remaining mana: {Attributes["PlayerAttributeSet.Mana"].CurrentValue}");
}
// Inhibit Mana Regeneration for a while after using an empowered action
// TODO: Use Forge events instead of relying on direct referencing
// _manaRegenEffectHandle!.SetInhibit(true);
// GetTree().CreateTimer(EmpoweredAction.ManaRegenPause).Timeout += () => {_manaRegenEffectHandle!.SetInhibit(false);};
_isWallJumpAvailable = true;
_canDashAirborne = true;
EmpoweredActionsLeft--;
_playerState.SendEvent(EmpoweredActionsLeft <= 0 ? "expired" : "power_used");
Events.Raise(new EventData<EmpoweredActionPayload>
{
EventTags = EmpoweredActionUsed.GetTag().GetSingleTagContainer()!,
Source = this,
Payload = new EmpoweredActionPayload()
});
}
///////////////////////////
@@ -1978,7 +2179,7 @@ public partial class PlayerController : CharacterBody3D,
_dashDirection = travel.Normalized();
var shouldRebound = false;
if (DashSystem.CanDashThroughTarget && DashSystem.CollidedObject is ITargetable targetable)
if (DashSystem is { CanDashThroughTarget: true, CollidedObject: ITargetable targetable })
{
var plannedDashLocation = targetable.GetTargetGlobalPosition() + Vector3.Down*_playerHeight/2;
travel = plannedDashLocation - GlobalPosition;
@@ -2063,7 +2264,7 @@ public partial class PlayerController : CharacterBody3D,
DashSystem.HasHit,
DashSystem.CollisionPoint,
DashSystem.CollisionNormal,
DashSystem.CollidedObject as Node);
(DashSystem.CollidedObject as Node)!);
}
public void RecoverWeapon()
{
@@ -2167,7 +2368,7 @@ public partial class PlayerController : CharacterBody3D,
WeaponSystem.PlantObject = null;
}
public void ManageAttackedEnemyPostDash(Node enemy)
public void ManageAttackedEnemyPostDash(Node? enemy)
{
if (enemy is IDamageable damageable)
{
@@ -2190,14 +2391,10 @@ public partial class PlayerController : CharacterBody3D,
_spaceState = GetWorld3D().DirectSpaceState;
if (_currentInputBufferFrames > 0) _currentInputBufferFrames -= 1;
// Limit maximum speed
if (Velocity.Length() > AbsoluteMaxSpeed)
Velocity = Velocity.Normalized() * AbsoluteMaxSpeed;
// Manage head and camera movement
LookAround(delta);
// Manage general movement
Velocity += ComputeKnockback();
MoveSlideAndHandleStairs((float) delta);
@@ -2205,21 +2402,22 @@ public partial class PlayerController : CharacterBody3D,
// Manage gameplay systems
MantleSystem.ProcessMantle(_grounded.Active);
HandleEnemyTargeting();
// Manage dash target and tutorial specific stuff
// if (WeaponSystem.InHandState.Active && !_aiming.Active && TutorialDone)
// {
// DashIndicatorMesh.Visible = false;
// }
// if (!WeaponSystem.InHandState.Active && TutorialDone)
// {
// DashIndicatorMesh.Visible = true;
//
// DashIndicatorMeshCylinder.Height = WeaponSystem.GlobalPosition.DistanceTo(GlobalPosition) * 2;
// DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition);
// }
}
// private float _oldMana = 100;
public override void _Process(double delta)
{
// Manage head and camera movement
LookAround(delta);
EffectsManager.UpdateEffects(delta);
// TODO: change for actual Cue
// var currentMana = Attributes["PlayerAttributeSet.Mana"].CurrentValue;
// if (Mathf.Abs(currentMana - _oldMana) > Mathf.Epsilon)
// PlayerUi.OnManaChanged(currentMana);
// _oldMana = currentMana;
}
///////////////////////////
// Hit Management ///////
///////////////////////////
@@ -2227,7 +2425,7 @@ public partial class PlayerController : CharacterBody3D,
private bool _isEnemyInDashAttackRange;
private Vector3 _targetHitLocation;
private Vector3 _targetLocation;
private Object _targetObject;
private Object? _targetObject;
public void HandleEnemyTargeting()
{
_isEnemyInDashAttackRange = false;
@@ -2235,7 +2433,7 @@ public partial class PlayerController : CharacterBody3D,
var enemyTargetState = PlayerUi.TargetState.NoTarget;
var positionOnScreen = Vector2.Zero;
if (DashSystem.CanDashThroughTarget && DashSystem.CollidedObject is ITargetable dashTarget)
if (DashSystem is { CanDashThroughTarget: true, CollidedObject: ITargetable dashTarget })
{
enemyTargetState = PlayerUi.TargetState.TargetWouldKill;
_targetLocation = dashTarget.GetTargetGlobalPosition();
@@ -2279,11 +2477,11 @@ public partial class PlayerController : CharacterBody3D,
if (IsInvincible)
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
var finalDamage = CDamageable.TakeDamage(damageRecord);
var finalDamage = CDamageable!.TakeDamage(damageRecord);
DamageTaken?.Invoke(this, finalDamage);
HeadSystem.OnGetHit();
_audioStream!.SwitchToClipByName("damage_taken");
_audioStream.SwitchToClipByName("damage_taken");
TriggerHitstop();
OnHitInvincibility();
@@ -2292,7 +2490,7 @@ public partial class PlayerController : CharacterBody3D,
public DamageRecord ComputeDamage(DamageRecord damageRecord)
{
return CDamageable.ComputeDamage(damageRecord);
return CDamageable!.ComputeDamage(damageRecord);
}
public void OnHitInvincibility()
@@ -2305,24 +2503,24 @@ public partial class PlayerController : CharacterBody3D,
{
_attackCooldown.Start();
HeadSystem.OnHit();
_audioStream!.SwitchToClipByName("attacks");
_audioStream.SwitchToClipByName("attacks");
}
public void OnStandardParryStarted()
{
_attackCooldown.Start();
HeadSystem.OnParry();
_audioStream!.SwitchToClipByName("parry");
_audioStream.SwitchToClipByName("parry");
}
private PhysicsDirectSpaceState3D _spaceState;
private PhysicsDirectSpaceState3D _spaceState = null!;
public void StartDashAction(bool isParry)
{
if (isParry) HeadSystem.OnParry();
else HeadSystem.OnHit();
var streamName = isParry ? "parry" : "attacks";
_audioStream!.SwitchToClipByName(streamName);
_audioStream.SwitchToClipByName(streamName);
IsInvincible = true;
var plannedDashLocation = _targetLocation + Vector3.Down*_playerHeight/2;
@@ -2452,7 +2650,7 @@ public partial class PlayerController : CharacterBody3D,
_hitEnemies.Clear();
HeadSystem.OnHitTarget();
_audioStream!.SwitchToClipByName("hits");
_audioStream.SwitchToClipByName("hits");
TriggerHitstop();
}
@@ -2469,19 +2667,18 @@ public partial class PlayerController : CharacterBody3D,
}
public HealthChangedRecord ReduceHealth(IDamageable source, DamageRecord damageRecord)
{
GD.Print("That's NOT fine");
var record = CHealth.ReduceHealth(source, damageRecord);
var record = CHealth!.ReduceHealth(source, damageRecord);
HealthChanged?.Invoke(this, record);
return record;
}
public void RegisterKnockback(KnockbackRecord knockbackRecord)
{
CKnockback.RegisterKnockback(knockbackRecord);
CKnockback!.RegisterKnockback(knockbackRecord);
}
public Vector3 ComputeKnockback()
{
var kb = CKnockback.ComputeKnockback();
var kb = CKnockback!.ComputeKnockback();
return kb;
}
@@ -2500,10 +2697,9 @@ public partial class PlayerController : CharacterBody3D,
IsInvincible = false;
}
// Sound
public void OnFootStepped()
{
_audioStream!.SwitchToClipByName("footsteps");
_audioStream.SwitchToClipByName("footsteps");
}
}

View File

@@ -4,8 +4,10 @@ using System;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_heart.png")]
public partial class Healthbar : ProgressBar
{
private Timer _damageCatchUpTimer;
private ProgressBar _damagedHealth;
private Timer _damageCatchUpTimer = null!;
private ProgressBar _damagedHealth = null!;
[Export] public StyleBox? BarStyle;
private float _currentHealth;
public float CurrentHealth
@@ -21,6 +23,9 @@ public partial class Healthbar : ProgressBar
_damageCatchUpTimer.Timeout += OnDamageCatchUp;
Visible = false;
if (BarStyle != null)
AddThemeStyleboxOverride("fill", BarStyle);
}
public void Initialize(float initialHealth)

View File

@@ -5,7 +5,7 @@
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0sgot"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0k5hr"]
bg_color = Color(0.698864, 0.047356047, 0, 1)
bg_color = Color(0.69803923, 0.047058824, 0, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0sgot"]
bg_color = Color(0.14767182, 0.14767182, 0.14767176, 1)

View File

@@ -1 +0,0 @@
extends "res://tools/generate_collisions.gd"

View File

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

View File

@@ -18,17 +18,17 @@ public class DashSystemUnitTest
_dashSystem.DashCast3D = new ShapeCast3D();
_dashSystem.AddChild(_dashSystem.DashCast3D);
_dashSystem._dashCastDrop = new ShapeCast3D();
_dashSystem.AddChild(_dashSystem._dashCastDrop);
_dashSystem.DashCastDrop = new ShapeCast3D();
_dashSystem.AddChild(_dashSystem.DashCastDrop);
_dashSystem._dashTarget = new MeshInstance3D();
_dashSystem.AddChild(_dashSystem._dashTarget);
_dashSystem.DashTarget = new MeshInstance3D();
_dashSystem.AddChild(_dashSystem.DashTarget);
_dashSystem._dashDropIndicator = new MeshInstance3D();
_dashSystem.AddChild(_dashSystem._dashDropIndicator);
_dashSystem.DashDropIndicator = new MeshInstance3D();
_dashSystem.AddChild(_dashSystem.DashDropIndicator);
_dashSystem._dashDropLocationIndicator = new MeshInstance3D();
_dashSystem.AddChild(_dashSystem._dashDropLocationIndicator);
_dashSystem.DashDropLocationIndicator = new MeshInstance3D();
_dashSystem.AddChild(_dashSystem.DashDropLocationIndicator);
}
[AfterTest]
@@ -41,15 +41,15 @@ public class DashSystemUnitTest
public void TestStopPreparingDash()
{
_dashSystem.CanDashThroughTarget = true;
_dashSystem._dashTarget.Visible = true;
_dashSystem._dashDropIndicator.Visible = true;
_dashSystem._dashDropLocationIndicator.Visible = true;
_dashSystem.DashTarget.Visible = true;
_dashSystem.DashDropIndicator.Visible = true;
_dashSystem.DashDropLocationIndicator.Visible = true;
_dashSystem.StopPreparingDash();
AssertBool(_dashSystem.CanDashThroughTarget).IsFalse();
AssertBool(_dashSystem._dashTarget.Visible).IsFalse();
AssertBool(_dashSystem._dashDropIndicator.Visible).IsFalse();
AssertBool(_dashSystem._dashDropLocationIndicator.Visible).IsFalse();
AssertBool(_dashSystem.DashTarget.Visible).IsFalse();
AssertBool(_dashSystem.DashDropIndicator.Visible).IsFalse();
AssertBool(_dashSystem.DashDropLocationIndicator.Visible).IsFalse();
}
}

View File

@@ -14,17 +14,20 @@ public class HeadSystemUnitTest
public void SetupTest()
{
_head = new HeadSystem();
_head._camera = new Camera3D();
_head.AddChild(_head._camera);
_head.Camera = new Camera3D();
_head.AddChild(_head.Camera);
_head._cameraAnchor = new Marker3D();
_head.AddChild(_head._cameraAnchor);
// _head._cameraAnchor = new Marker3D();
_head.AddChild(_head.CameraAnchor);
_head._fpRig = new Node3D();
_head.AddChild(_head._fpRig);
_head._fpDisplacedRig = new Node3D();
_head.AddChild(_head._fpDisplacedRig);
_head.FpRig = new Node3D();
_head.AddChild(_head.FpRig);
_head.CameraAnchor = new Node3D();
_head.AddChild(_head.CameraAnchor);
_head.RightHandedWeapon = new Node3D();
_head.AddChild(_head.RightHandedWeapon);
_head.LeftHandedWeapon = new Node3D();
_head.AddChild(_head.LeftHandedWeapon);
}
[AfterTest]

View File

@@ -15,8 +15,8 @@ public class PlayerControllerUnitTest
public void SetupTest()
{
_player = new PlayerController();
_player._targetSpeed = 7.0f;
_player._gravity = 9.8f;
_player.TargetSpeed = 7.0f;
_player.Gravity = 9.8f;
var rHealth = new RHealth(100.0f);
_player.RHealth = rHealth;
@@ -99,7 +99,7 @@ public class PlayerControllerUnitTest
{
var mockUi = new PlayerUi();
var dashIcons = new TextureRect[3] { new TextureRect(), new TextureRect(), new TextureRect() };
mockUi._dashIcons = dashIcons;
mockUi.DashIcons = dashIcons;
_player.PlayerUi = mockUi;
@@ -113,9 +113,9 @@ public class PlayerControllerUnitTest
[TestCase]
public void TestDashCooldownTimeout()
{
_player._canDash = false;
_player.CanDash = false;
_player.DashCooldownTimeout();
AssertBool(_player._canDash).IsTrue();
AssertBool(_player.CanDash).IsTrue();
}
[TestCase]

View File

@@ -1,3 +0,0 @@
{
"$schema": "https://xunit.net/schema/current/xunit.runner.schema.json"
}