Draw broken objects as fragments, plane tiles for fences and walls, tileset publishing; mod documentation
This commit is contained in:
1 parent
e153dc9b15
commit
7b28c1bb0a
74 files changed
+2782
-886
No files matched your search
@@ -0,0 +1,52 @@
|
||||
namespace Cthangover.Mods.Rpg.Tests
|
||||
{
|
||||
using Cthangover.Core.Mods.Testing;
|
||||
using Cthangover.Mods.TileRender;
|
||||
using Godot;
|
||||
|
||||
/// <summary>Replacing real renderer instances cannot change the logical actor clock.</summary>
|
||||
public class RpgActorPresentationTests
|
||||
{
|
||||
private static Node2D Actor(ITileWorldPresentation view) => (Node2D)view.Root.GetNode("Actors").GetChild(0);
|
||||
|
||||
[ModTest("actor_presentation/recreation_keeps_inflight_state")]
|
||||
static void RecreationKeepsInflightState(ModTestContext ctx)
|
||||
{
|
||||
var state = new RpgActorState { Speed = 2 };
|
||||
state.Place(new Vector2I(1, 1), RpgDirection.Right);
|
||||
state.StepTo(RpgDirection.Right);
|
||||
state.Advance(0.25);
|
||||
using var image = Image.CreateEmpty(1, 1, false, Image.Format.Rgba8);
|
||||
image.Fill(Colors.White);
|
||||
using var texture = ImageTexture.CreateFromImage(image);
|
||||
var frame = new TileFrame();
|
||||
var pose = new TileActorPose { Id = "player", Visible = true, Position = state.Position,
|
||||
Look = new TileVisual { Texture = texture, Bounds = new Rect2(0, 0, 1, 1), Source = new Rect2(0, 0, 1, 1) } };
|
||||
frame.Actors.Add(pose);
|
||||
var first = TileRendererRegistry.Instance.Resolve("topdown").Create();
|
||||
try
|
||||
{
|
||||
first.Mount(new TileRenderScene { Size = new Vector2I(8, 8), TileSize = 32, Zoom = 1 });
|
||||
first.Present(frame, 0);
|
||||
first.Present(frame, 0);
|
||||
ModAssert.CloseTo(48, Actor(first).Position.X, what: "first projection");
|
||||
ModAssert.CloseTo(1.5, state.Position.X, what: "presenting twice does not tick");
|
||||
}
|
||||
finally { first.Dispose(); }
|
||||
|
||||
var second = TileRendererRegistry.Instance.Resolve("topdown").Create();
|
||||
try
|
||||
{
|
||||
second.Mount(new TileRenderScene { Size = new Vector2I(8, 8), TileSize = 64, Zoom = 1 });
|
||||
second.Present(frame, 0);
|
||||
ModAssert.CloseTo(96, Actor(second).Position.X, what: "another projection uses the same pose");
|
||||
ModAssert.True(state.IsMoving, "freeing the old presentation does not cancel the step");
|
||||
ModAssert.True(state.Advance(0.25), "remaining duration is preserved");
|
||||
pose.Position = state.Position;
|
||||
second.Present(frame, 0);
|
||||
ModAssert.CloseTo(128, Actor(second).Position.X, what: "arrival updates the replacement");
|
||||
}
|
||||
finally { second.Dispose(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user