goban
Version:
[](https://opensource.org/licenses/Apache-2.0)
265 lines (264 loc) • 8.91 kB
TypeScript
import { GobanMoveErrorMessageId } from "../GobanError";
/**
* JGOF (JSON Go Format) is an attempt at normalizing the AdHocFormat.
*/
export interface JGOF {
/** JGOF version number */
jgof: 1;
/** Player information for those playing Black */
black?: JGOFPlayer | Array<JGOFPlayer>;
/** Player information for those playing White */
white?: JGOFPlayer | Array<JGOFPlayer>;
/** Time control settings for the game */
time_control?: JGOFTimeControl;
/** Current clock information, this is used for ongoing games */
clock?: JGOFClock;
/** AI Review information computed for this game */
ai_reviews?: {
[id: string]: JGOFAIReview;
};
}
export interface JGOFIntersection {
/** Horizontal coordinate, counting left to right, starting with zero */
x: number;
/** Vertical coordinate, counting top to bottom, starting with zero */
y: number;
}
export interface JGOFSealingIntersection extends JGOFIntersection {
/** Color the intersection is probably presumed to be by the players, but
* is in fact empty. */
color: JGOFNumericPlayerColor;
}
export interface JGOFPlayer {
/** Name or username of the player */
name: string;
/** Identifier for the player */
id?: string;
}
export declare enum JGOFNumericPlayerColor {
EMPTY = 0,
BLACK = 1,
WHITE = 2
}
export interface JGOFPlayerSummary {
players: {
black: number;
white: number;
};
rengo_teams: {
black: number[];
white: number[];
};
dropped_players?: {
black?: number[];
white?: number[];
};
}
export interface JGOFMove extends JGOFIntersection {
color?: JGOFNumericPlayerColor;
timedelta?: number;
edited?: boolean;
played_by?: number;
player_update?: JGOFPlayerSummary;
blur?: number;
sgf_downloaded_by?: Array<number>;
/** Stone removal reasoning, primarily for debugging */
removal_reason?: string;
}
/*********/
/*********/
export interface JGOFClock {
/** Player to move, and thus player whose clock is running. */
current_player: "black" | "white";
/** Player ID of player to move */
current_player_id: string;
/** Time the last move was made, in milliseconds since 1970, as observed by the server. */
time_of_last_move: number;
/** Time left on blacks clock. */
black_clock: JGOFPlayerClock;
/** Time left on whites clock. */
white_clock: JGOFPlayerClock;
/**
* True if the game has not begun yet and we are waiting for the first
* move to be played. If this is true, `start_time_left` will be set.
*/
start_mode?: boolean;
/**
* If `start_mode` is true, this is the number of milliseconds left
* on the start clock, when the clock reaches zero the game will be
* canceled.
*/
start_time_left?: number;
/**
* If `pause_State.stone_removal` is true, this is the number of
* milliseconds left before the result is automatically accepted.
*/
stone_removal_time_left?: number;
/** Time the game was paused, in milliseconds since 1970, as observed by the server */
paused_since?: number;
/** If this field is set, the game clocks are paused for one or more reasons. */
pause_state?: JGOFPauseState;
}
export interface JGOFPlayerClock {
/** Main time left on the clock, in milliseconds. */
main_time: number;
/** Used with byo-yomi time control. Number of periods left. */
periods_left?: number;
/** Used with byo-yomi time control. Time left on the period time, in milliseconds. */
period_time_left?: number;
/**
* Used with canadian time control. Number of moves left before a new
* block of time.
*/
moves_left?: number;
/**
* Used with canadian time control. Time left in milliseconds to make the
* remainder of your moves in the current block
*/
block_time_left?: number;
}
export interface JGOFPauseState {
/** Paused because the game is in the stone removal phase */
stone_removal?: true;
/** Paused because one or more players is on vacation */
vacation?: {
/** Player id that is on vacation */
[player_id: string]: true;
};
/** Paused by the server */
server?: true;
/** Paused because it is the weekend */
weekend?: true;
/** Paused by a player. The game can only be paused by one player at a time. */
player?: {
/** Player id of the player who paused the game. */
player_id: string;
/** Number of pauses left for the pausing player. */
pauses_left: number;
};
/** Paused by a moderator, value of this field is the moderator's id */
moderator?: string;
}
export type JGOFTimeControlSpeed = "blitz" | "rapid" | "live" | "correspondence";
export type JGOFTimeControlSystem = "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none";
export interface JGOFFischerTimeControl {
system: "fischer";
speed: JGOFTimeControlSpeed;
initial_time: number;
time_increment: number;
max_time: number;
pause_on_weekends: boolean;
}
export interface JGOFByoYomiTimeControl {
system: "byoyomi";
speed: JGOFTimeControlSpeed;
main_time: number;
period_time: number;
periods: number;
pause_on_weekends: boolean;
}
export interface JGOFCanadianTimeControl {
system: "canadian";
speed: JGOFTimeControlSpeed;
main_time: number;
period_time: number;
stones_per_period: number;
pause_on_weekends: boolean;
}
export interface JGOFSimpleTimeControl {
system: "simple";
speed: JGOFTimeControlSpeed;
per_move: number;
pause_on_weekends: boolean;
}
export interface JGOFAbsoluteTimeControl {
system: "absolute";
speed: JGOFTimeControlSpeed;
total_time: number;
pause_on_weekends: boolean;
}
export interface JGOFNoneTimeControl {
system: "none";
speed: "correspondence";
pause_on_weekends: boolean;
}
export type JGOFTimeControl = JGOFFischerTimeControl | JGOFByoYomiTimeControl | JGOFSimpleTimeControl | JGOFCanadianTimeControl | JGOFAbsoluteTimeControl | JGOFNoneTimeControl;
/******/
/******/
export interface JGOFAIReview {
id: string;
uuid: string;
/**
* A fast review typically only has a few moves reviewed, whereas a full
* review is expected to have every move reviewed. Note that this sets an
* expectation but not a requirement on what values are stored in `moves`,
* and while games are being reviewed these objects will have zero or more
* entries in `moves` regardless of the type.
*/
type: "fast" | "full";
engine: string;
engine_version: string;
network: string;
network_size: string;
strength: number;
/** millisecond epoch time (ms from 1970 UTC) */
date: number;
/** predicted probability that black will win the last move */
win_rate: number;
/** predicted probability that black will win for all moves */
win_rates?: Array<number>;
/** predicted scores that black will win or lose by (negative for loss) for all moves */
scores?: Array<number>;
/** Analysis of moves in the game. */
moves: {
[move_number: string]: JGOFAIReviewMove;
};
/** Analysis of variations in the game. */
analyzed_variations?: {
[var_key: string]: JGOFAIReviewMove;
};
/** If there was an error processing the review, it can be stored here */
error?: {
message_id: GobanMoveErrorMessageId;
move_number: number;
coords: string;
};
}
export interface JGOFAIReviewMove {
/**
* The move number. This is 1 indexed.
*/
move_number: number;
/** The move that was played. */
move: JGOFIntersection;
/** Probability of black winning after this move was made */
win_rate: number;
/** How many points black is predicted to win by (if positive, lose by if negative) */
score?: number;
/** Followup move branches explored */
branches: Array<JGOFAIReviewMoveVariation>;
/** A width*height array of ownership values */
ownership?: Array<Array<number>>;
}
export interface JGOFAIReviewMoveVariation {
/** Followup predicted moves by the AI */
moves: Array<JGOFIntersection>;
/** Probability of black wining to report for this variation */
win_rate: number;
/** How many points black is predicted to win for this variation (or lose by if negative) */
score?: number;
/** Number of times the AI considered the first move of this variation */
visits: number;
/** lower confidence bound, both KataGo and LeelaZero provide this */
lcb?: number;
/** From KataGo */
score_mean?: number;
/** From KataGo */
score_stdev?: number;
/** From KataGo */
utility?: number;
/** From KataGo */
utility_lcb?: number;
/** From Leela Zero */
policy?: number;
}