Performs the conversion.
diff --git a/doc/search-index.js b/doc/search-index.js
index 450a369..86ba293 100644
--- a/doc/search-index.js
+++ b/doc/search-index.js
@@ -1,4 +1,4 @@
var searchIndex = JSON.parse('{\
-"draught":{"doc":"Draught","t":[0,0,4,13,13,4,13,13,4,13,13,13,4,13,13,13,13,13,13,13,0,3,12,12,11,3,12,12,11,17,17,3,12,12,11,3,12,12,12,12,11,3,12,12,11,3,12,12,11,3,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,5,0,3,12,12,12,5,5,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["board","enums","Team","Black","White","Strength","Man","King","SquareState","Empty","Occupied","Unplayable","Moveable","Allowed","UnoccupiedSrc","OccupiedDest","OutOfBounds","Unplayable","WrongTeamSrc","IllegalTrajectory","iter","RowIndexIterator","board","row_cursor","new","RowSquareIterator","board","index_iter","new","STD_WIDTH","STD_HEIGHT","Piece","team","strength","new","Direction","nw","ne","se","sw","empty","Square","occupant","state","new","BrdIdx","row","col","from","Board","cells","width","height","current_turn","cell_mut","diagonal_indices","adjacent_dir","filter_indices","player_diagonal_indices","jumpable_indices","jumpable_dir","player_jumpable_indices","cell","grid_cell","cell_index","cell_idx","board_index","can_move","new","init_game","current_turn","cells","num_cells","cell_state","utils","set_panic_hook","game","Game","current","previous_boards","tree","init_game","__wasm_bindgen_generated_init_game","log","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","into_iter","borrow","borrow_mut","try_from","try_into","type_id","vzip","from","into","into_iter","borrow","borrow_mut","try_from","try_into","type_id","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","next","next","clone","clone","clone","clone","clone","clone","clone","clone","clone","eq","eq","eq","eq","eq","ne","eq","ne","eq","ne","eq","ne","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","ref_from_abi","ref_from_abi","ref_from_abi","ref_from_abi","ref_from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","describe","describe","describe","describe","describe","describe","describe","describe","describe","is_none","is_none","is_none","is_none","is_none","is_none","is_none","is_none","is_none","none","none","none","none","none","none","none","none","none","ref_mut_from_abi","ref_mut_from_abi","ref_mut_from_abi","ref_mut_from_abi","ref_mut_from_abi"],"q":["draught","draught::board","draught::board::enums","","","","","","","","","","","","","","","","","","draught::board","draught::board::iter","","","","","","","","draught::board","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","draught","draught::utils","draught","draught::game","","","","draught","","","draught::board::enums","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","draught::board::iter","","","","","","","","","","","","","","","","","","draught::board","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","draught::game","","","","","","","","","draught::board::iter","","draught::board::enums","","","","draught::board","","","","","draught::board::enums","","","","draught::board","","","","","","","","draught::board::enums","","","","draught::board","","","","draught::board::enums","","draught::board","","","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board","","","","draught::game"],"d":["Board module for components related to the checkers board …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Standard width of a checkers board is 8 squares","Standard height of a checkers board is 8 squares","Model a game piece by its team and strength (normal or …","","","","Model the standard diagonal movements by north west/east …","North West ","North East","South East","South West","Create an empty direction full of [
Option::None
]","Model board squares by a state and a possible occupying …","Game piece if square is occupied","Description of whether the square is occupied or an …","","Model a rank 2 tensor index to identify a board square by …","","","","Models a single state for a checkers board","1D backing array of board squares for the 2D game board","","","","Get a mutable reference to a board square by 1D array …","Get the 1D array indices for the diagonally adjacent …","Get a [
Direction
] structure for the diagonally adjacent …","Filter an array of diagonal indices (Like those from […","","Get the 1D array indices for the diagonally jumpable …","Get a [
Direction
] structure for the diagonally jumpable …","","Get a copy of a board square by 1D array index","Get a copy of a board square by 2D [
BrdIdx
] index","Transform a 2D row/column board index into a single 1D …","Similar to [
Board::cell_index
] but with a [
BrdIdx
] …","Transform a 1D array index (for [
Board::cells
]) into a 2D …","","Iniitalise a game board without game pieces","Reset the given board to a starting layout with 3 rows of …","Get the [
Board::current_turn
] parameter","Get a pointer to the backing array of board squares, […","Get the number of board squares","Get the state of a board square by 1D array index","","","","Root-level structure for managing the game as a …","","","","","","Wrap the [
web_sys
] access to the browser console in a …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Get next item from the iterator","Get next item from the iterator","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[0,0,0,1,1,0,2,2,0,3,3,3,0,4,4,4,4,4,4,4,0,0,5,5,5,0,6,6,6,0,0,0,7,7,7,0,8,8,8,8,8,0,9,9,9,0,10,10,10,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,0,12,12,12,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,5,6,1,2,3,4,7,8,9,10,11,1,2,3,4,7,7,8,8,9,9,10,10,1,2,3,4,7,8,9,10,1,3,10,11,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,7,9,10,11,12],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["board",3]]],null,null,null,[[["board",3]]],null,null,null,null,null,[[["strength",4],["team",4]],["piece",3]],null,null,null,null,null,[[],["direction",3]],null,null,null,[[["squarestate",4],["piece",3],["option",4]],["square",3]],null,null,null,[[["usize",15]],["brdidx",3]],null,null,null,null,null,[[["usize",15]],["square",3]],[[["brdidx",3]],[["option",4],["vec",3]]],[[["brdidx",3]],[["option",4],["direction",3]]],[[["usize",15],["brdidx",3],["vec",3],["team",4]],[["usize",15],["vec",3]]],[[["team",4],["brdidx",3]],[["option",4],["vec",3]]],[[["brdidx",3]],[["option",4],["vec",3]]],[[["brdidx",3]],[["option",4],["direction",3]]],[[["team",4],["brdidx",3]],[["option",4],["vec",3]]],[[["usize",15]],["square",3]],[[["brdidx",3]],["square",3]],[[["usize",15]],["usize",15]],[[["brdidx",3]],["usize",15]],[[["usize",15]],["brdidx",3]],[[["brdidx",3]],["moveable",4]],[[["usize",15]],["board",3]],[[["board",3]],["board",3]],[[],["team",4]],[[]],[[],["usize",15]],[[["usize",15]],["squarestate",4]],null,[[]],null,null,null,null,null,[[]],[[]],null,[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[],[["option",4],["vec",3]]],[[],[["vec",3],["option",4]]],[[],["team",4]],[[],["strength",4]],[[],["squarestate",4]],[[],["moveable",4]],[[],["piece",3]],[[],["direction",3]],[[],["square",3]],[[],["brdidx",3]],[[],["board",3]],[[["team",4]],["bool",15]],[[["strength",4]],["bool",15]],[[["squarestate",4]],["bool",15]],[[["moveable",4]],["bool",15]],[[["piece",3]],["bool",15]],[[["piece",3]],["bool",15]],[[["direction",3]],["bool",15]],[[["direction",3]],["bool",15]],[[["square",3]],["bool",15]],[[["square",3]],["bool",15]],[[["brdidx",3]],["bool",15]],[[["brdidx",3]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["u32",15]],["bool",15]],[[["u32",15]],["bool",15]],[[["u32",15]],["bool",15]],[[["u32",15]],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"Team"],[4,"Strength"],[4,"SquareState"],[4,"Moveable"],[3,"RowIndexIterator"],[3,"RowSquareIterator"],[3,"Piece"],[3,"Direction"],[3,"Square"],[3,"BrdIdx"],[3,"Board"],[3,"Game"]]}\
+"draught":{"doc":"Draught","t":[0,0,4,13,13,11,4,13,13,4,13,13,13,4,13,13,13,13,13,13,13,13,13,0,3,12,12,11,3,12,12,11,17,17,3,12,12,11,3,12,12,12,12,11,3,12,12,11,3,12,12,11,3,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,5,0,3,12,12,12,5,5,14,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11],"n":["board","enums","Team","Black","White","opponent","Strength","Man","King","SquareState","Empty","Occupied","Unplayable","Moveable","Allowed","UnoccupiedSrc","OccupiedDest","OutOfBounds","Unplayable","WrongTeamSrc","IllegalTrajectory","NoJumpablePiece","JumpingSameTeam","iter","RowIndexIterator","board","row_cursor","new","RowSquareIterator","board","index_iter","new","STD_WIDTH","STD_HEIGHT","Piece","team","strength","new","Direction","nw","ne","se","sw","empty","Square","occupant","state","new","BrdIdx","row","col","from","Board","cells","width","height","current_turn","cell_mut","diagonal_indices","adjacent_dir","filter_indices","player_diagonal_indices","jumpable_indices","jumpable_dir","player_jumpable_indices","cell","grid_cell","cell_index","cell_idx","board_index","can_move","validate_man_move","validate_king_move","get_jumpee","validate_jumpee","check_jumpee_team","new","init_game","current_turn","cells","num_cells","cell_state","utils","set_panic_hook","game","Game","current","previous_boards","tree","init_game","__wasm_bindgen_generated_init_game","log","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","into_iter","borrow","borrow_mut","try_from","try_into","type_id","vzip","from","into","into_iter","borrow","borrow_mut","try_from","try_into","type_id","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","vzip","from","into","to_owned","clone_into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","to_owned","clone_into","to_string","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","from","into","borrow","borrow_mut","try_from","try_into","type_id","return_abi","vzip","next","next","clone","clone","clone","clone","clone","clone","clone","clone","clone","eq","eq","eq","eq","eq","ne","eq","ne","eq","ne","eq","ne","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","ref_from_abi","ref_from_abi","ref_from_abi","ref_from_abi","ref_from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","from_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","into_abi","describe","describe","describe","describe","describe","describe","describe","describe","describe","is_none","is_none","is_none","is_none","is_none","is_none","is_none","is_none","is_none","none","none","none","none","none","none","none","none","none","ref_mut_from_abi","ref_mut_from_abi","ref_mut_from_abi","ref_mut_from_abi","ref_mut_from_abi"],"q":["draught","draught::board","draught::board::enums","","","","","","","","","","","","","","","","","","","","","draught::board","draught::board::iter","","","","","","","","draught::board","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","draught","draught::utils","draught","draught::game","","","","draught","","","draught::board::enums","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","draught::board::iter","","","","","","","","","","","","","","","","","","draught::board","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","draught::game","","","","","","","","","draught::board::iter","","draught::board::enums","","","","draught::board","","","","","draught::board::enums","","","","draught::board","","","","","","","","draught::board::enums","","","","draught::board","","","","draught::board::enums","","draught::board","","","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board::enums","","","","draught::board","","","","draught::game","draught::board","","","","draught::game"],"d":["Board module for components related to the checkers board …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Standard width of a checkers board is 8 squares","Standard height of a checkers board is 8 squares","Model a game piece by its team and strength (normal or …","","","","Model the standard diagonal movements by north west/east …","North West ","North East","South East","South West","Create an empty direction full of [
Option::None
]","Model board squares by a state and a possible occupying …","Game piece if square is occupied","Description of whether the square is occupied or an …","","Model a rank 2 tensor index to identify a board square by …","","","","Models a single state for a checkers board","1D backing array of board squares for the 2D game board","","","","Get a mutable reference to a board square by 1D array …","Get the 1D array indices for the diagonally adjacent …","Get a [
Direction
] structure for the diagonally adjacent …","Filter an array of diagonal indices (Like those from […","","Get the 1D array indices for the diagonally jumpable …","Get a [
Direction
] structure for the diagonally jumpable …","","Get a copy of a board square by 1D array index","Get a copy of a board square by 2D [
BrdIdx
] index","Transform a 2D row/column board index into a single 1D …","Similar to [
Board::cell_index
] but with a [
BrdIdx
] …","Transform a 1D array index (for [
Board::cells
]) into a 2D …","","","","","","","Iniitalise a game board without game pieces","Reset the given board to a starting layout with 3 rows of …","Get the [
Board::current_turn
] parameter","Get a pointer to the backing array of board squares, […","Get the number of board squares","Get the state of a board square by 1D array index","","","","Root-level structure for managing the game as a …","","","","","","Wrap the [
web_sys
] access to the browser console in a …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Get next item from the iterator","Get next item from the iterator","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[0,0,0,1,1,1,0,2,2,0,3,3,3,0,4,4,4,4,4,4,4,4,4,0,0,5,5,5,0,6,6,6,0,0,0,7,7,7,0,8,8,8,8,8,0,9,9,9,0,10,10,10,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,0,12,12,12,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,5,6,1,2,3,4,7,8,9,10,11,1,2,3,4,7,7,8,8,9,9,10,10,1,2,3,4,7,8,9,10,1,3,10,11,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,1,2,3,4,7,9,10,11,12,7,9,10,11,12],"f":[null,null,null,null,null,[[],["team",4]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["board",3]]],null,null,null,[[["board",3]]],null,null,null,null,null,[[["strength",4],["team",4]],["piece",3]],null,null,null,null,null,[[],["direction",3]],null,null,null,[[["piece",3],["squarestate",4],["option",4]],["square",3]],null,null,null,[[["usize",15]],["brdidx",3]],null,null,null,null,null,[[["usize",15]],["square",3]],[[["brdidx",3]],[["option",4],["vec",3]]],[[["brdidx",3]],[["direction",3],["option",4]]],[[["usize",15],["team",4],["brdidx",3],["vec",3]],[["usize",15],["vec",3]]],[[["brdidx",3],["team",4]],[["option",4],["vec",3]]],[[["brdidx",3]],[["option",4],["vec",3]]],[[["brdidx",3]],[["direction",3],["option",4]]],[[["brdidx",3],["team",4]],[["option",4],["vec",3]]],[[["usize",15]],["square",3]],[[["brdidx",3]],["square",3]],[[["usize",15]],["usize",15]],[[["brdidx",3]],["usize",15]],[[["usize",15]],["brdidx",3]],[[["brdidx",3]],["moveable",4]],[[["brdidx",3],["piece",3],["i32",15]],["moveable",4]],[[["brdidx",3],["piece",3],["i32",15]],["moveable",4]],[[["brdidx",3],["i32",15]],["square",3]],[[["square",3],["brdidx",3],["piece",3]],["moveable",4]],[[["piece",3]],["bool",15]],[[["usize",15]],["board",3]],[[["board",3]],["board",3]],[[],["team",4]],[[]],[[],["usize",15]],[[["usize",15]],["squarestate",4]],null,[[]],null,null,null,null,null,[[]],[[]],null,[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["string",3]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[]],[[],[["option",4],["vec",3]]],[[],[["option",4],["vec",3]]],[[],["team",4]],[[],["strength",4]],[[],["squarestate",4]],[[],["moveable",4]],[[],["piece",3]],[[],["direction",3]],[[],["square",3]],[[],["brdidx",3]],[[],["board",3]],[[["team",4]],["bool",15]],[[["strength",4]],["bool",15]],[[["squarestate",4]],["bool",15]],[[["moveable",4]],["bool",15]],[[["piece",3]],["bool",15]],[[["piece",3]],["bool",15]],[[["direction",3]],["bool",15]],[[["direction",3]],["bool",15]],[[["square",3]],["bool",15]],[[["square",3]],["bool",15]],[[["brdidx",3]],["bool",15]],[[["brdidx",3]],["bool",15]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[["u32",15]]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[],["u32",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["u32",15]],["bool",15]],[[["u32",15]],["bool",15]],[[["u32",15]],["bool",15]],[[["u32",15]],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[],["bool",15]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]]],"p":[[4,"Team"],[4,"Strength"],[4,"SquareState"],[4,"Moveable"],[3,"RowIndexIterator"],[3,"RowSquareIterator"],[3,"Piece"],[3,"Direction"],[3,"Square"],[3,"BrdIdx"],[3,"Board"],[3,"Game"]]}\
}');
initSearch(searchIndex);
\ No newline at end of file
diff --git a/doc/src/draught/board/enums.rs.html b/doc/src/draught/board/enums.rs.html
index c12007c..24d0fb6 100644
--- a/doc/src/draught/board/enums.rs.html
+++ b/doc/src/draught/board/enums.rs.html
@@ -62,6 +62,17 @@
59
60
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
@@ -76,6 +87,15 @@
White = 1,
}
+impl Team {
+ pub fn opponent(&self) -> Team{
+ match self {
+ Team::White => Team::Black,
+ Team::Black => Team::White,
+ }
+ }
+}
+
impl Display for Team {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
@@ -123,6 +143,8 @@
Unplayable = 4,
WrongTeamSrc = 5,
IllegalTrajectory = 6,
+ NoJumpablePiece = 7,
+ JumpingSameTeam = 8,
}
\ No newline at end of file
diff --git a/doc/src/draught/board/mod.rs.html b/doc/src/draught/board/mod.rs.html
index af2a9b6..d8e9c65 100644
--- a/doc/src/draught/board/mod.rs.html
+++ b/doc/src/draught/board/mod.rs.html
@@ -631,111 +631,11 @@
628
629
630
-
631
-
632
-
633
-
634
-
635
-
636
-
637
-
638
-
639
-
640
-
641
-
642
-
643
-
644
-
645
-
646
-
647
-
648
-
649
-
650
-
651
-
652
-
653
-
654
-
655
-
656
-
657
-
658
-
659
-
660
-
661
-
662
-
663
-
664
-
665
-
666
-
667
-
668
-
669
-
670
-
671
-
672
-
673
-
674
-
675
-
676
-
677
-
678
-
679
-
680
-
681
-
682
-
683
-
684
-
685
-
686
-
687
-
688
-
689
-
690
-
691
-
692
-
693
-
694
-
695
-
696
-
697
-
698
-
699
-
700
-
701
-
702
-
703
-
704
-
705
-
706
-
707
-
708
-
709
-
710
-
711
-
712
-
713
-
714
-
715
-
716
-
717
-
718
-
719
-
720
-
721
-
722
-
723
-
724
-
725
-
726
-
727
-
728
-
729
-
730
-
731
-
732
+#[cfg(test)] pub mod tests;
+
pub mod enums;
use enums::*;
@@ -1102,64 +1002,163 @@
return Moveable::OutOfBounds;
}
+ if to.row > self.height - 1 || to.col > self.width - 1 {
+ return Moveable::OutOfBounds;
+ }
+
let from_square = self.cell(self.cell_idx(from));
+
match from_square.state {
- Empty => return Moveable::UnoccupiedSrc,
- Unplayable => return Moveable::Unplayable,
- Occupied => {
+ SquareState::Empty => return Moveable::UnoccupiedSrc,
+ SquareState::Unplayable => return Moveable::Unplayable,
+ SquareState::Occupied => {
match from_square.occupant {
+
None => panic!("Square is apparently occupied, but no occupant was found from: {}, to: {}, square: {:?}", from, to, from_square),
- Some(x) => {
+ Some(from_square_occupant) => {
- if x.team != self.current_turn {
+ if from_square_occupant.team != self.current_turn {
return Moveable::WrongTeamSrc;
}
+
+ let row_diff: i32 = to.row as i32 - from.row as i32;
+ let col_diff: i32 = to.col as i32 - from.col as i32;
+
+
- match x.strength {
- Man => {
- match self.current_turn {
- Black => {
-
- },
- White => {
-
- },
- };
- },
- King => {
- match self.current_turn {
- Black => {
-
- },
- White => {
-
- },
- };
- },
+ match from_square_occupant.strength {
+ Strength::Man => self.validate_man_move(from, to, row_diff, col_diff, from_square_occupant),
+ Strength::King => self.validate_king_move(from, to, row_diff, col_diff, from_square_occupant),
};
-
-
-
-
- let jumpable = self.jumpable_dir(from);
}
}
},
}
-
-
-
-
-
Moveable::Allowed
}
+ pub fn validate_man_move(&self, from: BrdIdx, to: BrdIdx, row_diff: i32, col_diff: i32, from_square_occupant: Piece) -> Moveable {
+
+ let idx_scale: i32 = match self.current_turn {
+ Team::Black => -1,
+ Team::White => 1,
+ };
+
+
+ if row_diff == idx_scale {
+
+ if col_diff.abs() == 1 {
+ return Moveable::Allowed;
+ }
+
+ else {
+ return Moveable::IllegalTrajectory;
+ }
+ }
+
+ else if row_diff == 2 * idx_scale {
+
+ if col_diff.abs() == 2 {
+
+
+ let jumpee = self.get_jumpee(from, row_diff, col_diff);
+ match jumpee.state {
+ SquareState::Empty => Moveable::NoJumpablePiece,
+ SquareState::Unplayable => panic!("Found an unplayable piece to try to jump over, from: {}, to: {}, jumpee: {:?}", from, to, jumpee),
+ SquareState::Occupied => {
+
+
+ return Board::validate_jumpee(jumpee, from, to, from_square_occupant);
+ },
+ }
+ }
+
+ else {
+ return Moveable::IllegalTrajectory;
+ }
+ }
+
+ else {
+ return Moveable::IllegalTrajectory;
+ }
+ }
+
+ pub fn validate_king_move(&self, from: BrdIdx, to: BrdIdx, row_diff: i32, col_diff: i32, from_square_occupant: Piece) -> Moveable {
+
+ if row_diff.abs() == 1 {
+
+ if col_diff.abs() == 1 {
+ return Moveable::Allowed;
+ }
+
+ else {
+ return Moveable::IllegalTrajectory;
+ }
+ }
+
+ else if row_diff.abs() == 2 {
+
+ if col_diff.abs() == 2 {
+
+
+ let jumpee = self.get_jumpee(from, row_diff, col_diff);
+ match jumpee.state {
+ SquareState::Empty => Moveable::NoJumpablePiece,
+ SquareState::Unplayable => panic!("Found an unplayable piece to try to jump over, from: {}, to: {}, jumpee: {:?}", from, to, jumpee),
+ SquareState::Occupied => {
+
+
+ return Board::validate_jumpee(jumpee, from, to, from_square_occupant);
+ },
+ }
+ }
+
+ else {
+ return Moveable::IllegalTrajectory;
+ }
+ }
+
+ else {
+ return Moveable::IllegalTrajectory;
+ }
+ }
+
+ pub fn get_jumpee(&self, from: BrdIdx, row_diff: i32, col_diff: i32) -> Square {
+ self.cell(
+ self.cell_idx(
+ BrdIdx::from(
+ ((from.row as i32) + row_diff / 2) as usize,
+ ((from.col as i32) + col_diff / 2) as usize)
+ )
+ )
+ }
+
+ pub fn validate_jumpee(jumpee: Square, from: BrdIdx, to: BrdIdx, from_occ: Piece) -> Moveable {
+
+ match jumpee.occupant {
+ None => panic!("No occupant found when checking the jumpee, from: {}, to: {}, jumpee: {:?}", from, to, jumpee),
+ Some(jumpee_occupant_uw) => {
+ if Board::check_jumpee_team(from_occ, jumpee_occupant_uw) {
+ return Moveable::Allowed;
+ }
+ else {
+ return Moveable::JumpingSameTeam;
+ }
+ },
+ }
+ }
+
+
+ pub fn check_jumpee_team(from: Piece, jumpee: Piece) -> bool {
+ return from.team.opponent() == jumpee.team
+ }
+
pub fn new(width: usize, height: usize) -> Board {
let total_cells = width * height;
@@ -1262,209 +1261,6 @@
write!(f, "{}", string)
}
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use wasm_bindgen_test::*;
- use crate::log;
-
- wasm_bindgen_test_configure!(run_in_browser);
-
- #[wasm_bindgen_test]
- fn create() {
- let board = Board::new(STD_WIDTH, STD_HEIGHT);
- assert!(true);
- }
-
- #[wasm_bindgen_test]
- fn std_num_cells() {
- let board = Board::new(8, 8);
- assert_eq!(64, board.num_cells());
- }
-
-
-
-
-
- #[wasm_bindgen_test]
- fn cell_index_top_left() {
- let board = Board::new(8, 8);
- assert_eq!(0, board.cell_index(0, 0));
- }
-
- #[wasm_bindgen_test]
- fn cell_index_central() {
- let board = Board::new(8, 8);
- assert_eq!(9, board.cell_index(1, 1));
- }
-
- #[wasm_bindgen_test]
- fn cell_index_central_2() {
- let board = Board::new(8, 8);
- assert_eq!(17, board.cell_index(2, 1));
- }
-
- #[wasm_bindgen_test]
- fn board_index() {
- let board = Board::new(8, 8);
-
-
- assert_eq!(BrdIdx::from(0, 5), board.board_index(5));
-
- assert_eq!(BrdIdx::from(1, 6), board.board_index(14));
-
- assert_eq!(BrdIdx::from(2, 4), board.board_index(20));
- }
-
-
-
-
-
- #[wasm_bindgen_test]
- fn first_square_unplayable() {
- let board = Board::new(8, 8);
- assert_eq!(SquareState::Unplayable, board.cell_state(board.cell_index(0, 0)));
- }
-
- #[wasm_bindgen_test]
- fn first_square_row_5_unplayable() {
- let board = Board::new(8, 8);
- assert_eq!(SquareState::Empty, board.cell_state(board.cell_index(5, 0)));
- }
-
-
-
-
-
- #[wasm_bindgen_test]
- fn moveable_indices_unplayable() {
- let board = Board::new(8, 8);
- assert_eq!(None, board.diagonal_indices(BrdIdx::from(7, 7)));
- assert_eq!(None, board.diagonal_indices(BrdIdx::from(0, 0)));
- assert_eq!(None, board.diagonal_indices(BrdIdx::from(1, 1)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_central() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![1, 3, 17, 19]), board.diagonal_indices(BrdIdx::from(1, 2)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_top_row() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![8, 10]), board.diagonal_indices(BrdIdx::from(0, 1)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_left_column() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![1, 17]), board.diagonal_indices(BrdIdx::from(1, 0)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_bottom_row() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![49, 51]), board.diagonal_indices(BrdIdx::from(7, 2)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_right_column() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![14, 30]), board.diagonal_indices(BrdIdx::from(2, 7)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_top_right() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![14]), board.diagonal_indices(BrdIdx::from(0, 7)));
- }
-
- #[wasm_bindgen_test]
- fn moveable_indices_bottom_left() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![49]), board.diagonal_indices(BrdIdx::from(7, 0)));
- }
-
-
-
-
-
- #[wasm_bindgen_test]
- fn jumpable_indices_unplayable() {
- let board = Board::new(8, 8);
- assert_eq!(None, board.jumpable_indices(BrdIdx::from(7, 7)));
- assert_eq!(None, board.jumpable_indices(BrdIdx::from(0, 0)));
- assert_eq!(None, board.jumpable_indices(BrdIdx::from(1, 1)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![24, 28]), board.jumpable_indices(BrdIdx::from(1, 2)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_central() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![10, 14, 42, 46]), board.jumpable_indices(BrdIdx::from(3, 4)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_top_row() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![19]), board.jumpable_indices(BrdIdx::from(0, 1)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_left_column() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![26]), board.jumpable_indices(BrdIdx::from(1, 0)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_bottom_row() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![40, 44]), board.jumpable_indices(BrdIdx::from(7, 2)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_right_column() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![5, 37]), board.jumpable_indices(BrdIdx::from(2, 7)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_top_right() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![21]), board.jumpable_indices(BrdIdx::from(0, 7)));
- }
-
- #[wasm_bindgen_test]
- fn jumpable_indices_bottom_left() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![42]), board.jumpable_indices(BrdIdx::from(7, 0)));
- }
-
-
-
-
-
-
-
- #[wasm_bindgen_test]
- fn black_diagonal_indices() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![1, 3]), board.player_diagonal_indices(BrdIdx::from(1, 2), Team::Black));
- }
-
- #[wasm_bindgen_test]
- fn white_diagonal_indices() {
- let board = Board::new(8, 8);
- assert_eq!(Some(vec![17, 19]), board.player_diagonal_indices(BrdIdx::from(1, 2), Team::White));
- }
}
\ No newline at end of file
diff --git a/index_js.bootstrap.js b/index_js.bootstrap.js
index bebefe9..2db5ed7 100644
--- a/index_js.bootstrap.js
+++ b/index_js.bootstrap.js
@@ -15,7 +15,7 @@
/***/ ((module, __webpack_exports__, __webpack_require__) => {
"use strict";
-eval("__webpack_require__.a(module, async (__webpack_handle_async_dependencies__) => {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"init_game\": () => (/* binding */ init_game),\n/* harmony export */ \"Team\": () => (/* binding */ Team),\n/* harmony export */ \"Strength\": () => (/* binding */ Strength),\n/* harmony export */ \"SquareState\": () => (/* binding */ SquareState),\n/* harmony export */ \"Moveable\": () => (/* binding */ Moveable),\n/* harmony export */ \"Board\": () => (/* binding */ Board),\n/* harmony export */ \"BrdIdx\": () => (/* binding */ BrdIdx),\n/* harmony export */ \"Game\": () => (/* binding */ Game),\n/* harmony export */ \"Piece\": () => (/* binding */ Piece),\n/* harmony export */ \"Square\": () => (/* binding */ Square),\n/* harmony export */ \"__wbindgen_string_new\": () => (/* binding */ __wbindgen_string_new),\n/* harmony export */ \"__wbindgen_object_drop_ref\": () => (/* binding */ __wbindgen_object_drop_ref),\n/* harmony export */ \"__wbg_log_9a99fb1af846153b\": () => (/* binding */ __wbg_log_9a99fb1af846153b),\n/* harmony export */ \"__wbg_new_59cb74e423758ede\": () => (/* binding */ __wbg_new_59cb74e423758ede),\n/* harmony export */ \"__wbg_stack_558ba5917b466edd\": () => (/* binding */ __wbg_stack_558ba5917b466edd),\n/* harmony export */ \"__wbg_error_4bb6c2a97407129a\": () => (/* binding */ __wbg_error_4bb6c2a97407129a),\n/* harmony export */ \"__wbindgen_throw\": () => (/* binding */ __wbindgen_throw)\n/* harmony export */ });\n/* harmony import */ var _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./draught_bg.wasm */ \"../pkg/draught_bg.wasm\");\n/* module decorator */ module = __webpack_require__.hmd(module);\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__]);\n_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__)[0];\n\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer) {\n cachegetUint8Memory0 = new Uint8Array(_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction _assertClass(instance, klass) {\n if (!(instance instanceof klass)) {\n throw new Error(`expected instance of ${klass.name}`);\n }\n return instance.ptr;\n}\n/**\n*/\nfunction init_game() {\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.init_game();\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer) {\n cachegetInt32Memory0 = new Int32Array(_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer);\n }\n return cachegetInt32Memory0;\n}\n/**\n*/\nconst Team = Object.freeze({ Black:0,\"0\":\"Black\",White:1,\"1\":\"White\", });\n/**\n*/\nconst Strength = Object.freeze({ Man:0,\"0\":\"Man\",King:1,\"1\":\"King\", });\n/**\n*/\nconst SquareState = Object.freeze({ Empty:0,\"0\":\"Empty\",Occupied:1,\"1\":\"Occupied\",Unplayable:2,\"2\":\"Unplayable\", });\n/**\n*/\nconst Moveable = Object.freeze({ Allowed:0,\"0\":\"Allowed\",UnoccupiedSrc:1,\"1\":\"UnoccupiedSrc\",OccupiedDest:2,\"2\":\"OccupiedDest\",OutOfBounds:3,\"3\":\"OutOfBounds\",Unplayable:4,\"4\":\"Unplayable\",WrongTeamSrc:5,\"5\":\"WrongTeamSrc\",IllegalTrajectory:6,\"6\":\"IllegalTrajectory\", });\n/**\n* Models a single state for a checkers board\n*/\nclass Board {\n\n static __wrap(ptr) {\n const obj = Object.create(Board.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_board_free(ptr);\n }\n /**\n * Get a copy of a board square by 1D array index\n * @param {number} idx\n * @returns {Square}\n */\n cell(idx) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell(this.ptr, idx);\n return Square.__wrap(ret);\n }\n /**\n * Get a copy of a board square by 2D [`BrdIdx`] index\n * @param {BrdIdx} idx\n * @returns {Square}\n */\n grid_cell(idx) {\n _assertClass(idx, BrdIdx);\n var ptr0 = idx.ptr;\n idx.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_grid_cell(this.ptr, ptr0);\n return Square.__wrap(ret);\n }\n /**\n * Transform a 2D row/column board index into a single 1D index for use with [`Board::cells`]\n * @param {number} row\n * @param {number} col\n * @returns {number}\n */\n cell_index(row, col) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell_index(this.ptr, row, col);\n return ret >>> 0;\n }\n /**\n * Similar to [`Board::cell_index`] but with a [`BrdIdx`] instead of separate indices. Transform a 2D row/column board index into a single 1D index for use with [`Board::cells`]\n * @param {BrdIdx} idx\n * @returns {number}\n */\n cell_idx(idx) {\n _assertClass(idx, BrdIdx);\n var ptr0 = idx.ptr;\n idx.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell_idx(this.ptr, ptr0);\n return ret >>> 0;\n }\n /**\n * Transform a 1D array index (for [`Board::cells`]) into a 2D game board index (by row/col)\n * @param {number} idx\n * @returns {BrdIdx}\n */\n board_index(idx) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_board_index(this.ptr, idx);\n return BrdIdx.__wrap(ret);\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {number}\n */\n can_move(from, to) {\n _assertClass(from, BrdIdx);\n var ptr0 = from.ptr;\n from.ptr = 0;\n _assertClass(to, BrdIdx);\n var ptr1 = to.ptr;\n to.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_can_move(this.ptr, ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * Iniitalise a game board without game pieces\n * @param {number} width\n * @param {number} height\n * @returns {Board}\n */\n static new(width, height) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_new(width, height);\n return Board.__wrap(ret);\n }\n /**\n * Reset the given board to a starting layout with 3 rows of opposing pieces\n * @param {Board} board\n * @returns {Board}\n */\n static init_game(board) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_init_game(ptr0);\n return Board.__wrap(ret);\n }\n /**\n * Get the [`Board::current_turn`] parameter\n * @returns {number}\n */\n current_turn() {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_current_turn(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get a pointer to the backing array of board squares, [`Board::cells`]\n * @returns {number}\n */\n cells() {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cells(this.ptr);\n return ret;\n }\n /**\n * Get the number of board squares\n * @returns {number}\n */\n num_cells() {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_num_cells(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get the state of a board square by 1D array index\n * @param {number} idx\n * @returns {number}\n */\n cell_state(idx) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell_state(this.ptr, idx);\n return ret >>> 0;\n }\n}\n/**\n* Model a rank 2 tensor index to identify a board square by row and column\n*/\nclass BrdIdx {\n\n static __wrap(ptr) {\n const obj = Object.create(BrdIdx.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_brdidx_free(ptr);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {BrdIdx}\n */\n static from(row, col) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.brdidx_from(row, col);\n return BrdIdx.__wrap(ret);\n }\n}\n/**\n* Root-level structure for managing the game as a collection of board states\n*/\nclass Game {\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_game_free(ptr);\n }\n}\n/**\n* Model a game piece by its team and strength (normal or kinged)\n*/\nclass Piece {\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_piece_free(ptr);\n }\n}\n/**\n* Model board squares by a state and a possible occupying game piece\n*/\nclass Square {\n\n static __wrap(ptr) {\n const obj = Object.create(Square.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_square_free(ptr);\n }\n}\n\nfunction __wbindgen_string_new(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nfunction __wbg_log_9a99fb1af846153b(arg0) {\n console.log(getObject(arg0));\n};\n\nfunction __wbg_new_59cb74e423758ede() {\n var ret = new Error();\n return addHeapObject(ret);\n};\n\nfunction __wbg_stack_558ba5917b466edd(arg0, arg1) {\n var ret = getObject(arg1).stack;\n var ptr0 = passStringToWasm0(ret, _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbindgen_malloc, _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbg_error_4bb6c2a97407129a(arg0, arg1) {\n try {\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbindgen_free(arg0, arg1);\n }\n};\n\nfunction __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n\n});\n\n//# sourceURL=webpack://draught/../pkg/draught_bg.js?");
+eval("__webpack_require__.a(module, async (__webpack_handle_async_dependencies__) => {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"init_game\": () => (/* binding */ init_game),\n/* harmony export */ \"Team\": () => (/* binding */ Team),\n/* harmony export */ \"Strength\": () => (/* binding */ Strength),\n/* harmony export */ \"SquareState\": () => (/* binding */ SquareState),\n/* harmony export */ \"Moveable\": () => (/* binding */ Moveable),\n/* harmony export */ \"Board\": () => (/* binding */ Board),\n/* harmony export */ \"BrdIdx\": () => (/* binding */ BrdIdx),\n/* harmony export */ \"Game\": () => (/* binding */ Game),\n/* harmony export */ \"Piece\": () => (/* binding */ Piece),\n/* harmony export */ \"Square\": () => (/* binding */ Square),\n/* harmony export */ \"__wbindgen_string_new\": () => (/* binding */ __wbindgen_string_new),\n/* harmony export */ \"__wbindgen_object_drop_ref\": () => (/* binding */ __wbindgen_object_drop_ref),\n/* harmony export */ \"__wbg_log_9a99fb1af846153b\": () => (/* binding */ __wbg_log_9a99fb1af846153b),\n/* harmony export */ \"__wbg_new_59cb74e423758ede\": () => (/* binding */ __wbg_new_59cb74e423758ede),\n/* harmony export */ \"__wbg_stack_558ba5917b466edd\": () => (/* binding */ __wbg_stack_558ba5917b466edd),\n/* harmony export */ \"__wbg_error_4bb6c2a97407129a\": () => (/* binding */ __wbg_error_4bb6c2a97407129a),\n/* harmony export */ \"__wbindgen_throw\": () => (/* binding */ __wbindgen_throw)\n/* harmony export */ });\n/* harmony import */ var _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./draught_bg.wasm */ \"../pkg/draught_bg.wasm\");\n/* module decorator */ module = __webpack_require__.hmd(module);\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__]);\n_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__)[0];\n\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer) {\n cachegetUint8Memory0 = new Uint8Array(_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction _assertClass(instance, klass) {\n if (!(instance instanceof klass)) {\n throw new Error(`expected instance of ${klass.name}`);\n }\n return instance.ptr;\n}\n/**\n*/\nfunction init_game() {\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.init_game();\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer) {\n cachegetInt32Memory0 = new Int32Array(_draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.memory.buffer);\n }\n return cachegetInt32Memory0;\n}\n/**\n*/\nconst Team = Object.freeze({ Black:0,\"0\":\"Black\",White:1,\"1\":\"White\", });\n/**\n*/\nconst Strength = Object.freeze({ Man:0,\"0\":\"Man\",King:1,\"1\":\"King\", });\n/**\n*/\nconst SquareState = Object.freeze({ Empty:0,\"0\":\"Empty\",Occupied:1,\"1\":\"Occupied\",Unplayable:2,\"2\":\"Unplayable\", });\n/**\n*/\nconst Moveable = Object.freeze({ Allowed:0,\"0\":\"Allowed\",UnoccupiedSrc:1,\"1\":\"UnoccupiedSrc\",OccupiedDest:2,\"2\":\"OccupiedDest\",OutOfBounds:3,\"3\":\"OutOfBounds\",Unplayable:4,\"4\":\"Unplayable\",WrongTeamSrc:5,\"5\":\"WrongTeamSrc\",IllegalTrajectory:6,\"6\":\"IllegalTrajectory\",NoJumpablePiece:7,\"7\":\"NoJumpablePiece\",JumpingSameTeam:8,\"8\":\"JumpingSameTeam\", });\n/**\n* Models a single state for a checkers board\n*/\nclass Board {\n\n static __wrap(ptr) {\n const obj = Object.create(Board.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_board_free(ptr);\n }\n /**\n * Get a copy of a board square by 1D array index\n * @param {number} idx\n * @returns {Square}\n */\n cell(idx) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell(this.ptr, idx);\n return Square.__wrap(ret);\n }\n /**\n * Get a copy of a board square by 2D [`BrdIdx`] index\n * @param {BrdIdx} idx\n * @returns {Square}\n */\n grid_cell(idx) {\n _assertClass(idx, BrdIdx);\n var ptr0 = idx.ptr;\n idx.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_grid_cell(this.ptr, ptr0);\n return Square.__wrap(ret);\n }\n /**\n * Transform a 2D row/column board index into a single 1D index for use with [`Board::cells`]\n * @param {number} row\n * @param {number} col\n * @returns {number}\n */\n cell_index(row, col) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell_index(this.ptr, row, col);\n return ret >>> 0;\n }\n /**\n * Similar to [`Board::cell_index`] but with a [`BrdIdx`] instead of separate indices. Transform a 2D row/column board index into a single 1D index for use with [`Board::cells`]\n * @param {BrdIdx} idx\n * @returns {number}\n */\n cell_idx(idx) {\n _assertClass(idx, BrdIdx);\n var ptr0 = idx.ptr;\n idx.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell_idx(this.ptr, ptr0);\n return ret >>> 0;\n }\n /**\n * Transform a 1D array index (for [`Board::cells`]) into a 2D game board index (by row/col)\n * @param {number} idx\n * @returns {BrdIdx}\n */\n board_index(idx) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_board_index(this.ptr, idx);\n return BrdIdx.__wrap(ret);\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {number}\n */\n can_move(from, to) {\n _assertClass(from, BrdIdx);\n var ptr0 = from.ptr;\n from.ptr = 0;\n _assertClass(to, BrdIdx);\n var ptr1 = to.ptr;\n to.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_can_move(this.ptr, ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {number} row_diff\n * @param {number} col_diff\n * @param {Piece} from_square_occupant\n * @returns {number}\n */\n validate_man_move(from, to, row_diff, col_diff, from_square_occupant) {\n _assertClass(from, BrdIdx);\n var ptr0 = from.ptr;\n from.ptr = 0;\n _assertClass(to, BrdIdx);\n var ptr1 = to.ptr;\n to.ptr = 0;\n _assertClass(from_square_occupant, Piece);\n var ptr2 = from_square_occupant.ptr;\n from_square_occupant.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_validate_man_move(this.ptr, ptr0, ptr1, row_diff, col_diff, ptr2);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {number} row_diff\n * @param {number} col_diff\n * @param {Piece} from_square_occupant\n * @returns {number}\n */\n validate_king_move(from, to, row_diff, col_diff, from_square_occupant) {\n _assertClass(from, BrdIdx);\n var ptr0 = from.ptr;\n from.ptr = 0;\n _assertClass(to, BrdIdx);\n var ptr1 = to.ptr;\n to.ptr = 0;\n _assertClass(from_square_occupant, Piece);\n var ptr2 = from_square_occupant.ptr;\n from_square_occupant.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_validate_king_move(this.ptr, ptr0, ptr1, row_diff, col_diff, ptr2);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {number} row_diff\n * @param {number} col_diff\n * @returns {Square}\n */\n get_jumpee(from, row_diff, col_diff) {\n _assertClass(from, BrdIdx);\n var ptr0 = from.ptr;\n from.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_get_jumpee(this.ptr, ptr0, row_diff, col_diff);\n return Square.__wrap(ret);\n }\n /**\n * @param {Square} jumpee\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {Piece} from_occ\n * @returns {number}\n */\n static validate_jumpee(jumpee, from, to, from_occ) {\n _assertClass(jumpee, Square);\n var ptr0 = jumpee.ptr;\n jumpee.ptr = 0;\n _assertClass(from, BrdIdx);\n var ptr1 = from.ptr;\n from.ptr = 0;\n _assertClass(to, BrdIdx);\n var ptr2 = to.ptr;\n to.ptr = 0;\n _assertClass(from_occ, Piece);\n var ptr3 = from_occ.ptr;\n from_occ.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_validate_jumpee(ptr0, ptr1, ptr2, ptr3);\n return ret >>> 0;\n }\n /**\n * @param {Piece} from\n * @param {Piece} jumpee\n * @returns {boolean}\n */\n static check_jumpee_team(from, jumpee) {\n _assertClass(from, Piece);\n var ptr0 = from.ptr;\n from.ptr = 0;\n _assertClass(jumpee, Piece);\n var ptr1 = jumpee.ptr;\n jumpee.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_check_jumpee_team(ptr0, ptr1);\n return ret !== 0;\n }\n /**\n * Iniitalise a game board without game pieces\n * @param {number} width\n * @param {number} height\n * @returns {Board}\n */\n static new(width, height) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_new(width, height);\n return Board.__wrap(ret);\n }\n /**\n * Reset the given board to a starting layout with 3 rows of opposing pieces\n * @param {Board} board\n * @returns {Board}\n */\n static init_game(board) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_init_game(ptr0);\n return Board.__wrap(ret);\n }\n /**\n * Get the [`Board::current_turn`] parameter\n * @returns {number}\n */\n current_turn() {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_current_turn(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get a pointer to the backing array of board squares, [`Board::cells`]\n * @returns {number}\n */\n cells() {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cells(this.ptr);\n return ret;\n }\n /**\n * Get the number of board squares\n * @returns {number}\n */\n num_cells() {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_num_cells(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get the state of a board square by 1D array index\n * @param {number} idx\n * @returns {number}\n */\n cell_state(idx) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.board_cell_state(this.ptr, idx);\n return ret >>> 0;\n }\n}\n/**\n* Model a rank 2 tensor index to identify a board square by row and column\n*/\nclass BrdIdx {\n\n static __wrap(ptr) {\n const obj = Object.create(BrdIdx.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_brdidx_free(ptr);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {BrdIdx}\n */\n static from(row, col) {\n var ret = _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.brdidx_from(row, col);\n return BrdIdx.__wrap(ret);\n }\n}\n/**\n* Root-level structure for managing the game as a collection of board states\n*/\nclass Game {\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_game_free(ptr);\n }\n}\n/**\n* Model a game piece by its team and strength (normal or kinged)\n*/\nclass Piece {\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_piece_free(ptr);\n }\n}\n/**\n* Model board squares by a state and a possible occupying game piece\n*/\nclass Square {\n\n static __wrap(ptr) {\n const obj = Object.create(Square.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbg_square_free(ptr);\n }\n}\n\nfunction __wbindgen_string_new(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nfunction __wbg_log_9a99fb1af846153b(arg0) {\n console.log(getObject(arg0));\n};\n\nfunction __wbg_new_59cb74e423758ede() {\n var ret = new Error();\n return addHeapObject(ret);\n};\n\nfunction __wbg_stack_558ba5917b466edd(arg0, arg1) {\n var ret = getObject(arg1).stack;\n var ptr0 = passStringToWasm0(ret, _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbindgen_malloc, _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbg_error_4bb6c2a97407129a(arg0, arg1) {\n try {\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n _draught_bg_wasm__WEBPACK_IMPORTED_MODULE_0__.__wbindgen_free(arg0, arg1);\n }\n};\n\nfunction __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n\n});\n\n//# sourceURL=webpack://draught/../pkg/draught_bg.js?");
/***/ }),
@@ -26,7 +26,7 @@ eval("__webpack_require__.a(module, async (__webpack_handle_async_dependencies__
/***/ ((module, exports, __webpack_require__) => {
"use strict";
-eval("var __webpack_instantiate__ = ([WEBPACK_IMPORTED_MODULE_0]) => {\n\treturn __webpack_require__.v(exports, module.id, \"8728f958432289f02420\", {\n\t\t\"./draught_bg.js\": {\n\t\t\t\"__wbindgen_string_new\": WEBPACK_IMPORTED_MODULE_0.__wbindgen_string_new,\n\t\t\t\"__wbindgen_object_drop_ref\": WEBPACK_IMPORTED_MODULE_0.__wbindgen_object_drop_ref,\n\t\t\t\"__wbg_log_9a99fb1af846153b\": WEBPACK_IMPORTED_MODULE_0.__wbg_log_9a99fb1af846153b,\n\t\t\t\"__wbg_new_59cb74e423758ede\": WEBPACK_IMPORTED_MODULE_0.__wbg_new_59cb74e423758ede,\n\t\t\t\"__wbg_stack_558ba5917b466edd\": WEBPACK_IMPORTED_MODULE_0.__wbg_stack_558ba5917b466edd,\n\t\t\t\"__wbg_error_4bb6c2a97407129a\": WEBPACK_IMPORTED_MODULE_0.__wbg_error_4bb6c2a97407129a,\n\t\t\t\"__wbindgen_throw\": WEBPACK_IMPORTED_MODULE_0.__wbindgen_throw\n\t\t}\n\t});\n}\n__webpack_require__.a(module, (__webpack_handle_async_dependencies__) => {\n\t/* harmony import */ var WEBPACK_IMPORTED_MODULE_0 = __webpack_require__(/*! ./draught_bg.js */ \"../pkg/draught_bg.js\");\n\tvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([WEBPACK_IMPORTED_MODULE_0]);\n\treturn __webpack_async_dependencies__.then ? __webpack_async_dependencies__.then(__webpack_instantiate__) : __webpack_instantiate__(__webpack_async_dependencies__);\n}, 1);\n\n//# sourceURL=webpack://draught/../pkg/draught_bg.wasm?");
+eval("var __webpack_instantiate__ = ([WEBPACK_IMPORTED_MODULE_0]) => {\n\treturn __webpack_require__.v(exports, module.id, \"03257114f6704ea051f4\", {\n\t\t\"./draught_bg.js\": {\n\t\t\t\"__wbindgen_string_new\": WEBPACK_IMPORTED_MODULE_0.__wbindgen_string_new,\n\t\t\t\"__wbindgen_object_drop_ref\": WEBPACK_IMPORTED_MODULE_0.__wbindgen_object_drop_ref,\n\t\t\t\"__wbg_log_9a99fb1af846153b\": WEBPACK_IMPORTED_MODULE_0.__wbg_log_9a99fb1af846153b,\n\t\t\t\"__wbg_new_59cb74e423758ede\": WEBPACK_IMPORTED_MODULE_0.__wbg_new_59cb74e423758ede,\n\t\t\t\"__wbg_stack_558ba5917b466edd\": WEBPACK_IMPORTED_MODULE_0.__wbg_stack_558ba5917b466edd,\n\t\t\t\"__wbg_error_4bb6c2a97407129a\": WEBPACK_IMPORTED_MODULE_0.__wbg_error_4bb6c2a97407129a,\n\t\t\t\"__wbindgen_throw\": WEBPACK_IMPORTED_MODULE_0.__wbindgen_throw\n\t\t}\n\t});\n}\n__webpack_require__.a(module, (__webpack_handle_async_dependencies__) => {\n\t/* harmony import */ var WEBPACK_IMPORTED_MODULE_0 = __webpack_require__(/*! ./draught_bg.js */ \"../pkg/draught_bg.js\");\n\tvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([WEBPACK_IMPORTED_MODULE_0]);\n\treturn __webpack_async_dependencies__.then ? __webpack_async_dependencies__.then(__webpack_instantiate__) : __webpack_instantiate__(__webpack_async_dependencies__);\n}, 1);\n\n//# sourceURL=webpack://draught/../pkg/draught_bg.wasm?");
/***/ }),