Erweiterte Regeln: in jeder dritten Runde ein neutraler Wächter in jeder Lanemitte; wer beim Fall mehr Einheiten (dann mehr Leben) in 8 m hat, nimmt das Lager: Glutsegen (+10 % Schaden), Mondschild (Schild 10 %), Beute (50 Gold je Spieler). Fog of War (LuneFog, nur Darstellung): Gegner sichtbar in 9 m um eigene Einheiten, 10 m um Gebäude, 12 m um Späher; Späher (40 Gold, 3 Runden, Teamwirkung) zeigen in der Planung die gegnerische Armee ihrer Lane. HUD: Teampanel SPÄHER und LAGER, Lager-Sechseck, Nebel in Feld, Minimap, Namensschildern und Lane-Zählung. Kern 597/597 (s3 31), EditMode 33/33, PlayMode 18/18, Verify 718/0, Selbsttest 30/30, Golden 0, Fingerabdruck unverändert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113 lines
5.6 KiB
C#
113 lines
5.6 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Linq;
|
||
using Luneraria.Core;
|
||
using Luneraria.View;
|
||
using NUnit.Framework;
|
||
using UnityEngine;
|
||
using UnityEngine.TestTools;
|
||
|
||
namespace Luneraria.UI.Tests
|
||
{
|
||
/// <summary>
|
||
/// S3 in the real scene: camp guardians on the lanes in a camp round, the team panel's ward
|
||
/// and camp rows, a ward that brings the enemy army of its lane into the planning preview,
|
||
/// and the fog of war that hides enemy figures nobody of the own team sees. S3Bilder
|
||
/// (explicit) captures them at 1920×1080; LUNE_EVIDENCE names the folder below
|
||
/// docs/port/screenshots (default s3/spiel).
|
||
/// </summary>
|
||
public sealed class S3RulesViewsTests
|
||
{
|
||
static void Send(HudSession s, Command command)
|
||
{
|
||
CommandResult result = s.Match.Submit(HudSession.Human, command);
|
||
Assert.IsTrue(result.Ok, command.Type + ": " + result.Message);
|
||
s.Game.RebuildPreview();
|
||
s.Sync();
|
||
}
|
||
|
||
static IEnumerator WaitReady(HudSession s)
|
||
{
|
||
float waited = 0f;
|
||
while (s.Hud.ReadyBlocked() && waited < 5f)
|
||
{
|
||
waited += Time.unscaledDeltaTime;
|
||
yield return null;
|
||
}
|
||
}
|
||
|
||
static LuneUnitView[] Views(HudSession s)
|
||
{
|
||
return UnityEngine.Object.FindObjectsByType<LuneUnitView>(FindObjectsInactive.Include, FindObjectsSortMode.None);
|
||
}
|
||
|
||
[UnityTest, Timeout(600000)]
|
||
public IEnumerator S3Hud()
|
||
{
|
||
var s = new HudSession();
|
||
yield return s.Open(1920, 1080, seed: 4, startRound: 3, extraGold: 1000, extended: true);
|
||
Assert.IsTrue(s.Match.CampRound(3), "round 3 is a camp round");
|
||
StringAssert.Contains("diese Runde", s.Hud.Team.CampState.text, "the team panel announces the guardians");
|
||
Assert.IsTrue(HudSession.Visible(s.Hud.Lanes["mid"].CampMark), "the lane shows the camp mark");
|
||
yield return s.Starter();
|
||
s.Leave();
|
||
s.Game.Key(KeyCode.Space);
|
||
yield return HudSession.Frames(3);
|
||
Assert.AreEqual(3, s.Match.Combat.Units.Count(u => u.Kind == "camp"), "three guardians in combat");
|
||
yield return HudSession.Frames(2);
|
||
Assert.IsTrue(Views(s).Any(v => v.Unit != null && v.Unit.Kind == "camp" && v.gameObject.activeSelf), "guardians have visible figures");
|
||
Assert.IsTrue(s.Game.View.Hidden.Count > 0, "the fog hides Rot's distant units at the start");
|
||
LuneUnitView hiddenView = Views(s).First(v => v.Unit != null && s.Game.View.Hidden.Contains(v.Unit.Id));
|
||
Assert.IsFalse(hiddenView.gameObject.activeSelf, "a hidden enemy has no visible figure");
|
||
Assert.AreEqual(1, hiddenView.Unit.Team, "only enemies are hidden");
|
||
yield return s.FinishCombat();
|
||
yield return WaitReady(s);
|
||
Assert.IsTrue(s.Match.Players.Skip(3).Any(p => p.Roster.Count > 0), "Rot has a committed army now");
|
||
int enemiesBefore = s.Game.View.Preview.Units.Count(u => u.Team == 1);
|
||
Assert.AreEqual(0, enemiesBefore, "without scouting the preview shows no enemy");
|
||
Send(s, Command.Ward("mid"));
|
||
yield return HudSession.Frames(2);
|
||
Assert.IsTrue(s.Hud.Team.WardButtons["mid"].On, "the mid ward button shows the ward");
|
||
Assert.IsTrue(s.Game.View.Preview.Units.Any(u => u.Team == 1 && u.Lane == "mid"), "the ward shows Rot's mid army in the preview");
|
||
Assert.IsFalse(s.Game.View.Preview.Units.Any(u => u.Team == 1 && u.Lane == "top"), "top stays unscouted");
|
||
s.Close();
|
||
}
|
||
|
||
[UnityTest, Timeout(600000), Explicit("Bildwerkzeug: nur gezielt per -testFilter")]
|
||
public IEnumerator S3Bilder()
|
||
{
|
||
string evidence = Environment.GetEnvironmentVariable("LUNE_EVIDENCE");
|
||
string folder = "docs/port/screenshots/" + (string.IsNullOrEmpty(evidence) ? "s3/spiel" : evidence) + "/";
|
||
var s = new HudSession();
|
||
yield return s.Open(1920, 1080, seed: 4, startRound: 3, extraGold: 1000, extended: true);
|
||
yield return s.Starter();
|
||
s.Leave();
|
||
yield return new WaitForSecondsRealtime(.4f);
|
||
yield return s.Shot(folder + "01-planung-lager-angekuendigt.png");
|
||
s.Game.Key(KeyCode.Space);
|
||
yield return HudSession.Frames(2);
|
||
yield return s.Fight(7.0);
|
||
s.Driver.Paused = true;
|
||
LuneUnit camp = s.Match.Combat.Units.Where(u => u.Kind == "camp" && u.Lane == "mid").First();
|
||
s.Rig.LookAt(camp.Position, 14f, true);
|
||
yield return new WaitForSecondsRealtime(.5f);
|
||
yield return s.Shot(folder + "02-kampf-um-das-mondlager.png");
|
||
s.Rig.LookAt(camp.Position, 40f, true);
|
||
yield return new WaitForSecondsRealtime(.5f);
|
||
yield return s.Shot(folder + "03-nebel-im-kampf.png");
|
||
s.Driver.Paused = false;
|
||
yield return s.FinishCombat();
|
||
yield return WaitReady(s);
|
||
Send(s, Command.Ward("mid"));
|
||
LuneUnit enemy = s.Game.View.Preview.Units.FirstOrDefault(u => u.Team == 1 && u.Lane == "mid");
|
||
if (enemy != null)
|
||
s.Rig.LookAt(enemy.Position, 18f, true);
|
||
yield return new WaitForSecondsRealtime(.6f);
|
||
yield return s.Shot(folder + "04-spaeher-zeigt-gegnerische-aufstellung.png");
|
||
s.Hover(s.Hud.Team.WardButtons["mid"]);
|
||
yield return new WaitForSecondsRealtime(.3f);
|
||
yield return s.Shot(folder + "05-spaeher-tooltip.png");
|
||
s.Close();
|
||
}
|
||
}
|
||
}
|