Merge pull request #6 from HumanoidSandvichDispenser/controller-support

Controller support
godot-4.2
HumanoidSandvichDispenser 2023-09-07 23:35:37 -07:00 committed by GitHub
commit 4480ce4090
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 145 additions and 10 deletions

View File

@ -130,7 +130,14 @@ public partial class Character : CharacterBody2D, IFaction
StunAnimation.Stop(); StunAnimation.Stop();
} }
Sprite.FlipH = Target.X < 0; if (Target.X < 0)
{
Sprite.FlipH = true;
}
else if (Target.X > 0)
{
Sprite.FlipH = false;
}
DrawTarget(); DrawTarget();
} }
@ -214,7 +221,7 @@ public partial class Character : CharacterBody2D, IFaction
scale.Y = -1; scale.Y = -1;
angle = Mathf.Pi - angle; angle = Mathf.Pi - angle;
} }
else else if (target.X > 0)
{ {
scale.Y = 1; scale.Y = 1;
} }

View File

@ -11,9 +11,22 @@ public sealed partial class Player : Character
{ {
private string _spriteAnim; private string _spriteAnim;
private TargetTracer _targetTracer; private Vector2 _desiredTarget;
public Vector2 DesiredTarget { get; set; } public Vector2 DesiredTarget
{
get => _desiredTarget;
set
{
if (value.IsZeroApprox())
{
return;
}
_desiredTarget = value;
}
}
private TargetTracer _targetTracer;
[Export] [Export]
public PlayerCamera Camera { get; set; } public PlayerCamera Camera { get; set; }
@ -125,4 +138,26 @@ public sealed partial class Player : Character
.WithPitchDeviation(0.125f) .WithPitchDeviation(0.125f)
.Play(); .Play();
} }
public Vector2 GetDesiredInputFromInput()
{
Vector2 mousePos = GetGlobalMousePosition();
Vector2 dirToMouse = GlobalPosition.DirectionTo(mousePos);
Vector2 joystick = Godot.Input.GetVector("look_left", "look_right",
"look_up", "look_down");
var inputMethod = Utils.World.Instance.GlobalState
.Settings.InputMethod;
switch (inputMethod)
{
case State.Global.InputMethod.Joystick:
if (joystick.IsZeroApprox())
{
return Direction;
}
return joystick;
default:
return dirToMouse;
}
}
} }

View File

@ -70,8 +70,7 @@ public partial class ShungiteSpike : Projectile
// spawn a dart towards where the player is aiming // spawn a dart towards where the player is aiming
if (inflictor is Characters.Player player) if (inflictor is Characters.Player player)
{ {
var mousePos = GetGlobalMousePosition(); var dart = CreateDart(player.Target.Normalized());
var dart = CreateDart(GlobalPosition.DirectionTo(mousePos));
dart.Hitbox.Faction = player.Faction; dart.Hitbox.Faction = player.Faction;
Hitbox.IsDisabled = true; Hitbox.IsDisabled = true;
} }

View File

@ -27,6 +27,20 @@ public partial class Inventory : Node2D
set => EquipItem(value, ref _selectedItem); set => EquipItem(value, ref _selectedItem);
} }
private int _quickSwitchIndex = -1;
public const int QUICKSWITCH_SIZE = 3;
public int CurrentQuickSwitchIndex
{
get => _quickSwitchIndex;
set
{
const int size = QUICKSWITCH_SIZE;
_quickSwitchIndex = (value % size + size) % size;
}
}
public bool IsUsingItem => SelectedItem?.IsUsing ?? false; public bool IsUsingItem => SelectedItem?.IsUsing ?? false;
public Inventory() public Inventory()
@ -56,6 +70,16 @@ public partial class Inventory : Node2D
base._Ready(); base._Ready();
} }
public bool EquipIndex(int index)
{
if (index < Items.Count)
{
return EquipItem(Items[index], ref _selectedItem);
}
return EquipItem(null, ref _selectedItem);
}
private bool EquipItem(Item item, ref Item slot) private bool EquipItem(Item item, ref Item slot)
{ {
if (item is not null) if (item is not null)

View File

@ -30,6 +30,14 @@ public abstract partial class PlayerState : CharacterState
{ {
inventory.SelectedItem = inventory.GetItemByMap("equip_3"); inventory.SelectedItem = inventory.GetItemByMap("equip_3");
} }
else if (@event.IsActionPressed("next_item"))
{
inventory.EquipIndex(++inventory.CurrentQuickSwitchIndex);
}
else if (@event.IsActionPressed("prev_item"))
{
inventory.EquipIndex(--inventory.CurrentQuickSwitchIndex);
}
if (@event.IsActionPressed("interact")) if (@event.IsActionPressed("interact"))
{ {
@ -47,8 +55,13 @@ public abstract partial class PlayerState : CharacterState
"up", "down"); "up", "down");
Character.LookTowardsDirection(); Character.LookTowardsDirection();
Vector2 mousePos = Character.GetGlobalMousePosition(); var player = _player;
Vector2 dirToMouse = Character.GlobalPosition.DirectionTo(mousePos); var desiredTarget = player.GetDesiredInputFromInput();
if (!desiredTarget.IsZeroApprox())
{
// can never be zero
player.DesiredTarget = desiredTarget;
}
if (Character.Inventory.SelectedItem is Items.Weapon weapon) if (Character.Inventory.SelectedItem is Items.Weapon weapon)
{ {
@ -57,7 +70,7 @@ public abstract partial class PlayerState : CharacterState
if (!weapon.ShouldHideIdle || isAttack1On) if (!weapon.ShouldHideIdle || isAttack1On)
{ {
Character.Target = dirToMouse; player.Target = player.DesiredTarget;
} }
if (isAttack1On) if (isAttack1On)
@ -68,7 +81,6 @@ public abstract partial class PlayerState : CharacterState
{ {
Character.UseCurrentItemAlt(); Character.UseCurrentItemAlt();
} }
} }
return base.Process(delta); return base.Process(delta);

View File

@ -0,0 +1,16 @@
using Godot;
namespace SupaLidlGame.State.Global;
public enum InputMethod
{
Mouse,
Joystick,
MouseCentered,
}
public partial class GameSettings : Resource
{
[Export]
public InputMethod InputMethod { get; set; }
}

View File

@ -14,12 +14,44 @@ public partial class GlobalState : Node
[Export] [Export]
public Stats Stats { get; set; } = new(); public Stats Stats { get; set; } = new();
[Export]
public GameSettings Settings { get; set; } = new();
[Signal] [Signal]
public delegate void SummonBossEventHandler(string bossName); public delegate void SummonBossEventHandler(string bossName);
public override void _Ready() public override void _Ready()
{ {
ProcessMode = ProcessModeEnum.Always; ProcessMode = ProcessModeEnum.Always;
LoadSettings();
}
public override void _Notification(int what)
{
if (what == NotificationWMCloseRequest)
{
// TODO: quit prompt
GetTree().Root
.PropagateNotification((int)NotificationWMCloseRequest);
SaveSettings();
}
}
private void LoadSettings()
{
if (ResourceLoader.Exists("user://settings.tres"))
{
Settings = ResourceLoader.Load<GameSettings>("user://settings.tres");
}
else
{
Settings = new GameSettings();
}
}
public void SaveSettings()
{
ResourceSaver.Save(Settings, "user://settings.tres");
} }
public void ImportFromSave(Save save) public void ImportFromSave(Save save)

View File

@ -172,6 +172,16 @@ look_right={
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null) "events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
] ]
} }
next_item={
"deadzone": 0.5,
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":5,"pressure":0.0,"pressed":false,"script":null)
]
}
prev_item={
"deadzone": 0.5,
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":false,"script":null)
]
}
[internationalization] [internationalization]