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">
|
||||
import PlayerLog from "./log_viewer/PlayerLog.svelte";
|
||||
|
||||
export let matchData: object;
|
||||
export let matchLog: string;
|
||||
</script>
|
||||
|
||||
<div class="output-pane">
|
||||
<h3 class="output-header">Player log</h3>
|
||||
<PlayerLog {matchLog} playerId={1} />
|
||||
<PlayerLog {matchData} {matchLog} playerId={1} />
|
||||
</div>
|
||||
|
||||
<style lang="scss">
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
<script lang="ts">
|
||||
import type { PlayerLogTurn } from "$lib/log_parser";
|
||||
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 logTurn: PlayerLogTurn;
|
||||
export let copyTurn: () => void;
|
||||
let expanded = false;
|
||||
|
||||
const PLURAL_MAP = {
|
||||
|
@ -49,8 +50,13 @@
|
|||
</div>
|
||||
{#if expanded}
|
||||
<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-header">dispatches</div>
|
||||
{#each logTurn.action.dispatches as dispatch}
|
||||
<div class="dispatch">
|
||||
<div class="dispatch-text">
|
||||
|
@ -102,6 +108,16 @@
|
|||
background-color: #333;
|
||||
}
|
||||
|
||||
.copy-turn {
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.copy-turn:hover {
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.turn-header-text {
|
||||
color: #eee;
|
||||
font-size: 14px;
|
||||
|
@ -111,15 +127,22 @@
|
|||
|
||||
.turn-content {
|
||||
margin-bottom: 12px;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.turn-error {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.dispatches-header {
|
||||
color: #fff;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
.dispatch {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
.dispatch-error {
|
||||
|
|
|
@ -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 {
|
||||
|
@ -25,7 +53,7 @@
|
|||
{#key playerId}
|
||||
<div class="log-contents">
|
||||
{#each playerLog as logTurn, turnNum}
|
||||
<LogTurn {logTurn} {turnNum} />
|
||||
<LogTurn {logTurn} {turnNum} copyTurn={() => copyTurn(turnNum)} />
|
||||
{/each}
|
||||
</div>
|
||||
{/key}
|
||||
|
|
|
@ -157,7 +157,7 @@
|
|||
</div>
|
||||
<div class="sidebar-right">
|
||||
{#if viewMode === ViewMode.MatchVisualizer}
|
||||
<OutputPane matchLog={selectedMatchLog} />
|
||||
<OutputPane matchData={selectedMatch} matchLog={selectedMatchLog} />
|
||||
{:else if viewMode === ViewMode.Editor}
|
||||
<SubmitPane {editSession} on:matchCreated={onMatchCreated} />
|
||||
{/if}
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
{/if}
|
||||
</div>
|
||||
<div class="player-log">
|
||||
<PlayerLog {matchLog} playerId={selectedPlayer?.["playerId"]} />
|
||||
<PlayerLog {matchData} {matchLog} playerId={selectedPlayer?.["playerId"]} />
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
|
Loading…
Reference in a new issue