Sync weapon equip to hitbox damage

This commit is contained in:
2024-09-01 16:34:33 -07:00
parent 5b110845e9
commit dc3639ad6e
8 changed files with 49 additions and 27 deletions

View File

@@ -18,7 +18,6 @@ config/features=PackedStringArray("4.4", "C#", "GL Compatibility")
window/size/viewport_width=1920
window/size/viewport_height=1080
window/size/mode=3
[dotnet]

View File

@@ -106,12 +106,12 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
public void OnPlayerHitboxEntered(Area3D body)
{
if (body.GetParent() is IPlayer)
if (body is IHitbox hitBox)
{
if (CurrentHP > 0)
{
GD.Print("Enemy Hit");
EnemyLogic.Input(new EnemyLogic.Input.HitByPlayer());
EnemyLogic.Input(new EnemyLogic.Input.HitByPlayer(hitBox.Damage));
}
}
}

View File

@@ -10,7 +10,7 @@
public readonly record struct PhysicsTick(double Delta);
public readonly record struct HitByPlayer();
public readonly record struct HitByPlayer(int Damage);
}
}
}

View File

@@ -10,11 +10,11 @@ namespace GameJamDungeon
[Meta, Id("enemy_logic_state_alive")]
public abstract partial record Alive : State, IGet<Input.HitByPlayer>
{
public Transition On(in Input.HitByPlayer _)
public Transition On(in Input.HitByPlayer input)
{
var enemy = Get<IEnemy>();
var gameRepo = Get<IGameRepo>();
enemy.CurrentHP -= gameRepo.EquippedWeapon.InventoryInfo.Damage;
enemy.CurrentHP -= input.Damage;
GD.Print("Current HP: " + enemy.CurrentHP);
GD.Print($"Hit by {gameRepo.EquippedWeapon.Name}");
Output(new Output.HitByPlayer());

12
src/hitbox/Hitbox.cs Normal file
View File

@@ -0,0 +1,12 @@
using Chickensoft.GodotNodeInterfaces;
using Godot;
public interface IHitbox : IArea3D
{
public int Damage { get; set; }
}
public partial class Hitbox : Area3D, IHitbox
{
public int Damage { get; set; }
}

View File

@@ -1,9 +1,11 @@
using Chickensoft.AutoInject;
using Chickensoft.Collections;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using Chickensoft.SaveFileBuilder;
using GameJamDungeon;
using Godot;
using System;
namespace GameJamDungeon
{
@@ -52,16 +54,17 @@ namespace GameJamDungeon
public PlayerLogic.IBinding PlayerBinding { get; set; } = default!;
[Node]
public IAnimationPlayer AnimationPlayer { get; set; } = default!;
[Node] public IAnimationPlayer AnimationPlayer { get; set; } = default!;
[Node]
public IAnimatedSprite2D SwordSlashAnimation { get; set; } = default!;
[Node] public AnimatedSprite2D SwordSlashAnimation { get; set; } = default!;
[Node] public IHitbox Hitbox { get; set; } = default!;
private IAutoProp<WeaponInfo> EquippedWeapon { get; set; } = default!;
public void Initialize()
{
AnimationPlayer.AnimationFinished += OnAnimationFinished;
SwordSlashAnimation.Position = GetViewport().GetVisibleRect().Size / 2;
}
public void Setup()
@@ -77,20 +80,15 @@ namespace GameJamDungeon
PlayerLogic.Set(GameRepo);
PlayerLogic.Set(PlayerData);
GameRepo.SetPlayerGlobalPosition(GlobalPosition);
EquippedWeapon = new AutoProp<WeaponInfo>(WeaponInfo.Default);
GameRepo.PlayerGlobalPosition.Sync += OnPlayerPositionUpdated;
}
private void OnPlayerPositionUpdated(Vector3 globalPosition)
{
GlobalPosition = globalPosition;
}
public void OnResolved()
{
PlayerBinding = PlayerLogic.Bind();
GameRepo.SetPlayerGlobalPosition(GlobalPosition);
PlayerBinding
.Handle((in PlayerLogic.Output.MovementComputed output) =>
{
@@ -104,9 +102,15 @@ namespace GameJamDungeon
this.Provide();
PlayerLogic.Start();
EquippedWeapon.Sync += OnEquippedWeaponChanged;
SwordSlashAnimation.Position = GetViewport().GetVisibleRect().Size / 2;
}
public void OnReady() => SetPhysicsProcess(true);
public void OnReady()
{
SetPhysicsProcess(true);
}
public void OnPhysicsProcess(double delta)
{
@@ -145,5 +149,9 @@ namespace GameJamDungeon
PlayerBinding.Dispose();
AnimationPlayer.AnimationFinished -= OnAnimationFinished;
}
private void OnEquippedWeaponChanged(WeaponInfo info) => Hitbox.Damage = info.Damage;
private void OnPlayerPositionUpdated(Vector3 globalPosition) => GlobalPosition = globalPosition;
}
}

View File

@@ -1,7 +1,8 @@
[gd_scene load_steps=15 format=3 uid="uid://cfecvvav8kkp6"]
[gd_scene load_steps=16 format=3 uid="uid://cfecvvav8kkp6"]
[ext_resource type="Script" path="res://src/player/Player.cs" id="1_xcol5"]
[ext_resource type="Texture2D" uid="uid://bokx3h8kfdo5i" path="res://src/player/slash_0000_Classic_30.png" id="2_la11l"]
[ext_resource type="Script" path="res://src/hitbox/Hitbox.cs" id="2_lb3qc"]
[ext_resource type="Texture2D" uid="uid://byosr5gk51237" path="res://src/player/slash_0001_Classic_29.png" id="3_ux3f1"]
[ext_resource type="Texture2D" uid="uid://nh071o6ii03j" path="res://src/player/slash_0002_Classic_28.png" id="4_gqnq0"]
[ext_resource type="Texture2D" uid="uid://bodfblud4kea3" path="res://src/player/slash_0003_Classic_27.png" id="5_eebal"]
@@ -29,7 +30,7 @@ tracks/0/keys = {
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Area3D/Hitbox:disabled")
tracks/1/path = NodePath("Hitbox/HitboxCollision:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
@@ -57,7 +58,7 @@ tracks/0/keys = {
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Area3D/Hitbox:disabled")
tracks/1/path = NodePath("Hitbox/HitboxCollision:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
@@ -137,13 +138,14 @@ libraries = {
"": SubResource("AnimationLibrary_w8l8m")
}
[node name="Area3D" type="Area3D" parent="."]
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -1)
collision_layer = 16
collision_mask = 16
script = ExtResource("2_lb3qc")
[node name="Hitbox" type="CollisionShape3D" parent="Area3D"]
unique_name_in_owner = true
[node name="HitboxCollision" type="CollisionShape3D" parent="Hitbox"]
shape = SubResource("BoxShape3D_wedu3")
disabled = true

View File

@@ -1,4 +1,5 @@
using Chickensoft.Serialization;
using Chickensoft.Collections;
using Chickensoft.Serialization;
using Godot;
using System.Collections.Generic;
@@ -13,7 +14,7 @@ namespace GameJamDungeon
public required PlayerLogic StateMachine { get; init; }
[Save("PlayerEquippedSword")]
public required InventoryItemInfo EquippedWeapon { get; set; }
public required IAutoProp<WeaponInfo> EquippedWeapon { get; set; }
[Save("PlayerInventory")]
public required IEnumerable<InventoryItemInfo> Inventory { get; set; }