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 { /// /// S4 in the real scene: the fog of war darkens the terrain outside the team's vision (light /// at the own base, dark at the enemy base), and a stunned unit shows the gold ring over its /// head. S4Bilder (explicit) captures both at 1920×1080; LUNE_EVIDENCE names the folder below /// docs/port/screenshots (default s4/spiel). /// public sealed class S4PolishViewsTests { static float AlphaAt(LuneFogOverlay fog, Vec2 point) { int side = Mathf.CeilToInt((float)(LuneMap.HalfExtent * 2.0) / LuneFogOverlay.Cell) + 1; int column = Mathf.Clamp(Mathf.RoundToInt((float)((point.X + LuneMap.HalfExtent) / LuneFogOverlay.Cell)), 0, side - 1); int row = Mathf.Clamp(Mathf.RoundToInt((float)((point.Y + LuneMap.HalfExtent) / LuneFogOverlay.Cell)), 0, side - 1); return fog.Alpha[row * side + column]; } static IEnumerator Fight(HudSession s) { yield return s.Starter(); s.Leave(); s.Game.Key(KeyCode.Space); yield return HudSession.Frames(2); yield return s.Fight(4.0); yield return HudSession.Frames(4); } [UnityTest, Timeout(600000)] public IEnumerator S4Views() { var s = new HudSession(); yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 500, extended: true); yield return Fight(s); LuneFogOverlay fog = s.Game.View.Fog; Assert.IsNotNull(fog, "an extended match with a human seat has the fog overlay"); Assert.IsTrue(fog.gameObject.activeSelf && fog.Refreshes > 0, "the fog is active and refreshed"); Assert.Less(AlphaAt(fog, s.Match.Map.CorePosition(0)), .05f, "the own Ancient stands in light"); Assert.Greater(AlphaAt(fog, s.Match.Map.CorePosition(1)), .5f, "the enemy Ancient lies in the fog"); LuneUnit victim = s.Match.Combat.Units.First(u => u.IsMobile() && u.Alive && u.Team == 0); victim.ApplyEffect("valkyrie_stun", "stun", 1.0, 3.0); yield return HudSession.Frames(3); LuneUnitView view = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None).First(v => v.Unit == victim); Transform ring = view.transform.Find("StunRing"); Assert.IsTrue(ring != null && ring.gameObject.activeSelf, "a stunned unit shows the stun ring"); s.Close(); var reference = new HudSession(); yield return reference.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 500); yield return Fight(reference); Assert.IsTrue(reference.Game.View.Fog == null || !reference.Game.View.Fog.gameObject.activeSelf, "no fog under the reference rules"); reference.Close(); } [UnityTest, Timeout(600000), Explicit("Bildwerkzeug: nur gezielt per -testFilter")] public IEnumerator S4Bilder() { string evidence = Environment.GetEnvironmentVariable("LUNE_EVIDENCE"); string folder = "docs/port/screenshots/" + (string.IsNullOrEmpty(evidence) ? "s4/spiel" : evidence) + "/"; var s = new HudSession(); yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 500, extended: true); yield return Fight(s); s.Driver.Paused = true; s.Rig.LookAt(new Vec2(0.0, 0.0), 60f, true); yield return new WaitForSecondsRealtime(.6f); yield return s.Shot(folder + "01-nebel-uebersicht.png"); LuneUnit front = s.Match.Combat.Units.Where(u => u.IsMobile() && u.Alive && u.Team == 0 && u.Lane == "mid").OrderByDescending(u => u.Progress).First(); s.Rig.LookAt(front.Position, 22f, true); yield return new WaitForSecondsRealtime(.5f); yield return s.Shot(folder + "02-nebelgrenze-mid.png"); foreach (LuneUnit unit in s.Match.Combat.Units.Where(u => u.IsMobile() && u.Alive && u.Position.DistanceTo(front.Position) < 6.0)) unit.ApplyEffect("valkyrie_stun", "stun", 1.0, 10.0); s.Rig.LookAt(front.Position, 9f, true); yield return new WaitForSecondsRealtime(.6f); yield return s.Shot(folder + "03-betaeubung.png"); s.Close(); } } }