campfire wip 2
parent
5c8a9cb32b
commit
e586ae0e6d
|
@ -0,0 +1,54 @@
|
|||
using Godot;
|
||||
|
||||
namespace SupaLidlGame.BoundingBoxes;
|
||||
|
||||
public partial class InteractionRay : RayCast2D
|
||||
{
|
||||
private InteractionTrigger _trigger;
|
||||
|
||||
public InteractionTrigger Trigger
|
||||
{
|
||||
get => _trigger;
|
||||
protected set
|
||||
{
|
||||
if (_trigger != value)
|
||||
{
|
||||
EmitSignal(SignalName.TriggerHit, value);
|
||||
}
|
||||
|
||||
if (_trigger is not null)
|
||||
{
|
||||
LastValidTrigger = value;
|
||||
}
|
||||
|
||||
_trigger = value;
|
||||
}
|
||||
}
|
||||
|
||||
public InteractionTrigger LastValidTrigger { get; set; }
|
||||
|
||||
[Signal]
|
||||
public delegate void TriggerHitEventHandler(InteractionTrigger trigger);
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void _PhysicsProcess(double delta)
|
||||
{
|
||||
if (IsColliding())
|
||||
{
|
||||
var obj = GetCollider();
|
||||
// if obj is an InteractionTrigger then we signal hit
|
||||
if (obj is InteractionTrigger trigger)
|
||||
{
|
||||
Trigger = trigger;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Trigger = null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -5,66 +5,4 @@ namespace SupaLidlGame.BoundingBoxes;
|
|||
|
||||
public partial class InteractionReceiver : Area2D
|
||||
{
|
||||
[Signal]
|
||||
public delegate void TriggerEventHandler(
|
||||
InteractionTrigger trigger,
|
||||
InteractionTrigger closestTrigger);
|
||||
|
||||
[Signal]
|
||||
public delegate void ClosestTriggerEventHandler(InteractionTrigger trigger);
|
||||
|
||||
private InteractionTrigger _closestTrigger;
|
||||
|
||||
private HashSet<InteractionTrigger> _triggers;
|
||||
|
||||
public InteractionReceiver()
|
||||
{
|
||||
_triggers = new HashSet<InteractionTrigger>();
|
||||
}
|
||||
|
||||
private void UpdateClosestTrigger()
|
||||
{
|
||||
float minDist = float.MaxValue;
|
||||
InteractionTrigger best = null;
|
||||
|
||||
foreach (var trigger in _triggers)
|
||||
{
|
||||
float dist = trigger.GlobalPosition
|
||||
.DistanceSquaredTo(GlobalPosition);
|
||||
|
||||
if (dist <= minDist)
|
||||
{
|
||||
best = trigger;
|
||||
minDist = dist;
|
||||
}
|
||||
}
|
||||
|
||||
if (_closestTrigger != best)
|
||||
{
|
||||
EmitSignal(SignalName.ClosestTrigger, best);
|
||||
_closestTrigger = best;
|
||||
}
|
||||
}
|
||||
|
||||
public void _on_area_entered(Area2D area)
|
||||
{
|
||||
if (area is InteractionTrigger trigger)
|
||||
{
|
||||
EmitSignal(SignalName.Trigger, _closestTrigger);
|
||||
}
|
||||
}
|
||||
|
||||
public void _on_area_exited(Area2D area)
|
||||
{
|
||||
// update closest trigger
|
||||
if (area is InteractionTrigger trigger)
|
||||
{
|
||||
if (_triggers.Contains(trigger))
|
||||
{
|
||||
_triggers.Remove(trigger);
|
||||
}
|
||||
UpdateClosestTrigger();
|
||||
}
|
||||
GD.PushWarning("Area entered is not an InteractionTrigger.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,24 @@
|
|||
using Godot;
|
||||
using SupaLidlGame.Characters;
|
||||
|
||||
namespace SupaLidlGame.BoundingBoxes;
|
||||
|
||||
public partial class InteractionTrigger : Area2D
|
||||
{
|
||||
[Signal]
|
||||
public delegate void InteractionEventHandler();
|
||||
|
||||
[Signal]
|
||||
public delegate void TargetEventHandler();
|
||||
|
||||
[Signal]
|
||||
public delegate void UntargetEventHandler();
|
||||
|
||||
/// <summary>
|
||||
/// Invokes or triggers an interaction to occur.
|
||||
/// </summary>
|
||||
public void InvokeInteraction()
|
||||
{
|
||||
EmitSignal(SignalName.Interaction);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,9 +73,17 @@ public partial class Character : CharacterBody2D, IFaction
|
|||
[Export]
|
||||
public CharacterStateMachine StateMachine { get; set; }
|
||||
|
||||
[Export]
|
||||
public BoundingBoxes.Hurtbox Hurtbox { get; set; }
|
||||
|
||||
[Export]
|
||||
public ushort Faction { get; set; }
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
Hurtbox.ReceivedDamage += OnReceivedDamage;
|
||||
}
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
if (StateMachine != null)
|
||||
|
@ -133,7 +141,7 @@ public partial class Character : CharacterBody2D, IFaction
|
|||
StunTime += time;
|
||||
}
|
||||
|
||||
protected void DrawTarget()
|
||||
protected virtual void DrawTarget()
|
||||
{
|
||||
Vector2 target = Target;
|
||||
float angle = Mathf.Atan2(target.Y, Mathf.Abs(target.X));
|
||||
|
@ -173,13 +181,14 @@ public partial class Character : CharacterBody2D, IFaction
|
|||
}
|
||||
}
|
||||
|
||||
public virtual void _on_hurtbox_received_damage(
|
||||
public virtual void OnReceivedDamage(
|
||||
float damage,
|
||||
Character inflictor,
|
||||
float knockback,
|
||||
Vector2 knockbackOrigin = default,
|
||||
Vector2 knockbackVector = default)
|
||||
{
|
||||
float oldHealth = Health;
|
||||
Health -= damage;
|
||||
|
||||
// create damage text
|
||||
|
@ -225,5 +234,19 @@ public partial class Character : CharacterBody2D, IFaction
|
|||
// very small pitch deviation
|
||||
sound.At(GlobalPosition).WithPitchDeviation(0.125f).Play();
|
||||
}
|
||||
|
||||
Events.HealthChangedArgs args = new Events.HealthChangedArgs
|
||||
{
|
||||
Attacker = inflictor,
|
||||
OldHealth = oldHealth,
|
||||
NewHealth = Health,
|
||||
Damage = damage,
|
||||
};
|
||||
EmitSignal(SignalName.Hurt, args);
|
||||
|
||||
if (Health <= 0)
|
||||
{
|
||||
EmitSignal(SignalName.Death, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,7 +130,7 @@ _data = {
|
|||
"RESET": SubResource("Animation_k6l16")
|
||||
}
|
||||
|
||||
[node name="ExampleEnemy" type="CharacterBody2D" node_paths=PackedStringArray("Sprite", "Inventory", "StateMachine")]
|
||||
[node name="ExampleEnemy" type="CharacterBody2D" node_paths=PackedStringArray("Sprite", "Inventory", "StateMachine", "Hurtbox")]
|
||||
y_sort_enabled = true
|
||||
texture_filter = 3
|
||||
material = SubResource("ShaderMaterial_ms3xg")
|
||||
|
@ -141,6 +141,7 @@ Health = 50.0
|
|||
Sprite = NodePath("Sprite")
|
||||
Inventory = NodePath("Inventory")
|
||||
StateMachine = NodePath("StateMachine")
|
||||
Hurtbox = NodePath("Hurtbox")
|
||||
Faction = 2
|
||||
|
||||
[node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")]
|
||||
|
@ -191,6 +192,4 @@ libraries = {
|
|||
[node name="HurtSound" type="AudioStreamPlayer2D" parent="."]
|
||||
stream = ExtResource("10_n1e64")
|
||||
|
||||
[connection signal="ReceivedDamage" from="Hurtbox" to="." method="_on_hurtbox_received_damage"]
|
||||
|
||||
[editable path="Hurtbox"]
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
using Godot;
|
||||
using GodotUtilities;
|
||||
using SupaLidlGame.Utils;
|
||||
using SupaLidlGame.BoundingBoxes;
|
||||
|
||||
namespace SupaLidlGame.Characters;
|
||||
|
||||
public partial class Player : Character
|
||||
[Scene]
|
||||
public sealed partial class Player : Character
|
||||
{
|
||||
private AnimatedSprite2D _sprite;
|
||||
private string _spriteAnim;
|
||||
|
@ -11,6 +14,11 @@ public partial class Player : Character
|
|||
[Export]
|
||||
public PlayerCamera Camera { get; set; }
|
||||
|
||||
[Export]
|
||||
public Marker2D DirectionMarker { get; private set; }
|
||||
|
||||
public InteractionRay InteractionRay { get; private set; }
|
||||
|
||||
public string Animation
|
||||
{
|
||||
get => _sprite.Animation;
|
||||
|
@ -32,11 +40,13 @@ public partial class Player : Character
|
|||
|
||||
public override void _Ready()
|
||||
{
|
||||
InteractionRay = GetNode<InteractionRay>("Direction2D/InteractionRay");
|
||||
_sprite = GetNode<AnimatedSprite2D>("Sprite");
|
||||
if (_spriteAnim != default)
|
||||
{
|
||||
_sprite.Animation = _spriteAnim;
|
||||
}
|
||||
base._Ready();
|
||||
}
|
||||
|
||||
public override void ModifyVelocity()
|
||||
|
@ -61,4 +71,12 @@ public partial class Player : Character
|
|||
GD.Print("died");
|
||||
//base.Die();
|
||||
}
|
||||
|
||||
protected override void DrawTarget()
|
||||
{
|
||||
base.DrawTarget();
|
||||
DirectionMarker.GlobalRotation = DirectionMarker.GlobalPosition
|
||||
.DirectionTo(GetGlobalMousePosition())
|
||||
.Angle();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[gd_scene load_steps=29 format=3 uid="uid://b2254pup8k161"]
|
||||
[gd_scene load_steps=30 format=3 uid="uid://b2254pup8k161"]
|
||||
|
||||
[ext_resource type="Script" path="res://Characters/Player.cs" id="1_flygr"]
|
||||
[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="2_ngsgt"]
|
||||
|
@ -12,6 +12,7 @@
|
|||
[ext_resource type="Script" path="res://State/Character/PlayerRollState.cs" id="8_fy0v5"]
|
||||
[ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="9_avyu4"]
|
||||
[ext_resource type="AudioStream" uid="uid://njun3e6v4854" path="res://Assets/Sounds/hurt.wav" id="12_h0x0g"]
|
||||
[ext_resource type="Script" path="res://BoundingBoxes/InteractionRay.cs" id="13_hs3u1"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"]
|
||||
shader = ExtResource("2_ngsgt")
|
||||
|
@ -133,19 +134,21 @@ _data = {
|
|||
"RESET": SubResource("Animation_k6l16")
|
||||
}
|
||||
|
||||
[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Camera", "Sprite", "Inventory", "StateMachine")]
|
||||
[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Camera", "DirectionMarker", "Sprite", "Inventory", "StateMachine", "Hurtbox")]
|
||||
y_sort_enabled = true
|
||||
texture_filter = 3
|
||||
material = SubResource("ShaderMaterial_h78y7")
|
||||
position = Vector2(0, -12)
|
||||
position = Vector2(1, -12)
|
||||
collision_layer = 6
|
||||
collision_mask = 17
|
||||
script = ExtResource("1_flygr")
|
||||
Camera = NodePath("Camera2D")
|
||||
DirectionMarker = NodePath("Direction2D")
|
||||
Speed = 64.0
|
||||
Sprite = NodePath("Sprite")
|
||||
Inventory = NodePath("Inventory")
|
||||
StateMachine = NodePath("StateMachine")
|
||||
Hurtbox = NodePath("Hurtbox")
|
||||
Faction = 1
|
||||
|
||||
[node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")]
|
||||
|
@ -231,6 +234,13 @@ max_distance = 64.0
|
|||
[node name="AudioListener2D" type="AudioListener2D" parent="."]
|
||||
current = true
|
||||
|
||||
[connection signal="ReceivedDamage" from="Hurtbox" to="." method="_on_hurtbox_received_damage"]
|
||||
[node name="Direction2D" type="Marker2D" parent="."]
|
||||
position = Vector2(0, 6)
|
||||
|
||||
[node name="InteractionRay" type="RayCast2D" parent="Direction2D"]
|
||||
target_position = Vector2(16, 0)
|
||||
collision_mask = 64
|
||||
collide_with_areas = true
|
||||
script = ExtResource("13_hs3u1")
|
||||
|
||||
[editable path="Hurtbox"]
|
||||
|
|
|
@ -1,23 +1,35 @@
|
|||
using Godot;
|
||||
using System;
|
||||
using GodotUtilities;
|
||||
using SupaLidlGame.BoundingBoxes;
|
||||
|
||||
namespace SupaLidlGame.Entities;
|
||||
|
||||
public partial class Campfire : StaticBody2D
|
||||
[Scene]
|
||||
public partial class Campfire : StaticBody2D, Utils.IInteractive
|
||||
{
|
||||
private PointLight2D _light;
|
||||
|
||||
public InteractionTrigger InteractionTrigger { get; set; }
|
||||
|
||||
[Signal]
|
||||
public delegate void OnCampfireUseEventHandler();
|
||||
public delegate void UseEventHandler();
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
InteractionTrigger = GetNode<InteractionTrigger>("InteractionTrigger");
|
||||
_light = GetNode<PointLight2D>("PointLight2D");
|
||||
InteractionTrigger.Interaction += () =>
|
||||
{
|
||||
// save the player's spawn position to be their position on interaction
|
||||
EmitSignal(SignalName.Use);
|
||||
|
||||
this.GetAncestor<Utils.World>().SetSpawn(GlobalPosition);
|
||||
};
|
||||
}
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
_light.Energy += (GD.Randf() - 0.5f) * 8 * (float)delta;
|
||||
_light.Energy = Math.Clamp(_light.Energy, 1.2f, 2.0f);
|
||||
_light.Energy = Mathf.Clamp(_light.Energy, 1.8f, 2f);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
[gd_scene load_steps=11 format=3 uid="uid://dhl071rj5wyvx"]
|
||||
[gd_scene load_steps=13 format=3 uid="uid://dhl071rj5wyvx"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://yqet0b22i70d" path="res://Assets/Sprites/campfire.png" id="1_7eor7"]
|
||||
[ext_resource type="Script" path="res://Entities/Campfire.cs" id="1_w4gfp"]
|
||||
[ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="3_lm3vq"]
|
||||
[ext_resource type="Script" path="res://BoundingBoxes/InteractionTrigger.cs" id="4_h1bqe"]
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_68qj1"]
|
||||
atlas = ExtResource("1_7eor7")
|
||||
|
@ -55,6 +56,9 @@ animations = [{
|
|||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ubam4"]
|
||||
size = Vector2(16, 4)
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_dfj3a"]
|
||||
size = Vector2(20, 10)
|
||||
|
||||
[node name="Campfire" type="StaticBody2D"]
|
||||
texture_filter = 3
|
||||
position = Vector2(0, -8)
|
||||
|
@ -74,3 +78,12 @@ texture_scale = 0.25
|
|||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
position = Vector2(0, 6)
|
||||
shape = SubResource("RectangleShape2D_ubam4")
|
||||
|
||||
[node name="InteractionTrigger" type="Area2D" parent="."]
|
||||
collision_layer = 64
|
||||
collision_mask = 0
|
||||
script = ExtResource("4_h1bqe")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="InteractionTrigger"]
|
||||
position = Vector2(0, 5)
|
||||
shape = SubResource("RectangleShape2D_dfj3a")
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using Godot;
|
||||
using System;
|
||||
|
||||
namespace SupaLidlGame.Scenes;
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
[gd_scene load_steps=14 format=3 uid="uid://bxtpv6jqodj4v"]
|
||||
[gd_scene load_steps=15 format=3 uid="uid://bxtpv6jqodj4v"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://clwv2owvk6abe" path="res://Scenes/BaseMap.tscn" id="1_vly6f"]
|
||||
[ext_resource type="Texture2D" uid="uid://dl2h266oa2x31" path="res://Assets/Sprites/night-grass.png" id="2_ote21"]
|
||||
[ext_resource type="PackedScene" uid="uid://bf55wbq7m1gpp" path="res://Characters/ExampleEnemy.tscn" id="3_hwof6"]
|
||||
[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="4_mwgaq"]
|
||||
[ext_resource type="PackedScene" uid="uid://5nvn1tw56m8e" path="res://Utils/Spawner.tscn" id="4_pi4df"]
|
||||
[ext_resource type="PackedScene" uid="uid://dhl071rj5wyvx" path="res://Entities/Campfire.tscn" id="6_r6kxn"]
|
||||
|
||||
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dvbe3"]
|
||||
texture = ExtResource("2_ote21")
|
||||
|
@ -211,31 +212,31 @@ physics_layer_0/collision_mask = 16
|
|||
physics_layer_1/collision_layer = 1
|
||||
sources/0 = SubResource("TileSetAtlasSource_dvbe3")
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_kq7i3"]
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_qliqj"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("4_mwgaq")
|
||||
shader_parameter/color = Quaternion(1, 1, 1, 1)
|
||||
shader_parameter/intensity = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ck37u"]
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_xpy5p"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("4_mwgaq")
|
||||
shader_parameter/color = Quaternion(1, 1, 1, 1)
|
||||
shader_parameter/intensity = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_3i2mi"]
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_jlmdb"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("4_mwgaq")
|
||||
shader_parameter/color = Quaternion(1, 1, 1, 1)
|
||||
shader_parameter/intensity = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_trolh"]
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pd2a6"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("4_mwgaq")
|
||||
shader_parameter/color = Quaternion(1, 1, 1, 1)
|
||||
shader_parameter/intensity = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_vuv4g"]
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_th2v6"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("4_mwgaq")
|
||||
shader_parameter/color = Quaternion(1, 1, 1, 1)
|
||||
|
@ -251,26 +252,32 @@ layer_4/tile_data = PackedInt32Array(1114105, 196608, 3, 1114106, 262144, 3, 111
|
|||
layer_5/tile_data = PackedInt32Array(786438, 262144, 3, 720899, 262144, 3, 851971, 458752, 3, 196611, 458752, 3, 1835019, 262144, 3, 1835034, 458752, 3)
|
||||
|
||||
[node name="ExampleEnemy" parent="Entities" index="0" instance=ExtResource("3_hwof6")]
|
||||
material = SubResource("ShaderMaterial_kq7i3")
|
||||
material = SubResource("ShaderMaterial_qliqj")
|
||||
position = Vector2(169, 115)
|
||||
|
||||
[node name="ExampleEnemy2" parent="Entities" index="1" instance=ExtResource("3_hwof6")]
|
||||
material = SubResource("ShaderMaterial_ck37u")
|
||||
material = SubResource("ShaderMaterial_xpy5p")
|
||||
position = Vector2(75, 130)
|
||||
|
||||
[node name="ExampleEnemy3" parent="Entities" index="2" instance=ExtResource("3_hwof6")]
|
||||
material = SubResource("ShaderMaterial_3i2mi")
|
||||
material = SubResource("ShaderMaterial_jlmdb")
|
||||
position = Vector2(140, 177)
|
||||
|
||||
[node name="ExampleEnemy4" parent="Entities" index="3" instance=ExtResource("3_hwof6")]
|
||||
material = SubResource("ShaderMaterial_trolh")
|
||||
material = SubResource("ShaderMaterial_pd2a6")
|
||||
position = Vector2(14, 159)
|
||||
|
||||
[node name="ExampleEnemy5" parent="Entities" index="4" instance=ExtResource("3_hwof6")]
|
||||
material = SubResource("ShaderMaterial_vuv4g")
|
||||
material = SubResource("ShaderMaterial_th2v6")
|
||||
position = Vector2(10, 22)
|
||||
Faction = 1
|
||||
|
||||
[node name="Campfire" parent="Entities" index="5" instance=ExtResource("6_r6kxn")]
|
||||
position = Vector2(155, -27)
|
||||
|
||||
[node name="PointLight2D" parent="Entities/Campfire" index="1"]
|
||||
color = Color(0.996078, 0.780392, 0.501961, 1)
|
||||
|
||||
[node name="Spawner" parent="Spawners" index="0" instance=ExtResource("4_pi4df")]
|
||||
position = Vector2(250, 512)
|
||||
Character = ExtResource("3_hwof6")
|
||||
|
@ -279,4 +286,5 @@ SpawnTime = 5.0
|
|||
[node name="CollisionShape2D" parent="Spawners/Spawner/Area2D" index="0"]
|
||||
shape = SubResource("RectangleShape2D_oods2")
|
||||
|
||||
[editable path="Entities/Campfire"]
|
||||
[editable path="Spawners/Spawner"]
|
||||
|
|
|
@ -13,9 +13,10 @@ public abstract partial class PlayerState : CharacterState
|
|||
public override CharacterState Input(InputEvent @event)
|
||||
{
|
||||
var inventory = Character.Inventory;
|
||||
var player = _player;
|
||||
|
||||
if (this is PlayerIdleState or PlayerMoveState &&
|
||||
!_player.Inventory.IsUsingItem)
|
||||
!player.Inventory.IsUsingItem)
|
||||
{
|
||||
if (@event.IsActionPressed("equip_1"))
|
||||
{
|
||||
|
@ -25,6 +26,13 @@ public abstract partial class PlayerState : CharacterState
|
|||
{
|
||||
inventory.SelectedItem = inventory.GetItemByMap("equip_2");
|
||||
}
|
||||
|
||||
if (@event.IsActionPressed("interact"))
|
||||
{
|
||||
// if looking at a trigger then interact with it
|
||||
GD.Print("interacting");
|
||||
player.InteractionRay.Trigger?.InvokeInteraction();
|
||||
}
|
||||
}
|
||||
|
||||
return base.Input(@event);
|
||||
|
|
|
@ -3,4 +3,7 @@
|
|||
<TargetFramework>net6.0</TargetFramework>
|
||||
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Firebelley.GodotUtilities" Version="4.0.4" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,6 +1,6 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupaLidlGame", "SupaLidlGame.csproj", "{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SupaLidlGame", "SupaLidlGame.csproj", "{BC071CA6-9462-4CEC-AA20-B0CA618321E5}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
@ -9,11 +9,11 @@ Global
|
|||
ExportRelease|Any CPU = ExportRelease|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
|
||||
{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
|
||||
{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
|
||||
{AF3A4D72-D276-44C3-A64F-EAB32D2B9B97}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
|
||||
{BC071CA6-9462-4CEC-AA20-B0CA618321E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BC071CA6-9462-4CEC-AA20-B0CA618321E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BC071CA6-9462-4CEC-AA20-B0CA618321E5}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
|
||||
{BC071CA6-9462-4CEC-AA20-B0CA618321E5}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
|
||||
{BC071CA6-9462-4CEC-AA20-B0CA618321E5}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
|
||||
{BC071CA6-9462-4CEC-AA20-B0CA618321E5}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
namespace SupaLidlGame.Utils;
|
||||
|
||||
public interface IInteractive
|
||||
{
|
||||
public BoundingBoxes.InteractionTrigger InteractionTrigger { get; set; }
|
||||
}
|
|
@ -23,7 +23,9 @@ public partial class World : Node2D
|
|||
|
||||
private string _currentMapResourcePath;
|
||||
|
||||
private Entities.Campfire _lastCampfire = null;
|
||||
//private Entities.Campfire _lastCampfire = null;
|
||||
public Vector2 SaveLocation { get; set; }
|
||||
public string SaveMapKey { get; set; }
|
||||
|
||||
private const string PLAYER_PATH = "res://Characters/Player.tscn";
|
||||
private PackedScene _playerScene;
|
||||
|
@ -47,25 +49,15 @@ public partial class World : Node2D
|
|||
CurrentPlayer.Death += (Events.HealthChangedArgs args) =>
|
||||
{
|
||||
// TODO: respawn the player at the last campfire.
|
||||
SpawnPlayer();
|
||||
};
|
||||
|
||||
base._Ready();
|
||||
}
|
||||
|
||||
public void LoadScene(PackedScene scene)
|
||||
private void LoadMap(Map map)
|
||||
{
|
||||
GD.Print("Loading map " + scene.ResourcePath);
|
||||
|
||||
Map map;
|
||||
if (_maps.ContainsKey(scene.ResourcePath))
|
||||
{
|
||||
map = _maps[scene.ResourcePath];
|
||||
}
|
||||
else
|
||||
{
|
||||
map = scene.Instantiate<Map>();
|
||||
_maps.Add(scene.ResourcePath, map);
|
||||
}
|
||||
GD.Print("Loading map " + map.Name);
|
||||
|
||||
if (CurrentMap is not null)
|
||||
{
|
||||
|
@ -86,6 +78,39 @@ public partial class World : Node2D
|
|||
}
|
||||
}
|
||||
|
||||
public void LoadScene(PackedScene scene)
|
||||
{
|
||||
Map map;
|
||||
if (_maps.ContainsKey(scene.ResourcePath))
|
||||
{
|
||||
map = _maps[scene.ResourcePath];
|
||||
}
|
||||
else
|
||||
{
|
||||
map = scene.Instantiate<Map>();
|
||||
_maps.Add(scene.ResourcePath, map);
|
||||
}
|
||||
|
||||
LoadMap(map);
|
||||
}
|
||||
|
||||
public void LoadScene(string path)
|
||||
{
|
||||
Map map;
|
||||
if (_maps.ContainsKey(path))
|
||||
{
|
||||
map = _maps[path];
|
||||
}
|
||||
else
|
||||
{
|
||||
var scene = ResourceLoader.Load<PackedScene>(path);
|
||||
map = scene.Instantiate<Map>();
|
||||
_maps.Add(scene.ResourcePath, map);
|
||||
}
|
||||
|
||||
LoadMap(map);
|
||||
}
|
||||
|
||||
public void CreatePlayer()
|
||||
{
|
||||
CurrentPlayer = _playerScene.Instantiate<Player>();
|
||||
|
@ -117,7 +142,7 @@ public partial class World : Node2D
|
|||
}
|
||||
return false;
|
||||
}) as BoundingBoxes.ConnectorBox;
|
||||
|
||||
|
||||
CurrentPlayer.GlobalPosition = connector.GlobalPosition;
|
||||
}
|
||||
|
||||
|
@ -152,4 +177,34 @@ public partial class World : Node2D
|
|||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the player's saved spawn position.
|
||||
/// </summary>
|
||||
/// <param name="position">The position to save and spawn the player in</param>
|
||||
/// <param name="mapKey">
|
||||
/// The map to spawn the player in. If <see langword="null" />, use the
|
||||
/// <c>World</c>'s <c>CurrentMap</c>
|
||||
/// </param>
|
||||
public void SetSpawn(Vector2 position, string mapKey = null)
|
||||
{
|
||||
GD.Print("Set spawn");
|
||||
if (mapKey is null)
|
||||
{
|
||||
mapKey = CurrentMap.SceneFilePath;
|
||||
SaveLocation = position;
|
||||
SaveMapKey = mapKey;
|
||||
}
|
||||
}
|
||||
|
||||
public void SpawnPlayer()
|
||||
{
|
||||
// TODO: add max health property
|
||||
CurrentPlayer.Health = 100;
|
||||
CurrentPlayer.GlobalPosition = SaveLocation;
|
||||
if (CurrentMap.SceneFilePath != SaveMapKey)
|
||||
{
|
||||
LoadScene(SaveMapKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue