diff --git a/docs/assets/search.js b/docs/assets/search.js index d110da5a..879eec1e 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/BoardState.html b/docs/classes/BoardState.html index c95cab7b..5804e961 100644 --- a/docs/classes/BoardState.html +++ b/docs/classes/BoardState.html @@ -1,4 +1,4 @@ -BoardState | goban

Class BoardState

Hierarchy (view full)

Implements

Constructors

constructor +BoardState | goban

Class BoardState

Hierarchy (view full)

Implements

Constructors

Properties

black_prisoners board board_is_repeating @@ -25,23 +25,23 @@ default to 19x19 if no board is provided.

Any state matrices (board, removal, etc..) provided will be cloned and must have the same dimensionality.

-

Parameters

Returns BoardState

Properties

black_prisoners: number
board_is_repeating: boolean
goban_callback?: GobanBase
height: number = 19
removal: boolean[][]
white_prisoners: number
width: number = 19

Methods

  • Returns true if the .board field from the other board is equal to this one

    -

    Parameters

    Returns boolean

Properties

black_prisoners: number
board_is_repeating: boolean
goban_callback?: GobanBase
height: number = 19
removal: boolean[][]
white_prisoners: number
width: number = 19

Methods

  • Returns true if the .board field from the other board is equal to this one

    +

    Parameters

    Returns boolean

  • Computes scoring locations for the board. If area_scoring is true, we will use area scoring rules, otherwise we will use territory scoring rules (which implies omitting territory in seki).

    -

    Parameters

    • area_scoring: boolean

    Returns ScoringLocations

  • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

    -

    Parameters

    • x: number
    • y: number
    • force_removal: boolean = false

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

\ No newline at end of file +

Parameters

  • x: number
  • y: number
  • force_removal: boolean = false

Returns {
    group: RawStoneString;
    removed: boolean;
}

\ No newline at end of file diff --git a/docs/classes/ConditionalMoveTree.html b/docs/classes/ConditionalMoveTree.html index 18878047..f60224b8 100644 --- a/docs/classes/ConditionalMoveTree.html +++ b/docs/classes/ConditionalMoveTree.html @@ -1,4 +1,4 @@ -ConditionalMoveTree | goban

Class ConditionalMoveTree

Constructors

constructor +ConditionalMoveTree | goban

Class ConditionalMoveTree

Constructors

Properties

Constructors

Properties

children: {
    [move: string]: ConditionalMoveTree;
}

Type declaration

move: null | string

Methods

\ No newline at end of file +

Constructors

Properties

children: {
    [move: string]: ConditionalMoveTree;
}

Type declaration

move: null | string

Methods

\ No newline at end of file diff --git a/docs/classes/Goban.html b/docs/classes/Goban.html index 47aea3b9..b3e6ddd0 100644 --- a/docs/classes/Goban.html +++ b/docs/classes/Goban.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
analysis_scoring_color?: string
analysis_scoring_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
analysis_scoring_color?: string
analysis_scoring_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

Methods

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

Methods

\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanBase.html b/docs/classes/GobanBase.html index 9a0795d0..7671cb5d 100644 --- a/docs/classes/GobanBase.html +++ b/docs/classes/GobanBase.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

Constructors

Properties

_destroyed: boolean = false
engine: GobanEngine
goban_id: number = ++last_goban_id

Base fields *

-
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

_destroyed: boolean = false
engine: GobanEngine
goban_id: number = ++last_goban_id

Base fields *

+
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

Methods

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

Methods

\ No newline at end of file +

Parameters

Returns JGOFMove

\ No newline at end of file diff --git a/docs/classes/GobanCanvas.html b/docs/classes/GobanCanvas.html index d9a6aec7..5b391806 100644 --- a/docs/classes/GobanCanvas.html +++ b/docs/classes/GobanCanvas.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Implements

Constructors

Hierarchy (view full)

Implements

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__borders_initialized: boolean = false
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__set_board_height: number = -1
__set_board_width: number = -1
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
autoplaying_puzzle_move: boolean = false
board: HTMLCanvasElement
bounded_height: number
bounded_width: number
bounds: GobanBounds
byoyomi_label: string = ""
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
ctx: CanvasRenderingContext2D
current_cmove?: ConditionalMoveTree
current_pen_mark?: {
    color: string;
    points: [number, number];
}

Type declaration

  • color: string
  • points: [number, number]
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
drawing_enabled: boolean = true
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
handleShiftKey: ((ev) => void)

Type declaration

    • (ev): void
    • Parameters

      • ev: KeyboardEvent

      Returns void

heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
labeling_mode?: "put" | "clear"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_label_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
last_move?: MoveTree
last_move_opacity: number = 1
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_pen_position?: [number, number]
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
message_div?: HTMLDivElement
message_td?: HTMLElement
message_text?: HTMLDivElement
message_timeout?: number
metrics: GobanMetrics = ...
move_selected?: JGOFIntersection
move_tree_canvas?: HTMLCanvasElement
move_tree_container?: HTMLElement
move_tree_inner_container?: HTMLDivElement
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_ctx?: CanvasRenderingContext2D
pen_layer?: HTMLCanvasElement
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
ready_to_draw: boolean = false
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shadow_ctx?: CanvasRenderingContext2D
shadow_layer?: HTMLCanvasElement
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
theme_black: GobanTheme
theme_black_stones: any[] = []
theme_black_text_color: string = HOT_PINK
theme_blank_text_color: string = HOT_PINK
theme_board: GobanTheme
theme_faded_line_color: string = HOT_PINK
theme_faded_star_color: string = HOT_PINK
theme_line_color: string = ""
theme_star_color: string = ""
theme_stone_radius: number = 10
theme_white: GobanTheme
theme_white_stones: any[] = []
theme_white_text_color: string = HOT_PINK
themes: GobanSelectedThemes = ...
title_div?: HTMLElement
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__borders_initialized: boolean = false
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__set_board_height: number = -1
__set_board_width: number = -1
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
autoplaying_puzzle_move: boolean = false
board: HTMLCanvasElement
bounded_height: number
bounded_width: number
bounds: GobanBounds
byoyomi_label: string = ""
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
ctx: CanvasRenderingContext2D
current_cmove?: ConditionalMoveTree
current_pen_mark?: {
    color: string;
    points: [number, number];
}

Type declaration

  • color: string
  • points: [number, number]
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
drawing_enabled: boolean = true
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
handleShiftKey: ((ev) => void)

Type declaration

    • (ev): void
    • Parameters

      • ev: KeyboardEvent

      Returns void

heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
labeling_mode?: "put" | "clear"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_label_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
last_move?: MoveTree
last_move_opacity: number = 1
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_pen_position?: [number, number]
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
message_div?: HTMLDivElement
message_td?: HTMLElement
message_text?: HTMLDivElement
message_timeout?: number
metrics: GobanMetrics = ...
move_selected?: JGOFIntersection
move_tree_canvas?: HTMLCanvasElement
move_tree_container?: HTMLElement
move_tree_inner_container?: HTMLDivElement
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_ctx?: CanvasRenderingContext2D
pen_layer?: HTMLCanvasElement
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
ready_to_draw: boolean = false
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shadow_ctx?: CanvasRenderingContext2D
shadow_layer?: HTMLCanvasElement
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
theme_black: GobanTheme
theme_black_stones: any[] = []
theme_black_text_color: string = HOT_PINK
theme_blank_text_color: string = HOT_PINK
theme_board: GobanTheme
theme_faded_line_color: string = HOT_PINK
theme_faded_star_color: string = HOT_PINK
theme_line_color: string = ""
theme_star_color: string = ""
theme_stone_radius: number = 10
theme_white: GobanTheme
theme_white_stones: any[] = []
theme_white_text_color: string = HOT_PINK
themes: GobanSelectedThemes = ...
title_div?: HTMLElement
variation_stone_opacity: number
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

Methods

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

Methods

\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanEngine.html b/docs/classes/GobanEngine.html index e05f17a2..ed5b34fe 100644 --- a/docs/classes/GobanEngine.html +++ b/docs/classes/GobanEngine.html @@ -1,4 +1,4 @@ -GobanEngine | goban

Class GobanEngine

Hierarchy (view full)

Constructors

constructor +GobanEngine | goban

Class GobanEngine

Hierarchy (view full)

Constructors

Properties

_cur_move: MoveTree
_cur_review_move: undefined | MoveTree
_last_official_move: MoveTree
_outcome: string = ""
_phase: GobanEnginePhase = "play"
_rules: GobanEngineRules = "japanese"
_strict_seki_mode: boolean = false
_undo_requested?: number
_winner?: number | "black" | "white"
aga_handicap_scoring: boolean = false
allow_ko: boolean = false
allow_self_capture: boolean = false
allow_superko: boolean = false
automatic_stone_removal: boolean = false
black_prisoners: number
board_is_repeating: boolean
decoded_moves: JGOFMove[] = []
disable_analysis: boolean = false
dontStoreBoardHistory: boolean
free_handicap_placement: boolean = false
game_id: number = NaN
goban_callback?: GobanBase
group_ids?: number[]
handicap: number = NaN
handicap_rank_difference?: number
height: number = 19
initial_state: GobanEngineInitialState = ...
is_game_record: boolean = false
komi: number = NaN
latencies?: {
    [player_id: string]: number;
}

Type declaration

  • [player_id: string]: number
loading_sgf: boolean = false
move_before_jump?: MoveTree
move_tree: MoveTree
move_tree_layout_dirty: boolean = false
move_tree_layout_hash: {
    [coords: string]: MoveTree;
} = {}

Type declaration

move_tree_layout_vector: number[] = []
name: string = ""
needs_sealing?: JGOFSealingIntersection[]
parentEventEmitter?: EventEmitter<GobanEvents, any>
player_pool: {
    [id: number]: GobanEnginePlayerEntry;
}

Type declaration

players: {
    black: GobanEnginePlayerEntry;
    white: GobanEnginePlayerEntry;
} = ...

Type declaration

puzzle_collection: number = NaN
puzzle_description: string = "[missing puzzle description]"
puzzle_opponent_move_mode: PuzzleOpponentMoveMode = "manual"
puzzle_player_move_mode: PuzzlePlayerMoveMode = "free"
puzzle_rank: number = NaN
puzzle_type: string = "[missing puzzle type]"
removal: boolean[][]
rengo?: boolean
rengo_casual_mode: boolean
rengo_teams?: {
    [colour: string]: GobanEnginePlayerEntry[];
}

Type declaration

review_id?: number
score_handicap: boolean = false
score_prisoners: boolean = false
score_stones: boolean = false
score_territory: boolean = false
score_territory_in_seki: boolean = false
stalling_score_estimate?: StallingScoreEstimate
superko_algorithm: GobanEngineSuperKoAlgorithm = "psk"
territory_included_in_sgf: boolean = false
throw_all_errors?: boolean
time_control: JGOFTimeControl = ...
white_prisoners: number
width: number = 19

Accessors

  • get winner(): undefined | number | "black" | "white"
  • Returns undefined | number | "black" | "white"

  • set winner(winner): void
  • Parameters

    • winner: undefined | number | "black" | "white"

    Returns void

Methods

  • Returns {
        black: string;
        white: string;
    }

    • black: string
    • white: string
  • Computes the score of the current board state.

    +

Constructors

Properties

_cur_move: MoveTree
_cur_review_move: undefined | MoveTree
_last_official_move: MoveTree
_outcome: string = ""
_phase: GobanEnginePhase = "play"
_rules: GobanEngineRules = "japanese"
_strict_seki_mode: boolean = false
_undo_requested?: number
_winner?: number | "black" | "white"
aga_handicap_scoring: boolean = false
allow_ko: boolean = false
allow_self_capture: boolean = false
allow_superko: boolean = false
automatic_stone_removal: boolean = false
black_prisoners: number
board_is_repeating: boolean
decoded_moves: JGOFMove[] = []
disable_analysis: boolean = false
dontStoreBoardHistory: boolean
free_handicap_placement: boolean = false
game_id: number = NaN
goban_callback?: GobanBase
group_ids?: number[]
handicap: number = NaN
handicap_rank_difference?: number
height: number = 19
initial_state: GobanEngineInitialState = ...
is_game_record: boolean = false
komi: number = NaN
latencies?: {
    [player_id: string]: number;
}

Type declaration

  • [player_id: string]: number
loading_sgf: boolean = false
move_before_jump?: MoveTree
move_tree: MoveTree
move_tree_layout_dirty: boolean = false
move_tree_layout_hash: {
    [coords: string]: MoveTree;
} = {}

Type declaration

move_tree_layout_vector: number[] = []
name: string = ""
needs_sealing?: JGOFSealingIntersection[]
parentEventEmitter?: EventEmitter<GobanEvents, any>
player_pool: {
    [id: number]: GobanEnginePlayerEntry;
}

Type declaration

players: {
    black: GobanEnginePlayerEntry;
    white: GobanEnginePlayerEntry;
} = ...

Type declaration

puzzle_collection: number = NaN
puzzle_description: string = "[missing puzzle description]"
puzzle_opponent_move_mode: PuzzleOpponentMoveMode = "manual"
puzzle_player_move_mode: PuzzlePlayerMoveMode = "free"
puzzle_rank: number = NaN
puzzle_type: string = "[missing puzzle type]"
removal: boolean[][]
rengo?: boolean
rengo_casual_mode: boolean
rengo_teams?: {
    [colour: string]: GobanEnginePlayerEntry[];
}

Type declaration

review_id?: number
score_handicap: boolean = false
score_prisoners: boolean = false
score_stones: boolean = false
score_territory: boolean = false
score_territory_in_seki: boolean = false
stalling_score_estimate?: StallingScoreEstimate
superko_algorithm: GobanEngineSuperKoAlgorithm = "psk"
territory_included_in_sgf: boolean = false
throw_all_errors?: boolean
time_control: JGOFTimeControl = ...
white_prisoners: number
width: number = 19

Accessors

  • get winner(): undefined | number | "black" | "white"
  • Returns undefined | number | "black" | "white"

  • set winner(winner): void
  • Parameters

    • winner: undefined | number | "black" | "white"

    Returns void

Methods

  • Returns {
        black: string;
        white: string;
    }

    • black: string
    • white: string
  • Computes the score of the current board state.

    If only_prisoners is true, we return the same data structure for convenience, but only the prisoners will be counted, other sources of points will be zero.

    -

    Parameters

    • Optional only_prisoners: boolean

    Returns Score

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • from_turn: number
    • moves: string | AdHocPackedMove
    • Optional cb: ((x, y, edited, color) => void)
        • (x, y, edited, color): void
        • Parameters

          • x: number
          • y: number
          • edited: boolean
          • color: number

          Returns void

    Returns MoveTree[]

  • Returns a move string from the given official move number (aka branch point)

    -

    Returns {
        from: number;
        moves: string;
    }

    • from: number
    • moves: string
  • Parameters

    • from_turn: number
    • moves: string | AdHocPackedMove
    • Optional cb: ((x, y, edited, color) => void)
        • (x, y, edited, color): void
        • Parameters

          • x: number
          • y: number
          • edited: boolean
          • color: number

          Returns void

    Returns MoveTree[]

  • Returns a move string from the given official move number (aka branch point)

    +

    Returns {
        from: number;
        moves: string;
    }

    • from: number
    • moves: string
  • returns true if our current move is our last official move

    -

    Returns boolean

  • returns true if our current move is our last official move

    +

    Returns boolean

  • Returns the number of stones removed. If you want the coordinates of the stones removed, pass in a removed_stones array to append the moves to.

    -

    Parameters

    • x: number
    • y: number
    • Optional checkForKo: boolean
    • Optional errorOnSuperKo: boolean
    • Optional dontCheckForSuperKo: boolean
    • Optional dontCheckForSelfCapture: boolean
    • Optional isTrunkMove: boolean
    • Optional removed_stones: JGOFIntersection[]

    Returns number

  • Parameters

    • Optional player_id: number

    Returns "black" | "white" | "invalid"

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    -

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Saves our current move as our last official move

    -

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional needs_sealing: boolean

    Returns void

  • Sets a position as being removed or not removed. If +

    Parameters

    • x: number
    • y: number
    • Optional checkForKo: boolean
    • Optional errorOnSuperKo: boolean
    • Optional dontCheckForSuperKo: boolean
    • Optional dontCheckForSelfCapture: boolean
    • Optional isTrunkMove: boolean
    • Optional removed_stones: JGOFIntersection[]

    Returns number

  • Parameters

    • Optional player_id: number

    Returns "black" | "white" | "invalid"

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    +

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Saves our current move as our last official move

    +

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional needs_sealing: boolean

    Returns void

  • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

    -

    Parameters

    • x: number
    • y: number
    • force_removal: boolean = false

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

\ No newline at end of file +

Parameters

Returns GobanEngineConfig

\ No newline at end of file diff --git a/docs/classes/GobanError.html b/docs/classes/GobanError.html index c506c473..3a5ee716 100644 --- a/docs/classes/GobanError.html +++ b/docs/classes/GobanError.html @@ -1,2 +1,2 @@ -GobanError | goban

Class GobanError

Hierarchy (view full)

Constructors

Constructors

\ No newline at end of file +GobanError | goban

Class GobanError

Hierarchy (view full)

Constructors

Constructors

\ No newline at end of file diff --git a/docs/classes/GobanInteractive.html b/docs/classes/GobanInteractive.html index e865cfde..99b2ef37 100644 --- a/docs/classes/GobanInteractive.html +++ b/docs/classes/GobanInteractive.html @@ -1,7 +1,7 @@ GobanInteractive | goban

Class GobanInteractiveAbstract

This class serves as a functionality layer encapsulating core interactions we do with a Goban, we have it as a separate base class simply to help with code organization and to keep our Goban class size down.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
_analyze_subtool: string = "alternate"
_analyze_tool: AnalysisTool = "stone"
_mode: GobanModes = "play"
_review_controller_id?: number
_review_owner_id?: number
_score_estimator: null | ScoreEstimator = null
_submit_move?: (() => void)

Type declaration

    • (): void
    • Returns void

_title: string = "play"
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_captured_stones: JGOFIntersection[] = []
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
_analyze_subtool: string = "alternate"
_analyze_tool: AnalysisTool = "stone"
_mode: GobanModes = "play"
_review_controller_id?: number
_review_owner_id?: number
_score_estimator: null | ScoreEstimator = null
_submit_move?: (() => void)

Type declaration

    • (): void
    • Returns void

_title: string = "play"
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_captured_stones: JGOFIntersection[] = []
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean
shift_key_is_down: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
width: number
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • perGameSettingAppliesToNonPlayers: boolean = false

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • perGameSettingAppliesToNonPlayers: boolean = false

    Returns boolean

  • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

    -

    Returns GobanEngine

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • Optional set_override: "letters" | "numbers"

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • coordinates: string
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • Optional set_override: "letters" | "numbers"

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • coordinates: string
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • drawSquare: boolean = true

    Returns void

  • Parameters

    • Optional dont_jump_to_official_move: boolean

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • msg_id: MessageID
    • Optional parameters: {
          [key: string]: any;
      }
      • [key: string]: any
    • Optional timeout: number

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional force_label: boolean
    • Optional force_put: boolean

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Parameters

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanMoveError.html b/docs/classes/GobanMoveError.html index 1d60175a..336f87a7 100644 --- a/docs/classes/GobanMoveError.html +++ b/docs/classes/GobanMoveError.html @@ -1,6 +1,6 @@ -GobanMoveError | goban

Class GobanMoveError

Hierarchy (view full)

Constructors

constructor +GobanMoveError | goban

Class GobanMoveError

Hierarchy (view full)

Constructors

Properties

coords: string
game_id: number
move_number: number
\ No newline at end of file +

Constructors

Properties

coords: string
game_id: number
move_number: number
\ No newline at end of file diff --git a/docs/classes/GobanSocket.html b/docs/classes/GobanSocket.html index d4a07345..9431893c 100644 --- a/docs/classes/GobanSocket.html +++ b/docs/classes/GobanSocket.html @@ -8,7 +8,7 @@
  • Optional promise support for sends
  • Latency tracking (doubling as keep alive)
  • -

    Type Parameters

    Hierarchy

    Constructors

    Type Parameters

    Hierarchy

    Constructors

    Properties

    authentication?: DataArgument<SendProtocol["authenticate"]>
    callbacks: Map<number, ((data?, error?) => void)> = ...

    Type declaration

      • (data?, error?): void
      • Parameters

        Returns void

    clock_drift: number = 0.0
    current_ping_interval: number
    last_request_id: number = 0
    latency: number = 0.0
    manually_disconnected: boolean = false
    ping_timer?: Timeout
    promises_in_flight: Map<number, {
        args: any[];
        command: string;
        reject: ((...args) => void);
        resolve: ((...args) => void);
    }> = ...

    Type declaration

    • args: any[]
    • command: string
    • reject: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    • resolve: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    reconnect_tries: number = 0
    reconnecting: boolean = false
    send_queue: (() => void)[] = []

    Type declaration

      • (): void
      • Returns void

    socket: WebSocket
    timeout_timer?: Timeout
    url: string

    Accessors

    Methods

    \ No newline at end of file +

    Constructors

    Properties

    authentication?: DataArgument<SendProtocol["authenticate"]>
    callbacks: Map<number, ((data?, error?) => void)> = ...

    Type declaration

      • (data?, error?): void
      • Parameters

        Returns void

    clock_drift: number = 0.0
    current_ping_interval: number
    last_request_id: number = 0
    latency: number = 0.0
    manually_disconnected: boolean = false
    ping_timer?: Timeout
    promises_in_flight: Map<number, {
        args: any[];
        command: string;
        reject: ((...args) => void);
        resolve: ((...args) => void);
    }> = ...

    Type declaration

    • args: any[]
    • command: string
    • reject: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    • resolve: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    reconnect_tries: number = 0
    reconnecting: boolean = false
    send_queue: (() => void)[] = []

    Type declaration

      • (): void
      • Returns void

    socket: WebSocket
    timeout_timer?: Timeout
    url: string

    Accessors

    Methods

    \ No newline at end of file diff --git a/docs/classes/GobanTheme.html b/docs/classes/GobanTheme.html index 3036778b..d0eb2992 100644 --- a/docs/classes/GobanTheme.html +++ b/docs/classes/GobanTheme.html @@ -1,4 +1,4 @@ -GobanTheme | goban

    Class GobanTheme

    Constructors

    constructor +GobanTheme | goban

    Class GobanTheme

    Constructors

    Properties

    Constructors

    Properties

    name: string
    parent?: GobanTheme
    styles: {
        [style_name: string]: string;
    } = {}

    Type declaration

    • [style_name: string]: string

    Accessors

    Methods

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number
      • shadow_circle_color: string

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • shadow_cell: undefined | SVGGraphicsElement
      • cx: number
      • cy: number
      • radius: number
      • color: string

      Returns undefined | SVGElement

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    \ No newline at end of file +

    Constructors

    Properties

    name: string
    parent?: GobanTheme
    styles: {
        [style_name: string]: string;
    } = {}

    Type declaration

    • [style_name: string]: string

    Accessors

    Methods

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number
      • shadow_circle_color: string

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • shadow_cell: undefined | SVGGraphicsElement
      • cx: number
      • cy: number
      • radius: number
      • color: string

      Returns undefined | SVGElement

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    \ No newline at end of file diff --git a/docs/classes/MoveTree.html b/docs/classes/MoveTree.html index 1263cac3..8e9bfac8 100644 --- a/docs/classes/MoveTree.html +++ b/docs/classes/MoveTree.html @@ -1,4 +1,4 @@ -MoveTree | goban

    Class MoveTree

    Constructors

    constructor +MoveTree | goban

    Class MoveTree

    Constructors

    Properties

    active_path_number: number = 0
    branches: MoveTree[]
    chat_log?: MoveTreeChatLine[]
    correct_answer: boolean = false
    edited: boolean
    engine: GobanEngine
    hint_next?: MoveTree
    id: number
    isobranch_hash?: string
    isobranches: any
    label: string = "[unset]"
    label_metrics?: any
    layout_cx: number = 0
    layout_cy: number = 0
    layout_x: number = 0
    layout_y: number = 0
    line_color: number
    marks?: MarkInterface[][]
    move_number: number
    parent: null | MoveTree
    pen_marks: MoveTreePenMarks = []
    played_by: undefined | number
    player_update: undefined | JGOFPlayerSummary
    pretty_coordinates: string
    stashed_marks: MarkInterface[][][] = []
    text: string
    trunk: boolean
    trunk_next?: MoveTree
    wrong_answer: boolean = false
    x: number
    y: number
    active_path_number: number = 0

    ** Layout & Rendering ***

    -
    current_line_color: number = 0
    isobranch_colors: {
        strong: string;
        weak: string;
    } = ...

    Type declaration

    • strong: string
    • weak: string
    line_colors: string[] = ...
    stone_padding: 3 = 3
    stone_radius: 11 = 11
    stone_square_size: number = ...

    Accessors

    • get stoneColor(): "black" | "white" | "empty"
    • Returns "black" | "white" | "empty"

    Methods

    • Calls a callback for each positions that has a mark on it

      -

      Parameters

      • fn: ((i, j) => void)
          • (i, j): void
          • Parameters

            • i: number
            • j: number

            Returns void

      Returns void

    • Returns true if there are any marks that have been set

      -

      Returns boolean

    • Parameters

      • x: number
      • min_y: number
      • layout_hash: {
            [coords: string]: MoveTree;
        }
      • line_color: number

      Returns number

    • Loads the state of this MoveTree node from a MoveTreeJson object

      -

      Parameters

      Returns void

    • Recomputes the isobranches for the entire tree. This needs to be called on the root node.

      -

      Returns void

    • Saves the current marks in our stash, restore them with popMarks

      -

      Returns void

    \ No newline at end of file +

    Constructors

    Properties

    active_path_number: number = 0
    branches: MoveTree[]
    chat_log?: MoveTreeChatLine[]
    correct_answer: boolean = false
    edited: boolean
    engine: GobanEngine
    hint_next?: MoveTree
    id: number
    isobranch_hash?: string
    isobranches: any
    label: string = "[unset]"
    label_metrics?: any
    layout_cx: number = 0
    layout_cy: number = 0
    layout_x: number = 0
    layout_y: number = 0
    line_color: number
    marks?: MarkInterface[][]
    move_number: number
    parent: null | MoveTree
    pen_marks: MoveTreePenMarks = []
    played_by: undefined | number
    player_update: undefined | JGOFPlayerSummary
    pretty_coordinates: string
    stashed_marks: MarkInterface[][][] = []
    text: string
    trunk: boolean
    trunk_next?: MoveTree
    wrong_answer: boolean = false
    x: number
    y: number
    active_path_number: number = 0

    ** Layout & Rendering ***

    +
    current_line_color: number = 0
    isobranch_colors: {
        strong: string;
        weak: string;
    } = ...

    Type declaration

    • strong: string
    • weak: string
    line_colors: string[] = ...
    stone_padding: 3 = 3
    stone_radius: 11 = 11
    stone_square_size: number = ...

    Accessors

    • get stoneColor(): "black" | "white" | "empty"
    • Returns "black" | "white" | "empty"

    Methods

    • Calls a callback for each positions that has a mark on it

      +

      Parameters

      • fn: ((i, j) => void)
          • (i, j): void
          • Parameters

            • i: number
            • j: number

            Returns void

      Returns void

    • Returns true if there are any marks that have been set

      +

      Returns boolean

    • Parameters

      • x: number
      • min_y: number
      • layout_hash: {
            [coords: string]: MoveTree;
        }
      • line_color: number

      Returns number

    • Loads the state of this MoveTree node from a MoveTreeJson object

      +

      Parameters

      Returns void

    • Recomputes the isobranches for the entire tree. This needs to be called on the root node.

      +

      Returns void

    • Saves the current marks in our stash, restore them with popMarks

      +

      Returns void

    \ No newline at end of file diff --git a/docs/classes/SVGRenderer.html b/docs/classes/SVGRenderer.html index ec397b8f..9de219f7 100644 --- a/docs/classes/SVGRenderer.html +++ b/docs/classes/SVGRenderer.html @@ -2,7 +2,7 @@ classes, types, and enums.

    You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

    -

    Hierarchy (view full)

    Implements

    Constructors

    Hierarchy (view full)

    Implements

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __set_board_height: number = -1
    __set_board_width: number = -1
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    autoplaying_puzzle_move: boolean = false
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    byoyomi_label: string = ""
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    coordinate_labels_layer?: SVGGraphicsElement
    current_cmove?: ConditionalMoveTree
    current_pen_mark?: {
        color: string;
        points: [number, number];
    }

    Type declaration

    • color: string
    • points: [number, number]
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    drawing_enabled: boolean = true
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    event_layer: HTMLDivElement
    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    grid: SVGGraphicsElement[][] = []
    grid_layer?: SVGGraphicsElement
    handleShiftKey: ((ev) => void)

    Type declaration

      • (ev): void
      • Parameters

        • ev: KeyboardEvent

        Returns void

    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    labeling_mode?: "put" | "clear"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_label_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    last_move?: MoveTree
    last_move_opacity: number = 1
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_pen_position?: [number, number]
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    lines_layer?: SVGGraphicsElement
    marked_analysis_score?: boolean[][]
    message_div?: HTMLDivElement
    message_td?: HTMLElement
    message_text?: HTMLDivElement
    message_timeout?: number
    metrics: GobanMetrics = ...
    move_selected?: JGOFIntersection
    move_tree_container?: HTMLElement
    move_tree_inner_container?: HTMLDivElement
    move_tree_svg?: SVGElement
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_layer?: SVGGraphicsElement
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    ready_to_draw: boolean = false
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shadow_grid: (undefined | SVGElement)[][] = []
    shadow_layer?: SVGGraphicsElement
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    svg: SVGElement
    svg_defs: SVGDefsElement
    theme_black: GobanTheme
    theme_black_stones: any[] = []
    theme_black_text_color: string = HOT_PINK
    theme_blank_text_color: string = HOT_PINK
    theme_board: GobanTheme
    theme_faded_line_color: string = HOT_PINK
    theme_faded_star_color: string = HOT_PINK
    theme_line_color: string = ""
    theme_star_color: string = ""
    theme_stone_radius: number = 10
    theme_white: GobanTheme
    theme_white_stones: any[] = []
    theme_white_text_color: string = HOT_PINK
    themes: GobanSelectedThemes = ...
    title_div?: HTMLElement
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __set_board_height: number = -1
    __set_board_width: number = -1
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    autoplaying_puzzle_move: boolean = false
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    byoyomi_label: string = ""
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    coordinate_labels_layer?: SVGGraphicsElement
    current_cmove?: ConditionalMoveTree
    current_pen_mark?: {
        color: string;
        points: [number, number];
    }

    Type declaration

    • color: string
    • points: [number, number]
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    drawing_enabled: boolean = true
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    event_layer: HTMLDivElement
    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    grid: SVGGraphicsElement[][] = []
    grid_layer?: SVGGraphicsElement
    handleShiftKey: ((ev) => void)

    Type declaration

      • (ev): void
      • Parameters

        • ev: KeyboardEvent

        Returns void

    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    labeling_mode?: "put" | "clear"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_label_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    last_move?: MoveTree
    last_move_opacity: number = 1
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_pen_position?: [number, number]
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    lines_layer?: SVGGraphicsElement
    marked_analysis_score?: boolean[][]
    message_div?: HTMLDivElement
    message_td?: HTMLElement
    message_text?: HTMLDivElement
    message_timeout?: number
    metrics: GobanMetrics = ...
    move_selected?: JGOFIntersection
    move_tree_container?: HTMLElement
    move_tree_inner_container?: HTMLDivElement
    move_tree_svg?: SVGElement
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_layer?: SVGGraphicsElement
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    ready_to_draw: boolean = false
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shadow_grid: (undefined | SVGElement)[][] = []
    shadow_layer?: SVGGraphicsElement
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    svg: SVGElement
    svg_defs: SVGDefsElement
    theme_black: GobanTheme
    theme_black_stones: any[] = []
    theme_black_text_color: string = HOT_PINK
    theme_blank_text_color: string = HOT_PINK
    theme_board: GobanTheme
    theme_faded_line_color: string = HOT_PINK
    theme_faded_star_color: string = HOT_PINK
    theme_line_color: string = ""
    theme_star_color: string = ""
    theme_stone_radius: number = 10
    theme_white: GobanTheme
    theme_white_stones: any[] = []
    theme_white_text_color: string = HOT_PINK
    themes: GobanSelectedThemes = ...
    title_div?: HTMLElement
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    Methods

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    Methods

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/ScoreEstimator.html b/docs/classes/ScoreEstimator.html index 899c2da0..1701d607 100644 --- a/docs/classes/ScoreEstimator.html +++ b/docs/classes/ScoreEstimator.html @@ -1,4 +1,4 @@ -ScoreEstimator | goban

    Class ScoreEstimator

    Hierarchy (view full)

    Constructors

    constructor +ScoreEstimator | goban

    Class ScoreEstimator

    Hierarchy (view full)

    Constructors

    Properties

    amount: number = NaN
    autoscore: boolean = false
    autoscored_needs_sealing?: JGOFSealingIntersection[]
    autoscored_removed?: JGOFMove[]
    autoscored_state?: JGOFNumericPlayerColor[][]
    black: PlayerScore = ...
    black_prisoners: number
    board_is_repeating: boolean
    color_to_move: "black" | "white"
    engine: GobanEngine
    estimated_hard_score: number
    goban_callback?: GobanBase
    height: number = 19
    ownership: number[][]
    prefer_remote: boolean
    removal: boolean[][]
    territory: number[][]
    tolerance: number
    trials: number
    when_ready: Promise<void>
    white: PlayerScore = ...
    white_prisoners: number
    width: number = 19
    winner: string = ""

    Methods

    • Computes scoring locations for the board. If area_scoring is true, we +

    Constructors

    Properties

    amount: number = NaN
    autoscore: boolean = false
    autoscored_needs_sealing?: JGOFSealingIntersection[]
    autoscored_removed?: JGOFMove[]
    autoscored_state?: JGOFNumericPlayerColor[][]
    black: PlayerScore = ...
    black_prisoners: number
    board_is_repeating: boolean
    color_to_move: "black" | "white"
    engine: GobanEngine
    estimated_hard_score: number
    goban_callback?: GobanBase
    height: number = 19
    ownership: number[][]
    prefer_remote: boolean
    removal: boolean[][]
    territory: number[][]
    tolerance: number
    trials: number
    when_ready: Promise<void>
    white: PlayerScore = ...
    white_prisoners: number
    width: number = 19
    winner: string = ""

    Methods

    • Parameters

      • trials: number
      • tolerance: number
      • autoscore: boolean

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number
      • autoscore: boolean

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number

      Returns Promise<void>

    • Parameters

      • i: number
      • j: number
      • mod_key: boolean
      • press_duration_ms: number

      Returns void

    • Parameters

      • i: number
      • j: number
      • mod_key: boolean
      • press_duration_ms: number

      Returns void

    • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean

      Returns void

    • Toggles a group of stones for removal or restoration.

      By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

      -

      Parameters

      • x: number
      • y: number
      • force_removal: boolean = false

      Returns {
          group: RawStoneString;
          removed: boolean;
      }

    • Parameters

      • estimated_score: number
      • ownership: number[][]
      • Optional score: number

      Returns void

    \ No newline at end of file +

    Parameters

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

    \ No newline at end of file diff --git a/docs/classes/StoneString.html b/docs/classes/StoneString.html index 07d29b79..6cfb60b7 100644 --- a/docs/classes/StoneString.html +++ b/docs/classes/StoneString.html @@ -1,6 +1,6 @@ StoneString | goban

    Class StoneString

    A StoneString instance represents a group of intersections that are connected to each other and are all the same color.

    -

    Constructors

    Constructors

    Properties

    Constructors

    Properties

    __added_neighbors: {
        [group_id: number]: boolean;
    }

    Type declaration

    • [group_id: number]: boolean
    id: number
    intersections: JGOFIntersection[]
    is_territory: boolean = false
    neighboring_space: StoneString[]
    neighboring_stone_strings: StoneString[]
    neighbors: StoneString[]
    territory_color: JGOFNumericPlayerColor = 0

    Methods

    • Adds a stone string to our neighbor list. This should probably only be called by StoneStringBuilder.

      -

      Parameters

      Returns void

    • Add a stone to the group. This should probably only be called by StoneStringBuilder.

      -

      Parameters

      • x: number
      • y: number

      Returns void

    • Compute if this string is considered potential territory (if all of it's +

    Constructors

    Properties

    __added_neighbors: {
        [group_id: number]: boolean;
    }

    Type declaration

    • [group_id: number]: boolean
    id: number
    intersections: JGOFIntersection[]
    is_territory: boolean = false
    neighboring_space: StoneString[]
    neighboring_stone_strings: StoneString[]
    neighbors: StoneString[]
    territory_color: JGOFNumericPlayerColor = 0

    Methods

    • Adds a stone string to our neighbor list. This should probably only be called by StoneStringBuilder.

      +

      Parameters

      Returns void

    • Add a stone to the group. This should probably only be called by StoneStringBuilder.

      +

      Parameters

      • x: number
      • y: number

      Returns void

    • Compute if this string is considered potential territory (if all of it's neighbors are the same color). NOTE: This does not perform any advanced logic to determine seki status or anything like that, this only looks to see if the string contains EMPTY locations and that all of the surrounding neighboring are the same color. This should probably only be called by StoneStringBuilder.

      -

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/StoneStringBuilder.html b/docs/classes/StoneStringBuilder.html index 79208aa5..e89fed7e 100644 --- a/docs/classes/StoneStringBuilder.html +++ b/docs/classes/StoneStringBuilder.html @@ -1,7 +1,7 @@ -StoneStringBuilder | goban

    Class StoneStringBuilder

    Constructors

    constructor +StoneStringBuilder | goban

    Class StoneStringBuilder

    Constructors

    Properties

    state: BoardState
    stone_string_id_map: number[][]
    stone_strings: StoneString[]

    Methods

    \ No newline at end of file +

    Constructors

    Properties

    state: BoardState
    stone_string_id_map: number[][]
    stone_strings: StoneString[]

    Methods

    \ No newline at end of file diff --git a/docs/classes/TestGoban.html b/docs/classes/TestGoban.html index 6522af1d..0b5a1803 100644 --- a/docs/classes/TestGoban.html +++ b/docs/classes/TestGoban.html @@ -1,5 +1,5 @@ TestGoban | goban

    Class TestGoban

    This is a minimal implementation of Goban, primarily used for unit tests.

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

      -

      Parameters

      • coordinates: string

      Returns JGOFMove

    • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

      -

      Returns void

    • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

      -

      Returns GobanEngine

    • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

      -

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • msg_id: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    • Parameters

      • x: number
      • y: number
      • mark: string | number
      • Optional force_label: boolean
      • Optional force_put: boolean

      Returns boolean

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/_internal_.OGSConnectivity.html b/docs/classes/_internal_.OGSConnectivity.html index 888455a0..4c98367d 100644 --- a/docs/classes/_internal_.OGSConnectivity.html +++ b/docs/classes/_internal_.OGSConnectivity.html @@ -2,7 +2,7 @@ that manages connections to the online-go.com servers.

    We have it as a separate base class simply to help with code organization and to keep our Goban class size down.

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    width: number
    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    Methods

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    Methods

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/enums/JGOFNumericPlayerColor.html b/docs/enums/JGOFNumericPlayerColor.html index a145795c..d40618c6 100644 --- a/docs/enums/JGOFNumericPlayerColor.html +++ b/docs/enums/JGOFNumericPlayerColor.html @@ -1,4 +1,4 @@ -JGOFNumericPlayerColor | goban

    Enumeration JGOFNumericPlayerColor

    Enumeration Members

    BLACK +JGOFNumericPlayerColor | goban

    Enumeration JGOFNumericPlayerColor

    Enumeration Members

    Enumeration Members

    BLACK: 1
    EMPTY: 0
    WHITE: 2
    \ No newline at end of file +

    Enumeration Members

    BLACK: 1
    EMPTY: 0
    WHITE: 2
    \ No newline at end of file diff --git a/docs/enums/protocol.RemoteStorageReplication.html b/docs/enums/protocol.RemoteStorageReplication.html index 6d83559b..eb1f561d 100644 --- a/docs/enums/protocol.RemoteStorageReplication.html +++ b/docs/enums/protocol.RemoteStorageReplication.html @@ -1,13 +1,13 @@ RemoteStorageReplication | goban

    Enumeration RemoteStorageReplication

    This enum defines the various replication strategies for the remote storage system. For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

    -

    Enumeration Members

    Enumeration Members

    LOCAL_OVERWRITES_REMOTE: 1

    Locally set data will overwrite remotely set data, but if not set will default to remotely set data

    -
    NONE: 0

    No replication of this change

    -
    REMOTE_ONLY: 4

    Remotely set data, but do not update our local value

    -
    REMOTE_OVERWRITES_LOCAL: 2

    Remotely set data will overwrite locally set data

    -
    \ No newline at end of file +
    NONE: 0

    No replication of this change

    +
    REMOTE_ONLY: 4

    Remotely set data, but do not update our local value

    +
    REMOTE_OVERWRITES_LOCAL: 2

    Remotely set data will overwrite locally set data

    +
    \ No newline at end of file diff --git a/docs/functions/adjust_estimate.html b/docs/functions/adjust_estimate.html index 41bef4ce..80abb321 100644 --- a/docs/functions/adjust_estimate.html +++ b/docs/functions/adjust_estimate.html @@ -4,4 +4,4 @@
  • area_map: number[][]

    Representation of the ownership, 1=Black, -1=White, 0=Undecided using Area rules

  • score: number

    estimated score (not accounting for captures)

    -
  • Returns {
        ownership: Matrix<number>;
        score: number;
    }

    \ No newline at end of file +

    Returns {
        ownership: Matrix<number>;
        score: number;
    }

    \ No newline at end of file diff --git a/docs/functions/allocateCanvasOrError.html b/docs/functions/allocateCanvasOrError.html index b79f46aa..7744bf98 100644 --- a/docs/functions/allocateCanvasOrError.html +++ b/docs/functions/allocateCanvasOrError.html @@ -5,4 +5,4 @@

    If string dimensions are used we'll use setAttribute, if numbers are used we'll set the canvas .width and .height parameter. This is for device scaling considerations when the given dimensions are scaled on HDPI devices.

    -

    Parameters

    Returns HTMLCanvasElement

    \ No newline at end of file +

    Parameters

    Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/autoscore.html b/docs/functions/autoscore.html index 5df2b881..29fb2b84 100644 --- a/docs/functions/autoscore.html +++ b/docs/functions/autoscore.html @@ -1 +1 @@ -autoscore | goban

    Function autoscore

    \ No newline at end of file +autoscore | goban

    Function autoscore

    \ No newline at end of file diff --git a/docs/functions/char2num.html b/docs/functions/char2num.html index 2f4790ac..d4669302 100644 --- a/docs/functions/char2num.html +++ b/docs/functions/char2num.html @@ -1 +1 @@ -char2num | goban

    Function char2num

    \ No newline at end of file +char2num | goban

    Function char2num

    \ No newline at end of file diff --git a/docs/functions/cloneMatrix.html b/docs/functions/cloneMatrix.html index b72e763c..2bc96e97 100644 --- a/docs/functions/cloneMatrix.html +++ b/docs/functions/cloneMatrix.html @@ -1,2 +1,2 @@ cloneMatrix | goban

    Function cloneMatrix

    • Returns a cloned copy of the provided matrix

      -

      Type Parameters

      • T

      Parameters

      • matrix: T[][]

      Returns T[][]

    \ No newline at end of file +

    Type Parameters

    Parameters

    Returns T[][]

    \ No newline at end of file diff --git a/docs/functions/closeErrorCodeToString.html b/docs/functions/closeErrorCodeToString.html index d50430f4..b0bab1d0 100644 --- a/docs/functions/closeErrorCodeToString.html +++ b/docs/functions/closeErrorCodeToString.html @@ -1 +1 @@ -closeErrorCodeToString | goban

    Function closeErrorCodeToString

    \ No newline at end of file +closeErrorCodeToString | goban

    Function closeErrorCodeToString

    \ No newline at end of file diff --git a/docs/functions/color_blend.html b/docs/functions/color_blend.html index d072507b..8438542e 100644 --- a/docs/functions/color_blend.html +++ b/docs/functions/color_blend.html @@ -1,2 +1,2 @@ color_blend | goban

    Function color_blend

    • Simple 50% blend of two colors in hex format

      -

      Parameters

      • c1: string
      • c2: string

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/computeAverageMoveTime.html b/docs/functions/computeAverageMoveTime.html index 5096aeb2..f819c07f 100644 --- a/docs/functions/computeAverageMoveTime.html +++ b/docs/functions/computeAverageMoveTime.html @@ -1,2 +1,2 @@ computeAverageMoveTime | goban

    Function computeAverageMoveTime

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/createDeviceScaledCanvas.html b/docs/functions/createDeviceScaledCanvas.html index efd5f492..f51ce096 100644 --- a/docs/functions/createDeviceScaledCanvas.html +++ b/docs/functions/createDeviceScaledCanvas.html @@ -1 +1 @@ -createDeviceScaledCanvas | goban

    Function createDeviceScaledCanvas

    • Parameters

      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file +createDeviceScaledCanvas | goban

    Function createDeviceScaledCanvas

    • Parameters

      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/createGoban.html b/docs/functions/createGoban.html index 5ff53e29..b0132216 100644 --- a/docs/functions/createGoban.html +++ b/docs/functions/createGoban.html @@ -1 +1 @@ -createGoban | goban

    Function createGoban

    \ No newline at end of file +createGoban | goban

    Function createGoban

    \ No newline at end of file diff --git a/docs/functions/decodeCoordinate.html b/docs/functions/decodeCoordinate.html index 72c804ee..08d8f2a7 100644 --- a/docs/functions/decodeCoordinate.html +++ b/docs/functions/decodeCoordinate.html @@ -1,2 +1,2 @@ decodeCoordinate | goban

    Function decodeCoordinate

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/decodeGTPCoordinates.html b/docs/functions/decodeGTPCoordinates.html index 910d8aaa..f3598c4a 100644 --- a/docs/functions/decodeGTPCoordinates.html +++ b/docs/functions/decodeGTPCoordinates.html @@ -1,2 +1,2 @@ decodeGTPCoordinates | goban

    Function decodeGTPCoordinates

    \ No newline at end of file +

    Parameters

    Returns JGOFMove

    \ No newline at end of file diff --git a/docs/functions/decodeMoves.html b/docs/functions/decodeMoves.html index 7adf14f0..0566fa3e 100644 --- a/docs/functions/decodeMoves.html +++ b/docs/functions/decodeMoves.html @@ -1,3 +1,3 @@ decodeMoves | goban

    Function decodeMoves

    \ No newline at end of file +

    Parameters

    Returns JGOFMove[]

    \ No newline at end of file diff --git a/docs/functions/decodePrettyCoordinates.html b/docs/functions/decodePrettyCoordinates.html index b30a034c..c3e953ed 100644 --- a/docs/functions/decodePrettyCoordinates.html +++ b/docs/functions/decodePrettyCoordinates.html @@ -1,2 +1,2 @@ decodePrettyCoordinates | goban

    Function decodePrettyCoordinates

    \ No newline at end of file +

    Parameters

    Returns JGOFMove

    \ No newline at end of file diff --git a/docs/functions/decodePrettyXCoordinate.html b/docs/functions/decodePrettyXCoordinate.html index df5d5616..016b76be 100644 --- a/docs/functions/decodePrettyXCoordinate.html +++ b/docs/functions/decodePrettyXCoordinate.html @@ -1,2 +1,2 @@ decodePrettyXCoordinate | goban

    Function decodePrettyXCoordinate

    • Decodes the pretty X coordinate to a number

      -

      Parameters

      • ch: string

      Returns number

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/deepClone.html b/docs/functions/deepClone.html index c2d1f604..7f55fada 100644 --- a/docs/functions/deepClone.html +++ b/docs/functions/deepClone.html @@ -1,2 +1,2 @@ deepClone | goban

    Function deepClone

    \ No newline at end of file +

    Parameters

    Returns any

    \ No newline at end of file diff --git a/docs/functions/deepEqual.html b/docs/functions/deepEqual.html index 2db31088..a74b6070 100644 --- a/docs/functions/deepEqual.html +++ b/docs/functions/deepEqual.html @@ -1,2 +1,2 @@ deepEqual | goban

    Function deepEqual

    \ No newline at end of file +

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/deviceCanvasScalingRatio.html b/docs/functions/deviceCanvasScalingRatio.html index 06165203..63531ac1 100644 --- a/docs/functions/deviceCanvasScalingRatio.html +++ b/docs/functions/deviceCanvasScalingRatio.html @@ -1 +1 @@ -deviceCanvasScalingRatio | goban

    Function deviceCanvasScalingRatio

    \ No newline at end of file +deviceCanvasScalingRatio | goban

    Function deviceCanvasScalingRatio

    \ No newline at end of file diff --git a/docs/functions/elementOffset.html b/docs/functions/elementOffset.html index 09916391..c7cdc5eb 100644 --- a/docs/functions/elementOffset.html +++ b/docs/functions/elementOffset.html @@ -1 +1 @@ -elementOffset | goban

    Function elementOffset

    • Parameters

      • element: HTMLElement

      Returns {
          left: number;
          top: number;
      }

      • left: number
      • top: number
    \ No newline at end of file +elementOffset | goban

    Function elementOffset

    • Parameters

      • element: HTMLElement

      Returns {
          left: number;
          top: number;
      }

      • left: number
      • top: number
    \ No newline at end of file diff --git a/docs/functions/encodeCoordinate.html b/docs/functions/encodeCoordinate.html index e9af3128..56a02396 100644 --- a/docs/functions/encodeCoordinate.html +++ b/docs/functions/encodeCoordinate.html @@ -1,2 +1,2 @@ encodeCoordinate | goban

    Function encodeCoordinate

    • Encodes a single coordinate to a number

      -

      Parameters

      • coor: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/encodeMove.html b/docs/functions/encodeMove.html index 44643c43..99c5e476 100644 --- a/docs/functions/encodeMove.html +++ b/docs/functions/encodeMove.html @@ -1 +1 @@ -encodeMove | goban

    Function encodeMove

    \ No newline at end of file +encodeMove | goban

    Function encodeMove

    \ No newline at end of file diff --git a/docs/functions/encodeMoveToArray.html b/docs/functions/encodeMoveToArray.html index 605770bb..a18278e6 100644 --- a/docs/functions/encodeMoveToArray.html +++ b/docs/functions/encodeMoveToArray.html @@ -1 +1 @@ -encodeMoveToArray | goban

    Function encodeMoveToArray

    \ No newline at end of file +encodeMoveToArray | goban

    Function encodeMoveToArray

    \ No newline at end of file diff --git a/docs/functions/encodeMoves.html b/docs/functions/encodeMoves.html index 6684711c..e65fc964 100644 --- a/docs/functions/encodeMoves.html +++ b/docs/functions/encodeMoves.html @@ -1 +1 @@ -encodeMoves | goban

    Function encodeMoves

    \ No newline at end of file +encodeMoves | goban

    Function encodeMoves

    \ No newline at end of file diff --git a/docs/functions/encodeMovesToArray.html b/docs/functions/encodeMovesToArray.html index f4e23b44..0553e619 100644 --- a/docs/functions/encodeMovesToArray.html +++ b/docs/functions/encodeMovesToArray.html @@ -1 +1 @@ -encodeMovesToArray | goban

    Function encodeMovesToArray

    \ No newline at end of file +encodeMovesToArray | goban

    Function encodeMovesToArray

    \ No newline at end of file diff --git a/docs/functions/encodePrettyXCoordinate.html b/docs/functions/encodePrettyXCoordinate.html index b6e30bb8..b5793391 100644 --- a/docs/functions/encodePrettyXCoordinate.html +++ b/docs/functions/encodePrettyXCoordinate.html @@ -1,2 +1,2 @@ encodePrettyXCoordinate | goban

    Function encodePrettyXCoordinate

    • Encodes an X coordinate to a display encoding

      -

      Parameters

      • coor: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/escapeSGFText.html b/docs/functions/escapeSGFText.html index d6356728..bfa5b839 100644 --- a/docs/functions/escapeSGFText.html +++ b/docs/functions/escapeSGFText.html @@ -1 +1 @@ -escapeSGFText | goban

    Function escapeSGFText

    • Parameters

      • txt: string
      • escapeColon: boolean = false

      Returns string

    \ No newline at end of file +escapeSGFText | goban

    Function escapeSGFText

    • Parameters

      • txt: string
      • escapeColon: boolean = false

      Returns string

    \ No newline at end of file diff --git a/docs/functions/getRandomInt.html b/docs/functions/getRandomInt.html index e0aee601..63bdd332 100644 --- a/docs/functions/getRandomInt.html +++ b/docs/functions/getRandomInt.html @@ -1,2 +1,2 @@ getRandomInt | goban

    Function getRandomInt

    • Returns a random integer between min (inclusive) and max (exclusive)

      -

      Parameters

      • min: number
      • max: number

      Returns number

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/getRelativeEventPosition.html b/docs/functions/getRelativeEventPosition.html index 0270a3ce..5101cb20 100644 --- a/docs/functions/getRelativeEventPosition.html +++ b/docs/functions/getRelativeEventPosition.html @@ -1,2 +1,2 @@ getRelativeEventPosition | goban

    Function getRelativeEventPosition

    • Returns {x,y} of the event relative to the event target

      -

      Parameters

      • event: TouchEvent | MouseEvent
      • Optional target: HTMLElement

      Returns {
          x: number;
          y: number;
      }

      • x: number
      • y: number
    \ No newline at end of file +

    Parameters

    Returns {
        x: number;
        y: number;
    }

    \ No newline at end of file diff --git a/docs/functions/getWorstMoves.html b/docs/functions/getWorstMoves.html index 573f3ab7..089a1125 100644 --- a/docs/functions/getWorstMoves.html +++ b/docs/functions/getWorstMoves.html @@ -1,4 +1,4 @@ getWorstMoves | goban

    Function getWorstMoves

    \ No newline at end of file +

    Parameters

    Returns AIReviewWorstMoveEntry[]

    \ No newline at end of file diff --git a/docs/functions/init_remote_ownership_estimator.html b/docs/functions/init_remote_ownership_estimator.html index 62f011bd..276e8f92 100644 --- a/docs/functions/init_remote_ownership_estimator.html +++ b/docs/functions/init_remote_ownership_estimator.html @@ -1 +1 @@ -init_remote_ownership_estimator | goban

    Function init_remote_ownership_estimator

    \ No newline at end of file +init_remote_ownership_estimator | goban

    Function init_remote_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/init_wasm_ownership_estimator.html b/docs/functions/init_wasm_ownership_estimator.html index 984b9b6a..f63e22bf 100644 --- a/docs/functions/init_wasm_ownership_estimator.html +++ b/docs/functions/init_wasm_ownership_estimator.html @@ -1 +1 @@ -init_wasm_ownership_estimator | goban

    Function init_wasm_ownership_estimator

    \ No newline at end of file +init_wasm_ownership_estimator | goban

    Function init_wasm_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/makeEmptyMatrix.html b/docs/functions/makeEmptyMatrix.html index 40daaefc..9bda7af7 100644 --- a/docs/functions/makeEmptyMatrix.html +++ b/docs/functions/makeEmptyMatrix.html @@ -1 +1 @@ -makeEmptyMatrix | goban

    Function makeEmptyMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns (T | undefined)[][]

    \ No newline at end of file +makeEmptyMatrix | goban

    Function makeEmptyMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns (T | undefined)[][]

    \ No newline at end of file diff --git a/docs/functions/makeMatrix.html b/docs/functions/makeMatrix.html index f4f80bd3..8fde7ef1 100644 --- a/docs/functions/makeMatrix.html +++ b/docs/functions/makeMatrix.html @@ -1 +1 @@ -makeMatrix | goban

    Function makeMatrix

    \ No newline at end of file +makeMatrix | goban

    Function makeMatrix

    \ No newline at end of file diff --git a/docs/functions/makeObjectMatrix.html b/docs/functions/makeObjectMatrix.html index 0db56536..e99d2545 100644 --- a/docs/functions/makeObjectMatrix.html +++ b/docs/functions/makeObjectMatrix.html @@ -1 +1 @@ -makeObjectMatrix | goban

    Function makeObjectMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns T[][]

    \ No newline at end of file +makeObjectMatrix | goban

    Function makeObjectMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns T[][]

    \ No newline at end of file diff --git a/docs/functions/matricesAreEqual.html b/docs/functions/matricesAreEqual.html index e955ce03..8e0b738b 100644 --- a/docs/functions/matricesAreEqual.html +++ b/docs/functions/matricesAreEqual.html @@ -1,3 +1,3 @@ matricesAreEqual | goban

    Function matricesAreEqual

    • Returns true if the contents of the two 2d matrices are equal when the cells are compared with ===

      -

      Type Parameters

      • T

      Parameters

      • m1: T[][]
      • m2: T[][]

      Returns boolean

    \ No newline at end of file +

    Type Parameters

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/newlines_to_spaces.html b/docs/functions/newlines_to_spaces.html index 3951bbc2..36ce8566 100644 --- a/docs/functions/newlines_to_spaces.html +++ b/docs/functions/newlines_to_spaces.html @@ -1,3 +1,3 @@ newlines_to_spaces | goban

    Function newlines_to_spaces

    • SGF "simple text", eg used in the LB property, we can't have newlines. This strips them and replaces them with spaces.

      -

      Parameters

      • txt: string

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/niceInterval.html b/docs/functions/niceInterval.html index 524d9ee3..ab49afea 100644 --- a/docs/functions/niceInterval.html +++ b/docs/functions/niceInterval.html @@ -1,4 +1,4 @@ niceInterval | goban

    Function niceInterval

    • Like setInterval, but debounces catchups (multiple invocation in rapid succession less than our desired interval) that happen in some browsers when tabs wake up from sleep. Cleared with the standard clearInterval.

      -

      Parameters

      • callback: (() => void)
          • (): void
          • Returns void

      • interval: number

      Returns ReturnType<typeof setInterval>

    \ No newline at end of file +

    Parameters

    Returns ReturnType<typeof setInterval>

    \ No newline at end of file diff --git a/docs/functions/num2char.html b/docs/functions/num2char.html index 6ac42e9d..3b1e6241 100644 --- a/docs/functions/num2char.html +++ b/docs/functions/num2char.html @@ -1 +1 @@ -num2char | goban

    Function num2char

    \ No newline at end of file +num2char | goban

    Function num2char

    \ No newline at end of file diff --git a/docs/functions/ojeSequenceToMoves.html b/docs/functions/ojeSequenceToMoves.html index 91acab60..f9bcf265 100644 --- a/docs/functions/ojeSequenceToMoves.html +++ b/docs/functions/ojeSequenceToMoves.html @@ -1 +1 @@ -ojeSequenceToMoves | goban

    Function ojeSequenceToMoves

    \ No newline at end of file +ojeSequenceToMoves | goban

    Function ojeSequenceToMoves

    \ No newline at end of file diff --git a/docs/functions/placeRenderedImageStone.html b/docs/functions/placeRenderedImageStone.html index 55fef6e4..084b2394 100644 --- a/docs/functions/placeRenderedImageStone.html +++ b/docs/functions/placeRenderedImageStone.html @@ -1 +1 @@ -placeRenderedImageStone | goban

    Function placeRenderedImageStone

    • Parameters

      • ctx: CanvasRenderingContext2D
      • shadow_ctx: null | CanvasRenderingContext2D
      • stone: StoneType
      • cx: number
      • cy: number
      • radius: number

      Returns void

    \ No newline at end of file +placeRenderedImageStone | goban

    Function placeRenderedImageStone

    • Parameters

      • ctx: CanvasRenderingContext2D
      • shadow_ctx: null | CanvasRenderingContext2D
      • stone: StoneType
      • cx: number
      • cy: number
      • radius: number

      Returns void

    \ No newline at end of file diff --git a/docs/functions/positionId.html b/docs/functions/positionId.html index 017cc245..ce6814bb 100644 --- a/docs/functions/positionId.html +++ b/docs/functions/positionId.html @@ -1 +1 @@ -positionId | goban

    Function positionId

    \ No newline at end of file +positionId | goban

    Function positionId

    \ No newline at end of file diff --git a/docs/functions/preRenderImageStone.html b/docs/functions/preRenderImageStone.html index 8651607c..d0ebfac5 100644 --- a/docs/functions/preRenderImageStone.html +++ b/docs/functions/preRenderImageStone.html @@ -1 +1 @@ -preRenderImageStone | goban

    Function preRenderImageStone

    \ No newline at end of file +preRenderImageStone | goban

    Function preRenderImageStone

    \ No newline at end of file diff --git a/docs/functions/prettyCoordinates.html b/docs/functions/prettyCoordinates.html index 5c10900a..f19f1e59 100644 --- a/docs/functions/prettyCoordinates.html +++ b/docs/functions/prettyCoordinates.html @@ -1,2 +1,2 @@ prettyCoordinates | goban

    Function prettyCoordinates

    • Encodes an x,y pair to "pretty" coordinates, like "A3", or "K10"

      -

      Parameters

      • x: number
      • y: number
      • board_height: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/resizeDeviceScaledCanvas.html b/docs/functions/resizeDeviceScaledCanvas.html index 9dc3db95..7bcaf20f 100644 --- a/docs/functions/resizeDeviceScaledCanvas.html +++ b/docs/functions/resizeDeviceScaledCanvas.html @@ -1 +1 @@ -resizeDeviceScaledCanvas | goban

    Function resizeDeviceScaledCanvas

    • Parameters

      • canvas: HTMLCanvasElement
      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file +resizeDeviceScaledCanvas | goban

    Function resizeDeviceScaledCanvas

    • Parameters

      • canvas: HTMLCanvasElement
      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/setGobanCallbacks.html b/docs/functions/setGobanCallbacks.html index b1fa66a5..4a95f825 100644 --- a/docs/functions/setGobanCallbacks.html +++ b/docs/functions/setGobanCallbacks.html @@ -1,3 +1,3 @@ setGobanCallbacks | goban

    Function setGobanCallbacks

    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

    \ No newline at end of file +

    Parameters

    Returns void

    \ No newline at end of file diff --git a/docs/functions/setGobanRenderer.html b/docs/functions/setGobanRenderer.html index 67223f7a..481149f8 100644 --- a/docs/functions/setGobanRenderer.html +++ b/docs/functions/setGobanRenderer.html @@ -1 +1 @@ -setGobanRenderer | goban

    Function setGobanRenderer

    • Parameters

      • _renderer: "canvas" | "svg"

      Returns void

    \ No newline at end of file +setGobanRenderer | goban

    Function setGobanRenderer

    • Parameters

      • _renderer: "canvas" | "svg"

      Returns void

    \ No newline at end of file diff --git a/docs/functions/set_local_ownership_estimator.html b/docs/functions/set_local_ownership_estimator.html index d1a79508..fe2c25cf 100644 --- a/docs/functions/set_local_ownership_estimator.html +++ b/docs/functions/set_local_ownership_estimator.html @@ -1 +1 @@ -set_local_ownership_estimator | goban

    Function set_local_ownership_estimator

    \ No newline at end of file +set_local_ownership_estimator | goban

    Function set_local_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/shortDurationString.html b/docs/functions/shortDurationString.html index f56d5918..bdf86f91 100644 --- a/docs/functions/shortDurationString.html +++ b/docs/functions/shortDurationString.html @@ -1,2 +1,2 @@ shortDurationString | goban

    Function shortDurationString

    • Takes a number of seconds and returns a string like "1d 3h 2m 52s"

      -

      Parameters

      • seconds: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/sortMoves.html b/docs/functions/sortMoves.html index e9d45680..d261fdd5 100644 --- a/docs/functions/sortMoves.html +++ b/docs/functions/sortMoves.html @@ -1,2 +1,2 @@ sortMoves | goban

    Function sortMoves

    \ No newline at end of file +

    Parameters

    Returns string

  • Parameters

    Returns JGOFMove[]

  • \ No newline at end of file diff --git a/docs/functions/translate._.html b/docs/functions/translate._.html index df806743..2fc6809b 100644 --- a/docs/functions/translate._.html +++ b/docs/functions/translate._.html @@ -1 +1 @@ -_ | goban

    Function _

    \ No newline at end of file +_ | goban

    Function _

    \ No newline at end of file diff --git a/docs/functions/translate.interpolate.html b/docs/functions/translate.interpolate.html index 329fc4d4..cf8fdf76 100644 --- a/docs/functions/translate.interpolate.html +++ b/docs/functions/translate.interpolate.html @@ -1 +1 @@ -interpolate | goban

    Function interpolate

    • Parameters

      • str: string
      • params: any

      Returns string

    \ No newline at end of file +interpolate | goban

    Function interpolate

    • Parameters

      • str: string
      • params: any

      Returns string

    \ No newline at end of file diff --git a/docs/functions/translate.setGobanTranslations.html b/docs/functions/translate.setGobanTranslations.html index 04e10ec2..0d752b66 100644 --- a/docs/functions/translate.setGobanTranslations.html +++ b/docs/functions/translate.setGobanTranslations.html @@ -1 +1 @@ -setGobanTranslations | goban

    Function setGobanTranslations

    \ No newline at end of file +setGobanTranslations | goban

    Function setGobanTranslations

    \ No newline at end of file diff --git a/docs/functions/validateCanvas.html b/docs/functions/validateCanvas.html index 8b6ddcc6..321bc1c6 100644 --- a/docs/functions/validateCanvas.html +++ b/docs/functions/validateCanvas.html @@ -1,4 +1,4 @@ validateCanvas | goban

    Function validateCanvas

    • Validates that a canvas was created successfully and a 2d context can be allocated for it. If not, we call the GobanCore.canvasAllocationErrorHandler hook.

      -

      Parameters

      • canvas: null | HTMLCanvasElement
      • Optional err: Error
      • Optional width: string | number
      • Optional height: string | number

      Returns boolean

    \ No newline at end of file +

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/voronoi_estimate_ownership.html b/docs/functions/voronoi_estimate_ownership.html index 23937dd7..d90cb8ec 100644 --- a/docs/functions/voronoi_estimate_ownership.html +++ b/docs/functions/voronoi_estimate_ownership.html @@ -1,4 +1,4 @@ voronoi_estimate_ownership | goban

    Function voronoi_estimate_ownership

    \ No newline at end of file +

    Parameters

    Returns number[][]

    \ No newline at end of file diff --git a/docs/functions/wasm_estimate_ownership.html b/docs/functions/wasm_estimate_ownership.html index 413ba792..86affa5c 100644 --- a/docs/functions/wasm_estimate_ownership.html +++ b/docs/functions/wasm_estimate_ownership.html @@ -1 +1 @@ -wasm_estimate_ownership | goban

    Function wasm_estimate_ownership

    \ No newline at end of file +wasm_estimate_ownership | goban

    Function wasm_estimate_ownership

    \ No newline at end of file diff --git a/docs/interfaces/AIReviewWorstMoveEntry.html b/docs/interfaces/AIReviewWorstMoveEntry.html index 34bee9cd..e5780132 100644 --- a/docs/interfaces/AIReviewWorstMoveEntry.html +++ b/docs/interfaces/AIReviewWorstMoveEntry.html @@ -1,5 +1,5 @@ -AIReviewWorstMoveEntry | goban

    Interface AIReviewWorstMoveEntry

    interface AIReviewWorstMoveEntry {
        delta: number;
        move: JGOFIntersection;
        move_number: number;
        player: JGOFNumericPlayerColor;
    }

    Properties

    delta +AIReviewWorstMoveEntry | goban

    Interface AIReviewWorstMoveEntry

    interface AIReviewWorstMoveEntry {
        delta: number;
        move: JGOFIntersection;
        move_number: number;
        player: JGOFNumericPlayerColor;
    }

    Properties

    delta: number
    move_number: number
    \ No newline at end of file +

    Properties

    delta: number
    move_number: number
    \ No newline at end of file diff --git a/docs/interfaces/AdHocClock.html b/docs/interfaces/AdHocClock.html index fc79aa73..138f76e6 100644 --- a/docs/interfaces/AdHocClock.html +++ b/docs/interfaces/AdHocClock.html @@ -1,4 +1,4 @@ -AdHocClock | goban

    Interface AdHocClock

    interface AdHocClock {
        black_player_id: number;
        black_time: number | AdHocPlayerClock;
        current_player: number;
        expiration: number;
        game_id: number;
        last_move: number;
        pause?: {
            pause_control: AdHocPauseControl;
            paused: boolean;
            paused_since: number;
        };
        paused_since?: number;
        start_mode?: boolean;
        title: string;
        white_player_id: number;
        white_time: number | AdHocPlayerClock;
    }

    Properties

    black_player_id +AdHocClock | goban

    Interface AdHocClock

    interface AdHocClock {
        black_player_id: number;
        black_time: number | AdHocPlayerClock;
        current_player: number;
        expiration: number;
        game_id: number;
        last_move: number;
        pause?: {
            pause_control: AdHocPauseControl;
            paused: boolean;
            paused_since: number;
        };
        paused_since?: number;
        start_mode?: boolean;
        title: string;
        white_player_id: number;
        white_time: number | AdHocPlayerClock;
    }

    Properties

    black_player_id: number

    OGS player id for black

    -
    black_time: number | AdHocPlayerClock

    Time left on black's clock. If this is a number (such as is the case +

    black_time: number | AdHocPlayerClock

    Time left on black's clock. If this is a number (such as is the case with simple time), it is expressed in milliseconds.

    -
    current_player: number

    Current player to move

    -
    expiration: number

    Time the game will end if no move is played, in milliseconds since +

    current_player: number

    Current player to move

    +
    expiration: number

    Time the game will end if no move is played, in milliseconds since 1970. This is computed by adding together any main and overtime left on the clock. If start_mode is set, this is the number of milliseconds left on the start clock.

    -
    game_id: number

    OGS Game id

    -
    last_move: number

    Time the last move was made, in milliseconds since 1970

    -
    pause?: {
        pause_control: AdHocPauseControl;
        paused: boolean;
        paused_since: number;
    }

    If set, this AdHocClock is updating the pause state

    -

    Type declaration

    paused_since?: number

    Time the game was paused. This field erroneously exists even after the +

    game_id: number

    OGS Game id

    +
    last_move: number

    Time the last move was made, in milliseconds since 1970

    +
    pause?: {
        pause_control: AdHocPauseControl;
        paused: boolean;
        paused_since: number;
    }

    If set, this AdHocClock is updating the pause state

    +

    Type declaration

    paused_since?: number

    Time the game was paused. This field erroneously exists even after the game has been resumed, this will be removed in these cases.

    -
    start_mode?: boolean

    If true, the game has not started and this is the count down until +

    start_mode?: boolean

    If true, the game has not started and this is the count down until the game is canceled if a move has not been played yet. If this is true, then the duration left on the start clock is stored in expiration (in ms)

    -
    title: string

    Title of the game. This field will be removed.

    -
    white_player_id: number

    OGS player id for white

    -
    white_time: number | AdHocPlayerClock

    Time left on white's clock. If this is a number (such as is the case +

    title: string

    Title of the game. This field will be removed.

    +
    white_player_id: number

    OGS player id for white

    +
    white_time: number | AdHocPlayerClock

    Time left on white's clock. If this is a number (such as is the case with simple time), it is expressed in milliseconds.k

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AdHocFormat.html b/docs/interfaces/AdHocFormat.html index 8a46b2aa..5055e6b2 100644 --- a/docs/interfaces/AdHocFormat.html +++ b/docs/interfaces/AdHocFormat.html @@ -1,8 +1,8 @@ AdHocFormat | goban

    Interface AdHocFormat

    The to-be-deprecated format used by Online-Go.com, will be replaced by JGOF as we develop a migration plan

    -
    interface AdHocFormat {
        black: AdHocPlayer;
        clock: AdHocClock;
        pause_control: AdHocPauseControl;
        time_control: JGOFTimeControl;
        white: AdHocPlayer;
    }

    Properties

    interface AdHocFormat {
        black: AdHocPlayer;
        clock: AdHocClock;
        pause_control: AdHocPauseControl;
        time_control: JGOFTimeControl;
        white: AdHocPlayer;
    }

    Properties

    clock: AdHocClock
    pause_control: AdHocPauseControl
    time_control: JGOFTimeControl
    \ No newline at end of file +

    Properties

    clock: AdHocClock
    pause_control: AdHocPauseControl
    time_control: JGOFTimeControl
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPauseControl.html b/docs/interfaces/AdHocPauseControl.html index 1ff09e1d..b991fb54 100644 --- a/docs/interfaces/AdHocPauseControl.html +++ b/docs/interfaces/AdHocPauseControl.html @@ -1,6 +1,6 @@ -AdHocPauseControl | goban

    Interface AdHocPauseControl

    interface AdHocPauseControl {
        moderator_paused?: {
            moderator_id: number;
        };
        paused?: {
            pauses_left: number;
            pausing_player_id: number;
        };
        stone-removal?: true;
        system?: true;
        weekend?: true;
        [vacation: string]: any;
    }

    Indexable

    [vacation: string]: any

    Properties

    moderator_paused? +AdHocPauseControl | goban

    Interface AdHocPauseControl

    interface AdHocPauseControl {
        moderator_paused?: {
            moderator_id: number;
        };
        paused?: {
            pauses_left: number;
            pausing_player_id: number;
        };
        stone-removal?: true;
        system?: true;
        weekend?: true;
        [vacation: string]: any;
    }

    Indexable

    [vacation: string]: any

    Properties

    moderator_paused?: {
        moderator_id: number;
    }

    Type declaration

    • moderator_id: number
    paused?: {
        pauses_left: number;
        pausing_player_id: number;
    }

    Type declaration

    • pauses_left: number
    • pausing_player_id: number
    stone-removal?: true
    system?: true
    weekend?: true
    \ No newline at end of file +

    Properties

    moderator_paused?: {
        moderator_id: number;
    }

    Type declaration

    • moderator_id: number
    paused?: {
        pauses_left: number;
        pausing_player_id: number;
    }

    Type declaration

    • pauses_left: number
    • pausing_player_id: number
    stone-removal?: true
    system?: true
    weekend?: true
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPlayer.html b/docs/interfaces/AdHocPlayer.html index aa4efab6..fe78aadc 100644 --- a/docs/interfaces/AdHocPlayer.html +++ b/docs/interfaces/AdHocPlayer.html @@ -1,3 +1,3 @@ -AdHocPlayer | goban

    Interface AdHocPlayer

    interface AdHocPlayer {
        id: number;
        name: string;
    }

    Properties

    id +AdHocPlayer | goban

    Interface AdHocPlayer

    interface AdHocPlayer {
        id: number;
        name: string;
    }

    Properties

    Properties

    id: number
    name: string
    \ No newline at end of file +

    Properties

    id: number
    name: string
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPlayerClock.html b/docs/interfaces/AdHocPlayerClock.html index b53329cb..b10a3a84 100644 --- a/docs/interfaces/AdHocPlayerClock.html +++ b/docs/interfaces/AdHocPlayerClock.html @@ -1,4 +1,4 @@ -AdHocPlayerClock | goban

    Interface AdHocPlayerClock

    interface AdHocPlayerClock {
        block_time?: number;
        moves_left?: number;
        period_time?: number;
        periods?: number;
        skip_bonus?: boolean;
        thinking_time: number;
    }

    Properties

    block_time? +AdHocPlayerClock | goban

    Interface AdHocPlayerClock

    interface AdHocPlayerClock {
        block_time?: number;
        moves_left?: number;
        period_time?: number;
        periods?: number;
        skip_bonus?: boolean;
        thinking_time: number;
    }

    Properties

    block_time?: number

    Used with canadian time control. Time left (in seconds) to make the remainder of your moves in yu

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time?: number

    Used with byo-yomi time control. Length of each period, in seconds.

    -
    periods?: number

    Used with byo-yomi time control. Number of periods left.

    -
    skip_bonus?: boolean

    Used with fischer time control to denote that the next move should not +

    period_time?: number

    Used with byo-yomi time control. Length of each period, in seconds.

    +
    periods?: number

    Used with byo-yomi time control. Number of periods left.

    +
    skip_bonus?: boolean

    Used with fischer time control to denote that the next move should not increment the clock.

    -
    thinking_time: number

    Thinking time left, in seconds. Also used as main time for byo-yomi and +

    thinking_time: number

    Thinking time left, in seconds. Also used as main time for byo-yomi and canadian clocks.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioClockEvent.html b/docs/interfaces/AudioClockEvent.html index 1cc31f44..6704353c 100644 --- a/docs/interfaces/AudioClockEvent.html +++ b/docs/interfaces/AudioClockEvent.html @@ -1,14 +1,14 @@ -AudioClockEvent | goban

    Interface AudioClockEvent

    interface AudioClockEvent {
        clock: JGOFPlayerClock;
        color: PlayerColor;
        countdown_seconds: number;
        in_overtime: boolean;
        player_id: string;
        time_control_system: JGOFTimeControlSystem;
    }

    Properties

    clock +AudioClockEvent | goban

    Interface AudioClockEvent

    interface AudioClockEvent {
        clock: JGOFPlayerClock;
        color: PlayerColor;
        countdown_seconds: number;
        in_overtime: boolean;
        player_id: string;
        time_control_system: JGOFTimeControlSystem;
    }

    Properties

    Full player clock information

    -

    The player whose turn it is

    -
    countdown_seconds: number

    Number of seconds left in the current period

    -
    in_overtime: boolean

    True if we are in overtime. This is only ever set for systems that have +

    The player whose turn it is

    +
    countdown_seconds: number

    Number of seconds left in the current period

    +
    in_overtime: boolean

    True if we are in overtime. This is only ever set for systems that have a concept of overtime.

    -
    player_id: string

    The player (id) whose turn it is

    -
    time_control_system: JGOFTimeControlSystem

    Time control system being used by the clock

    -
    \ No newline at end of file +
    player_id: string

    The player (id) whose turn it is

    +
    time_control_system: JGOFTimeControlSystem

    Time control system being used by the clock

    +
    \ No newline at end of file diff --git a/docs/interfaces/BoardConfig.html b/docs/interfaces/BoardConfig.html index 6e162550..4bdb3182 100644 --- a/docs/interfaces/BoardConfig.html +++ b/docs/interfaces/BoardConfig.html @@ -1,4 +1,4 @@ -BoardConfig | goban

    Interface BoardConfig

    interface BoardConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        isobranch_hash?: string;
        player?: JGOFNumericPlayerColor;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Implemented by

    Properties

    black_prisoners? +BoardConfig | goban

    Interface BoardConfig

    interface BoardConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        isobranch_hash?: string;
        player?: JGOFNumericPlayerColor;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Implemented by

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    isobranch_hash?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file +

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    isobranch_hash?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/CanvasRendererGobanConfig.html b/docs/interfaces/CanvasRendererGobanConfig.html index 574b874b..b75f25fd 100644 --- a/docs/interfaces/CanvasRendererGobanConfig.html +++ b/docs/interfaces/CanvasRendererGobanConfig.html @@ -1,4 +1,4 @@ -CanvasRendererGobanConfig | goban

    Interface CanvasRendererGobanConfig

    interface CanvasRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +CanvasRendererGobanConfig | goban

    Interface CanvasRendererGobanConfig

    interface CanvasRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/ColoredCircle.html b/docs/interfaces/ColoredCircle.html index 858b7e1f..fedd3f6a 100644 --- a/docs/interfaces/ColoredCircle.html +++ b/docs/interfaces/ColoredCircle.html @@ -1,5 +1,5 @@ -ColoredCircle | goban

    Interface ColoredCircle

    interface ColoredCircle {
        border_color?: string;
        border_width?: number;
        color: string;
        move: JGOFIntersection;
    }

    Properties

    border_color? +ColoredCircle | goban

    Interface ColoredCircle

    interface ColoredCircle {
        border_color?: string;
        border_width?: number;
        color: string;
        move: JGOFIntersection;
    }

    Properties

    border_color?: string
    border_width?: number
    color: string
    \ No newline at end of file +

    Properties

    border_color?: string
    border_width?: number
    color: string
    \ No newline at end of file diff --git a/docs/interfaces/ConditionalMoveResponseTree.html b/docs/interfaces/ConditionalMoveResponseTree.html index c323f1d6..13e640ed 100644 --- a/docs/interfaces/ConditionalMoveResponseTree.html +++ b/docs/interfaces/ConditionalMoveResponseTree.html @@ -1 +1 @@ -ConditionalMoveResponseTree | goban

    Interface ConditionalMoveResponseTree

    interface ConditionalMoveResponseTree {
        [move: string]: ConditionalMoveResponse;
    }

    Indexable

    [move: string]: ConditionalMoveResponse
    \ No newline at end of file +ConditionalMoveResponseTree | goban

    Interface ConditionalMoveResponseTree

    interface ConditionalMoveResponseTree {
        [move: string]: ConditionalMoveResponse;
    }

    Indexable

    [move: string]: ConditionalMoveResponse
    \ No newline at end of file diff --git a/docs/interfaces/GobanBounds.html b/docs/interfaces/GobanBounds.html index ec9404cf..eb61d8b6 100644 --- a/docs/interfaces/GobanBounds.html +++ b/docs/interfaces/GobanBounds.html @@ -1,5 +1,5 @@ -GobanBounds | goban

    Interface GobanBounds

    interface GobanBounds {
        bottom: number;
        left: number;
        right: number;
        top: number;
    }

    Properties

    bottom +GobanBounds | goban

    Interface GobanBounds

    interface GobanBounds {
        bottom: number;
        left: number;
        right: number;
        top: number;
    }

    Properties

    Properties

    bottom: number
    left: number
    right: number
    top: number
    \ No newline at end of file +

    Properties

    bottom: number
    left: number
    right: number
    top: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanCallbacks.html b/docs/interfaces/GobanCallbacks.html index 43e81a74..2486b390 100644 --- a/docs/interfaces/GobanCallbacks.html +++ b/docs/interfaces/GobanCallbacks.html @@ -1,4 +1,4 @@ -GobanCallbacks | goban

    Interface GobanCallbacks

    interface GobanCallbacks {
        addCoordinatesToChatInput?: ((coordinates) => void);
        canvasAllocationErrorHandler?: ((note, error, extra) => void);
        customBlackStoneColor?: (() => string);
        customBlackStoneUrl?: (() => string);
        customBlackTextColor?: (() => string);
        customBoardColor?: (() => string);
        customBoardLineColor?: (() => string);
        customBoardUrl?: (() => string);
        customWhiteStoneColor?: (() => string);
        customWhiteStoneUrl?: (() => string);
        customWhiteTextColor?: (() => string);
        defaultConfig?: (() => any);
        getCDNReleaseBase?: (() => string);
        getClockDrift?: (() => number);
        getCoordinateDisplaySystem?: (() => "A1" | "1-1");
        getLocation?: (() => string);
        getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number");
        getNetworkLatency?: (() => number);
        getSelectedThemes?: (() => GobanSelectedThemes);
        getShowUndoRequestIndicator?: (() => boolean);
        getShowVariationMoveNumbers?: (() => boolean);
        getSoundEnabled?: (() => boolean);
        getSoundVolume?: (() => number);
        isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean);
        toast?: ((message_id, duration) => void);
        updateScoreEstimation?: ((est_winning_color, number_of_points) => void);
        watchSelectedThemes?: ((cb) => {
            remove: (() => any);
        });
    }

    Properties

    addCoordinatesToChatInput? +GobanCallbacks | goban

    Interface GobanCallbacks

    interface GobanCallbacks {
        addCoordinatesToChatInput?: ((coordinates) => void);
        canvasAllocationErrorHandler?: ((note, error, extra) => void);
        customBlackStoneColor?: (() => string);
        customBlackStoneUrl?: (() => string);
        customBlackTextColor?: (() => string);
        customBoardColor?: (() => string);
        customBoardLineColor?: (() => string);
        customBoardUrl?: (() => string);
        customWhiteStoneColor?: (() => string);
        customWhiteStoneUrl?: (() => string);
        customWhiteTextColor?: (() => string);
        defaultConfig?: (() => any);
        getCDNReleaseBase?: (() => string);
        getClockDrift?: (() => number);
        getCoordinateDisplaySystem?: (() => "A1" | "1-1");
        getLocation?: (() => string);
        getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number");
        getNetworkLatency?: (() => number);
        getSelectedThemes?: (() => GobanSelectedThemes);
        getShowUndoRequestIndicator?: (() => boolean);
        getShowVariationMoveNumbers?: (() => boolean);
        getSoundEnabled?: (() => boolean);
        getSoundVolume?: (() => number);
        isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean);
        toast?: ((message_id, duration) => void);
        updateScoreEstimation?: ((est_winning_color, number_of_points) => void);
        watchSelectedThemes?: ((cb) => {
            remove: (() => any);
        });
    }

    Properties

    addCoordinatesToChatInput?: ((coordinates) => void)

    Type declaration

      • (coordinates): void
      • Parameters

        • coordinates: string

        Returns void

    canvasAllocationErrorHandler?: ((note, error, extra) => void)

    Type declaration

      • (note, error, extra): void
      • Parameters

        • note: null | string
        • error: Error
        • extra: {
              height?: string | number;
              total_allocations_made: number;
              total_pixels_allocated: number;
              width?: string | number;
          }
          • Optional height?: string | number
          • total_allocations_made: number
          • total_pixels_allocated: number
          • Optional width?: string | number

        Returns void

    customBlackStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardLineColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    defaultConfig?: (() => any)

    Type declaration

      • (): any
      • Returns any

    getCDNReleaseBase?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getClockDrift?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getCoordinateDisplaySystem?: (() => "A1" | "1-1")

    Type declaration

      • (): "A1" | "1-1"
      • Returns "A1" | "1-1"

    getLocation?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number")

    Type declaration

      • (): "none" | "move-coordinates" | "move-number"
      • Returns "none" | "move-coordinates" | "move-number"

    getNetworkLatency?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getSelectedThemes?: (() => GobanSelectedThemes)

    Type declaration

    getShowUndoRequestIndicator?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getShowVariationMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundEnabled?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundVolume?: (() => number)

    Type declaration

      • (): number
      • Returns number

    isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean)

    Type declaration

      • (goban, perGameSettingAppliesToNonPlayers): boolean
      • Parameters

        • goban: GobanBase
        • perGameSettingAppliesToNonPlayers: boolean

        Returns boolean

    toast?: ((message_id, duration) => void)

    Type declaration

      • (message_id, duration): void
      • Parameters

        • message_id: string
        • duration: number

        Returns void

    updateScoreEstimation?: ((est_winning_color, number_of_points) => void)

    Type declaration

      • (est_winning_color, number_of_points): void
      • Parameters

        • est_winning_color: "black" | "white"
        • number_of_points: number

        Returns void

    watchSelectedThemes?: ((cb) => {
        remove: (() => any);
    })

    Type declaration

      • (cb): {
            remove: (() => any);
        }
      • Parameters

        Returns {
            remove: (() => any);
        }

        • remove: (() => any)
            • (): any
            • Returns any

    \ No newline at end of file +

    Properties

    addCoordinatesToChatInput?: ((coordinates) => void)

    Type declaration

      • (coordinates): void
      • Parameters

        • coordinates: string

        Returns void

    canvasAllocationErrorHandler?: ((note, error, extra) => void)

    Type declaration

      • (note, error, extra): void
      • Parameters

        • note: null | string
        • error: Error
        • extra: {
              height?: string | number;
              total_allocations_made: number;
              total_pixels_allocated: number;
              width?: string | number;
          }
          • Optional height?: string | number
          • total_allocations_made: number
          • total_pixels_allocated: number
          • Optional width?: string | number

        Returns void

    customBlackStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardLineColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    defaultConfig?: (() => any)

    Type declaration

      • (): any
      • Returns any

    getCDNReleaseBase?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getClockDrift?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getCoordinateDisplaySystem?: (() => "A1" | "1-1")

    Type declaration

      • (): "A1" | "1-1"
      • Returns "A1" | "1-1"

    getLocation?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number")

    Type declaration

      • (): "none" | "move-coordinates" | "move-number"
      • Returns "none" | "move-coordinates" | "move-number"

    getNetworkLatency?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getSelectedThemes?: (() => GobanSelectedThemes)

    Type declaration

    getShowUndoRequestIndicator?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getShowVariationMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundEnabled?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundVolume?: (() => number)

    Type declaration

      • (): number
      • Returns number

    isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean)

    Type declaration

      • (goban, perGameSettingAppliesToNonPlayers): boolean
      • Parameters

        • goban: GobanBase
        • perGameSettingAppliesToNonPlayers: boolean

        Returns boolean

    toast?: ((message_id, duration) => void)

    Type declaration

      • (message_id, duration): void
      • Parameters

        • message_id: string
        • duration: number

        Returns void

    updateScoreEstimation?: ((est_winning_color, number_of_points) => void)

    Type declaration

      • (est_winning_color, number_of_points): void
      • Parameters

        • est_winning_color: "black" | "white"
        • number_of_points: number

        Returns void

    watchSelectedThemes?: ((cb) => {
        remove: (() => any);
    })

    Type declaration

      • (cb): {
            remove: (() => any);
        }
      • Parameters

        Returns {
            remove: (() => any);
        }

        • remove: (() => any)
            • (): any
            • Returns any

    \ No newline at end of file diff --git a/docs/interfaces/GobanCanvasInterface.html b/docs/interfaces/GobanCanvasInterface.html index db118b5f..4dc069d1 100644 --- a/docs/interfaces/GobanCanvasInterface.html +++ b/docs/interfaces/GobanCanvasInterface.html @@ -1,4 +1,4 @@ -GobanCanvasInterface | goban

    Interface GobanCanvasInterface

    interface GobanCanvasInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindCanvasEvents(canvas): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine +GobanCanvasInterface | goban

    Interface GobanCanvasInterface

    interface GobanCanvasInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindCanvasEvents(canvas): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file +

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file diff --git a/docs/interfaces/GobanConfig.html b/docs/interfaces/GobanConfig.html index fd962267..79fee9f1 100644 --- a/docs/interfaces/GobanConfig.html +++ b/docs/interfaces/GobanConfig.html @@ -1,4 +1,4 @@ -GobanConfig | goban

    Interface GobanConfig

    interface GobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +GobanConfig | goban

    Interface GobanConfig

    interface GobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/GobanEngineConfig.html b/docs/interfaces/GobanEngineConfig.html index 1ea2f0e6..6a6e3484 100644 --- a/docs/interfaces/GobanEngineConfig.html +++ b/docs/interfaces/GobanEngineConfig.html @@ -1,4 +1,4 @@ -GobanEngineConfig | goban

    Interface GobanEngineConfig

    interface GobanEngineConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        clock?: GameClock;
        disable_analysis?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        latencies?: {
            [player_id: string]: number;
        };
        marks?: {
            [mark: string]: string;
        };
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +GobanEngineConfig | goban

    Interface GobanEngineConfig

    interface GobanEngineConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        clock?: GameClock;
        disable_analysis?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        latencies?: {
            [player_id: string]: number;
        };
        marks?: {
            [mark: string]: string;
        };
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    clock?: GameClock
    disable_analysis?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    move_tree?: MoveTreeJson
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    clock?: GameClock
    disable_analysis?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    move_tree?: MoveTreeJson
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/GobanEngineInitialState.html b/docs/interfaces/GobanEngineInitialState.html index 141ba708..8f6b0373 100644 --- a/docs/interfaces/GobanEngineInitialState.html +++ b/docs/interfaces/GobanEngineInitialState.html @@ -1,3 +1,3 @@ -GobanEngineInitialState | goban

    Interface GobanEngineInitialState

    interface GobanEngineInitialState {
        black?: string;
        white?: string;
    }

    Properties

    black? +GobanEngineInitialState | goban

    Interface GobanEngineInitialState

    interface GobanEngineInitialState {
        black?: string;
        white?: string;
    }

    Properties

    Properties

    black?: string
    white?: string
    \ No newline at end of file +

    Properties

    black?: string
    white?: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanEnginePlayerEntry.html b/docs/interfaces/GobanEnginePlayerEntry.html index 882618f3..2b5e5eba 100644 --- a/docs/interfaces/GobanEnginePlayerEntry.html +++ b/docs/interfaces/GobanEnginePlayerEntry.html @@ -1,4 +1,4 @@ -GobanEnginePlayerEntry | goban

    Interface GobanEnginePlayerEntry

    interface GobanEnginePlayerEntry {
        accepted_stones?: string;
        accepted_strict_seki_mode?: boolean;
        country?: string;
        id: number;
        name?: string;
        pro?: boolean;
        rank?: number;
        username: string;
    }

    Properties

    accepted_stones? +GobanEnginePlayerEntry | goban

    Interface GobanEnginePlayerEntry

    interface GobanEnginePlayerEntry {
        accepted_stones?: string;
        accepted_strict_seki_mode?: boolean;
        country?: string;
        id: number;
        name?: string;
        pro?: boolean;
        rank?: number;
        username: string;
    }

    Properties

    accepted_stones?: string

    The accepted stones for the stone removal phase that the player has accepted

    -
    accepted_strict_seki_mode?: boolean

    Whether or not the player has accepted scoring with strict seki mode on or not

    -
    country?: string
    id: number
    name?: string

    XXX: The server is using these, the client may or may not be, we need to normalize this

    -
    pro?: boolean
    rank?: number
    username: string
    \ No newline at end of file +
    accepted_strict_seki_mode?: boolean

    Whether or not the player has accepted scoring with strict seki mode on or not

    +
    country?: string
    id: number
    name?: string

    XXX: The server is using these, the client may or may not be, we need to normalize this

    +
    pro?: boolean
    rank?: number
    username: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanEvents.html b/docs/interfaces/GobanEvents.html index 380c0d6e..65de5593 100644 --- a/docs/interfaces/GobanEvents.html +++ b/docs/interfaces/GobanEvents.html @@ -1,4 +1,4 @@ -GobanEvents | goban

    Interface GobanEvents

    interface GobanEvents {
        advance-to-next-board: (() => void);
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        audio-capture-stones: ((obj) => void);
        audio-clock: ((event) => void);
        audio-disconnected: (() => void);
        audio-enter-stone-removal: (() => void);
        audio-game-ended: ((winner) => void);
        audio-game-paused: (() => void);
        audio-game-resumed: (() => void);
        audio-game-started: ((obj) => void);
        audio-other-player-disconnected: ((obj) => void);
        audio-other-player-reconnected: ((obj) => void);
        audio-pass: (() => void);
        audio-reconnected: (() => void);
        audio-resume-game-from-stone-removal: (() => void);
        audio-stone: ((obj) => void);
        audio-undo-granted: (() => void);
        audio-undo-requested: (() => void);
        auto-resign: ((obj) => void);
        captured-stones: ((obj) => void);
        chat: ((d) => void);
        chat-remove: ((ids) => void);
        chat-reset: (() => void);
        clear-auto-resign: ((obj) => void);
        clear-message: (() => void);
        clock: ((clock) => void);
        conditional-moves.updated: (() => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        destroy: (() => void);
        engine.updated: ((engine) => void);
        error: ((d) => void);
        gamedata: ((d) => void);
        last_official_move: ((d) => void);
        load: ((config) => void);
        mode: ((d) => void);
        move-made: (() => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        played-by-click: ((player) => void);
        player-update: ((player) => void);
        puzzle-correct-answer: (() => void);
        puzzle-place: ((obj) => void);
        puzzle-wrong-answer: (() => void);
        review.load-end: (() => void);
        review.load-start: (() => void);
        review.sync-to-current-move: (() => void);
        review.updated: (() => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        set-for-removal: {
            removed: boolean;
            x: number;
            y: number;
        };
        show-message: ((message) => void);
        stalling_score_estimate: ((data?) => void);
        state_text: ((state) => void);
        stone-removal.accepted: (() => void);
        stone-removal.needs-sealing: ((positions) => void);
        stone-removal.updated: (() => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        submitting-move: ((tf) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        update: (() => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    advance-to-next-board +GobanEvents | goban

    Interface GobanEvents

    interface GobanEvents {
        advance-to-next-board: (() => void);
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        audio-capture-stones: ((obj) => void);
        audio-clock: ((event) => void);
        audio-disconnected: (() => void);
        audio-enter-stone-removal: (() => void);
        audio-game-ended: ((winner) => void);
        audio-game-paused: (() => void);
        audio-game-resumed: (() => void);
        audio-game-started: ((obj) => void);
        audio-other-player-disconnected: ((obj) => void);
        audio-other-player-reconnected: ((obj) => void);
        audio-pass: (() => void);
        audio-reconnected: (() => void);
        audio-resume-game-from-stone-removal: (() => void);
        audio-stone: ((obj) => void);
        audio-undo-granted: (() => void);
        audio-undo-requested: (() => void);
        auto-resign: ((obj) => void);
        captured-stones: ((obj) => void);
        chat: ((d) => void);
        chat-remove: ((ids) => void);
        chat-reset: (() => void);
        clear-auto-resign: ((obj) => void);
        clear-message: (() => void);
        clock: ((clock) => void);
        conditional-moves.updated: (() => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        destroy: (() => void);
        engine.updated: ((engine) => void);
        error: ((d) => void);
        gamedata: ((d) => void);
        last_official_move: ((d) => void);
        load: ((config) => void);
        mode: ((d) => void);
        move-made: (() => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        played-by-click: ((player) => void);
        player-update: ((player) => void);
        puzzle-correct-answer: (() => void);
        puzzle-place: ((obj) => void);
        puzzle-wrong-answer: (() => void);
        review.load-end: (() => void);
        review.load-start: (() => void);
        review.sync-to-current-move: (() => void);
        review.updated: (() => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        set-for-removal: {
            removed: boolean;
            x: number;
            y: number;
        };
        show-message: ((message) => void);
        stalling_score_estimate: ((data?) => void);
        state_text: ((state) => void);
        stone-removal.accepted: (() => void);
        stone-removal.needs-sealing: ((positions) => void);
        stone-removal.updated: (() => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        submitting-move: ((tf) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        update: (() => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    advance-to-next-board: (() => void)

    Type declaration

      • (): void
      • Returns void

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    audio-capture-stones: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              already_captured: number;
              count: number;
          }
          • already_captured: number
          • count: number

        Returns void

    audio-clock: ((event) => void)

    Type declaration

    audio-disconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-enter-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-ended: ((winner) => void)

    Type declaration

      • (winner): void
      • Parameters

        • winner: "black" | "white" | "tie"

        Returns void

    audio-game-paused: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-resumed: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-started: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

            Player to move

            -

        Returns void

    audio-other-player-disconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-other-player-reconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-pass: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-reconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-resume-game-from-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-stone: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    audio-undo-granted: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-undo-requested: (() => void)

    Type declaration

      • (): void
      • Returns void

    auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number
          • game_id: number
          • player_id: number

        Returns void

    captured-stones: ((obj) => void)

    Type declaration

    chat: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    chat-remove: ((ids) => void)

    Type declaration

      • (ids): void
      • Parameters

        • ids: {
              chat_ids: string[];
          }
          • chat_ids: string[]

        Returns void

    chat-reset: (() => void)

    Type declaration

      • (): void
      • Returns void

    clear-auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              game_id: number;
              player_id: number;
          }
          • game_id: number
          • player_id: number

        Returns void

    clear-message: (() => void)

    Type declaration

      • (): void
      • Returns void

    clock: ((clock) => void)

    Type declaration

    conditional-moves.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    destroy: (() => void)

    Type declaration

      • (): void
      • Returns void

    engine.updated: ((engine) => void)

    Type declaration

      • (engine): void
      • Parameters

        Returns void

    error: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    gamedata: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    load: ((config) => void)

    Type declaration

      • (config): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    move-made: (() => void)

    Type declaration

      • (): void
      • Returns void

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    played-by-click: ((player) => void)

    Type declaration

      • (player): void
      • Parameters

        • player: {
              player_id: number;
              x: number;
              y: number;
          }
          • player_id: number
          • x: number
          • y: number

        Returns void

    player-update: ((player) => void)

    Type declaration

    puzzle-correct-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    puzzle-place: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    puzzle-wrong-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-end: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-start: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.sync-to-current-move: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    set-for-removal: {
        removed: boolean;
        x: number;
        y: number;
    }

    Type declaration

    • removed: boolean
    • x: number
    • y: number
    show-message: ((message) => void)

    Type declaration

      • (message): void
      • Parameters

        • message: {
              formatted: string;
              message_id: string;
              parameters?: {
                  [key: string]: any;
              };
          }
          • formatted: string
          • message_id: string
          • Optional parameters?: {
                [key: string]: any;
            }
            • [key: string]: any

        Returns void

    stalling_score_estimate: ((data?) => void)

    Type declaration

    state_text: ((state) => void)

    Type declaration

      • (state): void
      • Parameters

        • state: {
              show_moves_made_count?: boolean;
              title: string;
          }
          • Optional show_moves_made_count?: boolean
          • title: string

        Returns void

    stone-removal.accepted: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.needs-sealing: ((positions) => void)

    Type declaration

    stone-removal.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    submitting-move: ((tf) => void)

    Type declaration

      • (tf): void
      • Parameters

        • tf: boolean

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    update: (() => void)

    Type declaration

      • (): void
      • Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file +

    Properties

    advance-to-next-board: (() => void)

    Type declaration

      • (): void
      • Returns void

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    audio-capture-stones: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              already_captured: number;
              count: number;
          }
          • already_captured: number
          • count: number

        Returns void

    audio-clock: ((event) => void)

    Type declaration

    audio-disconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-enter-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-ended: ((winner) => void)

    Type declaration

      • (winner): void
      • Parameters

        • winner: "black" | "white" | "tie"

        Returns void

    audio-game-paused: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-resumed: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-started: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

            Player to move

            +

        Returns void

    audio-other-player-disconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-other-player-reconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-pass: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-reconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-resume-game-from-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-stone: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    audio-undo-granted: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-undo-requested: (() => void)

    Type declaration

      • (): void
      • Returns void

    auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number
          • game_id: number
          • player_id: number

        Returns void

    captured-stones: ((obj) => void)

    Type declaration

    chat: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    chat-remove: ((ids) => void)

    Type declaration

      • (ids): void
      • Parameters

        • ids: {
              chat_ids: string[];
          }
          • chat_ids: string[]

        Returns void

    chat-reset: (() => void)

    Type declaration

      • (): void
      • Returns void

    clear-auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              game_id: number;
              player_id: number;
          }
          • game_id: number
          • player_id: number

        Returns void

    clear-message: (() => void)

    Type declaration

      • (): void
      • Returns void

    clock: ((clock) => void)

    Type declaration

    conditional-moves.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    destroy: (() => void)

    Type declaration

      • (): void
      • Returns void

    engine.updated: ((engine) => void)

    Type declaration

      • (engine): void
      • Parameters

        Returns void

    error: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    gamedata: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    load: ((config) => void)

    Type declaration

      • (config): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    move-made: (() => void)

    Type declaration

      • (): void
      • Returns void

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    played-by-click: ((player) => void)

    Type declaration

      • (player): void
      • Parameters

        • player: {
              player_id: number;
              x: number;
              y: number;
          }
          • player_id: number
          • x: number
          • y: number

        Returns void

    player-update: ((player) => void)

    Type declaration

    puzzle-correct-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    puzzle-place: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    puzzle-wrong-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-end: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-start: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.sync-to-current-move: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    set-for-removal: {
        removed: boolean;
        x: number;
        y: number;
    }

    Type declaration

    • removed: boolean
    • x: number
    • y: number
    show-message: ((message) => void)

    Type declaration

      • (message): void
      • Parameters

        • message: {
              formatted: string;
              message_id: string;
              parameters?: {
                  [key: string]: any;
              };
          }
          • formatted: string
          • message_id: string
          • Optional parameters?: {
                [key: string]: any;
            }
            • [key: string]: any

        Returns void

    stalling_score_estimate: ((data?) => void)

    Type declaration

    state_text: ((state) => void)

    Type declaration

      • (state): void
      • Parameters

        • state: {
              show_moves_made_count?: boolean;
              title: string;
          }
          • Optional show_moves_made_count?: boolean
          • title: string

        Returns void

    stone-removal.accepted: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.needs-sealing: ((positions) => void)

    Type declaration

    stone-removal.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    submitting-move: ((tf) => void)

    Type declaration

      • (tf): void
      • Parameters

        • tf: boolean

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    update: (() => void)

    Type declaration

      • (): void
      • Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file diff --git a/docs/interfaces/GobanIOErrorMessageObject.html b/docs/interfaces/GobanIOErrorMessageObject.html index d929c676..4a496b53 100644 --- a/docs/interfaces/GobanIOErrorMessageObject.html +++ b/docs/interfaces/GobanIOErrorMessageObject.html @@ -1,3 +1,3 @@ -GobanIOErrorMessageObject | goban

    Interface GobanIOErrorMessageObject

    interface GobanIOErrorMessageObject {
        message_id: "failed_to_load_sgf";
        url: string;
    }

    Properties

    message_id +GobanIOErrorMessageObject | goban

    Interface GobanIOErrorMessageObject

    interface GobanIOErrorMessageObject {
        message_id: "failed_to_load_sgf";
        url: string;
    }

    Properties

    Properties

    message_id: "failed_to_load_sgf"
    url: string
    \ No newline at end of file +

    Properties

    message_id: "failed_to_load_sgf"
    url: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanMetrics.html b/docs/interfaces/GobanMetrics.html index 33608484..07085a54 100644 --- a/docs/interfaces/GobanMetrics.html +++ b/docs/interfaces/GobanMetrics.html @@ -1,5 +1,5 @@ -GobanMetrics | goban

    Interface GobanMetrics

    interface GobanMetrics {
        height: number;
        mid: number;
        offset: number;
        width: number;
    }

    Properties

    height +GobanMetrics | goban

    Interface GobanMetrics

    interface GobanMetrics {
        height: number;
        mid: number;
        offset: number;
        width: number;
    }

    Properties

    Properties

    height: number
    mid: number
    offset: number
    width: number
    \ No newline at end of file +

    Properties

    height: number
    mid: number
    offset: number
    width: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanMoveErrorMessageObject.html b/docs/interfaces/GobanMoveErrorMessageObject.html index 972aabfe..c968802f 100644 --- a/docs/interfaces/GobanMoveErrorMessageObject.html +++ b/docs/interfaces/GobanMoveErrorMessageObject.html @@ -1,4 +1,4 @@ -GobanMoveErrorMessageObject | goban

    Interface GobanMoveErrorMessageObject

    interface GobanMoveErrorMessageObject {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    Properties

    coords +GobanMoveErrorMessageObject | goban

    Interface GobanMoveErrorMessageObject

    interface GobanMoveErrorMessageObject {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    Properties

    coords: string
    move_number: number
    \ No newline at end of file +

    Properties

    coords: string
    move_number: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanSelectedThemes.html b/docs/interfaces/GobanSelectedThemes.html index 2d37cec6..343b2da3 100644 --- a/docs/interfaces/GobanSelectedThemes.html +++ b/docs/interfaces/GobanSelectedThemes.html @@ -1,6 +1,6 @@ -GobanSelectedThemes | goban

    Interface GobanSelectedThemes

    interface GobanSelectedThemes {
        black: string;
        board: string;
        removal-graphic: "x" | "square";
        removal-scale: number;
        white: string;
    }

    Properties

    black +GobanSelectedThemes | goban

    Interface GobanSelectedThemes

    interface GobanSelectedThemes {
        black: string;
        board: string;
        removal-graphic: "x" | "square";
        removal-scale: number;
        white: string;
    }

    Properties

    black: string
    board: string
    removal-graphic: "x" | "square"
    removal-scale: number
    white: string
    \ No newline at end of file +

    Properties

    black: string
    board: string
    removal-graphic: "x" | "square"
    removal-scale: number
    white: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanSocketEvents.html b/docs/interfaces/GobanSocketEvents.html index ae5576bd..bf949309 100644 --- a/docs/interfaces/GobanSocketEvents.html +++ b/docs/interfaces/GobanSocketEvents.html @@ -1,4 +1,4 @@ -GobanSocketEvents | goban

    Interface GobanSocketEvents

    interface GobanSocketEvents {
        ERROR: ((data) => void);
        HUP: (() => void);
        active-bots: ((data) => void);
        active_game: ((data) => void);
        automatch/cancel: ((data) => void);
        automatch/entry: ((data) => void);
        automatch/start: ((data) => void);
        chat-join: ((data) => void);
        chat-message: ((data) => void);
        chat-message-removed: ((data) => void);
        chat-part: ((data) => void);
        chat-topic: ((data) => void);
        chat-update-user: ((data) => void);
        connect: (() => void);
        disconnect: ((code) => void);
        game/:id/auto_resign: ((data) => void);
        game/:id/chat: ((data) => void);
        game/:id/chat/remove: ((data) => void);
        game/:id/clear_auto_resign: ((data) => void);
        game/:id/clock: ((data) => void);
        game/:id/conditional_moves: ((data) => void);
        game/:id/error: ((data) => void);
        game/:id/gamedata: ((data) => void);
        game/:id/latency: ((data) => void);
        game/:id/phase: ((data) => void);
        game/:id/removed_stones: ((data) => void);
        game/:id/removed_stones_accepted: ((data) => void);
        game/:id/reset-chats: (() => void);
        game/:id/stalling_score_estimate: ((data?) => void);
        game/:id/undo_accepted: ((data) => void);
        game/:id/undo_canceled: ((data) => void);
        game/:id/undo_requested: ((data) => void);
        gamelist-count: ((data) => void);
        gamelist-count-:channel: ((data) => void);
        hostinfo: ((data) => void);
        incident-report: ((data) => void);
        itc: ((data) => void);
        latency: ((latency, clock_drift) => void);
        net/pong: ((data) => void);
        notification: ((data) => void);
        private-message: ((data) => void);
        private-superchat: ((data) => void);
        reconnect: (() => void);
        remote_storage/sync_complete: (() => void);
        remote_storage/update: ((data) => void);
        review/:id/full_state: ((data) => void);
        review/:id/r: ((data) => void);
        score-estimator-enabled-state: ((data) => void);
        seekgraph/global: ((messages) => void);
        timeout: (() => void);
        ui-push: ((data) => void);
        unrecoverable_error: ((code, tag, message) => void);
        user/jwt: ((jwt) => void);
        user/state: ((data) => void);
        user/update: ((user) => void);
    }

    Hierarchy (view full)

    Properties

    ERROR +GobanSocketEvents | goban

    Interface GobanSocketEvents

    interface GobanSocketEvents {
        ERROR: ((data) => void);
        HUP: (() => void);
        active-bots: ((data) => void);
        active_game: ((data) => void);
        automatch/cancel: ((data) => void);
        automatch/entry: ((data) => void);
        automatch/start: ((data) => void);
        chat-join: ((data) => void);
        chat-message: ((data) => void);
        chat-message-removed: ((data) => void);
        chat-part: ((data) => void);
        chat-topic: ((data) => void);
        chat-update-user: ((data) => void);
        connect: (() => void);
        disconnect: ((code) => void);
        game/:id/auto_resign: ((data) => void);
        game/:id/chat: ((data) => void);
        game/:id/chat/remove: ((data) => void);
        game/:id/clear_auto_resign: ((data) => void);
        game/:id/clock: ((data) => void);
        game/:id/conditional_moves: ((data) => void);
        game/:id/error: ((data) => void);
        game/:id/gamedata: ((data) => void);
        game/:id/latency: ((data) => void);
        game/:id/phase: ((data) => void);
        game/:id/removed_stones: ((data) => void);
        game/:id/removed_stones_accepted: ((data) => void);
        game/:id/reset-chats: (() => void);
        game/:id/stalling_score_estimate: ((data?) => void);
        game/:id/undo_accepted: ((data) => void);
        game/:id/undo_canceled: ((data) => void);
        game/:id/undo_requested: ((data) => void);
        gamelist-count: ((data) => void);
        gamelist-count-:channel: ((data) => void);
        hostinfo: ((data) => void);
        incident-report: ((data) => void);
        itc: ((data) => void);
        latency: ((latency, clock_drift) => void);
        net/pong: ((data) => void);
        notification: ((data) => void);
        private-message: ((data) => void);
        private-superchat: ((data) => void);
        reconnect: (() => void);
        remote_storage/sync_complete: (() => void);
        remote_storage/update: ((data) => void);
        review/:id/full_state: ((data) => void);
        review/:id/r: ((data) => void);
        score-estimator-enabled-state: ((data) => void);
        seekgraph/global: ((messages) => void);
        timeout: (() => void);
        ui-push: ((data) => void);
        unrecoverable_error: ((code, tag, message) => void);
        user/jwt: ((jwt) => void);
        user/state: ((data) => void);
        user/update: ((user) => void);
    }

    Hierarchy (view full)

    Properties

    ERROR HUP active-bots active_game @@ -56,16 +56,16 @@

    Properties

    ERROR: ((data) => void)

    An error occurred, the message string should be displayed to the user. For a list of errcode's used, see https://github.com/online-go/online-go.com/blob/devel/src/components/Errcode/Errcode.tsx

    -

    Type declaration

      • (data): void
      • Parameters

        • data: string | {
              errcode: string;
          }

        Returns void

    HUP: (() => void)

    The client should reload

    -

    Type declaration

      • (): void
      • Returns void

    active-bots: ((data) => void)

    Updates the list of bots that are connected and ready to the server

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [id: number]: User;
          }

        Returns void

    active_game: ((data) => void)

    Message to inform the client of an active game, or a change to an existing game

    -

    Type declaration

    automatch/cancel: ((data) => void)

    An automatch request was canceled

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/entry: ((data) => void)

    An automatch request is active

    -

    Type declaration

    automatch/start: ((data) => void)

    An automatch request was started

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              uuid: string;
          }
          • game_id: number
          • uuid: string

        Returns void

    chat-join: ((data) => void)

    User(s) joined a chat channel

    +

    Type declaration

      • (data): void
      • Parameters

        • data: string | {
              errcode: string;
          }

        Returns void

    HUP: (() => void)

    The client should reload

    +

    Type declaration

      • (): void
      • Returns void

    active-bots: ((data) => void)

    Updates the list of bots that are connected and ready to the server

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [id: number]: User;
          }

        Returns void

    active_game: ((data) => void)

    Message to inform the client of an active game, or a change to an existing game

    +

    Type declaration

    automatch/cancel: ((data) => void)

    An automatch request was canceled

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/entry: ((data) => void)

    An automatch request is active

    +

    Type declaration

    automatch/start: ((data) => void)

    An automatch request was started

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              uuid: string;
          }
          • game_id: number
          • uuid: string

        Returns void

    chat-join: ((data) => void)

    User(s) joined a chat channel

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              users: User[];
          }
          • channel: string

            The channel

          • users: User[]

            List of users that joined

            -

        Returns void

    chat-message: ((data) => void)

    Chat message was received

    +

    Returns void

    chat-message: ((data) => void)

    Chat message was received

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              message: {
                  i?: string;
                  m: string;
                  t: number;
              };
              professional: boolean;
              ranking: number;
              system?: true;
              system_message_type?: "flood";
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

          • Optional country?: string

            Country the user is from

          • id: number

            User id of the sender

            @@ -78,14 +78,14 @@
          • Optional system?: true

            Whether it's a system message or not

          • Optional system_message_type?: "flood"
          • ui_class: string

            UI class of the sender

          • username: string

            Username of the sender

            -

        Returns void

    chat-message-removed: ((data) => void)

    A chat message should be removed from the display

    +

    Returns void

    chat-message-removed: ((data) => void)

    A chat message should be removed from the display

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              uuid: string;
          }
          • channel: string

            The channel

          • uuid: string

            Message id. Note, despite the name, I don't think this is always a uuid in uuid format, just treat it as a string.

            -

        Returns void

    chat-part: ((data) => void)

    User left a chat channel

    +

    Returns void

    chat-part: ((data) => void)

    User left a chat channel

    Type declaration

    chat-topic: ((data) => void)

    Channel topic was updated

    +

    Returns void

    chat-topic: ((data) => void)

    Channel topic was updated

    Type declaration

    chat-update-user: ((data) => void)

    A user's profile was updated

    +

    Returns void

    chat-update-user: ((data) => void)

    A user's profile was updated

    Type declaration

    connect: (() => void)

    Type declaration

    disconnect: ((code) => void)

    Type declaration

    game/:id/auto_resign: ((data) => void)

    Informs the client the player is scheduled to resign if not cleared

    +

    Returns void

    connect: (() => void)

    Type declaration

    disconnect: ((code) => void)

    Type declaration

    game/:id/auto_resign: ((data) => void)

    Informs the client the player is scheduled to resign if not cleared

    Type declaration

    game/:id/chat: ((data) => void)

    A game chat message

    -

    Type declaration

    game/:id/chat/remove: ((data) => void)

    Game chat lines should be removed

    +

    Returns void

    game/:id/chat: ((data) => void)

    A game chat message

    +

    Type declaration

    game/:id/chat/remove: ((data) => void)

    Game chat lines should be removed

    Type declaration

    game/:id/clear_auto_resign: ((data) => void)

    The auto resign for the given player has been cleared

    +

    Returns void

    game/:id/clear_auto_resign: ((data) => void)

    The auto resign for the given player has been cleared

    Type declaration

    game/:id/clock: ((data) => void)

    Game clock update

    -

    Type declaration

    game/:id/conditional_moves: ((data) => void)

    Update the conditional moves currently active

    +

    Returns void

    game/:id/clock: ((data) => void)

    Game clock update

    +

    Type declaration

    game/:id/conditional_moves: ((data) => void)

    Update the conditional moves currently active

    Type declaration

    game/:id/error: ((data) => void)

    Error that should be displayed to the user

    -

    Type declaration

    game/:id/gamedata: ((data) => void)

    Update the entire game state

    -

    Type declaration

    game/:id/latency: ((data) => void)

    Update latency information for a player

    +

    Returns void

    game/:id/error: ((data) => void)

    Error that should be displayed to the user

    +

    Type declaration

    game/:id/gamedata: ((data) => void)

    Update the entire game state

    +

    Type declaration

    game/:id/latency: ((data) => void)

    Update latency information for a player

    Type declaration

    game/:id/phase: ((data) => void)

    The phase has changed for the game

    -

    Type declaration

    game/:id/removed_stones: ((data) => void)

    Update the state of the stone removal phase

    -

    Type declaration

    game/:id/removed_stones_accepted: ((data) => void)

    The stone removal phase has been completed, this is the final state and +

    Returns void

    game/:id/phase: ((data) => void)

    The phase has changed for the game

    +

    Type declaration

    game/:id/removed_stones: ((data) => void)

    Update the state of the stone removal phase

    +

    Type declaration

    game/:id/removed_stones_accepted: ((data) => void)

    The stone removal phase has been completed, this is the final state and indicates a phase change to the given phase (should always be "finished")

    Type declaration

    game/:id/reset-chats: (() => void)

    The chat log should be reset.

    -

    Type declaration

    game/:id/stalling_score_estimate: ((data?) => void)

    A score estimation result has been broadcast, this is used for avoiding game stalling

    -

    Type declaration

    game/:id/undo_accepted: ((data) => void)

    Undo move has been accepted, the parameter is the new move number

    -

    Type declaration

    game/:id/undo_canceled: ((data) => void)

    Undo request has been canceled, the parameter is the move number of the original request

    -

    Type declaration

    game/:id/undo_requested: ((data) => void)

    Undo request has been requested, the parameter is the move number that we want to go back to

    -

    Type declaration

    gamelist-count: ((data) => void)

    Update number of live and correspondence games are currently being +

    Returns void

    game/:id/reset-chats: (() => void)

    The chat log should be reset.

    +

    Type declaration

    game/:id/stalling_score_estimate: ((data?) => void)

    A score estimation result has been broadcast, this is used for avoiding game stalling

    +

    Type declaration

    game/:id/undo_accepted: ((data) => void)

    Undo move has been accepted, the parameter is the new move number

    +

    Type declaration

    game/:id/undo_canceled: ((data) => void)

    Undo request has been canceled, the parameter is the move number of the original request

    +

    Type declaration

    game/:id/undo_requested: ((data) => void)

    Undo request has been requested, the parameter is the move number that we want to go back to

    +

    Type declaration

    gamelist-count: ((data) => void)

    Update number of live and correspondence games are currently being played

    Type declaration

    gamelist-count-:channel: ((data) => void)

    Update number of live and correspondence games are currently being +

    Returns void

    gamelist-count-:channel: ((data) => void)

    Update number of live and correspondence games are currently being played in a particular channel

    Type declaration

    hostinfo: ((data) => void)

    General host information for the termination server you +

    Returns void

    hostinfo: ((data) => void)

    General host information for the termination server you are connected to. This is a response to the hostinfo client message.

    Type declaration

    incident-report: ((data) => void)

    Incident report update

    -

    Type declaration

    itc: ((data) => void)

    "Inter Tab Communication" message. This is a client utility to enable +

    Returns void

    incident-report: ((data) => void)

    Incident report update

    +

    Type declaration

    itc: ((data) => void)

    "Inter Tab Communication" message. This is a client utility to enable relaying of messages between devices - the event and data are application defined, the server blindly relays to all connected devices for the sending user. Note this is relayed to all devices regardless @@ -168,17 +168,17 @@ the web client sending this will arrive on an android and ios instance)

    Type declaration

    latency: ((latency, clock_drift) => void)

    Type declaration

    net/pong: ((data) => void)

    Pong response from a ping

    +

    Returns void

    latency: ((latency, clock_drift) => void)

    Type declaration

    net/pong: ((data) => void)

    Pong response from a ping

    Type declaration

    notification: ((data) => void)

    A notification that should be displayed to the user +

    Returns void

    notification: ((data) => void)

    A notification that should be displayed to the user These are not strongly modeled, see https://github.com/online-go/online-go.com/blob/devel/src/components/Notifications/Notifications.tsx as a reference for what types there are and what data they contain

    Type declaration

    private-message: ((data) => void)

    A private message was received

    +

    Returns void

    private-message: ((data) => void)

    A private message was received

    Type declaration

    private-superchat: ((data) => void)

    Notify the client that a private message "super chat" has started. A +

    Returns void

    private-superchat: ((data) => void)

    Notify the client that a private message "super chat" has started. A super chat is an undismissable chat sent by a moderator. It should take all focus and not let the client do anything until the conversation is resolved (the enable flag is set to false)

    @@ -199,30 +199,30 @@
  • moderator_username: string

    The moderator username contacting the player

  • player_id: number

    Your id

  • player_username: string

    Your username

    -
  • Returns void

    reconnect: (() => void)

    Type declaration

    remote_storage/sync_complete: (() => void)

    Notification that the server has completed sending all remote storage +

    Returns void

    reconnect: (() => void)

    Type declaration

    remote_storage/sync_complete: (() => void)

    Notification that the server has completed sending all remote storage data and the client should now be up to date.

    -

    Type declaration

    remote_storage/update: ((data) => void)

    Updates a key value pair

    +

    Type declaration

    remote_storage/update: ((data) => void)

    Updates a key value pair

    Type declaration

    review/:id/full_state: ((data) => void)

    Replay of the entire full state of the review

    -

    Type declaration

    review/:id/r: ((data) => void)

    An incremental modification to the review stream

    -

    Type declaration

    score-estimator-enabled-state: ((data) => void)

    Notifies the client whether the the client shares an IP with one of the +

    Returns void

    review/:id/full_state: ((data) => void)

    Replay of the entire full state of the review

    +

    Type declaration

    review/:id/r: ((data) => void)

    An incremental modification to the review stream

    +

    Type declaration

    score-estimator-enabled-state: ((data) => void)

    Notifies the client whether the the client shares an IP with one of the players of the game. This is used to disable the score estimator in anonymous browsing windows for players of a game when the score estimator is disabled for the game.

    Type declaration

    seekgraph/global: ((messages) => void)

    Type declaration

    timeout: (() => void)

    Type declaration

    ui-push: ((data) => void)

    A UI Push notification. The event and data are not well defined here, +

    Returns void

    seekgraph/global: ((messages) => void)

    Type declaration

    timeout: (() => void)

    Type declaration

    ui-push: ((data) => void)

    A UI Push notification. The event and data are not well defined here, they come as a result to subscribing to ui push channels with ui-pushes/subscribe.

    Type declaration

    unrecoverable_error: ((code, tag, message) => void)

    Type declaration

    user/jwt: ((jwt) => void)

    Update the user's JWT token

    -

    Type declaration

    user/state: ((data) => void)

    Updates whether a user is online or not. Subscribe to these updates for +

    Returns void

    unrecoverable_error: ((code, tag, message) => void)

    Type declaration

    user/jwt: ((jwt) => void)

    Update the user's JWT token

    +

    Type declaration

    user/state: ((data) => void)

    Updates whether a user is online or not. Subscribe to these updates for particular users using the user/monitor command.

    -

    Type declaration

    user/update: ((user) => void)

    Update user information. For other players, this has the standard User +

    Type declaration

    user/update: ((user) => void)

    Update user information. For other players, this has the standard User fields, when this is the current user, it can have additional fields that are found in the ui/config

    -

    Type declaration

    \ No newline at end of file +

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/GobanThemeBackgroundCSS.html b/docs/interfaces/GobanThemeBackgroundCSS.html index 28fe5e1c..78c8bd64 100644 --- a/docs/interfaces/GobanThemeBackgroundCSS.html +++ b/docs/interfaces/GobanThemeBackgroundCSS.html @@ -1,4 +1,4 @@ -GobanThemeBackgroundCSS | goban

    Interface GobanThemeBackgroundCSS

    interface GobanThemeBackgroundCSS {
        background-color?: string;
        background-image?: string;
        background-size?: string;
    }

    Properties

    background-color? +GobanThemeBackgroundCSS | goban

    Interface GobanThemeBackgroundCSS

    interface GobanThemeBackgroundCSS {
        background-color?: string;
        background-image?: string;
        background-size?: string;
    }

    Properties

    background-color?: string
    background-image?: string
    background-size?: string
    \ No newline at end of file +

    Properties

    background-color?: string
    background-image?: string
    background-size?: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanThemeBackgroundReactStyles.html b/docs/interfaces/GobanThemeBackgroundReactStyles.html index 30b5c680..57257c5a 100644 --- a/docs/interfaces/GobanThemeBackgroundReactStyles.html +++ b/docs/interfaces/GobanThemeBackgroundReactStyles.html @@ -1,4 +1,4 @@ -GobanThemeBackgroundReactStyles | goban

    Interface GobanThemeBackgroundReactStyles

    interface GobanThemeBackgroundReactStyles {
        backgroundColor?: string;
        backgroundImage?: string;
        backgroundSize?: string;
    }

    Properties

    backgroundColor? +GobanThemeBackgroundReactStyles | goban

    Interface GobanThemeBackgroundReactStyles

    interface GobanThemeBackgroundReactStyles {
        backgroundColor?: string;
        backgroundImage?: string;
        backgroundSize?: string;
    }

    Properties

    backgroundColor?: string
    backgroundImage?: string
    backgroundSize?: string
    \ No newline at end of file +

    Properties

    backgroundColor?: string
    backgroundImage?: string
    backgroundSize?: string
    \ No newline at end of file diff --git a/docs/interfaces/JGOF.html b/docs/interfaces/JGOF.html index e65c4f29..c93a5b7d 100644 --- a/docs/interfaces/JGOF.html +++ b/docs/interfaces/JGOF.html @@ -1,14 +1,14 @@ JGOF | goban

    Interface JGOF

    JGOF (JSON Go Format) is an attempt at normalizing the AdHocFormat.

    -
    interface JGOF {
        ai_reviews?: {
            [id: string]: JGOFAIReview;
        };
        black?: JGOFPlayer | JGOFPlayer[];
        clock?: JGOFClock;
        jgof: 1;
        time_control?: JGOFTimeControl;
        white?: JGOFPlayer | JGOFPlayer[];
    }

    Properties

    interface JGOF {
        ai_reviews?: {
            [id: string]: JGOFAIReview;
        };
        black?: JGOFPlayer | JGOFPlayer[];
        clock?: JGOFClock;
        jgof: 1;
        time_control?: JGOFTimeControl;
        white?: JGOFPlayer | JGOFPlayer[];
    }

    Properties

    ai_reviews?: {
        [id: string]: JGOFAIReview;
    }

    AI Review information computed for this game

    -

    Type declaration

    Player information for those playing Black

    -
    clock?: JGOFClock

    Current clock information, this is used for ongoing games

    -
    jgof: 1

    JGOF version number

    -
    time_control?: JGOFTimeControl

    Time control settings for the game

    -

    Player information for those playing White

    -
    \ No newline at end of file +

    Type declaration

    black?: JGOFPlayer | JGOFPlayer[]

    Player information for those playing Black

    +
    clock?: JGOFClock

    Current clock information, this is used for ongoing games

    +
    jgof: 1

    JGOF version number

    +
    time_control?: JGOFTimeControl

    Time control settings for the game

    +
    white?: JGOFPlayer | JGOFPlayer[]

    Player information for those playing White

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReview.html b/docs/interfaces/JGOFAIReview.html index 18511fcb..28a096fd 100644 --- a/docs/interfaces/JGOFAIReview.html +++ b/docs/interfaces/JGOFAIReview.html @@ -1,5 +1,5 @@ JGOFAIReview | goban

    Interface JGOFAIReview


    -
    interface JGOFAIReview {
        analyzed_variations?: {
            [var_key: string]: JGOFAIReviewMove;
        };
        date: number;
        engine: string;
        engine_version: string;
        error?: {
            coords: string;
            message_id: GobanMoveErrorMessageId;
            move_number: number;
        };
        id: string;
        moves: {
            [move_number: string]: JGOFAIReviewMove;
        };
        network: string;
        network_size: string;
        scores?: number[];
        strength: number;
        type: "fast" | "full";
        uuid: string;
        win_rate: number;
        win_rates?: number[];
    }

    Properties

    interface JGOFAIReview {
        analyzed_variations?: {
            [var_key: string]: JGOFAIReviewMove;
        };
        date: number;
        engine: string;
        engine_version: string;
        error?: {
            coords: string;
            message_id: GobanMoveErrorMessageId;
            move_number: number;
        };
        id: string;
        moves: {
            [move_number: string]: JGOFAIReviewMove;
        };
        network: string;
        network_size: string;
        scores?: number[];
        strength: number;
        type: "fast" | "full";
        uuid: string;
        win_rate: number;
        win_rates?: number[];
    }

    Properties

    analyzed_variations?: {
        [var_key: string]: JGOFAIReviewMove;
    }

    Analysis of variations in the game.

    -

    Type declaration

    date: number

    millisecond epoch time (ms from 1970 UTC)

    -
    engine: string
    engine_version: string
    error?: {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    If there was an error processing the review, it can be stored here

    -

    Type declaration

    id: string
    moves: {
        [move_number: string]: JGOFAIReviewMove;
    }

    Analysis of moves in the game.

    -

    Type declaration

    network: string
    network_size: string
    scores?: number[]

    predicted scores that black will win or lose by (negative for loss) for all moves

    -
    strength: number
    type: "fast" | "full"

    A fast review typically only has a few moves reviewed, whereas a full +

    Type declaration

    date: number

    millisecond epoch time (ms from 1970 UTC)

    +
    engine: string
    engine_version: string
    error?: {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    If there was an error processing the review, it can be stored here

    +

    Type declaration

    id: string
    moves: {
        [move_number: string]: JGOFAIReviewMove;
    }

    Analysis of moves in the game.

    +

    Type declaration

    network: string
    network_size: string
    scores?: number[]

    predicted scores that black will win or lose by (negative for loss) for all moves

    +
    strength: number
    type: "fast" | "full"

    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.

    -
    uuid: string
    win_rate: number

    predicted probability that black will win the last move

    -
    win_rates?: number[]

    predicted probability that black will win for all moves

    -
    \ No newline at end of file +
    uuid: string
    win_rate: number

    predicted probability that black will win the last move

    +
    win_rates?: number[]

    predicted probability that black will win for all moves

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReviewMove.html b/docs/interfaces/JGOFAIReviewMove.html index 1b4bde88..58a6e926 100644 --- a/docs/interfaces/JGOFAIReviewMove.html +++ b/docs/interfaces/JGOFAIReviewMove.html @@ -1,13 +1,13 @@ -JGOFAIReviewMove | goban

    Interface JGOFAIReviewMove

    interface JGOFAIReviewMove {
        branches: JGOFAIReviewMoveVariation[];
        move: JGOFIntersection;
        move_number: number;
        ownership?: number[][];
        score?: number;
        win_rate: number;
    }

    Properties

    branches +JGOFAIReviewMove | goban

    Interface JGOFAIReviewMove

    interface JGOFAIReviewMove {
        branches: JGOFAIReviewMoveVariation[];
        move: JGOFIntersection;
        move_number: number;
        ownership?: number[][];
        score?: number;
        win_rate: number;
    }

    Properties

    Followup move branches explored

    -

    The move that was played.

    -
    move_number: number

    The move number. This is 1 indexed.

    -
    ownership?: number[][]

    A width*height array of ownership values

    -
    score?: number

    How many points black is predicted to win by (if positive, lose by if negative)

    -
    win_rate: number

    Probability of black winning after this move was made

    -
    \ No newline at end of file +

    The move that was played.

    +
    move_number: number

    The move number. This is 1 indexed.

    +
    ownership?: number[][]

    A width*height array of ownership values

    +
    score?: number

    How many points black is predicted to win by (if positive, lose by if negative)

    +
    win_rate: number

    Probability of black winning after this move was made

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReviewMoveVariation.html b/docs/interfaces/JGOFAIReviewMoveVariation.html index 8c6889e0..1207c128 100644 --- a/docs/interfaces/JGOFAIReviewMoveVariation.html +++ b/docs/interfaces/JGOFAIReviewMoveVariation.html @@ -1,4 +1,4 @@ -JGOFAIReviewMoveVariation | goban

    Interface JGOFAIReviewMoveVariation

    interface JGOFAIReviewMoveVariation {
        lcb?: number;
        moves: JGOFIntersection[];
        policy?: number;
        score?: number;
        score_mean?: number;
        score_stdev?: number;
        utility?: number;
        utility_lcb?: number;
        visits: number;
        win_rate: number;
    }

    Properties

    lcb? +JGOFAIReviewMoveVariation | goban

    Interface JGOFAIReviewMoveVariation

    interface JGOFAIReviewMoveVariation {
        lcb?: number;
        moves: JGOFIntersection[];
        policy?: number;
        score?: number;
        score_mean?: number;
        score_stdev?: number;
        utility?: number;
        utility_lcb?: number;
        visits: number;
        win_rate: number;
    }

    Properties

    lcb? moves policy? score? @@ -9,13 +9,13 @@ visits win_rate

    Properties

    lcb?: number

    lower confidence bound, both KataGo and LeelaZero provide this

    -

    Followup predicted moves by the AI

    -
    policy?: number

    From Leela Zero

    -
    score?: number

    How many points black is predicted to win for this variation (or lose by if negative)

    -
    score_mean?: number

    From KataGo

    -
    score_stdev?: number

    From KataGo

    -
    utility?: number

    From KataGo

    -
    utility_lcb?: number

    From KataGo

    -
    visits: number

    Number of times the AI considered the first move of this variation

    -
    win_rate: number

    Probability of black wining to report for this variation

    -
    \ No newline at end of file +

    Followup predicted moves by the AI

    +
    policy?: number

    From Leela Zero

    +
    score?: number

    How many points black is predicted to win for this variation (or lose by if negative)

    +
    score_mean?: number

    From KataGo

    +
    score_stdev?: number

    From KataGo

    +
    utility?: number

    From KataGo

    +
    utility_lcb?: number

    From KataGo

    +
    visits: number

    Number of times the AI considered the first move of this variation

    +
    win_rate: number

    Probability of black wining to report for this variation

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAbsoluteTimeControl.html b/docs/interfaces/JGOFAbsoluteTimeControl.html index 06120470..c96963d0 100644 --- a/docs/interfaces/JGOFAbsoluteTimeControl.html +++ b/docs/interfaces/JGOFAbsoluteTimeControl.html @@ -1,5 +1,5 @@ -JGOFAbsoluteTimeControl | goban

    Interface JGOFAbsoluteTimeControl

    interface JGOFAbsoluteTimeControl {
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "absolute";
        total_time: number;
    }

    Properties

    pause_on_weekends +JGOFAbsoluteTimeControl | goban

    Interface JGOFAbsoluteTimeControl

    interface JGOFAbsoluteTimeControl {
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "absolute";
        total_time: number;
    }

    Properties

    pause_on_weekends: boolean
    system: "absolute"
    total_time: number
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    system: "absolute"
    total_time: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFByoYomiTimeControl.html b/docs/interfaces/JGOFByoYomiTimeControl.html index 0769521f..2419971e 100644 --- a/docs/interfaces/JGOFByoYomiTimeControl.html +++ b/docs/interfaces/JGOFByoYomiTimeControl.html @@ -1,7 +1,7 @@ -JGOFByoYomiTimeControl | goban

    Interface JGOFByoYomiTimeControl

    interface JGOFByoYomiTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        periods: number;
        speed: JGOFTimeControlSpeed;
        system: "byoyomi";
    }

    Properties

    main_time +JGOFByoYomiTimeControl | goban

    Interface JGOFByoYomiTimeControl

    interface JGOFByoYomiTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        periods: number;
        speed: JGOFTimeControlSpeed;
        system: "byoyomi";
    }

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    periods: number
    system: "byoyomi"
    \ No newline at end of file +

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    periods: number
    system: "byoyomi"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFCanadianTimeControl.html b/docs/interfaces/JGOFCanadianTimeControl.html index c1b7ec11..d08210d2 100644 --- a/docs/interfaces/JGOFCanadianTimeControl.html +++ b/docs/interfaces/JGOFCanadianTimeControl.html @@ -1,7 +1,7 @@ -JGOFCanadianTimeControl | goban

    Interface JGOFCanadianTimeControl

    interface JGOFCanadianTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        speed: JGOFTimeControlSpeed;
        stones_per_period: number;
        system: "canadian";
    }

    Properties

    main_time +JGOFCanadianTimeControl | goban

    Interface JGOFCanadianTimeControl

    interface JGOFCanadianTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        speed: JGOFTimeControlSpeed;
        stones_per_period: number;
        system: "canadian";
    }

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    stones_per_period: number
    system: "canadian"
    \ No newline at end of file +

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    stones_per_period: number
    system: "canadian"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFClock.html b/docs/interfaces/JGOFClock.html index bc1cfa3f..f5e7d2fe 100644 --- a/docs/interfaces/JGOFClock.html +++ b/docs/interfaces/JGOFClock.html @@ -1,5 +1,5 @@ JGOFClock | goban

    Interface JGOFClock


    -
    interface JGOFClock {
        black_clock: JGOFPlayerClock;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
    }

    Hierarchy (view full)

    Properties

    interface JGOFClock {
        black_clock: JGOFPlayerClock;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
    }

    Hierarchy (view full)

    Properties

    black_clock: JGOFPlayerClock

    Time left on blacks clock.

    -
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    -
    current_player_id: string

    Player ID of player to move

    -
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    -
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    -
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first +

    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    +
    current_player_id: string

    Player ID of player to move

    +
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    +
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    +
    start_mode?: boolean

    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_time_left?: number

    If start_mode is true, this is the number of milliseconds left +

    start_time_left?: number

    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.

    -
    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of +

    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of milliseconds left before the result is automatically accepted.

    -
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    -
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    -
    \ No newline at end of file +
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    +
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFClockWithTransmitting.html b/docs/interfaces/JGOFClockWithTransmitting.html index e1179a4a..cb56c64a 100644 --- a/docs/interfaces/JGOFClockWithTransmitting.html +++ b/docs/interfaces/JGOFClockWithTransmitting.html @@ -1,5 +1,5 @@ JGOFClockWithTransmitting | goban

    Interface JGOFClockWithTransmitting


    -
    interface JGOFClockWithTransmitting {
        black_clock: JGOFPlayerClock;
        black_move_transmitting: number;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
        white_move_transmitting: number;
    }

    Hierarchy (view full)

    Properties

    interface JGOFClockWithTransmitting {
        black_clock: JGOFPlayerClock;
        black_move_transmitting: number;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
        white_move_transmitting: number;
    }

    Hierarchy (view full)

    Properties

    black_clock: JGOFPlayerClock

    Time left on blacks clock.

    -
    black_move_transmitting: number
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    -
    current_player_id: string

    Player ID of player to move

    -
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    -
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    -
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first +

    black_move_transmitting: number
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    +
    current_player_id: string

    Player ID of player to move

    +
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    +
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    +
    start_mode?: boolean

    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_time_left?: number

    If start_mode is true, this is the number of milliseconds left +

    start_time_left?: number

    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.

    -
    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of +

    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of milliseconds left before the result is automatically accepted.

    -
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    -
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    -
    white_move_transmitting: number
    \ No newline at end of file +
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    +
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    +
    white_move_transmitting: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFFischerTimeControl.html b/docs/interfaces/JGOFFischerTimeControl.html index bb4fa2fa..3788b14b 100644 --- a/docs/interfaces/JGOFFischerTimeControl.html +++ b/docs/interfaces/JGOFFischerTimeControl.html @@ -1,7 +1,7 @@ -JGOFFischerTimeControl | goban

    Interface JGOFFischerTimeControl

    interface JGOFFischerTimeControl {
        initial_time: number;
        max_time: number;
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "fischer";
        time_increment: number;
    }

    Properties

    initial_time +JGOFFischerTimeControl | goban

    Interface JGOFFischerTimeControl

    interface JGOFFischerTimeControl {
        initial_time: number;
        max_time: number;
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "fischer";
        time_increment: number;
    }

    Properties

    initial_time: number
    max_time: number
    pause_on_weekends: boolean
    system: "fischer"
    time_increment: number
    \ No newline at end of file +

    Properties

    initial_time: number
    max_time: number
    pause_on_weekends: boolean
    system: "fischer"
    time_increment: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFIntersection.html b/docs/interfaces/JGOFIntersection.html index 5fd31e0c..1c220565 100644 --- a/docs/interfaces/JGOFIntersection.html +++ b/docs/interfaces/JGOFIntersection.html @@ -1,5 +1,5 @@ -JGOFIntersection | goban

    Interface JGOFIntersection

    interface JGOFIntersection {
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    x +JGOFIntersection | goban

    Interface JGOFIntersection

    interface JGOFIntersection {
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    x y

    Properties

    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFMove.html b/docs/interfaces/JGOFMove.html index c72e4f11..7643c335 100644 --- a/docs/interfaces/JGOFMove.html +++ b/docs/interfaces/JGOFMove.html @@ -1,4 +1,4 @@ -JGOFMove | goban

    Interface JGOFMove

    interface JGOFMove {
        blur?: number;
        color?: JGOFNumericPlayerColor;
        edited?: boolean;
        played_by?: number;
        player_update?: JGOFPlayerSummary;
        removal_reason?: string;
        sgf_downloaded_by?: number[];
        timedelta?: number;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    blur? +JGOFMove | goban

    Interface JGOFMove

    interface JGOFMove {
        blur?: number;
        color?: JGOFNumericPlayerColor;
        edited?: boolean;
        played_by?: number;
        player_update?: JGOFPlayerSummary;
        removal_reason?: string;
        sgf_downloaded_by?: number[];
        timedelta?: number;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    blur?: number
    edited?: boolean
    played_by?: number
    player_update?: JGOFPlayerSummary
    removal_reason?: string

    Stone removal reasoning, primarily for debugging

    -
    sgf_downloaded_by?: number[]
    timedelta?: number
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +

    Properties

    blur?: number
    edited?: boolean
    played_by?: number
    player_update?: JGOFPlayerSummary
    removal_reason?: string

    Stone removal reasoning, primarily for debugging

    +
    sgf_downloaded_by?: number[]
    timedelta?: number
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFNoneTimeControl.html b/docs/interfaces/JGOFNoneTimeControl.html index a5328965..0dec39ca 100644 --- a/docs/interfaces/JGOFNoneTimeControl.html +++ b/docs/interfaces/JGOFNoneTimeControl.html @@ -1,4 +1,4 @@ -JGOFNoneTimeControl | goban

    Interface JGOFNoneTimeControl

    interface JGOFNoneTimeControl {
        pause_on_weekends: boolean;
        speed: "correspondence";
        system: "none";
    }

    Properties

    pause_on_weekends +JGOFNoneTimeControl | goban

    Interface JGOFNoneTimeControl

    interface JGOFNoneTimeControl {
        pause_on_weekends: boolean;
        speed: "correspondence";
        system: "none";
    }

    Properties

    pause_on_weekends: boolean
    speed: "correspondence"
    system: "none"
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    speed: "correspondence"
    system: "none"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPauseState.html b/docs/interfaces/JGOFPauseState.html index 31002bf6..01cade66 100644 --- a/docs/interfaces/JGOFPauseState.html +++ b/docs/interfaces/JGOFPauseState.html @@ -1,16 +1,16 @@ -JGOFPauseState | goban

    Interface JGOFPauseState

    interface JGOFPauseState {
        moderator?: string;
        player?: {
            pauses_left: number;
            player_id: string;
        };
        server?: true;
        stone_removal?: true;
        vacation?: {
            [player_id: string]: true;
        };
        weekend?: true;
    }

    Properties

    moderator? +JGOFPauseState | goban

    Interface JGOFPauseState

    interface JGOFPauseState {
        moderator?: string;
        player?: {
            pauses_left: number;
            player_id: string;
        };
        server?: true;
        stone_removal?: true;
        vacation?: {
            [player_id: string]: true;
        };
        weekend?: true;
    }

    Properties

    moderator?: string

    Paused by a moderator, value of this field is the moderator's id

    -
    player?: {
        pauses_left: number;
        player_id: string;
    }

    Paused by a player. The game can only be paused by one player at a time.

    +
    player?: {
        pauses_left: number;
        player_id: string;
    }

    Paused by a player. The game can only be paused by one player at a time.

    Type declaration

    • pauses_left: number

      Number of pauses left for the pausing player.

    • player_id: string

      Player id of the player who paused the game.

      -
    server?: true

    Paused by the server

    -
    stone_removal?: true

    Paused because the game is in the stone removal phase

    -
    vacation?: {
        [player_id: string]: true;
    }

    Paused because one or more players is on vacation

    +
    server?: true

    Paused by the server

    +
    stone_removal?: true

    Paused because the game is in the stone removal phase

    +
    vacation?: {
        [player_id: string]: true;
    }

    Paused because one or more players is on vacation

    Type declaration

    • [player_id: string]: true

      Player id that is on vacation

      -
    weekend?: true

    Paused because it is the weekend

    -
    \ No newline at end of file +
    weekend?: true

    Paused because it is the weekend

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayer.html b/docs/interfaces/JGOFPlayer.html index 92cda7c4..c1d72932 100644 --- a/docs/interfaces/JGOFPlayer.html +++ b/docs/interfaces/JGOFPlayer.html @@ -1,5 +1,5 @@ -JGOFPlayer | goban

    Interface JGOFPlayer

    interface JGOFPlayer {
        id?: string;
        name: string;
    }

    Properties

    id? +JGOFPlayer | goban

    Interface JGOFPlayer

    interface JGOFPlayer {
        id?: string;
        name: string;
    }

    Properties

    Properties

    id?: string

    Identifier for the player

    -
    name: string

    Name or username of the player

    -
    \ No newline at end of file +
    name: string

    Name or username of the player

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayerClock.html b/docs/interfaces/JGOFPlayerClock.html index 502895a2..bfc92659 100644 --- a/docs/interfaces/JGOFPlayerClock.html +++ b/docs/interfaces/JGOFPlayerClock.html @@ -1,13 +1,13 @@ -JGOFPlayerClock | goban

    Interface JGOFPlayerClock

    interface JGOFPlayerClock {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
    }

    Hierarchy (view full)

    Properties

    block_time_left? +JGOFPlayerClock | goban

    Interface JGOFPlayerClock

    interface JGOFPlayerClock {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
    }

    Hierarchy (view full)

    Properties

    block_time_left?: number

    Used with canadian time control. Time left in milliseconds to make the remainder of your moves in the current block

    -
    main_time: number

    Main time left on the clock, in milliseconds.

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    main_time: number

    Main time left on the clock, in milliseconds.

    +
    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    -
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    -
    \ No newline at end of file +
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    +
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayerSummary.html b/docs/interfaces/JGOFPlayerSummary.html index 3ac3351e..832a6098 100644 --- a/docs/interfaces/JGOFPlayerSummary.html +++ b/docs/interfaces/JGOFPlayerSummary.html @@ -1,4 +1,4 @@ -JGOFPlayerSummary | goban

    Interface JGOFPlayerSummary

    interface JGOFPlayerSummary {
        dropped_players?: {
            black?: number[];
            white?: number[];
        };
        players: {
            black: number;
            white: number;
        };
        rengo_teams: {
            black: number[];
            white: number[];
        };
    }

    Properties

    dropped_players? +JGOFPlayerSummary | goban

    Interface JGOFPlayerSummary

    interface JGOFPlayerSummary {
        dropped_players?: {
            black?: number[];
            white?: number[];
        };
        players: {
            black: number;
            white: number;
        };
        rengo_teams: {
            black: number[];
            white: number[];
        };
    }

    Properties

    dropped_players?: {
        black?: number[];
        white?: number[];
    }

    Type declaration

    • Optional black?: number[]
    • Optional white?: number[]
    players: {
        black: number;
        white: number;
    }

    Type declaration

    • black: number
    • white: number
    rengo_teams: {
        black: number[];
        white: number[];
    }

    Type declaration

    • black: number[]
    • white: number[]
    \ No newline at end of file +

    Properties

    dropped_players?: {
        black?: number[];
        white?: number[];
    }

    Type declaration

    • Optional black?: number[]
    • Optional white?: number[]
    players: {
        black: number;
        white: number;
    }

    Type declaration

    • black: number
    • white: number
    rengo_teams: {
        black: number[];
        white: number[];
    }

    Type declaration

    • black: number[]
    • white: number[]
    \ No newline at end of file diff --git a/docs/interfaces/JGOFSealingIntersection.html b/docs/interfaces/JGOFSealingIntersection.html index 4db0f079..a2e83e9e 100644 --- a/docs/interfaces/JGOFSealingIntersection.html +++ b/docs/interfaces/JGOFSealingIntersection.html @@ -1,8 +1,8 @@ -JGOFSealingIntersection | goban

    Interface JGOFSealingIntersection

    interface JGOFSealingIntersection {
        color: JGOFNumericPlayerColor;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    color +JGOFSealingIntersection | goban

    Interface JGOFSealingIntersection

    interface JGOFSealingIntersection {
        color: JGOFNumericPlayerColor;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    Color the intersection is probably presumed to be by the players, but is in fact empty.

    -
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFSimpleTimeControl.html b/docs/interfaces/JGOFSimpleTimeControl.html index f5f2fa6d..8d18bbd9 100644 --- a/docs/interfaces/JGOFSimpleTimeControl.html +++ b/docs/interfaces/JGOFSimpleTimeControl.html @@ -1,5 +1,5 @@ -JGOFSimpleTimeControl | goban

    Interface JGOFSimpleTimeControl

    interface JGOFSimpleTimeControl {
        pause_on_weekends: boolean;
        per_move: number;
        speed: JGOFTimeControlSpeed;
        system: "simple";
    }

    Properties

    pause_on_weekends +JGOFSimpleTimeControl | goban

    Interface JGOFSimpleTimeControl

    interface JGOFSimpleTimeControl {
        pause_on_weekends: boolean;
        per_move: number;
        speed: JGOFTimeControlSpeed;
        system: "simple";
    }

    Properties

    pause_on_weekends: boolean
    per_move: number
    system: "simple"
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    per_move: number
    system: "simple"
    \ No newline at end of file diff --git a/docs/interfaces/MarkInterface.html b/docs/interfaces/MarkInterface.html index 0cdbc38a..cb3c10bf 100644 --- a/docs/interfaces/MarkInterface.html +++ b/docs/interfaces/MarkInterface.html @@ -1,4 +1,4 @@ -MarkInterface | goban

    Interface MarkInterface

    interface MarkInterface {
        black?: boolean;
        blue_move?: boolean;
        chat_triangle?: boolean;
        circle?: boolean;
        color?: string;
        cross?: boolean;
        hint?: boolean;
        letter?: string;
        mark_x?: boolean;
        needs_sealing?: boolean;
        remove?: boolean;
        score?: string;
        square?: boolean;
        stone_removed?: boolean;
        sub_triangle?: boolean;
        subscript?: string;
        transient_letter?: string;
        triangle?: boolean;
        white?: boolean;
        [label: string]: string | boolean | undefined;
    }

    Indexable

    [label: string]: string | boolean | undefined

    Properties

    black? +MarkInterface | goban

    Interface MarkInterface

    interface MarkInterface {
        black?: boolean;
        blue_move?: boolean;
        chat_triangle?: boolean;
        circle?: boolean;
        color?: string;
        cross?: boolean;
        hint?: boolean;
        letter?: string;
        mark_x?: boolean;
        needs_sealing?: boolean;
        remove?: boolean;
        score?: string;
        square?: boolean;
        stone_removed?: boolean;
        sub_triangle?: boolean;
        subscript?: string;
        transient_letter?: string;
        triangle?: boolean;
        white?: boolean;
        [label: string]: string | boolean | undefined;
    }

    Indexable

    [label: string]: string | boolean | undefined

    Properties

    black?: boolean
    blue_move?: boolean
    chat_triangle?: boolean
    circle?: boolean
    color?: string
    cross?: boolean
    hint?: boolean
    letter?: string
    mark_x?: boolean
    needs_sealing?: boolean
    remove?: boolean
    score?: string
    square?: boolean
    stone_removed?: boolean
    sub_triangle?: boolean
    subscript?: string
    transient_letter?: string
    triangle?: boolean
    white?: boolean
    \ No newline at end of file +

    Properties

    black?: boolean
    blue_move?: boolean
    chat_triangle?: boolean
    circle?: boolean
    color?: string
    cross?: boolean
    hint?: boolean
    letter?: string
    mark_x?: boolean
    needs_sealing?: boolean
    remove?: boolean
    score?: string
    square?: boolean
    stone_removed?: boolean
    sub_triangle?: boolean
    subscript?: string
    transient_letter?: string
    triangle?: boolean
    white?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/MoveCommand.html b/docs/interfaces/MoveCommand.html index d76d8e00..61fb4432 100644 --- a/docs/interfaces/MoveCommand.html +++ b/docs/interfaces/MoveCommand.html @@ -1,5 +1,5 @@ -MoveCommand | goban

    Interface MoveCommand

    interface MoveCommand {
        blur?: number;
        clock?: JGOFPlayerClock;
        game_id: number;
        move: string;
    }

    Properties

    blur? +MoveCommand | goban

    Interface MoveCommand

    interface MoveCommand {
        blur?: number;
        clock?: JGOFPlayerClock;
        game_id: number;
        move: string;
    }

    Properties

    Properties

    blur?: number
    game_id: number
    move: string
    \ No newline at end of file +

    Properties

    blur?: number
    game_id: number
    move: string
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeChatLine.html b/docs/interfaces/MoveTreeChatLine.html index f19be7e0..bcb2d412 100644 --- a/docs/interfaces/MoveTreeChatLine.html +++ b/docs/interfaces/MoveTreeChatLine.html @@ -1,3 +1,3 @@ -MoveTreeChatLine | goban

    Interface MoveTreeChatLine

    interface MoveTreeChatLine {
        body: MoveTreeChatLineBody;
        username: string;
    }

    Properties

    body +MoveTreeChatLine | goban

    Interface MoveTreeChatLine

    interface MoveTreeChatLine {
        body: MoveTreeChatLineBody;
        username: string;
    }

    Properties

    Properties

    username: string
    \ No newline at end of file +

    Properties

    username: string
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeChatLineBody.html b/docs/interfaces/MoveTreeChatLineBody.html index df28bf49..9d29a0cb 100644 --- a/docs/interfaces/MoveTreeChatLineBody.html +++ b/docs/interfaces/MoveTreeChatLineBody.html @@ -1,5 +1,5 @@ -MoveTreeChatLineBody | goban

    Interface MoveTreeChatLineBody

    interface MoveTreeChatLineBody {
        from: number;
        moves: string | AdHocPackedMove;
        name: string;
        type: "analysis";
    }

    Properties

    from +MoveTreeChatLineBody | goban

    Interface MoveTreeChatLineBody

    interface MoveTreeChatLineBody {
        from: number;
        moves: string | AdHocPackedMove;
        name: string;
        type: "analysis";
    }

    Properties

    Properties

    from: number
    moves: string | AdHocPackedMove
    name: string
    type: "analysis"
    \ No newline at end of file +

    Properties

    from: number
    moves: string | AdHocPackedMove
    name: string
    type: "analysis"
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeJson.html b/docs/interfaces/MoveTreeJson.html index 9422a25a..0fbba00a 100644 --- a/docs/interfaces/MoveTreeJson.html +++ b/docs/interfaces/MoveTreeJson.html @@ -1,4 +1,4 @@ -MoveTreeJson | goban

    Interface MoveTreeJson

    interface MoveTreeJson {
        branches?: MoveTreeJson[];
        correct_answer?: boolean;
        marks?: {
            marks: MarkInterface;
            x: number;
            y: number;
        }[];
        pen_marks?: MoveTreePenMarks;
        text?: string;
        trunk_next?: MoveTreeJson;
        wrong_answer?: boolean;
        x: number;
        y: number;
    }

    Properties

    branches? +MoveTreeJson | goban

    Interface MoveTreeJson

    interface MoveTreeJson {
        branches?: MoveTreeJson[];
        correct_answer?: boolean;
        marks?: {
            marks: MarkInterface;
            x: number;
            y: number;
        }[];
        pen_marks?: MoveTreePenMarks;
        text?: string;
        trunk_next?: MoveTreeJson;
        wrong_answer?: boolean;
        x: number;
        y: number;
    }

    Properties

    branches?: MoveTreeJson[]
    correct_answer?: boolean
    marks?: {
        marks: MarkInterface;
        x: number;
        y: number;
    }[]

    Type declaration

    pen_marks?: MoveTreePenMarks
    text?: string
    trunk_next?: MoveTreeJson
    wrong_answer?: boolean
    x: number
    y: number
    \ No newline at end of file +

    Properties

    branches?: MoveTreeJson[]
    correct_answer?: boolean
    marks?: {
        marks: MarkInterface;
        x: number;
        y: number;
    }[]

    Type declaration

    pen_marks?: MoveTreePenMarks
    text?: string
    trunk_next?: MoveTreeJson
    wrong_answer?: boolean
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/PlayerScore.html b/docs/interfaces/PlayerScore.html index 13fe73fb..61be5804 100644 --- a/docs/interfaces/PlayerScore.html +++ b/docs/interfaces/PlayerScore.html @@ -1,8 +1,8 @@ -PlayerScore | goban

    Interface PlayerScore

    interface PlayerScore {
        handicap: number;
        komi: number;
        prisoners: number;
        scoring_positions: string;
        stones: number;
        territory: number;
        total: number;
    }

    Properties

    handicap +PlayerScore | goban

    Interface PlayerScore

    interface PlayerScore {
        handicap: number;
        komi: number;
        prisoners: number;
        scoring_positions: string;
        stones: number;
        territory: number;
        total: number;
    }

    Properties

    handicap: number
    komi: number
    prisoners: number
    scoring_positions: string
    stones: number
    territory: number
    total: number
    \ No newline at end of file +

    Properties

    handicap: number
    komi: number
    prisoners: number
    scoring_positions: string
    stones: number
    territory: number
    total: number
    \ No newline at end of file diff --git a/docs/interfaces/PuzzleConfig.html b/docs/interfaces/PuzzleConfig.html index 16999f1c..091e8bd7 100644 --- a/docs/interfaces/PuzzleConfig.html +++ b/docs/interfaces/PuzzleConfig.html @@ -1,4 +1,4 @@ -PuzzleConfig | goban

    Interface PuzzleConfig

    interface PuzzleConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        isobranch_hash?: string;
        marks?: {
            [mark: string]: string;
        };
        mode?: string;
        move_tree?: MoveTreeJson;
        name?: string;
        player?: JGOFNumericPlayerColor;
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Properties

    black_prisoners? +PuzzleConfig | goban

    Interface PuzzleConfig

    interface PuzzleConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        isobranch_hash?: string;
        marks?: {
            [mark: string]: string;
        };
        mode?: string;
        move_tree?: MoveTreeJson;
        name?: string;
        player?: JGOFNumericPlayerColor;
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    isobranch_hash?: string
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: string
    move_tree?: MoveTreeJson
    name?: string
    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file +

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    isobranch_hash?: string
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: string
    move_tree?: MoveTreeJson
    name?: string
    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/ReviewMessage.html b/docs/interfaces/ReviewMessage.html index d5369c06..2503812b 100644 --- a/docs/interfaces/ReviewMessage.html +++ b/docs/interfaces/ReviewMessage.html @@ -1,7 +1,7 @@ ReviewMessage | goban

    Interface ReviewMessage

    Reviews are constructed by a stream of modifications messages, this interface describes the format of those modification messages. A message can contain any number of the fields listed.

    -
    interface ReviewMessage {
        chat?: {
            channel: string;
            chat_id: string;
            date: number;
            from: number;
            moves: string | AdHocPackedMove;
            player_id: number;
        };
        clearpen?: boolean;
        controller?: number | {
            id: number;
            username: string;
        };
        delete?: number;
        f?: number;
        gamedata?: GobanEngineConfig;
        k?: {
            [mark: string]: string;
        };
        m?: string;
        om?: [number, number, number];
        owner?: number | {
            id: number;
            username: string;
        };
        pen?: string;
        player_update?: JGOFPlayerSummary;
        pp?: [number, number];
        remove-chat?: string;
        review_id?: number;
        t?: string;
        t+?: string;
        ts?: number;
        undo?: boolean;
    }

    Properties

    interface ReviewMessage {
        chat?: {
            channel: string;
            chat_id: string;
            date: number;
            from: number;
            moves: string | AdHocPackedMove;
            player_id: number;
        };
        clearpen?: boolean;
        controller?: number | {
            id: number;
            username: string;
        };
        delete?: number;
        f?: number;
        gamedata?: GobanEngineConfig;
        k?: {
            [mark: string]: string;
        };
        m?: string;
        om?: [number, number, number];
        owner?: number | {
            id: number;
            username: string;
        };
        pen?: string;
        player_update?: JGOFPlayerSummary;
        pp?: [number, number];
        remove-chat?: string;
        review_id?: number;
        t?: string;
        t+?: string;
        ts?: number;
        undo?: boolean;
    }

    Properties

    chat? clearpen? controller? delete? @@ -23,24 +23,24 @@

    Properties

    chat?: {
        channel: string;
        chat_id: string;
        date: number;
        from: number;
        moves: string | AdHocPackedMove;
        player_id: number;
    }

    Chat message

    Type declaration

    • channel: string
    • chat_id: string
    • date: number
    • from: number

      Turn number

    • moves: string | AdHocPackedMove

      this might just be "string", i'm not entirely sure

      -
    • player_id: number
    clearpen?: boolean

    Clears the pen drawings on the node

    -
    controller?: number | {
        id: number;
        username: string;
    }

    Sets the controller of the review

    -

    Type declaration

    • id: number
    • username: string
    delete?: number

    Delete

    -
    f?: number

    from (move number)

    -

    Initial gamedata to review

    -
    k?: {
        [mark: string]: string;
    }

    Marks made

    -

    Type declaration

    • [mark: string]: string
    m?: string

    Moves made

    -
    om?: [number, number, number]

    official move [reviewing live game]

    -
    owner?: number | {
        id: number;
        username: string;
    }

    Sets the owner of the review

    -

    Type declaration

    • id: number
    • username: string
    pen?: string

    pen color / pen start

    -
    player_update?: JGOFPlayerSummary

    Updated information about the players, such as name etc.

    -
    pp?: [number, number]

    pen point

    -
    remove-chat?: string

    Remove's the given chat by id

    -
    review_id?: number

    The review ID. This is used when sending from the client to the server, +

  • player_id: number
  • clearpen?: boolean

    Clears the pen drawings on the node

    +
    controller?: number | {
        id: number;
        username: string;
    }

    Sets the controller of the review

    +

    Type declaration

    • id: number
    • username: string
    delete?: number

    Delete

    +
    f?: number

    from (move number)

    +

    Initial gamedata to review

    +
    k?: {
        [mark: string]: string;
    }

    Marks made

    +

    Type declaration

    • [mark: string]: string
    m?: string

    Moves made

    +
    om?: [number, number, number]

    official move [reviewing live game]

    +
    owner?: number | {
        id: number;
        username: string;
    }

    Sets the owner of the review

    +

    Type declaration

    • id: number
    • username: string
    pen?: string

    pen color / pen start

    +
    player_update?: JGOFPlayerSummary

    Updated information about the players, such as name etc.

    +
    pp?: [number, number]

    pen point

    +
    remove-chat?: string

    Remove's the given chat by id

    +
    review_id?: number

    The review ID. This is used when sending from the client to the server, but is not sent by the server back to the client (as the id is encoded in the message event name)

    -
    t?: string

    text note for the current node

    -
    t+?: string

    text append to the current node

    -
    ts?: number

    timestamp (ms)

    -
    undo?: boolean

    official undo [reviewing live game]

    -
    \ No newline at end of file +
    t?: string

    text note for the current node

    +
    t+?: string

    text append to the current node

    +
    ts?: number

    timestamp (ms)

    +
    undo?: boolean

    official undo [reviewing live game]

    +
    \ No newline at end of file diff --git a/docs/interfaces/SVGRendererGobanConfig.html b/docs/interfaces/SVGRendererGobanConfig.html index 6587442c..60a216fc 100644 --- a/docs/interfaces/SVGRendererGobanConfig.html +++ b/docs/interfaces/SVGRendererGobanConfig.html @@ -1,4 +1,4 @@ -SVGRendererGobanConfig | goban

    Interface SVGRendererGobanConfig

    interface SVGRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +SVGRendererGobanConfig | goban

    Interface SVGRendererGobanConfig

    interface SVGRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/SVGStoneParameters.html b/docs/interfaces/SVGStoneParameters.html index f131f8ef..c8a7504f 100644 --- a/docs/interfaces/SVGStoneParameters.html +++ b/docs/interfaces/SVGStoneParameters.html @@ -1,7 +1,7 @@ -SVGStoneParameters | goban

    Interface SVGStoneParameters

    interface SVGStoneParameters {
        fill?: string;
        gradient?: {
            cx?: number;
            cy?: number;
            fx?: number;
            fy?: number;
            r?: number;
            stops: SVGStop[];
            type?: "radial" | "linear";
            x1?: number;
            x2?: number;
            y1?: number;
            y2?: number;
        };
        id: string;
        stroke?: string;
        stroke_scale?: number;
        url?: string;
    }

    Properties

    fill? +SVGStoneParameters | goban

    Interface SVGStoneParameters

    interface SVGStoneParameters {
        fill?: string;
        gradient?: {
            cx?: number;
            cy?: number;
            fx?: number;
            fy?: number;
            r?: number;
            stops: SVGStop[];
            type?: "radial" | "linear";
            x1?: number;
            x2?: number;
            y1?: number;
            y2?: number;
        };
        id: string;
        stroke?: string;
        stroke_scale?: number;
        url?: string;
    }

    Properties

    fill?: string
    gradient?: {
        cx?: number;
        cy?: number;
        fx?: number;
        fy?: number;
        r?: number;
        stops: SVGStop[];
        type?: "radial" | "linear";
        x1?: number;
        x2?: number;
        y1?: number;
        y2?: number;
    }

    Type declaration

    • Optional cx?: number
    • Optional cy?: number
    • Optional fx?: number
    • Optional fy?: number
    • Optional r?: number
    • stops: SVGStop[]
    • Optional type?: "radial" | "linear"
    • Optional x1?: number
    • Optional x2?: number
    • Optional y1?: number
    • Optional y2?: number
    id: string
    stroke?: string
    stroke_scale?: number
    url?: string
    \ No newline at end of file +

    Properties

    fill?: string
    gradient?: {
        cx?: number;
        cy?: number;
        fx?: number;
        fy?: number;
        r?: number;
        stops: SVGStop[];
        type?: "radial" | "linear";
        x1?: number;
        x2?: number;
        y1?: number;
        y2?: number;
    }

    Type declaration

    • Optional cx?: number
    • Optional cy?: number
    • Optional fx?: number
    • Optional fy?: number
    • Optional r?: number
    • stops: SVGStop[]
    • Optional type?: "radial" | "linear"
    • Optional x1?: number
    • Optional x2?: number
    • Optional y1?: number
    • Optional y2?: number
    id: string
    stroke?: string
    stroke_scale?: number
    url?: string
    \ No newline at end of file diff --git a/docs/interfaces/SVGStop.html b/docs/interfaces/SVGStop.html index 25b9e90d..8662737f 100644 --- a/docs/interfaces/SVGStop.html +++ b/docs/interfaces/SVGStop.html @@ -1,3 +1,3 @@ -SVGStop | goban

    Interface SVGStop

    interface SVGStop {
        color: string;
        offset: number;
    }

    Properties

    color +SVGStop | goban

    Interface SVGStop

    interface SVGStop {
        color: string;
        offset: number;
    }

    Properties

    Properties

    color: string
    offset: number
    \ No newline at end of file +

    Properties

    color: string
    offset: number
    \ No newline at end of file diff --git a/docs/interfaces/Score.html b/docs/interfaces/Score.html index b7acb3f7..ad4d2e80 100644 --- a/docs/interfaces/Score.html +++ b/docs/interfaces/Score.html @@ -1,3 +1,3 @@ -Score | goban

    Interface Score

    interface Score {
        black: PlayerScore;
        white: PlayerScore;
    }

    Properties

    black +Score | goban

    Interface Score

    interface Score {
        black: PlayerScore;
        white: PlayerScore;
    }

    Properties

    Properties

    \ No newline at end of file +

    Properties

    \ No newline at end of file diff --git a/docs/interfaces/ScoreEstimateRequest.html b/docs/interfaces/ScoreEstimateRequest.html index 5d1fc8cb..4347024c 100644 --- a/docs/interfaces/ScoreEstimateRequest.html +++ b/docs/interfaces/ScoreEstimateRequest.html @@ -1,4 +1,4 @@ -ScoreEstimateRequest | goban

    Interface ScoreEstimateRequest

    interface ScoreEstimateRequest {
        autoscore?: boolean;
        black_prisoners?: number;
        board_state: JGOFNumericPlayerColor[][];
        height: number;
        jwt: string;
        komi?: number;
        player_to_move: "black" | "white";
        rules: GobanEngineRules;
        white_prisoners?: number;
        width: number;
    }

    Properties

    autoscore? +ScoreEstimateRequest | goban

    Interface ScoreEstimateRequest

    interface ScoreEstimateRequest {
        autoscore?: boolean;
        black_prisoners?: number;
        board_state: JGOFNumericPlayerColor[][];
        height: number;
        jwt: string;
        komi?: number;
        player_to_move: "black" | "white";
        rules: GobanEngineRules;
        white_prisoners?: number;
        width: number;
    }

    Properties

    Properties

    autoscore?: boolean

    Whether to run autoscoring logic. If true, player_to_move is essentially ignored as we compute estimates with each player moving first in turn.

    -
    black_prisoners?: number
    board_state: JGOFNumericPlayerColor[][]
    height: number
    jwt: string
    komi?: number
    player_to_move: "black" | "white"
    white_prisoners?: number
    width: number
    \ No newline at end of file +
    black_prisoners?: number
    board_state: JGOFNumericPlayerColor[][]
    height: number
    jwt: string
    komi?: number
    player_to_move: "black" | "white"
    white_prisoners?: number
    width: number
    \ No newline at end of file diff --git a/docs/interfaces/ScoreEstimateResponse.html b/docs/interfaces/ScoreEstimateResponse.html index f5db6088..3e45fd94 100644 --- a/docs/interfaces/ScoreEstimateResponse.html +++ b/docs/interfaces/ScoreEstimateResponse.html @@ -1,13 +1,13 @@ -ScoreEstimateResponse | goban

    Interface ScoreEstimateResponse

    interface ScoreEstimateResponse {
        autoscored_board_state?: JGOFNumericPlayerColor[][];
        autoscored_needs_sealing?: JGOFSealingIntersection[];
        autoscored_removed?: JGOFMove[];
        ownership: number[][];
        score?: number;
        win_rate?: number;
    }

    Properties

    autoscored_board_state? +ScoreEstimateResponse | goban

    Interface ScoreEstimateResponse

    interface ScoreEstimateResponse {
        autoscored_board_state?: JGOFNumericPlayerColor[][];
        autoscored_needs_sealing?: JGOFSealingIntersection[];
        autoscored_removed?: JGOFMove[];
        ownership: number[][];
        score?: number;
        win_rate?: number;
    }

    Properties

    autoscored_board_state?: JGOFNumericPlayerColor[][]

    Board state after autoscoring logic has been run. Only defined if autoscore was true in the request.

    -
    autoscored_needs_sealing?: JGOFSealingIntersection[]

    Coordinates that still need sealing

    -
    autoscored_removed?: JGOFMove[]

    Intersections that are dead or dame. Only defined if autoscore was true in the request.

    -
    ownership: number[][]

    Matrix of ownership estimates ranged from -1 (white) to 1 (black)

    -
    score?: number

    Estimated score

    -
    win_rate?: number

    Estimated win rate

    -
    \ No newline at end of file +
    autoscored_needs_sealing?: JGOFSealingIntersection[]

    Coordinates that still need sealing

    +
    autoscored_removed?: JGOFMove[]

    Intersections that are dead or dame. Only defined if autoscore was true in the request.

    +
    ownership: number[][]

    Matrix of ownership estimates ranged from -1 (white) to 1 (black)

    +
    score?: number

    Estimated score

    +
    win_rate?: number

    Estimated win rate

    +
    \ No newline at end of file diff --git a/docs/interfaces/ScoringLocations.html b/docs/interfaces/ScoringLocations.html index ad8271e6..c374cee5 100644 --- a/docs/interfaces/ScoringLocations.html +++ b/docs/interfaces/ScoringLocations.html @@ -1,3 +1,3 @@ -ScoringLocations | goban

    Interface ScoringLocations

    interface ScoringLocations {
        black: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
        white: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
    }

    Properties

    black +ScoringLocations | goban

    Interface ScoringLocations

    interface ScoringLocations {
        black: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
        white: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
    }

    Properties

    Properties

    black: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    white: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    \ No newline at end of file +

    Properties

    black: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    white: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/StateUpdateEvents.html b/docs/interfaces/StateUpdateEvents.html index 245851a7..8728b363 100644 --- a/docs/interfaces/StateUpdateEvents.html +++ b/docs/interfaces/StateUpdateEvents.html @@ -1,4 +1,4 @@ -StateUpdateEvents | goban

    Interface StateUpdateEvents

    interface StateUpdateEvents {
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        last_official_move: ((d) => void);
        mode: ((d) => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        stalling_score_estimate: ((data?) => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    analyze_subtool +StateUpdateEvents | goban

    Interface StateUpdateEvents

    interface StateUpdateEvents {
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        last_official_move: ((d) => void);
        mode: ((d) => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        stalling_score_estimate: ((data?) => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    stalling_score_estimate: ((data?) => void)

    Type declaration

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file +

    Properties

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    stalling_score_estimate: ((data?) => void)

    Type declaration

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file diff --git a/docs/interfaces/ThemesInterface.html b/docs/interfaces/ThemesInterface.html index 96d94a94..c5bfe0aa 100644 --- a/docs/interfaces/ThemesInterface.html +++ b/docs/interfaces/ThemesInterface.html @@ -1,4 +1,4 @@ -ThemesInterface | goban

    Interface ThemesInterface

    interface ThemesInterface {
        black: {
            [name: string]: typeof GobanTheme;
        };
        board: {
            [name: string]: typeof GobanTheme;
        };
        white: {
            [name: string]: typeof GobanTheme;
        };
        [key: string]: {
            [name: string]: typeof GobanTheme;
        };
    }

    Indexable

    [key: string]: {
        [name: string]: typeof GobanTheme;
    }

    Properties

    black +ThemesInterface | goban

    Interface ThemesInterface

    interface ThemesInterface {
        black: {
            [name: string]: typeof GobanTheme;
        };
        board: {
            [name: string]: typeof GobanTheme;
        };
        white: {
            [name: string]: typeof GobanTheme;
        };
        [key: string]: {
            [name: string]: typeof GobanTheme;
        };
    }

    Indexable

    [key: string]: {
        [name: string]: typeof GobanTheme;
    }

    Properties

    Properties

    black: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    board: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    white: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    \ No newline at end of file +

    Properties

    black: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    board: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    white: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AbsoluteClock.html b/docs/interfaces/_internal_.AbsoluteClock.html index bf33e60f..c0d62ae0 100644 --- a/docs/interfaces/_internal_.AbsoluteClock.html +++ b/docs/interfaces/_internal_.AbsoluteClock.html @@ -1,2 +1,2 @@ -AbsoluteClock | goban

    Interface AbsoluteClock

    interface AbsoluteClock {
        thinking_time: number;
    }

    Properties

    Properties

    thinking_time: number
    \ No newline at end of file +AbsoluteClock | goban

    Interface AbsoluteClock

    interface AbsoluteClock {
        thinking_time: number;
    }

    Properties

    Properties

    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AnalysisComment.html b/docs/interfaces/_internal_.AnalysisComment.html index dcc28bbe..b8eebf9c 100644 --- a/docs/interfaces/_internal_.AnalysisComment.html +++ b/docs/interfaces/_internal_.AnalysisComment.html @@ -1,8 +1,8 @@ -AnalysisComment | goban

    Interface AnalysisComment

    interface AnalysisComment {
        branch_move?: number;
        from?: number;
        marks?: {
            [mark: string]: string;
        };
        moves?: string;
        name?: string;
        pen_marks?: unknown[];
        type: "analysis";
    }

    Properties

    branch_move? +AnalysisComment | goban

    Interface AnalysisComment

    interface AnalysisComment {
        branch_move?: number;
        from?: number;
        marks?: {
            [mark: string]: string;
        };
        moves?: string;
        name?: string;
        pen_marks?: unknown[];
        type: "analysis";
    }

    Properties

    branch_move?: number
    from?: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    moves?: string
    name?: string
    pen_marks?: unknown[]
    type: "analysis"
    \ No newline at end of file +

    Properties

    branch_move?: number
    from?: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    moves?: string
    name?: string
    pen_marks?: unknown[]
    type: "analysis"
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AutoscoreResults.html b/docs/interfaces/_internal_.AutoscoreResults.html index dea2b2ef..67ab7559 100644 --- a/docs/interfaces/_internal_.AutoscoreResults.html +++ b/docs/interfaces/_internal_.AutoscoreResults.html @@ -1,5 +1,5 @@ -AutoscoreResults | goban

    Interface AutoscoreResults

    interface AutoscoreResults {
        needs_sealing: JGOFSealingIntersection[];
        removed: JGOFMove[];
        result: JGOFNumericPlayerColor[][];
        sealed_result: JGOFNumericPlayerColor[][];
    }

    Properties

    needs_sealing +AutoscoreResults | goban

    Interface AutoscoreResults

    interface AutoscoreResults {
        needs_sealing: JGOFSealingIntersection[];
        removed: JGOFMove[];
        result: JGOFNumericPlayerColor[][];
        sealed_result: JGOFNumericPlayerColor[][];
    }

    Properties

    needs_sealing: JGOFSealingIntersection[]
    removed: JGOFMove[]
    sealed_result: JGOFNumericPlayerColor[][]
    \ No newline at end of file +

    Properties

    needs_sealing: JGOFSealingIntersection[]
    removed: JGOFMove[]
    sealed_result: JGOFNumericPlayerColor[][]
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html b/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html index 06706883..c72e8ca1 100644 --- a/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html +++ b/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html @@ -1,4 +1,4 @@ -BoardStateWithIsobranchHash | goban

    Interface BoardStateWithIsobranchHash

    interface BoardStateWithIsobranchHash {
        black_prisoners: number;
        board: JGOFNumericPlayerColor[][];
        board_is_repeating: boolean;
        goban_callback?: GobanBase;
        height: number;
        isobranch_hash?: string;
        player: JGOFNumericPlayerColor;
        removal: boolean[][];
        white_prisoners: number;
        width: number;
        boardEquals(other): boolean;
        clearRemoved(): void;
        cloneBoard(): JGOFNumericPlayerColor[][];
        cloneBoardState(): BoardState;
        computeScoringLocations(area_scoring): ScoringLocations;
        countLiberties(raw_stone_string): number;
        foreachNeighbor(pt_or_raw_stone_string, callback): void;
        getNeighboringRawStoneStrings(raw_stone_string): RawStoneString[];
        getRawStoneString(x, y, clearMarks): RawStoneString;
        setRemoved(x, y, removed, emit_stone_removal_updated?): void;
        toggleSingleGroupRemoval(x, y, force_removal?): {
            group: RawStoneString;
            removed: boolean;
        };
    }

    Hierarchy (view full)

    Properties

    black_prisoners +BoardStateWithIsobranchHash | goban

    Interface BoardStateWithIsobranchHash

    interface BoardStateWithIsobranchHash {
        black_prisoners: number;
        board: JGOFNumericPlayerColor[][];
        board_is_repeating: boolean;
        goban_callback?: GobanBase;
        height: number;
        isobranch_hash?: string;
        player: JGOFNumericPlayerColor;
        removal: boolean[][];
        white_prisoners: number;
        width: number;
        boardEquals(other): boolean;
        clearRemoved(): void;
        cloneBoard(): JGOFNumericPlayerColor[][];
        cloneBoardState(): BoardState;
        computeScoringLocations(area_scoring): ScoringLocations;
        countLiberties(raw_stone_string): number;
        foreachNeighbor(pt_or_raw_stone_string, callback): void;
        getNeighboringRawStoneStrings(raw_stone_string): RawStoneString[];
        getRawStoneString(x, y, clearMarks): RawStoneString;
        setRemoved(x, y, removed, emit_stone_removal_updated?): void;
        toggleSingleGroupRemoval(x, y, force_removal?): {
            group: RawStoneString;
            removed: boolean;
        };
    }

    Hierarchy (view full)

    Properties

    black_prisoners: number
    board_is_repeating: boolean
    goban_callback?: GobanBase
    height: number = 19
    isobranch_hash?: string

    The isobranch hash is a hash of the board state. This field is used by +

    Properties

    black_prisoners: number
    board_is_repeating: boolean
    goban_callback?: GobanBase
    height: number = 19
    isobranch_hash?: string

    The isobranch hash is a hash of the board state. This field is used by the move tree to detect isomorphic branches. This field is populated when recomputeIsoBranches is called.

    -
    removal: boolean[][]
    white_prisoners: number
    width: number = 19

    Methods

    removal: boolean[][]
    white_prisoners: number
    width: number = 19

    Methods

    • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Toggles a group of stones for removal or restoration.

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Toggles a group of stones for removal or restoration.

      By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

      -

      Parameters

      • x: number
      • y: number
      • force_removal: boolean = false

      Returns {
          group: RawStoneString;
          removed: boolean;
      }

    \ No newline at end of file +

    Parameters

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ByoYomiClock.html b/docs/interfaces/_internal_.ByoYomiClock.html index 09e3c368..c48b5f04 100644 --- a/docs/interfaces/_internal_.ByoYomiClock.html +++ b/docs/interfaces/_internal_.ByoYomiClock.html @@ -1,5 +1,5 @@ -ByoYomiClock | goban

    Interface ByoYomiClock

    interface ByoYomiClock {
        period_time: number;
        period_time_left?: number;
        periods: number;
        thinking_time: number;
    }

    Properties

    period_time +ByoYomiClock | goban

    Interface ByoYomiClock

    interface ByoYomiClock {
        period_time: number;
        period_time_left?: number;
        periods: number;
        thinking_time: number;
    }

    Properties

    period_time: number
    period_time_left?: number
    periods: number
    thinking_time: number
    \ No newline at end of file +

    Properties

    period_time: number
    period_time_left?: number
    periods: number
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.CanadianClock.html b/docs/interfaces/_internal_.CanadianClock.html index e87becac..307e02b7 100644 --- a/docs/interfaces/_internal_.CanadianClock.html +++ b/docs/interfaces/_internal_.CanadianClock.html @@ -1,4 +1,4 @@ -CanadianClock | goban

    Interface CanadianClock

    interface CanadianClock {
        block_time: number;
        moves_left: number;
        thinking_time: number;
    }

    Properties

    block_time +CanadianClock | goban

    Interface CanadianClock

    interface CanadianClock {
        block_time: number;
        moves_left: number;
        thinking_time: number;
    }

    Properties

    block_time: number
    moves_left: number
    thinking_time: number
    \ No newline at end of file +

    Properties

    block_time: number
    moves_left: number
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ErrorResponse.html b/docs/interfaces/_internal_.ErrorResponse.html index 0da383d7..2d859e16 100644 --- a/docs/interfaces/_internal_.ErrorResponse.html +++ b/docs/interfaces/_internal_.ErrorResponse.html @@ -1,3 +1,3 @@ -ErrorResponse | goban

    Interface ErrorResponse

    interface ErrorResponse {
        code: string;
        message: string;
    }

    Properties

    code +ErrorResponse | goban

    Interface ErrorResponse

    interface ErrorResponse {
        code: string;
        message: string;
    }

    Properties

    Properties

    code: string
    message: string
    \ No newline at end of file +

    Properties

    code: string
    message: string
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.FischerClock.html b/docs/interfaces/_internal_.FischerClock.html index 423ffbd5..ead3ffa5 100644 --- a/docs/interfaces/_internal_.FischerClock.html +++ b/docs/interfaces/_internal_.FischerClock.html @@ -1,3 +1,3 @@ -FischerClock | goban

    Interface FischerClock

    interface FischerClock {
        skip_bonus: boolean;
        thinking_time: number;
    }

    Properties

    skip_bonus +FischerClock | goban

    Interface FischerClock

    interface FischerClock {
        skip_bonus: boolean;
        thinking_time: number;
    }

    Properties

    skip_bonus: boolean
    thinking_time: number
    \ No newline at end of file +

    Properties

    skip_bonus: boolean
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GameListPlayer.html b/docs/interfaces/_internal_.GameListPlayer.html index 3ffacecb..d2f6d7ee 100644 --- a/docs/interfaces/_internal_.GameListPlayer.html +++ b/docs/interfaces/_internal_.GameListPlayer.html @@ -1,7 +1,7 @@ -GameListPlayer | goban

    Interface GameListPlayer

    interface GameListPlayer {
        accepted: boolean;
        id: number;
        professional: boolean;
        rank: number;
        ratings: {
            overall: {
                deviation: number;
                rating: number;
                volatility: number;
            };
            version: number;
        };
        username: string;
    }

    Properties

    accepted +GameListPlayer | goban

    Interface GameListPlayer

    interface GameListPlayer {
        accepted: boolean;
        id: number;
        professional: boolean;
        rank: number;
        ratings: {
            overall: {
                deviation: number;
                rating: number;
                volatility: number;
            };
            version: number;
        };
        username: string;
    }

    Properties

    accepted: boolean
    id: number
    professional: boolean
    rank: number
    ratings: {
        overall: {
            deviation: number;
            rating: number;
            volatility: number;
        };
        version: number;
    }

    Type declaration

    • overall: {
          deviation: number;
          rating: number;
          volatility: number;
      }
      • deviation: number
      • rating: number
      • volatility: number
    • version: number
    username: string
    \ No newline at end of file +

    Properties

    accepted: boolean
    id: number
    professional: boolean
    rank: number
    ratings: {
        overall: {
            deviation: number;
            rating: number;
            volatility: number;
        };
        version: number;
    }

    Type declaration

    • overall: {
          deviation: number;
          rating: number;
          volatility: number;
      }
      • deviation: number
      • rating: number
      • volatility: number
    • version: number
    username: string
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GobanSVGInterface.html b/docs/interfaces/_internal_.GobanSVGInterface.html index 19bcb187..d35af53b 100644 --- a/docs/interfaces/_internal_.GobanSVGInterface.html +++ b/docs/interfaces/_internal_.GobanSVGInterface.html @@ -1,4 +1,4 @@ -GobanSVGInterface | goban

    Interface GobanSVGInterface

    interface GobanSVGInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindEvents(svg): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine +GobanSVGInterface | goban

    Interface GobanSVGInterface

    interface GobanSVGInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindEvents(svg): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • container: HTMLElement

      Returns void

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file +

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • container: HTMLElement

      Returns void

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GobanSocketOptions.html b/docs/interfaces/_internal_.GobanSocketOptions.html index 87a1f0d6..7d3a1fc0 100644 --- a/docs/interfaces/_internal_.GobanSocketOptions.html +++ b/docs/interfaces/_internal_.GobanSocketOptions.html @@ -1,7 +1,7 @@ -GobanSocketOptions | goban

    Interface GobanSocketOptions

    interface GobanSocketOptions {
        dont_ping?: boolean;
        ping_interval?: number;
        quiet?: boolean;
        timeout_delay?: number;
    }

    Properties

    dont_ping? +GobanSocketOptions | goban

    Interface GobanSocketOptions

    interface GobanSocketOptions {
        dont_ping?: boolean;
        ping_interval?: number;
        quiet?: boolean;
        timeout_delay?: number;
    }

    Properties

    dont_ping?: boolean

    Don't automatically send pings

    -
    ping_interval?: number
    quiet?: boolean

    Don't log connection/disconnect things

    -
    timeout_delay?: number
    \ No newline at end of file +
    ping_interval?: number
    quiet?: boolean

    Don't log connection/disconnect things

    +
    timeout_delay?: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html b/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html index 33cc1503..05467039 100644 --- a/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html +++ b/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html @@ -1,4 +1,4 @@ -JGOFPlayerClockWithTimedOut | goban

    Interface JGOFPlayerClockWithTimedOut

    interface JGOFPlayerClockWithTimedOut {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
        timed_out: boolean;
    }

    Hierarchy (view full)

    Properties

    block_time_left? +JGOFPlayerClockWithTimedOut | goban

    Interface JGOFPlayerClockWithTimedOut

    interface JGOFPlayerClockWithTimedOut {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
        timed_out: boolean;
    }

    Hierarchy (view full)

    Properties

    block_time_left?: number

    Used with canadian time control. Time left in milliseconds to make the remainder of your moves in the current block

    -
    main_time: number

    Main time left on the clock, in milliseconds.

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    main_time: number

    Main time left on the clock, in milliseconds.

    +
    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    -
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    -
    timed_out: boolean
    \ No newline at end of file +
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    +
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    +
    timed_out: boolean
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.MoveTreeViewPortInterface.html b/docs/interfaces/_internal_.MoveTreeViewPortInterface.html index ed88fe48..7095adc7 100644 --- a/docs/interfaces/_internal_.MoveTreeViewPortInterface.html +++ b/docs/interfaces/_internal_.MoveTreeViewPortInterface.html @@ -1,7 +1,7 @@ -MoveTreeViewPortInterface | goban

    Interface MoveTreeViewPortInterface

    interface MoveTreeViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx +MoveTreeViewPortInterface | goban

    Interface MoveTreeViewPortInterface

    interface MoveTreeViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file +

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ReviewComment.html b/docs/interfaces/_internal_.ReviewComment.html index 5308c87b..39cff6a0 100644 --- a/docs/interfaces/_internal_.ReviewComment.html +++ b/docs/interfaces/_internal_.ReviewComment.html @@ -1,3 +1,3 @@ -ReviewComment | goban

    Interface ReviewComment

    interface ReviewComment {
        review_id: number;
        type: "review";
    }

    Properties

    review_id +ReviewComment | goban

    Interface ReviewComment

    interface ReviewComment {
        review_id: number;
        type: "review";
    }

    Properties

    Properties

    review_id: number
    type: "review"
    \ No newline at end of file +

    Properties

    review_id: number
    type: "review"
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ViewPortInterface.html b/docs/interfaces/_internal_.ViewPortInterface.html index 1f3385b8..04e9e9fa 100644 --- a/docs/interfaces/_internal_.ViewPortInterface.html +++ b/docs/interfaces/_internal_.ViewPortInterface.html @@ -1,7 +1,7 @@ -ViewPortInterface | goban

    Interface ViewPortInterface

    interface ViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx +ViewPortInterface | goban

    Interface ViewPortInterface

    interface ViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file +

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file diff --git a/docs/interfaces/protocol.AIServerToClient.html b/docs/interfaces/protocol.AIServerToClient.html index 113d58b1..b19c7ac2 100644 --- a/docs/interfaces/protocol.AIServerToClient.html +++ b/docs/interfaces/protocol.AIServerToClient.html @@ -1,6 +1,6 @@ AIServerToClient | goban

    Interface AIServerToClient

    interface AIServerToClient {
        net/pong: ((data) => void);
        [uuid: string]: ((data) => void);
    }

    Indexable

    [uuid: string]: ((data) => void)

    AI review messages are streamed back to the AI review UUID.

    -
      • (data): void
      • Parameters

        • data: any

        Returns void

    Properties

      • (data): void
      • Parameters

        • data: any

        Returns void

    Properties

    Properties

    net/pong: ((data) => void)

    Pong response from a ping

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              server: number;
          }
          • client: number

            Client timestamp that was sent

          • server: number

            Server timestamp when it was received

            -

        Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/interfaces/protocol.AutomatchPreferences.html b/docs/interfaces/protocol.AutomatchPreferences.html index 32a8355e..1cc6e5fc 100644 --- a/docs/interfaces/protocol.AutomatchPreferences.html +++ b/docs/interfaces/protocol.AutomatchPreferences.html @@ -1,4 +1,4 @@ -AutomatchPreferences | goban

    Interface AutomatchPreferences

    interface AutomatchPreferences {
        handicap: {
            condition: AutomatchCondition;
            value: "enabled" | "disabled";
        };
        lower_rank_diff: number;
        rules: {
            condition: AutomatchCondition;
            value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
        };
        size_speed_options: {
            size: Size;
            speed: Speed;
        }[];
        time_control: {
            condition: AutomatchCondition;
            value: {
                initial_time?: number;
                main_time?: number;
                max_time?: number;
                pause_on_weekends?: boolean;
                per_move?: number;
                period_time?: number;
                periods?: number;
                stones_per_period?: number;
                system: "fischer" | "byoyomi" | "canadian" | "simple";
                time_increment?: number;
            };
        };
        timestamp?: number;
        upper_rank_diff: number;
        uuid: string;
    }

    Properties

    handicap +AutomatchPreferences | goban

    Interface AutomatchPreferences

    interface AutomatchPreferences {
        handicap: {
            condition: AutomatchCondition;
            value: "enabled" | "disabled";
        };
        lower_rank_diff: number;
        rules: {
            condition: AutomatchCondition;
            value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
        };
        size_speed_options: {
            size: Size;
            speed: Speed;
        }[];
        time_control: {
            condition: AutomatchCondition;
            value: {
                initial_time?: number;
                main_time?: number;
                max_time?: number;
                pause_on_weekends?: boolean;
                per_move?: number;
                period_time?: number;
                periods?: number;
                stones_per_period?: number;
                system: "fischer" | "byoyomi" | "canadian" | "simple";
                time_increment?: number;
            };
        };
        timestamp?: number;
        upper_rank_diff: number;
        uuid: string;
    }

    Properties

    handicap: {
        condition: AutomatchCondition;
        value: "enabled" | "disabled";
    }

    Type declaration

    lower_rank_diff: number
    rules: {
        condition: AutomatchCondition;
        value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
    }

    Type declaration

    • condition: AutomatchCondition
    • value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
    size_speed_options: {
        size: Size;
        speed: Speed;
    }[]

    Type declaration

    time_control: {
        condition: AutomatchCondition;
        value: {
            initial_time?: number;
            main_time?: number;
            max_time?: number;
            pause_on_weekends?: boolean;
            per_move?: number;
            period_time?: number;
            periods?: number;
            stones_per_period?: number;
            system: "fischer" | "byoyomi" | "canadian" | "simple";
            time_increment?: number;
        };
    }

    Type declaration

    • condition: AutomatchCondition
    • value: {
          initial_time?: number;
          main_time?: number;
          max_time?: number;
          pause_on_weekends?: boolean;
          per_move?: number;
          period_time?: number;
          periods?: number;
          stones_per_period?: number;
          system: "fischer" | "byoyomi" | "canadian" | "simple";
          time_increment?: number;
      }
      • Optional initial_time?: number
      • Optional main_time?: number
      • Optional max_time?: number
      • Optional pause_on_weekends?: boolean
      • Optional per_move?: number
      • Optional period_time?: number
      • Optional periods?: number
      • Optional stones_per_period?: number
      • system: "fischer" | "byoyomi" | "canadian" | "simple"
      • Optional time_increment?: number
    timestamp?: number
    upper_rank_diff: number
    uuid: string
    \ No newline at end of file +

    Properties

    handicap: {
        condition: AutomatchCondition;
        value: "enabled" | "disabled";
    }

    Type declaration

    lower_rank_diff: number
    rules: {
        condition: AutomatchCondition;
        value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
    }

    Type declaration

    • condition: AutomatchCondition
    • value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
    size_speed_options: {
        size: Size;
        speed: Speed;
    }[]

    Type declaration

    time_control: {
        condition: AutomatchCondition;
        value: {
            initial_time?: number;
            main_time?: number;
            max_time?: number;
            pause_on_weekends?: boolean;
            per_move?: number;
            period_time?: number;
            periods?: number;
            stones_per_period?: number;
            system: "fischer" | "byoyomi" | "canadian" | "simple";
            time_increment?: number;
        };
    }

    Type declaration

    • condition: AutomatchCondition
    • value: {
          initial_time?: number;
          main_time?: number;
          max_time?: number;
          pause_on_weekends?: boolean;
          per_move?: number;
          period_time?: number;
          periods?: number;
          stones_per_period?: number;
          system: "fischer" | "byoyomi" | "canadian" | "simple";
          time_increment?: number;
      }
      • Optional initial_time?: number
      • Optional main_time?: number
      • Optional max_time?: number
      • Optional pause_on_weekends?: boolean
      • Optional per_move?: number
      • Optional period_time?: number
      • Optional periods?: number
      • Optional stones_per_period?: number
      • system: "fischer" | "byoyomi" | "canadian" | "simple"
      • Optional time_increment?: number
    timestamp?: number
    upper_rank_diff: number
    uuid: string
    \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToAIServer.html b/docs/interfaces/protocol.ClientToAIServer.html index e232958a..5ef23471 100644 --- a/docs/interfaces/protocol.ClientToAIServer.html +++ b/docs/interfaces/protocol.ClientToAIServer.html @@ -1,6 +1,6 @@ ClientToAIServer | goban

    Interface ClientToAIServer

    This is an exhaustive list of the messages that the client can send to the AI servers.

    -
    interface ClientToAIServer {
        ai-analyze-position: ((data) => any);
        ai-analyze-subscribe: ((data) => void);
        ai-analyze-unsubscribe: ((data) => void);
        ai-analyze-variation: ((data) => void);
        ai-relay-analyzed-position: ((data) => any);
        ai-review-connect: ((data) => void);
        ai-review-disconnect: ((data) => void);
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        net/ping: ((data) => void);
    }

    Hierarchy (view full)

    Properties

    interface ClientToAIServer {
        ai-analyze-position: ((data) => any);
        ai-analyze-subscribe: ((data) => void);
        ai-analyze-unsubscribe: ((data) => void);
        ai-analyze-variation: ((data) => void);
        ai-relay-analyzed-position: ((data) => any);
        ai-review-connect: ((data) => void);
        ai-review-disconnect: ((data) => void);
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        net/ping: ((data) => void);
    }

    Hierarchy (view full)

    Properties

  • rules: RuleSet

    Ruleset to use

  • uuid: string

    UUID identifying the request

  • white_prisoners: number

    Number of captures white has

    -
  • Returns any

    ai-analyze-subscribe: ((data) => void)

    Subscribers to analyze position calls

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-unsubscribe: ((data) => void)

    Un-subscribers to analyze position calls

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-variation: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              from: number;
              game_id: string | number;
              uuid: string;
              variation: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

            +

        Returns any

    ai-analyze-subscribe: ((data) => void)

    Subscribers to analyze position calls

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-unsubscribe: ((data) => void)

    Un-subscribers to analyze position calls

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-variation: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              from: number;
              game_id: string | number;
              uuid: string;
              variation: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

          • from: number

            The move number we're branching from

          • game_id: string | number

            The game id we're analyzing

          • uuid: string

            AI UUID

          • variation: string

            Move string

            -

        Returns void

    ai-relay-analyzed-position: ((data) => any)

    Relay an already analyzed position out to any other viewers

    +

    Returns void

    ai-relay-analyzed-position: ((data) => any)

    Relay an already analyzed position out to any other viewers

    Type declaration

    ai-review-connect: ((data) => void)

    Type declaration

    ai-review-connect: ((data) => void)

    Type declaration

    ai-review-disconnect: ((data) => void)

    Type declaration

    authenticate: ((data) => undefined | {
        id: number;
        username: string;
    })

    Authenticate with the server.

    +

    Returns void

    ai-review-disconnect: ((data) => void)

    Type declaration

    authenticate: ((data) => undefined | {
        id: number;
        username: string;
    })

    Authenticate with the server.

    Prior to authentication, you should perform a GET request to /api/v1/ui/config to get the current configuration. Within the returned JSON @@ -47,7 +47,7 @@

  • Optional language?: string

    ISO 639-1 language code used on this device.

  • Optional language_version?: string

    The version of the translation dictionary.

  • Optional user_agent?: string

    Browser user agent (or websocket library)

    -
  • Returns undefined | {
        id: number;
        username: string;
    }

    net/ping: ((data) => void)

    Sends a ping to the server. This message should be +

    Returns undefined | {
        id: number;
        username: string;
    }

    net/ping: ((data) => void)

    Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -55,4 +55,4 @@

    Type declaration

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToServer.html b/docs/interfaces/protocol.ClientToServer.html index f72e07b7..2d6540c7 100644 --- a/docs/interfaces/protocol.ClientToServer.html +++ b/docs/interfaces/protocol.ClientToServer.html @@ -11,7 +11,7 @@
     {
    bot_apikey?: string;
    bot_username?: string;
    client?: string;
    client_version?: string;
    device_id?: string;
    jwt: string;
    language?: string;
    language_version?: string;
    user_agent?: string;
    }

    and you can expect to receive back either undefined or {id: number, username: string}

    -
    interface ClientToServer {
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        automatch/cancel: ((data) => void);
        automatch/find_match: ((data) => void);
        automatch/list: ((data) => void);
        bot/config: ((config) => void);
        bot/status: ((data) => void);
        challenge/keepalive: ((data) => void);
        chat/join: ((data) => void);
        chat/part: ((data) => void);
        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        });
        chat/pm/close: ((data) => void);
        chat/pm/load: ((data) => void);
        chat/pm/superchat: ((data) => void);
        chat/remove: ((data) => void);
        chat/remove_all: ((data) => void);
        chat/send: ((data) => void);
        chat/topic: ((data) => void);
        game/annul: ((data) => void);
        game/cancel: ((data) => void);
        game/chat: ((data) => void);
        game/chat/remove: ((data) => void);
        game/clear_delayed_resign: ((data) => void);
        game/conditional_moves/set: ((data) => void);
        game/connect: ((data) => void);
        game/delayed_resign: ((data) => void);
        game/disconnect: ((data) => void);
        game/latency: ((data) => void);
        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[]);
        game/move: ((data) => void);
        game/pause: ((data) => void);
        game/prevent_escaping: ((data) => void);
        game/prevent_stalling: ((data) => void);
        game/removed_stones/accept: ((data) => void);
        game/removed_stones/reject: ((data) => void);
        game/removed_stones/set: ((data) => void);
        game/resign: ((data) => void);
        game/resume: ((data) => void);
        game/timed_out: ((data) => void);
        game/undo/accept: ((data) => void);
        game/undo/cancel: ((data) => void);
        game/undo/request: ((data) => void);
        gamelist/count/subscribe: ((data) => void);
        gamelist/count/unsubscribe: ((data) => void);
        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        });
        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        });
        itc: ((data) => void);
        net/ping: ((data) => void);
        notification/delete: ((data) => void);
        remote_storage/remove: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/set: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/sync: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        review/append: ((data) => void);
        review/chat: ((data) => void);
        review/chat/remove: ((data) => void);
        review/connect: ((data) => void);
        review/disconnect: ((data) => void);
        seek_graph/connect: ((data) => void);
        seek_graph/disconnect: ((data) => void);
        stats/online: ((data) => number);
        ui-pushes/subscribe: ((data) => void);
        ui-pushes/unsubscribe: ((data) => void);
        user/monitor: ((data) => void);
    }

    Hierarchy (view full)

    Properties

    interface ClientToServer {
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        automatch/cancel: ((data) => void);
        automatch/find_match: ((data) => void);
        automatch/list: ((data) => void);
        bot/config: ((config) => void);
        bot/status: ((data) => void);
        challenge/keepalive: ((data) => void);
        chat/join: ((data) => void);
        chat/part: ((data) => void);
        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        });
        chat/pm/close: ((data) => void);
        chat/pm/load: ((data) => void);
        chat/pm/superchat: ((data) => void);
        chat/remove: ((data) => void);
        chat/remove_all: ((data) => void);
        chat/send: ((data) => void);
        chat/topic: ((data) => void);
        game/annul: ((data) => void);
        game/cancel: ((data) => void);
        game/chat: ((data) => void);
        game/chat/remove: ((data) => void);
        game/clear_delayed_resign: ((data) => void);
        game/conditional_moves/set: ((data) => void);
        game/connect: ((data) => void);
        game/delayed_resign: ((data) => void);
        game/disconnect: ((data) => void);
        game/latency: ((data) => void);
        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[]);
        game/move: ((data) => void);
        game/pause: ((data) => void);
        game/prevent_escaping: ((data) => void);
        game/prevent_stalling: ((data) => void);
        game/removed_stones/accept: ((data) => void);
        game/removed_stones/reject: ((data) => void);
        game/removed_stones/set: ((data) => void);
        game/resign: ((data) => void);
        game/resume: ((data) => void);
        game/timed_out: ((data) => void);
        game/undo/accept: ((data) => void);
        game/undo/cancel: ((data) => void);
        game/undo/request: ((data) => void);
        gamelist/count/subscribe: ((data) => void);
        gamelist/count/unsubscribe: ((data) => void);
        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        });
        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        });
        itc: ((data) => void);
        net/ping: ((data) => void);
        notification/delete: ((data) => void);
        remote_storage/remove: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/set: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/sync: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        review/append: ((data) => void);
        review/chat: ((data) => void);
        review/chat/remove: ((data) => void);
        review/connect: ((data) => void);
        review/disconnect: ((data) => void);
        seek_graph/connect: ((data) => void);
        seek_graph/disconnect: ((data) => void);
        stats/online: ((data) => number);
        ui-pushes/subscribe: ((data) => void);
        ui-pushes/unsubscribe: ((data) => void);
        user/monitor: ((data) => void);
    }

    Hierarchy (view full)

    Properties

  • Optional language?: string

    ISO 639-1 language code used on this device.

  • Optional language_version?: string

    The version of the translation dictionary.

  • Optional user_agent?: string

    Browser user agent (or websocket library)

    -
  • Returns undefined | {
        id: number;
        username: string;
    }

    automatch/cancel: ((data) => void)

    Cancel a match request

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/find_match: ((data) => void)

    Request a match via the automatch system

    -

    Type declaration

    automatch/list: ((data) => void)

    Get active automatch entries for the current user

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {}

          Returns void

      bot/config: ((config) => void)

      Updates the config for the bot

      -

      Type declaration

        • (config): void
        • Parameters

          • config: any

          Returns void

      bot/status: ((data) => void)

      Update the number of games that the bot is currently playing

      -

      Type declaration

        • (data): void
        • Parameters

          • data: {
                ongoing_blitz_count: number;
                ongoing_correspondence_count: number;
                ongoing_live_count: number;
            }
            • ongoing_blitz_count: number
            • ongoing_correspondence_count: number
            • ongoing_live_count: number

          Returns void

      challenge/keepalive: ((data) => void)

      Message to let the server know the client is still interested +

      Returns undefined | {
          id: number;
          username: string;
      }

      automatch/cancel: ((data) => void)

      Cancel a match request

      +

      Type declaration

        • (data): void
        • Parameters

          • data: {
                uuid: string;
            }
            • uuid: string

          Returns void

      automatch/find_match: ((data) => void)

      Request a match via the automatch system

      +

      Type declaration

      automatch/list: ((data) => void)

      Get active automatch entries for the current user

      +

      Type declaration

        • (data): void
        • Parameters

          • data: {}

            Returns void

        bot/config: ((config) => void)

        Updates the config for the bot

        +

        Type declaration

          • (config): void
          • Parameters

            • config: any

            Returns void

        bot/status: ((data) => void)

        Update the number of games that the bot is currently playing

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  ongoing_blitz_count: number;
                  ongoing_correspondence_count: number;
                  ongoing_live_count: number;
              }
              • ongoing_blitz_count: number
              • ongoing_correspondence_count: number
              • ongoing_live_count: number

            Returns void

        challenge/keepalive: ((data) => void)

        Message to let the server know the client is still interested in the specified blitz or live challenge. These should be sent about once a second to prevent the server from canceling the challenge.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  challenge_id: number;
                  game_id: number;
              }
              • challenge_id: number
              • game_id: number

            Returns void

        chat/join: ((data) => void)

        Join a chat channel

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  challenge_id: number;
                  game_id: number;
              }
              • challenge_id: number
              • game_id: number

            Returns void

        chat/join: ((data) => void)

        Join a chat channel

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to join

                -

            Returns void

        chat/part: ((data) => void)

        Leave a channel

        +

        Returns void

        chat/part: ((data) => void)

        Leave a channel

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to leave

                -

            Returns void

        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        })

        Send a private message to another user

        +

        Returns void

        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        })

        Send a private message to another user

        Type declaration

          • (data): undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }
          • Parameters

            • data: {
                  as_system?: true;
                  message: string;
                  player_id: number;
                  uid: string;
                  username: string;
              }
              • Optional as_system?: true

                Moderator option to send the chat from the system not from their personal PM

              • message: string

                Message text

              • player_id: number

                Player ID of the recipient

              • uid: string

                UUID for the message

              • username: string

                Username of the recipient

                -

            Returns undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }

        chat/pm/close: ((data) => void)

        Closes the current user's private message session with the given player id

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/load: ((data) => void)

        Loads the current user's private message session history with the given player id

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/superchat: ((data) => void)

        Begins a "super chat" session with the given player id, which creates an +

        Returns undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        }

        chat/pm/close: ((data) => void)

        Closes the current user's private message session with the given player id

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/load: ((data) => void)

        Loads the current user's private message session history with the given player id

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/superchat: ((data) => void)

        Begins a "super chat" session with the given player id, which creates an unclosable dialog if enable is true, and makes the dialog closable again if enable is false. This is only available to moderators.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  enable: boolean;
                  player_id: number;
                  username: string;
              }
              • enable: boolean

                Set to true if you want the modal to be unclosable, false if you want the modal to be closable again

              • player_id: number
              • username: string

                Username of the recipient

                -

            Returns void

        chat/remove: ((data) => void)

        Moderator only command to remove a single chat message

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  uuid: string;
              }
              • uuid: string

            Returns void

        chat/remove_all: ((data) => void)

        Moderator only command to remove all chat messages for a given player

        +

        Returns void

        chat/remove: ((data) => void)

        Moderator only command to remove a single chat message

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  uuid: string;
              }
              • uuid: string

            Returns void

        chat/remove_all: ((data) => void)

        Moderator only command to remove all chat messages for a given player

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

                Player id to remove all messages for

                -

            Returns void

        chat/send: ((data) => void)

        Sends a chat message to the given channel

        +

        Returns void

        chat/send: ((data) => void)

        Sends a chat message to the given channel

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  message: string;
                  uuid: string;
              }
              • channel: string

                Channel to send the message to

              • message: string

                Message text

              • uuid: string

                ID for the message

                -

            Returns void

        chat/topic: ((data) => void)

        Sets a channel topic

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  topic: string;
              }
              • channel: string
              • topic: string

            Returns void

        game/annul: ((data) => void)

        In Japanese rules, if the game is found to be repeating, the players +

        Returns void

        chat/topic: ((data) => void)

        Sets a channel topic

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  topic: string;
              }
              • channel: string
              • topic: string

            Returns void

        game/annul: ((data) => void)

        In Japanese rules, if the game is found to be repeating, the players may opt to annul the entire game and start over.

        This is largely undesired in an online setting and support for this will probably be removed in the future, dont' bother implementing this.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/cancel: ((data) => void)

        Cancels a game. This is effectively the same as resign, except the +

        Returns void

        game/cancel: ((data) => void)

        Cancels a game. This is effectively the same as resign, except the game will not be ranked. This is only allowed within the first few moves of the game. (See GobanEngine.gameCanBeCancelled for cancellation )

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/chat: ((data) => void)

        Sends a chat message to a game

        +

        Returns void

        game/chat: ((data) => void)

        Sends a chat message to a game

        Type declaration

        game/chat/remove: ((data) => void)

        Moderator only command to remove a single chat message from a game

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  chat_id: string;
                  game_id: number;
              }
              • channel: string
              • chat_id: string
              • game_id: number

            Returns void

        game/clear_delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/conditional_moves/set: ((data) => void)

        Sets conditional moves to be made on behalf of the player in response +

        Returns void

        game/chat/remove: ((data) => void)

        Moderator only command to remove a single chat message from a game

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  chat_id: string;
                  game_id: number;
              }
              • channel: string
              • chat_id: string
              • game_id: number

            Returns void

        game/clear_delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/conditional_moves/set: ((data) => void)

        Sets conditional moves to be made on behalf of the player in response to a move by the opponent.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  conditional_moves: ConditionalMoveResponse;
                  game_id: number;
                  move_number: number;
              }
              • conditional_moves: ConditionalMoveResponse

                The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

              • game_id: number

                The game id

              • move_number: number

                The move number from which the conditional moves are rooted in

                -

            Returns void

        game/connect: ((data) => void)

        Connect to a game. Once connected, the client will receive game +

        Returns void

        game/connect: ((data) => void)

        Connect to a game. Once connected, the client will receive game updates relevant to the game.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  chat?: boolean;
                  game_id: number;
              }
              • Optional chat?: boolean

                If true, the client will receive the game chat log and new chat events

              • game_id: number

                The game id to connect to

                -

            Returns void

        game/delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/disconnect: ((data) => void)

        Disconnect from a game. This will stop game updates for a particular game.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns void

        game/latency: ((data) => void)

        Update your latency information for a particular game. This is used +

        Returns void

        game/delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/disconnect: ((data) => void)

        Disconnect from a game. This will stop game updates for a particular game.

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns void

        game/latency: ((data) => void)

        Update your latency information for a particular game. This is used for clock synchronization. It is not strictly required, however strongly suggested for live games.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  latency: number;
              }
              • game_id: number

                The game id

              • latency: number

                Network latency, measured in milliseconds. See net/ping to measure this.

                -

            Returns void

        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[])

        Returns an event log for the given game. This is primarily +

        Returns void

        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[])

        Returns an event log for the given game. This is primarily for moderation purposes, although the endpoint is generally available to all users.

        -

        Type declaration

          • (data): {
                data: any;
                event: string;
                timestamp: string;
            }[]
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns {
                data: any;
                event: string;
                timestamp: string;
            }[]

        game/move: ((data) => void)

        Submit a move for a game

        +

        Type declaration

          • (data): {
                data: any;
                event: string;
                timestamp: string;
            }[]
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns {
                data: any;
                event: string;
                timestamp: string;
            }[]

        game/move: ((data) => void)

        Submit a move for a game

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  blur?: number;
                  clock?: JGOFPlayerClock;
                  game_id: number;
                  move: string;
              }
              • Optional blur?: number

                Maximum number of milliseconds the client was out of focus between the last move and this move

              • Optional clock?: JGOFPlayerClock

                Clock according to the client. If this is within the margin of @@ -168,18 +168,18 @@ clock value. If not provided, the server clock will be used.

              • game_id: number

                The game id

              • move: string

                The move number to play at

                -

            Returns void

        game/pause: ((data) => void)

        Pauses the game clocks

        +

        Returns void

        game/pause: ((data) => void)

        Pauses the game clocks

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/prevent_escaping: ((data) => void)

        Request the server end a game that someone has left without resigning +

        Returns void

        game/prevent_escaping: ((data) => void)

        Request the server end a game that someone has left without resigning from

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  annul: boolean;
                  game_id: number;
                  winner: "black" | "white";
              }
              • annul: boolean

                Request that the game be annulled or not

              • game_id: number

                The game id

              • winner: "black" | "white"

                The proposed winner

                -

            Returns void

        game/prevent_stalling: ((data) => void)

        Request the server end a game that is being stalled by one of the +

        Returns void

        game/prevent_stalling: ((data) => void)

        Request the server end a game that is being stalled by one of the players. This will only work if the server agrees in the outcome.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  winner: "black" | "white";
              }
              • game_id: number

                The game id

              • winner: "black" | "white"

                The proposed winner

                -

            Returns void

        game/removed_stones/accept: ((data) => void)

        Accepts the stones as removed. Once both players have accepted the same +

        Returns void

        game/removed_stones/accept: ((data) => void)

        Accepts the stones as removed. Once both players have accepted the same stones, the stone removal phase will conclude and the game will finish.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  stones: string;
                  strict_seki_mode: boolean;
              }
              • game_id: number

                The game id

              • stones: string

                All of the stones that are accepted as removed, and all @@ -190,9 +190,9 @@ era of the game, the official client no longer displays this as an option to the user as it was very largely unused and was a large source of confusion.

                -

            Returns void

        game/removed_stones/reject: ((data) => void)

        Rejects the removed stones and resumes the game from the stone removal phase

        +

        Returns void

        game/removed_stones/reject: ((data) => void)

        Rejects the removed stones and resumes the game from the stone removal phase

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/removed_stones/set: ((data) => void)

        Sets removed stones in the stone removal phase.

        +

        Returns void

        game/removed_stones/set: ((data) => void)

        Sets removed stones in the stone removal phase.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  needs_sealing?: JGOFSealingIntersection[];
                  removed: boolean;
                  stones: string | JGOFMove[];
                  strict_seki_mode?: boolean;
              }
              • game_id: number

                The game id

              • Optional needs_sealing?: JGOFSealingIntersection[]

                List of intersections that need to be sealed before the game can be correctly scored. Note, if this is undefined, the value will not @@ -208,47 +208,47 @@ option to the user as it was very largely unused and was a large source of confusion. This field is deprecated and will likely be removed in the future.

                -

            Returns void

        game/resign: ((data) => void)

        Resigns from the game

        +

        Returns void

        game/resign: ((data) => void)

        Resigns from the game

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/resume: ((data) => void)

        Resumes the game clocks

        +

        Returns void

        game/resume: ((data) => void)

        Resumes the game clocks

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/timed_out: ((data) => void)

        Inform the server that the client believes it's clock has timed out +

        Returns void

        game/timed_out: ((data) => void)

        Inform the server that the client believes it's clock has timed out and the game should be ended in a timeout. This is not strictly necessary to implement as the server will also timeout games, however there is a grace period to account for network latency, so well behaved clients can (and should) send this message to be very exact with timeouts.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/undo/accept: ((data) => void)

        Accepts an undo

        +

        Returns void

        game/undo/accept: ((data) => void)

        Accepts an undo

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        game/undo/cancel: ((data) => void)

        Cancels an undo request

        +

        Returns void

        game/undo/cancel: ((data) => void)

        Cancels an undo request

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        game/undo/request: ((data) => void)

        Requests an undo

        +

        Returns void

        game/undo/request: ((data) => void)

        Requests an undo

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        gamelist/count/subscribe: ((data) => void)

        Connects to the game list count. +

        Returns void

        gamelist/count/subscribe: ((data) => void)

        Connects to the game list count. Once connected you'll start receiving gamelist-count or gamelist-count-${channel} messages.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to subscribe to. If no channel is provided, the global server counts will be sent

                -

            Returns void

        gamelist/count/unsubscribe: ((data) => void)

        Disconnects from the game list count

        +

        Returns void

        gamelist/count/unsubscribe: ((data) => void)

        Disconnects from the game list count

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to unsubscribe from. If no channel is provided, the global server counts will be unsubscribed from

                -

            Returns void

        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        })

        Queries the server for a list of games

        +

        Returns void

        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        })

        Queries the server for a list of games

        Type declaration

          • (data): undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }
          • Parameters

            • data: {
                  channel?: string;
                  from: number;
                  limit: number;
                  list: "live" | "corr" | "kidsgo";
                  sort_by: "rank";
                  where: GameListWhere;
              }
              • Optional channel?: string

                The group or tournament channel to query

              • from: number

                The number of games to skip before returning results

              • limit: number

                Number of games to return, between 1 and 300

              • list: "live" | "corr" | "kidsgo"
              • sort_by: "rank"
              • where: GameListWhere

                Filtering options

                -

            Returns undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }

        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        })

        Retrieve host information for the termination server you are connected to

        -

        Type declaration

          • (data): {
                clients: number;
                ggs-version: string;
                hostname: string;
                uptime: number;
            }
          • Parameters

            • data: {}

              Returns {
                  clients: number;
                  ggs-version: string;
                  hostname: string;
                  uptime: number;
              }

              • clients: number
              • ggs-version: string
              • hostname: string
              • uptime: number
          itc: ((data) => void)

          Sends an "Inter Tab Communication" message to all other connected +

          Returns undefined | {
              by: string;
              from: number;
              limit: number;
              list: string;
              results: GameListEntry[];
              size: number;
              where: GameListWhere;
          }

          hostinfo: ((data) => {
              clients: number;
              ggs-version: string;
              hostname: string;
              uptime: number;
          })

          Retrieve host information for the termination server you are connected to

          +

          Type declaration

            • (data): {
                  clients: number;
                  ggs-version: string;
                  hostname: string;
                  uptime: number;
              }
            • Parameters

              • data: {}

                Returns {
                    clients: number;
                    ggs-version: string;
                    hostname: string;
                    uptime: number;
                }

                • clients: number
                • ggs-version: string
                • hostname: string
                • uptime: number
            itc: ((data) => void)

            Sends an "Inter Tab Communication" message to all other connected clients for the current user. This includes other devices, so the "Tab" part is a bit of a misnomer.

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: any;
                      event: string;
                  }
                  • data: any

                    User defined data

                  • event: string

                    User defined event string

                    -

                Returns void

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be +

            Returns void

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -256,37 +256,37 @@

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      drift: number;
                      latency: number;
                  }
                  • client: number

                    Client timestamp - milliseconds since epoch

                  • drift: number

                    Last clock drift measurement, or 0

                  • latency: number

                    Last latency measurement, or 0

                    -

                Returns void

            notification/delete: ((data) => void)

            Deletes a notification

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      notification_id: string;
                  }
                  • notification_id: string

                Returns void

            remote_storage/remove: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Remove the given key from remote storage system for this user

            +

            Returns void

            notification/delete: ((data) => void)

            Deletes a notification

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      notification_id: string;
                  }
                  • notification_id: string

                Returns void

            remote_storage/remove: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Remove the given key from remote storage system for this user

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/set: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Set the given key in the remote storage system for this user

            +

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/set: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Set the given key in the remote storage system for this user

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/sync: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Requests all updated key/value pairs for this user since the +

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/sync: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Requests all updated key/value pairs for this user since the provided timestamp (as as ISO 8601 string).

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                • data: {
                      since: string;
                  }
                  • since: string

                    ISO 8601 timestamp. Updates made after this timestamp will be sent to the client.

                    -

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            review/append: ((data) => void)

            Append a review action to the review log.

            -

            Type declaration

            review/chat: ((data) => void)

            Sends a chat message to a review

            +

            Returns {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            }

            review/append: ((data) => void)

            Append a review action to the review log.

            +

            Type declaration

            review/chat: ((data) => void)

            Sends a chat message to a review

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      body: string;
                      from: number;
                      moves: string;
                      review_id: number;
                  }
                  • body: string

                    The chat message

                  • from: number

                    The root of the branch the user is viewing

                  • moves: string

                    The analysis branch the user is viewing

                  • review_id: number

                    The review id

                    -

                Returns void

            review/chat/remove: ((data) => void)

            Moderator only command to remove a single chat message from a game

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      chat_id: string;
                      review_id: number;
                  }
                  • channel: string
                  • chat_id: string
                  • review_id: number

                Returns void

            review/connect: ((data) => void)

            Connects to a review

            +

            Returns void

            review/chat/remove: ((data) => void)

            Moderator only command to remove a single chat message from a game

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      chat_id: string;
                      review_id: number;
                  }
                  • channel: string
                  • chat_id: string
                  • review_id: number

                Returns void

            review/connect: ((data) => void)

            Connects to a review

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    -

                Returns void

            review/disconnect: ((data) => void)

            Disconnects from a review

            +

            Returns void

            review/disconnect: ((data) => void)

            Disconnects from a review

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    -

                Returns void

            seek_graph/connect: ((data) => void)

            Subscribes to the seek graph events. The channel is required to be "global" +

            Returns void

            seek_graph/connect: ((data) => void)

            Subscribes to the seek graph events. The channel is required to be "global" for now and the foreseeable future.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            seek_graph/disconnect: ((data) => void)

            Un-Subscribes to the seek graph events. The channel is required to be "global" +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            seek_graph/disconnect: ((data) => void)

            Un-Subscribes to the seek graph events. The channel is required to be "global" for now and the foreseeable future.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            stats/online: ((data) => number)

            Request the number of unique authenticated players +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            stats/online: ((data) => number)

            Request the number of unique authenticated players online within the given interval

            Type declaration

              • (data): number
              • Parameters

                • data: {
                      interval: number;
                  }
                  • interval: number

                    Interval in seconds

                    -

                Returns number

            ui-pushes/subscribe: ((data) => void)

            Subscribes to UI related push event messages sent to a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            ui-pushes/unsubscribe: ((data) => void)

            Un-Subscribes to UI related push event messages sent to a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            user/monitor: ((data) => void)

            Subscribes to online status updates for the given player ids

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      user_ids: number[];
                  }
                  • user_ids: number[]

                Returns void

            \ No newline at end of file +

            Returns number

            ui-pushes/subscribe: ((data) => void)

            Subscribes to UI related push event messages sent to a particular channel

            +

            Type declaration

            ui-pushes/unsubscribe: ((data) => void)

            Un-Subscribes to UI related push event messages sent to a particular channel

            +

            Type declaration

            user/monitor: ((data) => void)

            Subscribes to online status updates for the given player ids

            +

            Type declaration

            \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToServerBase.html b/docs/interfaces/protocol.ClientToServerBase.html index 124001d4..d2d80a8d 100644 --- a/docs/interfaces/protocol.ClientToServerBase.html +++ b/docs/interfaces/protocol.ClientToServerBase.html @@ -1,5 +1,5 @@ ClientToServerBase | goban

            Interface ClientToServerBase

            Messages that clients send, regardless of target server

            -
            interface ClientToServerBase {
                authenticate: ((data) => undefined | {
                    id: number;
                    username: string;
                });
                net/ping: ((data) => void);
            }

            Hierarchy (view full)

            Properties

            interface ClientToServerBase {
                authenticate: ((data) => undefined | {
                    id: number;
                    username: string;
                });
                net/ping: ((data) => void);
            }

            Hierarchy (view full)

            Properties

            authenticate: ((data) => undefined | {
                id: number;
                username: string;
            })

            Authenticate with the server.

            Prior to authentication, you should perform a GET request to @@ -16,7 +16,7 @@

          • Optional language?: string

            ISO 639-1 language code used on this device.

          • Optional language_version?: string

            The version of the translation dictionary.

          • Optional user_agent?: string

            Browser user agent (or websocket library)

            -
          • Returns undefined | {
                id: number;
                username: string;
            }

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be +

            Returns undefined | {
                id: number;
                username: string;
            }

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -24,4 +24,4 @@

            Type declaration

            \ No newline at end of file +

            Returns void

            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatAnalysisMessage.html b/docs/interfaces/protocol.GameChatAnalysisMessage.html index bc9380f3..7f56f304 100644 --- a/docs/interfaces/protocol.GameChatAnalysisMessage.html +++ b/docs/interfaces/protocol.GameChatAnalysisMessage.html @@ -1,4 +1,4 @@ -GameChatAnalysisMessage | goban

            Interface GameChatAnalysisMessage

            interface GameChatAnalysisMessage {
                branch_move?: number;
                engine_analysis?: {
                    score?: number;
                    visits?: number;
                    win_rate: number;
                    [key: string]: number | undefined;
                };
                from?: number;
                marks?: {
                    [mark: string]: string;
                };
                moves?: string;
                name?: string;
                pen_marks?: unknown[];
                type: "analysis";
            }

            Properties

            branch_move? +GameChatAnalysisMessage | goban

            Interface GameChatAnalysisMessage

            interface GameChatAnalysisMessage {
                branch_move?: number;
                engine_analysis?: {
                    score?: number;
                    visits?: number;
                    win_rate: number;
                    [key: string]: number | undefined;
                };
                from?: number;
                marks?: {
                    [mark: string]: string;
                };
                moves?: string;
                name?: string;
                pen_marks?: unknown[];
                type: "analysis";
            }

            Properties

            branch_move?: number
            engine_analysis?: {
                score?: number;
                visits?: number;
                win_rate: number;
                [key: string]: number | undefined;
            }

            Type declaration

            • [key: string]: number | undefined
            • Optional score?: number
            • Optional visits?: number
            • win_rate: number
            from?: number
            marks?: {
                [mark: string]: string;
            }

            Type declaration

            • [mark: string]: string
            moves?: string
            name?: string
            pen_marks?: unknown[]
            type: "analysis"
            \ No newline at end of file +

            Properties

            branch_move?: number
            engine_analysis?: {
                score?: number;
                visits?: number;
                win_rate: number;
                [key: string]: number | undefined;
            }

            Type declaration

            • [key: string]: number | undefined
            • Optional score?: number
            • Optional visits?: number
            • win_rate: number
            from?: number
            marks?: {
                [mark: string]: string;
            }

            Type declaration

            • [mark: string]: string
            moves?: string
            name?: string
            pen_marks?: unknown[]
            type: "analysis"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatLine.html b/docs/interfaces/protocol.GameChatLine.html index 35e6f716..ed154be8 100644 --- a/docs/interfaces/protocol.GameChatLine.html +++ b/docs/interfaces/protocol.GameChatLine.html @@ -1,4 +1,4 @@ -GameChatLine | goban

            Interface GameChatLine

            interface GameChatLine {
                body: string | AnalysisComment | ReviewComment;
                channel: string;
                chat_id: string;
                date: number;
                from?: number;
                move_number: number;
                moves?: string;
                player_id: number;
                username?: string;
            }

            Properties

            body +GameChatLine | goban

            Interface GameChatLine

            interface GameChatLine {
                body: string | AnalysisComment | ReviewComment;
                channel: string;
                chat_id: string;
                date: number;
                from?: number;
                move_number: number;
                moves?: string;
                player_id: number;
                username?: string;
            }

            Properties

            Properties

            channel: string
            chat_id: string
            date: number
            from?: number
            move_number: number
            moves?: string
            player_id: number
            username?: string
            \ No newline at end of file +

            Properties

            channel: string
            chat_id: string
            date: number
            from?: number
            move_number: number
            moves?: string
            player_id: number
            username?: string
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatMessage.html b/docs/interfaces/protocol.GameChatMessage.html index acf73c69..4957c425 100644 --- a/docs/interfaces/protocol.GameChatMessage.html +++ b/docs/interfaces/protocol.GameChatMessage.html @@ -1,3 +1,3 @@ -GameChatMessage | goban

            Interface GameChatMessage

            interface GameChatMessage {
                channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban";
                line: GameChatLine;
            }

            Properties

            channel +GameChatMessage | goban

            Interface GameChatMessage

            interface GameChatMessage {
                channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban";
                line: GameChatLine;
            }

            Properties

            Properties

            channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban"
            \ No newline at end of file +

            Properties

            channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatReviewMessage.html b/docs/interfaces/protocol.GameChatReviewMessage.html index 7cbc3ea8..5bae070a 100644 --- a/docs/interfaces/protocol.GameChatReviewMessage.html +++ b/docs/interfaces/protocol.GameChatReviewMessage.html @@ -1,3 +1,3 @@ -GameChatReviewMessage | goban

            Interface GameChatReviewMessage

            interface GameChatReviewMessage {
                review_id: number;
                type: "review";
            }

            Properties

            review_id +GameChatReviewMessage | goban

            Interface GameChatReviewMessage

            interface GameChatReviewMessage {
                review_id: number;
                type: "review";
            }

            Properties

            Properties

            review_id: number
            type: "review"
            \ No newline at end of file +

            Properties

            review_id: number
            type: "review"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatTranslatedMessage.html b/docs/interfaces/protocol.GameChatTranslatedMessage.html index 4effaade..d38dc4c9 100644 --- a/docs/interfaces/protocol.GameChatTranslatedMessage.html +++ b/docs/interfaces/protocol.GameChatTranslatedMessage.html @@ -1,3 +1,3 @@ -GameChatTranslatedMessage | goban

            Interface GameChatTranslatedMessage

            interface GameChatTranslatedMessage {
                en: string;
                type: "translated";
                [lang: string]: string;
            }

            Indexable

            [lang: string]: string

            Properties

            en +GameChatTranslatedMessage | goban

            Interface GameChatTranslatedMessage

            interface GameChatTranslatedMessage {
                en: string;
                type: "translated";
                [lang: string]: string;
            }

            Indexable

            [lang: string]: string

            Properties

            Properties

            en: string
            type: "translated"
            \ No newline at end of file +

            Properties

            en: string
            type: "translated"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameClock.html b/docs/interfaces/protocol.GameClock.html index aea312a7..ab397d89 100644 --- a/docs/interfaces/protocol.GameClock.html +++ b/docs/interfaces/protocol.GameClock.html @@ -1,4 +1,4 @@ -GameClock | goban

            Interface GameClock

            interface GameClock {
                black_player_id: number;
                black_time?: ClockTime;
                current_player: number;
                expiration: number;
                expiration_delta?: number;
                game_id: number;
                last_move: number;
                now?: number;
                pause?: {
                    pause_control?: {
                        [key: string]: boolean;
                    };
                    paused?: boolean;
                    paused_since?: number;
                };
                pause_delta?: number;
                paused_since?: number;
                start_mode?: boolean;
                stone_removal_expiration?: number;
                stone_removal_mode?: boolean;
                title: string;
                white_player_id: number;
                white_time?: ClockTime;
            }

            Properties

            black_player_id +GameClock | goban

            Interface GameClock

            interface GameClock {
                black_player_id: number;
                black_time?: ClockTime;
                current_player: number;
                expiration: number;
                expiration_delta?: number;
                game_id: number;
                last_move: number;
                now?: number;
                pause?: {
                    pause_control?: {
                        [key: string]: boolean;
                    };
                    paused?: boolean;
                    paused_since?: number;
                };
                pause_delta?: number;
                paused_since?: number;
                start_mode?: boolean;
                stone_removal_expiration?: number;
                stone_removal_mode?: boolean;
                title: string;
                white_player_id: number;
                white_time?: ClockTime;
            }

            Properties

            black_player_id: number
            black_time?: ClockTime
            current_player: number
            expiration: number
            expiration_delta?: number
            game_id: number
            last_move: number
            now?: number
            pause?: {
                pause_control?: {
                    [key: string]: boolean;
                };
                paused?: boolean;
                paused_since?: number;
            }

            Type declaration

            • Optional pause_control?: {
                  [key: string]: boolean;
              }
              • [key: string]: boolean
            • Optional paused?: boolean
            • Optional paused_since?: number
            pause_delta?: number
            paused_since?: number
            start_mode?: boolean
            stone_removal_expiration?: number
            stone_removal_mode?: boolean
            title: string
            white_player_id: number
            white_time?: ClockTime
            \ No newline at end of file +

            Properties

            black_player_id: number
            black_time?: ClockTime
            current_player: number
            expiration: number
            expiration_delta?: number
            game_id: number
            last_move: number
            now?: number
            pause?: {
                pause_control?: {
                    [key: string]: boolean;
                };
                paused?: boolean;
                paused_since?: number;
            }

            Type declaration

            • Optional pause_control?: {
                  [key: string]: boolean;
              }
              • [key: string]: boolean
            • Optional paused?: boolean
            • Optional paused_since?: number
            pause_delta?: number
            paused_since?: number
            start_mode?: boolean
            stone_removal_expiration?: number
            stone_removal_mode?: boolean
            title: string
            white_player_id: number
            white_time?: ClockTime
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameListEntry.html b/docs/interfaces/protocol.GameListEntry.html index 8f04f8a2..604fe6d2 100644 --- a/docs/interfaces/protocol.GameListEntry.html +++ b/docs/interfaces/protocol.GameListEntry.html @@ -1,4 +1,4 @@ -GameListEntry | goban

            Interface GameListEntry

            interface GameListEntry {
                _participants?: number[];
                black: GameListPlayer;
                bot_game?: boolean;
                clock_expiration: number;
                dropped_player: number;
                group_ids?: number[];
                group_ids_map?: {
                    [id: string]: boolean;
                };
                handicap?: number;
                height: number;
                id: number;
                in_beginning?: boolean;
                in_end?: boolean;
                in_middle?: boolean;
                kidsgo_game?: boolean;
                komi?: number;
                ladder_id?: number;
                malkovich_present?: boolean;
                move_number: number;
                name: string;
                paused: boolean;
                phase: string;
                player_to_move: number;
                private: boolean;
                ranked?: boolean;
                rengo: boolean;
                rengo_casual_mode: boolean;
                rengo_teams: {
                    black: User[];
                    white: User[];
                };
                socket_id?: any;
                time_per_move: number;
                tournament_id?: number;
                white: GameListPlayer;
                width: number;
            }

            Properties

            _participants? +GameListEntry | goban

            Interface GameListEntry

            interface GameListEntry {
                _participants?: number[];
                black: GameListPlayer;
                bot_game?: boolean;
                clock_expiration: number;
                dropped_player: number;
                group_ids?: number[];
                group_ids_map?: {
                    [id: string]: boolean;
                };
                handicap?: number;
                height: number;
                id: number;
                in_beginning?: boolean;
                in_end?: boolean;
                in_middle?: boolean;
                kidsgo_game?: boolean;
                komi?: number;
                ladder_id?: number;
                malkovich_present?: boolean;
                move_number: number;
                name: string;
                paused: boolean;
                phase: string;
                player_to_move: number;
                private: boolean;
                ranked?: boolean;
                rengo: boolean;
                rengo_casual_mode: boolean;
                rengo_teams: {
                    black: User[];
                    white: User[];
                };
                socket_id?: any;
                time_per_move: number;
                tournament_id?: number;
                white: GameListPlayer;
                width: number;
            }

            Properties

            _participants?: number[]
            bot_game?: boolean
            clock_expiration: number
            dropped_player: number
            group_ids?: number[]
            group_ids_map?: {
                [id: string]: boolean;
            }

            Type declaration

            • [id: string]: boolean
            handicap?: number
            height: number
            id: number
            in_beginning?: boolean
            in_end?: boolean
            in_middle?: boolean
            kidsgo_game?: boolean
            komi?: number
            ladder_id?: number
            malkovich_present?: boolean
            move_number: number
            name: string
            paused: boolean
            phase: string
            player_to_move: number
            private: boolean
            ranked?: boolean
            rengo: boolean
            rengo_casual_mode: boolean
            rengo_teams: {
                black: User[];
                white: User[];
            }

            Type declaration

            socket_id?: any
            time_per_move: number
            tournament_id?: number
            width: number
            \ No newline at end of file +

            Properties

            _participants?: number[]
            bot_game?: boolean
            clock_expiration: number
            dropped_player: number
            group_ids?: number[]
            group_ids_map?: {
                [id: string]: boolean;
            }

            Type declaration

            • [id: string]: boolean
            handicap?: number
            height: number
            id: number
            in_beginning?: boolean
            in_end?: boolean
            in_middle?: boolean
            kidsgo_game?: boolean
            komi?: number
            ladder_id?: number
            malkovich_present?: boolean
            move_number: number
            name: string
            paused: boolean
            phase: string
            player_to_move: number
            private: boolean
            ranked?: boolean
            rengo: boolean
            rengo_casual_mode: boolean
            rengo_teams: {
                black: User[];
                white: User[];
            }

            Type declaration

            socket_id?: any
            time_per_move: number
            tournament_id?: number
            width: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameListWhere.html b/docs/interfaces/protocol.GameListWhere.html index 71700887..3f7836eb 100644 --- a/docs/interfaces/protocol.GameListWhere.html +++ b/docs/interfaces/protocol.GameListWhere.html @@ -1,5 +1,5 @@ GameListWhere | goban

            Interface GameListWhere

            Parameters for the gamelist/query message

            -
            interface GameListWhere {
                hide_13x13?: boolean;
                hide_19x19?: boolean;
                hide_9x9?: boolean;
                hide_beginning?: boolean;
                hide_bot_games?: boolean;
                hide_end?: boolean;
                hide_even?: boolean;
                hide_handicap?: boolean;
                hide_ladder?: boolean;
                hide_middle?: boolean;
                hide_open?: boolean;
                hide_other?: boolean;
                hide_ranked?: boolean;
                hide_tournament?: boolean;
                hide_unranked?: boolean;
                ladder_id?: number;
                malk_only?: boolean;
                players?: number[];
                rengo_only?: boolean;
                tournament_id?: number;
            }

            Properties

            interface GameListWhere {
                hide_13x13?: boolean;
                hide_19x19?: boolean;
                hide_9x9?: boolean;
                hide_beginning?: boolean;
                hide_bot_games?: boolean;
                hide_end?: boolean;
                hide_even?: boolean;
                hide_handicap?: boolean;
                hide_ladder?: boolean;
                hide_middle?: boolean;
                hide_open?: boolean;
                hide_other?: boolean;
                hide_ranked?: boolean;
                hide_tournament?: boolean;
                hide_unranked?: boolean;
                ladder_id?: number;
                malk_only?: boolean;
                players?: number[];
                rengo_only?: boolean;
                tournament_id?: number;
            }

            Properties

            hide_13x13?: boolean
            hide_19x19?: boolean
            hide_9x9?: boolean
            hide_beginning?: boolean
            hide_bot_games?: boolean
            hide_end?: boolean
            hide_even?: boolean
            hide_handicap?: boolean
            hide_ladder?: boolean
            hide_middle?: boolean
            hide_open?: boolean
            hide_other?: boolean
            hide_ranked?: boolean
            hide_tournament?: boolean
            hide_unranked?: boolean
            ladder_id?: number
            malk_only?: boolean
            players?: number[]
            rengo_only?: boolean
            tournament_id?: number
            \ No newline at end of file +

            Properties

            hide_13x13?: boolean
            hide_19x19?: boolean
            hide_9x9?: boolean
            hide_beginning?: boolean
            hide_bot_games?: boolean
            hide_end?: boolean
            hide_even?: boolean
            hide_handicap?: boolean
            hide_ladder?: boolean
            hide_middle?: boolean
            hide_open?: boolean
            hide_other?: boolean
            hide_ranked?: boolean
            hide_tournament?: boolean
            hide_unranked?: boolean
            ladder_id?: number
            malk_only?: boolean
            players?: number[]
            rengo_only?: boolean
            tournament_id?: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.Glicko2.html b/docs/interfaces/protocol.Glicko2.html index 694c8cfc..2b4fff14 100644 --- a/docs/interfaces/protocol.Glicko2.html +++ b/docs/interfaces/protocol.Glicko2.html @@ -1,5 +1,5 @@ -Glicko2 | goban

            Interface Glicko2

            interface Glicko2 {
                deviation: number;
                games_played?: number;
                rating: number;
                volatility: number;
            }

            Properties

            deviation +Glicko2 | goban

            Interface Glicko2

            interface Glicko2 {
                deviation: number;
                games_played?: number;
                rating: number;
                volatility: number;
            }

            Properties

            deviation: number
            games_played?: number
            rating: number
            volatility: number
            \ No newline at end of file +

            Properties

            deviation: number
            games_played?: number
            rating: number
            volatility: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphChallengeMessage.html b/docs/interfaces/protocol.SeekgraphChallengeMessage.html index 4bded87a..359e5616 100644 --- a/docs/interfaces/protocol.SeekgraphChallengeMessage.html +++ b/docs/interfaces/protocol.SeekgraphChallengeMessage.html @@ -1,4 +1,4 @@ -SeekgraphChallengeMessage | goban

            Interface SeekgraphChallengeMessage

            interface SeekgraphChallengeMessage {
                challenge_id: number;
                challenger_color: "black" | "white" | "automatic";
                disable_analysis: boolean;
                game_id: number;
                handicap: null | number;
                height: number;
                invite_only: boolean;
                komi: null | number;
                max_rank: number;
                min_rank: number;
                name: string;
                professional: boolean;
                ranked: boolean;
                ranking: number;
                rengo: boolean;
                rengo_auto_start: boolean;
                rengo_black_team: number[];
                rengo_casual_mode: boolean;
                rengo_nominees: number[];
                rengo_participants: number[];
                rengo_white_team: number[];
                rules: string;
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                time_per_move: number;
                user_id: number;
                username: string;
                uuid: string;
                width: number;
            }

            Properties

            challenge_id +SeekgraphChallengeMessage | goban

            Interface SeekgraphChallengeMessage

            interface SeekgraphChallengeMessage {
                challenge_id: number;
                challenger_color: "black" | "white" | "automatic";
                disable_analysis: boolean;
                game_id: number;
                handicap: null | number;
                height: number;
                invite_only: boolean;
                komi: null | number;
                max_rank: number;
                min_rank: number;
                name: string;
                professional: boolean;
                ranked: boolean;
                ranking: number;
                rengo: boolean;
                rengo_auto_start: boolean;
                rengo_black_team: number[];
                rengo_casual_mode: boolean;
                rengo_nominees: number[];
                rengo_participants: number[];
                rengo_white_team: number[];
                rules: string;
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                time_per_move: number;
                user_id: number;
                username: string;
                uuid: string;
                width: number;
            }

            Properties

            challenge_id: number

            The ID of the challenge

            -
            challenger_color: "black" | "white" | "automatic"

            Color the accepting player will be

            -
            disable_analysis: boolean

            If analysis is disabled

            -
            game_id: number

            The game ID

            -
            handicap: null | number

            The game handicap

            -
            height: number

            Board height

            -
            invite_only: boolean

            If the game is only joinable by invitation

            -
            komi: null | number

            Komi

            -
            max_rank: number

            Maximum rank allowed to accept the game

            -
            min_rank: number

            Minimum rank allowed to accept the game

            -
            name: string

            Game name

            -
            professional: boolean

            If they are a professional player

            -
            ranked: boolean

            If the game is ranked

            -
            ranking: number

            Their ranking *

            -
            rengo: boolean

            If it's a rengo game

            -
            rengo_auto_start: boolean

            If the rengo game will automatically start

            -
            rengo_black_team: number[]

            Player ids of the players on the Black team

            -
            rengo_casual_mode: boolean

            If the game is a casual rengo game

            -
            rengo_nominees: number[]

            Player ids of people that have been nominated to play

            -
            rengo_participants: number[]

            All player ids involved in the game

            -
            rengo_white_team: number[]

            Player ids of the players on the White team

            -
            rules: string

            Rules being used

            -
            time_control: string

            Time control system type

            -
            time_control_parameters: JGOFTimeControl

            Time control parameters

            -
            time_per_move: number

            Average time per move

            -
            user_id: number

            User id of the player who is looking for a game

            -
            username: string

            Username of the player looking for the game

            -
            uuid: string

            A UUID for the invitation

            -
            width: number

            Board width

            -
            \ No newline at end of file +
            challenger_color: "black" | "white" | "automatic"

            Color the accepting player will be

            +
            disable_analysis: boolean

            If analysis is disabled

            +
            game_id: number

            The game ID

            +
            handicap: null | number

            The game handicap

            +
            height: number

            Board height

            +
            invite_only: boolean

            If the game is only joinable by invitation

            +
            komi: null | number

            Komi

            +
            max_rank: number

            Maximum rank allowed to accept the game

            +
            min_rank: number

            Minimum rank allowed to accept the game

            +
            name: string

            Game name

            +
            professional: boolean

            If they are a professional player

            +
            ranked: boolean

            If the game is ranked

            +
            ranking: number

            Their ranking *

            +
            rengo: boolean

            If it's a rengo game

            +
            rengo_auto_start: boolean

            If the rengo game will automatically start

            +
            rengo_black_team: number[]

            Player ids of the players on the Black team

            +
            rengo_casual_mode: boolean

            If the game is a casual rengo game

            +
            rengo_nominees: number[]

            Player ids of people that have been nominated to play

            +
            rengo_participants: number[]

            All player ids involved in the game

            +
            rengo_white_team: number[]

            Player ids of the players on the White team

            +
            rules: string

            Rules being used

            +
            time_control: string

            Time control system type

            +
            time_control_parameters: JGOFTimeControl

            Time control parameters

            +
            time_per_move: number

            Average time per move

            +
            user_id: number

            User id of the player who is looking for a game

            +
            username: string

            Username of the player looking for the game

            +
            uuid: string

            A UUID for the invitation

            +
            width: number

            Board width

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphDeleteMessage.html b/docs/interfaces/protocol.SeekgraphDeleteMessage.html index fca5d707..62ca17bd 100644 --- a/docs/interfaces/protocol.SeekgraphDeleteMessage.html +++ b/docs/interfaces/protocol.SeekgraphDeleteMessage.html @@ -1,5 +1,5 @@ -SeekgraphDeleteMessage | goban

            Interface SeekgraphDeleteMessage

            interface SeekgraphDeleteMessage {
                challenge_id: number;
                delete: true;
            }

            Properties

            challenge_id +SeekgraphDeleteMessage | goban

            Interface SeekgraphDeleteMessage

            interface SeekgraphDeleteMessage {
                challenge_id: number;
                delete: true;
            }

            Properties

            Properties

            challenge_id: number

            The ID of the challenge

            -
            delete: true

            The entry should be deleted if this field exists and is true

            -
            \ No newline at end of file +
            delete: true

            The entry should be deleted if this field exists and is true

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphStartedMessage.html b/docs/interfaces/protocol.SeekgraphStartedMessage.html index b54390b6..3f8fca54 100644 --- a/docs/interfaces/protocol.SeekgraphStartedMessage.html +++ b/docs/interfaces/protocol.SeekgraphStartedMessage.html @@ -1,4 +1,4 @@ -SeekgraphStartedMessage | goban

            Interface SeekgraphStartedMessage

            interface SeekgraphStartedMessage {
                black: User;
                challenge_id: number;
                creator: number;
                game_id: number;
                game_started?: true;
                rengo?: true;
                rengo_auto_start?: boolean;
                rengo_black_team?: number[];
                rengo_casual_mode?: boolean;
                rengo_white_team?: number[];
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                white: User;
            }

            Properties

            black +SeekgraphStartedMessage | goban

            Interface SeekgraphStartedMessage

            interface SeekgraphStartedMessage {
                black: User;
                challenge_id: number;
                creator: number;
                game_id: number;
                game_started?: true;
                rengo?: true;
                rengo_auto_start?: boolean;
                rengo_black_team?: number[];
                rengo_casual_mode?: boolean;
                rengo_white_team?: number[];
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                white: User;
            }

            Properties

            black: User

            Black player

            -
            challenge_id: number

            The ID of the challenge

            -
            creator: number

            Player ID of the creator

            -
            game_id: number

            The game id

            -
            game_started?: true

            If exists and is true, the game has been started and the entry should be removed from the seek graph

            -
            rengo?: true

            Rengo game if true

            -
            rengo_auto_start?: boolean

            Whether the rengo game with automatically start

            -
            rengo_black_team?: number[]

            Player ids of the players on the Black team

            -
            rengo_casual_mode?: boolean

            Wether it's a Casual mode rengo game

            -
            rengo_white_team?: number[]

            Player ids of the players on the White team

            -
            time_control: string

            Time control system

            -
            time_control_parameters: JGOFTimeControl

            Time control parameters

            -
            white: User

            White player

            -
            \ No newline at end of file +
            challenge_id: number

            The ID of the challenge

            +
            creator: number

            Player ID of the creator

            +
            game_id: number

            The game id

            +
            game_started?: true

            If exists and is true, the game has been started and the entry should be removed from the seek graph

            +
            rengo?: true

            Rengo game if true

            +
            rengo_auto_start?: boolean

            Whether the rengo game with automatically start

            +
            rengo_black_team?: number[]

            Player ids of the players on the Black team

            +
            rengo_casual_mode?: boolean

            Wether it's a Casual mode rengo game

            +
            rengo_white_team?: number[]

            Player ids of the players on the White team

            +
            time_control: string

            Time control system

            +
            time_control_parameters: JGOFTimeControl

            Time control parameters

            +
            white: User

            White player

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.ServerToClient.html b/docs/interfaces/protocol.ServerToClient.html index 242c047c..005f68a6 100644 --- a/docs/interfaces/protocol.ServerToClient.html +++ b/docs/interfaces/protocol.ServerToClient.html @@ -1,5 +1,5 @@ ServerToClient | goban

            Interface ServerToClient

            interface ServerToClient {
                ERROR: ((data) => void);
                HUP: (() => void);
                active-bots: ((data) => void);
                active_game: ((data) => void);
                automatch/cancel: ((data) => void);
                automatch/entry: ((data) => void);
                automatch/start: ((data) => void);
                chat-join: ((data) => void);
                chat-message: ((data) => void);
                chat-message-removed: ((data) => void);
                chat-part: ((data) => void);
                chat-topic: ((data) => void);
                chat-update-user: ((data) => void);
                game/:id/auto_resign: ((data) => void);
                game/:id/chat: ((data) => void);
                game/:id/chat/remove: ((data) => void);
                game/:id/clear_auto_resign: ((data) => void);
                game/:id/clock: ((data) => void);
                game/:id/conditional_moves: ((data) => void);
                game/:id/error: ((data) => void);
                game/:id/gamedata: ((data) => void);
                game/:id/latency: ((data) => void);
                game/:id/phase: ((data) => void);
                game/:id/removed_stones: ((data) => void);
                game/:id/removed_stones_accepted: ((data) => void);
                game/:id/reset-chats: (() => void);
                game/:id/stalling_score_estimate: ((data?) => void);
                game/:id/undo_accepted: ((data) => void);
                game/:id/undo_canceled: ((data) => void);
                game/:id/undo_requested: ((data) => void);
                gamelist-count: ((data) => void);
                gamelist-count-:channel: ((data) => void);
                hostinfo: ((data) => void);
                incident-report: ((data) => void);
                itc: ((data) => void);
                net/pong: ((data) => void);
                notification: ((data) => void);
                private-message: ((data) => void);
                private-superchat: ((data) => void);
                remote_storage/sync_complete: (() => void);
                remote_storage/update: ((data) => void);
                review/:id/full_state: ((data) => void);
                review/:id/r: ((data) => void);
                score-estimator-enabled-state: ((data) => void);
                seekgraph/global: ((messages) => void);
                ui-push: ((data) => void);
                user/jwt: ((jwt) => void);
                user/state: ((data) => void);
                user/update: ((user) => void);
                [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"];
            }

            Hierarchy (view full)

            Indexable

            [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"]

            A move was made on a game

            -

            Properties

            Properties

            ERROR HUP active-bots active_game @@ -51,16 +51,16 @@

            Properties

            ERROR: ((data) => void)

            An error occurred, the message string should be displayed to the user. For a list of errcode's used, see https://github.com/online-go/online-go.com/blob/devel/src/components/Errcode/Errcode.tsx

            -

            Type declaration

              • (data): void
              • Parameters

                • data: string | {
                      errcode: string;
                  }

                Returns void

            HUP: (() => void)

            The client should reload

            -

            Type declaration

              • (): void
              • Returns void

            active-bots: ((data) => void)

            Updates the list of bots that are connected and ready to the server

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [id: number]: User;
                  }

                Returns void

            active_game: ((data) => void)

            Message to inform the client of an active game, or a change to an existing game

            -

            Type declaration

            automatch/cancel: ((data) => void)

            An automatch request was canceled

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      uuid: string;
                  }
                  • uuid: string

                Returns void

            automatch/entry: ((data) => void)

            An automatch request is active

            -

            Type declaration

            automatch/start: ((data) => void)

            An automatch request was started

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      uuid: string;
                  }
                  • game_id: number
                  • uuid: string

                Returns void

            chat-join: ((data) => void)

            User(s) joined a chat channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: string | {
                      errcode: string;
                  }

                Returns void

            HUP: (() => void)

            The client should reload

            +

            Type declaration

              • (): void
              • Returns void

            active-bots: ((data) => void)

            Updates the list of bots that are connected and ready to the server

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [id: number]: User;
                  }

                Returns void

            active_game: ((data) => void)

            Message to inform the client of an active game, or a change to an existing game

            +

            Type declaration

            automatch/cancel: ((data) => void)

            An automatch request was canceled

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      uuid: string;
                  }
                  • uuid: string

                Returns void

            automatch/entry: ((data) => void)

            An automatch request is active

            +

            Type declaration

            automatch/start: ((data) => void)

            An automatch request was started

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      uuid: string;
                  }
                  • game_id: number
                  • uuid: string

                Returns void

            chat-join: ((data) => void)

            User(s) joined a chat channel

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      users: User[];
                  }
                  • channel: string

                    The channel

                  • users: User[]

                    List of users that joined

                    -

                Returns void

            chat-message: ((data) => void)

            Chat message was received

            +

            Returns void

            chat-message: ((data) => void)

            Chat message was received

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      message: {
                          i?: string;
                          m: string;
                          t: number;
                      };
                      professional: boolean;
                      ranking: number;
                      system?: true;
                      system_message_type?: "flood";
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                  • Optional country?: string

                    Country the user is from

                  • id: number

                    User id of the sender

                    @@ -73,14 +73,14 @@
                  • Optional system?: true

                    Whether it's a system message or not

                  • Optional system_message_type?: "flood"
                  • ui_class: string

                    UI class of the sender

                  • username: string

                    Username of the sender

                    -

                Returns void

            chat-message-removed: ((data) => void)

            A chat message should be removed from the display

            +

            Returns void

            chat-message-removed: ((data) => void)

            A chat message should be removed from the display

            Type declaration

            chat-part: ((data) => void)

            User left a chat channel

            +

            Returns void

            chat-part: ((data) => void)

            User left a chat channel

            Type declaration

            chat-topic: ((data) => void)

            Channel topic was updated

            +

            Returns void

            chat-topic: ((data) => void)

            Channel topic was updated

            Type declaration

            chat-update-user: ((data) => void)

            A user's profile was updated

            +

            Returns void

            chat-update-user: ((data) => void)

            A user's profile was updated

            Type declaration

            game/:id/auto_resign: ((data) => void)

            Informs the client the player is scheduled to resign if not cleared

            +

            Returns void

            game/:id/auto_resign: ((data) => void)

            Informs the client the player is scheduled to resign if not cleared

            Type declaration

            game/:id/chat: ((data) => void)

            A game chat message

            -

            Type declaration

            game/:id/chat/remove: ((data) => void)

            Game chat lines should be removed

            +

            Returns void

            game/:id/chat: ((data) => void)

            A game chat message

            +

            Type declaration

            game/:id/chat/remove: ((data) => void)

            Game chat lines should be removed

            Type declaration

            game/:id/clear_auto_resign: ((data) => void)

            The auto resign for the given player has been cleared

            +

            Returns void

            game/:id/clear_auto_resign: ((data) => void)

            The auto resign for the given player has been cleared

            Type declaration

            game/:id/clock: ((data) => void)

            Game clock update

            -

            Type declaration

            game/:id/conditional_moves: ((data) => void)

            Update the conditional moves currently active

            +

            Returns void

            game/:id/clock: ((data) => void)

            Game clock update

            +

            Type declaration

            game/:id/conditional_moves: ((data) => void)

            Update the conditional moves currently active

            Type declaration

            game/:id/error: ((data) => void)

            Error that should be displayed to the user

            -

            Type declaration

            game/:id/gamedata: ((data) => void)

            Update the entire game state

            -

            Type declaration

            game/:id/latency: ((data) => void)

            Update latency information for a player

            +

            Returns void

            game/:id/error: ((data) => void)

            Error that should be displayed to the user

            +

            Type declaration

            game/:id/gamedata: ((data) => void)

            Update the entire game state

            +

            Type declaration

            game/:id/latency: ((data) => void)

            Update latency information for a player

            Type declaration

            game/:id/phase: ((data) => void)

            The phase has changed for the game

            -

            Type declaration

            game/:id/removed_stones: ((data) => void)

            Update the state of the stone removal phase

            -

            Type declaration

            game/:id/removed_stones_accepted: ((data) => void)

            The stone removal phase has been completed, this is the final state and +

            Returns void

            game/:id/phase: ((data) => void)

            The phase has changed for the game

            +

            Type declaration

            game/:id/removed_stones: ((data) => void)

            Update the state of the stone removal phase

            +

            Type declaration

            game/:id/removed_stones_accepted: ((data) => void)

            The stone removal phase has been completed, this is the final state and indicates a phase change to the given phase (should always be "finished")

            Type declaration

            game/:id/reset-chats: (() => void)

            The chat log should be reset.

            -

            Type declaration

            game/:id/stalling_score_estimate: ((data?) => void)

            A score estimation result has been broadcast, this is used for avoiding game stalling

            -

            Type declaration

            game/:id/undo_accepted: ((data) => void)

            Undo move has been accepted, the parameter is the new move number

            -

            Type declaration

            game/:id/undo_canceled: ((data) => void)

            Undo request has been canceled, the parameter is the move number of the original request

            -

            Type declaration

            game/:id/undo_requested: ((data) => void)

            Undo request has been requested, the parameter is the move number that we want to go back to

            -

            Type declaration

            gamelist-count: ((data) => void)

            Update number of live and correspondence games are currently being +

            Returns void

            game/:id/reset-chats: (() => void)

            The chat log should be reset.

            +

            Type declaration

            game/:id/stalling_score_estimate: ((data?) => void)

            A score estimation result has been broadcast, this is used for avoiding game stalling

            +

            Type declaration

            game/:id/undo_accepted: ((data) => void)

            Undo move has been accepted, the parameter is the new move number

            +

            Type declaration

            game/:id/undo_canceled: ((data) => void)

            Undo request has been canceled, the parameter is the move number of the original request

            +

            Type declaration

            game/:id/undo_requested: ((data) => void)

            Undo request has been requested, the parameter is the move number that we want to go back to

            +

            Type declaration

            gamelist-count: ((data) => void)

            Update number of live and correspondence games are currently being played

            Type declaration

            gamelist-count-:channel: ((data) => void)

            Update number of live and correspondence games are currently being +

            Returns void

            gamelist-count-:channel: ((data) => void)

            Update number of live and correspondence games are currently being played in a particular channel

            Type declaration

            hostinfo: ((data) => void)

            General host information for the termination server you +

            Returns void

            hostinfo: ((data) => void)

            General host information for the termination server you are connected to. This is a response to the hostinfo client message.

            Type declaration

            incident-report: ((data) => void)

            Incident report update

            -

            Type declaration

            itc: ((data) => void)

            "Inter Tab Communication" message. This is a client utility to enable +

            Returns void

            incident-report: ((data) => void)

            Incident report update

            +

            Type declaration

            itc: ((data) => void)

            "Inter Tab Communication" message. This is a client utility to enable relaying of messages between devices - the event and data are application defined, the server blindly relays to all connected devices for the sending user. Note this is relayed to all devices regardless @@ -163,17 +163,17 @@ the web client sending this will arrive on an android and ios instance)

            Type declaration

            net/pong: ((data) => void)

            Pong response from a ping

            +

            Returns void

            net/pong: ((data) => void)

            Pong response from a ping

            Type declaration

            notification: ((data) => void)

            A notification that should be displayed to the user +

            Returns void

            notification: ((data) => void)

            A notification that should be displayed to the user These are not strongly modeled, see https://github.com/online-go/online-go.com/blob/devel/src/components/Notifications/Notifications.tsx as a reference for what types there are and what data they contain

            Type declaration

            private-message: ((data) => void)

            A private message was received

            +

            Returns void

            private-message: ((data) => void)

            A private message was received

            Type declaration

            private-superchat: ((data) => void)

            Notify the client that a private message "super chat" has started. A +

            Returns void

            private-superchat: ((data) => void)

            Notify the client that a private message "super chat" has started. A super chat is an undismissable chat sent by a moderator. It should take all focus and not let the client do anything until the conversation is resolved (the enable flag is set to false)

            @@ -194,30 +194,30 @@
          • moderator_username: string

            The moderator username contacting the player

          • player_id: number

            Your id

          • player_username: string

            Your username

            -
          • Returns void

            remote_storage/sync_complete: (() => void)

            Notification that the server has completed sending all remote storage +

            Returns void

            remote_storage/sync_complete: (() => void)

            Notification that the server has completed sending all remote storage data and the client should now be up to date.

            -

            Type declaration

            remote_storage/update: ((data) => void)

            Updates a key value pair

            +

            Type declaration

            remote_storage/update: ((data) => void)

            Updates a key value pair

            Type declaration

            review/:id/full_state: ((data) => void)

            Replay of the entire full state of the review

            -

            Type declaration

            review/:id/r: ((data) => void)

            An incremental modification to the review stream

            -

            Type declaration

            score-estimator-enabled-state: ((data) => void)

            Notifies the client whether the the client shares an IP with one of the +

            Returns void

            review/:id/full_state: ((data) => void)

            Replay of the entire full state of the review

            +

            Type declaration

            review/:id/r: ((data) => void)

            An incremental modification to the review stream

            +

            Type declaration

            score-estimator-enabled-state: ((data) => void)

            Notifies the client whether the the client shares an IP with one of the players of the game. This is used to disable the score estimator in anonymous browsing windows for players of a game when the score estimator is disabled for the game.

            Type declaration

            seekgraph/global: ((messages) => void)

            Type declaration

            ui-push: ((data) => void)

            A UI Push notification. The event and data are not well defined here, +

            Returns void

            seekgraph/global: ((messages) => void)

            Type declaration

            ui-push: ((data) => void)

            A UI Push notification. The event and data are not well defined here, they come as a result to subscribing to ui push channels with ui-pushes/subscribe.

            Type declaration

            user/jwt: ((jwt) => void)

            Update the user's JWT token

            -

            Type declaration

            user/state: ((data) => void)

            Updates whether a user is online or not. Subscribe to these updates for +

            Returns void

            user/jwt: ((jwt) => void)

            Update the user's JWT token

            +

            Type declaration

            user/state: ((data) => void)

            Updates whether a user is online or not. Subscribe to these updates for particular users using the user/monitor command.

            -

            Type declaration

            user/update: ((user) => void)

            Update user information. For other players, this has the standard User +

            Type declaration

            user/update: ((user) => void)

            Update user information. For other players, this has the standard User fields, when this is the current user, it can have additional fields that are found in the ui/config

            -

            Type declaration

            \ No newline at end of file +

            Type declaration

            \ No newline at end of file diff --git a/docs/interfaces/protocol.StallingScoreEstimate.html b/docs/interfaces/protocol.StallingScoreEstimate.html index 6e8bb134..4b3c110d 100644 --- a/docs/interfaces/protocol.StallingScoreEstimate.html +++ b/docs/interfaces/protocol.StallingScoreEstimate.html @@ -1,8 +1,8 @@ -StallingScoreEstimate | goban

            Interface StallingScoreEstimate

            interface StallingScoreEstimate {
                game_id: number;
                move_number: number;
                ownership: any[];
                predicted_winner: "black" | "white";
                removed: string;
                score: number;
                win_rate: number;
            }

            Properties

            game_id +StallingScoreEstimate | goban

            Interface StallingScoreEstimate

            interface StallingScoreEstimate {
                game_id: number;
                move_number: number;
                ownership: any[];
                predicted_winner: "black" | "white";
                removed: string;
                score: number;
                win_rate: number;
            }

            Properties

            game_id: number
            move_number: number
            ownership: any[]
            predicted_winner: "black" | "white"
            removed: string
            score: number
            win_rate: number
            \ No newline at end of file +

            Properties

            game_id: number
            move_number: number
            ownership: any[]
            predicted_winner: "black" | "white"
            removed: string
            score: number
            win_rate: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.User.html b/docs/interfaces/protocol.User.html index f0a8a2e6..f83867ab 100644 --- a/docs/interfaces/protocol.User.html +++ b/docs/interfaces/protocol.User.html @@ -1,8 +1,8 @@ -User | goban

            Interface User

            interface User {
                country?: string;
                id: number;
                professional?: boolean;
                ranking?: number;
                ratings?: {
                    [speed_size: string]: Glicko2;
                };
                ui_class?: string;
                username: string;
            }

            Properties

            country? +User | goban

            Interface User

            interface User {
                country?: string;
                id: number;
                professional?: boolean;
                ranking?: number;
                ratings?: {
                    [speed_size: string]: Glicko2;
                };
                ui_class?: string;
                username: string;
            }

            Properties

            country?: string
            id: number
            professional?: boolean
            ranking?: number
            ratings?: {
                [speed_size: string]: Glicko2;
            }

            Type declaration

            ui_class?: string
            username: string
            \ No newline at end of file +

            Properties

            country?: string
            id: number
            professional?: boolean
            ranking?: number
            ratings?: {
                [speed_size: string]: Glicko2;
            }

            Type declaration

            ui_class?: string
            username: string
            \ No newline at end of file diff --git a/docs/interfaces/translate.GobanStrings.html b/docs/interfaces/translate.GobanStrings.html index 5b2181e4..6b3e65c1 100644 --- a/docs/interfaces/translate.GobanStrings.html +++ b/docs/interfaces/translate.GobanStrings.html @@ -1,4 +1,4 @@ -GobanStrings | goban

            Interface GobanStrings

            interface GobanStrings {
                %sd: string;
                %sh: string;
                %sm: string;
                %ss: string;
                %swk: string;
                A stone has already been placed here: string;
                Anime: string;
                Black: string;
                Black Walnut: string;
                Black to move: string;
                Book: string;
                Bright Kaya: string;
                Control passed to %s: string;
                Custom: string;
                Enter the label you want to add to the board: string;
                Error: string;
                Error submitting move: string;
                Game Finished: string;
                Glass: string;
                Granite: string;
                HNG: string;
                HNG Night: string;
                Illegal Ko Move: string;
                Illegal board repetition: string;
                Kaya: string;
                Loading...: string;
                Move is suicidal: string;
                Night: string;
                Night Play: string;
                Persimmon: string;
                Plain: string;
                Processing...: string;
                Red Oak: string;
                Review: string;
                Self-capture is not allowed: string;
                Shell: string;
                Slate: string;
                Stone Removal: string;
                Stone Removal Phase: string;
                Submitting...: string;
                Synchronization error, reloading: string;
                The game would be repeating with that move, please play somewhere else first: string;
                White: string;
                White to move: string;
                Worn Glass: string;
                Your move: string;
                Your move - opponent passed: string;
            }

            Properties

            %sd +GobanStrings | goban

            Interface GobanStrings

            interface GobanStrings {
                %sd: string;
                %sh: string;
                %sm: string;
                %ss: string;
                %swk: string;
                A stone has already been placed here: string;
                Anime: string;
                Black: string;
                Black Walnut: string;
                Black to move: string;
                Book: string;
                Bright Kaya: string;
                Control passed to %s: string;
                Custom: string;
                Enter the label you want to add to the board: string;
                Error: string;
                Error submitting move: string;
                Game Finished: string;
                Glass: string;
                Granite: string;
                HNG: string;
                HNG Night: string;
                Illegal Ko Move: string;
                Illegal board repetition: string;
                Kaya: string;
                Loading...: string;
                Move is suicidal: string;
                Night: string;
                Night Play: string;
                Persimmon: string;
                Plain: string;
                Processing...: string;
                Red Oak: string;
                Review: string;
                Self-capture is not allowed: string;
                Shell: string;
                Slate: string;
                Stone Removal: string;
                Stone Removal Phase: string;
                Submitting...: string;
                Synchronization error, reloading: string;
                The game would be repeating with that move, please play somewhere else first: string;
                White: string;
                White to move: string;
                Worn Glass: string;
                Your move: string;
                Your move - opponent passed: string;
            }

            Properties

            %sd: string
            %sh: string
            %sm: string
            %ss: string
            %swk: string
            A stone has already been placed here: string
            Anime: string
            Black: string
            Black Walnut: string
            Black to move: string
            Book: string
            Bright Kaya: string
            Control passed to %s: string
            Custom: string
            Enter the label you want to add to the board: string
            Error: string
            Error submitting move: string
            Game Finished: string
            Glass: string
            Granite: string
            HNG: string
            HNG Night: string
            Illegal Ko Move: string
            Illegal board repetition: string
            Kaya: string
            Loading...: string
            Move is suicidal: string
            Night: string
            Night Play: string
            Persimmon: string
            Plain: string
            Processing...: string
            Red Oak: string
            Review: string
            Self-capture is not allowed: string
            Shell: string
            Slate: string
            Stone Removal: string
            Stone Removal Phase: string
            Submitting...: string
            Synchronization error, reloading: string
            The game would be repeating with that move, please play somewhere else first: string
            White: string
            White to move: string
            Worn Glass: string
            Your move: string
            Your move - opponent passed: string
            \ No newline at end of file +

            Properties

            %sd: string
            %sh: string
            %sm: string
            %ss: string
            %swk: string
            A stone has already been placed here: string
            Anime: string
            Black: string
            Black Walnut: string
            Black to move: string
            Book: string
            Bright Kaya: string
            Control passed to %s: string
            Custom: string
            Enter the label you want to add to the board: string
            Error: string
            Error submitting move: string
            Game Finished: string
            Glass: string
            Granite: string
            HNG: string
            HNG Night: string
            Illegal Ko Move: string
            Illegal board repetition: string
            Kaya: string
            Loading...: string
            Move is suicidal: string
            Night: string
            Night Play: string
            Persimmon: string
            Plain: string
            Processing...: string
            Red Oak: string
            Review: string
            Self-capture is not allowed: string
            Shell: string
            Slate: string
            Stone Removal: string
            Stone Removal Phase: string
            Submitting...: string
            Synchronization error, reloading: string
            The game would be repeating with that move, please play somewhere else first: string
            White: string
            White to move: string
            Worn Glass: string
            Your move: string
            Your move - opponent passed: string
            \ No newline at end of file diff --git a/docs/modules/protocol.html b/docs/modules/protocol.html index df24bb34..9e5c002a 100644 --- a/docs/modules/protocol.html +++ b/docs/modules/protocol.html @@ -59,7 +59,7 @@ for backwards compatibility.

            -

            Index

            Enumerations

            Index

            Enumerations

            Interfaces

            AIServerToClient AutomatchPreferences ClientToAIServer diff --git a/docs/modules/translate.html b/docs/modules/translate.html index 3b4ec0ef..e01e34e4 100644 --- a/docs/modules/translate.html +++ b/docs/modules/translate.html @@ -1,4 +1,4 @@ -translate | goban

            Namespace translate

            Index

            Interfaces

            GobanStrings +translate | goban

            Namespace translate

            Index

            Interfaces

            Functions

            _ interpolate setGobanTranslations diff --git a/docs/types/AdHocPackedMove.html b/docs/types/AdHocPackedMove.html index 1aefed28..ed86c9f0 100644 --- a/docs/types/AdHocPackedMove.html +++ b/docs/types/AdHocPackedMove.html @@ -1 +1 @@ -AdHocPackedMove | goban

            Type alias AdHocPackedMove

            AdHocPackedMove: [number, number, number?, JGOFNumericPlayerColor?, {
                [index: string]: any;
            }?]
            \ No newline at end of file +AdHocPackedMove | goban

            Type alias AdHocPackedMove

            AdHocPackedMove: [number, number, number?, JGOFNumericPlayerColor?, {
                [index: string]: any;
            }?]
            \ No newline at end of file diff --git a/docs/types/AnalysisSubTool.html b/docs/types/AnalysisSubTool.html index e067cc9d..1bf39df1 100644 --- a/docs/types/AnalysisSubTool.html +++ b/docs/types/AnalysisSubTool.html @@ -1 +1 @@ -AnalysisSubTool | goban

            Type alias AnalysisSubTool

            AnalysisSubTool: "black" | "white" | "alternate" | "letters" | "numbers" | string
            \ No newline at end of file +AnalysisSubTool | goban

            Type alias AnalysisSubTool

            AnalysisSubTool: "black" | "white" | "alternate" | "letters" | "numbers" | string
            \ No newline at end of file diff --git a/docs/types/AnalysisTool.html b/docs/types/AnalysisTool.html index e4b7e9c5..3a3f023d 100644 --- a/docs/types/AnalysisTool.html +++ b/docs/types/AnalysisTool.html @@ -1 +1 @@ -AnalysisTool | goban

            Type alias AnalysisTool

            AnalysisTool: "stone" | "draw" | "label" | "score" | "removal"
            \ No newline at end of file +AnalysisTool | goban

            Type alias AnalysisTool

            AnalysisTool: "stone" | "draw" | "label" | "score" | "removal"
            \ No newline at end of file diff --git a/docs/types/BoardTransform.html b/docs/types/BoardTransform.html index c97fd242..7b8adfa2 100644 --- a/docs/types/BoardTransform.html +++ b/docs/types/BoardTransform.html @@ -9,4 +9,4 @@

            The "easy to understand" part is that the id can be compared visually to the board position

            The downside is that the id string can be moderately long for boards with lots of stones

            -

            Type declaration

              • (x, y): {
                    x: number;
                    y: number;
                }
              • Parameters

                • x: number
                • y: number

                Returns {
                    x: number;
                    y: number;
                }

                • x: number
                • y: number
            \ No newline at end of file +

            Type declaration

              • (x, y): {
                    x: number;
                    y: number;
                }
              • Parameters

                • x: number
                • y: number

                Returns {
                    x: number;
                    y: number;
                }

                • x: number
                • y: number
            \ No newline at end of file diff --git a/docs/types/ConditionalMoveResponse.html b/docs/types/ConditionalMoveResponse.html index 2234cc1c..c7abee38 100644 --- a/docs/types/ConditionalMoveResponse.html +++ b/docs/types/ConditionalMoveResponse.html @@ -1,3 +1,3 @@ ConditionalMoveResponse | goban

            Type alias ConditionalMoveResponse

            ConditionalMoveResponse: [string | null, ConditionalMoveResponseTree]

            A branch in the conditional move tree, consists of the response move and the sub-tree of the next possible moves

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/DataArgument.html b/docs/types/DataArgument.html index 0ce5f6a2..b172237d 100644 --- a/docs/types/DataArgument.html +++ b/docs/types/DataArgument.html @@ -1 +1 @@ -DataArgument | goban

            Type alias DataArgument<Entry>

            DataArgument<Entry>: Entry extends ((...args) => void)
                ? A[0]
                : never

            Type Parameters

            • Entry
            \ No newline at end of file +DataArgument | goban

            Type alias DataArgument<Entry>

            DataArgument<Entry>: Entry extends ((...args) => void)
                ? A[0]
                : never

            Type Parameters

            • Entry
            \ No newline at end of file diff --git a/docs/types/GobanChatLog.html b/docs/types/GobanChatLog.html index 0efd7ab5..607b3d0c 100644 --- a/docs/types/GobanChatLog.html +++ b/docs/types/GobanChatLog.html @@ -1 +1 @@ -GobanChatLog | goban

            Type alias GobanChatLog

            GobanChatLog: GameChatLine[]
            \ No newline at end of file +GobanChatLog | goban

            Type alias GobanChatLog

            GobanChatLog: GameChatLine[]
            \ No newline at end of file diff --git a/docs/types/GobanEnginePhase.html b/docs/types/GobanEnginePhase.html index b607847c..4f8bba85 100644 --- a/docs/types/GobanEnginePhase.html +++ b/docs/types/GobanEnginePhase.html @@ -1 +1 @@ -GobanEnginePhase | goban

            Type alias GobanEnginePhase

            GobanEnginePhase: "play" | "stone removal" | "finished"
            \ No newline at end of file +GobanEnginePhase | goban

            Type alias GobanEnginePhase

            GobanEnginePhase: "play" | "stone removal" | "finished"
            \ No newline at end of file diff --git a/docs/types/GobanEngineRules.html b/docs/types/GobanEngineRules.html index 138e28f8..30769a31 100644 --- a/docs/types/GobanEngineRules.html +++ b/docs/types/GobanEngineRules.html @@ -1 +1 @@ -GobanEngineRules | goban

            Type alias GobanEngineRules

            GobanEngineRules: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
            \ No newline at end of file +GobanEngineRules | goban

            Type alias GobanEngineRules

            GobanEngineRules: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
            \ No newline at end of file diff --git a/docs/types/GobanEngineSuperKoAlgorithm.html b/docs/types/GobanEngineSuperKoAlgorithm.html index 6865db9d..8e844a17 100644 --- a/docs/types/GobanEngineSuperKoAlgorithm.html +++ b/docs/types/GobanEngineSuperKoAlgorithm.html @@ -1 +1 @@ -GobanEngineSuperKoAlgorithm | goban

            Type alias GobanEngineSuperKoAlgorithm

            GobanEngineSuperKoAlgorithm: "psk" | "csk" | "ssk" | "noresult" | "ing"
            \ No newline at end of file +GobanEngineSuperKoAlgorithm | goban

            Type alias GobanEngineSuperKoAlgorithm

            GobanEngineSuperKoAlgorithm: "psk" | "csk" | "ssk" | "noresult" | "ing"
            \ No newline at end of file diff --git a/docs/types/GobanErrorMessageId.html b/docs/types/GobanErrorMessageId.html index 332a9e22..06053b37 100644 --- a/docs/types/GobanErrorMessageId.html +++ b/docs/types/GobanErrorMessageId.html @@ -1 +1 @@ -GobanErrorMessageId | goban

            Type alias GobanErrorMessageId

            \ No newline at end of file +GobanErrorMessageId | goban

            Type alias GobanErrorMessageId

            \ No newline at end of file diff --git a/docs/types/GobanErrorMessageObject.html b/docs/types/GobanErrorMessageObject.html index b2aae57c..823ad3a7 100644 --- a/docs/types/GobanErrorMessageObject.html +++ b/docs/types/GobanErrorMessageObject.html @@ -1 +1 @@ -GobanErrorMessageObject | goban

            Type alias GobanErrorMessageObject

            \ No newline at end of file +GobanErrorMessageObject | goban

            Type alias GobanErrorMessageObject

            \ No newline at end of file diff --git a/docs/types/GobanIOErrorMessageId.html b/docs/types/GobanIOErrorMessageId.html index 9cf827ca..c6641751 100644 --- a/docs/types/GobanIOErrorMessageId.html +++ b/docs/types/GobanIOErrorMessageId.html @@ -1 +1 @@ -GobanIOErrorMessageId | goban

            Type alias GobanIOErrorMessageId

            GobanIOErrorMessageId: "failed_to_load_sgf"
            \ No newline at end of file +GobanIOErrorMessageId | goban

            Type alias GobanIOErrorMessageId

            GobanIOErrorMessageId: "failed_to_load_sgf"
            \ No newline at end of file diff --git a/docs/types/GobanModes.html b/docs/types/GobanModes.html index bc02faa0..96e3ab91 100644 --- a/docs/types/GobanModes.html +++ b/docs/types/GobanModes.html @@ -1 +1 @@ -GobanModes | goban

            Type alias GobanModes

            GobanModes: "play" | "puzzle" | "score estimation" | "analyze" | "conditional"
            \ No newline at end of file +GobanModes | goban

            Type alias GobanModes

            GobanModes: "play" | "puzzle" | "score estimation" | "analyze" | "conditional"
            \ No newline at end of file diff --git a/docs/types/GobanMoveErrorMessageId.html b/docs/types/GobanMoveErrorMessageId.html index 4954a140..7d72c53f 100644 --- a/docs/types/GobanMoveErrorMessageId.html +++ b/docs/types/GobanMoveErrorMessageId.html @@ -1 +1 @@ -GobanMoveErrorMessageId | goban

            Type alias GobanMoveErrorMessageId

            GobanMoveErrorMessageId: "stone_already_placed_here" | "illegal_self_capture" | "illegal_ko_move" | "illegal_board_repetition" | "move_error"
            \ No newline at end of file +GobanMoveErrorMessageId | goban

            Type alias GobanMoveErrorMessageId

            GobanMoveErrorMessageId: "stone_already_placed_here" | "illegal_self_capture" | "illegal_ko_move" | "illegal_board_repetition" | "move_error"
            \ No newline at end of file diff --git a/docs/types/GobanMovesArray.html b/docs/types/GobanMovesArray.html index dcc93a74..f5b17133 100644 --- a/docs/types/GobanMovesArray.html +++ b/docs/types/GobanMovesArray.html @@ -1 +1 @@ -GobanMovesArray | goban

            Type alias GobanMovesArray

            GobanMovesArray: AdHocPackedMove[] | JGOFMove[]
            \ No newline at end of file +GobanMovesArray | goban

            Type alias GobanMovesArray

            GobanMovesArray: AdHocPackedMove[] | JGOFMove[]
            \ No newline at end of file diff --git a/docs/types/GobanRenderer.html b/docs/types/GobanRenderer.html index 0ac35b1e..d705bd3e 100644 --- a/docs/types/GobanRenderer.html +++ b/docs/types/GobanRenderer.html @@ -1 +1 @@ -GobanRenderer | goban

            Type alias GobanRenderer

            GobanRenderer: GobanCanvas | SVGRenderer
            \ No newline at end of file +GobanRenderer | goban

            Type alias GobanRenderer

            GobanRenderer: GobanCanvas | SVGRenderer
            \ No newline at end of file diff --git a/docs/types/GobanRendererConfig.html b/docs/types/GobanRendererConfig.html index 59d38dd6..5c41c5d8 100644 --- a/docs/types/GobanRendererConfig.html +++ b/docs/types/GobanRendererConfig.html @@ -1 +1 @@ -GobanRendererConfig | goban

            Type alias GobanRendererConfig

            \ No newline at end of file +GobanRendererConfig | goban

            Type alias GobanRendererConfig

            \ No newline at end of file diff --git a/docs/types/JGOFTimeControl.html b/docs/types/JGOFTimeControl.html index 133d6d61..f4d1cd92 100644 --- a/docs/types/JGOFTimeControl.html +++ b/docs/types/JGOFTimeControl.html @@ -1 +1 @@ -JGOFTimeControl | goban
            \ No newline at end of file +JGOFTimeControl | goban
            \ No newline at end of file diff --git a/docs/types/JGOFTimeControlSpeed.html b/docs/types/JGOFTimeControlSpeed.html index c084743e..a57ff21d 100644 --- a/docs/types/JGOFTimeControlSpeed.html +++ b/docs/types/JGOFTimeControlSpeed.html @@ -1 +1 @@ -JGOFTimeControlSpeed | goban

            Type alias JGOFTimeControlSpeed

            JGOFTimeControlSpeed: "blitz" | "live" | "correspondence"
            \ No newline at end of file +JGOFTimeControlSpeed | goban

            Type alias JGOFTimeControlSpeed

            JGOFTimeControlSpeed: "blitz" | "live" | "correspondence"
            \ No newline at end of file diff --git a/docs/types/JGOFTimeControlSystem.html b/docs/types/JGOFTimeControlSystem.html index 2fee9d07..a726c561 100644 --- a/docs/types/JGOFTimeControlSystem.html +++ b/docs/types/JGOFTimeControlSystem.html @@ -1 +1 @@ -JGOFTimeControlSystem | goban

            Type alias JGOFTimeControlSystem

            JGOFTimeControlSystem: "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none"
            \ No newline at end of file +JGOFTimeControlSystem | goban

            Type alias JGOFTimeControlSystem

            JGOFTimeControlSystem: "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none"
            \ No newline at end of file diff --git a/docs/types/LabelPosition.html b/docs/types/LabelPosition.html index d93e24f6..71952284 100644 --- a/docs/types/LabelPosition.html +++ b/docs/types/LabelPosition.html @@ -1 +1 @@ -LabelPosition | goban

            Type alias LabelPosition

            LabelPosition: "all" | "none" | "top-left" | "top-right" | "bottom-right" | "bottom-left"
            \ No newline at end of file +LabelPosition | goban

            Type alias LabelPosition

            LabelPosition: "all" | "none" | "top-left" | "top-right" | "bottom-right" | "bottom-left"
            \ No newline at end of file diff --git a/docs/types/Matrix.html b/docs/types/Matrix.html index 7b650899..0ea5b0b0 100644 --- a/docs/types/Matrix.html +++ b/docs/types/Matrix.html @@ -1 +1 @@ -Matrix | goban

            Type alias Matrix<T>

            Matrix<T>: T[][]

            Type Parameters

            • T
            \ No newline at end of file +Matrix | goban

            Type alias Matrix<T>

            Matrix<T>: T[][]

            Type Parameters

            • T
            \ No newline at end of file diff --git a/docs/types/MoveTreePenMarks.html b/docs/types/MoveTreePenMarks.html index 0c17d20e..da6636d3 100644 --- a/docs/types/MoveTreePenMarks.html +++ b/docs/types/MoveTreePenMarks.html @@ -1 +1 @@ -MoveTreePenMarks | goban

            Type alias MoveTreePenMarks

            MoveTreePenMarks: {
                color: string;
                points: number[];
            }[]

            Type declaration

            • color: string
            • points: number[]
            \ No newline at end of file +MoveTreePenMarks | goban

            Type alias MoveTreePenMarks

            MoveTreePenMarks: {
                color: string;
                points: number[];
            }[]

            Type declaration

            • color: string
            • points: number[]
            \ No newline at end of file diff --git a/docs/types/NumberMatrix.html b/docs/types/NumberMatrix.html index e3054d83..20701210 100644 --- a/docs/types/NumberMatrix.html +++ b/docs/types/NumberMatrix.html @@ -1 +1 @@ -NumberMatrix | goban

            Type alias NumberMatrix

            NumberMatrix: Matrix<number>
            \ No newline at end of file +NumberMatrix | goban

            Type alias NumberMatrix

            NumberMatrix: Matrix<number>
            \ No newline at end of file diff --git a/docs/types/PlayerColor.html b/docs/types/PlayerColor.html index 3f2cebe7..a17b1cdc 100644 --- a/docs/types/PlayerColor.html +++ b/docs/types/PlayerColor.html @@ -1 +1 @@ -PlayerColor | goban

            Type alias PlayerColor

            PlayerColor: "black" | "white"
            \ No newline at end of file +PlayerColor | goban

            Type alias PlayerColor

            PlayerColor: "black" | "white"
            \ No newline at end of file diff --git a/docs/types/ProtocolResponseType.html b/docs/types/ProtocolResponseType.html index 5437c56d..6bf04ec0 100644 --- a/docs/types/ProtocolResponseType.html +++ b/docs/types/ProtocolResponseType.html @@ -1 +1 @@ -ProtocolResponseType | goban

            Type alias ProtocolResponseType<Entry>

            ProtocolResponseType<Entry>: Entry extends ((...args) => infer R)
                ? R
                : never

            Type Parameters

            • Entry
            \ No newline at end of file +ProtocolResponseType | goban

            Type alias ProtocolResponseType<Entry>

            ProtocolResponseType<Entry>: Entry extends ((...args) => infer R)
                ? R
                : never

            Type Parameters

            • Entry
            \ No newline at end of file diff --git a/docs/types/PuzzleOpponentMoveMode.html b/docs/types/PuzzleOpponentMoveMode.html index 471fe665..89ded967 100644 --- a/docs/types/PuzzleOpponentMoveMode.html +++ b/docs/types/PuzzleOpponentMoveMode.html @@ -1 +1 @@ -PuzzleOpponentMoveMode | goban

            Type alias PuzzleOpponentMoveMode

            PuzzleOpponentMoveMode: "manual" | "automatic"
            \ No newline at end of file +PuzzleOpponentMoveMode | goban

            Type alias PuzzleOpponentMoveMode

            PuzzleOpponentMoveMode: "manual" | "automatic"
            \ No newline at end of file diff --git a/docs/types/PuzzlePlacementSetting.html b/docs/types/PuzzlePlacementSetting.html index 1257738e..436c1a1c 100644 --- a/docs/types/PuzzlePlacementSetting.html +++ b/docs/types/PuzzlePlacementSetting.html @@ -1 +1 @@ -PuzzlePlacementSetting | goban

            Type alias PuzzlePlacementSetting

            PuzzlePlacementSetting: {
                mode: "play";
            } | {
                color: JGOFNumericPlayerColor;
                mode: "setup";
            } | {
                color: 0;
                mode: "place";
            }

            Type declaration

            • mode: "play"

            Type declaration

            Type declaration

            • color: 0
            • mode: "place"
            \ No newline at end of file +PuzzlePlacementSetting | goban

            Type alias PuzzlePlacementSetting

            PuzzlePlacementSetting: {
                mode: "play";
            } | {
                color: JGOFNumericPlayerColor;
                mode: "setup";
            } | {
                color: 0;
                mode: "place";
            }

            Type declaration

            • mode: "play"

            Type declaration

            Type declaration

            • color: 0
            • mode: "place"
            \ No newline at end of file diff --git a/docs/types/PuzzlePlayerMoveMode.html b/docs/types/PuzzlePlayerMoveMode.html index b52c05c9..736c1db8 100644 --- a/docs/types/PuzzlePlayerMoveMode.html +++ b/docs/types/PuzzlePlayerMoveMode.html @@ -1 +1 @@ -PuzzlePlayerMoveMode | goban

            Type alias PuzzlePlayerMoveMode

            PuzzlePlayerMoveMode: "free" | "fixed"
            \ No newline at end of file +PuzzlePlayerMoveMode | goban

            Type alias PuzzlePlayerMoveMode

            PuzzlePlayerMoveMode: "free" | "fixed"
            \ No newline at end of file diff --git a/docs/types/RawStoneString.html b/docs/types/RawStoneString.html index 2cfef1cb..18ae816a 100644 --- a/docs/types/RawStoneString.html +++ b/docs/types/RawStoneString.html @@ -1,2 +1,2 @@ RawStoneString | goban

            Type alias RawStoneString

            RawStoneString: JGOFIntersection[]

            A raw stone string is simply an array of intersections

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/StringMatrix.html b/docs/types/StringMatrix.html index 1391a15d..306857b7 100644 --- a/docs/types/StringMatrix.html +++ b/docs/types/StringMatrix.html @@ -1 +1 @@ -StringMatrix | goban

            Type alias StringMatrix

            StringMatrix: Matrix<string>
            \ No newline at end of file +StringMatrix | goban

            Type alias StringMatrix

            StringMatrix: Matrix<string>
            \ No newline at end of file diff --git a/docs/types/_internal_.ClockTime.html b/docs/types/_internal_.ClockTime.html index 24670d74..23858a7a 100644 --- a/docs/types/_internal_.ClockTime.html +++ b/docs/types/_internal_.ClockTime.html @@ -1 +1 @@ -ClockTime | goban
            \ No newline at end of file +ClockTime | goban
            \ No newline at end of file diff --git a/docs/types/_internal_.DebugOutput.html b/docs/types/_internal_.DebugOutput.html index f4334fd3..2b7b6699 100644 --- a/docs/types/_internal_.DebugOutput.html +++ b/docs/types/_internal_.DebugOutput.html @@ -1,2 +1,2 @@ DebugOutput | goban

            Type alias DebugOutput

            DebugOutput: string

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/_internal_.LocalEstimator.html b/docs/types/_internal_.LocalEstimator.html index 06225b33..f2405e06 100644 --- a/docs/types/_internal_.LocalEstimator.html +++ b/docs/types/_internal_.LocalEstimator.html @@ -5,4 +5,4 @@
          • trials: number

            number of playouts. Not applicable to all estimators, but higher generally means higher accuracy and higher compute cost

          • tolerance: number

            (0.0-1.0) confidence required to mark an intersection not neutral.

            -
          • Returns NumberMatrix

            \ No newline at end of file +

            Returns NumberMatrix

            \ No newline at end of file diff --git a/docs/types/_internal_.MessageID.html b/docs/types/_internal_.MessageID.html index 7b255ed6..4021bbee 100644 --- a/docs/types/_internal_.MessageID.html +++ b/docs/types/_internal_.MessageID.html @@ -1 +1 @@ -MessageID | goban

            Type alias MessageID

            MessageID: GobanMoveErrorMessageId | "error" | "error_submitting_move" | "loading" | "processing" | "self_capture_not_allowed" | "server_message" | "illegal_ko_move" | "synchronization_error"
            \ No newline at end of file +MessageID | goban

            Type alias MessageID

            MessageID: GobanMoveErrorMessageId | "error" | "error_submitting_move" | "loading" | "processing" | "self_capture_not_allowed" | "server_message" | "illegal_ko_move" | "synchronization_error"
            \ No newline at end of file diff --git a/docs/types/_internal_.NoneClock.html b/docs/types/_internal_.NoneClock.html index ded59f34..bff4d7cd 100644 --- a/docs/types/_internal_.NoneClock.html +++ b/docs/types/_internal_.NoneClock.html @@ -1 +1 @@ -NoneClock | goban

            Type alias NoneClock

            NoneClock: undefined
            \ No newline at end of file +NoneClock | goban

            Type alias NoneClock

            NoneClock: undefined
            \ No newline at end of file diff --git a/docs/types/_internal_.SimpleClock.html b/docs/types/_internal_.SimpleClock.html index a4b04df3..9389dac2 100644 --- a/docs/types/_internal_.SimpleClock.html +++ b/docs/types/_internal_.SimpleClock.html @@ -1 +1 @@ -SimpleClock | goban

            Type alias SimpleClock

            SimpleClock: number
            \ No newline at end of file +SimpleClock | goban

            Type alias SimpleClock

            SimpleClock: number
            \ No newline at end of file diff --git a/docs/types/_internal_.StoneType.html b/docs/types/_internal_.StoneType.html index 631ed9c2..ae788b05 100644 --- a/docs/types/_internal_.StoneType.html +++ b/docs/types/_internal_.StoneType.html @@ -1 +1 @@ -StoneType | goban

            Type alias StoneType

            StoneType: {
                shadow: HTMLCanvasElement;
                stone: HTMLCanvasElement;
            }

            Type declaration

            • shadow: HTMLCanvasElement
            • stone: HTMLCanvasElement
            \ No newline at end of file +StoneType | goban

            Type alias StoneType

            StoneType: {
                shadow: HTMLCanvasElement;
                stone: HTMLCanvasElement;
            }

            Type declaration

            • shadow: HTMLCanvasElement
            • stone: HTMLCanvasElement
            \ No newline at end of file diff --git a/docs/types/_internal_.StoneTypeArray.html b/docs/types/_internal_.StoneTypeArray.html index 4ada04dc..1e2e1125 100644 --- a/docs/types/_internal_.StoneTypeArray.html +++ b/docs/types/_internal_.StoneTypeArray.html @@ -1 +1 @@ -StoneTypeArray | goban

            Type alias StoneTypeArray

            StoneTypeArray: StoneType[]
            \ No newline at end of file +StoneTypeArray | goban

            Type alias StoneTypeArray

            StoneTypeArray: StoneType[]
            \ No newline at end of file diff --git a/docs/types/protocol.AutomatchCondition.html b/docs/types/protocol.AutomatchCondition.html index 10a9830c..3fc6495a 100644 --- a/docs/types/protocol.AutomatchCondition.html +++ b/docs/types/protocol.AutomatchCondition.html @@ -1 +1 @@ -AutomatchCondition | goban

            Type alias AutomatchCondition

            AutomatchCondition: "required" | "preferred" | "no-preference"
            \ No newline at end of file +AutomatchCondition | goban

            Type alias AutomatchCondition

            AutomatchCondition: "required" | "preferred" | "no-preference"
            \ No newline at end of file diff --git a/docs/types/protocol.RuleSet.html b/docs/types/protocol.RuleSet.html index 3203733f..e2acd56e 100644 --- a/docs/types/protocol.RuleSet.html +++ b/docs/types/protocol.RuleSet.html @@ -1 +1 @@ -RuleSet | goban

            Type alias RuleSet

            RuleSet: "japanese" | "chinese" | "aga" | "korean" | "nz" | "ing"
            \ No newline at end of file +RuleSet | goban

            Type alias RuleSet

            RuleSet: "japanese" | "chinese" | "aga" | "korean" | "nz" | "ing"
            \ No newline at end of file diff --git a/docs/types/protocol.Size.html b/docs/types/protocol.Size.html index 745e9c4d..d6af74e9 100644 --- a/docs/types/protocol.Size.html +++ b/docs/types/protocol.Size.html @@ -1 +1 @@ -Size | goban

            Type alias Size

            Size: "9x9" | "13x13" | "19x19"
            \ No newline at end of file +Size | goban

            Type alias Size

            Size: "9x9" | "13x13" | "19x19"
            \ No newline at end of file diff --git a/docs/types/protocol.Speed.html b/docs/types/protocol.Speed.html index 5da97635..544551c3 100644 --- a/docs/types/protocol.Speed.html +++ b/docs/types/protocol.Speed.html @@ -1 +1 @@ -Speed | goban

            Type alias Speed

            Speed: "blitz" | "live" | "correspondence"
            \ No newline at end of file +Speed | goban

            Type alias Speed

            Speed: "blitz" | "live" | "correspondence"
            \ No newline at end of file diff --git a/docs/variables/AUTOSCORE_TOLERANCE.html b/docs/variables/AUTOSCORE_TOLERANCE.html index 04dc9d1b..acb7f6b7 100644 --- a/docs/variables/AUTOSCORE_TOLERANCE.html +++ b/docs/variables/AUTOSCORE_TOLERANCE.html @@ -1 +1 @@ -AUTOSCORE_TOLERANCE | goban

            Variable AUTOSCORE_TOLERANCEConst

            AUTOSCORE_TOLERANCE: 0.1 = 0.1
            \ No newline at end of file +AUTOSCORE_TOLERANCE | goban

            Variable AUTOSCORE_TOLERANCEConst

            AUTOSCORE_TOLERANCE: 0.1 = 0.1
            \ No newline at end of file diff --git a/docs/variables/AUTOSCORE_TRIALS.html b/docs/variables/AUTOSCORE_TRIALS.html index 6b2001c5..e9a731db 100644 --- a/docs/variables/AUTOSCORE_TRIALS.html +++ b/docs/variables/AUTOSCORE_TRIALS.html @@ -1 +1 @@ -AUTOSCORE_TRIALS | goban

            Variable AUTOSCORE_TRIALSConst

            AUTOSCORE_TRIALS: 1000 = 1000
            \ No newline at end of file +AUTOSCORE_TRIALS | goban

            Variable AUTOSCORE_TRIALSConst

            AUTOSCORE_TRIALS: 1000 = 1000
            \ No newline at end of file diff --git a/docs/variables/GOBAN_FONT.html b/docs/variables/GOBAN_FONT.html index 3aff9cc2..ac0fbec3 100644 --- a/docs/variables/GOBAN_FONT.html +++ b/docs/variables/GOBAN_FONT.html @@ -1 +1 @@ -GOBAN_FONT | goban

            Variable GOBAN_FONTConst

            GOBAN_FONT: "Verdana,Arial,sans-serif" = "Verdana,Arial,sans-serif"
            \ No newline at end of file +GOBAN_FONT | goban

            Variable GOBAN_FONTConst

            GOBAN_FONT: "Verdana,Arial,sans-serif" = "Verdana,Arial,sans-serif"
            \ No newline at end of file diff --git a/docs/variables/MARK_TYPES.html b/docs/variables/MARK_TYPES.html index 0c35cd2b..ae3933b6 100644 --- a/docs/variables/MARK_TYPES.html +++ b/docs/variables/MARK_TYPES.html @@ -1 +1 @@ -MARK_TYPES | goban

            Variable MARK_TYPESConst

            MARK_TYPES: (keyof MarkInterface)[] = ...
            \ No newline at end of file +MARK_TYPES | goban

            Variable MARK_TYPESConst

            MARK_TYPES: (keyof MarkInterface)[] = ...
            \ No newline at end of file diff --git a/docs/variables/SCORE_ESTIMATION_TOLERANCE.html b/docs/variables/SCORE_ESTIMATION_TOLERANCE.html index 8aa84b23..2540c83a 100644 --- a/docs/variables/SCORE_ESTIMATION_TOLERANCE.html +++ b/docs/variables/SCORE_ESTIMATION_TOLERANCE.html @@ -1 +1 @@ -SCORE_ESTIMATION_TOLERANCE | goban

            Variable SCORE_ESTIMATION_TOLERANCEConst

            SCORE_ESTIMATION_TOLERANCE: 0.3 = 0.3
            \ No newline at end of file +SCORE_ESTIMATION_TOLERANCE | goban

            Variable SCORE_ESTIMATION_TOLERANCEConst

            SCORE_ESTIMATION_TOLERANCE: 0.3 = 0.3
            \ No newline at end of file diff --git a/docs/variables/SCORE_ESTIMATION_TRIALS.html b/docs/variables/SCORE_ESTIMATION_TRIALS.html index 68f7f07c..ccd436f4 100644 --- a/docs/variables/SCORE_ESTIMATION_TRIALS.html +++ b/docs/variables/SCORE_ESTIMATION_TRIALS.html @@ -1 +1 @@ -SCORE_ESTIMATION_TRIALS | goban

            Variable SCORE_ESTIMATION_TRIALSConst

            SCORE_ESTIMATION_TRIALS: 1000 = 1000
            \ No newline at end of file +SCORE_ESTIMATION_TRIALS | goban

            Variable SCORE_ESTIMATION_TRIALSConst

            SCORE_ESTIMATION_TRIALS: 1000 = 1000
            \ No newline at end of file diff --git a/docs/variables/THEMES.html b/docs/variables/THEMES.html index 0365b5c1..b624d300 100644 --- a/docs/variables/THEMES.html +++ b/docs/variables/THEMES.html @@ -1 +1 @@ -THEMES | goban

            Variable THEMESConst

            THEMES: ThemesInterface = ...
            \ No newline at end of file +THEMES | goban

            Variable THEMESConst

            THEMES: ThemesInterface = ...
            \ No newline at end of file diff --git a/docs/variables/THEMES_SORTED.html b/docs/variables/THEMES_SORTED.html index 517fd4ed..4abc970c 100644 --- a/docs/variables/THEMES_SORTED.html +++ b/docs/variables/THEMES_SORTED.html @@ -1 +1 @@ -THEMES_SORTED | goban

            Variable THEMES_SORTEDConst

            THEMES_SORTED: {
                black: GobanTheme[];
                board: GobanTheme[];
                white: GobanTheme[];
                [key: string]: GobanTheme[];
            } = ...

            Type declaration

            \ No newline at end of file +THEMES_SORTED | goban

            Variable THEMES_SORTEDConst

            THEMES_SORTED: {
                black: GobanTheme[];
                board: GobanTheme[];
                white: GobanTheme[];
                [key: string]: GobanTheme[];
            } = ...

            Type declaration

            \ No newline at end of file diff --git a/docs/variables/callbacks.html b/docs/variables/callbacks.html index 2ba608da..48fcdeea 100644 --- a/docs/variables/callbacks.html +++ b/docs/variables/callbacks.html @@ -1 +1 @@ -callbacks | goban

            Variable callbacksConst

            callbacks: GobanCallbacks = ...
            \ No newline at end of file +callbacks | goban

            Variable callbacksConst

            callbacks: GobanCallbacks = ...
            \ No newline at end of file diff --git a/docs/variables/remote_estimate_ownership.html b/docs/variables/remote_estimate_ownership.html index 5c3e8a76..6cdd37f9 100644 --- a/docs/variables/remote_estimate_ownership.html +++ b/docs/variables/remote_estimate_ownership.html @@ -1 +1 @@ -remote_estimate_ownership | goban

            Variable remote_estimate_ownership

            remote_estimate_ownership: ((req) => Promise<ScoreEstimateResponse>) | undefined

            Type declaration

            \ No newline at end of file +remote_estimate_ownership | goban

            Variable remote_estimate_ownership

            remote_estimate_ownership: ((req) => Promise<ScoreEstimateResponse>) | undefined

            Type declaration

            \ No newline at end of file