Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3a21f00528 | |||
| 22e8c27878 | |||
| 6c4454848a | |||
| 175e67d2d6 | |||
| ab69fa9323 |
@@ -105,6 +105,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir -v -p build/windows
|
mkdir -v -p build/windows
|
||||||
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
|
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
|
||||||
|
ls -la build/windows
|
||||||
|
|
||||||
# - name: Setup Butler
|
# - name: Setup Butler
|
||||||
# shell: bash
|
# shell: bash
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir -v -p build/windows
|
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
|
${{ 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
|
zip -r Windows.zip build/windows
|
||||||
- name: Upload Windows to itch.io
|
- name: Upload Windows to itch.io
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -79,7 +80,7 @@ jobs:
|
|||||||
mkdir -v -p build/windowsArm
|
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
|
${{ 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
|
zip -r WindowsArm.zip build/windowsArm
|
||||||
- name: Upload Windows to itch.io
|
- name: Upload Windows ARM to itch.io
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
|
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
|
||||||
@@ -94,7 +95,7 @@ jobs:
|
|||||||
mkdir -v -p build/linux
|
mkdir -v -p build/linux
|
||||||
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
|
${{ 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
|
zip -r Linux.zip build/linux
|
||||||
- name: Upload Windows to itch.io
|
- name: Upload Linux to itch.io
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
|
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
|
||||||
@@ -109,7 +110,7 @@ jobs:
|
|||||||
mkdir -v -p build/mac
|
mkdir -v -p build/mac
|
||||||
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
|
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
|
||||||
zip -r Mac.zip build/mac
|
zip -r Mac.zip build/mac
|
||||||
- name: Upload Windows to itch.io
|
- name: Upload Mac to itch.io
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
|
BUTLER_API_KEY: ${{ secrets.BUTLER_TOKEN }}
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -20,6 +20,7 @@
|
|||||||
*.suo
|
*.suo
|
||||||
*.user
|
*.user
|
||||||
_ReSharper.*
|
_ReSharper.*
|
||||||
|
*.DotSettings.user
|
||||||
bin
|
bin
|
||||||
obj
|
obj
|
||||||
packages
|
packages
|
||||||
|
|||||||
@@ -125,8 +125,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="addons\" />
|
<Folder Include="addons\" />
|
||||||
<Folder Include="tests\components\" />
|
|
||||||
<Folder Include="tests\enemies\" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="RustyOptions" Version="0.10.1" />
|
<PackageReference Include="RustyOptions" Version="0.10.1" />
|
||||||
|
|||||||
@@ -1,15 +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/=22FEBE6E_002D769C_002D4716_002DA687_002DA0AC8F3EF84A_002Fd_003Ascenes_002Fd_003Aplayer_005Fcontroller_002Fd_003Ascripts_002Ff_003APlayerController_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
|
||||||
<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"><SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from Solution" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
|
|
||||||
<Solution />
|
|
||||||
</SessionState></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>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -46,7 +46,7 @@ kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
|
|||||||
rm -rf \"{temp_dir}\""
|
rm -rf \"{temp_dir}\""
|
||||||
dotnet/include_scripts_content=false
|
dotnet/include_scripts_content=false
|
||||||
dotnet/include_debug_symbols=true
|
dotnet/include_debug_symbols=true
|
||||||
dotnet/embed_build_outputs=false
|
dotnet/embed_build_outputs=true
|
||||||
texture_format/bptc=true
|
texture_format/bptc=true
|
||||||
texture_format/s3tc=true
|
texture_format/s3tc=true
|
||||||
texture_format/etc=false
|
texture_format/etc=false
|
||||||
@@ -125,7 +125,7 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
|
|||||||
Remove-Item -Recurse -Force '{temp_dir}'"
|
Remove-Item -Recurse -Force '{temp_dir}'"
|
||||||
dotnet/include_scripts_content=false
|
dotnet/include_scripts_content=false
|
||||||
dotnet/include_debug_symbols=true
|
dotnet/include_debug_symbols=true
|
||||||
dotnet/embed_build_outputs=false
|
dotnet/embed_build_outputs=true
|
||||||
texture_format/bptc=true
|
texture_format/bptc=true
|
||||||
texture_format/s3tc=true
|
texture_format/s3tc=true
|
||||||
texture_format/etc=false
|
texture_format/etc=false
|
||||||
@@ -472,4 +472,4 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
|
|||||||
Remove-Item -Recurse -Force '{temp_dir}'"
|
Remove-Item -Recurse -Force '{temp_dir}'"
|
||||||
dotnet/include_scripts_content=false
|
dotnet/include_scripts_content=false
|
||||||
dotnet/include_debug_symbols=true
|
dotnet/include_debug_symbols=true
|
||||||
dotnet/embed_build_outputs=false
|
dotnet/embed_build_outputs=true
|
||||||
|
|||||||
@@ -451,6 +451,7 @@ MovementInputs = SubResource("Resource_pxspk")
|
|||||||
HealthInputs = ExtResource("27_lgco8")
|
HealthInputs = ExtResource("27_lgco8")
|
||||||
DamageInputs = ExtResource("28_51ivn")
|
DamageInputs = ExtResource("28_51ivn")
|
||||||
Target = NodePath("../Player")
|
Target = NodePath("../Player")
|
||||||
|
IsActiveOnStart = false
|
||||||
|
|
||||||
[node name="Spawner2" parent="." unique_id=717610670 node_paths=PackedStringArray("Target") instance=ExtResource("24_qwuk2")]
|
[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)
|
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")
|
HealthInputs = ExtResource("31_5hbxb")
|
||||||
DamageInputs = ExtResource("32_hmdts")
|
DamageInputs = ExtResource("32_hmdts")
|
||||||
Target = NodePath("../Player")
|
Target = NodePath("../Player")
|
||||||
|
IsActiveOnStart = false
|
||||||
|
|
||||||
[connection signal="timeout" from="TutorialController/WaitToShowBlockingTuto" to="TutorialController" method="_show_weapon_tutorial"]
|
[connection signal="timeout" from="TutorialController/WaitToShowBlockingTuto" to="TutorialController" method="_show_weapon_tutorial"]
|
||||||
[connection signal="body_exited" from="TutoTriggers/TriggerTutoMove" to="TutorialController" method="hide_tutorials"]
|
[connection signal="body_exited" from="TutoTriggers/TriggerTutoMove" to="TutorialController" method="hide_tutorials"]
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.interfaces;
|
|
||||||
using Movementtests.systems.damage;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class DamageComponentUnitTest
|
|
||||||
{
|
|
||||||
[TestCase]
|
|
||||||
public void DamageModifierAppliesWhenTypeMatches()
|
|
||||||
{
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
var modifier = new RDamageModifier(EDamageTypes.Normal, 2.0f);
|
|
||||||
var signalTriggered = false;
|
|
||||||
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
||||||
|
|
||||||
var result = modifier.TakeDamage(input);
|
|
||||||
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(20.0f);
|
|
||||||
AssertBool(signalTriggered).IsTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void DamageModifierIgnoresWhenTypeDifferent()
|
|
||||||
{
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
var modifier = new RDamageModifier(EDamageTypes.Fire, 3.0f);
|
|
||||||
var signalTriggered = false;
|
|
||||||
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
||||||
|
|
||||||
var result = modifier.TakeDamage(input);
|
|
||||||
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f);
|
|
||||||
AssertBool(signalTriggered).IsFalse(); // No damage actually taken
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void DamageableSumsAllModifiers()
|
|
||||||
{
|
|
||||||
var mod1 = new RDamageModifier(EDamageTypes.Normal, 1.0f);
|
|
||||||
var mod2 = new RDamageModifier(EDamageTypes.Normal, 0.5f);
|
|
||||||
|
|
||||||
var damageable = new CDamageable();
|
|
||||||
damageable.DamageModifiers = new[] { mod1, mod2 };
|
|
||||||
var signalTriggered = false;
|
|
||||||
damageable.DamageTaken += (_, _) => signalTriggered = true;
|
|
||||||
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
var result = damageable.TakeDamage(input);
|
|
||||||
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(15.0f);
|
|
||||||
AssertBool(signalTriggered).IsTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void ComputeDamageModifierAppliesWhenTypeMatches()
|
|
||||||
{
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
var modifier = new RDamageModifier(EDamageTypes.Normal, 2.0f);
|
|
||||||
var signalTriggered = false;
|
|
||||||
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
||||||
|
|
||||||
var result = modifier.ComputeDamage(input);
|
|
||||||
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(20.0f);
|
|
||||||
AssertBool(signalTriggered).IsFalse();
|
|
||||||
}
|
|
||||||
[TestCase]
|
|
||||||
public void ComputeDamageModifierIgnoresWhenTypeDifferent()
|
|
||||||
{
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
var modifier = new RDamageModifier(EDamageTypes.Fire, 3.0f);
|
|
||||||
var signalTriggered = false;
|
|
||||||
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
||||||
|
|
||||||
var result = modifier.ComputeDamage(input);
|
|
||||||
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f);
|
|
||||||
AssertBool(signalTriggered).IsFalse();
|
|
||||||
}
|
|
||||||
[TestCase]
|
|
||||||
public void ComputeDamageableSumsAllModifiers()
|
|
||||||
{
|
|
||||||
var mod1 = new RDamageModifier(EDamageTypes.Normal, 1.0f);
|
|
||||||
var mod2 = new RDamageModifier(EDamageTypes.Normal, 0.5f);
|
|
||||||
|
|
||||||
var cDamageable = new CDamageable();
|
|
||||||
cDamageable.DamageModifiers = new[] { mod1, mod2 };
|
|
||||||
var signalTriggered = false;
|
|
||||||
cDamageable.DamageTaken += (_, _) => signalTriggered = true;
|
|
||||||
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
var result = cDamageable.ComputeDamage(input);
|
|
||||||
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(15.0f);
|
|
||||||
AssertBool(signalTriggered).IsFalse();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://db6rva7uccppc
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.interfaces;
|
|
||||||
using Movementtests.systems.damage;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class HealthComponentUnitTest
|
|
||||||
{
|
|
||||||
[TestCase]
|
|
||||||
public void ReadyInitializesCurrentHealth()
|
|
||||||
{
|
|
||||||
var cHealth = new CHealth();
|
|
||||||
cHealth.RHealth = new RHealth(150.0f);
|
|
||||||
cHealth._Ready();
|
|
||||||
AssertFloat(cHealth.CurrentHealth).IsEqual(150.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void ReduceHealthDecreasesAndDoesNotDeplete()
|
|
||||||
{
|
|
||||||
var cHealth = new CHealth();
|
|
||||||
cHealth.RHealth = new RHealth(100.0f);
|
|
||||||
cHealth.CurrentHealth = 100.0f;
|
|
||||||
|
|
||||||
var damage = new DamageRecord(Vector3.Zero, new RDamage(25.0f, EDamageTypes.Normal));
|
|
||||||
var record = cHealth.ReduceHealth(source: null!, damageRecord: damage);
|
|
||||||
|
|
||||||
AssertFloat(cHealth.CurrentHealth).IsEqual(75.0f);
|
|
||||||
AssertFloat(record.CurrentHealth).IsEqual(75.0f);
|
|
||||||
AssertFloat(record.PreviousHealth).IsEqual(100.0f);
|
|
||||||
AssertFloat(record.MaxHealth).IsEqual(100.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void ReduceHealthTriggersDepletionToZero()
|
|
||||||
{
|
|
||||||
var cHealth = new CHealth();
|
|
||||||
cHealth.RHealth = new RHealth(50.0f);
|
|
||||||
cHealth.CurrentHealth = 50.0f;
|
|
||||||
|
|
||||||
bool depleted = false;
|
|
||||||
cHealth.HealthDepleted += _ => depleted = true;
|
|
||||||
|
|
||||||
var damage = new DamageRecord(Vector3.Zero, new RDamage(100.0f, EDamageTypes.Normal));
|
|
||||||
var record = cHealth.ReduceHealth(source: null!, damageRecord: damage);
|
|
||||||
|
|
||||||
AssertBool(depleted).IsTrue();
|
|
||||||
AssertFloat(cHealth.CurrentHealth).IsEqual(0.0f);
|
|
||||||
AssertFloat(record.CurrentHealth).IsEqual(-50.0f);
|
|
||||||
AssertFloat(record.MaxHealth).IsEqual(50.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://bd52i51hncgmf
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.interfaces;
|
|
||||||
using Movementtests.systems.damage;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class KnockbackComponentUnitTest
|
|
||||||
{
|
|
||||||
[TestCase]
|
|
||||||
public void RegisterAndComputeKnockback()
|
|
||||||
{
|
|
||||||
var cKnock = new CKnockback();
|
|
||||||
cKnock.RKnockback = new RKnockback(2.0f);
|
|
||||||
cKnock.GlobalPosition = Vector3.Zero;
|
|
||||||
|
|
||||||
var damage = new DamageRecord(new Vector3(10, 0, 0), new RDamage(0, EDamageTypes.Normal));
|
|
||||||
var record = new KnockbackRecord(damage, 1.5f);
|
|
||||||
|
|
||||||
cKnock.RegisterKnockback(record);
|
|
||||||
var force = cKnock.ComputeKnockback();
|
|
||||||
|
|
||||||
// Direction from source(10,0,0) to target(0,0,0) is (-1,0,0), scaled by modifier(2) and multiplier(1.5) => (-3,0,0)
|
|
||||||
AssertVector(force).IsEqual(new Vector3(-3, 0, 0));
|
|
||||||
|
|
||||||
// Second call returns zero since internal state resets
|
|
||||||
var second = cKnock.ComputeKnockback();
|
|
||||||
AssertVector(second).IsEqual(Vector3.Zero);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://bv0eionbgbig5
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.interfaces;
|
|
||||||
using Movementtests.scenes.movement;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class MovementSystemUnitTest
|
|
||||||
{
|
|
||||||
[TestCase]
|
|
||||||
public void GroundedMovementAcceleratesAndAppliesGravity()
|
|
||||||
{
|
|
||||||
var move = new CGroundedMovement();
|
|
||||||
move.RMovement = new RMovement(speed: 10.0f, acceleration: 1.0f, gravityModifier: 0.5f, targetHeight: 0.0f);
|
|
||||||
move.WallInFrontRayCast = new RayCast3D();
|
|
||||||
//move.GlobalPosition = Vector3.Zero;
|
|
||||||
|
|
||||||
var inputs = new MovementInputs(
|
|
||||||
Velocity: Vector3.Zero,
|
|
||||||
TargetLocation: new Vector3(10, 0, 0),
|
|
||||||
isOnFloor: false,
|
|
||||||
gravity: Vector3.Down * 9.8f,
|
|
||||||
delta: 1.0
|
|
||||||
);
|
|
||||||
|
|
||||||
var v = move.ComputeVelocity(inputs);
|
|
||||||
|
|
||||||
AssertVector(v).IsEqualApprox(new Vector3(10, -4.9f, 0), new Vector3(0.001f, 0.001f, 0.001f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://cofj5s4x74ay
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.interfaces;
|
|
||||||
using Movementtests.systems.damage;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class EnemyUnitTest
|
|
||||||
{
|
|
||||||
[TestCase]
|
|
||||||
public void ComputeDamageNoComponent()
|
|
||||||
{
|
|
||||||
var enemy = new Enemy();
|
|
||||||
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
||||||
|
|
||||||
var result = enemy.ComputeDamage(input);
|
|
||||||
AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void Unstun()
|
|
||||||
{
|
|
||||||
var enemy = new Enemy();
|
|
||||||
enemy.IsStunned = true;
|
|
||||||
enemy.Unstun();
|
|
||||||
AssertBool(enemy.IsStunned).IsFalse();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://cojxgcs6xqqoq
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.systems;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class DashSystemUnitTest
|
|
||||||
{
|
|
||||||
private DashSystem _dashSystem;
|
|
||||||
|
|
||||||
[BeforeTest]
|
|
||||||
public void SetupTest()
|
|
||||||
{
|
|
||||||
_dashSystem = new DashSystem();
|
|
||||||
|
|
||||||
_dashSystem.DashCast3D = new ShapeCast3D();
|
|
||||||
_dashSystem.AddChild(_dashSystem.DashCast3D);
|
|
||||||
|
|
||||||
_dashSystem.DashCastDrop = new ShapeCast3D();
|
|
||||||
_dashSystem.AddChild(_dashSystem.DashCastDrop);
|
|
||||||
|
|
||||||
_dashSystem.DashTarget = new MeshInstance3D();
|
|
||||||
_dashSystem.AddChild(_dashSystem.DashTarget);
|
|
||||||
|
|
||||||
_dashSystem.DashDropIndicator = new MeshInstance3D();
|
|
||||||
_dashSystem.AddChild(_dashSystem.DashDropIndicator);
|
|
||||||
|
|
||||||
_dashSystem.DashDropLocationIndicator = new MeshInstance3D();
|
|
||||||
_dashSystem.AddChild(_dashSystem.DashDropLocationIndicator);
|
|
||||||
}
|
|
||||||
|
|
||||||
[AfterTest]
|
|
||||||
public void CleanupTest()
|
|
||||||
{
|
|
||||||
_dashSystem?.Free();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestStopPreparingDash()
|
|
||||||
{
|
|
||||||
_dashSystem.CanDashThroughTarget = 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://pv570go4cxws
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.systems;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class HeadSystemUnitTest
|
|
||||||
{
|
|
||||||
private HeadSystem _head;
|
|
||||||
|
|
||||||
[BeforeTest]
|
|
||||||
public void SetupTest()
|
|
||||||
{
|
|
||||||
_head = new HeadSystem();
|
|
||||||
_head._camera = new Camera3D();
|
|
||||||
_head.AddChild(_head._camera);
|
|
||||||
|
|
||||||
_head._cameraAnchor = new Marker3D();
|
|
||||||
_head.AddChild(_head._cameraAnchor);
|
|
||||||
|
|
||||||
_head._fpRig = new Node3D();
|
|
||||||
_head.AddChild(_head._fpRig);
|
|
||||||
|
|
||||||
_head._fpDisplacedRig = new Node3D();
|
|
||||||
_head.AddChild(_head._fpDisplacedRig);
|
|
||||||
}
|
|
||||||
|
|
||||||
[AfterTest]
|
|
||||||
public void CleanupTest()
|
|
||||||
{
|
|
||||||
_head?.Free();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestResetHeadBobbing()
|
|
||||||
{
|
|
||||||
_head._bobbingAccumulator = 10.0f;
|
|
||||||
_head.ResetHeadBobbing();
|
|
||||||
AssertFloat(_head._bobbingAccumulator).IsEqual(0.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestComputeHowMuchInputForward()
|
|
||||||
{
|
|
||||||
Vector3 forwardInput = new Vector3(0, 0, -1);
|
|
||||||
AssertFloat(_head.ComputeHowMuchInputForward(forwardInput)).IsEqual(1.0f);
|
|
||||||
|
|
||||||
Vector3 backwardInput = new Vector3(0, 0, 1);
|
|
||||||
AssertFloat(_head.ComputeHowMuchInputForward(backwardInput)).IsEqual(-1.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestComputeHowMuchInputSideways()
|
|
||||||
{
|
|
||||||
Vector3 rightInput = new Vector3(1, 0, 0);
|
|
||||||
AssertFloat(_head.ComputeHowMuchInputSideways(rightInput)).IsEqual(1.0f);
|
|
||||||
|
|
||||||
Vector3 leftInput = new Vector3(-1, 0, 0);
|
|
||||||
AssertFloat(_head.ComputeHowMuchInputSideways(leftInput)).IsEqual(-1.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestGetForwardHorizontalVector()
|
|
||||||
{
|
|
||||||
Vector3 forward = _head.GetForwardHorizontalVector();
|
|
||||||
AssertVector(forward).IsEqualApprox(Vector3.Back, new Vector3(0.001f, 0.001f, 0.001f));
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestLookAroundRotation()
|
|
||||||
{
|
|
||||||
var inputs = new HeadSystem.CameraParameters(
|
|
||||||
Delta: 0.016,
|
|
||||||
LookDir: new Vector2(1, 0),
|
|
||||||
PlayerInput: Vector3.Zero,
|
|
||||||
PlayerVelocity: Vector3.Zero,
|
|
||||||
WallContactPoint: Vector3.Zero,
|
|
||||||
SensitivitMultiplier: 1.0f,
|
|
||||||
WithCameraJitter: false,
|
|
||||||
WithCameraBobbing: false,
|
|
||||||
BobbingMultiplier: 1.0f,
|
|
||||||
FovMultiplier: 1.0f
|
|
||||||
);
|
|
||||||
|
|
||||||
float initialY = _head.Rotation.Y;
|
|
||||||
_head.LookAround(inputs);
|
|
||||||
AssertFloat(_head.Rotation.Y).IsEqual(initialY + 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://bp0xn8k3dmfkg
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.interfaces;
|
|
||||||
using Movementtests.systems.damage;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class PlayerControllerUnitTest
|
|
||||||
{
|
|
||||||
private PlayerController _player;
|
|
||||||
|
|
||||||
[BeforeTest]
|
|
||||||
public void SetupTest()
|
|
||||||
{
|
|
||||||
_player = new PlayerController();
|
|
||||||
_player.TargetSpeed = 7.0f;
|
|
||||||
_player.Gravity = 9.8f;
|
|
||||||
|
|
||||||
var rHealth = new RHealth(100.0f);
|
|
||||||
_player.RHealth = rHealth;
|
|
||||||
_player.CHealth = new CHealth { RHealth = rHealth, CurrentHealth = 100.0f };
|
|
||||||
}
|
|
||||||
|
|
||||||
[AfterTest]
|
|
||||||
public void CleanupTest()
|
|
||||||
{
|
|
||||||
_player?.Free();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestCalculateGravityForce()
|
|
||||||
{
|
|
||||||
_player.Weight = 3.0f;
|
|
||||||
// gravity is 9.8f
|
|
||||||
AssertFloat(_player.CalculateGravityForce()).IsEqualApprox(29.4f, 0.001f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestIsPlayerInputtingForward()
|
|
||||||
{
|
|
||||||
// Test Keyboard Input
|
|
||||||
_player.InputDeviceChanged(false);
|
|
||||||
_player.OnInputMoveKeyboard(Vector3.Forward);
|
|
||||||
AssertBool(_player.IsPlayerInputtingForward()).IsTrue();
|
|
||||||
|
|
||||||
_player.OnInputMoveKeyboard(Vector3.Back);
|
|
||||||
AssertBool(_player.IsPlayerInputtingForward()).IsFalse();
|
|
||||||
|
|
||||||
// Test Gamepad Input
|
|
||||||
_player.InputDeviceChanged(true);
|
|
||||||
_player.OnInputMove(new Vector3(0, 0, -1));
|
|
||||||
AssertBool(_player.IsPlayerInputtingForward()).IsTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestSetVerticalVelocity()
|
|
||||||
{
|
|
||||||
_player.Velocity = new Vector3(1, 0, 2);
|
|
||||||
_player.SetVerticalVelocity(5.0f);
|
|
||||||
AssertVector(_player.Velocity).IsEqual(new Vector3(1, 5, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestComputeHVelocityGround()
|
|
||||||
{
|
|
||||||
_player.Velocity = Vector3.Zero;
|
|
||||||
_player.AccelerationFloor = 10.0f;
|
|
||||||
|
|
||||||
float delta = 0.1f;
|
|
||||||
Vector3 newVelocity = _player.ComputeHVelocity(delta, _player.AccelerationFloor, _player.DecelerationFloor, Vector3.Forward);
|
|
||||||
AssertVector(newVelocity).IsEqual(new Vector3(0, 0, -7.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestComputeHVelocityAir()
|
|
||||||
{
|
|
||||||
_player.Velocity = new Vector3(5, 0, 0);
|
|
||||||
_player.AccelerationAir = 2.0f;
|
|
||||||
_player.DecelerationAir = 2.0f;
|
|
||||||
|
|
||||||
float delta = 0.5f;
|
|
||||||
Vector3 newVelocity = _player.ComputeHVelocity(delta, _player.AccelerationAir, _player.DecelerationAir, Vector3.Zero);
|
|
||||||
|
|
||||||
AssertVector(newVelocity).IsEqual(Vector3.Zero);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestReduceHealth()
|
|
||||||
{
|
|
||||||
var damageRecord = new DamageRecord(Vector3.Zero, new RDamage(25.0f, EDamageTypes.Normal));
|
|
||||||
_player.ReduceHealth(_player, damageRecord);
|
|
||||||
AssertFloat(_player.CHealth.CurrentHealth).IsEqual(75.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestEmpoweredActionsLeft()
|
|
||||||
{
|
|
||||||
var mockUi = new PlayerUi();
|
|
||||||
var dashIcons = new TextureRect[3] { new TextureRect(), new TextureRect(), new TextureRect() };
|
|
||||||
mockUi._dashIcons = dashIcons;
|
|
||||||
|
|
||||||
_player.PlayerUi = mockUi;
|
|
||||||
|
|
||||||
_player.EmpoweredActionsLeft = 2;
|
|
||||||
AssertInt(_player.EmpoweredActionsLeft).IsEqual(2);
|
|
||||||
AssertBool(dashIcons[0].Visible).IsTrue();
|
|
||||||
AssertBool(dashIcons[1].Visible).IsTrue();
|
|
||||||
AssertBool(dashIcons[2].Visible).IsFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestDashCooldownTimeout()
|
|
||||||
{
|
|
||||||
_player.CanDash = false;
|
|
||||||
_player.DashCooldownTimeout();
|
|
||||||
AssertBool(_player.CanDash).IsTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestGetInputLocalHDirection()
|
|
||||||
{
|
|
||||||
_player.InputDeviceChanged(false);
|
|
||||||
_player.OnInputMoveKeyboard(new Vector3(1, 0, 1));
|
|
||||||
|
|
||||||
Vector3 expected = new Vector3(1, 0, 1).Normalized();
|
|
||||||
AssertVector(_player.GetInputLocalHDirection()).IsEqualApprox(expected, new Vector3(0.001f, 0.001f, 0.001f));
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestComputeKnockback()
|
|
||||||
{
|
|
||||||
var cKnockback = new CKnockback();
|
|
||||||
cKnockback.RKnockback = new RKnockback(10.0f);
|
|
||||||
_player.CKnockback = cKnockback;
|
|
||||||
|
|
||||||
var damageRecord = new DamageRecord(new Vector3(10, 0, 0), new RDamage(0, EDamageTypes.Normal));
|
|
||||||
var knockbackRecord = new KnockbackRecord(damageRecord, 1.0f);
|
|
||||||
|
|
||||||
_player.GlobalPosition = Vector3.Zero;
|
|
||||||
cKnockback.GlobalPosition = Vector3.Zero;
|
|
||||||
|
|
||||||
_player.RegisterKnockback(knockbackRecord);
|
|
||||||
|
|
||||||
Vector3 knockback = cKnockback.ComputeKnockback();
|
|
||||||
AssertVector(knockback).IsEqual(new Vector3(-10, 0, 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://kmphtu0ovixi
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using Godot;
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
using Movementtests.systems;
|
|
||||||
using Movementtests.systems.damage;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class WeaponSystemUnitTest
|
|
||||||
{
|
|
||||||
private WeaponSystem _weapon;
|
|
||||||
|
|
||||||
[BeforeTest]
|
|
||||||
public void SetupTest()
|
|
||||||
{
|
|
||||||
_weapon = new WeaponSystem();
|
|
||||||
_weapon.RDamage = new RDamage(5.0f, EDamageTypes.Normal);
|
|
||||||
|
|
||||||
_weapon.WeaponMesh = new MeshInstance3D();
|
|
||||||
_weapon.AddChild(_weapon.WeaponMesh);
|
|
||||||
_weapon.WeaponLocationIndicator = new MeshInstance3D();
|
|
||||||
_weapon.AddChild(_weapon.WeaponLocationIndicator);
|
|
||||||
}
|
|
||||||
|
|
||||||
[AfterTest]
|
|
||||||
public void CleanupTest()
|
|
||||||
{
|
|
||||||
_weapon?.Free();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestWeaponLeftAndBackVisibility()
|
|
||||||
{
|
|
||||||
_weapon.Visible = false;
|
|
||||||
|
|
||||||
_weapon.WeaponLeft();
|
|
||||||
AssertBool(_weapon.Visible).IsTrue();
|
|
||||||
|
|
||||||
_weapon.WeaponBack();
|
|
||||||
AssertBool(_weapon.Visible).IsFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase]
|
|
||||||
public void TestThrowWeaponOnCurveSetsUnfrozen()
|
|
||||||
{
|
|
||||||
_weapon.Freeze = true;
|
|
||||||
_weapon.ThrowWeaponOnCurve();
|
|
||||||
AssertBool(_weapon.Freeze).IsFalse();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://vkv8aderakcb
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using Godot;
|
|
||||||
using GodotStateCharts;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class PlayerInteractionsTest
|
|
||||||
{
|
|
||||||
private ISceneRunner _runner;
|
|
||||||
private Node _scene;
|
|
||||||
private PlayerController _player;
|
|
||||||
|
|
||||||
private readonly float _tolerance = 0.01f;
|
|
||||||
private readonly Vector3 _vectorTolerance = new Vector3(0.01f, 0.01f, 0.01f);
|
|
||||||
|
|
||||||
[BeforeTest]
|
|
||||||
public void SetupTest()
|
|
||||||
{
|
|
||||||
_runner = ISceneRunner.Load("res://tests/player/interactions/player_interactions_scene.tscn");
|
|
||||||
|
|
||||||
_scene = _runner.Scene()!;
|
|
||||||
var player = _scene.FindChild("Player") as PlayerController;
|
|
||||||
_player = player!;
|
|
||||||
}
|
|
||||||
[AfterTest]
|
|
||||||
public void CleanupTest() {}
|
|
||||||
|
|
||||||
[TestCase("BaseLocation")]
|
|
||||||
public async Task PlayerMoveForward(string markerName)
|
|
||||||
{
|
|
||||||
var marker = _scene.FindChild(markerName) as Marker3D;
|
|
||||||
AssertObject(marker).IsNotNull();
|
|
||||||
_player.GlobalPosition = marker!.GlobalPosition;
|
|
||||||
await _runner.AwaitIdleFrame();
|
|
||||||
|
|
||||||
var startPos = _player.GlobalPosition;
|
|
||||||
|
|
||||||
_runner.SimulateKeyPress(Key.W);
|
|
||||||
await _runner.AwaitMillis(300);
|
|
||||||
_runner.SimulateKeyRelease(Key.W);
|
|
||||||
|
|
||||||
var endPos = _player.GlobalPosition;
|
|
||||||
var direction = startPos.DirectionTo(endPos);
|
|
||||||
AssertVector(direction).IsEqualApprox(Vector3.Forward, _vectorTolerance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://denedm5b8rmhh
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
[gd_scene format=3 uid="uid://l0lflvsjbyvs"]
|
|
||||||
|
|
||||||
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="1_dv0re"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://scenes/player_controller/PlayerController.tscn" id="2_52d52"]
|
|
||||||
|
|
||||||
[node name="PlayerMovementScene" type="Node3D" unique_id=231040688]
|
|
||||||
|
|
||||||
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=241909240]
|
|
||||||
use_collision = true
|
|
||||||
collision_layer = 256
|
|
||||||
collision_mask = 65553
|
|
||||||
|
|
||||||
[node name="Ground" type="CSGBox3D" parent="CSGCombiner3D" unique_id=432200143]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, -0.5, -3.25)
|
|
||||||
use_collision = true
|
|
||||||
collision_layer = 256
|
|
||||||
collision_mask = 65553
|
|
||||||
size = Vector3(1000, 1, 1000)
|
|
||||||
material = ExtResource("1_dv0re")
|
|
||||||
|
|
||||||
[node name="Ground2" type="CSGBox3D" parent="CSGCombiner3D" unique_id=854660236]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.75, 0.5, -1.75)
|
|
||||||
use_collision = true
|
|
||||||
collision_layer = 256
|
|
||||||
collision_mask = 65553
|
|
||||||
size = Vector3(1.5, 1, 1.5)
|
|
||||||
material = ExtResource("1_dv0re")
|
|
||||||
|
|
||||||
[node name="Player" parent="." unique_id=709076448 instance=ExtResource("2_52d52")]
|
|
||||||
TutorialDone = true
|
|
||||||
|
|
||||||
[node name="BaseLocation" type="Marker3D" parent="." unique_id=1793710692]
|
|
||||||
|
|
||||||
[node name="MantleLocation1" type="Marker3D" parent="." unique_id=550080845]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.75, 0, 0)
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using Godot;
|
|
||||||
using GodotStateCharts;
|
|
||||||
|
|
||||||
namespace Movementtests.tests;
|
|
||||||
|
|
||||||
using GdUnit4;
|
|
||||||
using static GdUnit4.Assertions;
|
|
||||||
|
|
||||||
[TestSuite, RequireGodotRuntime]
|
|
||||||
public class PlayerMovementTest
|
|
||||||
{
|
|
||||||
private ISceneRunner _runner;
|
|
||||||
private Node _scene;
|
|
||||||
private PlayerController _player;
|
|
||||||
|
|
||||||
private readonly float _tolerance = 0.01f;
|
|
||||||
private readonly Vector3 _vectorTolerance = new Vector3(0.01f, 0.01f, 0.01f);
|
|
||||||
|
|
||||||
[Before]
|
|
||||||
public void Setup() {}
|
|
||||||
[After]
|
|
||||||
public void Cleanup() {}
|
|
||||||
|
|
||||||
[BeforeTest]
|
|
||||||
public void SetupTest()
|
|
||||||
{
|
|
||||||
_runner = ISceneRunner.Load("res://tests/player/movement/player_movement_scene.tscn");
|
|
||||||
|
|
||||||
_scene = _runner.Scene()!;
|
|
||||||
var player = _scene.FindChild("Player") as PlayerController;
|
|
||||||
_player = player!;
|
|
||||||
}
|
|
||||||
[AfterTest]
|
|
||||||
public void CleanupTest() {}
|
|
||||||
|
|
||||||
[TestCase("BaseLocation")]
|
|
||||||
public async Task PlayerMoveForward(string markerName)
|
|
||||||
{
|
|
||||||
var marker = _scene.FindChild(markerName) as Marker3D;
|
|
||||||
AssertObject(marker).IsNotNull();
|
|
||||||
_player.GlobalPosition = marker!.GlobalPosition;
|
|
||||||
await _runner.AwaitIdleFrame();
|
|
||||||
|
|
||||||
var startPos = _player.GlobalPosition;
|
|
||||||
|
|
||||||
_runner.SimulateKeyPress(Key.W);
|
|
||||||
await _runner.AwaitMillis(100);
|
|
||||||
_runner.SimulateKeyRelease(Key.W);
|
|
||||||
|
|
||||||
var endPos = _player.GlobalPosition;
|
|
||||||
var direction = startPos.DirectionTo(endPos);
|
|
||||||
AssertVector(direction).IsEqualApprox(Vector3.Forward, _vectorTolerance);
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase("BaseLocation")]
|
|
||||||
public async Task PlayerJump(string markerName)
|
|
||||||
{
|
|
||||||
var marker = _scene.FindChild(markerName) as Marker3D;
|
|
||||||
AssertObject(marker).IsNotNull();
|
|
||||||
_player.GlobalPosition = marker!.GlobalPosition;
|
|
||||||
await _runner.AwaitIdleFrame();
|
|
||||||
|
|
||||||
var startPos = _player.GlobalPosition;
|
|
||||||
|
|
||||||
_runner.SimulateKeyPress(Key.Space);
|
|
||||||
await _runner.AwaitIdleFrame();
|
|
||||||
|
|
||||||
var jumping = StateChartState.Of(_player.GetNode("StateChart/Root/Movement/Jump"));
|
|
||||||
AssertBool(jumping.Active).IsTrue();
|
|
||||||
|
|
||||||
_runner.SimulateKeyRelease(Key.Space);
|
|
||||||
await _runner.AwaitIdleFrame();
|
|
||||||
var endPos = _player.GlobalPosition;
|
|
||||||
var direction = startPos.DirectionTo(endPos);
|
|
||||||
AssertVector(direction).IsEqualApprox(Vector3.Up, _vectorTolerance);
|
|
||||||
AssertVector(_player.Velocity.Normalized()).IsEqualApprox(Vector3.Up, _vectorTolerance);
|
|
||||||
|
|
||||||
await _runner.AwaitMillis(600);
|
|
||||||
endPos = _player.GlobalPosition;
|
|
||||||
AssertVector(endPos - startPos).IsEqualApprox(Vector3.Zero, _vectorTolerance);
|
|
||||||
|
|
||||||
var grounded = StateChartState.Of(_player.GetNode("StateChart/Root/Movement/Grounded"));
|
|
||||||
AssertBool(grounded.Active).IsTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestCase("MantleLocation1")]
|
|
||||||
public async Task PlayerMantle(string markerName)
|
|
||||||
{
|
|
||||||
var marker = _scene.FindChild(markerName) as Marker3D;
|
|
||||||
AssertObject(marker).IsNotNull();
|
|
||||||
_player.GlobalPosition = marker!.GlobalPosition;
|
|
||||||
await _runner.AwaitMillis(100);
|
|
||||||
|
|
||||||
var startPos = _player.GlobalPosition;
|
|
||||||
|
|
||||||
_runner.SimulateKeyPress(Key.Space);
|
|
||||||
await _runner.AwaitMillis(100);
|
|
||||||
var mantling = StateChartState.Of(_player.GetNode("StateChart/Root/Movement/Mantling"));
|
|
||||||
AssertBool(mantling.Active).IsTrue();
|
|
||||||
|
|
||||||
_runner.SimulateKeyRelease(Key.Space);
|
|
||||||
await _runner.AwaitMillis(500);
|
|
||||||
|
|
||||||
var endPos = _player.GlobalPosition;
|
|
||||||
AssertFloat((endPos - startPos).Length()).IsGreater(_tolerance);
|
|
||||||
AssertFloat(endPos.Y).IsEqualApprox(1.0f, _tolerance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://x5pj2ymam2gg
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
[gd_scene format=3 uid="uid://i8kb38q7bdfk"]
|
|
||||||
|
|
||||||
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="1_bdfhg"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://scenes/player_controller/PlayerController.tscn" id="1_hg1sy"]
|
|
||||||
|
|
||||||
[node name="PlayerMovementScene" type="Node3D" unique_id=231040688]
|
|
||||||
|
|
||||||
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=241909240]
|
|
||||||
use_collision = true
|
|
||||||
collision_layer = 256
|
|
||||||
collision_mask = 65553
|
|
||||||
|
|
||||||
[node name="Ground" type="CSGBox3D" parent="CSGCombiner3D" unique_id=432200143]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, -0.5, -3.25)
|
|
||||||
use_collision = true
|
|
||||||
collision_layer = 256
|
|
||||||
collision_mask = 65553
|
|
||||||
size = Vector3(1000, 1, 1000)
|
|
||||||
material = ExtResource("1_bdfhg")
|
|
||||||
|
|
||||||
[node name="Ground2" type="CSGBox3D" parent="CSGCombiner3D" unique_id=854660236]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.75, 0.5, -1.75)
|
|
||||||
use_collision = true
|
|
||||||
collision_layer = 256
|
|
||||||
collision_mask = 65553
|
|
||||||
size = Vector3(1.5, 1, 1.5)
|
|
||||||
material = ExtResource("1_bdfhg")
|
|
||||||
|
|
||||||
[node name="Player" parent="." unique_id=709076448 instance=ExtResource("1_hg1sy")]
|
|
||||||
TutorialDone = true
|
|
||||||
|
|
||||||
[node name="BaseLocation" type="Marker3D" parent="." unique_id=1793710692]
|
|
||||||
|
|
||||||
[node name="MantleLocation1" type="Marker3D" parent="." unique_id=550080845]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.75, 0, 0)
|
|
||||||
Reference in New Issue
Block a user