public virtual async Task TakeAction(IActionFactory factory, SelfCtx ctx) { var oldActionGuid = CurrentActionId; // capture old CurrentActionId = Guid.NewGuid(); // set new try { RemoveFromUnresolvedActions(factory); // removing first, so action can restore it if desired await factory.ActivateAsync(ctx); if (factory is IRecordLastTarget lastTargetRecorder) { await ActionTaken_ThisRound.InvokeAsync(new ActionTaken(factory, lastTargetRecorder.LastTarget)); } } finally { CurrentActionId = oldActionGuid; // restore } ctx.GameState.CheckWinLoss(); // @@@ }