copy input gamestate from player log
This commit is contained in:
parent
b0530be501
commit
4aa8ca8303
5 changed files with 62 additions and 10 deletions
|
@ -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">
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
Loading…
Reference in a new issue