Compare commits

..

13 Commits

Author SHA1 Message Date
kziolkowski b7d1f9d8d5 Merge branch 'develop' into minigame_hit_feedback 2025-12-06 19:54:05 +01:00
kziolkowski 12bf632932 Merge pull request 'Added randomnes into attack minigame' (#36) from minigame_variation into develop
Reviewed-on: #36
Reviewed-by: kziolkowski <katharina.ziolkowski@gmail.com>
2025-12-06 19:53:49 +01:00
kziolkowski 0d985e5bf6 Merge branch 'develop' into minigame_variation 2025-12-06 19:53:44 +01:00
kziolkowski e86b3e81dd Merge pull request 'fighting minigame has no more Overlap with Vesna' (#38) from fighting_minigame_fix_overlap_with_Vesna into develop
Reviewed-on: #38
Reviewed-by: kziolkowski <katharina.ziolkowski@gmail.com>
2025-12-06 19:46:23 +01:00
jlink 14a73daa75 fighting minigame has no more Overlap with Vesna 2025-12-06 12:15:31 +01:00
kziolkowski 1dd4a694d0 Merge pull request 'feature/day_and_night' (#34) from feature/day_and_night into develop
Reviewed-on: #34
2025-12-04 22:34:17 +01:00
kziolkowski 9b8933e698 ♻️ removed no longer used method 2025-12-04 22:33:45 +01:00
kziolkowski 9f4cda0e6d ♻️ Replaced _ready mit _entertree (while deferring) 2025-12-04 22:22:40 +01:00
kziolkowski 1c865730a3 🚚 renamed directory 2025-12-04 22:05:33 +01:00
jonathan aa4f1c55b5 Added visual feedback when hitting a region in the minigame 2025-12-04 21:18:47 +01:00
jonathan aad6c44567 Added randomnes into attack minigame 2025-12-04 18:00:20 +01:00
jlink 8e9359d6f8 Merge pull request 'fight log no longer visible and door interactable' (#35) from remove_fightlog into develop
Reviewed-on: #35
2025-12-04 17:39:10 +01:00
jlink 7696271727 fight log no longer visible and door interactable 2025-12-04 17:31:31 +01:00
8 changed files with 97 additions and 36 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ Signal_Debugger="*res://addons/SignalVisualizer/Debugger/SignalDebugger.gd"
FightWorldAutoload="*res://prefabs/fight/fight_world_autoload.tscn"
SaveGameManager="*res://scripts/CSharp/Common/Savegame/SaveGameManager.cs"
SettingsSaveController="*res://scripts/CSharp/Common/Savegame/SettingsSaveController.cs"
DayAndNight="*res://prefabs/day and night/day_and_night.tscn"
DayAndNight="*res://prefabs/day_and_night/day_and_night.tscn"
[dialogic]
@@ -54,6 +54,7 @@ _minigameController = NodePath("Minigame")
[node name="Minigame" parent="MinigameHandler" instance=ExtResource("8_2b3cf")]
process_mode = 4
visible = false
position = Vector2(23, -29)
[node name="SwitchSceneOnFightEnd" type="Node" parent="." node_paths=PackedStringArray("_fightSceneSwitcher")]
script = ExtResource("10_qqd8u")
@@ -190,6 +191,7 @@ _label = NodePath("Label")
_current = NodePath("Current")
[node name="Label" type="Label" parent="StateMachineDebugger"]
visible = false
offset_left = -982.0
offset_top = -497.0
offset_right = -893.0
@@ -197,6 +199,7 @@ offset_bottom = -474.0
text = "Hello world"
[node name="Current" type="Label" parent="StateMachineDebugger"]
visible = false
offset_left = 705.0
offset_top = -495.0
offset_right = 794.0
@@ -19,7 +19,13 @@ public partial class VesnaAnimations : Node
/// </summary>
[Signal] public delegate void LookDirectionEventHandler(Vector2 direction);
public override void _Ready()
public override void _EnterTree()
{
// calling with a 1-frame delay to avoid race conditions.
CallDeferred(nameof(SetupSubscriptions));
}
private void SetupSubscriptions()
{
InventoryManager.Instance.playerInventory.InventoryContentsChanged += HandleNewItemInInventory;
}
@@ -62,11 +62,6 @@ public partial class PlantBehaviour2D : Node2D
}
}
public void IncrementDaysGrowing()
{
DayPlanted++;
}
public string PrefabPath => _prefabPath;
/// <summary>
@@ -1,36 +1,44 @@
using Godot;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Babushka.scripts.CSharp.Common.Fight;
using Babushka.scripts.CSharp.Common.Fight.ActionDetails;
using Babushka.scripts.CSharp.Common.Minigame;
using Godot;
using static Babushka.scripts.CSharp.Common.Minigame.MinigameController.RegionTheme;
namespace Babushka.scripts.CSharp.Common.Fight;
public partial class FightMinigameHandler : Node
{
#region Shortcuts
private FightWorld.FightHappeningData HappeningData => FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
private FightWorld.FightHappeningData HappeningData =>
FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
#endregion
[Export] private MinigameController _minigameController;
[Export] private MinigameController _minigameController = null!;
public void OnStateEnter(FightHappening.FightState to)
{
if(to!=FightHappening.FightState.InputActionDetail) return;
var currentDetail = HappeningData.actionStaging!.CurrentDetail();
if(currentDetail is not MinigameActionDetail minigameDetail) return;
if (to != FightHappening.FightState.InputActionDetail) return;
var currentDetail = HappeningData.actionStaging!.CurrentDetail();
if (currentDetail is not MinigameActionDetail minigameDetail) return;
var region1 = R(2, 4);
var region2 = R([0, 1, 1, 2]);
var region3 = R([7, 8, 9, 9]);
var region4 = R([0, 1, 1, 2]);
var region5 = R(2, 4);
var region6 = R(4, 6);
_minigameController.Run(new MinigameController.Builder<int>()
.AddRegion(4).RegionWithText("4").RegionWithTheme(MinigameController.RegionTheme.Normal)
.AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
.AddRegion(8).RegionWithProportion(0.5f).RegionWithText("8").RegionWithTheme(MinigameController.RegionTheme.VeryGood)
.AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
.AddRegion(3).RegionWithText("3").RegionWithTheme(MinigameController.RegionTheme.NormalAlt1)
.AddRegion(5).RegionWithText("5").RegionWithTheme(MinigameController.RegionTheme.NormalAlt2)
.AddRegion(region1).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region1.ToString()).RegionWithTheme(Normal)
.AddRegion(region2).RegionWithProportion(R(1, 1.8)).RegionWithText(region2.ToString()).RegionWithTheme(Bad)
.AddRegion(region3).RegionWithProportion(R(0.3, 1)).RegionWithText(region3.ToString()).RegionWithTheme(VeryGood)
.AddRegion(region4).RegionWithProportion(R(1, 1.8)).RegionWithText(region4.ToString()).RegionWithTheme(Bad)
.AddRegion(region5).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region5.ToString()).RegionWithTheme(NormalAlt1)
.AddRegion(region6).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region6.ToString()).RegionWithTheme(NormalAlt2)
.WithHitCount(3)
).ContinueWith(task =>
{
@@ -40,4 +48,25 @@ public partial class FightMinigameHandler : Node
FightHappening.Instance.CallDeferred("DetailFilled");
});
}
}
#region Utils
// this is to make the minigame set up a bit less convoluted
private static int R(int min, int max)
{
return GD.RandRange(min, max);
}
private static float R(double min, double max)
{
return (float)GD.RandRange(min, max);
}
private static int R(List<int> list)
{
return list[GD.RandRange(0, list.Count - 1)];
}
#endregion
}
@@ -21,7 +21,7 @@ public partial class MinigameController : Node2D
God,
VeryGood
}
public class Builder<T>
{
internal class Region
@@ -108,6 +108,8 @@ public partial class MinigameController : Node2D
[Signal] public delegate void ArmMovedEventHandler(float newPos);
[Signal] public delegate void RegionHitEventHandler(int regionIndex);
public override void _EnterTree()
{
HideMinigame();
@@ -125,6 +127,7 @@ public partial class MinigameController : Node2D
ShowMinigame();
Setup(builder);
await _minigameComplete!.Task;
await ToSignal(GetTree().CreateTimer(.3), "timeout");
var returnValue = _hits!.Select(h => builder.regions[h].value).ToList();
Reset();
HideMinigame();
@@ -145,6 +148,7 @@ public partial class MinigameController : Node2D
}
_hits.Add(i);
EmitSignalRegionHit(i);
_armSpeed = -_armSpeed;
@@ -174,16 +178,18 @@ public partial class MinigameController : Node2D
// spawn regions
var regionSum = 0f;
foreach (var region in builder.regions)
foreach (var (region, i) in builder.regions.Select((region, i) => (region, i)))
{
var regionVisual = _regionVisualPrefab.Instantiate<RegionVisual>();
_regionsParent.AddChild(regionVisual);
RegionHit += regionVisual.HitAnimation;
var normalisedAngleStart = regionSum / totalRegionProportion;
var normalisedAngleEnd = (regionSum + region.proportion) / totalRegionProportion;
var normalAngles = new Vector2(normalisedAngleStart, normalisedAngleEnd);
regionVisual.Setup(normalAngles, _baseRegionColor.RandomHue(), region.text, region.theme);
regionVisual.Setup(normalAngles, region.text, region.theme, i);
regionSum += region.proportion;
@@ -207,6 +213,13 @@ public partial class MinigameController : Node2D
{
_minigameComplete = null;
_hits = null;
_regionsParent.GetChildren().ForEach(c => c.QueueFree());
_regionsParent.GetChildren().ForEach(c =>
{
if (c is RegionVisual rv)
{
RegionHit -= rv.HitAnimation;
}
c.QueueFree();
});
}
}
+22 -7
View File
@@ -1,27 +1,42 @@
using Godot;
using System;
using Babushka.scripts.CSharp.Common.Minigame;
using Godot;
using Godot.Collections;
namespace Babushka.scripts.CSharp.Common.Minigame;
public partial class RegionVisual : Node
{
[Export] private Sprite2D _sliceSprite;
[Export] private Label _textLabel;
[Export] private Node2D _labelPivot;
[Export] private Sprite2D _sliceSprite = null!;
[Export] private Label _textLabel = null!;
[Export] private Node2D _labelPivot = null!;
[Export(PropertyHint.DictionaryType)] private Dictionary<MinigameController.RegionTheme, Color> _fillColors = new();
public void Setup(Vector2 normalAngles, Color color, string regionText, MinigameController.RegionTheme regionTheme)
private int _index;
public void Setup(Vector2 normalAngles, string regionText, MinigameController.RegionTheme regionTheme, int index)
{
var mat = (_sliceSprite.Material as ShaderMaterial)!;
mat.SetShaderParameter("angles", normalAngles);
mat.SetShaderParameter("fillColor", GetFillColor(regionTheme));
var averageAngleRadians = (normalAngles.X + normalAngles.Y) * float.Pi; // '/ 2' from the average and '* 2' from the radians cancel out
// '/ 2' from the average and '* 2' from the radians cancel out
var averageAngleRadians = (normalAngles.X + normalAngles.Y) * float.Pi;
_labelPivot.Rotation = averageAngleRadians;
_textLabel.Rotation = -averageAngleRadians;
_textLabel.Text = regionText;
_index = index;
}
public void HitAnimation(int regionIndex)
{
if(regionIndex != _index) return;
var tween = GetTree().CreateTween();
tween.TweenProperty(_sliceSprite, "scale", new Vector2(1.5f, 1.5f), 0.1f);
tween.TweenProperty(_sliceSprite, "scale", new Vector2(1f, 1f), 0.2f);
}
private Color GetFillColor(MinigameController.RegionTheme theme)