Implement all current work-in-progress features (#43)
* Add WIP vendors * Add TimerExtensions * chore: Update dialogue manager version * Add Inventory.EquippedItem signal * Move files to UI.Inventory namespace * Modify Hotbar and InventorySlot organization Made InventorySlot a bit more modular. * Modify hotbar icons * Implement request to display shop * Add forsenLevel placeholder icon * Add shop UI * Update UI to use theme and click through * Update item metadata Added placeholder icons for items without an icon. * Add Snus Dealer example vendor NPC * Implement factions with bitflags instead * Fix typo in Doc dialogue * Hide and show shop menu * Add shaders * Add newline to console output * Add modal interface * wip: new sprites * Add new tileset * wip: Redesign Depths of the Arena * Change tiles * Implement igniting bow arrows * Add bow alt-fire ability * Update Arena redesign * Add Doc summon sounds * Add inventory menu * Add glow to effects * Add some props to ArenaExterior * Add alt fire to RangedIdleState * Add keybinds for inventory menu * Make arrows remain on fire if bow was set on fire * Redesign Arena * Add Sword effects and self knockback * Update lighting effects * Add wait/delay for Doc to exit when attacking * Modify UIimpl-save-inventory
|  | @ -17,3 +17,9 @@ I can write english pretty good but since It is not my mothertounge I will make | |||
| The dark room was clouded with smoke as the 1st lieutenant entered the room. He walked slowly , trying to avoid the big clouds, towards the black desk where a man in black cape was sitting and enjoying his last cigar. | ||||
| 
 | ||||
| => END | ||||
| 
 | ||||
| ~ wall_writing | ||||
| 
 | ||||
| "Life's not fair. Get a grip." -- Doc, The Two Time | ||||
| 
 | ||||
| => END | ||||
|  |  | |||
|  | @ -0,0 +1,19 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="mp3" | ||||
| type="AudioStreamMP3" | ||||
| uid="uid://bskrlh73x1sgp" | ||||
| path="res://.godot/imported/doc-summon.mp3-ebe66881fc8469c2b9dc405db43209d0.mp3str" | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sounds/doc-summon.mp3" | ||||
| dest_files=["res://.godot/imported/doc-summon.mp3-ebe66881fc8469c2b9dc405db43209d0.mp3str"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| loop=false | ||||
| loop_offset=0 | ||||
| bpm=0 | ||||
| beat_count=0 | ||||
| bar_beats=4 | ||||
| After Width: | Height: | Size: 1.5 KiB | 
|  | @ -0,0 +1,34 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://xgy5gihyxgih" | ||||
| path="res://.godot/imported/fire-32x32.png-6317a2b0efbef8c9d4ff90f6384746c6.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sprites/Misc/fire-32x32.png" | ||||
| dest_files=["res://.godot/imported/fire-32x32.png-6317a2b0efbef8c9d4ff90f6384746c6.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 | ||||
| After Width: | Height: | Size: 743 B | 
|  | @ -0,0 +1,34 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://c1garalf1clsp" | ||||
| path="res://.godot/imported/flame-large.png-41b172a8bfc9c186ab97a98ae0c5a459.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sprites/Misc/flame-large.png" | ||||
| dest_files=["res://.godot/imported/flame-large.png-41b172a8bfc9c186ab97a98ae0c5a459.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 | ||||
| After Width: | Height: | Size: 92 B | 
|  | @ -0,0 +1,34 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://bitpf645g0prl" | ||||
| path="res://.godot/imported/torch-base.png-d14e78df3788bf6d3a9565b574d6c1a1.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sprites/Misc/torch-base.png" | ||||
| dest_files=["res://.godot/imported/torch-base.png-d14e78df3788bf6d3a9565b574d6c1a1.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 | ||||
| After Width: | Height: | Size: 379 B | 
|  | @ -0,0 +1,34 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://cyfyelyq3o15s" | ||||
| path="res://.godot/imported/torch-fire.png-a9f51cf7273c726b68014cb26a31d54c.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sprites/Misc/torch-fire.png" | ||||
| dest_files=["res://.godot/imported/torch-fire.png-a9f51cf7273c726b68014cb26a31d54c.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 | ||||
| After Width: | Height: | Size: 379 B | 
|  | @ -0,0 +1,34 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://i5ksh8i0q48o" | ||||
| path="res://.godot/imported/torch-lamp-base-back.png-a6c17eff02f04f493c4e495a2d662d5a.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sprites/Misc/torch-lamp-base-back.png" | ||||
| dest_files=["res://.godot/imported/torch-lamp-base-back.png-a6c17eff02f04f493c4e495a2d662d5a.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 | ||||
| After Width: | Height: | Size: 416 B | 
|  | @ -0,0 +1,34 @@ | |||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://ca0htndnsb38k" | ||||
| path="res://.godot/imported/torch-lamp-base.png-03b38ecb41ff35cadec5aeaad2c98e38.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://Assets/Sprites/Misc/torch-lamp-base.png" | ||||
| dest_files=["res://.godot/imported/torch-lamp-base.png-03b38ecb41ff35cadec5aeaad2c98e38.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 | ||||
| Before Width: | Height: | Size: 783 B After Width: | Height: | Size: 810 B | 
| Before Width: | Height: | Size: 152 B After Width: | Height: | Size: 148 B | 
| Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 4.8 KiB | 
|  | @ -0,0 +1,70 @@ | |||
| using Godot; | ||||
| using System.Linq; | ||||
| using System.Collections.Generic; | ||||
| 
 | ||||
| namespace SupaLidlGame.BoundingBoxes; | ||||
| 
 | ||||
| public partial class OcclusionTrigger : Area2D | ||||
| { | ||||
|     [Export] | ||||
|     public double FadeDuration { get; set; } | ||||
| 
 | ||||
|     [Export] | ||||
|     public Godot.Collections.Array<string> Groups { get; set; } | ||||
| 
 | ||||
|     private Tween _tween = null; | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         Connect(SignalName.BodyEntered, new Callable(this, nameof(OnBodyEntered))); | ||||
|         Connect(SignalName.BodyExited, new Callable(this, nameof(OnBodyExited))); | ||||
|     } | ||||
| 
 | ||||
|     private IEnumerable<CanvasItem> GetCanvasItems() | ||||
|     { | ||||
|         IEnumerable<IEnumerable<CanvasItem>> pack() | ||||
|         { | ||||
|             foreach (string group in Groups) | ||||
|             { | ||||
|                 var nodes = GetTree().GetNodesInGroup(group) | ||||
|                     .OfType<CanvasItem>(); | ||||
| 
 | ||||
|                 yield return nodes; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return pack().SelectMany(e => e); | ||||
|     } | ||||
| 
 | ||||
|     private void OnBodyEntered(Node2D _) | ||||
|     { | ||||
|         if (IsInstanceValid(_tween)) | ||||
|         { | ||||
|             _tween.Kill(); | ||||
|         } | ||||
| 
 | ||||
|         _tween = GetTree().CreateTween(); | ||||
|         _tween.SetParallel(); | ||||
| 
 | ||||
|         foreach (var node in GetCanvasItems()) | ||||
|         { | ||||
|             _tween.TweenProperty(node, "modulate", Colors.Transparent, FadeDuration); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void OnBodyExited(Node2D _) | ||||
|     { | ||||
|         if (IsInstanceValid(_tween)) | ||||
|         { | ||||
|             _tween.Kill(); | ||||
|         } | ||||
| 
 | ||||
|         _tween = GetTree().CreateTween(); | ||||
|         _tween.SetParallel(); | ||||
| 
 | ||||
|         foreach (var node in GetCanvasItems()) | ||||
|         { | ||||
|             _tween.TweenProperty(node, "modulate", Colors.White, FadeDuration); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -1,4 +1,4 @@ | |||
| [gd_scene load_steps=70 format=3 uid="uid://d2skjvvx6fal0"] | ||||
| [gd_scene load_steps=71 format=3 uid="uid://d2skjvvx6fal0"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://Characters/Doc.cs" id="2_3elet"] | ||||
| [ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="2_5jxom"] | ||||
|  | @ -38,6 +38,7 @@ | |||
| [ext_resource type="PackedScene" uid="uid://p7oijq6dbvvk" path="res://Items/Weapons/DocLance.tscn" id="24_2es2r"] | ||||
| [ext_resource type="AudioStream" uid="uid://cqj44je3mvk60" path="res://Assets/Sounds/rauuul.wav" id="26_js7p2"] | ||||
| [ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="33_08dyq"] | ||||
| [ext_resource type="AudioStream" uid="uid://bskrlh73x1sgp" path="res://Assets/Sounds/doc-summon.mp3" id="34_g57b0"] | ||||
| 
 | ||||
| [sub_resource type="ShaderMaterial" id="ShaderMaterial_7n7iy"] | ||||
| resource_local_to_scene = true | ||||
|  | @ -327,6 +328,21 @@ tracks/2/keys = { | |||
| "update": 0, | ||||
| "values": [Vector2(1.5, 0.75), Vector2(1, 1)] | ||||
| } | ||||
| tracks/3/type = "audio" | ||||
| tracks/3/imported = false | ||||
| tracks/3/enabled = true | ||||
| tracks/3/path = NodePath("../Effects/SummonCry") | ||||
| tracks/3/interp = 1 | ||||
| tracks/3/loop_wrap = true | ||||
| tracks/3/keys = { | ||||
| "clips": [{ | ||||
| "end_offset": 1.1, | ||||
| "start_offset": 0.4, | ||||
| "stream": ExtResource("34_g57b0") | ||||
| }], | ||||
| "times": PackedFloat32Array(0) | ||||
| } | ||||
| tracks/3/use_blend = true | ||||
| 
 | ||||
| [sub_resource type="AnimationLibrary" id="AnimationLibrary_rpply"] | ||||
| _data = { | ||||
|  | @ -760,6 +776,9 @@ attenuation = 0.5 | |||
| [node name="HurtSound" type="AudioStreamPlayer2D" parent="Effects"] | ||||
| stream = ExtResource("9_stm0e") | ||||
| 
 | ||||
| [node name="SummonCry" type="AudioStreamPlayer2D" parent="Effects"] | ||||
| attenuation = 4.0 | ||||
| 
 | ||||
| [node name="Sprite" type="Sprite2D" parent="."] | ||||
| y_sort_enabled = true | ||||
| use_parent_material = true | ||||
|  | @ -785,14 +804,8 @@ script = ExtResource("8_r8ejq") | |||
| Hotbar = [] | ||||
| Items = [] | ||||
| 
 | ||||
| [node name="DocLance" parent="Inventory" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "ParryParticles", "StateMachine", "Anchor", "HandAnchor") instance=ExtResource("24_2es2r")] | ||||
| [node name="DocLance" parent="Inventory" instance=ExtResource("24_2es2r")] | ||||
| unique_name_in_owner = true | ||||
| Hitbox = NodePath("Hitbox") | ||||
| AnimationPlayer = NodePath("AnimationPlayer") | ||||
| ParryParticles = NodePath("Anchor/Node2D/Sprite2D/ParryParticles") | ||||
| StateMachine = NodePath("State") | ||||
| Anchor = NodePath("Anchor") | ||||
| HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") | ||||
| 
 | ||||
| [node name="InteractionTrigger" parent="." instance=ExtResource("33_08dyq")] | ||||
| 
 | ||||
|  |  | |||
|  | @ -27,7 +27,6 @@ | |||
| [ext_resource type="Script" path="res://BoundingBoxes/InteractionRay.cs" id="13_hs3u1"] | ||||
| [ext_resource type="Script" path="res://State/Character/PlayerHealState.cs" id="13_t103m"] | ||||
| [ext_resource type="Script" path="res://State/Character/PlayerMaxLevelState.cs" id="14_1sn10"] | ||||
| [ext_resource type="Texture2D" uid="uid://d1ukste16yq6v" path="res://Assets/Sprites/Particles/player-light.png" id="15_3hahh"] | ||||
| [ext_resource type="Script" path="res://Utils/DamageTime.cs" id="15_4xl06"] | ||||
| [ext_resource type="AudioStream" uid="uid://st8qgqiygy5a" path="res://Assets/Sounds/electricity.wav" id="15_61bua"] | ||||
| [ext_resource type="PackedScene" uid="uid://ce0ph4wk0ylra" path="res://UI/TargetTracer.tscn" id="22_hxi53"] | ||||
|  | @ -36,9 +35,10 @@ | |||
| [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="27_mndpv"] | ||||
| [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="28_6gq8l"] | ||||
| [ext_resource type="Script" path="res://Items/PlayerInventory.cs" id="30_y2wmw"] | ||||
| [ext_resource type="PackedScene" uid="uid://cgg0sfm2qeiwn" path="res://Items/Weapons/Bow.tscn" id="31_mofvy"] | ||||
| [ext_resource type="PackedScene" uid="uid://dvqap2uhcah63" path="res://Items/Weapons/Sword.tscn" id="31_ql4as"] | ||||
| [ext_resource type="PackedScene" uid="uid://5y1acxl4j4n7" path="res://Items/Weapons/Pugio.tscn" id="32_6ffmm"] | ||||
| [ext_resource type="Resource" uid="uid://cl7jvdu2lnv2d" path="res://Items/Weapons/Sword.tres" id="33_3qyfl"] | ||||
| [ext_resource type="Resource" uid="uid://cjsh0dcgbfn77" path="res://Items/Weapons/Bow.tres" id="34_70ron"] | ||||
| [ext_resource type="Resource" uid="uid://iqe6rgnb3jur" path="res://Items/Weapons/Pugio.tres" id="35_4pap1"] | ||||
| [ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="38_6udj8"] | ||||
| 
 | ||||
| [sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"] | ||||
| shader = ExtResource("2_ngsgt") | ||||
|  | @ -836,35 +836,14 @@ horizontal_alignment = 1 | |||
| [node name="Inventory" type="Node2D" parent="." node_paths=PackedStringArray("Hotbar")] | ||||
| y_sort_enabled = true | ||||
| script = ExtResource("30_y2wmw") | ||||
| Hotbar = [NodePath("Sword"), NodePath("Bow"), NodePath("Pugio")] | ||||
| Hotbar = [null, null, null] | ||||
| Items = Array[Object]([ExtResource("33_3qyfl"), ExtResource("34_70ron"), ExtResource("35_4pap1")]) | ||||
| InventoryMap = { | ||||
| "equip_1": 0, | ||||
| "equip_2": 1, | ||||
| "equip_3": 2 | ||||
| } | ||||
| 
 | ||||
| [node name="Bow" parent="Inventory" node_paths=PackedStringArray("StateMachine") instance=ExtResource("31_mofvy")] | ||||
| visible = false | ||||
| StateMachine = NodePath("StateMachine") | ||||
| 
 | ||||
| [node name="Sword" parent="Inventory" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "ParryParticles", "StateMachine", "Anchor", "HandAnchor") instance=ExtResource("31_ql4as")] | ||||
| visible = false | ||||
| Hitbox = NodePath("Hitbox") | ||||
| AnimationPlayer = NodePath("AnimationPlayer") | ||||
| ParryParticles = NodePath("Anchor/Node2D/Sprite2D/ParryParticles") | ||||
| StateMachine = NodePath("State") | ||||
| Anchor = NodePath("Anchor") | ||||
| HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") | ||||
| 
 | ||||
| [node name="Pugio" parent="Inventory" node_paths=PackedStringArray("Hitbox", "AnimationPlayer", "ParryParticles", "StateMachine", "Anchor", "HandAnchor") instance=ExtResource("32_6ffmm")] | ||||
| visible = false | ||||
| Hitbox = NodePath("Hitbox") | ||||
| AnimationPlayer = NodePath("AnimationPlayer") | ||||
| ParryParticles = NodePath("Anchor/Node2D/Sprite2D/ParryParticles") | ||||
| StateMachine = NodePath("State") | ||||
| Anchor = NodePath("Anchor") | ||||
| HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") | ||||
| 
 | ||||
| [node name="Hurtbox" parent="." node_paths=PackedStringArray("InvincibilityTimer") instance=ExtResource("9_avyu4")] | ||||
| visible = false | ||||
| InvincibilityTimer = NodePath("Timer") | ||||
|  | @ -892,12 +871,12 @@ script = ExtResource("13_hs3u1") | |||
| 
 | ||||
| [node name="PointLight2D" type="PointLight2D" parent="."] | ||||
| position = Vector2(0, -4) | ||||
| blend_mode = 2 | ||||
| energy = 0.2 | ||||
| shadow_enabled = true | ||||
| shadow_filter = 2 | ||||
| shadow_filter_smooth = 3.0 | ||||
| texture = ExtResource("15_3hahh") | ||||
| height = 10.0 | ||||
| texture = ExtResource("38_6udj8") | ||||
| texture_scale = 0.5 | ||||
| 
 | ||||
| [node name="DamageTime" type="Node" parent="."] | ||||
| script = ExtResource("15_4xl06") | ||||
|  |  | |||
|  | @ -17,11 +17,9 @@ gradient = SubResource("Gradient_uqfn8") | |||
| [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_yg5po"] | ||||
| particle_flag_disable_z = true | ||||
| direction = Vector3(-1, 0, 0) | ||||
| gravity = Vector3(0, 0, 0) | ||||
| initial_velocity_min = 4.0 | ||||
| initial_velocity_max = 8.0 | ||||
| orbit_velocity_min = 0.0 | ||||
| orbit_velocity_max = 0.0 | ||||
| gravity = Vector3(0, 0, 0) | ||||
| scale_min = 2.0 | ||||
| scale_max = 2.0 | ||||
| color_ramp = SubResource("GradientTexture1D_te0n4") | ||||
|  | @ -41,6 +39,7 @@ texture = ExtResource("1_0im1r") | |||
| centered = false | ||||
| 
 | ||||
| [node name="Hitbox" parent="." instance=ExtResource("3_f4lib")] | ||||
| priority = 5 | ||||
| 
 | ||||
| [node name="CollisionShape2D" parent="Hitbox" index="0"] | ||||
| position = Vector2(0, -0.5) | ||||
|  |  | |||
|  | @ -85,7 +85,7 @@ tracks/2/keys = { | |||
| "times": PackedFloat32Array(0, 0.7), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [0.5, 0.0] | ||||
| "values": [1.0, 0.0] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="AnimationLibrary" id="AnimationLibrary_g3m4l"] | ||||
|  | @ -105,6 +105,7 @@ ProjectileName = "Lightning" | |||
| Hitbox = NodePath("Hitbox") | ||||
| 
 | ||||
| [node name="Sprite2D" type="Sprite2D" parent="."] | ||||
| modulate = Color(4, 4, 4, 1) | ||||
| material = SubResource("CanvasItemMaterial_3bsa7") | ||||
| position = Vector2(0, 8) | ||||
| texture = ExtResource("1_bf8ae") | ||||
|  | @ -119,6 +120,7 @@ libraries = { | |||
| 
 | ||||
| [node name="Hitbox" parent="." instance=ExtResource("3_vlt1v")] | ||||
| collision_layer = 0 | ||||
| priority = 5 | ||||
| Damage = 20.0 | ||||
| 
 | ||||
| [node name="CollisionShape2D" parent="Hitbox" index="0"] | ||||
|  |  | |||
|  | @ -1,59 +1,60 @@ | |||
| [gd_scene load_steps=12 format=3 uid="uid://c1w7t6irnohfx"] | ||||
| [gd_scene load_steps=13 format=3 uid="uid://c1w7t6irnohfx"] | ||||
| 
 | ||||
| [ext_resource type="Texture2D" uid="uid://har1bd5u4dq3" path="res://Assets/Sprites/Misc/torch.png" id="1_14bgb"] | ||||
| [ext_resource type="Texture2D" uid="uid://cyfyelyq3o15s" path="res://Assets/Sprites/Misc/torch-fire.png" id="1_gnoxc"] | ||||
| [ext_resource type="Texture2D" uid="uid://bitpf645g0prl" path="res://Assets/Sprites/Misc/torch-base.png" id="2_cwgtj"] | ||||
| [ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="2_hotvd"] | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_js1l1"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(0, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_vnjya"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(0, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_gdxtl"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(8, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_l2emm"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(8, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_da7fw"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(16, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_03weu"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(16, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_rpccx"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(24, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_1fqw1"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(24, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_crwu1"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(32, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_sj1bi"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(32, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_r3kxc"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(40, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_1xpxx"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(40, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_225la"] | ||||
| atlas = ExtResource("1_14bgb") | ||||
| region = Rect2(48, 0, 8, 12) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_dxfgw"] | ||||
| atlas = ExtResource("1_gnoxc") | ||||
| region = Rect2(48, 0, 8, 8) | ||||
| 
 | ||||
| [sub_resource type="SpriteFrames" id="SpriteFrames_gf7ku"] | ||||
| animations = [{ | ||||
| "frames": [{ | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_js1l1") | ||||
| "texture": SubResource("AtlasTexture_vnjya") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_gdxtl") | ||||
| "texture": SubResource("AtlasTexture_l2emm") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_da7fw") | ||||
| "texture": SubResource("AtlasTexture_03weu") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_rpccx") | ||||
| "texture": SubResource("AtlasTexture_1fqw1") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_crwu1") | ||||
| "texture": SubResource("AtlasTexture_sj1bi") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_r3kxc") | ||||
| "texture": SubResource("AtlasTexture_1xpxx") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_225la") | ||||
| "texture": SubResource("AtlasTexture_dxfgw") | ||||
| }], | ||||
| "loop": true, | ||||
| "name": &"default", | ||||
|  | @ -64,18 +65,25 @@ animations = [{ | |||
| radius = 4.0 | ||||
| 
 | ||||
| [node name="Torch" type="Node2D"] | ||||
| y_sort_enabled = true | ||||
| 
 | ||||
| [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] | ||||
| texture_filter = 1 | ||||
| position = Vector2(0, -10) | ||||
| [node name="Sprites" type="Node2D" parent="."] | ||||
| 
 | ||||
| [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Sprites"] | ||||
| modulate = Color(3.5, 3.5, 3, 1) | ||||
| position = Vector2(0, -14) | ||||
| sprite_frames = SubResource("SpriteFrames_gf7ku") | ||||
| autoplay = "default" | ||||
| frame_progress = 0.337799 | ||||
| 
 | ||||
| [node name="Sprite2D" type="Sprite2D" parent="Sprites"] | ||||
| position = Vector2(0, -8) | ||||
| texture = ExtResource("2_cwgtj") | ||||
| 
 | ||||
| [node name="PointLight2D" type="PointLight2D" parent="."] | ||||
| color = Color(1, 0.976471, 0.92549, 1) | ||||
| color = Color(1, 0.811765, 0.537255, 1) | ||||
| energy = 1.2 | ||||
| blend_mode = 2 | ||||
| shadow_enabled = true | ||||
| shadow_filter_smooth = 3.0 | ||||
| texture = ExtResource("2_hotvd") | ||||
| offset = Vector2(0, 2) | ||||
|  |  | |||
|  | @ -1,94 +1,96 @@ | |||
| [gd_scene load_steps=16 format=3 uid="uid://ceadk7pam7vab"] | ||||
| [gd_scene load_steps=18 format=3 uid="uid://ceadk7pam7vab"] | ||||
| 
 | ||||
| [ext_resource type="Texture2D" uid="uid://cyldr0ck3yfrp" path="res://Assets/Sprites/Misc/torch-lamp.png" id="1_dlkl0"] | ||||
| [ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="2_0xpf8"] | ||||
| [ext_resource type="Texture2D" uid="uid://c1garalf1clsp" path="res://Assets/Sprites/Misc/flame-large.png" id="2_a6lwn"] | ||||
| [ext_resource type="Texture2D" uid="uid://ca0htndnsb38k" path="res://Assets/Sprites/Misc/torch-lamp-base.png" id="2_bq1kw"] | ||||
| [ext_resource type="Texture2D" uid="uid://i5ksh8i0q48o" path="res://Assets/Sprites/Misc/torch-lamp-base-back.png" id="3_vh465"] | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_ikvnd"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(0, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_dtmd3"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(0, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_b7wal"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(12, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_irtpk"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(12, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_68y2k"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(24, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_0gb20"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(24, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_eib4d"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(36, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_5uhdg"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(36, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_7q5cd"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(48, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_e4moo"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(48, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_k8jtr"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(60, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_soja6"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(60, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_egan1"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(72, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_sn741"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(72, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_eymjc"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(84, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_r825r"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(84, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_go3ky"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(96, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_75y5m"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(96, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_rvq52"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(108, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_l8r4c"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(108, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_cjdtb"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(120, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_7gxo8"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(120, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_vi5xh"] | ||||
| atlas = ExtResource("1_dlkl0") | ||||
| region = Rect2(132, 0, 12, 24) | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_60wov"] | ||||
| atlas = ExtResource("2_a6lwn") | ||||
| region = Rect2(132, 0, 12, 14) | ||||
| 
 | ||||
| [sub_resource type="SpriteFrames" id="SpriteFrames_gf7ku"] | ||||
| animations = [{ | ||||
| "frames": [{ | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_ikvnd") | ||||
| "texture": SubResource("AtlasTexture_dtmd3") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_b7wal") | ||||
| "texture": SubResource("AtlasTexture_irtpk") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_68y2k") | ||||
| "texture": SubResource("AtlasTexture_0gb20") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_eib4d") | ||||
| "texture": SubResource("AtlasTexture_5uhdg") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_7q5cd") | ||||
| "texture": SubResource("AtlasTexture_e4moo") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_k8jtr") | ||||
| "texture": SubResource("AtlasTexture_soja6") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_egan1") | ||||
| "texture": SubResource("AtlasTexture_sn741") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_eymjc") | ||||
| "texture": SubResource("AtlasTexture_r825r") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_go3ky") | ||||
| "texture": SubResource("AtlasTexture_75y5m") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_rvq52") | ||||
| "texture": SubResource("AtlasTexture_l8r4c") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_cjdtb") | ||||
| "texture": SubResource("AtlasTexture_7gxo8") | ||||
| }, { | ||||
| "duration": 1.0, | ||||
| "texture": SubResource("AtlasTexture_vi5xh") | ||||
| "texture": SubResource("AtlasTexture_60wov") | ||||
| }], | ||||
| "loop": true, | ||||
| "name": &"default", | ||||
|  | @ -97,15 +99,26 @@ animations = [{ | |||
| 
 | ||||
| [node name="TorchLamp" type="Node2D"] | ||||
| 
 | ||||
| [node name="Sprite2D2" type="Sprite2D" parent="."] | ||||
| texture = ExtResource("3_vh465") | ||||
| centered = false | ||||
| offset = Vector2(-6, -16) | ||||
| 
 | ||||
| [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] | ||||
| modulate = Color(2.5, 2, 2, 1) | ||||
| y_sort_enabled = true | ||||
| texture_filter = 1 | ||||
| position = Vector2(0, -6) | ||||
| sprite_frames = SubResource("SpriteFrames_gf7ku") | ||||
| autoplay = "default" | ||||
| frame = 9 | ||||
| frame_progress = 0.966501 | ||||
| frame_progress = 0.557817 | ||||
| offset = Vector2(0, -12) | ||||
| 
 | ||||
| [node name="Sprite2D" type="Sprite2D" parent="."] | ||||
| texture = ExtResource("2_bq1kw") | ||||
| centered = false | ||||
| offset = Vector2(-6, -16) | ||||
| 
 | ||||
| [node name="PointLight2D" type="PointLight2D" parent="."] | ||||
| color = Color(1, 0.811765, 0.537255, 1) | ||||
| energy = 1.2 | ||||
|  | @ -113,3 +126,13 @@ blend_mode = 2 | |||
| shadow_filter_smooth = 3.0 | ||||
| texture = ExtResource("2_0xpf8") | ||||
| texture_scale = 0.25 | ||||
| 
 | ||||
| [node name="PointLight2D2" type="PointLight2D" parent="."] | ||||
| visible = false | ||||
| color = Color(1, 0.811765, 0.537255, 1) | ||||
| energy = 1.2 | ||||
| blend_mode = 2 | ||||
| range_item_cull_mask = 8 | ||||
| shadow_filter_smooth = 3.0 | ||||
| texture = ExtResource("2_0xpf8") | ||||
| texture_scale = 0.25 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| [gd_scene load_steps=24 format=3 uid="uid://1y5r6sklwgrp"] | ||||
| [gd_scene load_steps=25 format=3 uid="uid://1y5r6sklwgrp"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://Entities/UnwantedFrequency.cs" id="1_6sbe0"] | ||||
| [ext_resource type="PackedScene" uid="uid://du5vhccg75nrq" path="res://BoundingBoxes/Hitbox.tscn" id="2_gxtvd"] | ||||
|  | @ -10,17 +10,20 @@ | |||
| [sub_resource type="RectangleShape2D" id="RectangleShape2D_30y8q"] | ||||
| size = Vector2(8, 8) | ||||
| 
 | ||||
| [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_dhurx"] | ||||
| light_mode = 1 | ||||
| 
 | ||||
| [sub_resource type="Curve" id="Curve_eu273"] | ||||
| _data = [Vector2(0.0618557, 0), 0.0, 0.0, 0, 0, Vector2(0.489691, 1), 0.0, 0.0, 0, 0] | ||||
| point_count = 2 | ||||
| 
 | ||||
| [sub_resource type="Gradient" id="Gradient_dyqhb"] | ||||
| offsets = PackedFloat32Array(0.00662252, 0.715232, 1) | ||||
| colors = PackedColorArray(0.996078, 0, 0.164706, 0, 0.996045, 0, 0.166638, 1, 1, 1, 1, 1) | ||||
| colors = PackedColorArray(0.996078, 0, 0.164706, 0, 1.992, 0, 0.334, 1, 2, 2, 2, 1) | ||||
| 
 | ||||
| [sub_resource type="Gradient" id="Gradient_m1y6u"] | ||||
| offsets = PackedFloat32Array(0.00662252, 0.715232, 1) | ||||
| colors = PackedColorArray(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1) | ||||
| colors = PackedColorArray(0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 1) | ||||
| 
 | ||||
| [sub_resource type="Gradient" id="Gradient_2q0ut"] | ||||
| offsets = PackedFloat32Array(0.525926, 0.740741, 1) | ||||
|  | @ -132,11 +135,14 @@ Knockback = 324.0 | |||
| shape = SubResource("RectangleShape2D_30y8q") | ||||
| 
 | ||||
| [node name="TrailRotation" type="Node2D" parent="."] | ||||
| material = SubResource("CanvasItemMaterial_dhurx") | ||||
| 
 | ||||
| [node name="TrailPosition" type="Node2D" parent="TrailRotation"] | ||||
| use_parent_material = true | ||||
| 
 | ||||
| [node name="Trail" parent="TrailRotation/TrailPosition" instance=ExtResource("3_67uhs")] | ||||
| self_modulate = Color(2, 2, 2, 1) | ||||
| use_parent_material = true | ||||
| width = 2.0 | ||||
| width_curve = SubResource("Curve_eu273") | ||||
| default_color = Color(1, 0.0862745, 0.207843, 1) | ||||
|  | @ -148,9 +154,11 @@ MaximumPoints = 64 | |||
| Frequency = 30 | ||||
| 
 | ||||
| [node name="TrailPosition2" type="Node2D" parent="TrailRotation"] | ||||
| use_parent_material = true | ||||
| 
 | ||||
| [node name="Trail" parent="TrailRotation/TrailPosition2" instance=ExtResource("3_67uhs")] | ||||
| self_modulate = Color(2, 2, 2, 1) | ||||
| use_parent_material = true | ||||
| width = 2.0 | ||||
| width_curve = SubResource("Curve_eu273") | ||||
| gradient = SubResource("Gradient_m1y6u") | ||||
|  |  | |||
|  | @ -36,6 +36,9 @@ public partial class EventBus : Node | |||
|     [Signal] | ||||
|     public delegate void PlayerStunEventHandler(); | ||||
| 
 | ||||
|     [Signal] | ||||
|     public delegate void PlayerOpenInventoryEventHandler(Items.Inventory inventory); | ||||
| 
 | ||||
|     [Signal] | ||||
|     public delegate void RegisteredBossEventHandler(Characters.Boss boss); | ||||
| 
 | ||||
|  |  | |||
|  | @ -69,6 +69,7 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata> | |||
|             // instantiating a new array will prevent characters from | ||||
|             // sharing inventories | ||||
|             Hotbar = new(); | ||||
|             Hotbar.Resize(HotbarCapacity); | ||||
|         } | ||||
| 
 | ||||
|         if (Items is null) | ||||
|  | @ -154,6 +155,35 @@ public partial class Inventory : Node2D, IItemCollection<ItemMetadata> | |||
|         return item; | ||||
|     } | ||||
| 
 | ||||
|     public Item SetHotbarIndexToItem(int index, ItemMetadata metadata) | ||||
|     { | ||||
|         var oldItem = Hotbar[index]; | ||||
|         Item newItem = null; | ||||
| 
 | ||||
|         if (IsInstanceValid(oldItem)) | ||||
|         { | ||||
|             oldItem?.QueueFree(); | ||||
|         } | ||||
| 
 | ||||
|         if (metadata is not null) | ||||
|         { | ||||
|             newItem = metadata.Instance.Instantiate<Item>(); | ||||
|             AddChild(newItem); | ||||
|             Hotbar[index] = newItem; | ||||
|         } | ||||
| 
 | ||||
|         if (SelectedIndex == index) | ||||
|         { | ||||
|             // equip item if the hotbar index we are setting is selected | ||||
|             EquipIndex(index); | ||||
|         } | ||||
| 
 | ||||
|         var bus = Events.EventBus.Instance; | ||||
|         bus.EmitSignal(Events.EventBus.SignalName.PlayerInventoryUpdate, this); | ||||
| 
 | ||||
|         return newItem; | ||||
|     } | ||||
| 
 | ||||
|     public Item AddItem(Item item) | ||||
|     { | ||||
|         if (Hotbar.Count >= HotbarCapacity) | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| using Godot; | ||||
| using SupaLidlGame.Extensions; | ||||
| 
 | ||||
| namespace SupaLidlGame.Items.Weapons; | ||||
| 
 | ||||
|  | @ -15,7 +16,14 @@ public partial class Bow : ProjectileSpawner | |||
| 
 | ||||
|         if (_isOnFire) | ||||
|         { | ||||
|             GetNode<AnimatedSprite2D>("%Flame").Visible = false; | ||||
|             var flame = GetNode<AnimatedSprite2D>("%Flame"); | ||||
| 
 | ||||
|             var newFlame = flame.Duplicate() as Node2D; | ||||
|             projectile.AddChild(newFlame); | ||||
| 
 | ||||
|             newFlame.Position = Vector2.Zero; | ||||
| 
 | ||||
|             flame.Visible = false; | ||||
|             // TODO: instead of doing 1.5x damage, create an "On Fire" debuff | ||||
|             projectile.Hitbox.Damage *= 1.5f; | ||||
|             _isOnFire = false; | ||||
|  | @ -30,8 +38,15 @@ public partial class Bow : ProjectileSpawner | |||
|         _ignitionArea = GetNode<Area2D>("IgnitionArea"); | ||||
|         var onAreaEntered = (Area2D area) => | ||||
|         { | ||||
|             GetNode<AnimatedSprite2D>("%Flame").Visible = true; | ||||
|             _isOnFire = true; | ||||
|             if (!_isOnFire) | ||||
|             { | ||||
|                 var flame = GetNode<AnimatedSprite2D>("%Flame"); | ||||
|                 flame.Visible = true; | ||||
|                 flame.GetNode<AudioStreamPlayer2D>("Ignite") | ||||
|                     .OnWorld() | ||||
|                     .PlayOneShot(); | ||||
|                 _isOnFire = true; | ||||
|             } | ||||
|         }; | ||||
|         _ignitionArea.Connect( | ||||
|             Area2D.SignalName.AreaEntered, | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| [gd_scene load_steps=28 format=3 uid="uid://cgg0sfm2qeiwn"] | ||||
| [gd_scene load_steps=29 format=3 uid="uid://cgg0sfm2qeiwn"] | ||||
| 
 | ||||
| [ext_resource type="Texture2D" uid="uid://dam6aigkw8xs" path="res://Assets/Sprites/Items/bow-and-arrow.png" id="1_1ghvv"] | ||||
| [ext_resource type="Script" path="res://Items/Weapons/Bow.cs" id="1_ikgu2"] | ||||
|  | @ -12,6 +12,7 @@ | |||
| [ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="9_tk6lc"] | ||||
| [ext_resource type="AudioStream" uid="uid://cwy4giq8eod5g" path="res://Assets/Sounds/bow-release.wav" id="9_v051g"] | ||||
| [ext_resource type="Texture2D" uid="uid://dj1vsctgh1scr" path="res://Assets/Sprites/Misc/flame.png" id="9_xwcvy"] | ||||
| [ext_resource type="AudioStream" uid="uid://braj74by0oowo" path="res://Assets/Sounds/fire-burst-flash.wav" id="11_65ega"] | ||||
| 
 | ||||
| [sub_resource type="AtlasTexture" id="AtlasTexture_5af70"] | ||||
| atlas = ExtResource("9_xwcvy") | ||||
|  | @ -94,7 +95,7 @@ tracks/1/keys = { | |||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [Vector2(15, -8)] | ||||
| "values": [Vector2(15, -4)] | ||||
| } | ||||
| tracks/2/type = "value" | ||||
| tracks/2/imported = false | ||||
|  | @ -165,7 +166,7 @@ tracks/2/keys = { | |||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [Vector2(15, -8)] | ||||
| "values": [Vector2(15, -4)] | ||||
| } | ||||
| tracks/3/type = "value" | ||||
| tracks/3/imported = false | ||||
|  | @ -220,7 +221,7 @@ tracks/2/keys = { | |||
| "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), | ||||
| "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), | ||||
| "update": 1, | ||||
| "values": [Vector2(15, -8), Vector2(14, -8), Vector2(13, -8), Vector2(12, -8), Vector2(11, -8), Vector2(9, -8)] | ||||
| "values": [Vector2(15, -4), Vector2(14, -4), Vector2(13, -4), Vector2(12, -4), Vector2(11, -4), Vector2(9, -4)] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_j5qtq"] | ||||
|  | @ -262,7 +263,7 @@ tracks/2/keys = { | |||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [Vector2(15, -8)] | ||||
| "values": [Vector2(15, -4)] | ||||
| } | ||||
| tracks/3/type = "value" | ||||
| tracks/3/imported = false | ||||
|  | @ -370,15 +371,22 @@ hframes = 8 | |||
| [node name="Flame" type="AnimatedSprite2D" parent="Anchor"] | ||||
| unique_name_in_owner = true | ||||
| visible = false | ||||
| position = Vector2(15, -8) | ||||
| modulate = Color(3, 3, 3, 1) | ||||
| position = Vector2(15, -4) | ||||
| sprite_frames = SubResource("SpriteFrames_b2khh") | ||||
| autoplay = "default" | ||||
| frame_progress = 0.1652 | ||||
| offset = Vector2(0, -4) | ||||
| 
 | ||||
| [node name="PointLight2D" type="PointLight2D" parent="Anchor/Flame"] | ||||
| color = Color(1, 0.8, 0.701961, 1) | ||||
| energy = 0.5 | ||||
| texture = ExtResource("9_tk6lc") | ||||
| texture_scale = 0.13 | ||||
| 
 | ||||
| [node name="Ignite" type="AudioStreamPlayer2D" parent="Anchor/Flame"] | ||||
| stream = ExtResource("11_65ega") | ||||
| 
 | ||||
| [node name="AnimationPlayer" type="AnimationPlayer" parent="."] | ||||
| libraries = { | ||||
| "": SubResource("AnimationLibrary_5vx8d") | ||||
|  |  | |||
|  | @ -206,6 +206,11 @@ public partial class Sword : Weapon, IParryable | |||
|                     this); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (Hitbox.Hits.Count > 0) | ||||
|         { | ||||
|             Character.ApplyImpulse(-Character.Target.Normalized() * Knockback); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void AttemptParry(Weapon otherWeapon) | ||||
|  |  | |||
|  | @ -103,6 +103,18 @@ tracks/5/keys = { | |||
| "update": 1, | ||||
| "values": [true] | ||||
| } | ||||
| tracks/6/type = "value" | ||||
| tracks/6/imported = false | ||||
| tracks/6/enabled = true | ||||
| tracks/6/path = NodePath("SwingSprite:position") | ||||
| tracks/6/interp = 1 | ||||
| tracks/6/loop_wrap = true | ||||
| tracks/6/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [Vector2(0, 0)] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_ameas"] | ||||
| resource_name = "anticipate" | ||||
|  | @ -173,7 +185,7 @@ tracks/0/path = NodePath("Anchor:rotation") | |||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0, 0.15, 0.35), | ||||
| "times": PackedFloat32Array(0, 0.1, 0.35), | ||||
| "transitions": PackedFloat32Array(1, 1, 1), | ||||
| "update": 1, | ||||
| "values": [-1.5708, 1.5708, 1.5708] | ||||
|  | @ -209,10 +221,10 @@ tracks/3/path = NodePath("Anchor/Node2D:rotation") | |||
| tracks/3/interp = 1 | ||||
| tracks/3/loop_wrap = true | ||||
| tracks/3/keys = { | ||||
| "times": PackedFloat32Array(0, 0.15), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "times": PackedFloat32Array(0.1), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 1, | ||||
| "values": [0.0, 2.35619] | ||||
| "values": [2.35619] | ||||
| } | ||||
| tracks/4/type = "method" | ||||
| tracks/4/imported = false | ||||
|  | @ -235,10 +247,34 @@ tracks/5/path = NodePath("Anchor/Node2D/Sprite2D:visible") | |||
| tracks/5/interp = 1 | ||||
| tracks/5/loop_wrap = true | ||||
| tracks/5/keys = { | ||||
| "times": PackedFloat32Array(0, 0.35), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "times": PackedFloat32Array(0, 0.1, 0.35), | ||||
| "transitions": PackedFloat32Array(1, 1, 1), | ||||
| "update": 1, | ||||
| "values": [true, false] | ||||
| "values": [false, true, false] | ||||
| } | ||||
| tracks/6/type = "value" | ||||
| tracks/6/imported = false | ||||
| tracks/6/enabled = true | ||||
| tracks/6/path = NodePath("SwingSprite:modulate") | ||||
| tracks/6/interp = 1 | ||||
| tracks/6/loop_wrap = true | ||||
| tracks/6/keys = { | ||||
| "times": PackedFloat32Array(0, 0.2, 0.35), | ||||
| "transitions": PackedFloat32Array(1, 1, 1), | ||||
| "update": 0, | ||||
| "values": [Color(2, 2, 2, 1), Color(2, 2, 2, 1), Color(2, 2, 2, 0)] | ||||
| } | ||||
| tracks/7/type = "value" | ||||
| tracks/7/imported = false | ||||
| tracks/7/enabled = true | ||||
| tracks/7/path = NodePath("SwingSprite:position") | ||||
| tracks/7/interp = 1 | ||||
| tracks/7/loop_wrap = true | ||||
| tracks/7/keys = { | ||||
| "times": PackedFloat32Array(0, 0.2, 0.35), | ||||
| "transitions": PackedFloat32Array(1, 1, 1), | ||||
| "update": 0, | ||||
| "values": [Vector2(0, 0), Vector2(0, 0), Vector2(2, 0)] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_pclfs"] | ||||
|  |  | |||
|  | @ -111,6 +111,7 @@ offset_bottom = -8.0 | |||
| text = "Activate" | ||||
| 
 | ||||
| [node name="Sprite2D" type="Sprite2D" parent="."] | ||||
| position = Vector2(0, -4) | ||||
| texture = ExtResource("3_pgkt4") | ||||
| centered = false | ||||
| offset = Vector2(-2, -8) | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ physics_layer_1/collision_mask = 0 | |||
| [sub_resource type="Environment" id="Environment_pxx66"] | ||||
| background_mode = 3 | ||||
| glow_enabled = true | ||||
| glow_hdr_threshold = 1.4 | ||||
| glow_hdr_threshold = 1.2 | ||||
| 
 | ||||
| [node name="TileMap" type="Node2D" node_paths=PackedStringArray("Entities", "Areas", "Spawners", "Markers")] | ||||
| process_mode = 1 | ||||
|  |  | |||
|  | @ -525,11 +525,11 @@ texture = ExtResource("4_n70qi") | |||
| 10:2/0 = 0 | ||||
| 11:2/0 = 0 | ||||
| 0:3/0 = 0 | ||||
| 0:3/0/y_sort_origin = 8 | ||||
| 0:3/0/y_sort_origin = 12 | ||||
| 1:3/0 = 0 | ||||
| 1:3/0/y_sort_origin = 8 | ||||
| 1:3/0/y_sort_origin = 12 | ||||
| 2:3/0 = 0 | ||||
| 2:3/0/y_sort_origin = 8 | ||||
| 2:3/0/y_sort_origin = 12 | ||||
| 3:3/0 = 0 | ||||
| 3:3/0/y_sort_origin = 8 | ||||
| 3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
|  | @ -544,10 +544,10 @@ texture = ExtResource("4_n70qi") | |||
| 2:4/0/y_sort_origin = 8 | ||||
| 2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 3:4/0 = 0 | ||||
| 3:4/0/y_sort_origin = 8 | ||||
| 3:4/0/y_sort_origin = 12 | ||||
| 3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 4:4/0 = 0 | ||||
| 4:4/0/y_sort_origin = 8 | ||||
| 4:4/0/y_sort_origin = 12 | ||||
| 4:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 5:4/0 = 0 | ||||
| 5:4/0/y_sort_origin = 8 | ||||
|  | @ -555,7 +555,6 @@ texture = ExtResource("4_n70qi") | |||
| 6:4/0 = 0 | ||||
| 6:4/0/y_sort_origin = 8 | ||||
| 6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 9:4/0 = 0 | ||||
| 0:5/0 = 0 | ||||
| 0:5/0/y_sort_origin = 8 | ||||
| 0:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
|  | @ -568,9 +567,9 @@ texture = ExtResource("4_n70qi") | |||
| 3:5/0 = 0 | ||||
| 4:5/0 = 0 | ||||
| 5:3/0 = 0 | ||||
| 5:3/0/y_sort_origin = 8 | ||||
| 5:3/0/y_sort_origin = 12 | ||||
| 6:3/0 = 0 | ||||
| 6:3/0/y_sort_origin = 8 | ||||
| 6:3/0/y_sort_origin = 12 | ||||
| 0:6/0 = 0 | ||||
| 0:7/0 = 0 | ||||
| 1:7/0 = 0 | ||||
|  | @ -591,7 +590,9 @@ texture = ExtResource("4_n70qi") | |||
| 12:4/0/texture_origin = Vector2i(0, 16) | ||||
| 12:4/0/y_sort_origin = -2 | ||||
| 10:3/0 = 0 | ||||
| 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 11:3/0 = 0 | ||||
| 11:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 12:2/0 = 0 | ||||
| 12:3/0 = 0 | ||||
| 13:3/0 = 0 | ||||
|  | @ -599,6 +600,30 @@ texture = ExtResource("4_n70qi") | |||
| 12:1/0 = 0 | ||||
| 13:1/0 = 0 | ||||
| 14:2/0 = 0 | ||||
| 8:5/0 = 0 | ||||
| 7:5/0 = 0 | ||||
| 9:4/size_in_atlas = Vector2i(1, 2) | ||||
| 9:4/0 = 0 | ||||
| 9:4/0/texture_origin = Vector2i(0, -8) | ||||
| 10:4/size_in_atlas = Vector2i(1, 2) | ||||
| 10:4/0 = 0 | ||||
| 10:4/0/texture_origin = Vector2i(0, -8) | ||||
| 8:4/0 = 0 | ||||
| 11:4/0 = 0 | ||||
| 14:4/size_in_atlas = Vector2i(1, 3) | ||||
| 14:4/0 = 0 | ||||
| 14:4/0/texture_origin = Vector2i(0, 16) | ||||
| 14:4/0/y_sort_origin = 8 | ||||
| 14:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 3:6/0 = 0 | ||||
| 3:7/0 = 0 | ||||
| 4:6/0 = 0 | ||||
| 7:4/0 = 0 | ||||
| 15:4/size_in_atlas = Vector2i(1, 3) | ||||
| 15:4/0 = 0 | ||||
| 15:4/0/texture_origin = Vector2i(0, 16) | ||||
| 15:4/0/y_sort_origin = 8 | ||||
| 15:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) | ||||
| 
 | ||||
| [resource] | ||||
| occlusion_layer_0/light_mask = 1 | ||||
|  |  | |||
|  | @ -23,17 +23,14 @@ public abstract partial class PlayerState : CharacterState | |||
|         { | ||||
|             if (@event.IsActionPressed("equip_1")) | ||||
|             { | ||||
|                 //inventory.SelectedItem = inventory.GetItemByMap("equip_1"); | ||||
|                 inventory.SelectedIndex = 0; | ||||
|             } | ||||
|             else if (@event.IsActionPressed("equip_2")) | ||||
|             { | ||||
|                 //inventory.SelectedItem = inventory.GetItemByMap("equip_2"); | ||||
|                 inventory.SelectedIndex = 1; | ||||
|             } | ||||
|             else if (@event.IsActionPressed("equip_3")) | ||||
|             { | ||||
|                 //inventory.SelectedItem = inventory.GetItemByMap("equip_3"); | ||||
|                 inventory.SelectedIndex = 2; | ||||
|             } | ||||
|             else if (@event.IsActionPressed("next_item")) | ||||
|  | @ -58,6 +55,13 @@ public abstract partial class PlayerState : CharacterState | |||
|                     return MaxLevelState; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (@event.IsActionPressed("inventory")) | ||||
|             { | ||||
|                 var bus = Events.EventBus.Instance; | ||||
|                 bus.EmitSignal(Events.EventBus.SignalName.PlayerOpenInventory, | ||||
|                     player.Inventory); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return base.UnhandledInput(@event); | ||||
|  |  | |||
|  | @ -15,24 +15,39 @@ public partial class DocExitState : NPCState | |||
| 
 | ||||
|     private double _currentDuration = 0; | ||||
| 
 | ||||
|     private bool _hasPlayedExitAnim = false; | ||||
| 
 | ||||
|     private bool _previouslyCouldAttack = false; | ||||
| 
 | ||||
|     public override NPCState Enter(IState<NPCState> previousState) | ||||
|     { | ||||
|         _currentDuration = Duration; | ||||
|         TelegraphAnimationPlayer.Play("exit_out"); | ||||
|         NPC.ShouldMove = false; | ||||
|         _hasPlayedExitAnim = false; | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public override void Exit(IState<NPCState> nextState) | ||||
|     { | ||||
| 
 | ||||
|         NPC.CanAttack = _previouslyCouldAttack; | ||||
|     } | ||||
| 
 | ||||
|     public override NPCState Process(double delta) | ||||
|     { | ||||
|         if ((_currentDuration -= delta) <= 0) | ||||
|         if (!NPC.Inventory.IsUsingItem) | ||||
|         { | ||||
|             return TelegraphState; | ||||
|             if (!_hasPlayedExitAnim) | ||||
|             { | ||||
|                 _hasPlayedExitAnim = true; | ||||
|                 _previouslyCouldAttack = NPC.CanAttack; | ||||
|                 NPC.CanAttack = false; | ||||
|                 TelegraphAnimationPlayer.Play("exit_out"); | ||||
|             } | ||||
| 
 | ||||
|             if ((_currentDuration -= delta) <= 0) | ||||
|             { | ||||
|                 return TelegraphState; | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  |  | |||
|  | @ -33,8 +33,19 @@ public partial class DocTelegraphState : NPCState | |||
| 
 | ||||
|         do | ||||
|         { | ||||
|             float randX = GD.RandRange(-112, 112); | ||||
|             float randY = GD.RandRange(-112, 112); | ||||
|             float randX = GD.RandRange(32, 112); | ||||
|             float randY = GD.RandRange(32, 112); | ||||
| 
 | ||||
|             if (GD.Randi() % 2 == 0) | ||||
|             { | ||||
|                 randX = -randX; | ||||
|             } | ||||
| 
 | ||||
|             if (GD.Randi() % 2 == 0) | ||||
|             { | ||||
|                 randY = -randY; | ||||
|             } | ||||
| 
 | ||||
|             randVec = new Vector2(randX, randY); | ||||
|         } | ||||
|         while (randVec.DistanceSquaredTo(player.GlobalPosition) < 9216); | ||||
|  |  | |||
|  | @ -8,6 +8,9 @@ public partial class RangedIdleState : WeaponState | |||
|     [Export] | ||||
|     public WeaponState FireState { get; set; } | ||||
| 
 | ||||
|     [Export] | ||||
|     public WeaponState AltFireState { get; set; } | ||||
| 
 | ||||
|     [Export] | ||||
|     public Items.Weapons.Ranged Weapon { get; set; } | ||||
| 
 | ||||
|  | @ -30,6 +33,12 @@ public partial class RangedIdleState : WeaponState | |||
|         return FireState; | ||||
|     } | ||||
| 
 | ||||
|     public override WeaponState UseAlt() | ||||
|     { | ||||
|         GD.Print("Alt fire"); | ||||
|         return AltFireState; | ||||
|     } | ||||
| 
 | ||||
|     public override void Exit(IState<WeaponState> nextState) | ||||
|     { | ||||
|         Weapon.Visible = true; | ||||
|  |  | |||
								
									
									
										
											27
										
									
									UI/Base.tscn
									
									
									
									
								
								
							
							|  | @ -1,4 +1,4 @@ | |||
| [gd_scene load_steps=14 format=3 uid="uid://c271rdjhd1gfo"] | ||||
| [gd_scene load_steps=15 format=3 uid="uid://c271rdjhd1gfo"] | ||||
| 
 | ||||
| [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"] | ||||
|  | @ -9,6 +9,7 @@ | |||
| [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://bg51duwdtyl8w" path="res://UI/Inventory/InventoryMenu.tscn" id="10_5m8qa"] | ||||
| [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="Texture2D" uid="uid://bw052v8ikfget" path="res://icon.svg" id="12_tyv35"] | ||||
|  | @ -22,11 +23,17 @@ process_mode = 3 | |||
| 
 | ||||
| [node name="PostProcessing" type="CanvasLayer" parent="."] | ||||
| 
 | ||||
| [node name="Vignette" parent="PostProcessing" instance=ExtResource("9_p1ubd")] | ||||
| [node name="CanvasLayer" type="CanvasLayer" parent="PostProcessing"] | ||||
| 
 | ||||
| [node name="StunEffect" parent="PostProcessing" instance=ExtResource("10_646ma")] | ||||
| [node name="Vignette" parent="PostProcessing/CanvasLayer" instance=ExtResource("9_p1ubd")] | ||||
| 
 | ||||
| [node name="Sprite2D" type="TextureRect" parent="PostProcessing"] | ||||
| [node name="CanvasLayer2" type="CanvasLayer" parent="PostProcessing"] | ||||
| 
 | ||||
| [node name="StunEffect" parent="PostProcessing/CanvasLayer2" instance=ExtResource("10_646ma")] | ||||
| 
 | ||||
| [node name="CanvasLayer3" type="CanvasLayer" parent="PostProcessing"] | ||||
| 
 | ||||
| [node name="Sprite2D" type="TextureRect" parent="PostProcessing/CanvasLayer3"] | ||||
| visible = false | ||||
| material = SubResource("ShaderMaterial_kbd61") | ||||
| anchors_preset = 3 | ||||
|  | @ -53,6 +60,7 @@ stretch_shrink = 3 | |||
| disable_3d = true | ||||
| transparent_bg = true | ||||
| handle_input_locally = false | ||||
| snap_2d_transforms_to_pixel = true | ||||
| size = Vector2i(640, 360) | ||||
| render_target_update_mode = 4 | ||||
| 
 | ||||
|  | @ -105,9 +113,8 @@ layout_mode = 2 | |||
| theme_override_constants/margin_top = 16 | ||||
| theme_override_constants/margin_right = 16 | ||||
| 
 | ||||
| [node name="Hotbar" parent="SubViewportContainer/UIViewport/MainUILayer/Main/Top/Right" node_paths=PackedStringArray("_slots") instance=ExtResource("5_mmp18")] | ||||
| [node name="Hotbar" parent="SubViewportContainer/UIViewport/MainUILayer/Main/Top/Right" instance=ExtResource("5_mmp18")] | ||||
| layout_mode = 2 | ||||
| _slots = [NodePath("InventorySlot"), NodePath("InventorySlot2"), NodePath("InventorySlot3")] | ||||
| 
 | ||||
| [node name="BoxContainer" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"] | ||||
| layout_mode = 1 | ||||
|  | @ -120,11 +127,15 @@ grow_horizontal = 0 | |||
| grow_vertical = 2 | ||||
| alignment = 2 | ||||
| 
 | ||||
| [node name="ShopMenu" parent="SubViewportContainer/UIViewport/MainUILayer/Main/BoxContainer" node_paths=PackedStringArray("_inventoryGrid") instance=ExtResource("8_ep3ae")] | ||||
| [node name="ShopMenu" parent="SubViewportContainer/UIViewport/MainUILayer/Main/BoxContainer" instance=ExtResource("8_ep3ae")] | ||||
| unique_name_in_owner = true | ||||
| visible = false | ||||
| layout_mode = 2 | ||||
| 
 | ||||
| [node name="InventoryMenu" parent="SubViewportContainer/UIViewport/MainUILayer/Main/BoxContainer" instance=ExtResource("10_5m8qa")] | ||||
| unique_name_in_owner = true | ||||
| visible = false | ||||
| layout_mode = 2 | ||||
| _inventoryGrid = NodePath("PanelContainer/VBoxContainer/ScrollContainer/InventoryGrid") | ||||
| 
 | ||||
| [node name="Bottom" type="HBoxContainer" parent="SubViewportContainer/UIViewport/MainUILayer/Main"] | ||||
| layout_mode = 1 | ||||
|  |  | |||
|  | @ -0,0 +1,74 @@ | |||
| using Godot; | ||||
| 
 | ||||
| namespace SupaLidlGame.UI.Inventory; | ||||
| 
 | ||||
| public abstract partial class BaseMenu : Control, IModal | ||||
| { | ||||
|     [Export] | ||||
|     protected InventoryGrid _inventoryGrid; | ||||
| 
 | ||||
|     protected Button _focusButtonOnSelect { get; set; } | ||||
| 
 | ||||
|     protected InventorySlot _selected; | ||||
| 
 | ||||
|     public abstract void ShowModal(); | ||||
| 
 | ||||
|     public abstract void HideModal(); | ||||
| 
 | ||||
|     public bool IsPlayingAnimation => GetNode<AnimationPlayer>("%AnimationPlayer").IsPlaying(); | ||||
| 
 | ||||
|     public async void Close() | ||||
|     { | ||||
|         var animPlayer = GetNode<AnimationPlayer>("%AnimationPlayer"); | ||||
|         animPlayer.Play("close"); | ||||
|         await ToSignal(animPlayer, AnimationPlayer.SignalName.AnimationFinished); | ||||
|         HideModal(); | ||||
|     } | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         var onSlotFocused = (InventorySlot slot) => | ||||
|         { | ||||
|             if (slot.Item is not null) | ||||
|             { | ||||
|                 SetTooltipItem(slot); | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         var onSlotUnfocused = (InventorySlot slot) => | ||||
|         { | ||||
|             SetTooltipItem(_selected); | ||||
|         }; | ||||
| 
 | ||||
|         var onSlotSelected = (InventorySlot slot) => | ||||
|         { | ||||
|             _selected = slot; | ||||
|             SetTooltipItem(slot); | ||||
|             //GetNode<ItemTooltip>("%ActionButton").GrabFocus(); | ||||
|             _focusButtonOnSelect.GrabFocus(); | ||||
|         }; | ||||
| 
 | ||||
|         _inventoryGrid.Connect(InventoryGrid.SignalName.SlotFocused, | ||||
|             Callable.From(onSlotFocused)); | ||||
|         _inventoryGrid.Connect(InventoryGrid.SignalName.SlotUnfocused, | ||||
|             Callable.From(onSlotUnfocused)); | ||||
|         _inventoryGrid.Connect(InventoryGrid.SignalName.SlotSelected, | ||||
|             Callable.From(onSlotSelected)); | ||||
|     } | ||||
| 
 | ||||
|     protected virtual void SetTooltipItem(InventorySlot slot) | ||||
|     { | ||||
|         GetNode<ItemTooltip>("%ItemTooltip").Item = slot?.Item; | ||||
|     } | ||||
| 
 | ||||
|     public abstract void OnButtonPress(Button button); | ||||
| 
 | ||||
|     public override void _UnhandledInput(InputEvent @event) | ||||
|     { | ||||
|         if (@event.IsActionPressed("ui_cancel")) | ||||
|         { | ||||
|             AcceptEvent(); | ||||
|             Close(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,206 @@ | |||
| [gd_scene load_steps=13 format=3 uid="uid://7blvai53i2a0"] | ||||
| 
 | ||||
| [ext_resource type="Shader" path="res://Shaders/WipeXY.gdshader" id="2_y0ues"] | ||||
| [ext_resource type="StyleBox" path="res://UI/Themes/Panel.tres" id="3_6elnp"] | ||||
| [ext_resource type="FontFile" uid="uid://cgwa8bjiyv534" path="res://Assets/Fonts/alagard.ttf" id="4_68gcu"] | ||||
| [ext_resource type="PackedScene" uid="uid://chmokkxsy5vas" path="res://UI/Inventory/InventoryGrid.tscn" id="5_u7ajr"] | ||||
| [ext_resource type="PackedScene" uid="uid://baawkwo8aiwbu" path="res://UI/Inventory/ShopSlot.tscn" id="6_onxvb"] | ||||
| [ext_resource type="PackedScene" uid="uid://bsheehtfcdwhh" path="res://UI/Inventory/ItemTooltip.tscn" id="7_nphc3"] | ||||
| 
 | ||||
| [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 | ||||
| 
 | ||||
| [sub_resource type="ShaderMaterial" id="ShaderMaterial_2hdh3"] | ||||
| shader = ExtResource("2_y0ues") | ||||
| shader_parameter/x_amount = 1.0 | ||||
| shader_parameter/y_amount = 0.5 | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_yj24f"] | ||||
| length = 0.001 | ||||
| tracks/0/type = "value" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:modulate") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [Color(1, 1, 1, 1)] | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath("PanelContainer:material:shader_parameter/y_amount") | ||||
| tracks/1/interp = 1 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [0.5] | ||||
| } | ||||
| tracks/2/type = "value" | ||||
| tracks/2/imported = false | ||||
| tracks/2/enabled = true | ||||
| tracks/2/path = NodePath("PanelContainer:material:shader_parameter/x_amount") | ||||
| tracks/2/interp = 1 | ||||
| tracks/2/loop_wrap = true | ||||
| tracks/2/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [1.0] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_tm2as"] | ||||
| resource_name = "close" | ||||
| length = 0.5 | ||||
| step = 0.05 | ||||
| tracks/0/type = "value" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:modulate") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0, 0.4), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath("PanelContainer:material:shader_parameter/y_amount") | ||||
| tracks/1/interp = 1 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(0, 0.1), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [0.5, 1.0] | ||||
| } | ||||
| tracks/2/type = "value" | ||||
| tracks/2/imported = false | ||||
| tracks/2/enabled = true | ||||
| tracks/2/path = NodePath("PanelContainer:material:shader_parameter/x_amount") | ||||
| tracks/2/interp = 1 | ||||
| tracks/2/loop_wrap = true | ||||
| tracks/2/keys = { | ||||
| "times": PackedFloat32Array(0.05, 0.15), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [1.0, 0.5] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_fgj27"] | ||||
| resource_name = "open" | ||||
| length = 0.5 | ||||
| tracks/0/type = "value" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:modulate") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0, 0.3), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)] | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath("PanelContainer:material:shader_parameter/y_amount") | ||||
| tracks/1/interp = 1 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(0, 0.5), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [1.0, 0.5] | ||||
| } | ||||
| tracks/2/type = "value" | ||||
| tracks/2/imported = false | ||||
| tracks/2/enabled = true | ||||
| tracks/2/path = NodePath("PanelContainer:material:shader_parameter/x_amount") | ||||
| tracks/2/interp = 1 | ||||
| tracks/2/loop_wrap = true | ||||
| tracks/2/keys = { | ||||
| "times": PackedFloat32Array(0, 0.3), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [0.5, 1.0] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="AnimationLibrary" id="AnimationLibrary_0glcp"] | ||||
| _data = { | ||||
| "RESET": SubResource("Animation_yj24f"), | ||||
| "close": SubResource("Animation_tm2as"), | ||||
| "open": SubResource("Animation_fgj27") | ||||
| } | ||||
| 
 | ||||
| [node name="Panel" type="PanelContainer"] | ||||
| 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") | ||||
| 
 | ||||
| [node name="PanelContainer" type="PanelContainer" parent="."] | ||||
| material = SubResource("ShaderMaterial_2hdh3") | ||||
| layout_mode = 2 | ||||
| theme_override_styles/panel = ExtResource("3_6elnp") | ||||
| 
 | ||||
| [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("4_68gcu") | ||||
| 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("5_u7ajr")] | ||||
| layout_mode = 2 | ||||
| size_flags_vertical = 3 | ||||
| _slotScene = ExtResource("6_onxvb") | ||||
| 
 | ||||
| [node name="ItemTooltip" parent="PanelContainer/VBoxContainer" instance=ExtResource("7_nphc3")] | ||||
| unique_name_in_owner = true | ||||
| layout_mode = 2 | ||||
| 
 | ||||
| [node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] | ||||
| layout_mode = 2 | ||||
| 
 | ||||
| [node name="AnimationPlayer" type="AnimationPlayer" parent="."] | ||||
| unique_name_in_owner = true | ||||
| libraries = { | ||||
| "": SubResource("AnimationLibrary_0glcp") | ||||
| } | ||||
|  | @ -1,10 +1,8 @@ | |||
| [gd_scene load_steps=4 format=3 uid="uid://sfs8dpfitpdu"] | ||||
| [gd_scene load_steps=3 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 | ||||
|  | @ -19,12 +17,9 @@ _slots = [NodePath("InventorySlot"), NodePath("InventorySlot2"), NodePath("Inven | |||
| 
 | ||||
| [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") | ||||
|  |  | |||
|  | @ -6,14 +6,14 @@ namespace SupaLidlGame.UI.Inventory; | |||
| 
 | ||||
| public partial class InventoryGrid : GridContainer | ||||
| { | ||||
|     private SupaLidlGame.Items.IItemCollection _source; | ||||
|     private Items.IItemCollection _source; | ||||
| 
 | ||||
|     [Export] | ||||
|     private PackedScene _slotScene; | ||||
| 
 | ||||
|     public ButtonGroup ButtonGroup { get; private set; } | ||||
| 
 | ||||
|     public SupaLidlGame.Items.IItemCollection Source | ||||
|     public Items.IItemCollection Source | ||||
|     { | ||||
|         get => _source; | ||||
|         set | ||||
|  |  | |||
|  | @ -0,0 +1,81 @@ | |||
| using Godot; | ||||
| using System.Collections.Generic; | ||||
| 
 | ||||
| namespace SupaLidlGame.UI.Inventory; | ||||
| 
 | ||||
| public partial class InventoryMenu : BaseMenu, IModal | ||||
| { | ||||
|     private Items.Inventory _source; | ||||
| 
 | ||||
|     public Items.Inventory Source | ||||
|     { | ||||
|         get => _source; | ||||
|         set | ||||
|         { | ||||
|             _source = value; | ||||
|             _inventoryGrid.Source = value; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public override void ShowModal() | ||||
|     { | ||||
|         Show(); | ||||
|         var animPlayer = GetNode<AnimationPlayer>("%AnimationPlayer"); | ||||
|         animPlayer.Play("open"); | ||||
|     } | ||||
| 
 | ||||
|     public override void HideModal() | ||||
|     { | ||||
|         Hide(); | ||||
|         _source = null; | ||||
|     } | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         base._Ready(); | ||||
| 
 | ||||
|         _focusButtonOnSelect = GetNode<Button>("%SlotButton1"); | ||||
| 
 | ||||
|         foreach (Node node in GetTree().GetNodesInGroup("SlotButtons")) | ||||
|         { | ||||
|             var button = node as Button; | ||||
| 
 | ||||
|             var onButtonPress = () => | ||||
|             { | ||||
|                 OnButtonPress(button); | ||||
|             }; | ||||
| 
 | ||||
|             var onButtonInput = (InputEvent @event) => | ||||
|             { | ||||
|                 if (@event.IsActionPressed("ui_cancel")) | ||||
|                 { | ||||
|                     GetViewport().SetInputAsHandled(); | ||||
|                     _selected?.GrabFocus(); | ||||
|                 } | ||||
|             }; | ||||
| 
 | ||||
|             button.Connect(Button.SignalName.Pressed, Callable.From(onButtonPress)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     protected override void SetTooltipItem(InventorySlot slot) | ||||
|     { | ||||
|         base.SetTooltipItem(slot); | ||||
| 
 | ||||
|         if (slot == _selected) | ||||
|         { | ||||
|             GetTree().SetGroup("SlotButtons", "disabled", false); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             GetTree().SetGroup("SlotButtons", "disabled", true); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public override void OnButtonPress(Button button) | ||||
|     { | ||||
|         int slot = button.GetMeta("slot").AsInt32(); | ||||
|         GD.Print("Equipping item at slot " + slot); | ||||
|         Source.SetHotbarIndexToItem(slot, _selected.Item); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,38 @@ | |||
| [gd_scene load_steps=4 format=3 uid="uid://bg51duwdtyl8w"] | ||||
| 
 | ||||
| [ext_resource type="PackedScene" uid="uid://7blvai53i2a0" path="res://UI/Inventory/BaseMenu.tscn" id="1_55ohh"] | ||||
| [ext_resource type="Script" path="res://UI/Inventory/InventoryMenu.cs" id="2_25pbk"] | ||||
| [ext_resource type="Theme" uid="uid://cksjbu3vrup5" path="res://UI/Themes/supalidl.tres" id="2_jvsju"] | ||||
| 
 | ||||
| [node name="Panel" node_paths=PackedStringArray("_inventoryGrid") instance=ExtResource("1_55ohh")] | ||||
| script = ExtResource("2_25pbk") | ||||
| _inventoryGrid = NodePath("PanelContainer/VBoxContainer/ScrollContainer/InventoryGrid") | ||||
| 
 | ||||
| [node name="HBoxContainer" parent="PanelContainer/VBoxContainer" index="0"] | ||||
| visible = false | ||||
| 
 | ||||
| [node name="SlotButton1" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2" index="0" groups=["SlotButtons"]] | ||||
| unique_name_in_owner = true | ||||
| layout_mode = 2 | ||||
| size_flags_horizontal = 3 | ||||
| theme = ExtResource("2_jvsju") | ||||
| text = "Slot 1" | ||||
| metadata/slot = 0 | ||||
| 
 | ||||
| [node name="SlotButton2" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2" index="1" groups=["SlotButtons"]] | ||||
| unique_name_in_owner = true | ||||
| layout_mode = 2 | ||||
| size_flags_horizontal = 3 | ||||
| theme = ExtResource("2_jvsju") | ||||
| text = "Slot 2 | ||||
| " | ||||
| metadata/slot = 1 | ||||
| 
 | ||||
| [node name="SlotButton3" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2" index="2" groups=["SlotButtons"]] | ||||
| unique_name_in_owner = true | ||||
| layout_mode = 2 | ||||
| size_flags_horizontal = 3 | ||||
| theme = ExtResource("2_jvsju") | ||||
| text = "Slot 3 | ||||
| " | ||||
| metadata/slot = 2 | ||||
|  | @ -5,6 +5,9 @@ namespace SupaLidlGame.UI.Inventory; | |||
| 
 | ||||
| public partial class ItemTooltip : Control | ||||
| { | ||||
|     [Export] | ||||
|     public Button ActionButton { get; set; } | ||||
| 
 | ||||
|     private ItemMetadata _item; | ||||
| 
 | ||||
|     public ItemMetadata Item | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ using System.Collections.Generic; | |||
| 
 | ||||
| namespace SupaLidlGame.UI.Inventory; | ||||
| 
 | ||||
| public partial class ShopMenu : Control, IModal | ||||
| public partial class ShopMenu : BaseMenu, IModal | ||||
| { | ||||
|     private Items.IItemCollection<Items.ShopEntry> _source; | ||||
| 
 | ||||
|  | @ -17,53 +17,24 @@ public partial class ShopMenu : Control, IModal | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     [Export] | ||||
|     private InventoryGrid _inventoryGrid; | ||||
| 
 | ||||
|     private InventorySlot _selected; | ||||
| 
 | ||||
|     public void ShowModal() | ||||
|     public override void ShowModal() | ||||
|     { | ||||
|         Show(); | ||||
|         var animPlayer = GetNode<AnimationPlayer>("%AnimationPlayer"); | ||||
|         animPlayer.Play("open"); | ||||
|     } | ||||
| 
 | ||||
|     public void HideModal() | ||||
|     public override void HideModal() | ||||
|     { | ||||
|         Hide(); | ||||
|         _source = null; | ||||
|     } | ||||
| 
 | ||||
|     public async void Close() | ||||
|     { | ||||
|         var animPlayer = GetNode<AnimationPlayer>("%AnimationPlayer"); | ||||
|         animPlayer.Play("close"); | ||||
|         await ToSignal(animPlayer, AnimationPlayer.SignalName.AnimationFinished); | ||||
|         HideModal(); | ||||
|     } | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         _inventoryGrid.SlotFocused += (InventorySlot slot) => | ||||
|         { | ||||
|             if (slot.Item is not null) | ||||
|             { | ||||
|                 SetTooltipItem(slot); | ||||
|             } | ||||
|         }; | ||||
|         base._Ready(); | ||||
| 
 | ||||
|         _inventoryGrid.SlotUnfocused += (InventorySlot slot) => | ||||
|         { | ||||
|             SetTooltipItem(_selected); | ||||
|         }; | ||||
| 
 | ||||
|         _inventoryGrid.SlotSelected += (InventorySlot slot) => | ||||
|         { | ||||
|             _selected = slot; | ||||
|             SetTooltipItem(slot); | ||||
|             GetNode<Button>("%BuyButton").GrabFocus(); | ||||
|         }; | ||||
|         _focusButtonOnSelect = GetNode<Button>("%BuyButton"); | ||||
| 
 | ||||
|         GetNode<Button>("%BuyButton").GuiInput += (InputEvent @event) => | ||||
|         { | ||||
|  | @ -75,9 +46,9 @@ public partial class ShopMenu : Control, IModal | |||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     private void SetTooltipItem(InventorySlot slot) | ||||
|     protected override void SetTooltipItem(InventorySlot slot) | ||||
|     { | ||||
|         GetNode<ItemTooltip>("%ItemTooltip").Item = slot?.Item; | ||||
|         base.SetTooltipItem(slot); | ||||
| 
 | ||||
|         if (slot == _selected) | ||||
|         { | ||||
|  | @ -89,6 +60,11 @@ public partial class ShopMenu : Control, IModal | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public override void OnButtonPress(Button button) | ||||
|     { | ||||
|         throw new System.NotImplementedException("Not yet implemented."); | ||||
|     } | ||||
| 
 | ||||
|     public override void _UnhandledInput(InputEvent @event) | ||||
|     { | ||||
|         if (@event.IsActionPressed("ui_cancel")) | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| [gd_scene load_steps=15 format=3 uid="uid://cyggkyqosjk36"] | ||||
| 
 | ||||
| [ext_resource type="StyleBox" path="res://UI/Themes/Panel.tres" id="1_2ffty"] | ||||
| [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="Shader" path="res://Shaders/WipeXY.gdshader" id="2_jqery"] | ||||
| [ext_resource type="FontFile" uid="uid://cgwa8bjiyv534" path="res://Assets/Fonts/alagard.ttf" id="3_aj4jx"] | ||||
|  |  | |||
|  | @ -1,11 +1,11 @@ | |||
| [gd_resource type="Theme" load_steps=11 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="StyleBox" path="res://UI/Themes/InventorySlotButtonFocus.tres" id="2_3w5h1"] | ||||
| [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" path="res://UI/Themes/Panel.tres" id="2_jlgx8"] | ||||
| [ext_resource type="StyleBox" path="res://UI/Themes/InventorySlotButtonNormal.tres" id="3_nuiio"] | ||||
| [ext_resource type="StyleBox" path="res://UI/Themes/InventorySlotButtonPressed.tres" id="4_mllnb"] | ||||
| [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 | ||||
|  |  | |||
|  | @ -22,5 +22,23 @@ public partial class UIController : Control | |||
|             shopMenu.Source = shop; | ||||
|             shopMenu.ShowModal(); | ||||
|         }; | ||||
| 
 | ||||
|         Events.EventBus.Instance.PlayerOpenInventory += (Items.Inventory inventory) => | ||||
|         { | ||||
|             var inventoryMenu = GetNode<Inventory.InventoryMenu>("%InventoryMenu"); | ||||
|             if (!inventoryMenu.IsPlayingAnimation) | ||||
|             { | ||||
|                 inventoryMenu.Source = inventory; | ||||
| 
 | ||||
|                 if (inventoryMenu.Visible) | ||||
|                 { | ||||
|                     inventoryMenu.Close(); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     inventoryMenu.ShowModal(); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -61,6 +61,14 @@ ui_accept={ | |||
| , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) | ||||
| ] | ||||
| } | ||||
| ui_focus_next={ | ||||
| "deadzone": 0.5, | ||||
| "events": [] | ||||
| } | ||||
| ui_focus_prev={ | ||||
| "deadzone": 0.5, | ||||
| "events": [] | ||||
| } | ||||
| ui_left={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
|  | @ -198,6 +206,12 @@ cast={ | |||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null) | ||||
| ] | ||||
| } | ||||
| inventory={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":true,"script":null) | ||||
| ] | ||||
| } | ||||
| 
 | ||||
| [internationalization] | ||||
| 
 | ||||
|  |  | |||