copy input gamestate from player log

This commit is contained in:
Ilion Beyst 2022-11-13 10:05:15 +01:00
parent b0530be501
commit 4aa8ca8303
5 changed files with 62 additions and 10 deletions

View file

@ -1,12 +1,13 @@
<script lang="ts"> <script lang="ts">
import PlayerLog from "./log_viewer/PlayerLog.svelte"; import PlayerLog from "./log_viewer/PlayerLog.svelte";
export let matchData: object;
export let matchLog: string; export let matchLog: string;
</script> </script>
<div class="output-pane"> <div class="output-pane">
<h3 class="output-header">Player log</h3> <h3 class="output-header">Player log</h3>
<PlayerLog {matchLog} playerId={1} /> <PlayerLog {matchData} {matchLog} playerId={1} />
</div> </div>
<style lang="scss"> <style lang="scss">

View file

@ -1,10 +1,11 @@
<script lang="ts"> <script lang="ts">
import type { PlayerLogTurn } from "$lib/log_parser"; import type { PlayerLogTurn } from "$lib/log_parser";
import Fa from "svelte-fa"; import Fa from "svelte-fa";
import { faAngleRight, faAngleDown } from "@fortawesome/free-solid-svg-icons"; import { faAngleRight, faAngleDown, faCopy } from "@fortawesome/free-solid-svg-icons";
export let turnNum: number; export let turnNum: number;
export let logTurn: PlayerLogTurn; export let logTurn: PlayerLogTurn;
export let copyTurn: () => void;
let expanded = false; let expanded = false;
const PLURAL_MAP = { const PLURAL_MAP = {
@ -49,8 +50,13 @@
</div> </div>
{#if expanded} {#if expanded}
<div class="turn-content"> <div class="turn-content">
{#if logTurn.action?.type === "dispatches"} <div class="copy-turn" on:click={copyTurn}>
<Fa icon={faCopy} />
copy turn to clipboard
</div>
{#if logTurn.action?.type === "dispatches" && logTurn.action.dispatches.length > 0}
<div class="dispatches-container"> <div class="dispatches-container">
<div class="dispatches-header">dispatches</div>
{#each logTurn.action.dispatches as dispatch} {#each logTurn.action.dispatches as dispatch}
<div class="dispatch"> <div class="dispatch">
<div class="dispatch-text"> <div class="dispatch-text">
@ -102,6 +108,16 @@
background-color: #333; background-color: #333;
} }
.copy-turn {
margin: 4px 0;
}
.copy-turn:hover {
text-decoration: underline;
cursor: pointer;
color: #fff;
}
.turn-header-text { .turn-header-text {
color: #eee; color: #eee;
font-size: 14px; font-size: 14px;
@ -111,15 +127,22 @@
.turn-content { .turn-content {
margin-bottom: 12px; margin-bottom: 12px;
margin-left: 8px;
} }
.turn-error { .turn-error {
color: red; color: red;
} }
.dispatches-header {
color: #fff;
padding-top: 4px;
}
.dispatch { .dispatch {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
padding-left: 8px;
} }
.dispatch-error { .dispatch-error {

View file

@ -3,11 +3,39 @@
import LogTurn from "./LogTurn.svelte"; import LogTurn from "./LogTurn.svelte";
export let matchLog: string; export let matchLog: string;
export let matchData: object;
export let playerId: number; export let playerId: number;
let playerLog: PlayerLog; let playerLog: PlayerLog;
let showRawStderr = false; 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) { $: if (matchLog) {
playerLog = parsePlayerLog(playerId, matchLog); playerLog = parsePlayerLog(playerId, matchLog);
} else { } else {
@ -23,11 +51,11 @@
{:else} {:else}
<!-- The log should be rerendered when playerId changes --> <!-- The log should be rerendered when playerId changes -->
{#key playerId} {#key playerId}
<div class="log-contents"> <div class="log-contents">
{#each playerLog as logTurn, turnNum} {#each playerLog as logTurn, turnNum}
<LogTurn {logTurn} {turnNum} /> <LogTurn {logTurn} {turnNum} copyTurn={() => copyTurn(turnNum)} />
{/each} {/each}
</div> </div>
{/key} {/key}
{/if} {/if}
</div> </div>

View file

@ -157,7 +157,7 @@
</div> </div>
<div class="sidebar-right"> <div class="sidebar-right">
{#if viewMode === ViewMode.MatchVisualizer} {#if viewMode === ViewMode.MatchVisualizer}
<OutputPane matchLog={selectedMatchLog} /> <OutputPane matchData={selectedMatch} matchLog={selectedMatchLog} />
{:else if viewMode === ViewMode.Editor} {:else if viewMode === ViewMode.Editor}
<SubmitPane {editSession} on:matchCreated={onMatchCreated} /> <SubmitPane {editSession} on:matchCreated={onMatchCreated} />
{/if} {/if}

View file

@ -101,7 +101,7 @@
{/if} {/if}
</div> </div>
<div class="player-log"> <div class="player-log">
<PlayerLog {matchLog} playerId={selectedPlayer?.["playerId"]} /> <PlayerLog {matchData} {matchLog} playerId={selectedPlayer?.["playerId"]} />
</div> </div>
</div> </div>
{/if} {/if}