From 4aa8ca8303b5d25b745e8cae71e283455945bdd1 Mon Sep 17 00:00:00 2001
From: Ilion Beyst <ilion.beyst@gmail.com>
Date: Sun, 13 Nov 2022 10:05:15 +0100
Subject: copy input gamestate from player log

---
 .../src/lib/components/log_viewer/PlayerLog.svelte | 38 +++++++++++++++++++---
 1 file changed, 33 insertions(+), 5 deletions(-)

(limited to 'web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte')

diff --git a/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte b/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte
index 450fdf2..f21a038 100644
--- a/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte
+++ b/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte
@@ -3,11 +3,39 @@
   import LogTurn from "./LogTurn.svelte";
 
   export let matchLog: string;
+  export let matchData: object;
   export let playerId: number;
 
   let playerLog: PlayerLog;
   let showRawStderr = false;
 
+  async function copyTurn(turnNum: number) {
+    // find state for turnNum
+    let gamestate = matchLog
+      .split("\n")
+      .slice(0, -1)
+      .map((line) => JSON.parse(line))
+      .filter((json) => json["type"] == "gamestate")
+      .at(turnNum);
+
+    let numPlayers = matchData["players"].length;
+    let rotatePlayerNum = (playerNum: number | null) => {
+      if (playerNum === null) {
+        return null;
+      }
+      return ((numPlayers + playerNum - playerId) % numPlayers) + 1;
+    };
+
+    gamestate["planets"].forEach((planet) => {
+      planet["owner"] = rotatePlayerNum(planet["owner"]);
+    });
+    gamestate["expeditions"].forEach((expedition) => {
+      expedition["owner"] = rotatePlayerNum(expedition["owner"]);
+    });
+
+    await navigator.clipboard.writeText(JSON.stringify(gamestate));
+  }
+
   $: if (matchLog) {
     playerLog = parsePlayerLog(playerId, matchLog);
   } else {
@@ -23,11 +51,11 @@
   {:else}
     <!-- The log should be rerendered when playerId changes -->
     {#key playerId}
-    <div class="log-contents">
-      {#each playerLog as logTurn, turnNum}
-        <LogTurn {logTurn} {turnNum} />
-      {/each}
-    </div>
+      <div class="log-contents">
+        {#each playerLog as logTurn, turnNum}
+          <LogTurn {logTurn} {turnNum} copyTurn={() => copyTurn(turnNum)} />
+        {/each}
+      </div>
     {/key}
   {/if}
 </div>
-- 
cgit v1.2.3

