Bind player commands to canonical actor identity

This commit is contained in:
Meta Vens 2026-08-18 20:21:45 +02:00
commit 624ded4aaf
2 changed files with 18 additions and 1 deletions

View file

@ -56,6 +56,7 @@ pub fn player_surface(campaign: &Campaign, narrations: &[NarrationProjection]) -
"type":"surface-state", "schema":"gamecult.eve.surface.v1", "providerId":"gamecult.ghostlight.dungeon",
"providerKind":"narrative.simulation", "title":campaign.name, "version":interface_version,
"world_revision":campaign.revision,
"player_actor_id":campaign.player_actor_id,
"resolution":{
"policy":campaign.resolution_policy,
"effective_budget":effective_budget,
@ -295,4 +296,17 @@ mod tests {
);
assert!(!values.iter().any(|value| value.contains("raw outcome")));
}
#[test]
fn player_surface_projects_the_canonical_player_actor_id() {
let mut campaign = crate::resolution::tests::campaign(1, 1);
let mut player = campaign.actors.remove("player").unwrap();
player.id = "pilot-nyx".into();
campaign.player_actor_id = player.id.clone();
campaign.actors.insert(player.id.clone(), player);
let surface = player_surface(&campaign, &[]);
assert_eq!(surface["player_actor_id"], "pilot-nyx");
}
}

View file

@ -12,6 +12,7 @@ const compilerResults = document.querySelector<HTMLElement>("#compiler-results")
const campaignLab = document.querySelector<HTMLElement>("#campaign-lab")!;
const campaignList = document.querySelector<HTMLElement>("#campaign-list")!;
let revision = 0;
let playerActorId = "";
let resolutionEpoch = 0;
let providerConfigurationEpoch = 0;
let resolutionPins: any[] = [];
@ -102,6 +103,8 @@ async function refresh() {
compiler.hidden = !needsCompilation; composer.hidden = needsCompilation; destinationForm.hidden = needsCompilation; host.hidden = needsCompilation; campaignLab.hidden = needsCompilation;
if (needsCompilation) { status.textContent = "No campaign exists. Retrieve the Vault and approve a world seed."; return; }
revision = Number(surface.world_revision ?? surface.version ?? 0);
playerActorId = String(surface.player_actor_id ?? "");
if (!playerActorId) throw new Error("Campaign surface omitted its canonical player actor ID.");
resolutionEpoch = Number(surface.resolution?.policy?.resolution_epoch ?? 0);
providerConfigurationEpoch = Number(surface.resolution?.policy?.provider_configuration_epoch ?? 0);
resolutionPins = surface.resolution?.pins ?? [];
@ -229,7 +232,7 @@ composer.addEventListener("submit", async event => {
event.preventDefault();
const text = document.querySelector<HTMLTextAreaElement>("#attempt")!.value.trim();
if (!text) return;
installAssessment(await send({ type: "assess", expected_revision: revision, intent: { actor_id: "player", description: text, intended_effect: text } }));
installAssessment(await send({ type: "assess", expected_revision: revision, intent: { actor_id: playerActorId, description: text, intended_effect: text } }));
});
document.querySelector<HTMLButtonElement>("#wait")!.addEventListener("click", () => void send({ type: "wait", expected_revision: revision, minutes: 60 }));
document.querySelector<HTMLInputElement>("#active-cell-budget")!.addEventListener("input", event => {