diff --git a/Assets/Animations/player_hurt.res b/Assets/Animations/player_hurt.res index 8501f29..fa74d5c 100644 Binary files a/Assets/Animations/player_hurt.res and b/Assets/Animations/player_hurt.res differ diff --git a/Assets/Dialogue/clone-machine.dialogue b/Assets/Dialogue/clone-machine.dialogue new file mode 100644 index 0000000..cacd395 --- /dev/null +++ b/Assets/Dialogue/clone-machine.dialogue @@ -0,0 +1,9 @@ +~ start + +Death Count\: {{Stats.DeathCount}} forsenPls +- Save + do World.SaveGame() + => END +- Do nothing + +=> END \ No newline at end of file diff --git a/Assets/Dialogue/clone-machine.dialogue.import b/Assets/Dialogue/clone-machine.dialogue.import new file mode 100644 index 0000000..d3abfd1 --- /dev/null +++ b/Assets/Dialogue/clone-machine.dialogue.import @@ -0,0 +1,15 @@ +[remap] + +importer="dialogue_manager_compiler_8" +type="Resource" +uid="uid://c2om4y0fm81yr" +path="res://.godot/imported/clone-machine.dialogue-8810934a67eacdad52469e9ef5f970fb.tres" + +[deps] + +source_file="res://Assets/Dialogue/clone-machine.dialogue" +dest_files=["res://.godot/imported/clone-machine.dialogue-8810934a67eacdad52469e9ef5f970fb.tres"] + +[params] + +defaults=true diff --git a/Assets/Sounds/cinder-block-move.wav b/Assets/Sounds/cinder-block-move.wav new file mode 100644 index 0000000..7681725 Binary files /dev/null and b/Assets/Sounds/cinder-block-move.wav differ diff --git a/Assets/Sounds/cinder-block-move.wav.import b/Assets/Sounds/cinder-block-move.wav.import new file mode 100644 index 0000000..b3a50a4 --- /dev/null +++ b/Assets/Sounds/cinder-block-move.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dajb6kb64otkq" +path="res://.godot/imported/cinder-block-move.wav-31f9f0e94dc8ff5911113ce81f087608.sample" + +[deps] + +source_file="res://Assets/Sounds/cinder-block-move.wav" +dest_files=["res://.godot/imported/cinder-block-move.wav-31f9f0e94dc8ff5911113ce81f087608.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/Assets/Sounds/rock-impact.wav b/Assets/Sounds/rock-impact.wav new file mode 100644 index 0000000..a1f471f Binary files /dev/null and b/Assets/Sounds/rock-impact.wav differ diff --git a/Assets/Sounds/rock-impact.wav.import b/Assets/Sounds/rock-impact.wav.import new file mode 100644 index 0000000..a39eebe --- /dev/null +++ b/Assets/Sounds/rock-impact.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ciyi5ectbbscr" +path="res://.godot/imported/rock-impact.wav-9c8cc497be5f59299eae3f339de44d60.sample" + +[deps] + +source_file="res://Assets/Sounds/rock-impact.wav" +dest_files=["res://.godot/imported/rock-impact.wav-9c8cc497be5f59299eae3f339de44d60.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/Assets/Sprites/lidl-okayeg-placeholder.ase b/Assets/Sprites/lidl-okayeg-placeholder.ase new file mode 100644 index 0000000..a8cc30a Binary files /dev/null and b/Assets/Sprites/lidl-okayeg-placeholder.ase differ diff --git a/Assets/Sprites/lidl-okayeg-placeholder.png b/Assets/Sprites/lidl-okayeg-placeholder.png new file mode 100644 index 0000000..9156441 Binary files /dev/null and b/Assets/Sprites/lidl-okayeg-placeholder.png differ diff --git a/Assets/Sprites/lidl-okayeg-placeholder.png.import b/Assets/Sprites/lidl-okayeg-placeholder.png.import new file mode 100644 index 0000000..c790d21 --- /dev/null +++ b/Assets/Sprites/lidl-okayeg-placeholder.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqc7k0rstj7xt" +path="res://.godot/imported/lidl-okayeg-placeholder.png-ddb44da36147757b2a8d4a20c3173cad.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/lidl-okayeg-placeholder.png" +dest_files=["res://.godot/imported/lidl-okayeg-placeholder.png-ddb44da36147757b2a8d4a20c3173cad.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 diff --git a/BoundingBoxes/InteractionTrigger.tscn b/BoundingBoxes/InteractionTrigger.tscn index d9abd3d..dc2a15e 100644 --- a/BoundingBoxes/InteractionTrigger.tscn +++ b/BoundingBoxes/InteractionTrigger.tscn @@ -78,3 +78,4 @@ texture = SubResource("AtlasTexture_n00hm") [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = ExtResource("4_p2qp6") +bus = &"UI" diff --git a/Characters/Boss.cs b/Characters/Boss.cs index 8733a16..6810b4a 100644 --- a/Characters/Boss.cs +++ b/Characters/Boss.cs @@ -14,6 +14,9 @@ public abstract partial class Boss : Enemy [Export] public AudioStream Music { get; set; } + [Export] + public Vector2 InitialPosition { get; set; } + public abstract int Intensity { get; } private bool _isActive; @@ -35,10 +38,15 @@ public abstract partial class Boss : Enemy { base._Ready(); - Death += (Events.HealthChangedArgs args) => + Death += (Events.HurtArgs args) => { UpdateBossStatus(true); }; + + this.GetWorld().CurrentPlayer.Death += (args) => + { + Reset(); + }; } protected void UpdateBossStatus(bool status) @@ -46,4 +54,24 @@ public abstract partial class Boss : Enemy GetNode("/root/GlobalState") .Progression.BossStatus[SceneFilePath] = status; } + + protected virtual void Reset() + { + IsActive = false; + + // reset animations + foreach (var child in GetNode("Animations").GetChildren()) + { + if (child is AnimationPlayer anim) + { + if (anim.HasAnimation("RESET")) + { + anim.Play("RESET"); + } + } + } + + StateMachine.ChangeState(StateMachine.InitialState); + ThinkerStateMachine.ChangeState(ThinkerStateMachine.InitialState); + } } diff --git a/Characters/Character.cs b/Characters/Character.cs index bfeb2d1..03662a5 100644 --- a/Characters/Character.cs +++ b/Characters/Character.cs @@ -30,10 +30,13 @@ public partial class Character : CharacterBody2D, IFaction public float Stealth { get; protected set; } = 0; [Signal] - public delegate void HurtEventHandler(Events.HealthChangedArgs args); + public delegate void HealthChangedEventHandler(float oldHP, float newHP); [Signal] - public delegate void DeathEventHandler(Events.HealthChangedArgs args); + public delegate void HurtEventHandler(Events.HurtArgs args); + + [Signal] + public delegate void DeathEventHandler(Events.HurtArgs args); protected float _mass = 1.0f; @@ -242,7 +245,7 @@ public partial class Character : CharacterBody2D, IFaction Vector2 knockbackDir = default) => damage; - public virtual void OnReceivedDamage( + protected virtual void OnReceivedDamage( float damage, Character inflictor, float knockback, @@ -284,13 +287,6 @@ public partial class Character : CharacterBody2D, IFaction } } - // if anyone involved is a player, shake their screen - Player plr = inflictor as Player ?? this as Player; - if (plr is not null) - { - //plr.Camera.Shake(1, 0.4f); - } - if (this.GetNode("Effects/HurtSound") is AudioStreamPlayer2D sound) { // very small pitch deviation @@ -298,7 +294,7 @@ public partial class Character : CharacterBody2D, IFaction sound.At(GlobalPosition).WithPitchDeviation(0.125f).PlayOneShot(); } - Events.HealthChangedArgs args = new Events.HealthChangedArgs + Events.HurtArgs args = new Events.HurtArgs { Attacker = inflictor, OldHealth = oldHealth, @@ -317,6 +313,14 @@ public partial class Character : CharacterBody2D, IFaction } } + /// + /// For debugging purposes + /// + public void Inflict(float damage) + { + OnReceivedDamage(damage, null, 0); + } + public virtual void Footstep() { if (GetNode("Effects/Footstep") is AudioStreamPlayer2D player) diff --git a/Characters/Doc.cs b/Characters/Doc.cs index e83845b..229f229 100644 --- a/Characters/Doc.cs +++ b/Characters/Doc.cs @@ -1,8 +1,6 @@ using Godot; using SupaLidlGame.Extensions; -using SupaLidlGame.State.Character; using SupaLidlGame.BoundingBoxes; -using SupaLidlGame.State.Thinker; namespace SupaLidlGame.Characters; @@ -104,13 +102,12 @@ public partial class Doc : Boss // when we are hurt, start the boss fight - Hurt += (Events.HealthChangedArgs args) => + Hurt += (Events.HurtArgs args) => { if (!IsActive) { IsActive = true; Inventory.SelectedItem = Lance; - //DialogueManager.ShowExampleDialogueBalloon(); } }; } @@ -123,48 +120,4 @@ public partial class Doc : Boss } base._Process(delta); } - - protected override float ReceiveDamage( - float damage, - Character inflictor, - float knockback, - Vector2 knockbackDir = default) - { - if (IsActive) - { - return base.ReceiveDamage( - damage, inflictor, knockback, knockbackDir); - } - - return 1; - } - - /* - public override void OnReceivedDamage( - float damage, - Character inflictor, - float knockback, - Vector2 knockbackDir = default) - { - GetNode("Effects/HurtParticles") - .SetDirection(knockbackDir); - - base.OnReceivedDamage(damage, inflictor, knockback, knockbackDir); - } - */ - - protected override void Think() - { - if (BossStateMachine.CurrentState is State.NPC.Doc.DocLanceState) - { - if (ThinkerStateMachine.CurrentState is not DashDefensive) - { - ThinkerStateMachine.ChangeState(out var _); - } - } - else - { - base.Think(); - } - } } diff --git a/Characters/Doc.tscn b/Characters/Doc.tscn index 385f196..6ca783f 100644 --- a/Characters/Doc.tscn +++ b/Characters/Doc.tscn @@ -701,6 +701,8 @@ libraries = { "": SubResource("AnimationLibrary_kks2p") } +[node name="Attack" type="AnimationPlayer" parent="Animations"] + [node name="Misc" type="AnimationPlayer" parent="Animations"] libraries = { "": SubResource("AnimationLibrary_kjxam") diff --git a/Characters/Player.cs b/Characters/Player.cs index c494063..b845271 100644 --- a/Characters/Player.cs +++ b/Characters/Player.cs @@ -25,11 +25,10 @@ public sealed partial class Player : Character public override void _Ready() { InteractionRay = GetNode("Direction2D/InteractionRay"); - Death += async (Events.HealthChangedArgs args) => + Death += async (Events.HurtArgs args) => { HurtAnimation.Play("death"); await ToSignal(HurtAnimation, "animation_finished"); - Visible = false; }; base._Ready(); @@ -54,7 +53,7 @@ public sealed partial class Player : Character public void Spawn() { Health = 100; - Visible = true; + HurtAnimation.Play("spawn"); } public override void ModifyVelocity() @@ -69,7 +68,7 @@ public sealed partial class Player : Character // TODO: implement visual effects for stun } - public override void OnReceivedDamage( + protected override void OnReceivedDamage( float damage, Character inflictor, float knockback, diff --git a/Dialogue/Balloon.cs b/Dialogue/Balloon.cs index 09c248c..9485c36 100644 --- a/Dialogue/Balloon.cs +++ b/Dialogue/Balloon.cs @@ -72,7 +72,6 @@ public partial class Balloon : CanvasLayer { Next(dialogueLine.NextId); } - }; margin.Resized += () => HandleResize(); @@ -105,6 +104,7 @@ public partial class Balloon : CanvasLayer private async void Next(string nextId) { DialogueLine = await DialogueManager.GetNextDialogueLine(resource, nextId, temporaryGameStates ?? new Array()); + GD.Print(DialogueLine.Text); } @@ -265,6 +265,7 @@ public partial class Balloon : CanvasLayer { isWaitingForInput = true; balloon.FocusMode = Control.FocusModeEnum.All; + balloon.GrabFocus(); } } } diff --git a/Entities/Campfire.cs b/Entities/Campfire.cs index 3e22de4..787e5e9 100644 --- a/Entities/Campfire.cs +++ b/Entities/Campfire.cs @@ -1,6 +1,8 @@ using Godot; using GodotUtilities; using SupaLidlGame.BoundingBoxes; +using SupaLidlGame.Extensions; +using DialogueManagerRuntime; namespace SupaLidlGame.Entities; @@ -14,16 +16,27 @@ public partial class Campfire : StaticBody2D, Utils.IInteractive [Signal] public delegate void UseEventHandler(); + [Export(PropertyHint.File, "*.dialogue")] + public Resource DialogueResource { get; set; } + public override void _Ready() { InteractionTrigger = GetNode("InteractionTrigger"); _light = GetNode("PointLight2D"); + InteractionTrigger.Interaction += () => { // save the player's spawn position to be their position on interaction EmitSignal(SignalName.Use); - this.GetAncestor().SetSpawn(GlobalPosition); + var world = this.GetWorld(); + + // TODO: implement and use max health + world.CurrentPlayer.Health = 100; + + //this.GetAncestor().SetSpawn(GlobalPosition); + world.DialogueBalloon.Start(DialogueResource, "start"); + //DialogueManager.ShowExampleDialogueBalloon(DialogueResource, "start"); }; } diff --git a/Entities/Campfire.tscn b/Entities/Campfire.tscn index 03bf26c..dae1939 100644 --- a/Entities/Campfire.tscn +++ b/Entities/Campfire.tscn @@ -1,105 +1,23 @@ -[gd_scene load_steps=18 format=3 uid="uid://dhl071rj5wyvx"] +[gd_scene load_steps=7 format=3 uid="uid://dhl071rj5wyvx"] -[ext_resource type="Texture2D" uid="uid://yqet0b22i70d" path="res://Assets/Sprites/campfire.png" id="1_7eor7"] [ext_resource type="Script" path="res://Entities/Campfire.cs" id="1_w4gfp"] +[ext_resource type="Resource" uid="uid://c2om4y0fm81yr" path="res://Assets/Dialogue/clone-machine.dialogue" id="2_s6cen"] [ext_resource type="Texture2D" uid="uid://coarr28adgo1u" path="res://Assets/Sprites/Particles/point-light.png" id="3_lm3vq"] +[ext_resource type="Texture2D" uid="uid://bqc7k0rstj7xt" path="res://Assets/Sprites/lidl-okayeg-placeholder.png" id="3_o7u16"] [ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="4_yoo3p"] -[sub_resource type="AtlasTexture" id="AtlasTexture_68qj1"] -atlas = ExtResource("1_7eor7") -region = Rect2(0, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_rt0be"] -atlas = ExtResource("1_7eor7") -region = Rect2(16, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_0embb"] -atlas = ExtResource("1_7eor7") -region = Rect2(32, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_victi"] -atlas = ExtResource("1_7eor7") -region = Rect2(48, 0, 16, 16) - -[sub_resource type="AtlasTexture" id="AtlasTexture_jg745"] -atlas = ExtResource("1_7eor7") -region = Rect2(64, 0, 16, 16) - -[sub_resource type="SpriteFrames" id="SpriteFrames_o6lfi"] -animations = [{ -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_68qj1") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_rt0be") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_0embb") -}, { -"duration": 1.0, -"texture": SubResource("AtlasTexture_victi") -}], -"loop": true, -"name": &"active", -"speed": 5.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": SubResource("AtlasTexture_jg745") -}], -"loop": true, -"name": &"default", -"speed": 8.0 -}] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_ubam4"] -size = Vector2(16, 4) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_p0hsm"] -size = Vector2(20, 10) - -[sub_resource type="Gradient" id="Gradient_cr0xb"] -offsets = PackedFloat32Array(0, 0.644444, 1) -colors = PackedColorArray(2, 1.6, 0.8, 1, 0.863171, 0.393552, 0.380535, 1, 0.304405, 0.24341, 0.229614, 1) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_pjqf7"] -gradient = SubResource("Gradient_cr0xb") - -[sub_resource type="Curve" id="Curve_jm83f"] -_data = [Vector2(0.144578, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.4), 0.0, 0.0, 0, 0] -point_count = 2 - -[sub_resource type="CurveTexture" id="CurveTexture_jpefi"] -curve = SubResource("Curve_jm83f") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_xtx2m"] -emission_shape = 1 -emission_sphere_radius = 5.0 -particle_flag_disable_z = true -direction = Vector3(0, -1, 0) -spread = 0.0 -gravity = Vector3(0, -16, 0) -initial_velocity_min = 16.0 -initial_velocity_max = 16.0 -orbit_velocity_min = 0.0 -orbit_velocity_max = 0.0 -radial_accel_min = -40.0 -radial_accel_max = -20.0 -scale_min = 2.0 -scale_max = 4.0 -scale_curve = SubResource("CurveTexture_jpefi") -color_ramp = SubResource("GradientTexture1D_pjqf7") +[sub_resource type="CircleShape2D" id="CircleShape2D_pdkmj"] +radius = 20.0 [node name="Campfire" type="StaticBody2D"] texture_filter = 3 position = Vector2(0, -8) script = ExtResource("1_w4gfp") +DialogueResource = ExtResource("2_s6cen") -[node name="Sprite2D" type="AnimatedSprite2D" parent="."] -sprite_frames = SubResource("SpriteFrames_o6lfi") -animation = &"active" -frame_progress = 0.343741 +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(0, -8) +texture = ExtResource("3_o7u16") [node name="PointLight2D" type="PointLight2D" parent="."] color = Color(0.996078, 0.780392, 0.615686, 1) @@ -109,18 +27,17 @@ shadow_enabled = true texture = ExtResource("3_lm3vq") texture_scale = 0.25 -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(0, 6) -shape = SubResource("RectangleShape2D_ubam4") - [node name="InteractionTrigger" parent="." instance=ExtResource("4_yoo3p")] +position = Vector2(0, -5) [node name="CollisionShape2D" parent="InteractionTrigger" index="0"] -position = Vector2(0, 5) -shape = SubResource("RectangleShape2D_p0hsm") +shape = SubResource("CircleShape2D_pdkmj") -[node name="GPUParticles2D" type="GPUParticles2D" parent="."] -amount = 40 -process_material = SubResource("ParticleProcessMaterial_xtx2m") +[node name="Popup" parent="InteractionTrigger" index="1"] +offset_top = -49.0 +offset_bottom = -19.0 + +[node name="Label" parent="InteractionTrigger/Popup" index="0"] +text = "Clone Machine" [editable path="InteractionTrigger"] diff --git a/Entities/DynamicDoor.cs b/Entities/DynamicDoor.cs index 152cc6f..f652586 100644 --- a/Entities/DynamicDoor.cs +++ b/Entities/DynamicDoor.cs @@ -9,7 +9,7 @@ public partial class DynamicDoor : StaticBody2D public string MapStateKey { get; set; } [Export] - public Godot.Collections.Array VisibleOnToggle { get; set; } = new(); + public Godot.Collections.Array VisibleOnToggle { get; set; } = new(); [Export] public bool DefaultState { get; set; } @@ -22,6 +22,7 @@ public partial class DynamicDoor : StaticBody2D var globalState = this.GetGlobalState(); globalState.MapState.MapStateBoolChanged += OnMapStateChanged; + SetAnimations(false); RefreshMapState((bool)globalState.MapState[MapStateKey]); } @@ -30,12 +31,7 @@ public partial class DynamicDoor : StaticBody2D GD.Print("Map state changed"); if (key == MapStateKey) { - foreach (Node2D node in VisibleOnToggle) - { - // this is so extra effects are not played or showed when the - // door opens/closes from loading the map state. - node.Visible = true; - } + SetAnimations(true); RefreshMapState(value); } } @@ -55,10 +51,31 @@ public partial class DynamicDoor : StaticBody2D public virtual void Open() { _animPlayer?.TryPlay("open"); + //this.GetWorld().CurrentPlayer.Camera.Shake(1, 0.5f); } public virtual void Close() { - _animPlayer?.TryPlay("cose"); + _animPlayer?.TryPlay("close"); + //this.GetWorld().CurrentPlayer.Camera.Shake(2, 0.25f); + } + + public void SetAnimations(bool isEnabled) + { + foreach (var animKey in _animPlayer.GetAnimationList()) + { + var anim = _animPlayer.GetAnimation(animKey); + for (int i = 0; i < anim.GetTrackCount(); i++) + { + foreach (var nodePath in VisibleOnToggle) + { + if (anim.TrackGetPath(i) == nodePath) + { + GD.Print($"Disabled anim for {nodePath}"); + anim.TrackSetEnabled(i, isEnabled); + } + } + } + } } } diff --git a/Entities/DynamicDoorSwitch.cs b/Entities/DynamicDoorSwitch.cs index 456ab76..89e6ad4 100644 --- a/Entities/DynamicDoorSwitch.cs +++ b/Entities/DynamicDoorSwitch.cs @@ -12,7 +12,7 @@ public partial class DynamicDoorSwitch : StaticBody2D public string MapStateKey { get; set; } [Export] - public Godot.Collections.Array VisibleOnToggle { get; set; } = new(); + public Godot.Collections.Array VisibleOnToggle { get; set; } = new(); private AnimationPlayer _animPlayer; @@ -22,18 +22,16 @@ public partial class DynamicDoorSwitch : StaticBody2D var globalState = this.GetGlobalState(); var doorState = globalState.MapState[MapStateKey]; - if (!doorState.Equals(default)) - { - if (!(bool)doorState) - { - InteractionTrigger.Interaction += OnInteraction; - } - } + InteractionTrigger.Interaction += OnInteraction; + + // disable specific animations when entering initial state + SetAnimations(false); + RefreshMapState(doorState); } private void RefreshMapState(Variant value) { - if (value.Equals(default)) + if (value.Equals(default) || value.VariantType != Variant.Type.Bool) { return; } @@ -51,14 +49,38 @@ public partial class DynamicDoorSwitch : StaticBody2D public void OnInteraction() { var globalState = this.GetGlobalState(); - globalState.MapState[MapStateKey] = true; - RefreshMapState(true); - - GD.Print($"{MapStateKey} is now on"); - - foreach (Node2D node in VisibleOnToggle) + Variant oldState = globalState.MapState[MapStateKey]; + bool newState; + globalState.MapState[MapStateKey] = newState = oldState.VariantType switch { - node.Visible = true; + Variant.Type.Bool => !(bool)oldState, + _ => true, + }; + SetAnimations(true); + RefreshMapState(newState); + + GD.Print($"Map state \"{MapStateKey}\" {oldState} -> {newState}"); + + //var a = _animPlayer.CurrentAnimation; + //GetNode(nodePath).SetProcess(true); + } + + public void SetAnimations(bool isEnabled) + { + foreach (var animKey in _animPlayer.GetAnimationList()) + { + var anim = _animPlayer.GetAnimation(animKey); + for (int i = 0; i < anim.GetTrackCount(); i++) + { + foreach (var nodePath in VisibleOnToggle) + { + if (anim.TrackGetPath(i) == nodePath) + { + GD.Print($"Disabled anim for {nodePath}"); + anim.TrackSetEnabled(i, isEnabled); + } + } + } } } } diff --git a/Events/HealthChangedArgs.cs b/Events/HealthChangedArgs.cs new file mode 100644 index 0000000..7e7fd5e --- /dev/null +++ b/Events/HealthChangedArgs.cs @@ -0,0 +1,10 @@ +namespace SupaLidlGame.Events; + +public partial class HealthChangedArgs : Args +{ + public float OldHealth { get; set; } + + public float NewHealth { get; set; } + + public float Damage { get; set; } +} diff --git a/Events/HurtArgs.cs b/Events/HurtArgs.cs index ae6b957..d25afcc 100644 --- a/Events/HurtArgs.cs +++ b/Events/HurtArgs.cs @@ -1,14 +1,8 @@ namespace SupaLidlGame.Events; -public partial class HealthChangedArgs : Args +public partial class HurtArgs : HealthChangedArgs { public Characters.Character Attacker { get; set; } public Items.Weapon Weapon { get; set; } - - public float OldHealth { get; set; } - - public float NewHealth { get; set; } - - public float Damage { get; set; } } diff --git a/Props/ArenaDoor.tscn b/Props/ArenaDoor.tscn index 72d6418..9d3626d 100644 --- a/Props/ArenaDoor.tscn +++ b/Props/ArenaDoor.tscn @@ -1,8 +1,10 @@ -[gd_scene load_steps=14 format=3 uid="uid://c5i3cq1kewljv"] +[gd_scene load_steps=18 format=3 uid="uid://c5i3cq1kewljv"] [ext_resource type="Script" path="res://Entities/DynamicDoor.cs" id="1_t6mj1"] [ext_resource type="Texture2D" uid="uid://crddevohy65we" path="res://Assets/Sprites/Props/arena-gate.png" id="2_kvtjv"] [ext_resource type="Texture2D" uid="uid://c1a7lvb4uuwfy" path="res://Assets/Sprites/Particles/circle-16.png" id="3_i2hr3"] +[ext_resource type="AudioStream" uid="uid://ciyi5ectbbscr" path="res://Assets/Sounds/rock-impact.wav" id="4_n2fp8"] +[ext_resource type="AudioStream" uid="uid://dajb6kb64otkq" path="res://Assets/Sounds/cinder-block-move.wav" id="5_xjq01"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_yrdxe"] size = Vector2(32, 25) @@ -62,6 +64,18 @@ tracks/1/keys = { "update": 1, "values": [false] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("GPUParticles2D:emitting") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="Animation" id="Animation_unbll"] resource_name = "close" @@ -89,6 +103,33 @@ tracks/1/keys = { "update": 1, "values": [false] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("GPUParticles2D:emitting") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/3/type = "audio" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AudioStreamPlayer2D") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"clips": [{ +"end_offset": 0.0, +"start_offset": 0.0, +"stream": ExtResource("4_n2fp8") +}], +"times": PackedFloat32Array(0) +} +tracks/3/use_blend = true [sub_resource type="Animation" id="Animation_1nbqx"] resource_name = "open" @@ -116,18 +157,90 @@ tracks/1/keys = { "update": 1, "values": [true] } +tracks/2/type = "audio" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AudioStreamPlayer2D") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"clips": [{ +"end_offset": 0.0, +"start_offset": 0.0, +"stream": ExtResource("5_xjq01") +}], +"times": PackedFloat32Array(0) +} +tracks/2/use_blend = true + +[sub_resource type="Animation" id="Animation_s143f"] +resource_name = "open_init" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Gate:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CollisionShape2D:disabled") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="Animation" id="Animation_5kkkm"] +resource_name = "close_init" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Gate:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CollisionShape2D:disabled") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_3eva7"] _data = { "RESET": SubResource("Animation_ylaba"), "close": SubResource("Animation_unbll"), -"open": SubResource("Animation_1nbqx") +"close_init": SubResource("Animation_5kkkm"), +"open": SubResource("Animation_1nbqx"), +"open_init": SubResource("Animation_s143f") } [node name="ArenaDoor" type="StaticBody2D"] collision_mask = 0 script = ExtResource("1_t6mj1") MapStateKey = "b_arena_depths_door_1" +VisibleOnToggle = [NodePath("GPUParticles2D"), NodePath("AudioStreamPlayer2D")] [node name="Gate" type="Sprite2D" parent="."] texture = ExtResource("2_kvtjv") @@ -151,3 +264,6 @@ libraries = { } [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +max_distance = 512.0 +attenuation = 8.0 +bus = &"Effects" diff --git a/Props/ArenaDoorSwitch.tscn b/Props/ArenaDoorSwitch.tscn index a4ed1e1..fe2dc50 100644 --- a/Props/ArenaDoorSwitch.tscn +++ b/Props/ArenaDoorSwitch.tscn @@ -96,6 +96,7 @@ _data = { [node name="ArenaDoorSwitch" type="StaticBody2D" node_paths=PackedStringArray("InteractionTrigger")] script = ExtResource("1_78qab") InteractionTrigger = NodePath("InteractionTrigger") +VisibleOnToggle = [null] [node name="InteractionTrigger" parent="." instance=ExtResource("2_7j8p7")] diff --git a/Scenes/Level.tscn b/Scenes/Level.tscn index bfdf270..28f3a98 100644 --- a/Scenes/Level.tscn +++ b/Scenes/Level.tscn @@ -21,15 +21,16 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 stretch = true -stretch_shrink = 2 +stretch_shrink = 3 [node name="UIViewport" type="SubViewport" parent="CanvasLayer/SubViewportContainer"] transparent_bg = true handle_input_locally = false -size = Vector2i(960, 540) +size = Vector2i(640, 360) render_target_update_mode = 4 [node name="DialogBalloon" parent="CanvasLayer/SubViewportContainer/UIViewport" instance=ExtResource("6_2bdwl")] +layer = 2 [node name="CanvasLayer" type="CanvasLayer" parent="CanvasLayer/SubViewportContainer/UIViewport"] diff --git a/Scenes/Maps/Arena.tscn b/Scenes/Maps/Arena.tscn index a13c906..e4f4b96 100644 --- a/Scenes/Maps/Arena.tscn +++ b/Scenes/Maps/Arena.tscn @@ -11,7 +11,7 @@ [ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="9_3401j"] [ext_resource type="Script" path="res://BoundingBoxes/ConnectorBox.cs" id="9_fg062"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_o5jr8"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_4fu3e"] resource_local_to_scene = true shader = ExtResource("5_h8k5p") shader_parameter/color = Vector4(1, 1, 1, 1) @@ -113,7 +113,7 @@ visible = false position = Vector2(120, -112) [node name="Doc" parent="Entities" index="0" instance=ExtResource("4_ej0f3")] -material = SubResource("ShaderMaterial_o5jr8") +material = SubResource("ShaderMaterial_4fu3e") [node name="PointLight2D" type="PointLight2D" parent="Entities" index="1"] position = Vector2(168, -42) diff --git a/Scenes/Maps/ArenaExterior.tscn b/Scenes/Maps/ArenaExterior.tscn index 05678f3..a3f3d2e 100644 --- a/Scenes/Maps/ArenaExterior.tscn +++ b/Scenes/Maps/ArenaExterior.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=42 format=3 uid="uid://c72uqjjtxpi3g"] +[gd_scene load_steps=46 format=3 uid="uid://c72uqjjtxpi3g"] [ext_resource type="PackedScene" uid="uid://clwv2owvk6abe" path="res://Scenes/BaseMap.tscn" id="1_ci4ij"] [ext_resource type="TileSet" uid="uid://l61kbx31ug4p" path="res://Scenes/Maps/ArenaTileset.tres" id="2_m6h7j"] @@ -9,8 +9,11 @@ [ext_resource type="PackedScene" uid="uid://c1w7t6irnohfx" path="res://Entities/Torch.tscn" id="6_wx4iy"] [ext_resource type="PackedScene" uid="uid://ceadk7pam7vab" path="res://Entities/TorchLamp.tscn" id="8_3rpj6"] [ext_resource type="PackedScene" uid="uid://hm3ek8vqt1d4" path="res://Props/Bookshelf.tscn" id="9_qsthf"] +[ext_resource type="Script" path="res://Utils/InteractionTriggerDialogue.cs" id="10_apvp5"] [ext_resource type="Texture2D" uid="uid://dcwerlcsr0nj0" path="res://Assets/Sprites/Props/tree-dark-3.png" id="10_i5qot"] +[ext_resource type="PackedScene" uid="uid://dldnp8eunxj3q" path="res://BoundingBoxes/InteractionTrigger.tscn" id="10_scl41"] [ext_resource type="Texture2D" uid="uid://dl2q3k0w8e4fp" path="res://Assets/Sprites/Props/tree-dark.png" id="10_sx2hw"] +[ext_resource type="Resource" uid="uid://dilmuoilweoeh" path="res://Assets/Dialogue/books.dialogue" id="11_fpxpb"] [ext_resource type="Texture2D" uid="uid://jhqfflef5yde" path="res://Assets/Sprites/Props/tree-dark-2.png" id="11_wjfe8"] [ext_resource type="Texture2D" uid="uid://ds0xg848g3jid" path="res://Assets/Sprites/Props/tree-dark-5.png" id="12_md5xh"] [ext_resource type="Texture2D" uid="uid://8rbstele3ckq" path="res://Assets/Sprites/Props/tree-dark-4.png" id="13_j84wc"] @@ -22,6 +25,7 @@ [ext_resource type="PackedScene" uid="uid://bou5pccj0147e" path="res://Entities/ArenaEntrance.tscn" id="20_tcd0x"] [ext_resource type="PackedScene" uid="uid://c5i3cq1kewljv" path="res://Props/ArenaDoor.tscn" id="21_nvrif"] [ext_resource type="PackedScene" uid="uid://bs6xuujve2tsf" path="res://Props/ArenaDoorSwitch.tscn" id="22_ay852"] +[ext_resource type="PackedScene" uid="uid://dhl071rj5wyvx" path="res://Entities/Campfire.tscn" id="23_mykt8"] [sub_resource type="Gradient" id="Gradient_jupxw"] offsets = PackedFloat32Array(0.00740741, 0.2, 1) @@ -346,8 +350,21 @@ texture = SubResource("CanvasTexture_1u3bg") texture = ExtResource("3_lgup0") texture_scale = 0.15 -[node name="StaticBookshelf" parent="Props" index="13" instance=ExtResource("9_qsthf")] +[node name="StaticBookshelf" parent="Props" index="13" node_paths=PackedStringArray("InteractionTrigger") instance=ExtResource("9_qsthf")] position = Vector2(64, 456) +script = ExtResource("10_apvp5") +InteractionTrigger = NodePath("InteractionTrigger") +DialogueResource = ExtResource("11_fpxpb") +DialogueTitle = "unwanted_frequencies" + +[node name="InteractionTrigger" parent="Props/StaticBookshelf" index="6" instance=ExtResource("10_scl41")] + +[node name="Popup" parent="Props/StaticBookshelf/InteractionTrigger" index="1"] +offset_top = -57.0 +offset_bottom = -27.0 + +[node name="Label" parent="Props/StaticBookshelf/InteractionTrigger/Popup" index="0"] +text = "Read" [node name="StaticBookshelf2" parent="Props" index="14" instance=ExtResource("9_qsthf")] position = Vector2(96, 456) @@ -580,6 +597,13 @@ MapStateKey = "b_arena_depths_2" position = Vector2(24, 332) MapStateKey = "b_arena_depths_2" +[node name="Campfire" parent="Entities" index="5" instance=ExtResource("23_mykt8")] +position = Vector2(256, -9) + +[node name="Campfire2" parent="Entities" index="6" instance=ExtResource("23_mykt8")] +position = Vector2(80, 373) + [editable path="Props/StaticBookshelf"] +[editable path="Props/StaticBookshelf/InteractionTrigger"] [editable path="Props/StaticBookshelf2"] [editable path="Props/StaticBookshelf3"] diff --git a/State/Character/PlayerState.cs b/State/Character/PlayerState.cs index 11ea5a8..6ceaffa 100644 --- a/State/Character/PlayerState.cs +++ b/State/Character/PlayerState.cs @@ -40,8 +40,8 @@ public abstract partial class PlayerState : CharacterState public override CharacterState Process(double delta) { - Character.Direction = Godot.Input.GetVector("ui_left", "ui_right", - "ui_up", "ui_down"); + Character.Direction = Godot.Input.GetVector("left", "right", + "up", "down"); Character.LookTowardsDirection(); Vector2 mousePos = Character.GetGlobalMousePosition(); diff --git a/State/Global/GlobalState.cs b/State/Global/GlobalState.cs index 3778e48..ae6a98c 100644 --- a/State/Global/GlobalState.cs +++ b/State/Global/GlobalState.cs @@ -4,14 +4,17 @@ namespace SupaLidlGame.State.Global; public partial class GlobalState : Node { - //public Utils.World World { get; set; } - [Export] public Progression Progression { get; set; } = new(); [Export] public MapState MapState { get; set; } = new(); + [Export] + public Stats Stats { get; set; } = new(); + [Signal] public delegate void SummonBossEventHandler(string bossName); + + public void Print(string str) => GD.Print(str); } diff --git a/State/Global/Stats.cs b/State/Global/Stats.cs new file mode 100644 index 0000000..b63a3e5 --- /dev/null +++ b/State/Global/Stats.cs @@ -0,0 +1,15 @@ +using Godot; + +namespace SupaLidlGame.State.Global; + +public partial class Stats : Resource +{ + [Export] + public Vector2 SaveLocation { get; set; } + + [Export] + public string SaveMapKey { get; set; } + + [Export] + public int DeathCount { get; set; } = 0; +} diff --git a/Utils/CacheStore.cs b/Utils/CacheStore.cs index 706af80..5b97a0d 100644 --- a/Utils/CacheStore.cs +++ b/Utils/CacheStore.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; public class CacheStore { - // default TTL is 5 mins - public ulong TimeToLive { get; } = 3000; + // default TTL is 1 min + public ulong TimeToLive { get; } = 60000; private Dictionary> _store = new(); diff --git a/Utils/World.cs b/Utils/World.cs index 24f54d5..2ecf576 100644 --- a/Utils/World.cs +++ b/Utils/World.cs @@ -64,8 +64,6 @@ public partial class World : Node private string _currentMapResourcePath; //private Entities.Campfire _lastCampfire = null; - public Vector2 SaveLocation { get; set; } - public string SaveMapKey { get; set; } private const string PLAYER_PATH = "res://Characters/Player.tscn"; private PackedScene _playerScene; @@ -96,10 +94,12 @@ public partial class World : Node // create a player (currently unparented) CreatePlayer(); + // TODO: create start menu and load game from there + LoadGame(); + EventBus = this.GetEventBus(); EventBus.RequestMoveToArea += (Events.RequestAreaArgs args) => { - GD.Print("request move to area"); MoveToArea(args.Area, args.Connector); }; @@ -110,8 +110,16 @@ public partial class World : Node { CurrentBoss = boss; UIController.BossBar.Boss = boss; - MusicPlayer.Stream = boss.Music; - MusicPlayer.Play(); + MusicPlayer.Stream = boss?.Music; + // TODO: use an audio manager + if (MusicPlayer.Stream is null) + { + MusicPlayer.Stop(); + } + else + { + MusicPlayer.Play(); + } } public void DeregisterBoss(Boss boss) @@ -207,7 +215,7 @@ public partial class World : Node { CurrentPlayer = _playerScene.Instantiate(); - CurrentPlayer.Death += (Events.HealthChangedArgs args) => + CurrentPlayer.Death += (Events.HurtArgs args) => { // TODO: respawn the player at the last campfire. GetTree().CreateTimer(3).Timeout += () => @@ -216,7 +224,7 @@ public partial class World : Node }; }; - CurrentPlayer.Hurt += (Events.HealthChangedArgs args) => + CurrentPlayer.Hurt += (Events.HurtArgs args) => { // TODO: move this to UI controller and add a setup method var bar = UIController.GetNode("Top/Margin/HealthBar"); @@ -251,11 +259,11 @@ public partial class World : Node public void MoveToArea(string path, string connector) { _currentConnector = connector; - if (path != _currentMapResourcePath) + GD.Print($"Moving to area {path} - {connector}"); + if (path != CurrentMap.SceneFilePath) { - var scene = ResourceLoader.Load(path); LoadScene(path); - _currentMapResourcePath = path; + //_currentMapResourcePath = path; } // after finished loading, move our player to the connector @@ -272,22 +280,26 @@ public partial class World : Node public void SaveGame() { - ResourceSaver.Save(GlobalState.Progression, "user://progression.save"); - ResourceSaver.Save(GlobalState.MapState, "user://map-state.save"); - throw new System.NotImplementedException(); + SetSpawn(CurrentPlayer.GlobalPosition); + + // TODO: create a single save resource file + ResourceSaver.Save(GlobalState.Progression, "user://progression.tres"); + ResourceSaver.Save(GlobalState.MapState, "user://map-state.tres"); + ResourceSaver.Save(GlobalState.Stats, "user://stats.tres"); } public void LoadGame() { - var prog = ResourceLoader.Load("user://progression.save"); - var mapState = ResourceLoader.Load("user://map-state.save"); - GlobalState.Progression = prog; - GlobalState.MapState = mapState; + var prog = ResourceLoader.Load("user://progression.tres"); + var mapState = ResourceLoader.Load("user://map-state.tres"); + var stats = ResourceLoader.Load("user://stats.tres"); + + GlobalState.Progression = prog ?? new Progression(); + GlobalState.MapState = mapState ?? new MapState(); + GlobalState.Stats = stats ?? new Stats(); // load the player scene // TODO: implement - - throw new System.NotImplementedException(); } /// @@ -304,9 +316,9 @@ public partial class World : Node if (mapKey is null) { mapKey = CurrentMap.SceneFilePath; - SaveLocation = position; - SaveMapKey = mapKey; } + GlobalState.Stats.SaveLocation = position; + GlobalState.Stats.SaveMapKey = mapKey; } public void SpawnPlayer() @@ -314,11 +326,11 @@ public partial class World : Node // TODO: add max health property //CurrentPlayer.Health = 100; //CurrentPlayer.Sprite.Visible = true; - if (CurrentMap.SceneFilePath != SaveMapKey) + if (CurrentMap.SceneFilePath != GlobalState.Stats.SaveMapKey) { - LoadScene(SaveMapKey); + LoadScene(GlobalState.Stats.SaveMapKey); } - CurrentPlayer.GlobalPosition = SaveLocation; + CurrentPlayer.GlobalPosition = GlobalState.Stats.SaveLocation; CurrentPlayer.Spawn(); } diff --git a/project.godot b/project.godot index c9f3bf8..360da26 100644 --- a/project.godot +++ b/project.godot @@ -17,12 +17,12 @@ config/icon="res://icon.svg" [autoload] -DebugConsole="*res://Debug/DebugConsole.cs" DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd" GlobalState="*res://State/Global/GlobalState.cs" EventBus="*res://Events/EventBus.cs" -Panku="*res://addons/panku_console/console.tscn" World="*res://Scenes/Level.tscn" +DebugConsole="*res://Debug/DebugConsole.cs" +Panku="*res://addons/panku_console/console.tscn" [dialogue_manager] @@ -46,27 +46,33 @@ enabled=PackedStringArray("res://addons/dialogue_manager/plugin.cfg", "res://add [input] +ui_accept={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":4194309,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":4194310,"echo":false,"script":null) +] +} ui_left={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +"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,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) ] } ui_right={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +"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":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) ] } ui_up={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +"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":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) ] } ui_down={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +"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":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) ] } @@ -111,10 +117,34 @@ emote={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":0,"echo":false,"script":null) ] } +up={ +"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":87,"key_label":0,"unicode":119,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) +] +} +down={ +"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":83,"key_label":0,"unicode":115,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) +] +} +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":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) +] +} +right={ +"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":68,"key_label":0,"unicode":100,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) +] +} [internationalization] -locale/translations_pot_files=PackedStringArray("res://Assets/Dialog/doc.dialogue", "res://Assets/Dialogue/doc.dialogue", "res://Assets/Dialogue/spellbook.dialogue", "res://Assets/Dialogue/books.dialogue") +locale/translations_pot_files=PackedStringArray("res://Assets/Dialog/doc.dialogue", "res://Assets/Dialogue/doc.dialogue", "res://Assets/Dialogue/spellbook.dialogue", "res://Assets/Dialogue/books.dialogue", "res://Assets/Dialogue/clone-machine.dialogue") [layer_names]