feat(battle-node): cross-side gift + Echo-frame token mining
Close the two generated-token gaps that desynced PvP live test #3 (the Forestcraft Fairy), both sourced from the 2026-06-03 decomp-validation table. - MineAddOps now returns (idx, cardId, isSelf) and no longer drops isSelf:0. isSelf is the sender's perspective tag on CardObj.IsPlayer (RegisterToken.cs:22) and a card has one CardObj.Index, so an isSelf:0 add is the opponent's card. - New shared BattleSessionState.RecordTokensFrom routes isSelf:1 -> sender, isSelf:0 -> opponent (the gift lives in the recipient's map, consulted when they play it). PlayActionsHandler delegates to it. - EchoHandler now mines via the same helper but still returns no routes. An Echo's orderList carries the same add-op shape as a send (MakeEchoData -> MakeCommonSendAndEchoCardData), so MineAddOps applies verbatim; mining != relaying. Choice/copy/private-group adds stay skipped (no concrete cardId). Full solution 963/963 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -129,15 +129,18 @@ public class KnownListBuilderTests
|
||||
var orderList = new List<object?> { AddOp(new[] { 31L, 32L }, 900111010L) };
|
||||
var mined = KnownListBuilder.MineAddOps(orderList).ToList();
|
||||
|
||||
Assert.That(mined, Is.EquivalentTo(new[] { (31, 900111010L), (32, 900111010L) }));
|
||||
Assert.That(mined, Is.EquivalentTo(new[] { (31, 900111010L, 1), (32, 900111010L, 1) }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MineAddOps_skips_add_ops_for_the_opponent_isSelf_0()
|
||||
public void MineAddOps_yields_cross_side_gifts_with_isSelf_0()
|
||||
{
|
||||
// A card given to the opponent (isSelf:0) belongs in the other side's map — deferred.
|
||||
// A card gifted to the opponent (isSelf:0) is the opponent's card at this idx (isSelf is the
|
||||
// sender's perspective tag on CardObj.IsPlayer — RegisterToken.cs:22). The extractor surfaces
|
||||
// it; the caller routes it into the OTHER side's map.
|
||||
var orderList = new List<object?> { AddOp(new[] { 31L }, 900111010L, isSelf: 0) };
|
||||
Assert.That(KnownListBuilder.MineAddOps(orderList), Is.Empty);
|
||||
Assert.That(KnownListBuilder.MineAddOps(orderList),
|
||||
Is.EquivalentTo(new[] { (31, 900111010L, 0) }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -200,6 +203,6 @@ public class KnownListBuilderTests
|
||||
AddOp(new[] { 32L }, 900811090L),
|
||||
};
|
||||
var mined = KnownListBuilder.MineAddOps(orderList).ToList();
|
||||
Assert.That(mined, Is.EquivalentTo(new[] { (31, 900111010L), (32, 900811090L) }));
|
||||
Assert.That(mined, Is.EquivalentTo(new[] { (31, 900111010L, 1), (32, 900811090L, 1) }));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user