HumanoidSandvichDispenser 2024-05-29 14:36:31 -07:00 committed by GitHub
commit 7f610c6b32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 229 additions and 12 deletions

View File

@ -0,0 +1,74 @@
[gd_scene load_steps=11 format=3 uid="uid://rd08pot25h00"]
[ext_resource type="Script" path="res://Characters/NPC.cs" id="1_04gcf"]
[ext_resource type="Script" path="res://State/Character/CharacterStateMachine.cs" id="2_kynkg"]
[ext_resource type="Texture2D" uid="uid://bej8thq7ruyty" path="res://Assets/Sprites/Characters/forsen2.png" id="2_s5nik"]
[ext_resource type="Script" path="res://State/Character/NPCIdleState.cs" id="3_pcrll"]
[ext_resource type="Script" path="res://State/Thinker/IdleState.cs" id="3_rgc42"]
[ext_resource type="Script" path="res://State/Thinker/ThinkerStateMachine.cs" id="4_mo4wj"]
[ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="5_sjs24"]
[ext_resource type="Script" path="res://Utils/InteractionTriggerDialogue.cs" id="5_yknpw"]
[ext_resource type="Resource" uid="uid://c4n7vhoxybu70" path="res://Dialogue/snus-dealer.dialogue" id="6_isvnq"]
[ext_resource type="Script" path="res://Items/Inventory.cs" id="7_vip6b"]
[node name="Character" type="CharacterBody2D" node_paths=PackedStringArray("ThinkerStateMachine", "Sprite", "Inventory", "StateMachine")]
script = ExtResource("1_04gcf")
ThinkerStateMachine = NodePath("Thinker")
Sprite = NodePath("Sprites/Sprite")
Inventory = NodePath("Inventory")
StateMachine = NodePath("StateMachine")
[node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState", "Character")]
script = ExtResource("2_kynkg")
InitialState = NodePath("Idle")
Character = NodePath("..")
[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("Character")]
script = ExtResource("3_pcrll")
Character = NodePath("../..")
[node name="Thinker" type="Node" parent="." node_paths=PackedStringArray("InitialState")]
script = ExtResource("4_mo4wj")
InitialState = NodePath("Idle")
[node name="Idle" type="Node" parent="Thinker" node_paths=PackedStringArray("NPC")]
script = ExtResource("3_rgc42")
NPC = NodePath("../..")
[node name="Animations" type="Node" parent="."]
[node name="Movement" type="AnimationPlayer" parent="Animations"]
[node name="Hurt" type="AnimationPlayer" parent="Animations"]
[node name="Stun" type="AnimationPlayer" parent="Animations"]
[node name="Attack" type="AnimationPlayer" parent="Animations"]
[node name="Stats" type="Node" parent="."]
[node name="Sprites" type="Node2D" parent="."]
[node name="Sprite" type="Sprite2D" parent="Sprites"]
texture = ExtResource("2_s5nik")
centered = false
offset = Vector2(-12, -20)
hframes = 46
[node name="Inventory" type="Node2D" parent="." node_paths=PackedStringArray("Hotbar")]
script = ExtResource("7_vip6b")
Hotbar = []
[node name="Interaction" type="Node2D" parent="." node_paths=PackedStringArray("InteractionTrigger")]
position = Vector2(0, -4)
script = ExtResource("5_yknpw")
InteractionTrigger = NodePath("InteractionTrigger")
DialogueResource = ExtResource("6_isvnq")
DialogueTitle = "shop"
[node name="InteractionTrigger" parent="Interaction" instance=ExtResource("5_sjs24")]
[node name="Label" parent="Interaction/InteractionTrigger/Popup" index="0"]
text = "Listen"
[editable path="Interaction/InteractionTrigger"]

View File

@ -0,0 +1,27 @@
//using Godot;
//using SupaLidlGame.BoundingBoxes;
//using SupaLidlGame.Extensions;
//
//namespace SupaLidlGame.Characters;
//
//public partial class Vendor : NPC
//{
// [Export]
// public InteractionTrigger InteractionTrigger { get; set; }
//
// [Export(PropertyHint.File, "*.dialogue")]
// public Resource DialogueResource { get; set; }
//
// [Export]
// public string DialogueTitle { get; set; }
//
// public override void _Ready()
// {
// InteractionTrigger.Interaction += OnInteraction;
// }
//
// private void OnInteraction()
// {
// this.GetWorld().DialogueBalloon.Start(DialogueResource, DialogueTitle);
// }
//}

View File

@ -34,6 +34,8 @@ public sealed partial class DebugConsole : Control
private Node ctx => Context; private Node ctx => Context;
public const double DEBUG_REFRESH_INTERVAL = 0.25;
public override void _Ready() public override void _Ready()
{ {
_entry = GetNode<Entry>("%Entry"); _entry = GetNode<Entry>("%Entry");
@ -61,6 +63,39 @@ public sealed partial class DebugConsole : Control
} }
} }
}; };
GD.Print("DebugConsole init");
// TODO: put this in a separate class
// watch godot.log
bool isFileLoggingEnabled = ProjectSettings
.GetSetting("debug/file_logging/enable_file_logging.pc")
.AsBool();
if (isFileLoggingEnabled)
{
GD.Print("File logging is enabled.");
string logPath = ProjectSettings
.GetSetting("debug/file_logging/log_path")
.AsString();
var fs = FileAccess.Open(logPath, FileAccess.ModeFlags.Read);
var timer = new Timer();
AddChild(timer);
timer.Timeout += () =>
{
// push
while (fs.GetPosition() < fs.GetLength())
{
string line = fs.GetLine();
_output.Text += line;
}
};
timer.Start(DEBUG_REFRESH_INTERVAL);
}
else
{
GD.PushWarning("File logging is not enabled.");
}
} }
public IEnumerable<NodePathToken> SplitPath(NodePath path) public IEnumerable<NodePathToken> SplitPath(NodePath path)
@ -209,13 +244,21 @@ public sealed partial class DebugConsole : Control
Godot.Expression exp = new(); Godot.Expression exp = new();
string[] reserved = { "from", "set_context", "context", "set_prop", "to_node_path" }; string[] reserved = {
"from",
"set_context",
"context",
"set_prop",
"to_node_path",
"load",
};
Godot.Collections.Array reservedMap = new(); Godot.Collections.Array reservedMap = new();
reservedMap.Add(new Callable(this, MethodName.From)); reservedMap.Add(new Callable(this, MethodName.From));
reservedMap.Add(new Callable(this, MethodName.SetContext)); reservedMap.Add(new Callable(this, MethodName.SetContext));
reservedMap.Add(Context); reservedMap.Add(Context);
reservedMap.Add(new Callable(this, MethodName.SetProp)); reservedMap.Add(new Callable(this, MethodName.SetProp));
reservedMap.Add(new Callable(this, MethodName.ToNodePath)); reservedMap.Add(new Callable(this, MethodName.ToNodePath));
reservedMap.Add(new Callable(this, MethodName.Load));
var err = exp.Parse(str, reserved); var err = exp.Parse(str, reserved);
if (err != Error.Ok) if (err != Error.Ok)
@ -246,4 +289,9 @@ public sealed partial class DebugConsole : Control
{ {
Context = node; Context = node;
} }
private Resource Load(string path)
{
return ResourceLoader.Load(path);
}
} }

View File

@ -0,0 +1,23 @@
~ start
Snus Dealer: d
% => test
% => dont_snus
=> END
~ test
Snus Dealer: asdadsadasd
=> END
~ dont_snus
Snus Dealer: If you don't snus...
Snus Dealer: you lose.
=> END
~ shop

View File

@ -0,0 +1,15 @@
[remap]
importer="dialogue_manager_compiler_11"
type="Resource"
uid="uid://c4n7vhoxybu70"
path="res://.godot/imported/snus-dealer.dialogue-69dbddee28632f18888364bae03f393d.tres"
[deps]
source_file="res://Dialogue/snus-dealer.dialogue"
dest_files=["res://.godot/imported/snus-dealer.dialogue-69dbddee28632f18888364bae03f393d.tres"]
[params]
defaults=true

View File

@ -58,7 +58,7 @@ public partial class DynamicDoor : StaticBody2D
foreach (var navmesh in Rebake) foreach (var navmesh in Rebake)
{ {
// rebake navmesh so NPCs can correctly travel conditionally // rebake navmesh so NPCs can correctly travel conditionally
GD.Print("rebaking"); GD.Print("Dynamic door updated; rebaking navmeshes...");
navmesh.BakeNavigationPolygon(); navmesh.BakeNavigationPolygon();
} }
} }

View File

@ -102,12 +102,12 @@ y_sort_enabled = true
texture_filter = 1 texture_filter = 1
sprite_frames = SubResource("SpriteFrames_gf7ku") sprite_frames = SubResource("SpriteFrames_gf7ku")
autoplay = "default" autoplay = "default"
frame = 6 frame = 9
frame_progress = 0.743234 frame_progress = 0.966501
offset = Vector2(0, -12) offset = Vector2(0, -12)
[node name="PointLight2D" type="PointLight2D" parent="."] [node name="PointLight2D" type="PointLight2D" parent="."]
color = Color(1, 0.9525, 0.85, 1) color = Color(1, 0.811765, 0.537255, 1)
energy = 1.2 energy = 1.2
blend_mode = 2 blend_mode = 2
shadow_filter_smooth = 3.0 shadow_filter_smooth = 3.0

View File

@ -0,0 +1,12 @@
using Godot;
namespace SupaLidlGame.Extensions;
public static class TimerExtensions
{
public static void Restart(this Timer timer, double timeSec = -1)
{
timer.Stop();
timer.Start(timeSec);
}
}

View File

@ -24,6 +24,15 @@ public partial class ProjectileSpawner : Ranged
[Export] [Export]
public float ProjectileAngleDeviation { get; set; } public float ProjectileAngleDeviation { get; set; }
public string ProjectilePath
{
get => Projectile?.ResourcePath;
set
{
Projectile = GD.Load<PackedScene>(value);
}
}
protected virtual void SpawnProjectile(Scenes.Map map, protected virtual void SpawnProjectile(Scenes.Map map,
Vector2 direction, float velocityModifier = 1) Vector2 direction, float velocityModifier = 1)
{ {

View File

@ -843,7 +843,7 @@ position = Vector2(1272, 0)
[node name="Campfire" parent="Entities" index="0" instance=ExtResource("3_ve4i2")] [node name="Campfire" parent="Entities" index="0" instance=ExtResource("3_ve4i2")]
position = Vector2(-24, -8) position = Vector2(-24, -8)
[node name="Areas" parent="." index="3"] [node name="Areas" parent="." index="10"]
visible = false visible = false
[node name="Main" type="NavigationRegion2D" parent="Areas" index="0"] [node name="Main" type="NavigationRegion2D" parent="Areas" index="0"]

View File

@ -14,6 +14,8 @@ public partial class GlobalState : Node
[Export] [Export]
public Stats Stats { get; set; } public Stats Stats { get; set; }
public static GlobalState Instance { get; private set; }
[Export] [Export]
public GameSettings Settings { get; set; } public GameSettings Settings { get; set; }
@ -30,6 +32,13 @@ public partial class GlobalState : Node
public override void _Ready() public override void _Ready()
{ {
if (Instance != null)
{
throw new MultipleSingletonsException();
}
Instance = this;
ProcessMode = ProcessModeEnum.Always; ProcessMode = ProcessModeEnum.Always;
LoadSettings(); LoadSettings();
} }

View File

@ -1,4 +1,5 @@
using Godot; using Godot;
using SupaLidlGame.Extensions;
namespace SupaLidlGame.Utils; namespace SupaLidlGame.Utils;
@ -52,8 +53,7 @@ public partial class CharacterStats : Node
else else
{ {
_shouldDecayStagger = false; _shouldDecayStagger = false;
_staggerDecayTimer.Stop(); _staggerDecayTimer.Restart(1);
_staggerDecayTimer.Start(1);
} }
} }

@ -1 +1 @@
Subproject commit 36625398e3ad45306521926c5190141a7ac925b0 Subproject commit b265f5cebab07f3af55c92f642b458db9c973a7c

View File

@ -17,17 +17,17 @@ config/icon="res://icon.svg"
[autoload] [autoload]
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
GlobalState="*res://State/Global/GlobalState.cs" GlobalState="*res://State/Global/GlobalState.cs"
EventBus="*res://Events/EventBus.cs" EventBus="*res://Events/EventBus.cs"
BaseUI="*res://UI/Base.tscn" BaseUI="*res://UI/Base.tscn"
World="*res://Scenes/Level.tscn" World="*res://Scenes/Level.tscn"
AudioManager="*res://Audio/AudioManager.cs" AudioManager="*res://Audio/AudioManager.cs"
DebugUi="*res://UI/Debug/DebugUI.tscn" DebugUi="*res://UI/Debug/DebugUI.tscn"
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
[dialogue_manager] [dialogue_manager]
general/states=["GlobalState"] general/states=["GlobalState", "World"]
general/wrap_lines=true general/wrap_lines=true
[display] [display]
@ -201,7 +201,7 @@ cast={
[internationalization] [internationalization]
locale/translations_pot_files=PackedStringArray("res://Assets/Dialog/doc.dialogue", "res://Assets/Dialogue/doc.dialogue", "res://Assets/Dialogue/spellbook.dialogue", "res://Assets/Dialogue/books.dialogue", "res://Assets/Dialogue/clone-machine.dialogue") locale/translations_pot_files=PackedStringArray("res://Assets/Dialogue/doc.dialogue", "res://Assets/Dialogue/books.dialogue", "res://Assets/Dialogue/clone-machine.dialogue", "res://Dialogue/snus-dealer.dialogue")
[layer_names] [layer_names]