Night check and shot; battle shot waits for the intro

This commit is contained in:
cthangover committed 2026-10-24 12:56:11 +02:00
1 parent 00376b0fe7
commit 915cb885b6
1 file changed
+39 -2
+39 -2
View File
@@ -32,6 +32,9 @@ namespace Cthangover.Mods.RpgPlus.Tests
public partial class RpgPlusTestDriver : Node public partial class RpgPlusTestDriver : Node
{ {
private const float TickSeconds = 0.1f; private const float TickSeconds = 0.1f;
// The battle opens with an intro animation (the backdrop zooms in): shots wait it out.
private const int BattleIntroTicks = 20;
private const float TimeoutSeconds = 150f; private const float TimeoutSeconds = 150f;
private const string Hero = "rpg_hero"; private const string Hero = "rpg_hero";
private const string Crossroads = "rpg_plus_crossroads"; private const string Crossroads = "rpg_plus_crossroads";
@@ -54,6 +57,8 @@ namespace Cthangover.Mods.RpgPlus.Tests
private int step; private int step;
private int waitTicks; private int waitTicks;
private int pagesPhase; private int pagesPhase;
private int nightPhase;
private long savedTime;
private double pagesWait; private double pagesWait;
private bool slimeMoved; private bool slimeMoved;
private int coinsBeforeChest; private int coinsBeforeChest;
@@ -138,7 +143,7 @@ namespace Cthangover.Mods.RpgPlus.Tests
case 3: case 3:
if (GetTree().CurrentScene is not BattleSceneContext battle) if (GetTree().CurrentScene is not BattleSceneContext battle)
return; return;
if (battle.ActiveBattleCore is not IBattleAutoPlayable auto || !auto.IsWaitingForPlayerInput || GodotSceneService.IsTransitioning) if (battle.ActiveBattleCore is not IBattleAutoPlayable auto || !auto.IsWaitingForPlayerInput || GodotSceneService.IsTransitioning || ++waitTicks < BattleIntroTicks)
return; return;
Shot("battle"); Shot("battle");
CheckBattle(); CheckBattle();
@@ -157,7 +162,7 @@ namespace Cthangover.Mods.RpgPlus.Tests
Godot.Engine.TimeScale = 1; Godot.Engine.TimeScale = 1;
// The victory is taken by the platform's shortcut (the wolf is not killed), so it // The victory is taken by the platform's shortcut (the wolf is not killed), so it
// awards no exp; the exp path is the training yard below. // awards no exp; the exp path is the training yard below.
if (!CheckPagesAndRoute()) if (!CheckPagesAndRoute() || !CheckNight())
return; return;
Check(Flag(WinFlag) == "1", "the win flag is set after the victory"); Check(Flag(WinFlag) == "1", "the win flag is set after the victory");
// To the trainer, added to the demo's village by this mod's own map events file. // To the trainer, added to the demo's village by this mod's own map events file.
@@ -397,6 +402,38 @@ namespace Cthangover.Mods.RpgPlus.Tests
} }
} }
/// <summary>
/// Light of the map (rpg): at 23:00 the layers and actors share one lit material with
/// night weights, and the player's glow, the lamp and the windows of the village tileset
/// are lit. Shot "night" next to the lamp; the clock is put back afterwards.
/// </summary>
private bool CheckNight()
{
var time = GameData.Instance.Runtime.Time;
switch (nightPhase)
{
case 0:
savedTime = time.Tick;
time.SetTime(savedTime - savedTime % (24 * 60) + 23 * 60);
View.PlacePlayer(12, 9, RpgDirection.Up);
nightPhase++;
return false;
case 1:
var material = View.GetNodeOrNull<TileMapLayer>("Main")?.Material as ShaderMaterial;
Check(material != null, "the tiles have the map's light material");
Check(material != null && View.Player.Material == material, "the player shares it");
var weights = material?.GetShaderParameter("time_weights").AsVector4() ?? Vector4.Zero;
Check(Mathf.IsEqualApprox(weights.W, 1f), "23:00 lights the map as night");
Check((material?.GetShaderParameter("light_count").AsInt32() ?? 0) >= 4, "the player, the lamp and windows give light");
Shot("night");
time.SetTime(savedTime);
nightPhase++;
return true;
default:
return true;
}
}
private bool AdvanceDialog() private bool AdvanceDialog()
{ {
var box = Box; var box = Box;