Compare commits
	
		
			1 Commits 
		
	
	
		
			3caca77739
			...
			7f610c6b32
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								 | 
						7f610c6b32 | 
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
[remap]
 | 
					[remap]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
importer="dialogue_manager_compiler_12"
 | 
					importer="dialogue_manager_compiler_11"
 | 
				
			||||||
type="Resource"
 | 
					type="Resource"
 | 
				
			||||||
uid="uid://dilmuoilweoeh"
 | 
					uid="uid://dilmuoilweoeh"
 | 
				
			||||||
path="res://.godot/imported/books.dialogue-cc272ebae322ae3ca46820dca11a3437.tres"
 | 
					path="res://.godot/imported/books.dialogue-cc272ebae322ae3ca46820dca11a3437.tres"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
[remap]
 | 
					[remap]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
importer="dialogue_manager_compiler_12"
 | 
					importer="dialogue_manager_compiler_11"
 | 
				
			||||||
type="Resource"
 | 
					type="Resource"
 | 
				
			||||||
uid="uid://c2om4y0fm81yr"
 | 
					uid="uid://c2om4y0fm81yr"
 | 
				
			||||||
path="res://.godot/imported/clone-machine.dialogue-8810934a67eacdad52469e9ef5f970fb.tres"
 | 
					path="res://.godot/imported/clone-machine.dialogue-8810934a67eacdad52469e9ef5f970fb.tres"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
[remap]
 | 
					[remap]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
importer="dialogue_manager_compiler_12"
 | 
					importer="dialogue_manager_compiler_11"
 | 
				
			||||||
type="Resource"
 | 
					type="Resource"
 | 
				
			||||||
uid="uid://dntkvjjr8mrgf"
 | 
					uid="uid://dntkvjjr8mrgf"
 | 
				
			||||||
path="res://.godot/imported/doc.dialogue-8f95f6a09d3ac685b71d7e07c49df1c6.tres"
 | 
					path="res://.godot/imported/doc.dialogue-8f95f6a09d3ac685b71d7e07c49df1c6.tres"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| 
		 Before Width: | Height: | Size: 189 B  | 
| 
						 | 
					@ -1,34 +0,0 @@
 | 
				
			||||||
[remap]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
importer="texture"
 | 
					 | 
				
			||||||
type="CompressedTexture2D"
 | 
					 | 
				
			||||||
uid="uid://dc1gcsbhkchvg"
 | 
					 | 
				
			||||||
path="res://.godot/imported/hotbar-active.png-7657e1b4001be05323aa0d0697509f58.ctex"
 | 
					 | 
				
			||||||
metadata={
 | 
					 | 
				
			||||||
"vram_texture": false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[deps]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
source_file="res://Assets/Sprites/UI/hotbar-active.png"
 | 
					 | 
				
			||||||
dest_files=["res://.godot/imported/hotbar-active.png-7657e1b4001be05323aa0d0697509f58.ctex"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[params]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
compress/mode=0
 | 
					 | 
				
			||||||
compress/high_quality=false
 | 
					 | 
				
			||||||
compress/lossy_quality=0.7
 | 
					 | 
				
			||||||
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/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
 | 
					 | 
				
			||||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| 
		 Before Width: | Height: | Size: 153 B After Width: | Height: | Size: 115 B  | 
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| 
		 Before Width: | Height: | Size: 832 B  | 
| 
						 | 
					@ -1,34 +0,0 @@
 | 
				
			||||||
[remap]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
importer="texture"
 | 
					 | 
				
			||||||
type="CompressedTexture2D"
 | 
					 | 
				
			||||||
uid="uid://uhmowtsi3wfh"
 | 
					 | 
				
			||||||
path="res://.godot/imported/menu-rect-no-bg-white.png-5ea2d275879af97991070fb370031211.ctex"
 | 
					 | 
				
			||||||
metadata={
 | 
					 | 
				
			||||||
"vram_texture": false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[deps]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
source_file="res://Assets/Sprites/UI/menu-rect-no-bg-white.png"
 | 
					 | 
				
			||||||
dest_files=["res://.godot/imported/menu-rect-no-bg-white.png-5ea2d275879af97991070fb370031211.ctex"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[params]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
compress/mode=0
 | 
					 | 
				
			||||||
compress/high_quality=false
 | 
					 | 
				
			||||||
compress/lossy_quality=0.7
 | 
					 | 
				
			||||||
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/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
 | 
					 | 
				
			||||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								| 
		 Before Width: | Height: | Size: 579 B  | 
| 
						 | 
					@ -1,34 +0,0 @@
 | 
				
			||||||
[remap]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
importer="texture"
 | 
					 | 
				
			||||||
type="CompressedTexture2D"
 | 
					 | 
				
			||||||
uid="uid://vjdyrv8wp7gl"
 | 
					 | 
				
			||||||
path="res://.godot/imported/forsenLevel.png-ffd03264deccb9275d087fadbb57e56f.ctex"
 | 
					 | 
				
			||||||
metadata={
 | 
					 | 
				
			||||||
"vram_texture": false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[deps]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
source_file="res://Assets/Sprites/forsenLevel.png"
 | 
					 | 
				
			||||||
dest_files=["res://.godot/imported/forsenLevel.png-ffd03264deccb9275d087fadbb57e56f.ctex"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[params]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
compress/mode=0
 | 
					 | 
				
			||||||
compress/high_quality=false
 | 
					 | 
				
			||||||
compress/lossy_quality=0.7
 | 
					 | 
				
			||||||
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/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
 | 
					 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,6 @@ namespace SupaLidlGame.BoundingBoxes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public abstract partial class BoundingBox : Area2D, IFaction
 | 
					public abstract partial class BoundingBox : Area2D, IFaction
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    [Export(PropertyHint.Flags)]
 | 
					    [Export]
 | 
				
			||||||
    public FactionName Faction { get; set; }
 | 
					    public ushort Faction { get; set; }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,8 +93,8 @@ public partial class Character : CharacterBody2D, IFaction
 | 
				
			||||||
    [Export]
 | 
					    [Export]
 | 
				
			||||||
    public BoundingBoxes.Hurtbox Hurtbox { get; set; }
 | 
					    public BoundingBoxes.Hurtbox Hurtbox { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [Export(PropertyHint.Flags)]
 | 
					    [Export]
 | 
				
			||||||
    public FactionName Faction { get; set; }
 | 
					    public ushort Faction { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public AnimationPlayer MovementAnimation { get; set; }
 | 
					    public AnimationPlayer MovementAnimation { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -573,7 +573,6 @@ Sprite = NodePath("Sprite")
 | 
				
			||||||
Inventory = NodePath("Inventory")
 | 
					Inventory = NodePath("Inventory")
 | 
				
			||||||
StateMachine = NodePath("StateMachine")
 | 
					StateMachine = NodePath("StateMachine")
 | 
				
			||||||
Hurtbox = NodePath("Hurtbox")
 | 
					Hurtbox = NodePath("Hurtbox")
 | 
				
			||||||
Faction = 2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Stats" type="Node" parent="."]
 | 
					[node name="Stats" type="Node" parent="."]
 | 
				
			||||||
script = ExtResource("5_a7fiw")
 | 
					script = ExtResource("5_a7fiw")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,6 @@
 | 
				
			||||||
using Godot;
 | 
					using Godot;
 | 
				
			||||||
using SupaLidlGame.Extensions;
 | 
					using SupaLidlGame.Extensions;
 | 
				
			||||||
using SupaLidlGame.Items;
 | 
					using SupaLidlGame.Items;
 | 
				
			||||||
using SupaLidlGame.Utils;
 | 
					 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace SupaLidlGame.Characters;
 | 
					namespace SupaLidlGame.Characters;
 | 
				
			||||||
| 
						 | 
					@ -128,37 +127,6 @@ public partial class NPC : Character
 | 
				
			||||||
        return bestChar;
 | 
					        return bestChar;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// <summary>
 | 
					 | 
				
			||||||
    /// Finds the best character whose faction aligns with this character's.
 | 
					 | 
				
			||||||
    /// </summary>
 | 
					 | 
				
			||||||
    public virtual Character FindBestNeutral()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        float bestScore = float.MaxValue;
 | 
					 | 
				
			||||||
        Character bestChar = null;
 | 
					 | 
				
			||||||
        // NOTE: this relies on all Characters being under the Entities node
 | 
					 | 
				
			||||||
        foreach (Node node in GetParent().GetChildren())
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (node is Character character)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool isFriendly = ((IFaction)this).AlignsWith(character);
 | 
					 | 
				
			||||||
                if (isFriendly || character.Health <= 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    continue;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                float score = 0;
 | 
					 | 
				
			||||||
                score -= Position.DistanceTo(character.Position);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (score < bestScore)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    bestScore = score;
 | 
					 | 
				
			||||||
                    bestChar = character;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return bestChar;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public override void _Process(double delta)
 | 
					    public override void _Process(double delta)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        ThinkerStateMachine.Process(delta);
 | 
					        ThinkerStateMachine.Process(delta);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,14 +4,14 @@
 | 
				
			||||||
[ext_resource type="Script" path="res://State/Character/CharacterStateMachine.cs" id="2_kynkg"]
 | 
					[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="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/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="Script" path="res://State/Thinker/ThinkerStateMachine.cs" id="4_mo4wj"]
 | 
				
			||||||
[ext_resource type="Script" path="res://State/Thinker/VendorIdle.cs" id="5_oau5d"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="5_sjs24"]
 | 
					[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="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="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"]
 | 
					[ext_resource type="Script" path="res://Items/Inventory.cs" id="7_vip6b"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="SnusDealer" type="CharacterBody2D" node_paths=PackedStringArray("ThinkerStateMachine", "Sprite", "Inventory", "StateMachine")]
 | 
					[node name="Character" type="CharacterBody2D" node_paths=PackedStringArray("ThinkerStateMachine", "Sprite", "Inventory", "StateMachine")]
 | 
				
			||||||
script = ExtResource("1_04gcf")
 | 
					script = ExtResource("1_04gcf")
 | 
				
			||||||
ThinkerStateMachine = NodePath("Thinker")
 | 
					ThinkerStateMachine = NodePath("Thinker")
 | 
				
			||||||
Sprite = NodePath("Sprites/Sprite")
 | 
					Sprite = NodePath("Sprites/Sprite")
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@ script = ExtResource("4_mo4wj")
 | 
				
			||||||
InitialState = NodePath("Idle")
 | 
					InitialState = NodePath("Idle")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Idle" type="Node" parent="Thinker" node_paths=PackedStringArray("NPC")]
 | 
					[node name="Idle" type="Node" parent="Thinker" node_paths=PackedStringArray("NPC")]
 | 
				
			||||||
script = ExtResource("5_oau5d")
 | 
					script = ExtResource("3_rgc42")
 | 
				
			||||||
NPC = NodePath("../..")
 | 
					NPC = NodePath("../..")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Animations" type="Node" parent="."]
 | 
					[node name="Animations" type="Node" parent="."]
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@ position = Vector2(0, -4)
 | 
				
			||||||
script = ExtResource("5_yknpw")
 | 
					script = ExtResource("5_yknpw")
 | 
				
			||||||
InteractionTrigger = NodePath("InteractionTrigger")
 | 
					InteractionTrigger = NodePath("InteractionTrigger")
 | 
				
			||||||
DialogueResource = ExtResource("6_isvnq")
 | 
					DialogueResource = ExtResource("6_isvnq")
 | 
				
			||||||
DialogueTitle = "start"
 | 
					DialogueTitle = "shop"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="InteractionTrigger" parent="Interaction" instance=ExtResource("5_sjs24")]
 | 
					[node name="InteractionTrigger" parent="Interaction" instance=ExtResource("5_sjs24")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,23 @@
 | 
				
			||||||
~ start
 | 
					~ start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Snus Dealer: Hey kid, wanna buy some snus?
 | 
					Snus Dealer: d
 | 
				
			||||||
- Alright. => shop
 | 
					
 | 
				
			||||||
- No, I don't think so. => END
 | 
					% => test
 | 
				
			||||||
- Snus? => dont_snus
 | 
					% => dont_snus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=> END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~ test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Snus Dealer: asdadsadasd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
=> END
 | 
					=> END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
~ dont_snus
 | 
					~ dont_snus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Snus Dealer: You know what they say.
 | 
					 | 
				
			||||||
Snus Dealer: If you don't snus...
 | 
					Snus Dealer: If you don't snus...
 | 
				
			||||||
Snus Dealer: you lose.
 | 
					Snus Dealer: you lose.
 | 
				
			||||||
- Pepepains
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
=> start
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
~ shop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
do emit("EnterShop", "res://Items/Shops/SnusDealer.tres")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
=> END
 | 
					=> END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					~ shop
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
[remap]
 | 
					[remap]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
importer="dialogue_manager_compiler_12"
 | 
					importer="dialogue_manager_compiler_11"
 | 
				
			||||||
type="Resource"
 | 
					type="Resource"
 | 
				
			||||||
uid="uid://c4n7vhoxybu70"
 | 
					uid="uid://c4n7vhoxybu70"
 | 
				
			||||||
path="res://.godot/imported/snus-dealer.dialogue-69dbddee28632f18888364bae03f393d.tres"
 | 
					path="res://.godot/imported/snus-dealer.dialogue-69dbddee28632f18888364bae03f393d.tres"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,9 +51,6 @@ public partial class EventBus : Node
 | 
				
			||||||
    [Signal]
 | 
					    [Signal]
 | 
				
			||||||
    public delegate void ExitTransitionEventHandler();
 | 
					    public delegate void ExitTransitionEventHandler();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [Signal]
 | 
					 | 
				
			||||||
    public delegate void EnterShopEventHandler(string shopResourcePath);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public override void _Ready()
 | 
					    public override void _Ready()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        ProcessMode = ProcessModeEnum.Always;
 | 
					        ProcessMode = ProcessModeEnum.Always;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,15 +0,0 @@
 | 
				
			||||||
namespace SupaLidlGame.Items;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public interface IItemCollection
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public System.Collections.Generic.IEnumerable<ItemMetadata> GetItems();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public int Capacity { get; }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public interface IItemCollection<T> : IItemCollection
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public bool Add(T item);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool Remove(T item);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ using Godot.Collections;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace SupaLidlGame.Items;
 | 
					namespace SupaLidlGame.Items;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
					public partial class Inventory : Node2D
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public Character Character { get; private set; }
 | 
					    public Character Character { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,15 +20,7 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
				
			||||||
    [Signal]
 | 
					    [Signal]
 | 
				
			||||||
    public delegate void UsedItemEventHandler(Item item);
 | 
					    public delegate void UsedItemEventHandler(Item item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [Signal]
 | 
					    public const int MaxCapacity = 3;
 | 
				
			||||||
    public delegate void EquippedItemEventHandler(Item newItem, Item prevItem);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Signal]
 | 
					 | 
				
			||||||
    public delegate void ItemAddedEventHandler(ItemMetadata newItemMetadata);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public int Capacity { get; set; } = 30;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public const int HotbarCapacity = 3;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private Item _selectedItem;
 | 
					    private Item _selectedItem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,8 +87,7 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Item prevItem = _selectedItem;
 | 
					        _selectedItem?.Unequip(Character);
 | 
				
			||||||
        prevItem?.Unequip(Character);
 | 
					 | 
				
			||||||
        _selectedIndex = index;
 | 
					        _selectedIndex = index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (index >= 0)
 | 
					        if (index >= 0)
 | 
				
			||||||
| 
						 | 
					@ -109,8 +100,6 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
				
			||||||
            _selectedItem = null;
 | 
					            _selectedItem = null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        EmitSignal(SignalName.EquippedItem, prevItem, _selectedItem);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        GD.Print($"Inventory: {index} is new selected index.");
 | 
					        GD.Print($"Inventory: {index} is new selected index.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
| 
						 | 
					@ -146,9 +135,8 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
				
			||||||
        return null;
 | 
					        return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Item AddToHotbar(ItemMetadata metadata)
 | 
					    public Item AddItemToHotbar(ItemMetadata metadata)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        //AddItemMetadata(metadata);
 | 
					 | 
				
			||||||
        var item = metadata.Instance.Instantiate<Item>();
 | 
					        var item = metadata.Instance.Instantiate<Item>();
 | 
				
			||||||
        AddItem(item);
 | 
					        AddItem(item);
 | 
				
			||||||
        AddChild(item);
 | 
					        AddChild(item);
 | 
				
			||||||
| 
						 | 
					@ -158,7 +146,7 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Item AddItem(Item item)
 | 
					    public Item AddItem(Item item)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (Hotbar.Count >= HotbarCapacity)
 | 
					        if (Hotbar.Count >= MaxCapacity)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -169,32 +157,9 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata>
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Hotbar.Add(item);
 | 
					            Hotbar.Add(item);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return item;
 | 
					        return item;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public System.Collections.Generic.IEnumerable<ItemMetadata> GetItems()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return Items;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool Add(ItemMetadata item)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (Items.Count >= Capacity)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Items.Add(item);
 | 
					 | 
				
			||||||
        EmitSignal(SignalName.ItemAdded, item);
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool Remove(ItemMetadata item)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return Items.Remove(item);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Item DropItem(Item item)
 | 
					    public Item DropItem(Item item)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        item.CharacterOwner = null;
 | 
					        item.CharacterOwner = null;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,45 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
using Godot.Collections;
 | 
					 | 
				
			||||||
using GodotUtilities.Collections;
 | 
					 | 
				
			||||||
using System.Linq;
 | 
					 | 
				
			||||||
using SupaLidlGame.Utils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.Items;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[GlobalClass]
 | 
					 | 
				
			||||||
public partial class Shop : Resource, IItemCollection<ShopEntry>
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    [Export]
 | 
					 | 
				
			||||||
    protected Godot.Collections.Array<ShopEntry> Entries { get; private set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public System.Collections.Generic.IEnumerable<ItemMetadata> GetItems()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        var mapState = World.Instance.GlobalState.MapState;
 | 
					 | 
				
			||||||
        return Entries
 | 
					 | 
				
			||||||
            .Where(
 | 
					 | 
				
			||||||
                (entry) =>
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var condition = entry.MapStateCondition;
 | 
					 | 
				
			||||||
                    if (string.IsNullOrEmpty(condition))
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        return true;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    return mapState.GetBoolean(condition) ?? false;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            .Select((entry) => entry.Item);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool Add(ShopEntry entry)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Entries.Add(entry);
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool Remove(ShopEntry entry)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return Entries.Remove(entry);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public int Capacity => Entries.Count;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,23 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.Items;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[GlobalClass]
 | 
					 | 
				
			||||||
public partial class ShopEntry : Resource
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public ShopEntry() : base()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ShopEntry(ItemMetadata item) : base()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Item = item;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Export]
 | 
					 | 
				
			||||||
    public ItemMetadata Item { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Export]
 | 
					 | 
				
			||||||
    public string MapStateCondition { get; set; }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,54 +0,0 @@
 | 
				
			||||||
[gd_resource type="Resource" script_class="Shop" load_steps=16 format=3 uid="uid://djqd88vdkoi6d"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://Items/Shop.cs" id="1_betbc"]
 | 
					 | 
				
			||||||
[ext_resource type="Resource" uid="uid://cjsh0dcgbfn77" path="res://Items/Weapons/Bow.tres" id="1_ntroj"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://Items/ShopEntry.cs" id="2_xgvwu"]
 | 
					 | 
				
			||||||
[ext_resource type="Resource" uid="uid://iqe6rgnb3jur" path="res://Items/Weapons/Pugio.tres" id="3_nfeft"]
 | 
					 | 
				
			||||||
[ext_resource type="Resource" uid="uid://dkm216ug0vj2h" path="res://Items/Weapons/Shotgun.tres" id="4_aw0ju"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_jdx0p"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
Item = ExtResource("1_ntroj")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_min4b"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
Item = ExtResource("3_nfeft")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_t0x08"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
Item = ExtResource("4_aw0ju")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_exmab"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_jlgb3"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_8rd47"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_pqgh5"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_8mift"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_4e8it"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_jp7ms"]
 | 
					 | 
				
			||||||
script = ExtResource("2_xgvwu")
 | 
					 | 
				
			||||||
MapStateCondition = ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resource]
 | 
					 | 
				
			||||||
script = ExtResource("1_betbc")
 | 
					 | 
				
			||||||
Entries = Array[Object]([SubResource("Resource_jdx0p"), SubResource("Resource_min4b"), SubResource("Resource_t0x08"), SubResource("Resource_exmab"), SubResource("Resource_jlgb3"), SubResource("Resource_8rd47"), SubResource("Resource_pqgh5"), SubResource("Resource_8mift"), SubResource("Resource_4e8it"), SubResource("Resource_jp7ms")])
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,5 @@
 | 
				
			||||||
[gd_resource type="Resource" script_class="ItemMetadata" load_steps=5 format=3 uid="uid://cjsh0dcgbfn77"]
 | 
					[gd_resource type="Resource" script_class="ItemMetadata" load_steps=4 format=3 uid="uid://cjsh0dcgbfn77"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://vjdyrv8wp7gl" path="res://Assets/Sprites/forsenLevel.png" id="1_5blro"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_haiji"]
 | 
					[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_haiji"]
 | 
				
			||||||
[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_hjbs0"]
 | 
					[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_hjbs0"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +10,6 @@ Path = "res://Items/Weapons/Bow.tscn"
 | 
				
			||||||
[resource]
 | 
					[resource]
 | 
				
			||||||
script = ExtResource("2_hjbs0")
 | 
					script = ExtResource("2_hjbs0")
 | 
				
			||||||
Instance = SubResource("Resource_mjj1w")
 | 
					Instance = SubResource("Resource_mjj1w")
 | 
				
			||||||
Icon = ExtResource("1_5blro")
 | 
					 | 
				
			||||||
Name = "Bow"
 | 
					Name = "Bow"
 | 
				
			||||||
Description = "A bow and arrow."
 | 
					Description = "A bow and arrow."
 | 
				
			||||||
BuyPrice = 0
 | 
					BuyPrice = 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,5 @@
 | 
				
			||||||
[gd_resource type="Resource" script_class="ItemMetadata" load_steps=5 format=3 uid="uid://iqe6rgnb3jur"]
 | 
					[gd_resource type="Resource" script_class="ItemMetadata" load_steps=4 format=3 uid="uid://iqe6rgnb3jur"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://vjdyrv8wp7gl" path="res://Assets/Sprites/forsenLevel.png" id="1_3ptey"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_o026a"]
 | 
					[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_o026a"]
 | 
				
			||||||
[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_j4tmu"]
 | 
					[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_j4tmu"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +10,6 @@ Path = "res://Items/Weapons/Pugio.tscn"
 | 
				
			||||||
[resource]
 | 
					[resource]
 | 
				
			||||||
script = ExtResource("2_j4tmu")
 | 
					script = ExtResource("2_j4tmu")
 | 
				
			||||||
Instance = SubResource("Resource_abrg1")
 | 
					Instance = SubResource("Resource_abrg1")
 | 
				
			||||||
Icon = ExtResource("1_3ptey")
 | 
					 | 
				
			||||||
Name = "Pugio"
 | 
					Name = "Pugio"
 | 
				
			||||||
Description = "A sidearm dagger."
 | 
					Description = "A sidearm dagger."
 | 
				
			||||||
BuyPrice = 0
 | 
					BuyPrice = 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +0,0 @@
 | 
				
			||||||
[gd_resource type="Resource" script_class="ItemMetadata" load_steps=5 format=3 uid="uid://dkm216ug0vj2h"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_owc5r"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://vjdyrv8wp7gl" path="res://Assets/Sprites/forsenLevel.png" id="1_v76vk"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="1_vtlr1"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Resource" id="Resource_6sxq7"]
 | 
					 | 
				
			||||||
script = ExtResource("1_owc5r")
 | 
					 | 
				
			||||||
Path = "res://Items/Weapons/Shotgun.tscn"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resource]
 | 
					 | 
				
			||||||
script = ExtResource("1_vtlr1")
 | 
					 | 
				
			||||||
Instance = SubResource("Resource_6sxq7")
 | 
					 | 
				
			||||||
Icon = ExtResource("1_v76vk")
 | 
					 | 
				
			||||||
Name = "Shotgun"
 | 
					 | 
				
			||||||
Description = ""
 | 
					 | 
				
			||||||
BuyPrice = 1887
 | 
					 | 
				
			||||||
SellPrice = 0
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,9 @@
 | 
				
			||||||
[gd_scene load_steps=27 format=3 uid="uid://d1d4vg7we5rjr"]
 | 
					[gd_scene load_steps=26 format=3 uid="uid://d1d4vg7we5rjr"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Script" path="res://Items/Weapons/ProjectileSpawner.cs" id="1_4xyyt"]
 | 
					[ext_resource type="Script" path="res://Items/Weapons/ProjectileSpawner.cs" id="1_4xyyt"]
 | 
				
			||||||
[ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_ag6rd"]
 | 
					[ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_ag6rd"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://da1do2r2pbayb" path="res://Entities/ShotgunPellet.tscn" id="2_p3wx2"]
 | 
					[ext_resource type="PackedScene" uid="uid://da1do2r2pbayb" path="res://Entities/ShotgunPellet.tscn" id="2_p3wx2"]
 | 
				
			||||||
[ext_resource type="Script" path="res://State/Weapon/RangedIdleState.cs" id="3_dd6bh"]
 | 
					[ext_resource type="Script" path="res://State/Weapon/RangedIdleState.cs" id="3_dd6bh"]
 | 
				
			||||||
[ext_resource type="Resource" uid="uid://dkm216ug0vj2h" path="res://Items/Weapons/Shotgun.tres" id="3_ju036"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://State/Weapon/RangedFireState.cs" id="4_bwqd6"]
 | 
					[ext_resource type="Script" path="res://State/Weapon/RangedFireState.cs" id="4_bwqd6"]
 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b1omx2kdb2x1n" path="res://Assets/Sprites/Items/shotgun.png" id="5_g8d45"]
 | 
					[ext_resource type="Texture2D" uid="uid://b1omx2kdb2x1n" path="res://Assets/Sprites/Items/shotgun.png" id="5_g8d45"]
 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="6_va8ee"]
 | 
					[ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="6_va8ee"]
 | 
				
			||||||
| 
						 | 
					@ -217,9 +216,11 @@ curve = SubResource("Curve_mqgo6")
 | 
				
			||||||
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_uexo4"]
 | 
					[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_uexo4"]
 | 
				
			||||||
particle_flag_disable_z = true
 | 
					particle_flag_disable_z = true
 | 
				
			||||||
flatness = 1.0
 | 
					flatness = 1.0
 | 
				
			||||||
 | 
					gravity = Vector3(0, -4, 0)
 | 
				
			||||||
initial_velocity_min = -8.0
 | 
					initial_velocity_min = -8.0
 | 
				
			||||||
initial_velocity_max = 24.0
 | 
					initial_velocity_max = 24.0
 | 
				
			||||||
gravity = Vector3(0, -4, 0)
 | 
					orbit_velocity_min = 0.0
 | 
				
			||||||
 | 
					orbit_velocity_max = 0.0
 | 
				
			||||||
scale_min = 0.75
 | 
					scale_min = 0.75
 | 
				
			||||||
scale_curve = SubResource("CurveTexture_3omj5")
 | 
					scale_curve = SubResource("CurveTexture_3omj5")
 | 
				
			||||||
color_ramp = SubResource("GradientTexture1D_83h4s")
 | 
					color_ramp = SubResource("GradientTexture1D_83h4s")
 | 
				
			||||||
| 
						 | 
					@ -235,11 +236,13 @@ gradient = SubResource("Gradient_jks7f")
 | 
				
			||||||
particle_flag_disable_z = true
 | 
					particle_flag_disable_z = true
 | 
				
			||||||
direction = Vector3(-1, -2, 0)
 | 
					direction = Vector3(-1, -2, 0)
 | 
				
			||||||
spread = 10.0
 | 
					spread = 10.0
 | 
				
			||||||
 | 
					gravity = Vector3(0, 64, 0)
 | 
				
			||||||
initial_velocity_min = 16.0
 | 
					initial_velocity_min = 16.0
 | 
				
			||||||
initial_velocity_max = 32.0
 | 
					initial_velocity_max = 32.0
 | 
				
			||||||
angular_velocity_min = 30.0
 | 
					angular_velocity_min = 30.0
 | 
				
			||||||
angular_velocity_max = 60.0
 | 
					angular_velocity_max = 60.0
 | 
				
			||||||
gravity = Vector3(0, 64, 0)
 | 
					orbit_velocity_min = 0.0
 | 
				
			||||||
 | 
					orbit_velocity_max = 0.0
 | 
				
			||||||
scale_min = 2.0
 | 
					scale_min = 2.0
 | 
				
			||||||
scale_max = 2.0
 | 
					scale_max = 2.0
 | 
				
			||||||
color_ramp = SubResource("GradientTexture1D_eeskk")
 | 
					color_ramp = SubResource("GradientTexture1D_eeskk")
 | 
				
			||||||
| 
						 | 
					@ -256,7 +259,6 @@ Damage = 12.0
 | 
				
			||||||
UseTime = 1.5
 | 
					UseTime = 1.5
 | 
				
			||||||
InitialVelocity = 220.0
 | 
					InitialVelocity = 220.0
 | 
				
			||||||
PlayerLevelGain = 0.5
 | 
					PlayerLevelGain = 0.5
 | 
				
			||||||
Metadata = ExtResource("3_ju036")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")]
 | 
					[node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")]
 | 
				
			||||||
script = ExtResource("2_ag6rd")
 | 
					script = ExtResource("2_ag6rd")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,10 +3,11 @@
 | 
				
			||||||
[ext_resource type="Script" path="res://Utils/World.cs" id="1_1k6ew"]
 | 
					[ext_resource type="Script" path="res://Utils/World.cs" id="1_1k6ew"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://c271rdjhd1gfo" path="res://UI/Base.tscn" id="2_mm0qt"]
 | 
					[ext_resource type="PackedScene" uid="uid://c271rdjhd1gfo" path="res://UI/Base.tscn" id="2_mm0qt"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="World" type="Node2D" node_paths=PackedStringArray("MusicPlayer")]
 | 
					[node name="World" type="Node2D" node_paths=PackedStringArray("MusicPlayer", "DialogueBalloon")]
 | 
				
			||||||
process_mode = 3
 | 
					process_mode = 3
 | 
				
			||||||
script = ExtResource("1_1k6ew")
 | 
					script = ExtResource("1_1k6ew")
 | 
				
			||||||
MusicPlayer = NodePath("MusicPlayer")
 | 
					MusicPlayer = NodePath("MusicPlayer")
 | 
				
			||||||
 | 
					DialogueBalloon = NodePath("CanvasLayer/SubViewportContainer/UIViewport/DialogBalloon")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="CanvasLayer" parent="." instance=ExtResource("2_mm0qt")]
 | 
					[node name="CanvasLayer" parent="." instance=ExtResource("2_mm0qt")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +21,6 @@ anchor_right = 1.0
 | 
				
			||||||
anchor_bottom = 1.0
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
grow_horizontal = 2
 | 
					grow_horizontal = 2
 | 
				
			||||||
grow_vertical = 2
 | 
					grow_vertical = 2
 | 
				
			||||||
mouse_filter = 2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="MusicPlayer" type="AudioStreamPlayer" parent="."]
 | 
					[node name="MusicPlayer" type="AudioStreamPlayer" parent="."]
 | 
				
			||||||
bus = &"Music"
 | 
					bus = &"Music"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,13 +45,4 @@ public partial class MapState : Resource
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool? GetBoolean(string key)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (_state[key].VariantType == Variant.Type.Bool)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return (bool)_state[key];
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,17 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
using GodotUtilities;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.State.Thinker;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public partial class VendorIdle : ThinkerState
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public override ThinkerState Think()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        var bestNeutral = NPC.FindBestNeutral();
 | 
					 | 
				
			||||||
        if (bestNeutral is not null)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            NPC.Target = bestNeutral.Position - NPC.Position;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
								
									
									
										
											98
										
									
									UI/Base.tscn
									
									
									
									
								
								
							
							
										
											98
										
									
									UI/Base.tscn
									
									
									
									
								| 
						 | 
					@ -1,28 +1,18 @@
 | 
				
			||||||
[gd_scene load_steps=18 format=3 uid="uid://c271rdjhd1gfo"]
 | 
					[gd_scene load_steps=14 format=3 uid="uid://c271rdjhd1gfo"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://73jm5qjy52vq" path="res://Dialogue/balloon.tscn" id="1_atjb1"]
 | 
				
			||||||
[ext_resource type="Script" path="res://UI/UIController.cs" id="2_b4b6l"]
 | 
					[ext_resource type="Script" path="res://UI/UIController.cs" id="2_b4b6l"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://bxo553hblp6nf" path="res://UI/HealthBar.tscn" id="3_j1j6h"]
 | 
					[ext_resource type="PackedScene" uid="uid://bxo553hblp6nf" path="res://UI/HealthBar.tscn" id="3_j1j6h"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://01d24ij5av1y" path="res://UI/BossBar.tscn" id="4_igi28"]
 | 
					[ext_resource type="PackedScene" uid="uid://01d24ij5av1y" path="res://UI/BossBar.tscn" id="4_igi28"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://cr7tkxctmyags" path="res://UI/LevelBar.tscn" id="4_rcekd"]
 | 
					[ext_resource type="PackedScene" uid="uid://cr7tkxctmyags" path="res://UI/LevelBar.tscn" id="4_rcekd"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://c77754nvmckn" path="res://UI/LocationDisplay.tscn" id="5_cr6vo"]
 | 
					[ext_resource type="PackedScene" uid="uid://c77754nvmckn" path="res://UI/LocationDisplay.tscn" id="5_cr6vo"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://sfs8dpfitpdu" path="res://UI/Inventory/Hotbar.tscn" id="5_mmp18"]
 | 
					[ext_resource type="PackedScene" uid="uid://sfs8dpfitpdu" path="res://UI/Hotbar.tscn" id="5_mmp18"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://d3q1yu3n7cqfj" path="res://UI/SceneTransition.tscn" id="6_j0nhv"]
 | 
					[ext_resource type="PackedScene" uid="uid://d3q1yu3n7cqfj" path="res://UI/SceneTransition.tscn" id="6_j0nhv"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://cyggkyqosjk36" path="res://UI/Inventory/ShopMenu.tscn" id="8_ep3ae"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://2afbrf8asy2a" path="res://UI/PostProcessing/Vignette.tscn" id="9_p1ubd"]
 | 
					[ext_resource type="PackedScene" uid="uid://2afbrf8asy2a" path="res://UI/PostProcessing/Vignette.tscn" id="9_p1ubd"]
 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://b1wsryv4bn0cn" path="res://UI/PostProcessing/StunEffect.tscn" id="10_646ma"]
 | 
					[ext_resource type="PackedScene" uid="uid://b1wsryv4bn0cn" path="res://UI/PostProcessing/StunEffect.tscn" id="10_646ma"]
 | 
				
			||||||
[ext_resource type="Shader" path="res://Shaders/Grayscale.gdshader" id="11_w4gn1"]
 | 
					[ext_resource type="Shader" path="res://Shaders/Grayscale.gdshader" id="11_w4gn1"]
 | 
				
			||||||
[ext_resource type="Theme" uid="uid://cksjbu3vrup5" path="res://UI/Themes/supalidl.tres" id="11_wtdum"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://bw052v8ikfget" path="res://icon.svg" id="12_tyv35"]
 | 
					[ext_resource type="Texture2D" uid="uid://bw052v8ikfget" path="res://icon.svg" id="12_tyv35"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a504f"]
 | 
					 | 
				
			||||||
bg_color = Color(0.906763, 0, 0.280984, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gheod"]
 | 
					 | 
				
			||||||
bg_color = Color(1, 0.315507, 0.447521, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1nm23"]
 | 
					 | 
				
			||||||
bg_color = Color(0.951511, 0.387714, 0.416256, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_kbd61"]
 | 
					[sub_resource type="ShaderMaterial" id="ShaderMaterial_kbd61"]
 | 
				
			||||||
shader = ExtResource("11_w4gn1")
 | 
					shader = ExtResource("11_w4gn1")
 | 
				
			||||||
shader_parameter/grayscale_intensity = 0.0
 | 
					shader_parameter/grayscale_intensity = 0.0
 | 
				
			||||||
| 
						 | 
					@ -30,35 +20,6 @@ shader_parameter/grayscale_intensity = 0.0
 | 
				
			||||||
[node name="BaseUI" type="CanvasLayer"]
 | 
					[node name="BaseUI" type="CanvasLayer"]
 | 
				
			||||||
process_mode = 3
 | 
					process_mode = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Button" type="Button" parent="."]
 | 
					 | 
				
			||||||
offset_left = 536.0
 | 
					 | 
				
			||||||
offset_right = 592.0
 | 
					 | 
				
			||||||
offset_bottom = 31.0
 | 
					 | 
				
			||||||
theme_override_styles/focus = SubResource("StyleBoxFlat_a504f")
 | 
					 | 
				
			||||||
theme_override_styles/hover = SubResource("StyleBoxFlat_gheod")
 | 
					 | 
				
			||||||
theme_override_styles/normal = SubResource("StyleBoxFlat_1nm23")
 | 
					 | 
				
			||||||
text = "sdfsdf"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="PostProcessing" type="CanvasLayer" parent="."]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Vignette" parent="PostProcessing" instance=ExtResource("9_p1ubd")]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="StunEffect" parent="PostProcessing" instance=ExtResource("10_646ma")]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Sprite2D" type="TextureRect" parent="PostProcessing"]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
material = SubResource("ShaderMaterial_kbd61")
 | 
					 | 
				
			||||||
anchors_preset = 3
 | 
					 | 
				
			||||||
anchor_left = 1.0
 | 
					 | 
				
			||||||
anchor_top = 1.0
 | 
					 | 
				
			||||||
anchor_right = 1.0
 | 
					 | 
				
			||||||
anchor_bottom = 1.0
 | 
					 | 
				
			||||||
offset_left = -128.0
 | 
					 | 
				
			||||||
offset_top = -128.0
 | 
					 | 
				
			||||||
grow_horizontal = 0
 | 
					 | 
				
			||||||
grow_vertical = 0
 | 
					 | 
				
			||||||
texture = ExtResource("12_tyv35")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="SubViewportContainer" type="SubViewportContainer" parent="."]
 | 
					[node name="SubViewportContainer" type="SubViewportContainer" parent="."]
 | 
				
			||||||
anchors_preset = 15
 | 
					anchors_preset = 15
 | 
				
			||||||
anchor_right = 1.0
 | 
					anchor_right = 1.0
 | 
				
			||||||
| 
						 | 
					@ -75,6 +36,9 @@ handle_input_locally = false
 | 
				
			||||||
size = Vector2i(640, 360)
 | 
					size = Vector2i(640, 360)
 | 
				
			||||||
render_target_update_mode = 4
 | 
					render_target_update_mode = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="DialogBalloon" parent="SubViewportContainer/UIViewport" instance=ExtResource("1_atjb1")]
 | 
				
			||||||
 | 
					layer = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="MainUILayer" type="CanvasLayer" parent="SubViewportContainer/UIViewport"]
 | 
					[node name="MainUILayer" type="CanvasLayer" parent="SubViewportContainer/UIViewport"]
 | 
				
			||||||
layer = 3
 | 
					layer = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +52,6 @@ grow_horizontal = 2
 | 
				
			||||||
grow_vertical = 2
 | 
					grow_vertical = 2
 | 
				
			||||||
size_flags_horizontal = 3
 | 
					size_flags_horizontal = 3
 | 
				
			||||||
size_flags_vertical = 3
 | 
					size_flags_vertical = 3
 | 
				
			||||||
mouse_filter = 2
 | 
					 | 
				
			||||||
script = ExtResource("2_b4b6l")
 | 
					script = ExtResource("2_b4b6l")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Top" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"]
 | 
					[node name="Top" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"]
 | 
				
			||||||
| 
						 | 
					@ -115,6 +78,7 @@ layout_mode = 2
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Margin2" type="MarginContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main/Top/Left/VBoxContainer"]
 | 
					[node name="Margin2" type="MarginContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main/Top/Left/VBoxContainer"]
 | 
				
			||||||
 | 
					visible = false
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
theme_override_constants/margin_left = 16
 | 
					theme_override_constants/margin_left = 16
 | 
				
			||||||
theme_override_constants/margin_top = 16
 | 
					theme_override_constants/margin_top = 16
 | 
				
			||||||
| 
						 | 
					@ -128,21 +92,6 @@ theme_override_constants/margin_right = 16
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
_slots = [NodePath("InventorySlot"), NodePath("InventorySlot2"), NodePath("InventorySlot3")]
 | 
					_slots = [NodePath("InventorySlot"), NodePath("InventorySlot2"), NodePath("InventorySlot3")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="BoxContainer" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"]
 | 
					 | 
				
			||||||
layout_mode = 1
 | 
					 | 
				
			||||||
anchors_preset = 11
 | 
					 | 
				
			||||||
anchor_left = 1.0
 | 
					 | 
				
			||||||
anchor_right = 1.0
 | 
					 | 
				
			||||||
anchor_bottom = 1.0
 | 
					 | 
				
			||||||
offset_left = -236.0
 | 
					 | 
				
			||||||
grow_horizontal = 0
 | 
					 | 
				
			||||||
grow_vertical = 2
 | 
					 | 
				
			||||||
alignment = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Panel" parent="SubViewportContainer/UIViewport/MainUILayer/Main/BoxContainer" node_paths=PackedStringArray("_inventoryGrid") instance=ExtResource("8_ep3ae")]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
_inventoryGrid = NodePath("PanelContainer/VBoxContainer/ScrollContainer/InventoryGrid")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Bottom" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"]
 | 
					[node name="Bottom" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"]
 | 
				
			||||||
layout_mode = 1
 | 
					layout_mode = 1
 | 
				
			||||||
anchors_preset = 12
 | 
					anchors_preset = 12
 | 
				
			||||||
| 
						 | 
					@ -158,20 +107,27 @@ alignment = 1
 | 
				
			||||||
visible = false
 | 
					visible = false
 | 
				
			||||||
layout_mode = 2
 | 
					layout_mode = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Button" type="Button" parent="SubViewportContainer/UIViewport/MainUILayer/Main/Bottom"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme = ExtResource("11_wtdum")
 | 
					 | 
				
			||||||
theme_type_variation = &"InventorySlotButton"
 | 
					 | 
				
			||||||
theme_override_styles/hover = SubResource("StyleBoxFlat_gheod")
 | 
					 | 
				
			||||||
text = "sdfsdfa"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="VBoxContainer" type="VBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
layout_mode = 0
 | 
					 | 
				
			||||||
offset_right = 40.0
 | 
					 | 
				
			||||||
offset_bottom = 40.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="LocationDisplay" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("5_cr6vo")]
 | 
					[node name="LocationDisplay" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("5_cr6vo")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="SceneTransition" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("6_j0nhv")]
 | 
					[node name="SceneTransition" parent="SubViewportContainer/UIViewport/MainUILayer" instance=ExtResource("6_j0nhv")]
 | 
				
			||||||
z_index = 1
 | 
					z_index = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="PostProcessing" type="CanvasLayer" parent="."]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Vignette" parent="PostProcessing" instance=ExtResource("9_p1ubd")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="StunEffect" parent="PostProcessing" instance=ExtResource("10_646ma")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Sprite2D" type="TextureRect" parent="PostProcessing"]
 | 
				
			||||||
 | 
					visible = false
 | 
				
			||||||
 | 
					material = SubResource("ShaderMaterial_kbd61")
 | 
				
			||||||
 | 
					anchors_preset = 3
 | 
				
			||||||
 | 
					anchor_left = 1.0
 | 
				
			||||||
 | 
					anchor_top = 1.0
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
 | 
					offset_left = -128.0
 | 
				
			||||||
 | 
					offset_top = -128.0
 | 
				
			||||||
 | 
					grow_horizontal = 0
 | 
				
			||||||
 | 
					grow_vertical = 0
 | 
				
			||||||
 | 
					texture = ExtResource("12_tyv35")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
using Godot;
 | 
					using Godot;
 | 
				
			||||||
 | 
					using SupaLidlGame.Items;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace SupaLidlGame.UI.Inventory;
 | 
					namespace SupaLidlGame.UI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public partial class Hotbar : GridContainer
 | 
					public partial class Hotbar : GridContainer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -12,7 +13,7 @@ public partial class Hotbar : GridContainer
 | 
				
			||||||
        Events.EventBus.Instance.PlayerInventoryUpdate += OnInventoryUpdate;
 | 
					        Events.EventBus.Instance.PlayerInventoryUpdate += OnInventoryUpdate;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void OnInventoryUpdate(Items.Inventory inventory)
 | 
					    public void OnInventoryUpdate(Inventory inventory)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        GD.Print($"UPDATE: {inventory.SelectedIndex} is selected index.");
 | 
					        GD.Print($"UPDATE: {inventory.SelectedIndex} is selected index.");
 | 
				
			||||||
        for (int i = 0; i < 3; i++)
 | 
					        for (int i = 0; i < 3; i++)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					[gd_scene load_steps=3 format=3 uid="uid://sfs8dpfitpdu"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://UI/Hotbar.cs" id="1_2sak2"]
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://ctad0dkoyw8ad" path="res://UI/InventorySlot.tscn" id="1_ct3cn"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Hotbar" type="GridContainer" node_paths=PackedStringArray("_slots")]
 | 
				
			||||||
 | 
					anchors_preset = 1
 | 
				
			||||||
 | 
					anchor_left = 1.0
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					offset_left = -112.0
 | 
				
			||||||
 | 
					offset_bottom = 32.0
 | 
				
			||||||
 | 
					grow_horizontal = 0
 | 
				
			||||||
 | 
					theme_override_constants/h_separation = 8
 | 
				
			||||||
 | 
					columns = 3
 | 
				
			||||||
 | 
					script = ExtResource("1_2sak2")
 | 
				
			||||||
 | 
					_slots = [NodePath("InventorySlot"), NodePath("InventorySlot2"), NodePath("InventorySlot3")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="InventorySlot" parent="." instance=ExtResource("1_ct3cn")]
 | 
				
			||||||
 | 
					layout_mode = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="InventorySlot2" parent="." instance=ExtResource("1_ct3cn")]
 | 
				
			||||||
 | 
					layout_mode = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="InventorySlot3" parent="." instance=ExtResource("1_ct3cn")]
 | 
				
			||||||
 | 
					layout_mode = 2
 | 
				
			||||||
| 
						 | 
					@ -1,30 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=4 format=3 uid="uid://sfs8dpfitpdu"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://UI/Inventory/Hotbar.cs" id="1_2sak2"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://dmvu2hjyrwc1y" path="res://UI/Inventory/HotbarSlot.tscn" id="2_3axfe"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6jbma"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Hotbar" type="GridContainer" node_paths=PackedStringArray("_slots")]
 | 
					 | 
				
			||||||
anchors_preset = 1
 | 
					 | 
				
			||||||
anchor_left = 1.0
 | 
					 | 
				
			||||||
anchor_right = 1.0
 | 
					 | 
				
			||||||
offset_left = -112.0
 | 
					 | 
				
			||||||
offset_bottom = 32.0
 | 
					 | 
				
			||||||
grow_horizontal = 0
 | 
					 | 
				
			||||||
theme_override_constants/h_separation = 8
 | 
					 | 
				
			||||||
columns = 3
 | 
					 | 
				
			||||||
script = ExtResource("1_2sak2")
 | 
					 | 
				
			||||||
_slots = [NodePath("InventorySlot"), NodePath("InventorySlot2"), NodePath("InventorySlot3")]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventorySlot" parent="." instance=ExtResource("2_3axfe")]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_6jbma")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventorySlot2" parent="." instance=ExtResource("2_3axfe")]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_6jbma")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventorySlot3" parent="." instance=ExtResource("2_3axfe")]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_6jbma")
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,16 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=4 format=3 uid="uid://dmvu2hjyrwc1y"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://ctad0dkoyw8ad" path="res://UI/Inventory/InventorySlot.tscn" id="1_fb62b"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://dp7osg05ip5oo" path="res://Assets/Sprites/sword.png" id="2_aqbyo"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://dc1gcsbhkchvg" path="res://Assets/Sprites/UI/hotbar-active.png" id="2_bcv71"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventorySlot" instance=ExtResource("1_fb62b")]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="TextureRect" parent="." index="0"]
 | 
					 | 
				
			||||||
texture = ExtResource("2_aqbyo")
 | 
					 | 
				
			||||||
expand_mode = 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="SelectedFrame" type="NinePatchRect" parent="." index="2"]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
texture = ExtResource("2_bcv71")
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,172 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
using GodotUtilities;
 | 
					 | 
				
			||||||
using SupaLidlGame.Items;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.UI.Inventory;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public partial class InventoryGrid : GridContainer
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    private SupaLidlGame.Items.IItemCollection _source;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Export]
 | 
					 | 
				
			||||||
    private PackedScene _slotScene;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ButtonGroup ButtonGroup { get; private set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public SupaLidlGame.Items.IItemCollection Source
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => _source;
 | 
					 | 
				
			||||||
        set
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GD.Print("Set InventoryGrid source");
 | 
					 | 
				
			||||||
            _source = value;
 | 
					 | 
				
			||||||
            Redraw();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Signal]
 | 
					 | 
				
			||||||
    public delegate void SlotFocusedEventHandler(InventorySlot slot);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Signal]
 | 
					 | 
				
			||||||
    public delegate void SlotUnfocusedEventHandler(InventorySlot slot);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Signal]
 | 
					 | 
				
			||||||
    public delegate void SlotSelectedEventHandler(InventorySlot slot);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public InventoryGrid()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        ButtonGroup = new();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void Redraw()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        GD.Print("Redrawing inventory grid...");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (_source is null)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            this.QueueFreeChildren();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        var children = GetChildren();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (int i = children.Count; i < _source.Capacity; i++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            AddInventorySlot();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (int i = children.Count - 1; i >= _source.Capacity; i--)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            children[i].QueueFree();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        children = GetChildren();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // iterate through items and update the grid
 | 
					 | 
				
			||||||
        using (var items = _source.GetItems().GetEnumerator())
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GD.Print("Updating items...");
 | 
					 | 
				
			||||||
            int i;
 | 
					 | 
				
			||||||
            for (i = 0; items.MoveNext(); i++)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                InventorySlot slot = children[i] as InventorySlot;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ItemMetadata item = items.Current;
 | 
					 | 
				
			||||||
                slot.Item = item;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // make remaining slots display empty
 | 
					 | 
				
			||||||
            for (; i < _source.Capacity; i++)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                InventorySlot slot = children[i] as InventorySlot;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                slot.Item = null;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (int i = 0; i < children.Count; i++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var child = children[i] as Control;
 | 
					 | 
				
			||||||
            if (i > 0)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                child.FocusPrevious = child.GetPathTo(children[i - 1]);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (i < children.Count - 1)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                child.FocusNext = child.GetPathTo(children[i + 1]);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (children.Count > 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var button = children[0] as Button;
 | 
					 | 
				
			||||||
            button.ButtonPressed = true;
 | 
					 | 
				
			||||||
            button.GrabFocus();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private InventorySlot AddInventorySlot()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        var slot = _slotScene.Instantiate<InventorySlot>();
 | 
					 | 
				
			||||||
        AddChild(slot);
 | 
					 | 
				
			||||||
        slot.ButtonGroup = ButtonGroup;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        void focusedHandler()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            EmitSignal(SignalName.SlotFocused, slot);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        void unfocusedHandler()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            EmitSignal(SignalName.SlotUnfocused, slot);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        void toggledHandler()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            EmitSignal(SignalName.SlotSelected, slot);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        slot.Connect(
 | 
					 | 
				
			||||||
            InventorySlot.SignalName.FocusEntered,
 | 
					 | 
				
			||||||
            Callable.From(focusedHandler)
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        slot.Connect(
 | 
					 | 
				
			||||||
            InventorySlot.SignalName.FocusExited,
 | 
					 | 
				
			||||||
            Callable.From(unfocusedHandler)
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        slot.Connect(
 | 
					 | 
				
			||||||
            InventorySlot.SignalName.MouseEntered,
 | 
					 | 
				
			||||||
            Callable.From(focusedHandler)
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        slot.Connect(
 | 
					 | 
				
			||||||
            InventorySlot.SignalName.MouseExited,
 | 
					 | 
				
			||||||
            Callable.From(unfocusedHandler)
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        slot.Connect(
 | 
					 | 
				
			||||||
            InventorySlot.SignalName.Pressed,
 | 
					 | 
				
			||||||
            Callable.From(toggledHandler)
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return slot;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void RemoveInventorySlot(InventorySlot slot)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        RemoveChild(slot);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool GrabSlotFocus()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        var children = GetChildren();
 | 
					 | 
				
			||||||
        if (children.Count > 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var button = children[0] as Button;
 | 
					 | 
				
			||||||
            button.GrabFocus();
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,14 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=3 format=3 uid="uid://chmokkxsy5vas"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://UI/Inventory/InventoryGrid.cs" id="1_7128g"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://ctad0dkoyw8ad" path="res://UI/Inventory/InventorySlot.tscn" id="2_b6vp8"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventoryGrid" type="GridContainer"]
 | 
					 | 
				
			||||||
anchors_preset = 15
 | 
					 | 
				
			||||||
anchor_right = 1.0
 | 
					 | 
				
			||||||
anchor_bottom = 1.0
 | 
					 | 
				
			||||||
grow_horizontal = 2
 | 
					 | 
				
			||||||
grow_vertical = 2
 | 
					 | 
				
			||||||
columns = 5
 | 
					 | 
				
			||||||
script = ExtResource("1_7128g")
 | 
					 | 
				
			||||||
_slotScene = ExtResource("2_b6vp8")
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,95 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
using GodotUtilities;
 | 
					 | 
				
			||||||
using GodotUtilities.SourceGenerators;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.UI.Inventory;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public partial class InventorySlot : Button
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    private bool _isSelected = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public bool IsSelected
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => _isSelected;
 | 
					 | 
				
			||||||
        set
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            _isSelected = value;
 | 
					 | 
				
			||||||
            if (_selectedFrame is not null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                //_selectedFrame.Visible = _isSelected;
 | 
					 | 
				
			||||||
                //_frame.Visible = !_isSelected;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Export]
 | 
					 | 
				
			||||||
    public bool UseFocusAsSelected { get; set; } = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private TextureRect _textureRect;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private NinePatchRect _frame;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private NinePatchRect _selectedFrame;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static Texture2D _placeholderTexture;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private Items.ItemMetadata _item;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Items.ItemMetadata Item
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => _item;
 | 
					 | 
				
			||||||
        set
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            _item = value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (_item is null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                //_textureRect.Texture = null;
 | 
					 | 
				
			||||||
                Icon = null;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                //_textureRect.Texture = _item.Icon;
 | 
					 | 
				
			||||||
                Icon = _item.Icon;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static InventorySlot()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        _placeholderTexture = ResourceLoader.Load<Texture2D>(
 | 
					 | 
				
			||||||
            "res://Assets/Sprites/UI/hotbar-inactive.png");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public override void _Ready()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        _textureRect = GetNode<TextureRect>("TextureRect");
 | 
					 | 
				
			||||||
        _frame = GetNode<NinePatchRect>("Frame");
 | 
					 | 
				
			||||||
        _selectedFrame = GetNode<NinePatchRect>("SelectedFrame");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (Item is null)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            // do this to reset the icon
 | 
					 | 
				
			||||||
            Item = null;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (UseFocusAsSelected)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            void focusEntered()
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                IsSelected = true;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            void focusExited()
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                IsSelected = false;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Connect(SignalName.FocusEntered, Callable.From(focusEntered));
 | 
					 | 
				
			||||||
            Connect(SignalName.FocusExited, Callable.From(focusExited));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Connect(SignalName.MouseEntered, Callable.From(focusEntered));
 | 
					 | 
				
			||||||
            Connect(SignalName.MouseExited, Callable.From(focusExited));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,41 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=8 format=3 uid="uid://ctad0dkoyw8ad"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://UI/Inventory/InventorySlot.cs" id="1_fju5i"]
 | 
					 | 
				
			||||||
[ext_resource type="Theme" uid="uid://cksjbu3vrup5" path="res://UI/Themes/supalidl.tres" id="1_wnu7u"]
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://nvb4etac7ee2" path="res://UI/Themes/InventorySlotButtonFocus.tres" id="2_3wx0v"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://dc1gcsbhkchvg" path="res://Assets/Sprites/UI/hotbar-active.png" id="2_m56j3"]
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://pqtn0115bqtp" path="res://UI/Themes/InventorySlotButtonPressed.tres" id="3_46bp6"]
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://cfqp0ycwvwx7c" path="res://UI/Themes/InventorySlotButtonNormal.tres" id="4_cc2jo"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_ajutj"]
 | 
					 | 
				
			||||||
size = Vector2(24, 24)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventorySlot" type="Button"]
 | 
					 | 
				
			||||||
custom_minimum_size = Vector2(32, 32)
 | 
					 | 
				
			||||||
theme = ExtResource("1_wnu7u")
 | 
					 | 
				
			||||||
theme_type_variation = &"InventorySlotButton"
 | 
					 | 
				
			||||||
theme_override_styles/focus = ExtResource("2_3wx0v")
 | 
					 | 
				
			||||||
theme_override_styles/pressed = ExtResource("3_46bp6")
 | 
					 | 
				
			||||||
theme_override_styles/normal = ExtResource("4_cc2jo")
 | 
					 | 
				
			||||||
toggle_mode = true
 | 
					 | 
				
			||||||
action_mode = 0
 | 
					 | 
				
			||||||
icon_alignment = 1
 | 
					 | 
				
			||||||
script = ExtResource("1_fju5i")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="TextureRect" type="TextureRect" parent="."]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
offset_right = 32.0
 | 
					 | 
				
			||||||
offset_bottom = 32.0
 | 
					 | 
				
			||||||
mouse_filter = 2
 | 
					 | 
				
			||||||
texture = SubResource("PlaceholderTexture2D_ajutj")
 | 
					 | 
				
			||||||
expand_mode = 2
 | 
					 | 
				
			||||||
stretch_mode = 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Frame" type="NinePatchRect" parent="."]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
self_modulate = Color(1, 1, 1, 0.5)
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
offset_right = 32.0
 | 
					 | 
				
			||||||
offset_bottom = 32.0
 | 
					 | 
				
			||||||
texture = ExtResource("2_m56j3")
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
using SupaLidlGame.Items;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.UI.Inventory;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public partial class ItemTooltip : Control
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    private ItemMetadata _item;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ItemMetadata Item
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => _item;
 | 
					 | 
				
			||||||
        set
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            _item = value;
 | 
					 | 
				
			||||||
            if (IsNodeReady())
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                Render();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public override void _Ready()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Render();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void Render()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (_item is null)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GetNode<Label>("%ItemLabel").Text = "Nothing here";
 | 
					 | 
				
			||||||
            GetNode<TextureRect>("%ItemTexture").Texture = null;
 | 
					 | 
				
			||||||
            GetNode<RichTextLabel>("%ItemDescription").Text = "We are ready for My Summer Car";
 | 
					 | 
				
			||||||
            GetNode<Label>("%Ingredients/Label").Text = "0 Shillings";
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        GetNode<Label>("%ItemLabel").Text = _item.Name;
 | 
					 | 
				
			||||||
        GetNode<TextureRect>("%ItemTexture").Texture = _item.Icon;
 | 
					 | 
				
			||||||
        GetNode<RichTextLabel>("%ItemDescription").Text = _item.Description;
 | 
					 | 
				
			||||||
        GetNode<Label>("%Ingredients/Label").Text = _item.BuyPrice + " Shillings";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,127 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=12 format=3 uid="uid://bsheehtfcdwhh"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Theme" uid="uid://cksjbu3vrup5" path="res://UI/Themes/supalidl.tres" id="1_elbte"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://UI/Inventory/ItemTooltip.cs" id="2_entlu"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="2_mcttf"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://cd8ak8gu0104t" path="res://Assets/Sprites/UI/border.png" id="2_sxqyx"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://dc1gcsbhkchvg" path="res://Assets/Sprites/UI/hotbar-active.png" id="2_vjw5e"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="Animation" id="Animation_mmh32"]
 | 
					 | 
				
			||||||
resource_name = "wipe"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_4bp3t"]
 | 
					 | 
				
			||||||
_data = {
 | 
					 | 
				
			||||||
"wipe": SubResource("Animation_mmh32")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_xhduc"]
 | 
					 | 
				
			||||||
content_margin_left = 0.0
 | 
					 | 
				
			||||||
content_margin_top = 0.0
 | 
					 | 
				
			||||||
content_margin_right = 0.0
 | 
					 | 
				
			||||||
content_margin_bottom = 0.0
 | 
					 | 
				
			||||||
texture = ExtResource("2_mcttf")
 | 
					 | 
				
			||||||
texture_margin_left = 16.0
 | 
					 | 
				
			||||||
texture_margin_top = 16.0
 | 
					 | 
				
			||||||
texture_margin_right = 16.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 16.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_rhjxi"]
 | 
					 | 
				
			||||||
content_margin_left = 4.0
 | 
					 | 
				
			||||||
content_margin_top = 4.0
 | 
					 | 
				
			||||||
content_margin_right = 4.0
 | 
					 | 
				
			||||||
content_margin_bottom = 4.0
 | 
					 | 
				
			||||||
texture = ExtResource("2_vjw5e")
 | 
					 | 
				
			||||||
texture_margin_left = 8.0
 | 
					 | 
				
			||||||
texture_margin_top = 8.0
 | 
					 | 
				
			||||||
texture_margin_right = 8.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 8.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_qnr6k"]
 | 
					 | 
				
			||||||
size = Vector2(24, 24)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_idehr"]
 | 
					 | 
				
			||||||
bg_color = Color(0.976471, 0.956863, 0.956863, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ItemTooltip" type="BoxContainer"]
 | 
					 | 
				
			||||||
offset_right = 92.0
 | 
					 | 
				
			||||||
offset_bottom = 161.0
 | 
					 | 
				
			||||||
theme = ExtResource("1_elbte")
 | 
					 | 
				
			||||||
script = ExtResource("2_entlu")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
 | 
					 | 
				
			||||||
libraries = {
 | 
					 | 
				
			||||||
"": SubResource("AnimationLibrary_4bp3t")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_horizontal = 3
 | 
					 | 
				
			||||||
theme_override_constants/separation = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxTexture_xhduc")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Margin" type="MarginContainer" parent="VBoxContainer/PanelContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/PanelContainer/Margin"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
alignment = 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_constants/separation = 8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer/HBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_vertical = 0
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxTexture_rhjxi")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ItemTexture" type="TextureRect" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer/HBoxContainer/PanelContainer"]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
texture = SubResource("PlaceholderTexture2D_qnr6k")
 | 
					 | 
				
			||||||
stretch_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ItemLabel" type="Label" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer/HBoxContainer"]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_horizontal = 3
 | 
					 | 
				
			||||||
text = "Really long item name"
 | 
					 | 
				
			||||||
autowrap_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer/HBoxContainer"]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_horizontal = 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="NinePatchRect" type="NinePatchRect" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer/HBoxContainer/VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
texture = ExtResource("2_sxqyx")
 | 
					 | 
				
			||||||
region_rect = Rect2(0, 6, 48, 5)
 | 
					 | 
				
			||||||
patch_margin_left = 16
 | 
					 | 
				
			||||||
patch_margin_top = 5
 | 
					 | 
				
			||||||
patch_margin_right = 16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ItemDescription" type="RichTextLabel" parent="VBoxContainer/PanelContainer/Margin/VBoxContainer"]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_colors/default_color = Color(0.937255, 0.854902, 0.854902, 1)
 | 
					 | 
				
			||||||
text = "Speed, violence, momentum"
 | 
					 | 
				
			||||||
fit_content = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxFlat_idehr")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Ingredients" type="MarginContainer" parent="VBoxContainer/PanelContainer2"]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_constants/margin_top = 2
 | 
					 | 
				
			||||||
theme_override_constants/margin_bottom = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Label" type="Label" parent="VBoxContainer/PanelContainer2/Ingredients"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
 | 
					 | 
				
			||||||
text = "250 Shillings"
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,84 +0,0 @@
 | 
				
			||||||
using Godot;
 | 
					 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace SupaLidlGame.UI.Inventory;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public partial class ShopMenu : Control, IModal
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    private Items.IItemCollection<Items.ShopEntry> _source;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Items.IItemCollection<Items.ShopEntry> Source
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => _source;
 | 
					 | 
				
			||||||
        set
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GD.Print("Set ShopMenu source");
 | 
					 | 
				
			||||||
            _source = value;
 | 
					 | 
				
			||||||
            _inventoryGrid.Source = value;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [Export]
 | 
					 | 
				
			||||||
    private InventoryGrid _inventoryGrid;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private InventorySlot _selected;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void HideModal()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Hide();
 | 
					 | 
				
			||||||
        _source = null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public override void _Ready()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Events.EventBus.Instance.EnterShop += (string path) =>
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var shop = ResourceLoader.Load<Items.Shop>(path);
 | 
					 | 
				
			||||||
            GD.Print("Loaded shop");
 | 
					 | 
				
			||||||
            Source = shop;
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        _inventoryGrid.SlotFocused += (InventorySlot slot) =>
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GD.Print("SlotFocused " + slot.Name);
 | 
					 | 
				
			||||||
            if (slot.Item is not null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                SetTooltipItem(slot);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        _inventoryGrid.SlotUnfocused += (InventorySlot slot) =>
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            SetTooltipItem(_selected);
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        _inventoryGrid.SlotSelected += (InventorySlot slot) =>
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            _selected = slot;
 | 
					 | 
				
			||||||
            SetTooltipItem(slot);
 | 
					 | 
				
			||||||
            GetNode<Button>("%BuyButton").GrabFocus();
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        GetNode<Button>("%BuyButton").GuiInput += (Godot.InputEvent @event) =>
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (@event.IsAction("ui_cancel"))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _selected?.GrabFocus();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void SetTooltipItem(InventorySlot slot)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        GetNode<ItemTooltip>("%ItemTooltip").Item = slot?.Item;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (slot == _selected)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GetNode<Button>("%BuyButton").Disabled = false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            GetNode<Button>("%BuyButton").Disabled = true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,77 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=9 format=3 uid="uid://cyggkyqosjk36"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://bqhotx2ogucye" path="res://UI/Themes/Panel.tres" id="1_2ffty"]
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://UI/Inventory/ShopMenu.cs" id="1_8c1y7"]
 | 
					 | 
				
			||||||
[ext_resource type="FontFile" uid="uid://cgwa8bjiyv534" path="res://Assets/Fonts/alagard.ttf" id="3_aj4jx"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://bsheehtfcdwhh" path="res://UI/Inventory/ItemTooltip.tscn" id="4_n61n7"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://chmokkxsy5vas" path="res://UI/Inventory/InventoryGrid.tscn" id="4_sl632"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://baawkwo8aiwbu" path="res://UI/Inventory/ShopSlot.tscn" id="5_kfyl0"]
 | 
					 | 
				
			||||||
[ext_resource type="Theme" uid="uid://cksjbu3vrup5" path="res://UI/Themes/supalidl.tres" id="7_rvp1r"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gm1xk"]
 | 
					 | 
				
			||||||
bg_color = Color(0, 0, 0, 0.784314)
 | 
					 | 
				
			||||||
border_width_left = 16
 | 
					 | 
				
			||||||
border_width_top = 16
 | 
					 | 
				
			||||||
border_width_right = 16
 | 
					 | 
				
			||||||
border_width_bottom = 16
 | 
					 | 
				
			||||||
border_color = Color(0.145098, 0.145098, 0.145098, 0)
 | 
					 | 
				
			||||||
border_blend = true
 | 
					 | 
				
			||||||
corner_radius_top_left = 16
 | 
					 | 
				
			||||||
corner_radius_top_right = 16
 | 
					 | 
				
			||||||
corner_radius_bottom_right = 16
 | 
					 | 
				
			||||||
corner_radius_bottom_left = 16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Panel" type="PanelContainer" node_paths=PackedStringArray("_inventoryGrid")]
 | 
					 | 
				
			||||||
anchors_preset = 6
 | 
					 | 
				
			||||||
anchor_left = 1.0
 | 
					 | 
				
			||||||
anchor_top = 0.5
 | 
					 | 
				
			||||||
anchor_right = 1.0
 | 
					 | 
				
			||||||
anchor_bottom = 0.5
 | 
					 | 
				
			||||||
offset_left = -236.0
 | 
					 | 
				
			||||||
offset_top = -175.5
 | 
					 | 
				
			||||||
offset_bottom = 175.5
 | 
					 | 
				
			||||||
grow_horizontal = 0
 | 
					 | 
				
			||||||
grow_vertical = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = SubResource("StyleBoxFlat_gm1xk")
 | 
					 | 
				
			||||||
script = ExtResource("1_8c1y7")
 | 
					 | 
				
			||||||
_inventoryGrid = NodePath("PanelContainer/VBoxContainer/ScrollContainer/InventoryGrid")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="PanelContainer" type="PanelContainer" parent="."]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_styles/panel = ExtResource("1_2ffty")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
theme_override_fonts/font = ExtResource("3_aj4jx")
 | 
					 | 
				
			||||||
text = "Snus Dealer"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_vertical = 3
 | 
					 | 
				
			||||||
follow_focus = true
 | 
					 | 
				
			||||||
horizontal_scroll_mode = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="InventoryGrid" parent="PanelContainer/VBoxContainer/ScrollContainer" instance=ExtResource("4_sl632")]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_vertical = 3
 | 
					 | 
				
			||||||
_slotScene = ExtResource("5_kfyl0")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ItemTooltip" parent="PanelContainer/VBoxContainer" instance=ExtResource("4_n61n7")]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="BuyButton" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2"]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
size_flags_horizontal = 3
 | 
					 | 
				
			||||||
theme = ExtResource("7_rvp1r")
 | 
					 | 
				
			||||||
text = "Buy"
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,14 +0,0 @@
 | 
				
			||||||
[gd_scene load_steps=3 format=3 uid="uid://baawkwo8aiwbu"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://ctad0dkoyw8ad" path="res://UI/Inventory/InventorySlot.tscn" id="1_tdkv2"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="2_af1qu"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="ShopSlot" instance=ExtResource("1_tdkv2")]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="Frame" parent="." index="1"]
 | 
					 | 
				
			||||||
texture = ExtResource("2_af1qu")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="SelectedFrame" type="NinePatchRect" parent="." index="2"]
 | 
					 | 
				
			||||||
visible = false
 | 
					 | 
				
			||||||
layout_mode = 2
 | 
					 | 
				
			||||||
texture = ExtResource("2_af1qu")
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,74 @@
 | 
				
			||||||
 | 
					using Godot;
 | 
				
			||||||
 | 
					using GodotUtilities;
 | 
				
			||||||
 | 
					using GodotUtilities.SourceGenerators;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace SupaLidlGame.UI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Scene]
 | 
				
			||||||
 | 
					public partial class InventorySlot : ColorRect
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [Node("TextureRect")]
 | 
				
			||||||
 | 
					    private TextureRect _textureRect;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Node("Selected")]
 | 
				
			||||||
 | 
					    private NinePatchRect _selected;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Node("Unselected")]
 | 
				
			||||||
 | 
					    private NinePatchRect _unselected;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static Texture2D _placeholderTexture;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Items.ItemMetadata _item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Items.ItemMetadata Item
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        get => _item;
 | 
				
			||||||
 | 
					        set
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _item = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_item is null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                //_textureRect.Texture = _placeholderTexture;
 | 
				
			||||||
 | 
					                _textureRect.Texture = null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _textureRect.Texture = _item.Icon;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private bool _isSelected = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public bool IsSelected
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        get => _isSelected;
 | 
				
			||||||
 | 
					        set
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _isSelected = value;
 | 
				
			||||||
 | 
					            _selected.Visible = _isSelected;
 | 
				
			||||||
 | 
					            _unselected.Visible = !_isSelected;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static InventorySlot()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _placeholderTexture = ResourceLoader.Load<Texture2D>(
 | 
				
			||||||
 | 
					            "res://Assets/Sprites/UI/hotbar-inactive.png");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public override void _Notification(int what)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (what == NotificationSceneInstantiated)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            WireNodes();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        base._Notification(what);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public override void _Ready()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					[gd_scene load_steps=4 format=3 uid="uid://ctad0dkoyw8ad"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://UI/InventorySlot.cs" id="1_llonk"]
 | 
				
			||||||
 | 
					[ext_resource type="Texture2D" uid="uid://bd81g8aivb2ql" path="res://Assets/Sprites/UI/menu-rect-no-bg-32.png" id="2_vvog5"]
 | 
				
			||||||
 | 
					[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="3_jr23q"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="InventorySlot" type="ColorRect"]
 | 
				
			||||||
 | 
					custom_minimum_size = Vector2(32, 32)
 | 
				
			||||||
 | 
					color = Color(1, 1, 1, 0)
 | 
				
			||||||
 | 
					script = ExtResource("1_llonk")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="TextureRect" type="TextureRect" parent="."]
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 15
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					stretch_mode = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Selected" type="NinePatchRect" parent="."]
 | 
				
			||||||
 | 
					visible = false
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 15
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					texture = ExtResource("2_vvog5")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Unselected" type="NinePatchRect" parent="."]
 | 
				
			||||||
 | 
					self_modulate = Color(1, 1, 1, 0.5)
 | 
				
			||||||
 | 
					layout_mode = 1
 | 
				
			||||||
 | 
					anchors_preset = 15
 | 
				
			||||||
 | 
					anchor_right = 1.0
 | 
				
			||||||
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
 | 
					grow_horizontal = 2
 | 
				
			||||||
 | 
					grow_vertical = 2
 | 
				
			||||||
 | 
					texture = ExtResource("3_jr23q")
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,6 @@ anchor_right = 1.0
 | 
				
			||||||
anchor_bottom = 1.0
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
grow_horizontal = 2
 | 
					grow_horizontal = 2
 | 
				
			||||||
grow_vertical = 2
 | 
					grow_vertical = 2
 | 
				
			||||||
mouse_filter = 2
 | 
					 | 
				
			||||||
script = ExtResource("1_g1mdf")
 | 
					script = ExtResource("1_g1mdf")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
 | 
					[node name="VBoxContainer" type="VBoxContainer" parent="."]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,6 @@ anchor_right = 1.0
 | 
				
			||||||
anchor_bottom = 1.0
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
grow_horizontal = 2
 | 
					grow_horizontal = 2
 | 
				
			||||||
grow_vertical = 2
 | 
					grow_vertical = 2
 | 
				
			||||||
mouse_filter = 2
 | 
					 | 
				
			||||||
script = ExtResource("1_mx0ay")
 | 
					script = ExtResource("1_mx0ay")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="ColorRect" type="ColorRect" parent="."]
 | 
					[node name="ColorRect" type="ColorRect" parent="."]
 | 
				
			||||||
| 
						 | 
					@ -118,7 +117,6 @@ anchor_right = 1.0
 | 
				
			||||||
anchor_bottom = 1.0
 | 
					anchor_bottom = 1.0
 | 
				
			||||||
grow_horizontal = 2
 | 
					grow_horizontal = 2
 | 
				
			||||||
grow_vertical = 2
 | 
					grow_vertical = 2
 | 
				
			||||||
mouse_filter = 2
 | 
					 | 
				
			||||||
color = Color(0, 0, 0, 1)
 | 
					color = Color(0, 0, 0, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
 | 
					[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,14 +0,0 @@
 | 
				
			||||||
[gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://nvb4etac7ee2"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="1_el8jk"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resource]
 | 
					 | 
				
			||||||
content_margin_left = 4.0
 | 
					 | 
				
			||||||
content_margin_top = 4.0
 | 
					 | 
				
			||||||
content_margin_right = 4.0
 | 
					 | 
				
			||||||
content_margin_bottom = 4.0
 | 
					 | 
				
			||||||
texture = ExtResource("1_el8jk")
 | 
					 | 
				
			||||||
texture_margin_left = 4.0
 | 
					 | 
				
			||||||
texture_margin_top = 4.0
 | 
					 | 
				
			||||||
texture_margin_right = 4.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 4.0
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,15 +0,0 @@
 | 
				
			||||||
[gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://cfqp0ycwvwx7c"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="1_r3gsw"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resource]
 | 
					 | 
				
			||||||
content_margin_left = 4.0
 | 
					 | 
				
			||||||
content_margin_top = 4.0
 | 
					 | 
				
			||||||
content_margin_right = 4.0
 | 
					 | 
				
			||||||
content_margin_bottom = 4.0
 | 
					 | 
				
			||||||
texture = ExtResource("1_r3gsw")
 | 
					 | 
				
			||||||
texture_margin_left = 4.0
 | 
					 | 
				
			||||||
texture_margin_top = 4.0
 | 
					 | 
				
			||||||
texture_margin_right = 4.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 4.0
 | 
					 | 
				
			||||||
modulate_color = Color(1, 1, 1, 0.498039)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,15 +0,0 @@
 | 
				
			||||||
[gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://pqtn0115bqtp"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="1_1ahpp"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resource]
 | 
					 | 
				
			||||||
content_margin_left = 4.0
 | 
					 | 
				
			||||||
content_margin_top = 4.0
 | 
					 | 
				
			||||||
content_margin_right = 4.0
 | 
					 | 
				
			||||||
content_margin_bottom = 4.0
 | 
					 | 
				
			||||||
texture = ExtResource("1_1ahpp")
 | 
					 | 
				
			||||||
texture_margin_left = 4.0
 | 
					 | 
				
			||||||
texture_margin_top = 4.0
 | 
					 | 
				
			||||||
texture_margin_right = 4.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 4.0
 | 
					 | 
				
			||||||
modulate_color = Color(0.941176, 0.843137, 0.470588, 1)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,14 +0,0 @@
 | 
				
			||||||
[gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://bqhotx2ogucye"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://uhmowtsi3wfh" path="res://Assets/Sprites/UI/menu-rect-no-bg-white.png" id="1_cb20l"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resource]
 | 
					 | 
				
			||||||
content_margin_left = 16.0
 | 
					 | 
				
			||||||
content_margin_top = 16.0
 | 
					 | 
				
			||||||
content_margin_right = 16.0
 | 
					 | 
				
			||||||
content_margin_bottom = 16.0
 | 
					 | 
				
			||||||
texture = ExtResource("1_cb20l")
 | 
					 | 
				
			||||||
texture_margin_left = 32.0
 | 
					 | 
				
			||||||
texture_margin_top = 32.0
 | 
					 | 
				
			||||||
texture_margin_right = 32.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 32.0
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,58 +1,10 @@
 | 
				
			||||||
[gd_resource type="Theme" load_steps=11 format=3 uid="uid://cksjbu3vrup5"]
 | 
					[gd_resource type="Theme" load_steps=2 format=3 uid="uid://cksjbu3vrup5"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="FontFile" uid="uid://6bvgjbmqovau" path="res://Assets/Fonts/calamity/calamity.ttf" id="1_334fe"]
 | 
					[ext_resource type="FontFile" uid="uid://6bvgjbmqovau" path="res://Assets/Fonts/calamity/calamity.ttf" id="1_334fe"]
 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://nvb4etac7ee2" path="res://UI/Themes/InventorySlotButtonFocus.tres" id="2_3w5h1"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" uid="uid://b16461tjso0j7" path="res://Assets/Sprites/UI/hotbar-inactive.png" id="2_6sv27"]
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://bqhotx2ogucye" path="res://UI/Themes/Panel.tres" id="2_jlgx8"]
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://cfqp0ycwvwx7c" path="res://UI/Themes/InventorySlotButtonNormal.tres" id="3_nuiio"]
 | 
					 | 
				
			||||||
[ext_resource type="StyleBox" uid="uid://pqtn0115bqtp" path="res://UI/Themes/InventorySlotButtonPressed.tres" id="4_mllnb"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_wk5ww"]
 | 
					 | 
				
			||||||
content_margin_left = 4.0
 | 
					 | 
				
			||||||
content_margin_top = 4.0
 | 
					 | 
				
			||||||
content_margin_right = 4.0
 | 
					 | 
				
			||||||
content_margin_bottom = 4.0
 | 
					 | 
				
			||||||
texture = ExtResource("2_6sv27")
 | 
					 | 
				
			||||||
texture_margin_left = 16.0
 | 
					 | 
				
			||||||
texture_margin_top = 16.0
 | 
					 | 
				
			||||||
texture_margin_right = 16.0
 | 
					 | 
				
			||||||
texture_margin_bottom = 16.0
 | 
					 | 
				
			||||||
modulate_color = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5w4ck"]
 | 
					 | 
				
			||||||
bg_color = Color(0.937255, 0.854902, 0.854902, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2qibe"]
 | 
					 | 
				
			||||||
content_margin_left = 2.0
 | 
					 | 
				
			||||||
content_margin_top = 2.0
 | 
					 | 
				
			||||||
content_margin_right = 2.0
 | 
					 | 
				
			||||||
content_margin_bottom = 2.0
 | 
					 | 
				
			||||||
bg_color = Color(0.976471, 0.956863, 0.956863, 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_iyd8w"]
 | 
					 | 
				
			||||||
bg_color = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[resource]
 | 
					[resource]
 | 
				
			||||||
default_font = ExtResource("1_334fe")
 | 
					default_font = ExtResource("1_334fe")
 | 
				
			||||||
default_font_size = 15
 | 
					default_font_size = 15
 | 
				
			||||||
/colors/background = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
					/colors/background = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
				
			||||||
/font_sizes/Normal = 15
 | 
					/font_sizes/Normal = 16
 | 
				
			||||||
/fonts/Calamity = ExtResource("1_334fe")
 | 
					/fonts/Calamity = ExtResource("1_334fe")
 | 
				
			||||||
Button/colors/font_color = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
					 | 
				
			||||||
Button/colors/font_focus_color = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
					 | 
				
			||||||
Button/colors/font_hover_color = Color(0.105882, 0.0470588, 0.117647, 1)
 | 
					 | 
				
			||||||
Button/colors/font_pressed_color = Color(0.976471, 0.956863, 0.956863, 1)
 | 
					 | 
				
			||||||
Button/styles/focus = SubResource("StyleBoxTexture_wk5ww")
 | 
					 | 
				
			||||||
Button/styles/hover = SubResource("StyleBoxFlat_5w4ck")
 | 
					 | 
				
			||||||
Button/styles/normal = SubResource("StyleBoxFlat_2qibe")
 | 
					 | 
				
			||||||
Button/styles/pressed = SubResource("StyleBoxFlat_iyd8w")
 | 
					 | 
				
			||||||
InventorySlotButton/base_type = &"Button"
 | 
					 | 
				
			||||||
InventorySlotButton/styles/focus = ExtResource("2_3w5h1")
 | 
					 | 
				
			||||||
InventorySlotButton/styles/hover = ExtResource("2_3w5h1")
 | 
					 | 
				
			||||||
InventorySlotButton/styles/normal = ExtResource("3_nuiio")
 | 
					 | 
				
			||||||
InventorySlotButton/styles/pressed = ExtResource("4_mllnb")
 | 
					 | 
				
			||||||
MarginContainer/constants/margin_bottom = 8
 | 
					 | 
				
			||||||
MarginContainer/constants/margin_left = 8
 | 
					 | 
				
			||||||
MarginContainer/constants/margin_right = 8
 | 
					 | 
				
			||||||
MarginContainer/constants/margin_top = 8
 | 
					 | 
				
			||||||
PanelContainer/styles/panel = ExtResource("2_jlgx8")
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,20 +2,13 @@ using Godot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace SupaLidlGame.Utils;
 | 
					namespace SupaLidlGame.Utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[System.Flags]
 | 
					 | 
				
			||||||
public enum FactionName
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Player = 1,
 | 
					 | 
				
			||||||
    Doc = 2,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public interface IFaction
 | 
					public interface IFaction
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
    /// The faction index that this entity belongs to.
 | 
					    /// The faction index that this entity belongs to.
 | 
				
			||||||
    /// </summary>
 | 
					    /// </summary>
 | 
				
			||||||
    [Export]
 | 
					    [Export]
 | 
				
			||||||
    public FactionName Faction { get; set; }
 | 
					    public ushort Faction { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public bool AlignsWith(IFaction other)
 | 
					    public bool AlignsWith(IFaction other)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,13 +206,6 @@ namespace DialogueManagerRuntime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public partial class DialogueLine : RefCounted
 | 
					    public partial class DialogueLine : RefCounted
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        private string id = "";
 | 
					 | 
				
			||||||
        public string Id
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            get => id;
 | 
					 | 
				
			||||||
            set => id = value;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        private string type = "dialogue";
 | 
					        private string type = "dialogue";
 | 
				
			||||||
        public string Type
 | 
					        public string Type
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,28 +70,26 @@ func _ready() -> void:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _gui_input(event: InputEvent) -> void:
 | 
					func _gui_input(event: InputEvent) -> void:
 | 
				
			||||||
	# Handle shortcuts that come from the editor
 | 
					 | 
				
			||||||
	if event is InputEventKey and event.is_pressed():
 | 
						if event is InputEventKey and event.is_pressed():
 | 
				
			||||||
		var shortcut: String = Engine.get_meta("DialogueManagerPlugin").get_editor_shortcut(event)
 | 
							match event.as_text():
 | 
				
			||||||
		match shortcut:
 | 
								"Ctrl+Equal", "Command+Equal":
 | 
				
			||||||
			"toggle_comment":
 | 
					 | 
				
			||||||
				toggle_comment()
 | 
					 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
					 | 
				
			||||||
			"move_up":
 | 
					 | 
				
			||||||
				move_line(-1)
 | 
					 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
					 | 
				
			||||||
			"move_down":
 | 
					 | 
				
			||||||
				move_line(1)
 | 
					 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
					 | 
				
			||||||
			"text_size_increase":
 | 
					 | 
				
			||||||
				self.font_size += 1
 | 
									self.font_size += 1
 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
			"text_size_decrease":
 | 
								"Ctrl+Minus", "Command+Minus":
 | 
				
			||||||
				self.font_size -= 1
 | 
									self.font_size -= 1
 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
			"text_size_reset":
 | 
								"Ctrl+0", "Command+0":
 | 
				
			||||||
				self.font_size = theme_overrides.font_size
 | 
									self.font_size = theme_overrides.font_size
 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
 | 
								"Ctrl+K", "Command+K":
 | 
				
			||||||
 | 
									toggle_comment()
 | 
				
			||||||
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
 | 
								"Alt+Up":
 | 
				
			||||||
 | 
									move_line(-1)
 | 
				
			||||||
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
 | 
								"Alt+Down":
 | 
				
			||||||
 | 
									move_line(1)
 | 
				
			||||||
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	elif event is InputEventMouse:
 | 
						elif event is InputEventMouse:
 | 
				
			||||||
		match event.as_text():
 | 
							match event.as_text():
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,11 +26,11 @@ var regex_dict: RegEx = RegEx.create_from_string("^\\{((?>[^\\{\\}]+|(?R))*)\\}$
 | 
				
			||||||
var regex_kvdict: RegEx = RegEx.create_from_string("^\\s*(?<left>.*?)\\s*(?<colon>:|=)\\s*(?<right>[^\\/]+)$")
 | 
					var regex_kvdict: RegEx = RegEx.create_from_string("^\\s*(?<left>.*?)\\s*(?<colon>:|=)\\s*(?<right>[^\\/]+)$")
 | 
				
			||||||
var regex_commas: RegEx = RegEx.create_from_string("([^,]+)(?:\\s*,\\s*)?")
 | 
					var regex_commas: RegEx = RegEx.create_from_string("([^,]+)(?:\\s*,\\s*)?")
 | 
				
			||||||
var regex_assignment: RegEx = RegEx.create_from_string("^\\s*(?<var>[a-zA-Z_][a-zA-Z_0-9]*)(?:(?<attr>(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)+)|(?:\\[(?<key>[^\\]]+)\\]))?\\s*(?<op>(?:\\/|\\*|-|\\+)?=)\\s*(?<val>.*)$")
 | 
					var regex_assignment: RegEx = RegEx.create_from_string("^\\s*(?<var>[a-zA-Z_][a-zA-Z_0-9]*)(?:(?<attr>(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)+)|(?:\\[(?<key>[^\\]]+)\\]))?\\s*(?<op>(?:\\/|\\*|-|\\+)?=)\\s*(?<val>.*)$")
 | 
				
			||||||
var regex_varname: RegEx = RegEx.create_from_string("^\\s*(?!true|false|and|or|&&|\\|\\|not|in|null)(?<var>[a-zA-Z_][a-zA-Z_0-9]*)(?:(?<attr>(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)+)|(?:\\[(?<key>[^\\]]+)\\]))?\\s*$")
 | 
					var regex_varname: RegEx = RegEx.create_from_string("^\\s*(?!true|false|and|or|not|in|null)(?<var>[a-zA-Z_][a-zA-Z_0-9]*)(?:(?<attr>(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)+)|(?:\\[(?<key>[^\\]]+)\\]))?\\s*$")
 | 
				
			||||||
var regex_keyword: RegEx = RegEx.create_from_string("^\\s*(true|false|null)\\s*$")
 | 
					var regex_keyword: RegEx = RegEx.create_from_string("^\\s*(true|false|null)\\s*$")
 | 
				
			||||||
var regex_function: RegEx = RegEx.create_from_string("^\\s*([a-zA-Z_][a-zA-Z_0-9]*\\s*)\\(")
 | 
					var regex_function: RegEx = RegEx.create_from_string("^\\s*([a-zA-Z_][a-zA-Z_0-9]*\\s*)\\(")
 | 
				
			||||||
var regex_comparison: RegEx = RegEx.create_from_string("^(?<left>.*?)\\s*(?<op>==|>=|<=|<|>|!=)\\s*(?<right>.*)$")
 | 
					var regex_comparison: RegEx = RegEx.create_from_string("^(?<left>.*?)\\s*(?<op>==|>=|<=|<|>|!=)\\s*(?<right>.*)$")
 | 
				
			||||||
var regex_blogical: RegEx = RegEx.create_from_string("^(?<left>.*?)\\s+(?<op>and|or|in|&&|\\|\\|)\\s+(?<right>.*)$")
 | 
					var regex_blogical: RegEx = RegEx.create_from_string("^(?<left>.*?)\\s+(?<op>and|or|in)\\s+(?<right>.*)$")
 | 
				
			||||||
var regex_ulogical: RegEx = RegEx.create_from_string("^\\s*(?<op>not)\\s+(?<right>.*)$")
 | 
					var regex_ulogical: RegEx = RegEx.create_from_string("^\\s*(?<op>not)\\s+(?<right>.*)$")
 | 
				
			||||||
var regex_paren: RegEx = RegEx.create_from_string("\\((?<paren>((?:[^\\(\\)]*)|(?:\\((?1)\\)))*?)\\)")
 | 
					var regex_paren: RegEx = RegEx.create_from_string("\\((?<paren>((?:[^\\(\\)]*)|(?:\\((?1)\\)))*?)\\)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,9 +186,9 @@ func _get_dialogue_syntax_highlighting(start_index: int, text: String) -> Dictio
 | 
				
			||||||
	for goto_match in goto_matches:
 | 
						for goto_match in goto_matches:
 | 
				
			||||||
		colors[start_index + goto_match.get_start(0)] = {"color": text_edit.theme_overrides.jumps_color}
 | 
							colors[start_index + goto_match.get_start(0)] = {"color": text_edit.theme_overrides.jumps_color}
 | 
				
			||||||
		if "file" in goto_match.names:
 | 
							if "file" in goto_match.names:
 | 
				
			||||||
			colors[start_index + goto_match.get_start("file")] = {"color": text_edit.theme_overrides.jumps_color}
 | 
								colors[start_index + goto_match.get_start("file")] = {"color": text_edit.theme_overrides.members_color}
 | 
				
			||||||
			colors[start_index + goto_match.get_end("file")] = {"color": text_edit.theme_overrides.symbols_color}
 | 
								colors[start_index + goto_match.get_end("file")] = {"color": text_edit.theme_overrides.symbols_color}
 | 
				
			||||||
		colors[start_index + goto_match.get_start("title")] = {"color": text_edit.theme_overrides.jumps_color}
 | 
							colors[start_index + goto_match.get_start("title")] = {"color": text_edit.theme_overrides.titles_color}
 | 
				
			||||||
		colors[start_index + goto_match.get_end("title")] = {"color": text_edit.theme_overrides.jumps_color}
 | 
							colors[start_index + goto_match.get_end("title")] = {"color": text_edit.theme_overrides.jumps_color}
 | 
				
			||||||
		colors[start_index + goto_match.get_end(0)] = {"color": text_edit.theme_overrides.text_color}
 | 
							colors[start_index + goto_match.get_end(0)] = {"color": text_edit.theme_overrides.text_color}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ var TOKEN_DEFINITIONS: Dictionary = {
 | 
				
			||||||
	DialogueConstants.TOKEN_DOT: RegEx.create_from_string("^\\."),
 | 
						DialogueConstants.TOKEN_DOT: RegEx.create_from_string("^\\."),
 | 
				
			||||||
	DialogueConstants.TOKEN_STRING: RegEx.create_from_string("^(\".*?\"|\'.*?\')"),
 | 
						DialogueConstants.TOKEN_STRING: RegEx.create_from_string("^(\".*?\"|\'.*?\')"),
 | 
				
			||||||
	DialogueConstants.TOKEN_NOT: RegEx.create_from_string("^(not( |$)|!)"),
 | 
						DialogueConstants.TOKEN_NOT: RegEx.create_from_string("^(not( |$)|!)"),
 | 
				
			||||||
	DialogueConstants.TOKEN_AND_OR: RegEx.create_from_string("^(and|or|&&|\\|\\|)( |$)"),
 | 
						DialogueConstants.TOKEN_AND_OR: RegEx.create_from_string("^(and|or)( |$)"),
 | 
				
			||||||
	DialogueConstants.TOKEN_VARIABLE: RegEx.create_from_string("^[a-zA-Z_][a-zA-Z_0-9]*"),
 | 
						DialogueConstants.TOKEN_VARIABLE: RegEx.create_from_string("^[a-zA-Z_][a-zA-Z_0-9]*"),
 | 
				
			||||||
	DialogueConstants.TOKEN_COMMENT: RegEx.create_from_string("^#.*"),
 | 
						DialogueConstants.TOKEN_COMMENT: RegEx.create_from_string("^#.*"),
 | 
				
			||||||
	DialogueConstants.TOKEN_CONDITION: RegEx.create_from_string("^(if|elif|else)"),
 | 
						DialogueConstants.TOKEN_CONDITION: RegEx.create_from_string("^(if|elif|else)"),
 | 
				
			||||||
| 
						 | 
					@ -230,7 +230,6 @@ func parse(text: String, path: String) -> Error:
 | 
				
			||||||
					line["character"] = first_child.character
 | 
										line["character"] = first_child.character
 | 
				
			||||||
					line["character_replacements"] = first_child.character_replacements
 | 
										line["character_replacements"] = first_child.character_replacements
 | 
				
			||||||
					line["text"] = first_child.text
 | 
										line["text"] = first_child.text
 | 
				
			||||||
					line["text_replacements"] = extract_dialogue_replacements(line.text, indent_size + 2)
 | 
					 | 
				
			||||||
					line["translation_key"] = first_child.translation_key
 | 
										line["translation_key"] = first_child.translation_key
 | 
				
			||||||
					parsed_lines[str(id) + ".2"] = first_child
 | 
										parsed_lines[str(id) + ".2"] = first_child
 | 
				
			||||||
					line["next_id"] = str(id) + ".2"
 | 
										line["next_id"] = str(id) + ".2"
 | 
				
			||||||
| 
						 | 
					@ -692,7 +691,12 @@ func get_line_after_line(id: int, indent_size: int, line: Dictionary) -> String:
 | 
				
			||||||
	var next_nonempty_line_id = get_next_nonempty_line_id(id)
 | 
						var next_nonempty_line_id = get_next_nonempty_line_id(id)
 | 
				
			||||||
	if next_nonempty_line_id != DialogueConstants.ID_NULL \
 | 
						if next_nonempty_line_id != DialogueConstants.ID_NULL \
 | 
				
			||||||
		and indent_size <= get_indent(raw_lines[next_nonempty_line_id.to_int()]):
 | 
							and indent_size <= get_indent(raw_lines[next_nonempty_line_id.to_int()]):
 | 
				
			||||||
		return next_nonempty_line_id
 | 
							# The next line is a title so we need the next nonempty line after that
 | 
				
			||||||
 | 
							if is_title_line(raw_lines[next_nonempty_line_id.to_int()]):
 | 
				
			||||||
 | 
								return get_next_nonempty_line_id(next_nonempty_line_id.to_int())
 | 
				
			||||||
 | 
							# Otherwise it's a normal line
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								return next_nonempty_line_id
 | 
				
			||||||
	# Otherwise, we grab the ID from the parents next ID after children
 | 
						# Otherwise, we grab the ID from the parents next ID after children
 | 
				
			||||||
	elif line.has("parent_id") and parsed_lines.has(line.parent_id):
 | 
						elif line.has("parent_id") and parsed_lines.has(line.parent_id):
 | 
				
			||||||
		return parsed_lines[line.parent_id].next_id_after
 | 
							return parsed_lines[line.parent_id].next_id_after
 | 
				
			||||||
| 
						 | 
					@ -923,8 +927,8 @@ func find_next_line_after_responses(line_number: int) -> String:
 | 
				
			||||||
			if get_indent(line) <= expected_indent:
 | 
								if get_indent(line) <= expected_indent:
 | 
				
			||||||
				return str(line_number)
 | 
									return str(line_number)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# EOF so it's also the end of a block
 | 
						# EOF so must be end of conversation
 | 
				
			||||||
	return DialogueConstants.ID_END
 | 
						return DialogueConstants.ID_END_CONVERSATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Get the names of any autoloads in the project
 | 
					## Get the names of any autoloads in the project
 | 
				
			||||||
| 
						 | 
					@ -1525,15 +1529,10 @@ func build_token_tree(tokens: Array[Dictionary], line_type: String, expected_clo
 | 
				
			||||||
			DialogueConstants.TOKEN_ASSIGNMENT, \
 | 
								DialogueConstants.TOKEN_ASSIGNMENT, \
 | 
				
			||||||
			DialogueConstants.TOKEN_OPERATOR, \
 | 
								DialogueConstants.TOKEN_OPERATOR, \
 | 
				
			||||||
			DialogueConstants.TOKEN_AND_OR, \
 | 
								DialogueConstants.TOKEN_AND_OR, \
 | 
				
			||||||
			DialogueConstants.TOKEN_VARIABLE:
 | 
								DialogueConstants.TOKEN_VARIABLE: \
 | 
				
			||||||
				var value = token.value.strip_edges()
 | 
					 | 
				
			||||||
				if value == "&&":
 | 
					 | 
				
			||||||
					value = "and"
 | 
					 | 
				
			||||||
				elif value == "||":
 | 
					 | 
				
			||||||
					value = "or"
 | 
					 | 
				
			||||||
				tree.append({
 | 
									tree.append({
 | 
				
			||||||
					type = token.type,
 | 
										type = token.type,
 | 
				
			||||||
					value = value
 | 
										value = token.value.strip_edges()
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			DialogueConstants.TOKEN_STRING:
 | 
								DialogueConstants.TOKEN_STRING:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
@icon("./assets/responses_menu.svg")
 | 
					@icon("./assets/responses_menu.svg")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## A [Container] for dialogue responses provided by [b]Dialogue Manager[/b].
 | 
					## A VBoxContainer for dialogue responses provided by [b]Dialogue Manager[/b].
 | 
				
			||||||
class_name DialogueResponsesMenu extends Container
 | 
					class_name DialogueResponsesMenu extends VBoxContainer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Emitted when a response is selected.
 | 
					## Emitted when a response is selected.
 | 
				
			||||||
| 
						 | 
					@ -14,10 +14,8 @@ signal response_selected(response)
 | 
				
			||||||
## The action for accepting a response (is possibly overridden by parent dialogue balloon).
 | 
					## The action for accepting a response (is possibly overridden by parent dialogue balloon).
 | 
				
			||||||
@export var next_action: StringName = &""
 | 
					@export var next_action: StringName = &""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## The list of dialogue responses.
 | 
					# The list of dialogue responses.
 | 
				
			||||||
var responses: Array = []:
 | 
					var responses: Array = []:
 | 
				
			||||||
	get:
 | 
					 | 
				
			||||||
		return responses
 | 
					 | 
				
			||||||
	set(value):
 | 
						set(value):
 | 
				
			||||||
		responses = value
 | 
							responses = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,25 +64,11 @@ func _ready() -> void:
 | 
				
			||||||
		response_template.hide()
 | 
							response_template.hide()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Get the selectable items in the menu.
 | 
					# This is deprecated.
 | 
				
			||||||
func get_menu_items() -> Array:
 | 
					 | 
				
			||||||
	var items: Array = []
 | 
					 | 
				
			||||||
	for child in get_children():
 | 
					 | 
				
			||||||
		if not child.visible: continue
 | 
					 | 
				
			||||||
		if "Disallowed" in child.name: continue
 | 
					 | 
				
			||||||
		items.append(child)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return items
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [b]DEPRECATED[/b]. Do not use.
 | 
					 | 
				
			||||||
func set_responses(next_responses: Array) -> void:
 | 
					func set_responses(next_responses: Array) -> void:
 | 
				
			||||||
	self.responses = next_responses
 | 
						self.responses = next_responses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#region Internal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Prepare the menu for keyboard and mouse navigation.
 | 
					# Prepare the menu for keyboard and mouse navigation.
 | 
				
			||||||
func _configure_focus() -> void:
 | 
					func _configure_focus() -> void:
 | 
				
			||||||
	var items = get_menu_items()
 | 
						var items = get_menu_items()
 | 
				
			||||||
| 
						 | 
					@ -116,9 +100,18 @@ func _configure_focus() -> void:
 | 
				
			||||||
	items[0].grab_focus()
 | 
						items[0].grab_focus()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endregion
 | 
					## Get the selectable items in the menu.
 | 
				
			||||||
 | 
					func get_menu_items() -> Array:
 | 
				
			||||||
 | 
						var items: Array = []
 | 
				
			||||||
 | 
						for child in get_children():
 | 
				
			||||||
 | 
							if not child.visible: continue
 | 
				
			||||||
 | 
							if "Disallowed" in child.name: continue
 | 
				
			||||||
 | 
							items.append(child)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#region Signals
 | 
						return items
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Signals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _on_response_mouse_entered(item: Control) -> void:
 | 
					func _on_response_mouse_entered(item: Control) -> void:
 | 
				
			||||||
| 
						 | 
					@ -136,6 +129,3 @@ func _on_response_gui_input(event: InputEvent, item: Control, response) -> void:
 | 
				
			||||||
		response_selected.emit(response)
 | 
							response_selected.emit(response)
 | 
				
			||||||
	elif event.is_action_pressed(&"ui_accept" if next_action.is_empty() else next_action) and item in get_menu_items():
 | 
						elif event.is_action_pressed(&"ui_accept" if next_action.is_empty() else next_action) and item in get_menu_items():
 | 
				
			||||||
		response_selected.emit(response)
 | 
							response_selected.emit(response)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endregion
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,21 +105,6 @@ namespace DialogueManagerRuntime
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public override async void _Notification(int what)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      // Detect a change of locale and update the current dialogue line to show the new language
 | 
					 | 
				
			||||||
      if (what == NotificationTranslationChanged)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        float visibleRatio = dialogueLabel.VisibleRatio;
 | 
					 | 
				
			||||||
        DialogueLine = await DialogueManager.GetNextDialogueLine(resource, DialogueLine.Id, temporaryGameStates);
 | 
					 | 
				
			||||||
        if (visibleRatio < 1.0f)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          dialogueLabel.Call("skip_typing");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public async void Start(Resource dialogueResource, string title, Array<Variant> extraGameStates = null)
 | 
					    public async void Start(Resource dialogueResource, string title, Array<Variant> extraGameStates = null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      temporaryGameStates = extraGameStates ?? new Array<Variant>();
 | 
					      temporaryGameStates = extraGameStates ?? new Array<Variant>();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,15 +89,6 @@ func _unhandled_input(_event: InputEvent) -> void:
 | 
				
			||||||
	get_viewport().set_input_as_handled()
 | 
						get_viewport().set_input_as_handled()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _notification(what: int) -> void:
 | 
					 | 
				
			||||||
	# Detect a change of locale and update the current dialogue line to show the new language
 | 
					 | 
				
			||||||
	if what == NOTIFICATION_TRANSLATION_CHANGED:
 | 
					 | 
				
			||||||
		var visible_ratio = dialogue_label.visible_ratio
 | 
					 | 
				
			||||||
		self.dialogue_line = await resource.get_next_dialogue_line(dialogue_line.id)
 | 
					 | 
				
			||||||
		if visible_ratio < 1:
 | 
					 | 
				
			||||||
			dialogue_label.skip_typing()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Start some dialogue
 | 
					## Start some dialogue
 | 
				
			||||||
func start(dialogue_resource: DialogueResource, title: String, extra_game_states: Array = []) -> void:
 | 
					func start(dialogue_resource: DialogueResource, title: String, extra_game_states: Array = []) -> void:
 | 
				
			||||||
	temporary_game_states =  [self] + extra_game_states
 | 
						temporary_game_states =  [self] + extra_game_states
 | 
				
			||||||
| 
						 | 
					@ -111,7 +102,7 @@ func next(next_id: String) -> void:
 | 
				
			||||||
	self.dialogue_line = await resource.get_next_dialogue_line(next_id, temporary_game_states)
 | 
						self.dialogue_line = await resource.get_next_dialogue_line(next_id, temporary_game_states)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#region Signals
 | 
					### Signals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _on_mutated(_mutation: Dictionary) -> void:
 | 
					func _on_mutated(_mutation: Dictionary) -> void:
 | 
				
			||||||
| 
						 | 
					@ -148,6 +139,3 @@ func _on_balloon_gui_input(event: InputEvent) -> void:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _on_responses_menu_response_selected(response: DialogueResponse) -> void:
 | 
					func _on_responses_menu_response_selected(response: DialogueResponse) -> void:
 | 
				
			||||||
	next(response.next_id)
 | 
						next(response.next_id)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endregion
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ signal compiled_resource(resource: Resource)
 | 
				
			||||||
const DialogueResource = preload("./dialogue_resource.gd")
 | 
					const DialogueResource = preload("./dialogue_resource.gd")
 | 
				
			||||||
const DialogueManagerParseResult = preload("./components/parse_result.gd")
 | 
					const DialogueManagerParseResult = preload("./components/parse_result.gd")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const compiler_version = 12
 | 
					const compiler_version = 11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _get_importer_name() -> String:
 | 
					func _get_importer_name() -> String:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ msgstr ""
 | 
				
			||||||
"POT-Creation-Date: \n"
 | 
					"POT-Creation-Date: \n"
 | 
				
			||||||
"PO-Revision-Date: \n"
 | 
					"PO-Revision-Date: \n"
 | 
				
			||||||
"Last-Translator: \n"
 | 
					"Last-Translator: \n"
 | 
				
			||||||
"Language-Team: penghao123456、憨憨羊の宇航鸽鸽、ABShinri\n"
 | 
					"Language-Team: penghao123456、憨憨羊の宇航鸽鸽\n"
 | 
				
			||||||
"Language: zh\n"
 | 
					"Language: zh\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
| 
						 | 
					@ -29,9 +29,6 @@ msgstr "清空历史记录"
 | 
				
			||||||
msgid "save_all_files"
 | 
					msgid "save_all_files"
 | 
				
			||||||
msgstr "保存所有文件"
 | 
					msgstr "保存所有文件"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "find_in_files"
 | 
					 | 
				
			||||||
msgstr "在文件中查找"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "test_dialogue"
 | 
					msgid "test_dialogue"
 | 
				
			||||||
msgstr "测试对话"
 | 
					msgstr "测试对话"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,10 +51,10 @@ msgid "docs"
 | 
				
			||||||
msgstr "文档"
 | 
					msgstr "文档"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "insert.wave_bbcode"
 | 
					msgid "insert.wave_bbcode"
 | 
				
			||||||
msgstr "波浪效果"
 | 
					msgstr "BBCode [lb]wave[rb]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "insert.shake_bbcode"
 | 
					msgid "insert.shake_bbcode"
 | 
				
			||||||
msgstr "抖动效果"
 | 
					msgstr "BBCode [lb]wave[rb]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "insert.typing_pause"
 | 
					msgid "insert.typing_pause"
 | 
				
			||||||
msgstr "输入间隔"
 | 
					msgstr "输入间隔"
 | 
				
			||||||
| 
						 | 
					@ -98,9 +95,6 @@ msgstr "结束对话"
 | 
				
			||||||
msgid "generate_line_ids"
 | 
					msgid "generate_line_ids"
 | 
				
			||||||
msgstr "生成行 ID"
 | 
					msgstr "生成行 ID"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "save_characters_to_csv"
 | 
					 | 
				
			||||||
msgstr "保存角色到 CSV"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "save_to_csv"
 | 
					msgid "save_to_csv"
 | 
				
			||||||
msgstr "生成 CSV"
 | 
					msgstr "生成 CSV"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,9 +134,6 @@ msgstr "在 Godot 侧边栏中显示"
 | 
				
			||||||
msgid "settings.revert_to_default_test_scene"
 | 
					msgid "settings.revert_to_default_test_scene"
 | 
				
			||||||
msgstr "重置测试场景设定"
 | 
					msgstr "重置测试场景设定"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.default_balloon_hint"
 | 
					 | 
				
			||||||
msgstr "设置调用 \"DialogueManager.show_balloon()\" 时使用的对话框"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.autoload"
 | 
					msgid "settings.autoload"
 | 
				
			||||||
msgstr "Autoload"
 | 
					msgstr "Autoload"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,10 +150,10 @@ msgid "settings.missing_keys_hint"
 | 
				
			||||||
msgstr "如果你使用静态键,这将会帮助你寻找未添加至翻译文件的键。"
 | 
					msgstr "如果你使用静态键,这将会帮助你寻找未添加至翻译文件的键。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.characters_translations"
 | 
					msgid "settings.characters_translations"
 | 
				
			||||||
msgstr "在翻译文件中导出角色名"
 | 
					msgstr "在翻译文件中导出角色名。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.wrap_long_lines"
 | 
					msgid "settings.wrap_long_lines"
 | 
				
			||||||
msgstr "文本编辑器自动换行"
 | 
					msgstr "自动折行"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.include_failed_responses"
 | 
					msgid "settings.include_failed_responses"
 | 
				
			||||||
msgstr "在判断条件失败时仍显示回复选项"
 | 
					msgstr "在判断条件失败时仍显示回复选项"
 | 
				
			||||||
| 
						 | 
					@ -185,39 +176,9 @@ msgstr "当一个 Autoload 在这里被勾选,他的所有成员会被映射
 | 
				
			||||||
msgid "settings.states_hint"
 | 
					msgid "settings.states_hint"
 | 
				
			||||||
msgstr "比如,当你开启对于“Foo”的映射时,你可以将“Foo.bar”简写成“bar”。"
 | 
					msgstr "比如,当你开启对于“Foo”的映射时,你可以将“Foo.bar”简写成“bar”。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.recompile_warning"
 | 
					 | 
				
			||||||
msgstr "更改这些选项会强制重新编译所有的对话框,当你清楚在做什么的时候更改。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.create_lines_for_responses_with_characters"
 | 
					 | 
				
			||||||
msgstr "回复项带角色名时(- char: response),会自动生成为选择后的下一句对话"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.include_characters_in_translations"
 | 
					 | 
				
			||||||
msgstr "导出 CSV 时包括角色名"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.include_notes_in_translations"
 | 
					 | 
				
			||||||
msgstr "导出 CSV 时包括注释(## comments)"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.check_for_updates"
 | 
					 | 
				
			||||||
msgstr "检查升级"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "n_of_n"
 | 
					msgid "n_of_n"
 | 
				
			||||||
msgstr "第{index}个,共{total}个"
 | 
					msgstr "第{index}个,共{total}个"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "search.find"
 | 
					 | 
				
			||||||
msgstr "查找:"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.find_all"
 | 
					 | 
				
			||||||
msgstr "查找全部..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.placeholder"
 | 
					 | 
				
			||||||
msgstr "请输入查找的内容"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.replace_placeholder"
 | 
					 | 
				
			||||||
msgstr "请输入替换的内容"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.replace_selected"
 | 
					 | 
				
			||||||
msgstr "替换勾选"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.previous"
 | 
					msgid "search.previous"
 | 
				
			||||||
msgstr "查找上一个"
 | 
					msgstr "查找上一个"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ msgstr ""
 | 
				
			||||||
"POT-Creation-Date: \n"
 | 
					"POT-Creation-Date: \n"
 | 
				
			||||||
"PO-Revision-Date: \n"
 | 
					"PO-Revision-Date: \n"
 | 
				
			||||||
"Last-Translator: \n"
 | 
					"Last-Translator: \n"
 | 
				
			||||||
"Language-Team: 憨憨羊の宇航鴿鴿、ABShinri\n"
 | 
					"Language-Team: 憨憨羊の宇航鴿鴿\n"
 | 
				
			||||||
"Language: zh_TW\n"
 | 
					"Language: zh_TW\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
| 
						 | 
					@ -29,9 +29,6 @@ msgstr "清空歷史記錄"
 | 
				
			||||||
msgid "save_all_files"
 | 
					msgid "save_all_files"
 | 
				
			||||||
msgstr "儲存所有檔案"
 | 
					msgstr "儲存所有檔案"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "find_in_files"
 | 
					 | 
				
			||||||
msgstr "在檔案中查找"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "test_dialogue"
 | 
					msgid "test_dialogue"
 | 
				
			||||||
msgstr "測試對話"
 | 
					msgstr "測試對話"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,10 +51,10 @@ msgid "docs"
 | 
				
			||||||
msgstr "文檔"
 | 
					msgstr "文檔"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "insert.wave_bbcode"
 | 
					msgid "insert.wave_bbcode"
 | 
				
			||||||
msgstr "波浪特效"
 | 
					msgstr "BBCode [lb]wave[rb]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "insert.shake_bbcode"
 | 
					msgid "insert.shake_bbcode"
 | 
				
			||||||
msgstr "震動特效"
 | 
					msgstr "BBCode [lb]wave[rb]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "insert.typing_pause"
 | 
					msgid "insert.typing_pause"
 | 
				
			||||||
msgstr "輸入間隔"
 | 
					msgstr "輸入間隔"
 | 
				
			||||||
| 
						 | 
					@ -98,9 +95,6 @@ msgstr "結束對話"
 | 
				
			||||||
msgid "generate_line_ids"
 | 
					msgid "generate_line_ids"
 | 
				
			||||||
msgstr "生成行 ID"
 | 
					msgstr "生成行 ID"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "save_characters_to_csv"
 | 
					 | 
				
			||||||
msgstr "保存角色到 CSV"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "save_to_csv"
 | 
					msgid "save_to_csv"
 | 
				
			||||||
msgstr "生成 CSV"
 | 
					msgstr "生成 CSV"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,9 +134,6 @@ msgstr "在 Godot 側邊欄中顯示"
 | 
				
			||||||
msgid "settings.revert_to_default_test_scene"
 | 
					msgid "settings.revert_to_default_test_scene"
 | 
				
			||||||
msgstr "重置測試場景設定"
 | 
					msgstr "重置測試場景設定"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.default_balloon_hint"
 | 
					 | 
				
			||||||
msgstr "設置使用 \"DialogueManager.show_balloon()\" 时的对话框"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.autoload"
 | 
					msgid "settings.autoload"
 | 
				
			||||||
msgstr "Autoload"
 | 
					msgstr "Autoload"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -185,39 +176,9 @@ msgstr "當一個 Autoload 在這裏被勾選,他的所有成員會被映射
 | 
				
			||||||
msgid "settings.states_hint"
 | 
					msgid "settings.states_hint"
 | 
				
			||||||
msgstr "比如,當你開啓對於“Foo”的映射時,你可以將“Foo.bar”簡寫成“bar”。"
 | 
					msgstr "比如,當你開啓對於“Foo”的映射時,你可以將“Foo.bar”簡寫成“bar”。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "settings.recompile_warning"
 | 
					 | 
				
			||||||
msgstr "更改這些選項會強制重新編譯所有的對話框,當你清楚在做什麼的時候更改。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.create_lines_for_responses_with_characters"
 | 
					 | 
				
			||||||
msgstr "回覆項目帶角色名稱時(- char: response),會自動產生為選擇後的下一句對話"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.include_characters_in_translations"
 | 
					 | 
				
			||||||
msgstr "匯出 CSV 時包含角色名"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.include_notes_in_translations"
 | 
					 | 
				
			||||||
msgstr "匯出 CSV 時包括註解(## comments)"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "settings.check_for_updates"
 | 
					 | 
				
			||||||
msgstr "檢查升級"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "n_of_n"
 | 
					msgid "n_of_n"
 | 
				
			||||||
msgstr "第{index}個,共{total}個"
 | 
					msgstr "第{index}個,共{total}個"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msgid "search.find"
 | 
					 | 
				
			||||||
msgstr "搜尋:"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.find_all"
 | 
					 | 
				
			||||||
msgstr "搜尋全部..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.placeholder"
 | 
					 | 
				
			||||||
msgstr "請輸入搜尋的內容"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.replace_placeholder"
 | 
					 | 
				
			||||||
msgstr "請輸入替換的內容"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.replace_selected"
 | 
					 | 
				
			||||||
msgstr "替換勾選"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msgid "search.previous"
 | 
					msgid "search.previous"
 | 
				
			||||||
msgstr "搜尋上一個"
 | 
					msgstr "搜尋上一個"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,5 +3,5 @@
 | 
				
			||||||
name="Dialogue Manager"
 | 
					name="Dialogue Manager"
 | 
				
			||||||
description="A simple but powerful branching dialogue system"
 | 
					description="A simple but powerful branching dialogue system"
 | 
				
			||||||
author="Nathan Hoad"
 | 
					author="Nathan Hoad"
 | 
				
			||||||
version="2.39.1"
 | 
					version="2.38.0"
 | 
				
			||||||
script="plugin.gd"
 | 
					script="plugin.gd"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,80 +145,6 @@ func _build() -> bool:
 | 
				
			||||||
	return true
 | 
						return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Get the shortcuts used by the plugin
 | 
					 | 
				
			||||||
func get_editor_shortcuts() -> Dictionary:
 | 
					 | 
				
			||||||
	var shortcuts: Dictionary = {
 | 
					 | 
				
			||||||
		toggle_comment = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+K"),
 | 
					 | 
				
			||||||
			_create_event("Ctrl+Slash")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		move_up = [
 | 
					 | 
				
			||||||
			_create_event("Alt+Up")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		move_down = [
 | 
					 | 
				
			||||||
			_create_event("Alt+Down")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		save = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+Alt+S")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		close_file = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+W")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		find_in_files = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+Shift+F")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		run_test_scene = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+F5")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		text_size_increase = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+Equal")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		text_size_decrease = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+Minus")
 | 
					 | 
				
			||||||
		],
 | 
					 | 
				
			||||||
		text_size_reset = [
 | 
					 | 
				
			||||||
			_create_event("Ctrl+0")
 | 
					 | 
				
			||||||
		]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var paths = get_editor_interface().get_editor_paths()
 | 
					 | 
				
			||||||
	var settings = load(paths.get_config_dir() + "/editor_settings-4.tres")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if not settings: return shortcuts
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for s in settings.get("shortcuts"):
 | 
					 | 
				
			||||||
		for key in shortcuts:
 | 
					 | 
				
			||||||
			if s.name == "script_text_editor/%s" % key or s.name == "script_editor/%s" % key:
 | 
					 | 
				
			||||||
				shortcuts[key] = []
 | 
					 | 
				
			||||||
				for event in s.shortcuts:
 | 
					 | 
				
			||||||
					if event is InputEventKey:
 | 
					 | 
				
			||||||
						shortcuts[key].append(event)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return shortcuts
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func _create_event(string: String) -> InputEventKey:
 | 
					 | 
				
			||||||
	var event: InputEventKey = InputEventKey.new()
 | 
					 | 
				
			||||||
	var bits = string.split("+")
 | 
					 | 
				
			||||||
	event.keycode = OS.find_keycode_from_string(bits[bits.size() - 1])
 | 
					 | 
				
			||||||
	event.shift_pressed = bits.has("Shift")
 | 
					 | 
				
			||||||
	event.alt_pressed = bits.has("Alt")
 | 
					 | 
				
			||||||
	if bits.has("Ctrl") or bits.has("Command"):
 | 
					 | 
				
			||||||
		event.command_or_control_autoremap = true
 | 
					 | 
				
			||||||
	return event
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Get the editor shortcut that matches an event
 | 
					 | 
				
			||||||
func get_editor_shortcut(event: InputEventKey) -> String:
 | 
					 | 
				
			||||||
	var shortcuts: Dictionary = get_editor_shortcuts()
 | 
					 | 
				
			||||||
	for key in shortcuts:
 | 
					 | 
				
			||||||
		for shortcut in shortcuts.get(key, []):
 | 
					 | 
				
			||||||
			if event.is_match(shortcut):
 | 
					 | 
				
			||||||
				return key
 | 
					 | 
				
			||||||
	return ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Get the current version
 | 
					## Get the current version
 | 
				
			||||||
func get_version() -> String:
 | 
					func get_version() -> String:
 | 
				
			||||||
	var config: ConfigFile = ConfigFile.new()
 | 
						var config: ConfigFile = ConfigFile.new()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -176,5 +176,9 @@ static func has_dotnet_solution() -> bool:
 | 
				
			||||||
		var has_dotnet_solution: bool = FileAccess.file_exists("res://%s/%s.sln" % [directory, file_name])
 | 
							var has_dotnet_solution: bool = FileAccess.file_exists("res://%s/%s.sln" % [directory, file_name])
 | 
				
			||||||
		set_user_value("has_dotnet_solution", has_dotnet_solution)
 | 
							set_user_value("has_dotnet_solution", has_dotnet_solution)
 | 
				
			||||||
		return has_dotnet_solution
 | 
							return has_dotnet_solution
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							var plugin_path: String = new().get_script().resource_path.get_base_dir()
 | 
				
			||||||
 | 
							if not ResourceLoader.exists(plugin_path + "/DialogueManager.cs"): return false
 | 
				
			||||||
 | 
							if load(plugin_path + "/DialogueManager.cs") == null: return false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return false
 | 
						return true
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,8 +11,7 @@ const SUPPORTED_BUILTIN_TYPES = [
 | 
				
			||||||
	TYPE_DICTIONARY,
 | 
						TYPE_DICTIONARY,
 | 
				
			||||||
	TYPE_QUATERNION,
 | 
						TYPE_QUATERNION,
 | 
				
			||||||
	TYPE_COLOR,
 | 
						TYPE_COLOR,
 | 
				
			||||||
	TYPE_SIGNAL,
 | 
						TYPE_SIGNAL
 | 
				
			||||||
	TYPE_CALLABLE
 | 
					 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,20 +181,19 @@ func _unhandled_input(event: InputEvent) -> void:
 | 
				
			||||||
	if not visible: return
 | 
						if not visible: return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if event is InputEventKey and event.is_pressed():
 | 
						if event is InputEventKey and event.is_pressed():
 | 
				
			||||||
		var shortcut: String = Engine.get_meta("DialogueManagerPlugin").get_editor_shortcut(event)
 | 
							match event.as_text():
 | 
				
			||||||
		match shortcut:
 | 
								"Ctrl+Alt+S", "Command+Alt+S":
 | 
				
			||||||
			"close_file":
 | 
					 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
					 | 
				
			||||||
				close_file(current_file_path)
 | 
					 | 
				
			||||||
			"save":
 | 
					 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
				save_file(current_file_path)
 | 
									save_file(current_file_path)
 | 
				
			||||||
			"find_in_files":
 | 
								"Ctrl+W", "Command+W":
 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
				_on_find_in_files_button_pressed()
 | 
									close_file(current_file_path)
 | 
				
			||||||
			"run_test_scene":
 | 
								"Ctrl+F5", "Command+F5":
 | 
				
			||||||
				get_viewport().set_input_as_handled()
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
				_on_test_button_pressed()
 | 
									_on_test_button_pressed()
 | 
				
			||||||
 | 
								"Ctrl+Shift+F", "Command+Shift+F":
 | 
				
			||||||
 | 
									get_viewport().set_input_as_handled()
 | 
				
			||||||
 | 
									_on_find_in_files_button_pressed()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func apply_changes() -> void:
 | 
					func apply_changes() -> void:
 | 
				
			||||||
| 
						 | 
					@ -1045,11 +1044,9 @@ func _on_files_list_file_middle_clicked(path: String):
 | 
				
			||||||
func _on_files_popup_menu_about_to_popup() -> void:
 | 
					func _on_files_popup_menu_about_to_popup() -> void:
 | 
				
			||||||
	files_popup_menu.clear()
 | 
						files_popup_menu.clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var shortcuts: Dictionary = Engine.get_meta("DialogueManagerPlugin").get_editor_shortcuts()
 | 
						files_popup_menu.add_item(DialogueConstants.translate(&"buffer.save"), ITEM_SAVE, KEY_MASK_CTRL | KEY_MASK_ALT | KEY_S)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	files_popup_menu.add_item(DialogueConstants.translate(&"buffer.save"), ITEM_SAVE, OS.find_keycode_from_string(shortcuts.get("save")[0].as_text_keycode()))
 | 
					 | 
				
			||||||
	files_popup_menu.add_item(DialogueConstants.translate(&"buffer.save_as"), ITEM_SAVE_AS)
 | 
						files_popup_menu.add_item(DialogueConstants.translate(&"buffer.save_as"), ITEM_SAVE_AS)
 | 
				
			||||||
	files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close"), ITEM_CLOSE, OS.find_keycode_from_string(shortcuts.get("close_file")[0].as_text_keycode()))
 | 
						files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close"), ITEM_CLOSE, KEY_MASK_CTRL | KEY_W)
 | 
				
			||||||
	files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close_all"), ITEM_CLOSE_ALL)
 | 
						files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close_all"), ITEM_CLOSE_ALL)
 | 
				
			||||||
	files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close_other_files"), ITEM_CLOSE_OTHERS)
 | 
						files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close_other_files"), ITEM_CLOSE_OTHERS)
 | 
				
			||||||
	files_popup_menu.add_separator()
 | 
						files_popup_menu.add_separator()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@ config/icon="res://icon.svg"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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"
 | 
				
			||||||
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"
 | 
				
			||||||
| 
						 | 
					@ -26,7 +27,7 @@ DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dialogue_manager]
 | 
					[dialogue_manager]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
general/states=["GlobalState", "World", "EventBus"]
 | 
					general/states=["GlobalState", "World"]
 | 
				
			||||||
general/wrap_lines=true
 | 
					general/wrap_lines=true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[display]
 | 
					[display]
 | 
				
			||||||
| 
						 | 
					@ -214,10 +215,6 @@ locale/translations_pot_files=PackedStringArray("res://Assets/Dialogue/doc.dialo
 | 
				
			||||||
2d_physics/layer_6="Interaction Receiver"
 | 
					2d_physics/layer_6="Interaction Receiver"
 | 
				
			||||||
2d_physics/layer_7="Interaction Trigger"
 | 
					2d_physics/layer_7="Interaction Trigger"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[navigation]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2d/default_cell_size=16.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[physics]
 | 
					[physics]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2d/default_gravity=0.0
 | 
					2d/default_gravity=0.0
 | 
				
			||||||
| 
						 | 
					@ -225,5 +222,7 @@ locale/translations_pot_files=PackedStringArray("res://Assets/Dialogue/doc.dialo
 | 
				
			||||||
[rendering]
 | 
					[rendering]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
textures/canvas_textures/default_texture_filter=0
 | 
					textures/canvas_textures/default_texture_filter=0
 | 
				
			||||||
 | 
					renderer/rendering_method="gl_compatibility"
 | 
				
			||||||
 | 
					renderer/rendering_method.mobile="gl_compatibility"
 | 
				
			||||||
environment/defaults/default_clear_color=Color(0.301961, 0.301961, 0.301961, 1)
 | 
					environment/defaults/default_clear_color=Color(0.301961, 0.301961, 0.301961, 1)
 | 
				
			||||||
viewport/hdr_2d=true
 | 
					viewport/hdr_2d=true
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue