From b3661c9a5b2de6228429ff678b4a6988a1ebc77d Mon Sep 17 00:00:00 2001 From: Sarsoo Date: Sat, 10 Jul 2021 22:56:15 +0000 Subject: [PATCH] deploy: 6d2eb8ab0a62bb0ffa676920c36a6e9e38ccb0e1 --- 10.bootstrap.js | 2 +- 10.bootstrap.js.map | 2 +- 96b9a573923750a3ae94.module.wasm | Bin 122311 -> 0 bytes cc96734576b00860ab91.module.wasm | Bin 0 -> 124071 bytes doc/draught/all.html | 2 +- doc/draught/board/index.html | 2 +- doc/draught/board/struct.Board.html | 31 +++--- doc/draught/comp/index.html | 2 +- doc/draught/comp/struct.Computer.html | 8 +- doc/draught/game/index.html | 2 +- doc/draught/game/struct.Game.html | 33 ++++--- .../paint/constant.BLACK_PIECE_OUTLINE.html | 2 +- .../paint/constant.DRAW_PIECE_OUTLINES.html | 2 +- doc/draught/paint/constant.KING_OUTLINE.html | 2 +- doc/draught/paint/constant.PIECE_MARGIN.html | 2 +- .../paint/constant.PIECE_OUTLINE_WIDTH.html | 2 +- .../paint/constant.SELECTED_PIECE.html | 6 ++ .../constant.SELECTED_PIECE_OUTLINE.html | 6 ++ .../paint/constant.WHITE_PIECE_OUTLINE.html | 2 +- doc/draught/paint/index.html | 4 +- doc/draught/paint/sidebar-items.js | 2 +- doc/draught/paint/struct.Painter.html | 54 +++++----- doc/search-index.js | 2 +- doc/src/draught/board/mod.rs.html | 82 +++++++++++++++- doc/src/draught/comp/mod.rs.html | 48 +++------ doc/src/draught/game/mod.rs.html | 60 +++++++++++- doc/src/draught/paint.rs.html | 92 +++++++++++++++++- index.html | 10 +- 28 files changed, 346 insertions(+), 116 deletions(-) delete mode 100644 96b9a573923750a3ae94.module.wasm create mode 100644 cc96734576b00860ab91.module.wasm create mode 100644 doc/draught/paint/constant.SELECTED_PIECE.html create mode 100644 doc/draught/paint/constant.SELECTED_PIECE_OUTLINE.html diff --git a/10.bootstrap.js b/10.bootstrap.js index d680d46..99dc4a4 100644 --- a/10.bootstrap.js +++ b/10.bootstrap.js @@ -1,2 +1,2 @@ -(self.webpackChunkdraught=self.webpackChunkdraught||[]).push([[10],{171:(t,e,r)=>{"use strict";r.a(t,(async n=>{r.d(e,{wc:()=>x,SZ:()=>j,i0:()=>O,Tt:()=>S,rh:()=>q,lA:()=>I,Ck:()=>B,ug:()=>A,h4:()=>U,h9:()=>$,Dz:()=>M,kF:()=>D,s8:()=>J,WB:()=>P,cP:()=>R,a:()=>z,l_:()=>F,U_:()=>N,EN:()=>Y,qu:()=>K,Wg:()=>L,B3:()=>Q,I6:()=>Z,Qb:()=>X,cI:()=>H,QK:()=>G,Md:()=>V,ox:()=>tt,ES:()=>et,Ae:()=>rt,UL:()=>nt,qw:()=>_t,tS:()=>at,R$:()=>ct,md:()=>it,IF:()=>ot,XP:()=>st,m_:()=>ut,fY:()=>pt,Or:()=>lt});var _=r(813);t=r.hmd(t);var a=n([_]);_=(a.then?await a:a)[0];const c=new Array(32).fill(void 0);function i(t){return c[t]}c.push(void 0,null,!0,!1);let o=c.length;let s=new("undefined"==typeof TextDecoder?(0,t.require)("util").TextDecoder:TextDecoder)("utf-8",{ignoreBOM:!0,fatal:!0});s.decode();let u=null;function p(){return null!==u&&u.buffer===_.memory.buffer||(u=new Uint8Array(_.memory.buffer)),u}function l(t,e){return s.decode(p().subarray(t,t+e))}function d(t){o===c.length&&c.push(c.length+1);const e=o;return o=c[e],c[e]=t,e}function b(t){const e=typeof t;if("number"==e||"boolean"==e||null==t)return`${t}`;if("string"==e)return`"${t}"`;if("symbol"==e){const e=t.description;return null==e?"Symbol":`Symbol(${e})`}if("function"==e){const e=t.name;return"string"==typeof e&&e.length>0?`Function(${e})`:"Function"}if(Array.isArray(t)){const e=t.length;let r="[";e>0&&(r+=b(t[0]));for(let n=1;n1))return toString.call(t);if(n=r[1],"Object"==n)try{return"Object("+JSON.stringify(t)+")"}catch(t){return"Object"}return t instanceof Error?`${t.name}: ${t.message}\n${t.stack}`:n}let g=0,w=new("undefined"==typeof TextEncoder?(0,t.require)("util").TextEncoder:TextEncoder)("utf-8");const f="function"==typeof w.encodeInto?function(t,e){return w.encodeInto(t,e)}:function(t,e){const r=w.encode(t);return e.set(r),{read:t.length,written:r.length}};function h(t,e,r){if(void 0===r){const r=w.encode(t),n=e(r.length);return p().subarray(n,n+r.length).set(r),g=r.length,n}let n=t.length,_=e(n);const a=p();let c=0;for(;c127)break;a[_+c]=e}if(c!==n){0!==c&&(t=t.slice(c)),_=r(_,n,n=c+3*t.length);const e=p().subarray(_+c,_+n);c+=f(t,e).written}return g=c,_}let m=null;function v(){return null!==m&&m.buffer===_.memory.buffer||(m=new Int32Array(_.memory.buffer)),m}function y(t){return null==t}function k(t,e){if(!(t instanceof e))throw new Error(`expected instance of ${e.name}`);return t.ptr}function x(){_.init_wasm()}function T(t,e){try{return t.apply(this,e)}catch(t){_.__wbindgen_exn_store(d(t))}}Object.freeze({Move:0,0:"Move",Jump:1,1:"Jump"});const j=Object.freeze({Black:0,0:"Black",White:1,1:"White"}),O=(Object.freeze({Man:0,0:"Man",King:1,1:"King"}),Object.freeze({Empty:0,0:"Empty",Occupied:1,1:"Occupied",Unplayable:2,2:"Unplayable"})),S=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"});class E{static __wrap(t){const e=Object.create(E.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_board_free(t)}get width(){return _.__wbg_get_board_width(this.ptr)>>>0}set width(t){_.__wbg_set_board_width(this.ptr,t)}get height(){return _.__wbg_get_board_height(this.ptr)>>>0}set height(t){_.__wbg_set_board_height(this.ptr,t)}get current_turn(){return _.__wbg_get_board_current_turn(this.ptr)>>>0}set current_turn(t){_.__wbg_set_board_current_turn(this.ptr,t)}cell(t){var e=_.board_cell(this.ptr,t);return W.__wrap(e)}set_cell(t,e){k(e,W);var r=e.ptr;e.ptr=0,_.board_set_cell(this.ptr,t,r)}grid_cell(t){k(t,q);var e=t.ptr;t.ptr=0;var r=_.board_grid_cell(this.ptr,e);return W.__wrap(r)}cell_index(t,e){return _.board_cell_index(this.ptr,t,e)>>>0}cell_idx(t){k(t,q);var e=t.ptr;return t.ptr=0,_.board_cell_idx(this.ptr,e)>>>0}board_index(t){var e=_.board_board_index(this.ptr,t);return q.__wrap(e)}can_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;return e.ptr=0,_.board_can_move(this.ptr,r,n)>>>0}validate_man_move(t,e,r){k(t,q);var n=t.ptr;t.ptr=0,k(e,q);var a=e.ptr;e.ptr=0,k(r,C);var c=r.ptr;return r.ptr=0,_.board_validate_man_move(this.ptr,n,a,c)>>>0}validate_king_move(t,e,r){k(t,q);var n=t.ptr;t.ptr=0,k(e,q);var a=e.ptr;e.ptr=0,k(r,C);var c=r.ptr;return r.ptr=0,_.board_validate_king_move(this.ptr,n,a,c)>>>0}jumpee_idx(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;return e.ptr=0,_.board_jumpee_idx(this.ptr,r,n)>>>0}cells(){return _.board_cells(this.ptr)}num_cells(){return _.board_num_cells(this.ptr)>>>0}num_pieces(){return _.board_num_pieces(this.ptr)>>>0}num_player(t){return _.board_num_player(this.ptr,t)>>>0}score(){return _.board_score(this.ptr)}cell_state(t){return _.board_cell_state(this.ptr,t)>>>0}apply_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0;var a=_.board_apply_move(this.ptr,r,n);return E.__wrap(a)}apply_jump(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0;var a=_.board_apply_jump(this.ptr,r,n);return E.__wrap(a)}static validate_jumpee(t,e){k(t,W);var r=t.ptr;t.ptr=0,k(e,C);var n=e.ptr;return e.ptr=0,_.board_validate_jumpee(r,n)>>>0}static check_jumpee_team(t,e){k(t,C);var r=t.ptr;t.ptr=0,k(e,C);var n=e.ptr;return e.ptr=0,0!==_.board_check_jumpee_team(r,n)}constructor(t,e,r){var n=_.board_new(t,e,r);return E.__wrap(n)}static init_game(t,e){k(t,E);var r=t.ptr;t.ptr=0;var n=_.board_init_game(r,e);return E.__wrap(n)}}class q{static __wrap(t){const e=Object.create(q.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_brdidx_free(t)}get row(){return _.__wbg_get_brdidx_row(this.ptr)>>>0}set row(t){_.__wbg_set_brdidx_row(this.ptr,t)}get col(){return _.__wbg_get_brdidx_col(this.ptr)>>>0}set col(t){_.__wbg_set_brdidx_col(this.ptr,t)}constructor(t,e){var r=_.brdidx_from(t,e);return q.__wrap(r)}eq(t){return k(t,q),0!==_.brdidx_eq(this.ptr,t.ptr)}}class I{static __wrap(t){const e=Object.create(I.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_game_free(t)}current_board_cells(){return _.game_current_board_cells(this.ptr)}current_board_len(){return _.game_current_board_len(this.ptr)>>>0}current_turn(){return _.game_current_turn(this.ptr)>>>0}current_cell_state(t){k(t,q);var e=_.game_current_cell_state(this.ptr,t.ptr);return W.__wrap(e)}make_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;return e.ptr=0,_.game_make_move(this.ptr,r,n)>>>0}execute_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0,_.game_execute_move(this.ptr,r,n)}execute_jump(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0,_.game_execute_jump(this.ptr,r,n)}push_new_board(t){k(t,E);var e=t.ptr;t.ptr=0,_.game_push_new_board(this.ptr,e)}set_current(t){k(t,E);var e=t.ptr;t.ptr=0,_.game_set_current(this.ptr,e)}constructor(t,e,r,n){var a=_.game_new(t,e,r,n);return I.__wrap(a)}static new_with_canvas(t,e,r,n,a,c,i){var o=h(a,_.__wbindgen_malloc,_.__wbindgen_realloc),s=g,u=_.game_new_with_canvas(t,e,r,n,o,s,c,i);return I.__wrap(u)}set_painter(t){k(t,B);var e=t.ptr;t.ptr=0,_.game_set_painter(this.ptr,e)}draw(){_.game_draw(this.ptr)}}class B{static __wrap(t){const e=Object.create(B.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_painter_free(t)}constructor(t,e,r){var n=h(r,_.__wbindgen_malloc,_.__wbindgen_realloc),a=g,c=_.painter_new(t,e,n,a);return B.__wrap(c)}static new_with_canvas(t,e,r){var n=_.painter_new_with_canvas(t,e,d(r));return B.__wrap(n)}set_square_outline(t){_.painter_set_square_outline(this.ptr,d(t))}set_outline_width(t){_.painter_set_outline_width(this.ptr,t)}set_draw_outline(t){_.painter_set_draw_outline(this.ptr,t)}reset_dimensions(){_.painter_reset_dimensions(this.ptr)}validate_board_dim(t){return k(t,E),0!==_.painter_validate_board_dim(this.ptr,t.ptr)}draw(t){k(t,E),_.painter_draw(this.ptr,t.ptr)}}class C{static __wrap(t){const e=Object.create(C.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_piece_free(t)}get team(){return _.__wbg_get_piece_team(this.ptr)>>>0}set team(t){_.__wbg_set_piece_team(this.ptr,t)}get strength(){return _.__wbg_get_piece_strength(this.ptr)>>>0}set strength(t){_.__wbg_set_piece_strength(this.ptr,t)}constructor(t,e){var r=_.piece_new(t,e);return C.__wrap(r)}}class W{static __wrap(t){const e=Object.create(W.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_square_free(t)}get occupant(){var t=_.__wbg_get_square_occupant(this.ptr);return 0===t?void 0:C.__wrap(t)}set occupant(t){let e=0;y(t)||(k(t,C),e=t.ptr,t.ptr=0),_.__wbg_set_square_occupant(this.ptr,e)}get state(){return _.__wbg_get_square_state(this.ptr)>>>0}set state(t){_.__wbg_set_square_state(this.ptr,t)}constructor(t,e){let r=0;y(e)||(k(e,C),r=e.ptr,e.ptr=0);var n=_.square_new(t,r);return W.__wrap(n)}static pc(t,e){var r=_.square_pc(t,e);return W.__wrap(r)}static empty(){var t=_.square_empty();return W.__wrap(t)}static unplay(){var t=_.square_unplay();return W.__wrap(t)}}function A(t){!function(t){const e=i(t);(function(t){t<36||(c[t]=o,o=t)})(t)}(t)}function U(t,e){return d(l(t,e))}function $(){return d(new Error)}function M(t,e){var r=h(i(e).stack,_.__wbindgen_malloc,_.__wbindgen_realloc),n=g;v()[t/4+1]=n,v()[t/4+0]=r}function D(t,e){try{console.error(l(t,e))}finally{_.__wbindgen_free(t,e)}}function J(t){return i(t)instanceof Window}function P(t){var e=i(t).document;return y(e)?0:d(e)}function R(t,e,r){var n=i(t).getElementById(l(e,r));return y(n)?0:d(n)}function z(t){console.log(i(t))}function F(t){return i(t)instanceof CanvasRenderingContext2D}function N(t,e){i(t).strokeStyle=i(e)}function Y(t,e){i(t).fillStyle=i(e)}function K(t,e){i(t).lineWidth=e}function L(t){i(t).beginPath()}function Q(t){i(t).fill()}function Z(t){i(t).stroke()}function X(){return T((function(t,e,r,n,_,a){i(t).arc(e,r,n,_,a)}),arguments)}function H(t,e,r,n,_){i(t).fillRect(e,r,n,_)}function G(t,e,r,n,_){i(t).strokeRect(e,r,n,_)}function V(t){return i(t)instanceof HTMLCanvasElement}function tt(t,e){i(t).width=e>>>0}function et(t,e){i(t).height=e>>>0}function rt(){return T((function(t,e,r){var n=i(t).getContext(l(e,r));return y(n)?0:d(n)}),arguments)}function nt(t,e){return d(new Function(l(t,e)))}function _t(){return T((function(t,e){return d(i(t).call(i(e)))}),arguments)}function at(){return T((function(){return d(self.self)}),arguments)}function ct(){return T((function(){return d(window.window)}),arguments)}function it(){return T((function(){return d(globalThis.globalThis)}),arguments)}function ot(){return T((function(){return d(r.g.global)}),arguments)}function st(t){return void 0===i(t)}function ut(t){return d(i(t))}function pt(t,e){var r=h(b(i(e)),_.__wbindgen_malloc,_.__wbindgen_realloc),n=g;v()[t/4+1]=n,v()[t/4+0]=r}function lt(t,e){throw new Error(l(t,e))}}))},813:(t,e,r)=>{"use strict";var n=([n])=>r.v(e,t.id,"96b9a573923750a3ae94",{"./draught_bg.js":{__wbindgen_object_drop_ref:n.ug,__wbindgen_string_new:n.h4,__wbg_new_59cb74e423758ede:n.h9,__wbg_stack_558ba5917b466edd:n.Dz,__wbg_error_4bb6c2a97407129a:n.kF,__wbg_instanceof_Window_11e25482011fc506:n.s8,__wbg_document_5aff8cd83ef968f5:n.WB,__wbg_getElementById_b180ea4ada06a837:n.cP,__wbg_log_9a99fb1af846153b:n.a,__wbg_instanceof_CanvasRenderingContext2d_779e79c4121aa91b:n.l_,__wbg_setstrokeStyle_2939ee453716e462:n.U_,__wbg_setfillStyle_af790b5baf4d3210:n.EN,__wbg_setlineWidth_3e6b1837ae38d099:n.qu,__wbg_beginPath_2378575e37027ad3:n.Wg,__wbg_fill_558339447ed6ad43:n.B3,__wbg_stroke_c1e0313c58997dcf:n.I6,__wbg_arc_fffd87d9113dce32:n.Qb,__wbg_fillRect_46ffc8d2cef7e298:n.cI,__wbg_strokeRect_7ea34fad8a7f0fe2:n.QK,__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792:n.Md,__wbg_setwidth_f3c88eb520ba8d47:n.ox,__wbg_setheight_5a1abba41e35c42a:n.ES,__wbg_getContext_813df131fcbd6e91:n.Ae,__wbg_newnoargs_9fdd8f3961dd1bee:n.UL,__wbg_call_ba36642bd901572b:n.qw,__wbg_self_bb69a836a72ec6e9:n.tS,__wbg_window_3304fc4b414c9693:n.R$,__wbg_globalThis_e0d21cabc6630763:n.md,__wbg_global_8463719227271676:n.IF,__wbindgen_is_undefined:n.XP,__wbindgen_object_clone_ref:n.m_,__wbindgen_debug_string:n.fY,__wbindgen_throw:n.Or}});r.a(t,(t=>{var e=t([r(171)]);return e.then?e.then(n):n(e)}),1)},10:(t,e,r)=>{"use strict";r.a(t,(async t=>{r.r(e);var n=r(171),_=t([n]);n=(_.then?await _:_)[0];const a="human_turn.thinking",c="human_turn.from_selected";(0,n.wc)(),document.getElementById("status-p");const i=document.getElementById("status-d"),o=document.getElementById("team-p");let s=null,u=function(t,e="danger",r=!0){null!=s&&clearInterval(s),i.className=`alert alert-${e}`,i.innerText=t,i.hidden=!1,r&&(s=setTimeout((()=>{i.hidden=!0}),3e3))},p=a,l=new n.Ck(480,480,"game-canvas"),d=[],b=new n.lA(8,8,3,n.SZ.Black);b.set_painter(l),b.draw(),w();const g=document.getElementById("game-canvas");function w(){switch(b.current_turn()){case n.SZ.White:o.innerText="⚪ White ⚪";break;case n.SZ.Black:o.innerText="🔴 Black 🔴"}}g.addEventListener("click",(t=>{var e=function(t,e){var r=t.getBoundingClientRect();return{x:e.clientX-r.left,y:e.clientY-r.top}}(g,t);!function(t){switch(p){case a:if(b.current_cell_state(t).state!=n.i0.Occupied)return;if(b.current_cell_state(t).occupant.team!=b.current_turn())return;console.log("Your turn, first piece picked"),d.push(t),p=c;break;case c:if(b.current_cell_state(t).state!=n.i0.Empty)return;if(console.log("Your turn, first piece already picked, picking second"),d.push(t),2!=d.length)return u(`Error: wrong number of clicks to process ${d.length}`),void console.error(`Error: wrong number of clicks to process ${d.length}`);if(d[0].eq(d[1]))u("Move Cancelled");else switch(b.make_move(d[0],d[1])){case n.Tt.Allowed:break;case n.Tt.IllegalTrajectory:u("You can't move like that!");break;case n.Tt.JumpingSameTeam:u("You can't jump your own piece!");break;case n.Tt.NoJumpablePiece:u("There's nothing to jump!");break;case n.Tt.OccupiedDest:u("There's a piece there!");break;case n.Tt.OutOfBounds:u("That square's not on the board! (how have you managed that?)");break;case n.Tt.UnoccupiedSrc:u("There's no piece to move!");break;case n.Tt.Unplayable:u("That's not a playable square!");break;case n.Tt.WrongTeamSrc:u("That's not your piece!")}b.draw(),d=[],p=a;break;case"ai_turn":console.log("It's the AI's turn!")}w()}(new n.rh(Math.floor(e.y/480*8),Math.floor(e.x/480*8)))}))}))}}]); +(self.webpackChunkdraught=self.webpackChunkdraught||[]).push([[10],{171:(t,e,r)=>{"use strict";r.a(t,(async n=>{r.d(e,{wc:()=>x,SZ:()=>j,i0:()=>O,Tt:()=>E,rh:()=>q,lA:()=>B,Ck:()=>I,ug:()=>C,h4:()=>U,h9:()=>$,Dz:()=>M,kF:()=>D,s8:()=>J,WB:()=>P,cP:()=>R,a:()=>z,l_:()=>F,U_:()=>N,EN:()=>Y,qu:()=>K,Wg:()=>L,B3:()=>Q,I6:()=>Z,Qb:()=>X,cI:()=>H,QK:()=>G,Md:()=>V,ox:()=>tt,ES:()=>et,Ae:()=>rt,UL:()=>nt,qw:()=>_t,tS:()=>at,R$:()=>ct,md:()=>it,IF:()=>ot,XP:()=>st,m_:()=>ut,fY:()=>pt,Or:()=>lt});var _=r(813);t=r.hmd(t);var a=n([_]);_=(a.then?await a:a)[0];const c=new Array(32).fill(void 0);function i(t){return c[t]}c.push(void 0,null,!0,!1);let o=c.length;let s=new("undefined"==typeof TextDecoder?(0,t.require)("util").TextDecoder:TextDecoder)("utf-8",{ignoreBOM:!0,fatal:!0});s.decode();let u=null;function p(){return null!==u&&u.buffer===_.memory.buffer||(u=new Uint8Array(_.memory.buffer)),u}function l(t,e){return s.decode(p().subarray(t,t+e))}function d(t){o===c.length&&c.push(c.length+1);const e=o;return o=c[e],c[e]=t,e}function b(t){const e=typeof t;if("number"==e||"boolean"==e||null==t)return`${t}`;if("string"==e)return`"${t}"`;if("symbol"==e){const e=t.description;return null==e?"Symbol":`Symbol(${e})`}if("function"==e){const e=t.name;return"string"==typeof e&&e.length>0?`Function(${e})`:"Function"}if(Array.isArray(t)){const e=t.length;let r="[";e>0&&(r+=b(t[0]));for(let n=1;n1))return toString.call(t);if(n=r[1],"Object"==n)try{return"Object("+JSON.stringify(t)+")"}catch(t){return"Object"}return t instanceof Error?`${t.name}: ${t.message}\n${t.stack}`:n}let g=0,w=new("undefined"==typeof TextEncoder?(0,t.require)("util").TextEncoder:TextEncoder)("utf-8");const h="function"==typeof w.encodeInto?function(t,e){return w.encodeInto(t,e)}:function(t,e){const r=w.encode(t);return e.set(r),{read:t.length,written:r.length}};function f(t,e,r){if(void 0===r){const r=w.encode(t),n=e(r.length);return p().subarray(n,n+r.length).set(r),g=r.length,n}let n=t.length,_=e(n);const a=p();let c=0;for(;c127)break;a[_+c]=e}if(c!==n){0!==c&&(t=t.slice(c)),_=r(_,n,n=c+3*t.length);const e=p().subarray(_+c,_+n);c+=h(t,e).written}return g=c,_}let m=null;function v(){return null!==m&&m.buffer===_.memory.buffer||(m=new Int32Array(_.memory.buffer)),m}function y(t){return null==t}function k(t,e){if(!(t instanceof e))throw new Error(`expected instance of ${e.name}`);return t.ptr}function x(){_.init_wasm()}function T(t,e){try{return t.apply(this,e)}catch(t){_.__wbindgen_exn_store(d(t))}}Object.freeze({Move:0,0:"Move",Jump:1,1:"Jump"});const j=Object.freeze({Black:0,0:"Black",White:1,1:"White"}),O=(Object.freeze({Man:0,0:"Man",King:1,1:"King"}),Object.freeze({Empty:0,0:"Empty",Occupied:1,1:"Occupied",Unplayable:2,2:"Unplayable"})),E=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"});class S{static __wrap(t){const e=Object.create(S.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_board_free(t)}get width(){return _.__wbg_get_board_width(this.ptr)>>>0}set width(t){_.__wbg_set_board_width(this.ptr,t)}get height(){return _.__wbg_get_board_height(this.ptr)>>>0}set height(t){_.__wbg_set_board_height(this.ptr,t)}get current_turn(){return _.__wbg_get_board_current_turn(this.ptr)>>>0}set current_turn(t){_.__wbg_set_board_current_turn(this.ptr,t)}cell(t){var e=_.board_cell(this.ptr,t);return A.__wrap(e)}set_cell(t,e){k(e,A);var r=e.ptr;e.ptr=0,_.board_set_cell(this.ptr,t,r)}grid_cell(t){k(t,q);var e=t.ptr;t.ptr=0;var r=_.board_grid_cell(this.ptr,e);return A.__wrap(r)}cell_index(t,e){return _.board_cell_index(this.ptr,t,e)>>>0}cell_idx(t){k(t,q);var e=t.ptr;return t.ptr=0,_.board_cell_idx(this.ptr,e)>>>0}board_index(t){var e=_.board_board_index(this.ptr,t);return q.__wrap(e)}can_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;return e.ptr=0,_.board_can_move(this.ptr,r,n)>>>0}validate_man_move(t,e,r){k(t,q);var n=t.ptr;t.ptr=0,k(e,q);var a=e.ptr;e.ptr=0,k(r,W);var c=r.ptr;return r.ptr=0,_.board_validate_man_move(this.ptr,n,a,c)>>>0}validate_king_move(t,e,r){k(t,q);var n=t.ptr;t.ptr=0,k(e,q);var a=e.ptr;e.ptr=0,k(r,W);var c=r.ptr;return r.ptr=0,_.board_validate_king_move(this.ptr,n,a,c)>>>0}jumpee_idx(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;return e.ptr=0,_.board_jumpee_idx(this.ptr,r,n)>>>0}cells(){return _.board_cells(this.ptr)}num_cells(){return _.board_num_cells(this.ptr)>>>0}num_pieces(){return _.board_num_pieces(this.ptr)>>>0}num_player(t){return _.board_num_player(this.ptr,t)>>>0}score(){return _.board_score(this.ptr)}cell_state(t){return _.board_cell_state(this.ptr,t)>>>0}apply_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0;var a=_.board_apply_move(this.ptr,r,n);return S.__wrap(a)}apply_jump(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0;var a=_.board_apply_jump(this.ptr,r,n);return S.__wrap(a)}king_row_idx(){return _.board_king_row_idx(this.ptr)>>>0}static validate_jumpee(t,e){k(t,A);var r=t.ptr;t.ptr=0,k(e,W);var n=e.ptr;return e.ptr=0,_.board_validate_jumpee(r,n)>>>0}static check_jumpee_team(t,e){k(t,W);var r=t.ptr;t.ptr=0,k(e,W);var n=e.ptr;return e.ptr=0,0!==_.board_check_jumpee_team(r,n)}constructor(t,e,r){var n=_.board_new(t,e,r);return S.__wrap(n)}static init_game(t,e){k(t,S);var r=t.ptr;t.ptr=0;var n=_.board_init_game(r,e);return S.__wrap(n)}}class q{static __wrap(t){const e=Object.create(q.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_brdidx_free(t)}get row(){return _.__wbg_get_brdidx_row(this.ptr)>>>0}set row(t){_.__wbg_set_brdidx_row(this.ptr,t)}get col(){return _.__wbg_get_brdidx_col(this.ptr)>>>0}set col(t){_.__wbg_set_brdidx_col(this.ptr,t)}constructor(t,e){var r=_.brdidx_from(t,e);return q.__wrap(r)}eq(t){return k(t,q),0!==_.brdidx_eq(this.ptr,t.ptr)}}class B{static __wrap(t){const e=Object.create(B.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_game_free(t)}current_board_cells(){return _.game_current_board_cells(this.ptr)}current_board_len(){return _.game_current_board_len(this.ptr)>>>0}current_turn(){return _.game_current_turn(this.ptr)>>>0}current_cell_state(t){k(t,q);var e=_.game_current_cell_state(this.ptr,t.ptr);return A.__wrap(e)}set_selected(t){k(t,q),_.game_set_selected(this.ptr,t.ptr)}clear_selected(){_.game_clear_selected(this.ptr)}make_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;return e.ptr=0,_.game_make_move(this.ptr,r,n)>>>0}execute_move(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0,_.game_execute_move(this.ptr,r,n)}execute_jump(t,e){k(t,q);var r=t.ptr;t.ptr=0,k(e,q);var n=e.ptr;e.ptr=0,_.game_execute_jump(this.ptr,r,n)}push_new_board(t){k(t,S);var e=t.ptr;t.ptr=0,_.game_push_new_board(this.ptr,e)}set_current(t){k(t,S);var e=t.ptr;t.ptr=0,_.game_set_current(this.ptr,e)}constructor(t,e,r,n){var a=_.game_new(t,e,r,n);return B.__wrap(a)}static new_with_canvas(t,e,r,n,a,c,i){var o=f(a,_.__wbindgen_malloc,_.__wbindgen_realloc),s=g,u=_.game_new_with_canvas(t,e,r,n,o,s,c,i);return B.__wrap(u)}set_painter(t){k(t,I);var e=t.ptr;t.ptr=0,_.game_set_painter(this.ptr,e)}draw(){_.game_draw(this.ptr)}}class I{static __wrap(t){const e=Object.create(I.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_painter_free(t)}constructor(t,e,r){var n=f(r,_.__wbindgen_malloc,_.__wbindgen_realloc),a=g,c=_.painter_new(t,e,n,a);return I.__wrap(c)}static new_with_canvas(t,e,r){var n=_.painter_new_with_canvas(t,e,d(r));return I.__wrap(n)}set_square_outline(t){_.painter_set_square_outline(this.ptr,d(t))}set_outline_width(t){_.painter_set_outline_width(this.ptr,t)}set_draw_outline(t){_.painter_set_draw_outline(this.ptr,t)}reset_dimensions(){_.painter_reset_dimensions(this.ptr)}validate_board_dim(t){return k(t,S),0!==_.painter_validate_board_dim(this.ptr,t.ptr)}draw(t){k(t,S),_.painter_draw(this.ptr,t.ptr)}}class W{static __wrap(t){const e=Object.create(W.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_piece_free(t)}get team(){return _.__wbg_get_piece_team(this.ptr)>>>0}set team(t){_.__wbg_set_piece_team(this.ptr,t)}get strength(){return _.__wbg_get_piece_strength(this.ptr)>>>0}set strength(t){_.__wbg_set_piece_strength(this.ptr,t)}constructor(t,e){var r=_.piece_new(t,e);return W.__wrap(r)}}class A{static __wrap(t){const e=Object.create(A.prototype);return e.ptr=t,e}__destroy_into_raw(){const t=this.ptr;return this.ptr=0,t}free(){const t=this.__destroy_into_raw();_.__wbg_square_free(t)}get occupant(){var t=_.__wbg_get_square_occupant(this.ptr);return 0===t?void 0:W.__wrap(t)}set occupant(t){let e=0;y(t)||(k(t,W),e=t.ptr,t.ptr=0),_.__wbg_set_square_occupant(this.ptr,e)}get state(){return _.__wbg_get_square_state(this.ptr)>>>0}set state(t){_.__wbg_set_square_state(this.ptr,t)}constructor(t,e){let r=0;y(e)||(k(e,W),r=e.ptr,e.ptr=0);var n=_.square_new(t,r);return A.__wrap(n)}static pc(t,e){var r=_.square_pc(t,e);return A.__wrap(r)}static empty(){var t=_.square_empty();return A.__wrap(t)}static unplay(){var t=_.square_unplay();return A.__wrap(t)}}function C(t){!function(t){const e=i(t);(function(t){t<36||(c[t]=o,o=t)})(t)}(t)}function U(t,e){return d(l(t,e))}function $(){return d(new Error)}function M(t,e){var r=f(i(e).stack,_.__wbindgen_malloc,_.__wbindgen_realloc),n=g;v()[t/4+1]=n,v()[t/4+0]=r}function D(t,e){try{console.error(l(t,e))}finally{_.__wbindgen_free(t,e)}}function J(t){return i(t)instanceof Window}function P(t){var e=i(t).document;return y(e)?0:d(e)}function R(t,e,r){var n=i(t).getElementById(l(e,r));return y(n)?0:d(n)}function z(t){console.log(i(t))}function F(t){return i(t)instanceof CanvasRenderingContext2D}function N(t,e){i(t).strokeStyle=i(e)}function Y(t,e){i(t).fillStyle=i(e)}function K(t,e){i(t).lineWidth=e}function L(t){i(t).beginPath()}function Q(t){i(t).fill()}function Z(t){i(t).stroke()}function X(){return T((function(t,e,r,n,_,a){i(t).arc(e,r,n,_,a)}),arguments)}function H(t,e,r,n,_){i(t).fillRect(e,r,n,_)}function G(t,e,r,n,_){i(t).strokeRect(e,r,n,_)}function V(t){return i(t)instanceof HTMLCanvasElement}function tt(t,e){i(t).width=e>>>0}function et(t,e){i(t).height=e>>>0}function rt(){return T((function(t,e,r){var n=i(t).getContext(l(e,r));return y(n)?0:d(n)}),arguments)}function nt(t,e){return d(new Function(l(t,e)))}function _t(){return T((function(t,e){return d(i(t).call(i(e)))}),arguments)}function at(){return T((function(){return d(self.self)}),arguments)}function ct(){return T((function(){return d(window.window)}),arguments)}function it(){return T((function(){return d(globalThis.globalThis)}),arguments)}function ot(){return T((function(){return d(r.g.global)}),arguments)}function st(t){return void 0===i(t)}function ut(t){return d(i(t))}function pt(t,e){var r=f(b(i(e)),_.__wbindgen_malloc,_.__wbindgen_realloc),n=g;v()[t/4+1]=n,v()[t/4+0]=r}function lt(t,e){throw new Error(l(t,e))}}))},813:(t,e,r)=>{"use strict";var n=([n])=>r.v(e,t.id,"cc96734576b00860ab91",{"./draught_bg.js":{__wbindgen_object_drop_ref:n.ug,__wbindgen_string_new:n.h4,__wbg_new_59cb74e423758ede:n.h9,__wbg_stack_558ba5917b466edd:n.Dz,__wbg_error_4bb6c2a97407129a:n.kF,__wbg_instanceof_Window_11e25482011fc506:n.s8,__wbg_document_5aff8cd83ef968f5:n.WB,__wbg_getElementById_b180ea4ada06a837:n.cP,__wbg_log_9a99fb1af846153b:n.a,__wbg_instanceof_CanvasRenderingContext2d_779e79c4121aa91b:n.l_,__wbg_setstrokeStyle_2939ee453716e462:n.U_,__wbg_setfillStyle_af790b5baf4d3210:n.EN,__wbg_setlineWidth_3e6b1837ae38d099:n.qu,__wbg_beginPath_2378575e37027ad3:n.Wg,__wbg_fill_558339447ed6ad43:n.B3,__wbg_stroke_c1e0313c58997dcf:n.I6,__wbg_arc_fffd87d9113dce32:n.Qb,__wbg_fillRect_46ffc8d2cef7e298:n.cI,__wbg_strokeRect_7ea34fad8a7f0fe2:n.QK,__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792:n.Md,__wbg_setwidth_f3c88eb520ba8d47:n.ox,__wbg_setheight_5a1abba41e35c42a:n.ES,__wbg_getContext_813df131fcbd6e91:n.Ae,__wbg_newnoargs_9fdd8f3961dd1bee:n.UL,__wbg_call_ba36642bd901572b:n.qw,__wbg_self_bb69a836a72ec6e9:n.tS,__wbg_window_3304fc4b414c9693:n.R$,__wbg_globalThis_e0d21cabc6630763:n.md,__wbg_global_8463719227271676:n.IF,__wbindgen_is_undefined:n.XP,__wbindgen_object_clone_ref:n.m_,__wbindgen_debug_string:n.fY,__wbindgen_throw:n.Or}});r.a(t,(t=>{var e=t([r(171)]);return e.then?e.then(n):n(e)}),1)},10:(t,e,r)=>{"use strict";r.a(t,(async t=>{r.r(e);var n=r(171),_=t([n]);n=(_.then?await _:_)[0];const a="human_turn.thinking",c="human_turn.from_selected";(0,n.wc)(),document.getElementById("status-p");const i=document.getElementById("status-d"),o=document.getElementById("team-p");document.getElementById("startBtn").onclick=w;let s=null,u=function(t,e="danger",r=!0){null!=s&&clearInterval(s),i.className=`alert alert-${e}`,i.innerText=t,i.hidden=!1,r&&(s=setTimeout((()=>{i.hidden=!0}),3e3))},p=a,l=null,d=null,b=[];w();const g=document.getElementById("game-canvas");function w(){l=new n.lA(8,8,3,n.SZ.Black),d=new n.Ck(480,480,"game-canvas"),l.set_painter(d),l.draw(),h(),p=a}function h(){switch(l.current_turn()){case n.SZ.White:o.innerText="⚪ White ⚪";break;case n.SZ.Black:o.innerText="🔴 Black 🔴"}}g.addEventListener("click",(t=>{var e=function(t,e){var r=t.getBoundingClientRect();return{x:e.clientX-r.left,y:e.clientY-r.top}}(g,t);!function(t){switch(p){case a:if(l.current_cell_state(t).state!=n.i0.Occupied)return;if(l.current_cell_state(t).occupant.team!=l.current_turn())return;b.push(t),p=c,l.set_selected(t),l.draw();break;case c:if(!b[0].eq(t)){if(l.current_cell_state(t).state!=n.i0.Empty)return;if(b.push(t),2!=b.length)return u(`Error: wrong number of clicks to process ${b.length}`),void console.error(`Error: wrong number of clicks to process ${b.length}`);switch(l.make_move(b[0],b[1])){case n.Tt.Allowed:break;case n.Tt.IllegalTrajectory:u("You can't move like that!");break;case n.Tt.JumpingSameTeam:u("You can't jump your own piece!");break;case n.Tt.NoJumpablePiece:u("There's nothing to jump!");break;case n.Tt.OccupiedDest:u("There's a piece there!");break;case n.Tt.OutOfBounds:u("That square's not on the board! (how have you managed that?)");break;case n.Tt.UnoccupiedSrc:u("There's no piece to move!");break;case n.Tt.Unplayable:u("That's not a playable square!");break;case n.Tt.WrongTeamSrc:u("That's not your piece!")}}l.clear_selected(),l.draw(),b=[],p=a;break;case"ai_turn":console.log("It's the AI's turn!")}h()}(new n.rh(Math.floor(e.y/480*8),Math.floor(e.x/480*8)))}))}))}}]); //# sourceMappingURL=10.bootstrap.js.map \ No newline at end of file diff --git a/10.bootstrap.js.map b/10.bootstrap.js.map index 4fc3621..cc31d1c 100644 --- a/10.bootstrap.js.map +++ b/10.bootstrap.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://draught/../pkg/draught_bg.js","webpack://draught/./index.js"],"names":["heap","Array","fill","undefined","getObject","idx","push","heap_next","length","cachedTextDecoder","TextDecoder","module","require","ignoreBOM","fatal","decode","cachegetUint8Memory0","getUint8Memory0","buffer","Uint8Array","getStringFromWasm0","ptr","len","subarray","addHeapObject","obj","debugString","val","type","description","name","isArray","debug","i","builtInMatches","exec","toString","call","className","JSON","stringify","_","Error","message","stack","WASM_VECTOR_LEN","cachedTextEncoder","TextEncoder","encodeString","encodeInto","arg","view","buf","encode","set","read","written","passStringToWasm0","malloc","realloc","mem","offset","code","charCodeAt","slice","cachegetInt32Memory0","getInt32Memory0","Int32Array","isLikeNone","x","_assertClass","instance","klass","init_wasm","handleError","f","args","apply","this","e","Object","freeze","Move","Jump","Team","Black","White","SquareState","Man","King","Empty","Occupied","Unplayable","Moveable","Allowed","UnoccupiedSrc","OccupiedDest","OutOfBounds","WrongTeamSrc","IllegalTrajectory","NoJumpablePiece","JumpingSameTeam","Board","create","prototype","__destroy_into_raw","arg0","ret","Square","__wrap","square","ptr0","BrdIdx","row","col","from","to","ptr1","from_square_occupant","Piece","ptr2","team","jumpee","from_occ","width","height","current_turn","board","piece_rows","other","Game","first_turn","canvas_id","canvas_width","canvas_height","len0","value","Painter","canvas","strength","state","occupant","__wbindgen_object_drop_ref","dropObject","takeObject","__wbindgen_string_new","arg1","__wbg_new_59cb74e423758ede","__wbg_stack_558ba5917b466edd","__wbg_error_4bb6c2a97407129a","console","error","__wbg_instanceof_Window_11e25482011fc506","Window","__wbg_document_5aff8cd83ef968f5","document","__wbg_getElementById_b180ea4ada06a837","arg2","getElementById","__wbg_log_9a99fb1af846153b","log","__wbg_instanceof_CanvasRenderingContext2d_779e79c4121aa91b","CanvasRenderingContext2D","__wbg_setstrokeStyle_2939ee453716e462","strokeStyle","__wbg_setfillStyle_af790b5baf4d3210","fillStyle","__wbg_setlineWidth_3e6b1837ae38d099","lineWidth","__wbg_beginPath_2378575e37027ad3","beginPath","__wbg_fill_558339447ed6ad43","__wbg_stroke_c1e0313c58997dcf","stroke","__wbg_arc_fffd87d9113dce32","arg3","arg4","arg5","arc","arguments","__wbg_fillRect_46ffc8d2cef7e298","fillRect","__wbg_strokeRect_7ea34fad8a7f0fe2","strokeRect","__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792","HTMLCanvasElement","__wbg_setwidth_f3c88eb520ba8d47","__wbg_setheight_5a1abba41e35c42a","__wbg_getContext_813df131fcbd6e91","getContext","__wbg_newnoargs_9fdd8f3961dd1bee","Function","__wbg_call_ba36642bd901572b","__wbg_self_bb69a836a72ec6e9","self","__wbg_window_3304fc4b414c9693","window","__wbg_globalThis_e0d21cabc6630763","globalThis","__wbg_global_8463719227271676","g","global","__wbindgen_is_undefined","__wbindgen_object_clone_ref","__wbindgen_debug_string","__wbindgen_throw","GameState","statusAlert","teamText","statusTimeout","setStatus","txt","alertType","hide","clearInterval","innerText","hidden","setTimeout","current_state","painter","clicks","game","set_painter","draw","updateTeamText","addEventListener","event","mousepos","evt","rect","getBoundingClientRect","clientX","left","y","clientY","top","getMousePos","cell_coord","current_cell_state","eq","make_move","process_canvas_click","Math","floor"],"mappings":"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","file":"10.bootstrap.js","sourcesContent":["import * as wasm from './draught_bg.wasm';\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\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\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 !== wasm.memory.buffer) {\n cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\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 debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\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 !== wasm.memory.buffer) {\n cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);\n }\n return cachegetInt32Memory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\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*/\nexport function init_wasm() {\n wasm.init_wasm();\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_exn_store(addHeapObject(e));\n }\n}\n/**\n*/\nexport const MoveType = Object.freeze({ Move:0,\"0\":\"Move\",Jump:1,\"1\":\"Jump\", });\n/**\n*/\nexport const Team = Object.freeze({ Black:0,\"0\":\"Black\",White:1,\"1\":\"White\", });\n/**\n*/\nexport const Strength = Object.freeze({ Man:0,\"0\":\"Man\",King:1,\"1\":\"King\", });\n/**\n*/\nexport const SquareState = Object.freeze({ Empty:0,\"0\":\"Empty\",Occupied:1,\"1\":\"Occupied\",Unplayable:2,\"2\":\"Unplayable\", });\n/**\n*/\nexport const 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* Single state of a checkers board\n*/\nexport class 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 wasm.__wbg_board_free(ptr);\n }\n /**\n * @returns {number}\n */\n get width() {\n var ret = wasm.__wbg_get_board_width(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set width(arg0) {\n wasm.__wbg_set_board_width(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get height() {\n var ret = wasm.__wbg_get_board_height(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set height(arg0) {\n wasm.__wbg_set_board_height(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get current_turn() {\n var ret = wasm.__wbg_get_board_current_turn(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set current_turn(arg0) {\n wasm.__wbg_set_board_current_turn(this.ptr, arg0);\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 = wasm.board_cell(this.ptr, idx);\n return Square.__wrap(ret);\n }\n /**\n * Get a copy of a board square by 1D array index\n * @param {number} idx\n * @param {Square} square\n */\n set_cell(idx, square) {\n _assertClass(square, Square);\n var ptr0 = square.ptr;\n square.ptr = 0;\n wasm.board_set_cell(this.ptr, idx, ptr0);\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 = wasm.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 = wasm.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 = wasm.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 = wasm.board_board_index(this.ptr, idx);\n return BrdIdx.__wrap(ret);\n }\n /**\n * Check whether a move given by source and destination indices is legal\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 = wasm.board_can_move(this.ptr, ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {Piece} from_square_occupant\n * @returns {number}\n */\n validate_man_move(from, to, 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 = wasm.board_validate_man_move(this.ptr, ptr0, ptr1, ptr2);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {Piece} from_square_occupant\n * @returns {number}\n */\n validate_king_move(from, to, 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 = wasm.board_validate_king_move(this.ptr, ptr0, ptr1, ptr2);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {number}\n */\n jumpee_idx(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 = wasm.board_jumpee_idx(this.ptr, ptr0, ptr1);\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 = wasm.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 = wasm.board_num_cells(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get the number of remaining pieces\n * @returns {number}\n */\n num_pieces() {\n var ret = wasm.board_num_pieces(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get the number of remaining pieces for a player\n * @param {number} team\n * @returns {number}\n */\n num_player(team) {\n var ret = wasm.board_num_player(this.ptr, team);\n return ret >>> 0;\n }\n /**\n * Get the score value, Black - White pieces\n * @returns {number}\n */\n score() {\n var ret = wasm.board_score(this.ptr);\n return ret;\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 = wasm.board_cell_state(this.ptr, idx);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {Board}\n */\n apply_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 = wasm.board_apply_move(this.ptr, ptr0, ptr1);\n return Board.__wrap(ret);\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {Board}\n */\n apply_jump(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 = wasm.board_apply_jump(this.ptr, ptr0, ptr1);\n return Board.__wrap(ret);\n }\n /**\n * Unwrap the jumpee piece from the square and [`Board::check_jumpee_team`] with [`Moveable`] response\n * @param {Square} jumpee\n * @param {Piece} from_occ\n * @returns {number}\n */\n static validate_jumpee(jumpee, from_occ) {\n _assertClass(jumpee, Square);\n var ptr0 = jumpee.ptr;\n jumpee.ptr = 0;\n _assertClass(from_occ, Piece);\n var ptr1 = from_occ.ptr;\n from_occ.ptr = 0;\n var ret = wasm.board_validate_jumpee(ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * Check that the source piece and the jumpee are of opposing teams\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 = wasm.board_check_jumpee_team(ptr0, ptr1);\n return ret !== 0;\n }\n /**\n * Initialise a game board without game pieces\n * @param {number} width\n * @param {number} height\n * @param {number} current_turn\n */\n constructor(width, height, current_turn) {\n var ret = wasm.board_new(width, height, current_turn);\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 * @param {number} piece_rows\n * @returns {Board}\n */\n static init_game(board, piece_rows) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n var ret = wasm.board_init_game(ptr0, piece_rows);\n return Board.__wrap(ret);\n }\n}\n/**\n* Rank 2 tensor index to identify a board square by row and column\n*/\nexport class 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 wasm.__wbg_brdidx_free(ptr);\n }\n /**\n * @returns {number}\n */\n get row() {\n var ret = wasm.__wbg_get_brdidx_row(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set row(arg0) {\n wasm.__wbg_set_brdidx_row(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get col() {\n var ret = wasm.__wbg_get_brdidx_col(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set col(arg0) {\n wasm.__wbg_set_brdidx_col(this.ptr, arg0);\n }\n /**\n * @param {number} row\n * @param {number} col\n */\n constructor(row, col) {\n var ret = wasm.brdidx_from(row, col);\n return BrdIdx.__wrap(ret);\n }\n /**\n * @param {BrdIdx} other\n * @returns {boolean}\n */\n eq(other) {\n _assertClass(other, BrdIdx);\n var ret = wasm.brdidx_eq(this.ptr, other.ptr);\n return ret !== 0;\n }\n}\n/**\n* Root-level structure for managing the game as a collection of board states\n*/\nexport class Game {\n\n static __wrap(ptr) {\n const obj = Object.create(Game.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 wasm.__wbg_game_free(ptr);\n }\n /**\n * Get pointer to current board's squares\n * @returns {number}\n */\n current_board_cells() {\n var ret = wasm.game_current_board_cells(this.ptr);\n return ret;\n }\n /**\n * Get pointer to current board's squares\n * @returns {number}\n */\n current_board_len() {\n var ret = wasm.game_current_board_len(this.ptr);\n return ret >>> 0;\n }\n /**\n * Current turn's team\n * @returns {number}\n */\n current_turn() {\n var ret = wasm.game_current_turn(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} idx\n * @returns {Square}\n */\n current_cell_state(idx) {\n _assertClass(idx, BrdIdx);\n var ret = wasm.game_current_cell_state(this.ptr, idx.ptr);\n return Square.__wrap(ret);\n }\n /**\n * Attempt to make a move given a source and destination index\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {number}\n */\n make_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 = wasm.game_make_move(this.ptr, ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * Update board state with given move and push new board into current state\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n */\n execute_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 wasm.game_execute_move(this.ptr, ptr0, ptr1);\n }\n /**\n * Update board state with given jump move and push new board into current state\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n */\n execute_jump(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 wasm.game_execute_jump(this.ptr, ptr0, ptr1);\n }\n /**\n * Push current board into the previous turns and set given board to current\n * @param {Board} board\n */\n push_new_board(board) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n wasm.game_push_new_board(this.ptr, ptr0);\n }\n /**\n * Set current board to given\n * @param {Board} board\n */\n set_current(board) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n wasm.game_set_current(this.ptr, ptr0);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @param {number} piece_rows\n * @param {number} first_turn\n */\n constructor(width, height, piece_rows, first_turn) {\n var ret = wasm.game_new(width, height, piece_rows, first_turn);\n return Game.__wrap(ret);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @param {number} piece_rows\n * @param {number} first_turn\n * @param {string} canvas_id\n * @param {number} canvas_width\n * @param {number} canvas_height\n * @returns {Game}\n */\n static new_with_canvas(width, height, piece_rows, first_turn, canvas_id, canvas_width, canvas_height) {\n var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ret = wasm.game_new_with_canvas(width, height, piece_rows, first_turn, ptr0, len0, canvas_width, canvas_height);\n return Game.__wrap(ret);\n }\n /**\n * @param {Painter} value\n */\n set_painter(value) {\n _assertClass(value, Painter);\n var ptr0 = value.ptr;\n value.ptr = 0;\n wasm.game_set_painter(this.ptr, ptr0);\n }\n /**\n */\n draw() {\n wasm.game_draw(this.ptr);\n }\n}\n/**\n* Used to paint boards onto HTML canvases\n*/\nexport class Painter {\n\n static __wrap(ptr) {\n const obj = Object.create(Painter.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 wasm.__wbg_painter_free(ptr);\n }\n /**\n * Default constructor which queries for canvas by ID\n * @param {number} width\n * @param {number} height\n * @param {string} canvas_id\n */\n constructor(width, height, canvas_id) {\n var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ret = wasm.painter_new(width, height, ptr0, len0);\n return Painter.__wrap(ret);\n }\n /**\n * Constructor with given canvas element\n * @param {number} width\n * @param {number} height\n * @param {HTMLCanvasElement} canvas\n * @returns {Painter}\n */\n static new_with_canvas(width, height, canvas) {\n var ret = wasm.painter_new_with_canvas(width, height, addHeapObject(canvas));\n return Painter.__wrap(ret);\n }\n /**\n * Set new square outline colour value\n * @param {any} value\n */\n set_square_outline(value) {\n wasm.painter_set_square_outline(this.ptr, addHeapObject(value));\n }\n /**\n * Set new line width for outlining squares\n * @param {number} value\n */\n set_outline_width(value) {\n wasm.painter_set_outline_width(this.ptr, value);\n }\n /**\n * Set whether squares are outlined\n * @param {boolean} value\n */\n set_draw_outline(value) {\n wasm.painter_set_draw_outline(this.ptr, value);\n }\n /**\n * Reset the canvas dimensions to the given width and height\n */\n reset_dimensions() {\n wasm.painter_reset_dimensions(this.ptr);\n }\n /**\n * Check whether given canvas dimensions divide evenly by given board dimenions\n * @param {Board} board\n * @returns {boolean}\n */\n validate_board_dim(board) {\n _assertClass(board, Board);\n var ret = wasm.painter_validate_board_dim(this.ptr, board.ptr);\n return ret !== 0;\n }\n /**\n * Draw a board onto the canvas\n * @param {Board} board\n */\n draw(board) {\n _assertClass(board, Board);\n wasm.painter_draw(this.ptr, board.ptr);\n }\n}\n/**\n* Game piece given by its team and strength (normal or kinged)\n*/\nexport class Piece {\n\n static __wrap(ptr) {\n const obj = Object.create(Piece.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 wasm.__wbg_piece_free(ptr);\n }\n /**\n * @returns {number}\n */\n get team() {\n var ret = wasm.__wbg_get_piece_team(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set team(arg0) {\n wasm.__wbg_set_piece_team(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get strength() {\n var ret = wasm.__wbg_get_piece_strength(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set strength(arg0) {\n wasm.__wbg_set_piece_strength(this.ptr, arg0);\n }\n /**\n * @param {number} team\n * @param {number} strength\n */\n constructor(team, strength) {\n var ret = wasm.piece_new(team, strength);\n return Piece.__wrap(ret);\n }\n}\n/**\n*/\nexport class Player {\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 wasm.__wbg_player_free(ptr);\n }\n}\n/**\n* Board squares given by a state and a possible occupying game piece\n*/\nexport class 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 wasm.__wbg_square_free(ptr);\n }\n /**\n * Game piece if square is occupied\n * @returns {Piece | undefined}\n */\n get occupant() {\n var ret = wasm.__wbg_get_square_occupant(this.ptr);\n return ret === 0 ? undefined : Piece.__wrap(ret);\n }\n /**\n * Game piece if square is occupied\n * @param {Piece | undefined} arg0\n */\n set occupant(arg0) {\n let ptr0 = 0;\n if (!isLikeNone(arg0)) {\n _assertClass(arg0, Piece);\n ptr0 = arg0.ptr;\n arg0.ptr = 0;\n }\n wasm.__wbg_set_square_occupant(this.ptr, ptr0);\n }\n /**\n * Description of whether the square is occupied or an unplayable, i.e. off-lattice square\n * @returns {number}\n */\n get state() {\n var ret = wasm.__wbg_get_square_state(this.ptr);\n return ret >>> 0;\n }\n /**\n * Description of whether the square is occupied or an unplayable, i.e. off-lattice square\n * @param {number} arg0\n */\n set state(arg0) {\n wasm.__wbg_set_square_state(this.ptr, arg0);\n }\n /**\n * Standard constructor function to form square from state and occupant\n * @param {number} state\n * @param {Piece | undefined} occupant\n */\n constructor(state, occupant) {\n let ptr0 = 0;\n if (!isLikeNone(occupant)) {\n _assertClass(occupant, Piece);\n ptr0 = occupant.ptr;\n occupant.ptr = 0;\n }\n var ret = wasm.square_new(state, ptr0);\n return Square.__wrap(ret);\n }\n /**\n * Helper function for a well-formed piece square by team and strength\n * @param {number} team\n * @param {number} strength\n * @returns {Square}\n */\n static pc(team, strength) {\n var ret = wasm.square_pc(team, strength);\n return Square.__wrap(ret);\n }\n /**\n * Helper function for a well-formed empty square\n * @returns {Square}\n */\n static empty() {\n var ret = wasm.square_empty();\n return Square.__wrap(ret);\n }\n /**\n * Helper function for a well-formed unplayable square\n * @returns {Square}\n */\n static unplay() {\n var ret = wasm.square_unplay();\n return Square.__wrap(ret);\n }\n}\n\nexport function __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nexport function __wbindgen_string_new(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nexport function __wbg_new_59cb74e423758ede() {\n var ret = new Error();\n return addHeapObject(ret);\n};\n\nexport function __wbg_stack_558ba5917b466edd(arg0, arg1) {\n var ret = getObject(arg1).stack;\n var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nexport function __wbg_error_4bb6c2a97407129a(arg0, arg1) {\n try {\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(arg0, arg1);\n }\n};\n\nexport function __wbg_instanceof_Window_11e25482011fc506(arg0) {\n var ret = getObject(arg0) instanceof Window;\n return ret;\n};\n\nexport function __wbg_document_5aff8cd83ef968f5(arg0) {\n var ret = getObject(arg0).document;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nexport function __wbg_getElementById_b180ea4ada06a837(arg0, arg1, arg2) {\n var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2));\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nexport function __wbg_log_9a99fb1af846153b(arg0) {\n console.log(getObject(arg0));\n};\n\nexport function __wbg_instanceof_CanvasRenderingContext2d_779e79c4121aa91b(arg0) {\n var ret = getObject(arg0) instanceof CanvasRenderingContext2D;\n return ret;\n};\n\nexport function __wbg_setstrokeStyle_2939ee453716e462(arg0, arg1) {\n getObject(arg0).strokeStyle = getObject(arg1);\n};\n\nexport function __wbg_setfillStyle_af790b5baf4d3210(arg0, arg1) {\n getObject(arg0).fillStyle = getObject(arg1);\n};\n\nexport function __wbg_setlineWidth_3e6b1837ae38d099(arg0, arg1) {\n getObject(arg0).lineWidth = arg1;\n};\n\nexport function __wbg_beginPath_2378575e37027ad3(arg0) {\n getObject(arg0).beginPath();\n};\n\nexport function __wbg_fill_558339447ed6ad43(arg0) {\n getObject(arg0).fill();\n};\n\nexport function __wbg_stroke_c1e0313c58997dcf(arg0) {\n getObject(arg0).stroke();\n};\n\nexport function __wbg_arc_fffd87d9113dce32() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5) {\n getObject(arg0).arc(arg1, arg2, arg3, arg4, arg5);\n}, arguments) };\n\nexport function __wbg_fillRect_46ffc8d2cef7e298(arg0, arg1, arg2, arg3, arg4) {\n getObject(arg0).fillRect(arg1, arg2, arg3, arg4);\n};\n\nexport function __wbg_strokeRect_7ea34fad8a7f0fe2(arg0, arg1, arg2, arg3, arg4) {\n getObject(arg0).strokeRect(arg1, arg2, arg3, arg4);\n};\n\nexport function __wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792(arg0) {\n var ret = getObject(arg0) instanceof HTMLCanvasElement;\n return ret;\n};\n\nexport function __wbg_setwidth_f3c88eb520ba8d47(arg0, arg1) {\n getObject(arg0).width = arg1 >>> 0;\n};\n\nexport function __wbg_setheight_5a1abba41e35c42a(arg0, arg1) {\n getObject(arg0).height = arg1 >>> 0;\n};\n\nexport function __wbg_getContext_813df131fcbd6e91() { return handleError(function (arg0, arg1, arg2) {\n var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2));\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_newnoargs_9fdd8f3961dd1bee(arg0, arg1) {\n var ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nexport function __wbg_call_ba36642bd901572b() { return handleError(function (arg0, arg1) {\n var ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_self_bb69a836a72ec6e9() { return handleError(function () {\n var ret = self.self;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_window_3304fc4b414c9693() { return handleError(function () {\n var ret = window.window;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_globalThis_e0d21cabc6630763() { return handleError(function () {\n var ret = globalThis.globalThis;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_global_8463719227271676() { return handleError(function () {\n var ret = global.global;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbindgen_is_undefined(arg0) {\n var ret = getObject(arg0) === undefined;\n return ret;\n};\n\nexport function __wbindgen_object_clone_ref(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nexport function __wbindgen_debug_string(arg0, arg1) {\n var ret = debugString(getObject(arg1));\n var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nexport function __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n","import { Game, Board, BrdIdx, Painter, Team, init_wasm, Moveable, SquareState, Square } from \"draught\";\n// import { memory } from \"draught/draught_bg.wasm\";\n\n///////////////////\n// CONSTS\n///////////////////\n\nconst CANVAS_WIDTH = 480;\nconst CANVAS_HEIGHT = 480;\n\nconst BOARD_WIDTH = 8;\nconst BOARD_HEIGHT = 8;\n\nconst PIECE_ROWS = 3;\n\nconst STATUS_TIMEOUT = 3000;\n\nconst GameState = {\n HUMAN_TURN: {\n THINKING: \"human_turn.thinking\",\n FROM_SELECTED: \"human_turn.from_selected\"\n },\n AI_TURN: \"ai_turn\"\n}\n\n//////////////////\n// GAME STUFF\n//////////////////\n\ninit_wasm();\n\n// let board = new Board(BOARD_WIDTH, BOARD_HEIGHT, Team.Black);\n\nconst statusText = document.getElementById(\"status-p\");\nconst statusAlert = document.getElementById(\"status-d\");\nconst teamText = document.getElementById(\"team-p\");\n\n// const startBtn = document.getElementById(\"startBtn\");\n// startBtn.onclick = start_game;\n\nlet statusTimeout = null;\nlet setStatus = setStatusAlert;\n\nlet current_state = GameState.HUMAN_TURN.THINKING;\nlet painter = new Painter(CANVAS_WIDTH, CANVAS_HEIGHT, \"game-canvas\");\n// painter.draw(board);\n\nlet clicks = [];\n\nlet game = new Game(BOARD_WIDTH, BOARD_HEIGHT, PIECE_ROWS, Team.Black);\ngame.set_painter(painter);\ngame.draw();\n\nupdateTeamText();\n\n/////////////////\n// CANVAS\n/////////////////\n\nconst canvas = document.getElementById(\"game-canvas\");\ncanvas.addEventListener(\"click\", (event) => {\n var mousepos = getMousePos(canvas, event);\n // console.log(mousepos);\n var cell = new BrdIdx(\n Math.floor((mousepos.y / CANVAS_HEIGHT) * BOARD_HEIGHT),\n Math.floor((mousepos.x / CANVAS_WIDTH) * BOARD_WIDTH),\n );\n // console.log(cell);\n process_canvas_click(cell);\n})\n\n////////////////\n// FUNCS\n////////////////\n\nfunction start_game() {\n game = new Game(BOARD_WIDTH, BOARD_HEIGHT, PIECE_ROWS, Team.Black);\n game.set_painter(painter);\n game.draw();\n\n updateTeamText();\n current_state = GameState.HUMAN_TURN.THINKING;\n}\n\nfunction process_canvas_click(cell_coord) {\n\n switch(current_state) {\n case GameState.HUMAN_TURN.THINKING:\n if (game.current_cell_state(cell_coord).state != SquareState.Occupied ) {\n return;\n }\n\n if (game.current_cell_state(cell_coord).occupant.team != game.current_turn() ) {\n return;\n }\n\n console.log(\"Your turn, first piece picked\");\n\n clicks.push(cell_coord);\n current_state = GameState.HUMAN_TURN.FROM_SELECTED; \n \n break;\n case GameState.HUMAN_TURN.FROM_SELECTED:\n if (game.current_cell_state(cell_coord).state != SquareState.Empty ) {\n return;\n }\n\n console.log(\"Your turn, first piece already picked, picking second\");\n\n clicks.push(cell_coord);\n\n if (clicks.length != 2) {\n setStatus(`Error: wrong number of clicks to process ${clicks.length}`);\n console.error(`Error: wrong number of clicks to process ${clicks.length}`);\n\n return;\n }\n\n if (clicks[0].eq(clicks[1])) {\n setStatus(\"Move Cancelled\");\n } else {\n\n let status = game.make_move(clicks[0], clicks[1]);\n\n switch(status) {\n case Moveable.Allowed:\n break;\n case Moveable.IllegalTrajectory:\n setStatus(\"You can't move like that!\");\n break;\n case Moveable.JumpingSameTeam:\n setStatus(\"You can't jump your own piece!\");\n break;\n case Moveable.NoJumpablePiece:\n setStatus(\"There's nothing to jump!\");\n break;\n case Moveable.OccupiedDest:\n setStatus(\"There's a piece there!\");\n break;\n case Moveable.OutOfBounds:\n setStatus(\"That square's not on the board! (how have you managed that?)\");\n break;\n case Moveable.UnoccupiedSrc:\n setStatus(\"There's no piece to move!\");\n break;\n case Moveable.Unplayable:\n setStatus(\"That's not a playable square!\");\n break;\n case Moveable.WrongTeamSrc:\n setStatus(\"That's not your piece!\");\n break;\n }\n \n }\n\n game.draw();\n clicks = [];\n current_state = GameState.HUMAN_TURN.THINKING;\n \n break;\n case GameState.AI_TURN:\n console.log(\"It's the AI's turn!\");\n break;\n }\n\n updateTeamText();\n}\n\nfunction getMousePos(canvas, evt) {\n var rect = canvas.getBoundingClientRect();\n return {\n x: evt.clientX - rect.left,\n y: evt.clientY - rect.top\n };\n}\n\nfunction setStatusText(txt, hide = true) {\n if(statusTimeout != null) {\n clearInterval(statusTimeout);\n }\n\n statusText.innerText = txt;\n\n if(hide) {\n statusTimeout = setTimeout(() => {\n statusText.innerText = \"\";\n }, STATUS_TIMEOUT);\n }\n}\n\nfunction setStatusAlert(txt, alertType = \"danger\", hide = true) {\n if(statusTimeout != null) {\n clearInterval(statusTimeout);\n }\n\n statusAlert.className = `alert alert-${alertType}`;\n statusAlert.innerText = txt;\n statusAlert.hidden = false;\n\n if(hide) {\n statusTimeout = setTimeout(() => {\n statusAlert.hidden = true;\n }, STATUS_TIMEOUT);\n }\n}\n\nfunction updateTeamText(){\n let team = game.current_turn();\n switch(team) {\n case Team.White:\n teamText.innerText = \"⚪ White ⚪\";\n break;\n case Team.Black:\n teamText.innerText = \"🔴 Black 🔴\";\n break;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://draught/../pkg/draught_bg.js","webpack://draught/./index.js"],"names":["heap","Array","fill","undefined","getObject","idx","push","heap_next","length","cachedTextDecoder","TextDecoder","module","require","ignoreBOM","fatal","decode","cachegetUint8Memory0","getUint8Memory0","buffer","Uint8Array","getStringFromWasm0","ptr","len","subarray","addHeapObject","obj","debugString","val","type","description","name","isArray","debug","i","builtInMatches","exec","toString","call","className","JSON","stringify","_","Error","message","stack","WASM_VECTOR_LEN","cachedTextEncoder","TextEncoder","encodeString","encodeInto","arg","view","buf","encode","set","read","written","passStringToWasm0","malloc","realloc","mem","offset","code","charCodeAt","slice","cachegetInt32Memory0","getInt32Memory0","Int32Array","isLikeNone","x","_assertClass","instance","klass","init_wasm","handleError","f","args","apply","this","e","Object","freeze","Move","Jump","Team","Black","White","SquareState","Man","King","Empty","Occupied","Unplayable","Moveable","Allowed","UnoccupiedSrc","OccupiedDest","OutOfBounds","WrongTeamSrc","IllegalTrajectory","NoJumpablePiece","JumpingSameTeam","Board","create","prototype","__destroy_into_raw","arg0","ret","Square","__wrap","square","ptr0","BrdIdx","row","col","from","to","ptr1","from_square_occupant","Piece","ptr2","team","jumpee","from_occ","width","height","current_turn","board","piece_rows","other","Game","first_turn","canvas_id","canvas_width","canvas_height","len0","value","Painter","canvas","strength","state","occupant","__wbindgen_object_drop_ref","dropObject","takeObject","__wbindgen_string_new","arg1","__wbg_new_59cb74e423758ede","__wbg_stack_558ba5917b466edd","__wbg_error_4bb6c2a97407129a","console","error","__wbg_instanceof_Window_11e25482011fc506","Window","__wbg_document_5aff8cd83ef968f5","document","__wbg_getElementById_b180ea4ada06a837","arg2","getElementById","__wbg_log_9a99fb1af846153b","log","__wbg_instanceof_CanvasRenderingContext2d_779e79c4121aa91b","CanvasRenderingContext2D","__wbg_setstrokeStyle_2939ee453716e462","strokeStyle","__wbg_setfillStyle_af790b5baf4d3210","fillStyle","__wbg_setlineWidth_3e6b1837ae38d099","lineWidth","__wbg_beginPath_2378575e37027ad3","beginPath","__wbg_fill_558339447ed6ad43","__wbg_stroke_c1e0313c58997dcf","stroke","__wbg_arc_fffd87d9113dce32","arg3","arg4","arg5","arc","arguments","__wbg_fillRect_46ffc8d2cef7e298","fillRect","__wbg_strokeRect_7ea34fad8a7f0fe2","strokeRect","__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792","HTMLCanvasElement","__wbg_setwidth_f3c88eb520ba8d47","__wbg_setheight_5a1abba41e35c42a","__wbg_getContext_813df131fcbd6e91","getContext","__wbg_newnoargs_9fdd8f3961dd1bee","Function","__wbg_call_ba36642bd901572b","__wbg_self_bb69a836a72ec6e9","self","__wbg_window_3304fc4b414c9693","window","__wbg_globalThis_e0d21cabc6630763","globalThis","__wbg_global_8463719227271676","g","global","__wbindgen_is_undefined","__wbindgen_object_clone_ref","__wbindgen_debug_string","__wbindgen_throw","GameState","statusAlert","teamText","onclick","start_game","statusTimeout","setStatus","txt","alertType","hide","clearInterval","innerText","hidden","setTimeout","current_state","game","painter","clicks","set_painter","draw","updateTeamText","addEventListener","event","mousepos","evt","rect","getBoundingClientRect","clientX","left","y","clientY","top","getMousePos","cell_coord","current_cell_state","set_selected","eq","make_move","clear_selected","process_canvas_click","Math","floor"],"mappings":"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","file":"10.bootstrap.js","sourcesContent":["import * as wasm from './draught_bg.wasm';\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\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\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 !== wasm.memory.buffer) {\n cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\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 debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\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 !== wasm.memory.buffer) {\n cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);\n }\n return cachegetInt32Memory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\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*/\nexport function init_wasm() {\n wasm.init_wasm();\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_exn_store(addHeapObject(e));\n }\n}\n/**\n*/\nexport const MoveType = Object.freeze({ Move:0,\"0\":\"Move\",Jump:1,\"1\":\"Jump\", });\n/**\n*/\nexport const Team = Object.freeze({ Black:0,\"0\":\"Black\",White:1,\"1\":\"White\", });\n/**\n*/\nexport const Strength = Object.freeze({ Man:0,\"0\":\"Man\",King:1,\"1\":\"King\", });\n/**\n*/\nexport const SquareState = Object.freeze({ Empty:0,\"0\":\"Empty\",Occupied:1,\"1\":\"Occupied\",Unplayable:2,\"2\":\"Unplayable\", });\n/**\n*/\nexport const 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* Single state of a checkers board\n*/\nexport class 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 wasm.__wbg_board_free(ptr);\n }\n /**\n * @returns {number}\n */\n get width() {\n var ret = wasm.__wbg_get_board_width(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set width(arg0) {\n wasm.__wbg_set_board_width(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get height() {\n var ret = wasm.__wbg_get_board_height(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set height(arg0) {\n wasm.__wbg_set_board_height(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get current_turn() {\n var ret = wasm.__wbg_get_board_current_turn(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set current_turn(arg0) {\n wasm.__wbg_set_board_current_turn(this.ptr, arg0);\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 = wasm.board_cell(this.ptr, idx);\n return Square.__wrap(ret);\n }\n /**\n * Get a copy of a board square by 1D array index\n * @param {number} idx\n * @param {Square} square\n */\n set_cell(idx, square) {\n _assertClass(square, Square);\n var ptr0 = square.ptr;\n square.ptr = 0;\n wasm.board_set_cell(this.ptr, idx, ptr0);\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 = wasm.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 = wasm.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 = wasm.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 = wasm.board_board_index(this.ptr, idx);\n return BrdIdx.__wrap(ret);\n }\n /**\n * Check whether a move given by source and destination indices is legal\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 = wasm.board_can_move(this.ptr, ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {Piece} from_square_occupant\n * @returns {number}\n */\n validate_man_move(from, to, 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 = wasm.board_validate_man_move(this.ptr, ptr0, ptr1, ptr2);\n return ret >>> 0;\n }\n /**\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @param {Piece} from_square_occupant\n * @returns {number}\n */\n validate_king_move(from, to, 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 = wasm.board_validate_king_move(this.ptr, ptr0, ptr1, ptr2);\n return ret >>> 0;\n }\n /**\n * Get cell index of jumpee square given from and to locations\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {number}\n */\n jumpee_idx(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 = wasm.board_jumpee_idx(this.ptr, ptr0, ptr1);\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 = wasm.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 = wasm.board_num_cells(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get the number of remaining pieces\n * @returns {number}\n */\n num_pieces() {\n var ret = wasm.board_num_pieces(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get the number of remaining pieces for a player\n * @param {number} team\n * @returns {number}\n */\n num_player(team) {\n var ret = wasm.board_num_player(this.ptr, team);\n return ret >>> 0;\n }\n /**\n * Get the score value, Black - White pieces\n * @returns {number}\n */\n score() {\n var ret = wasm.board_score(this.ptr);\n return ret;\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 = wasm.board_cell_state(this.ptr, idx);\n return ret >>> 0;\n }\n /**\n * Get new board derived from current with given move applied\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {Board}\n */\n apply_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 = wasm.board_apply_move(this.ptr, ptr0, ptr1);\n return Board.__wrap(ret);\n }\n /**\n * Get new board derived from current with given jump applied\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {Board}\n */\n apply_jump(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 = wasm.board_apply_jump(this.ptr, ptr0, ptr1);\n return Board.__wrap(ret);\n }\n /**\n * Get row index for current team, top row for black, bottom row for white\n * @returns {number}\n */\n king_row_idx() {\n var ret = wasm.board_king_row_idx(this.ptr);\n return ret >>> 0;\n }\n /**\n * Unwrap the jumpee piece from the square and [`Board::check_jumpee_team`] with [`Moveable`] response\n * @param {Square} jumpee\n * @param {Piece} from_occ\n * @returns {number}\n */\n static validate_jumpee(jumpee, from_occ) {\n _assertClass(jumpee, Square);\n var ptr0 = jumpee.ptr;\n jumpee.ptr = 0;\n _assertClass(from_occ, Piece);\n var ptr1 = from_occ.ptr;\n from_occ.ptr = 0;\n var ret = wasm.board_validate_jumpee(ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * Check that the source piece and the jumpee are of opposing teams\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 = wasm.board_check_jumpee_team(ptr0, ptr1);\n return ret !== 0;\n }\n /**\n * Initialise a game board without game pieces\n * @param {number} width\n * @param {number} height\n * @param {number} current_turn\n */\n constructor(width, height, current_turn) {\n var ret = wasm.board_new(width, height, current_turn);\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 * @param {number} piece_rows\n * @returns {Board}\n */\n static init_game(board, piece_rows) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n var ret = wasm.board_init_game(ptr0, piece_rows);\n return Board.__wrap(ret);\n }\n}\n/**\n* Rank 2 tensor index to identify a board square by row and column\n*/\nexport class 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 wasm.__wbg_brdidx_free(ptr);\n }\n /**\n * @returns {number}\n */\n get row() {\n var ret = wasm.__wbg_get_brdidx_row(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set row(arg0) {\n wasm.__wbg_set_brdidx_row(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get col() {\n var ret = wasm.__wbg_get_brdidx_col(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set col(arg0) {\n wasm.__wbg_set_brdidx_col(this.ptr, arg0);\n }\n /**\n * @param {number} row\n * @param {number} col\n */\n constructor(row, col) {\n var ret = wasm.brdidx_from(row, col);\n return BrdIdx.__wrap(ret);\n }\n /**\n * @param {BrdIdx} other\n * @returns {boolean}\n */\n eq(other) {\n _assertClass(other, BrdIdx);\n var ret = wasm.brdidx_eq(this.ptr, other.ptr);\n return ret !== 0;\n }\n}\n/**\n* Root-level structure for managing the game as a collection of board states\n*/\nexport class Game {\n\n static __wrap(ptr) {\n const obj = Object.create(Game.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 wasm.__wbg_game_free(ptr);\n }\n /**\n * Get pointer to current board's squares\n * @returns {number}\n */\n current_board_cells() {\n var ret = wasm.game_current_board_cells(this.ptr);\n return ret;\n }\n /**\n * Get pointer to current board's squares\n * @returns {number}\n */\n current_board_len() {\n var ret = wasm.game_current_board_len(this.ptr);\n return ret >>> 0;\n }\n /**\n * Current turn's team\n * @returns {number}\n */\n current_turn() {\n var ret = wasm.game_current_turn(this.ptr);\n return ret >>> 0;\n }\n /**\n * Get square on current board for given index\n * @param {BrdIdx} idx\n * @returns {Square}\n */\n current_cell_state(idx) {\n _assertClass(idx, BrdIdx);\n var ret = wasm.game_current_cell_state(this.ptr, idx.ptr);\n return Square.__wrap(ret);\n }\n /**\n * Set given index as selected piece\n * TODO: Check whether valid square?\n * @param {BrdIdx} idx\n */\n set_selected(idx) {\n _assertClass(idx, BrdIdx);\n wasm.game_set_selected(this.ptr, idx.ptr);\n }\n /**\n * Clear currently selected piece\n */\n clear_selected() {\n wasm.game_clear_selected(this.ptr);\n }\n /**\n * Attempt to make a move given a source and destination index\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n * @returns {number}\n */\n make_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 = wasm.game_make_move(this.ptr, ptr0, ptr1);\n return ret >>> 0;\n }\n /**\n * Update board state with given move and push new board into current state\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n */\n execute_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 wasm.game_execute_move(this.ptr, ptr0, ptr1);\n }\n /**\n * Update board state with given jump move and push new board into current state\n * @param {BrdIdx} from\n * @param {BrdIdx} to\n */\n execute_jump(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 wasm.game_execute_jump(this.ptr, ptr0, ptr1);\n }\n /**\n * Push current board into the previous turns and set given board to current\n * @param {Board} board\n */\n push_new_board(board) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n wasm.game_push_new_board(this.ptr, ptr0);\n }\n /**\n * Set current board to given\n * @param {Board} board\n */\n set_current(board) {\n _assertClass(board, Board);\n var ptr0 = board.ptr;\n board.ptr = 0;\n wasm.game_set_current(this.ptr, ptr0);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @param {number} piece_rows\n * @param {number} first_turn\n */\n constructor(width, height, piece_rows, first_turn) {\n var ret = wasm.game_new(width, height, piece_rows, first_turn);\n return Game.__wrap(ret);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @param {number} piece_rows\n * @param {number} first_turn\n * @param {string} canvas_id\n * @param {number} canvas_width\n * @param {number} canvas_height\n * @returns {Game}\n */\n static new_with_canvas(width, height, piece_rows, first_turn, canvas_id, canvas_width, canvas_height) {\n var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ret = wasm.game_new_with_canvas(width, height, piece_rows, first_turn, ptr0, len0, canvas_width, canvas_height);\n return Game.__wrap(ret);\n }\n /**\n * @param {Painter} value\n */\n set_painter(value) {\n _assertClass(value, Painter);\n var ptr0 = value.ptr;\n value.ptr = 0;\n wasm.game_set_painter(this.ptr, ptr0);\n }\n /**\n */\n draw() {\n wasm.game_draw(this.ptr);\n }\n}\n/**\n* Used to paint boards onto HTML canvases\n*/\nexport class Painter {\n\n static __wrap(ptr) {\n const obj = Object.create(Painter.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 wasm.__wbg_painter_free(ptr);\n }\n /**\n * Default constructor which queries for canvas by ID\n * @param {number} width\n * @param {number} height\n * @param {string} canvas_id\n */\n constructor(width, height, canvas_id) {\n var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ret = wasm.painter_new(width, height, ptr0, len0);\n return Painter.__wrap(ret);\n }\n /**\n * Constructor with given canvas element\n * @param {number} width\n * @param {number} height\n * @param {HTMLCanvasElement} canvas\n * @returns {Painter}\n */\n static new_with_canvas(width, height, canvas) {\n var ret = wasm.painter_new_with_canvas(width, height, addHeapObject(canvas));\n return Painter.__wrap(ret);\n }\n /**\n * Set new square outline colour value\n * @param {any} value\n */\n set_square_outline(value) {\n wasm.painter_set_square_outline(this.ptr, addHeapObject(value));\n }\n /**\n * Set new line width for outlining squares\n * @param {number} value\n */\n set_outline_width(value) {\n wasm.painter_set_outline_width(this.ptr, value);\n }\n /**\n * Set whether squares are outlined\n * @param {boolean} value\n */\n set_draw_outline(value) {\n wasm.painter_set_draw_outline(this.ptr, value);\n }\n /**\n * Reset the canvas dimensions to the given width and height\n */\n reset_dimensions() {\n wasm.painter_reset_dimensions(this.ptr);\n }\n /**\n * Check whether given canvas dimensions divide evenly by given board dimenions\n * @param {Board} board\n * @returns {boolean}\n */\n validate_board_dim(board) {\n _assertClass(board, Board);\n var ret = wasm.painter_validate_board_dim(this.ptr, board.ptr);\n return ret !== 0;\n }\n /**\n * Draw a board onto the canvas\n * @param {Board} board\n */\n draw(board) {\n _assertClass(board, Board);\n wasm.painter_draw(this.ptr, board.ptr);\n }\n}\n/**\n* Game piece given by its team and strength (normal or kinged)\n*/\nexport class Piece {\n\n static __wrap(ptr) {\n const obj = Object.create(Piece.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 wasm.__wbg_piece_free(ptr);\n }\n /**\n * @returns {number}\n */\n get team() {\n var ret = wasm.__wbg_get_piece_team(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set team(arg0) {\n wasm.__wbg_set_piece_team(this.ptr, arg0);\n }\n /**\n * @returns {number}\n */\n get strength() {\n var ret = wasm.__wbg_get_piece_strength(this.ptr);\n return ret >>> 0;\n }\n /**\n * @param {number} arg0\n */\n set strength(arg0) {\n wasm.__wbg_set_piece_strength(this.ptr, arg0);\n }\n /**\n * @param {number} team\n * @param {number} strength\n */\n constructor(team, strength) {\n var ret = wasm.piece_new(team, strength);\n return Piece.__wrap(ret);\n }\n}\n/**\n*/\nexport class Player {\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 wasm.__wbg_player_free(ptr);\n }\n}\n/**\n* Board squares given by a state and a possible occupying game piece\n*/\nexport class 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 wasm.__wbg_square_free(ptr);\n }\n /**\n * Game piece if square is occupied\n * @returns {Piece | undefined}\n */\n get occupant() {\n var ret = wasm.__wbg_get_square_occupant(this.ptr);\n return ret === 0 ? undefined : Piece.__wrap(ret);\n }\n /**\n * Game piece if square is occupied\n * @param {Piece | undefined} arg0\n */\n set occupant(arg0) {\n let ptr0 = 0;\n if (!isLikeNone(arg0)) {\n _assertClass(arg0, Piece);\n ptr0 = arg0.ptr;\n arg0.ptr = 0;\n }\n wasm.__wbg_set_square_occupant(this.ptr, ptr0);\n }\n /**\n * Description of whether the square is occupied or an unplayable, i.e. off-lattice square\n * @returns {number}\n */\n get state() {\n var ret = wasm.__wbg_get_square_state(this.ptr);\n return ret >>> 0;\n }\n /**\n * Description of whether the square is occupied or an unplayable, i.e. off-lattice square\n * @param {number} arg0\n */\n set state(arg0) {\n wasm.__wbg_set_square_state(this.ptr, arg0);\n }\n /**\n * Standard constructor function to form square from state and occupant\n * @param {number} state\n * @param {Piece | undefined} occupant\n */\n constructor(state, occupant) {\n let ptr0 = 0;\n if (!isLikeNone(occupant)) {\n _assertClass(occupant, Piece);\n ptr0 = occupant.ptr;\n occupant.ptr = 0;\n }\n var ret = wasm.square_new(state, ptr0);\n return Square.__wrap(ret);\n }\n /**\n * Helper function for a well-formed piece square by team and strength\n * @param {number} team\n * @param {number} strength\n * @returns {Square}\n */\n static pc(team, strength) {\n var ret = wasm.square_pc(team, strength);\n return Square.__wrap(ret);\n }\n /**\n * Helper function for a well-formed empty square\n * @returns {Square}\n */\n static empty() {\n var ret = wasm.square_empty();\n return Square.__wrap(ret);\n }\n /**\n * Helper function for a well-formed unplayable square\n * @returns {Square}\n */\n static unplay() {\n var ret = wasm.square_unplay();\n return Square.__wrap(ret);\n }\n}\n\nexport function __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nexport function __wbindgen_string_new(arg0, arg1) {\n var ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nexport function __wbg_new_59cb74e423758ede() {\n var ret = new Error();\n return addHeapObject(ret);\n};\n\nexport function __wbg_stack_558ba5917b466edd(arg0, arg1) {\n var ret = getObject(arg1).stack;\n var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nexport function __wbg_error_4bb6c2a97407129a(arg0, arg1) {\n try {\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(arg0, arg1);\n }\n};\n\nexport function __wbg_instanceof_Window_11e25482011fc506(arg0) {\n var ret = getObject(arg0) instanceof Window;\n return ret;\n};\n\nexport function __wbg_document_5aff8cd83ef968f5(arg0) {\n var ret = getObject(arg0).document;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nexport function __wbg_getElementById_b180ea4ada06a837(arg0, arg1, arg2) {\n var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2));\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nexport function __wbg_log_9a99fb1af846153b(arg0) {\n console.log(getObject(arg0));\n};\n\nexport function __wbg_instanceof_CanvasRenderingContext2d_779e79c4121aa91b(arg0) {\n var ret = getObject(arg0) instanceof CanvasRenderingContext2D;\n return ret;\n};\n\nexport function __wbg_setstrokeStyle_2939ee453716e462(arg0, arg1) {\n getObject(arg0).strokeStyle = getObject(arg1);\n};\n\nexport function __wbg_setfillStyle_af790b5baf4d3210(arg0, arg1) {\n getObject(arg0).fillStyle = getObject(arg1);\n};\n\nexport function __wbg_setlineWidth_3e6b1837ae38d099(arg0, arg1) {\n getObject(arg0).lineWidth = arg1;\n};\n\nexport function __wbg_beginPath_2378575e37027ad3(arg0) {\n getObject(arg0).beginPath();\n};\n\nexport function __wbg_fill_558339447ed6ad43(arg0) {\n getObject(arg0).fill();\n};\n\nexport function __wbg_stroke_c1e0313c58997dcf(arg0) {\n getObject(arg0).stroke();\n};\n\nexport function __wbg_arc_fffd87d9113dce32() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5) {\n getObject(arg0).arc(arg1, arg2, arg3, arg4, arg5);\n}, arguments) };\n\nexport function __wbg_fillRect_46ffc8d2cef7e298(arg0, arg1, arg2, arg3, arg4) {\n getObject(arg0).fillRect(arg1, arg2, arg3, arg4);\n};\n\nexport function __wbg_strokeRect_7ea34fad8a7f0fe2(arg0, arg1, arg2, arg3, arg4) {\n getObject(arg0).strokeRect(arg1, arg2, arg3, arg4);\n};\n\nexport function __wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792(arg0) {\n var ret = getObject(arg0) instanceof HTMLCanvasElement;\n return ret;\n};\n\nexport function __wbg_setwidth_f3c88eb520ba8d47(arg0, arg1) {\n getObject(arg0).width = arg1 >>> 0;\n};\n\nexport function __wbg_setheight_5a1abba41e35c42a(arg0, arg1) {\n getObject(arg0).height = arg1 >>> 0;\n};\n\nexport function __wbg_getContext_813df131fcbd6e91() { return handleError(function (arg0, arg1, arg2) {\n var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2));\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_newnoargs_9fdd8f3961dd1bee(arg0, arg1) {\n var ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nexport function __wbg_call_ba36642bd901572b() { return handleError(function (arg0, arg1) {\n var ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_self_bb69a836a72ec6e9() { return handleError(function () {\n var ret = self.self;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_window_3304fc4b414c9693() { return handleError(function () {\n var ret = window.window;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_globalThis_e0d21cabc6630763() { return handleError(function () {\n var ret = globalThis.globalThis;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbg_global_8463719227271676() { return handleError(function () {\n var ret = global.global;\n return addHeapObject(ret);\n}, arguments) };\n\nexport function __wbindgen_is_undefined(arg0) {\n var ret = getObject(arg0) === undefined;\n return ret;\n};\n\nexport function __wbindgen_object_clone_ref(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nexport function __wbindgen_debug_string(arg0, arg1) {\n var ret = debugString(getObject(arg1));\n var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nexport function __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n","import { Game, Board, BrdIdx, Painter, Team, init_wasm, Moveable, SquareState, Square } from \"draught\";\n// import { memory } from \"draught/draught_bg.wasm\";\n\n///////////////////\n// CONSTS\n///////////////////\n\nconst CANVAS_WIDTH = 480;\nconst CANVAS_HEIGHT = 480;\n\nconst BOARD_WIDTH = 8;\nconst BOARD_HEIGHT = 8;\n\nconst PIECE_ROWS = 3;\n\nconst STATUS_TIMEOUT = 3000;\n\nconst GameState = {\n HUMAN_TURN: {\n THINKING: \"human_turn.thinking\",\n FROM_SELECTED: \"human_turn.from_selected\"\n },\n AI_TURN: \"ai_turn\"\n}\n\n//////////////////\n// GAME STUFF\n//////////////////\n\ninit_wasm();\n\n// let board = new Board(BOARD_WIDTH, BOARD_HEIGHT, Team.Black);\n\nconst statusText = document.getElementById(\"status-p\");\nconst statusAlert = document.getElementById(\"status-d\");\nconst teamText = document.getElementById(\"team-p\");\n\nconst startBtn = document.getElementById(\"startBtn\");\nstartBtn.onclick = start_game;\n\nlet statusTimeout = null;\nlet setStatus = setStatusAlert;\n\nlet current_state = GameState.HUMAN_TURN.THINKING;\n\nlet game = null;\nlet painter = null;\n\nlet clicks = [];\n\nstart_game();\n\n/////////////////\n// CANVAS\n/////////////////\n\nconst canvas = document.getElementById(\"game-canvas\");\ncanvas.addEventListener(\"click\", (event) => {\n var mousepos = getMousePos(canvas, event);\n // console.log(mousepos);\n var cell = new BrdIdx(\n Math.floor((mousepos.y / CANVAS_HEIGHT) * BOARD_HEIGHT),\n Math.floor((mousepos.x / CANVAS_WIDTH) * BOARD_WIDTH),\n );\n // console.log(cell);\n process_canvas_click(cell);\n})\n\n////////////////\n// FUNCS\n////////////////\n\nfunction start_game() {\n game = new Game(BOARD_WIDTH, BOARD_HEIGHT, PIECE_ROWS, Team.Black);\n painter = new Painter(CANVAS_WIDTH, CANVAS_HEIGHT, \"game-canvas\");\n game.set_painter(painter);\n game.draw();\n\n updateTeamText();\n current_state = GameState.HUMAN_TURN.THINKING;\n}\n\nfunction process_canvas_click(cell_coord) {\n\n switch(current_state) {\n // first click of a move\n case GameState.HUMAN_TURN.THINKING:\n if (game.current_cell_state(cell_coord).state != SquareState.Occupied ) {\n return;\n }\n\n if (game.current_cell_state(cell_coord).occupant.team != game.current_turn() ) {\n return;\n }\n\n // console.log(\"Your turn, first piece picked\");\n\n clicks.push(cell_coord);\n current_state = GameState.HUMAN_TURN.FROM_SELECTED;\n game.set_selected(cell_coord);\n game.draw();\n \n break;\n \n // second click of a move\n case GameState.HUMAN_TURN.FROM_SELECTED:\n\n // second click is different to first, process as move\n // otherwise, will skip straight to clean up (clear selected and clicks) \n if (!clicks[0].eq(cell_coord)) {\n\n if (game.current_cell_state(cell_coord).state != SquareState.Empty ) {\n return;\n }\n \n // console.log(\"Your turn, first piece already picked, picking second\");\n \n clicks.push(cell_coord);\n \n if (clicks.length != 2) {\n setStatus(`Error: wrong number of clicks to process ${clicks.length}`);\n console.error(`Error: wrong number of clicks to process ${clicks.length}`);\n \n return;\n }\n\n let status = game.make_move(clicks[0], clicks[1]);\n\n switch(status) {\n case Moveable.Allowed:\n break;\n case Moveable.IllegalTrajectory:\n setStatus(\"You can't move like that!\");\n break;\n case Moveable.JumpingSameTeam:\n setStatus(\"You can't jump your own piece!\");\n break;\n case Moveable.NoJumpablePiece:\n setStatus(\"There's nothing to jump!\");\n break;\n case Moveable.OccupiedDest:\n setStatus(\"There's a piece there!\");\n break;\n case Moveable.OutOfBounds:\n setStatus(\"That square's not on the board! (how have you managed that?)\");\n break;\n case Moveable.UnoccupiedSrc:\n setStatus(\"There's no piece to move!\");\n break;\n case Moveable.Unplayable:\n setStatus(\"That's not a playable square!\");\n break;\n case Moveable.WrongTeamSrc:\n setStatus(\"That's not your piece!\");\n break;\n }\n \n }\n\n game.clear_selected();\n game.draw();\n clicks = [];\n current_state = GameState.HUMAN_TURN.THINKING;\n \n break;\n case GameState.AI_TURN:\n console.log(\"It's the AI's turn!\");\n break;\n }\n\n updateTeamText();\n}\n\nfunction getMousePos(canvas, evt) {\n var rect = canvas.getBoundingClientRect();\n return {\n x: evt.clientX - rect.left,\n y: evt.clientY - rect.top\n };\n}\n\nfunction setStatusText(txt, hide = true) {\n if(statusTimeout != null) {\n clearInterval(statusTimeout);\n }\n\n statusText.innerText = txt;\n\n if(hide) {\n statusTimeout = setTimeout(() => {\n statusText.innerText = \"\";\n }, STATUS_TIMEOUT);\n }\n}\n\nfunction setStatusAlert(txt, alertType = \"danger\", hide = true) {\n if(statusTimeout != null) {\n clearInterval(statusTimeout);\n }\n\n statusAlert.className = `alert alert-${alertType}`;\n statusAlert.innerText = txt;\n statusAlert.hidden = false;\n\n if(hide) {\n statusTimeout = setTimeout(() => {\n statusAlert.hidden = true;\n }, STATUS_TIMEOUT);\n }\n}\n\nfunction updateTeamText(){\n let team = game.current_turn();\n switch(team) {\n case Team.White:\n teamText.innerText = \"⚪ White ⚪\";\n break;\n case Team.Black:\n teamText.innerText = \"🔴 Black 🔴\";\n break;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/96b9a573923750a3ae94.module.wasm b/96b9a573923750a3ae94.module.wasm deleted file mode 100644 index 87e8bddf37fd5df586dc4b47c4fe021631e71bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122311 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%0DgV-<+gz+^NA>^MgbW1fXfnI)0 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 H!u|dQUIZ-H diff --git a/cc96734576b00860ab91.module.wasm b/cc96734576b00860ab91.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..61670624b02aaaa324e467c7d94f8d71c3741e7f GIT binary patch literal 124071 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

+0tOwU_%P|UFS5~8Q)SO^vv%!XQ>V?nXhGuW z2`ATxr*7;Y=B(=SRqrt6tn4VNqb8VHm(!|KsT^T|>3rfXbDXCw@+5$Nnxk^JWPj6X z&K=@}9il}zg-E{a^Dk4mTYH*$fslWj$NCb%|7q>KV&k~3Fs$$}h7Bt($yz&8lX6V2n2ADK$xl(zy^x4!#BF5I=%Padyk#odv|*8J#l($%O&5rb7yzB zJHuVt1O#v??!8m*xu^X9e@4q$3G?H(piV25RM5yP=@0G-C}1P9osgv}L8pWyQX~Ah zTNYZnCFASUR~^~zT6GAeL}Ver>bWRN=GCnWbKtQf7rZJ-WjOo1Do%Ra!s(v$YCj&V z|1T{K&Y>4zZL=(gN5TDy^79L44)91k6&3HTB{qj8O2H)?WeDgKE_`tN?1BgAW`}Ak zSz^?*AX(ip&)vhZfmvG7xe0++1UBwmIBef3vl-mAaKHAiwxF;hHhpAv=>~}X7$g^| zDyqQ)H3$j^kz5P{;r`V#zK=>a`oJ2{tV)skZWUf9-G;-2 z%fLJER0y28=7PEu9B;x)tSHRMCyJ?S*yU6{VGTG60PiQsLz*?!Y_rQI1Rh^*rzZr~ z7!4GV;u$#&e2XVbwUS$JF z*ebjp2e>?eV);~Qsq{?`GceDQcc_|SR3!>!RYIN%o+kcy$oP{zW^+hnXV9q`0B~2I z!VRyNIjlvgMHp)PzPb(M0G=*Z702B5>F8ORjHiammKdU->SR3N3JG~HF5GAAJ(Tw8 zqoKIoD3qlh^2zKErSnW_EO${0&OJ+R-oIRLoxYot$?dmgwLiBz>ol+2e*dg}e=$pv zBrY{EmE<4d@$r~Ieh=`=VaGjN)(+BovVyGzJzLA45235Vd#BE%!Z8Ac`^0DD_z-&Wsn@y!eBky^V zm=MwcAoN`_Jp+m>RaNWw`dahxBc)fx0GPbzOOFen`A&QQ-V#$`^r)t@ zWPE?%zCb!ta@G{At|B{NXpz7Sv|a)`l(Vd=@P+c|vEdkhvg6d=ceurM;F?>%I1fXL zr9g_&ekrIQy{OwNjk1GVT3s7zN)VnUAz6$#L7Ki;_M=OJl)A?^M6pV`_z1r2T!=!|Z-wCE@!PLlnBC@2eGDz;uTt6I(241y36XjKU9H%W{5Wpa5d zpJ*u1Mz*RQ4Ys$aT12V^&mqqZ@PeiXKxadi!^uymfN)d~I2C$lmPr}DN@k)|P}@O>i#jjv zJUo~D)w73?(^vU4X{)TzBUYAZXx@RN!3TM?T-Z=XtP_Bd`mnp1U z)#QUW9k>Zs7)}imQR72Ih9iMwgEngkyf@E2!vKL^TH(OdgvUjy>@9Ld&n7cvX=kas z552@C%rAlg)mtA)@3+ch@A2G?dixL(GS(9IFpjGOF7Iu#ua(#sD3#H|CNlQQx6dBp zXY^+vzyzU`F*bUKOi59js+X!zpISR-v``8#_XQG=w5~-fFb>}--fo|T_Yk8|_i7sv zPFeOO3&MgpLb)gJk_YV`1XP7X;3Dvxv6I|Z+Ma;$MD5#o_v{Nv10DeXQW$SB1p4;~ zV%Q{i+S**y(z^FS3_5JPj0OM-wHWyC6>q#HjXyP;Q;ppW(3p>qNTz5QMR<U>ehoC(1~=7s>l286RQ%X|!vpxH>rYO%-!05h|hRfEWhh28x~^m@!r_zFJ9D zIe$o~z{aCm(jj)(4?ZZq-MQ?K+EiFznz0^?3PVV?0b19XO&n|ILvkTc_w*@JV>gIT zgwqmYY;QUmcNs|$P}bb*JuHIONlPa|tjM2(skY(Q*y9(_Wx13Z*EzIqTsHi|Qz7V12-7d|P)0Uo4w=Q#|d zBUKcFE=bOpnEq38e9|d8*(R)vJS2T~KqV2TXBILXV64dtXwRys%0DeOvuEc5^9pE? z6>ZX`nss9k*=1DC$+V*OQ=lL88M&DEv%yz>wtIcpb-b~1?kvgH3TKmpFCg5v5 z$sNrs?IJFdbEUpe(a$aAW0HJ*-hmp&1h5$?*_R=g{SA5GWC3falH(M-sbb`4?N-S* zCEUGr)%#tIl{WhwefD^|_@^Y<3aF((Gb7*omRJ#cn^X99_tS1wDy(iTBJycKxt$xG zP$rCTnmG^_)|H$=<|If3mxW@6L2Q)YX_k~JD%zq}t?Ia1o;{nM*3*VnOcO;m=?Ikp z@E+e4i(i-?WRUbmsS`m8aE~!{OzeF@H2FPo+nn=s4UFq$YuoG#TiY8{OHADb#sdQO zlq2A)WAeW*7md_Ee$ev-AF42zc3zJN#&-r3G=Q`b-iJTz894RM@Msc`v=7&buv_K- zXx@RennA0LWE$05z{ly2=N%YRwj6MCREm+fAp6NY_Xtt(5;d8Cm<4YB;HPtpVLt&< zrR3lcNI>ZPY>qLe@l8&0mnB@l68pIvtt-)+>u70UpHuufwUfvc0r%AAAz?@+G5Ccj zqFo`elE)rA5V`IU5n=2|PG$pO&j zC!nqX^#J7>TIl>*_DurWEJ;#u5}-&5?Zk*dR)N>_H*%tN5hk6oJcCbS%63S<>U{#u zgZ6o(54?mB;r~`1c6X*@CV0JUEM5+_ngmMf{!W(nJ5!F-TbUzq6W+86tEIN-%pkLY~wJ@DyqPMt0>7`@e@9SRs@9(R&CQ3PxPSY!Q`{>W_20 z$R6^%yhJ|TAE;}k!JnGF&zdjgvejY>y7L+79|y973&ET`TbhOqogwHlWah9$+ z$P}P~cC%RS@I04aPs1!RwvJv>SQi+`d6NHKuAhON>}e;XgbxbSeLa9R%~&%bTjUZh zWA|@p=mxxfJW^V~L}4`ehcsG19nS!-SZ@U6ZSoE-BuO+yd^h{2SVmpPjp#o?l~B{! zpjH6SiDOj?LXyV&mprcbkxc@Kny>>--~@~X3%_Ze8rlrleK5-iQImAY|GmdcTOW7A zCqFT639Y9KBsc*1qCI?KJj3EYV%4cSFMcG!Z(svDJ_0Qg<24afAXDzS{}tQ)p<}#h zDPd2C>uKX+^)XN^gJh8VsVcI?>Hoyy6uM?=JinT=t0xk`QB5R70MER?Pr3ZkH3imuFtoeuk2s2dU~T;2fX{ z(m!+%-7)WZ00~McaMQ(tYB3)0o%0SvK96=B=sdvoMY+_yYux%v4;-xCv|ws;#jsV_g2R?e}KCb`b*A{ zOG0{wVwRHZ2x4vSF(*3a#+P1jRl360E^wCIWXU

List of all items[] -

Structs

Enums

Macros

Functions

Constants

+

Structs

Enums

Macros

Functions

Constants

\ No newline at end of file diff --git a/doc/draught/board/index.html b/doc/draught/board/index.html index 9e7d056..57583e7 100644 --- a/doc/draught/board/index.html +++ b/doc/draught/board/index.html @@ -1,7 +1,7 @@ draught::board - Rust

Module draught::board[][src]

Board module for components related to the checkers board and game structure

+ Change settings

Module draught::board[][src]

Board module for components related to the checkers board and game structure

Modules

enums
iter

Structs

Board

Single state of a checkers board

diff --git a/doc/draught/board/struct.Board.html b/doc/draught/board/struct.Board.html index 2b1b0b5..4d8254b 100644 --- a/doc/draught/board/struct.Board.html +++ b/doc/draught/board/struct.Board.html @@ -1,6 +1,6 @@ Board in draught::board - Rust -

Module draught::comp[][src]

AI player logic

Structs

Computer

Root-level structure for managing the game as a collection of board states

Move
diff --git a/doc/draught/comp/struct.Computer.html b/doc/draught/comp/struct.Computer.html index 0c23e89..d3d094f 100644 --- a/doc/draught/comp/struct.Computer.html +++ b/doc/draught/comp/struct.Computer.html @@ -1,14 +1,14 @@ Computer in draught::comp - Rust -

Struct draught::comp::Computer[][src]

pub struct Computer {
-    pub tree: Arena<Board>,
+

Struct draught::comp::Computer[][src]

pub struct Computer {
     pub root_node_id: NodeId,
     pub search_depth: usize,
     pub team: Team,
 }

Root-level structure for managing the game as a collection of board states

- Fields

tree: Arena<Board>root_node_id: NodeIdsearch_depth: usizeteam: Team

Implementations

impl Computer[src]

pub fn new(initial_board: Board, search_depth: usize, team: Team) -> Computer[src]

pub fn update_board(&mut self, new_board: Board)[src]

pub fn available_turns(&self, board: &Board) -> Vec<Move>[src]

pub fn insert_boards(&mut self, boards: Vec<Board>) -> Vec<NodeId>[src]

pub fn get_move_boards(&self, board: &Board) -> Vec<Board>[src]

pub fn get_move(&self)[src]

Trait Implementations

impl Debug for Computer[src]

OUTLINE_WIDTH

Line width when outlining black squares

PIECE_MARGIN

Margin from square to define piece radius

PIECE_OUTLINE_WIDTH

Line width for outlining pieces

+
SELECTED_PIECE

Default hex colour value for selected piece

+
SELECTED_PIECE_OUTLINE

Default hex colour value for selected piece outline

SQUARE_OUTLINE

Default hex colour value for outline of black squares

WHITE_PIECE

Default hex colour value for white pieces

WHITE_PIECE_OUTLINE

Default hex colour value for white piece outline

diff --git a/doc/draught/paint/sidebar-items.js b/doc/draught/paint/sidebar-items.js index 3900efc..0c761e8 100644 --- a/doc/draught/paint/sidebar-items.js +++ b/doc/draught/paint/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"constant":[["BLACK_PIECE","Default hex colour value for black pieces"],["BLACK_PIECE_OUTLINE","Default hex colour value for black piece outline"],["BLACK_SQUARE","Default hex colour value for black square background"],["DRAW_OUTLINE","Whether to outline black squares"],["DRAW_PIECE_OUTLINES","Whether to outline pieces"],["KING_OUTLINE","Default hex colour value for black piece outline"],["OUTLINE_WIDTH","Line width when outlining black squares"],["PIECE_MARGIN","Margin from square to define piece radius"],["PIECE_OUTLINE_WIDTH","Line width for outlining pieces"],["SQUARE_OUTLINE","Default hex colour value for outline of black squares"],["WHITE_PIECE","Default hex colour value for white pieces"],["WHITE_PIECE_OUTLINE","Default hex colour value for white piece outline"],["WHITE_SQUARE","Default hex colour value for white square background"]],"struct":[["Painter","Used to paint boards onto HTML canvases"]]}); \ No newline at end of file +initSidebarItems({"constant":[["BLACK_PIECE","Default hex colour value for black pieces"],["BLACK_PIECE_OUTLINE","Default hex colour value for black piece outline"],["BLACK_SQUARE","Default hex colour value for black square background"],["DRAW_OUTLINE","Whether to outline black squares"],["DRAW_PIECE_OUTLINES","Whether to outline pieces"],["KING_OUTLINE","Default hex colour value for black piece outline"],["OUTLINE_WIDTH","Line width when outlining black squares"],["PIECE_MARGIN","Margin from square to define piece radius"],["PIECE_OUTLINE_WIDTH","Line width for outlining pieces"],["SELECTED_PIECE","Default hex colour value for selected piece"],["SELECTED_PIECE_OUTLINE","Default hex colour value for selected piece outline"],["SQUARE_OUTLINE","Default hex colour value for outline of black squares"],["WHITE_PIECE","Default hex colour value for white pieces"],["WHITE_PIECE_OUTLINE","Default hex colour value for white piece outline"],["WHITE_SQUARE","Default hex colour value for white square background"]],"struct":[["Painter","Used to paint boards onto HTML canvases"]]}); \ No newline at end of file diff --git a/doc/draught/paint/struct.Painter.html b/doc/draught/paint/struct.Painter.html index 80aa02a..7f021ce 100644 --- a/doc/draught/paint/struct.Painter.html +++ b/doc/draught/paint/struct.Painter.html @@ -1,15 +1,18 @@ Painter in draught::paint - Rust -

Struct draught::paint::Painter[][src]

pub struct Painter {
Show fields +

Struct draught::paint::Painter[][src]

pub struct Painter {
Show fields canvas: HtmlCanvasElement, context: CanvasRenderingContext2d, + selected_idx: Option<BrdIdx>, white_square: JsValue, black_square: JsValue, white_piece: JsValue, black_piece: JsValue, + selected_piece: JsValue, white_piece_line: JsValue, black_piece_line: JsValue, + selected_piece_line: JsValue, king_line: JsValue, piece_lines: bool, piece_line_width: f64, @@ -20,40 +23,41 @@ height: u32,
}

Used to paint boards onto HTML canvases

- Fields

canvas: HtmlCanvasElementcontext: CanvasRenderingContext2dwhite_square: JsValueblack_square: JsValuewhite_piece: JsValueblack_piece: JsValuewhite_piece_line: JsValueblack_piece_line: JsValueking_line: JsValuepiece_lines: boolpiece_line_width: f64square_outline: JsValueoutline_width: f64draw_outline: boolwidth: u32height: u32

Implementations

impl Painter[src]

fn get_canvas(canvas_id: &str) -> HtmlCanvasElement[src]

Get a canvas by element ID

-

fn get_canvas_context(canvas: &HtmlCanvasElement) -> CanvasRenderingContext2d[src]

Get a 2D canvas context for a given canvas

-

impl Painter[src]

pub fn new(width: u32, height: u32, canvas_id: &str) -> Painter[src]

Default constructor which queries for canvas by ID

-

pub fn new_with_canvas(
    width: u32,
    height: u32,
    canvas: HtmlCanvasElement
) -> Painter
[src]

Constructor with given canvas element

-

pub fn set_square_outline(&mut self, value: JsValue)[src]

Set new square outline colour value

-

pub fn set_outline_width(&mut self, value: f64)[src]

Set new line width for outlining squares

-

pub fn set_draw_outline(&mut self, value: bool)[src]

Set whether squares are outlined

-

pub fn reset_dimensions(&self)[src]

Reset the canvas dimensions to the given width and height

-

pub fn validate_board_dim(&self, board: &Board) -> bool[src]

Check whether given canvas dimensions divide evenly by given board dimenions

-

pub fn draw(&self, board: &Board)[src]

Draw a board onto the canvas

-

Trait Implementations

impl Debug for Painter[src]

impl From<Painter> for JsValue[src]

impl FromWasmAbi for Painter[src]

type Abi = u32

The wasm ABI type that this converts from when coming back out from the + Fieldscanvas: HtmlCanvasElementcontext: CanvasRenderingContext2dselected_idx: Option<BrdIdx>white_square: JsValueblack_square: JsValuewhite_piece: JsValueblack_piece: JsValueselected_piece: JsValuewhite_piece_line: JsValueblack_piece_line: JsValueselected_piece_line: JsValueking_line: JsValuepiece_lines: boolpiece_line_width: f64square_outline: JsValueoutline_width: f64draw_outline: boolwidth: u32height: u32

Implementations

impl Painter[src]

pub fn set_selected(&mut self, idx: &Option<BrdIdx>)[src]

Set selected piece by board index

+

fn get_canvas(canvas_id: &str) -> HtmlCanvasElement[src]

Get a canvas by element ID

+

fn get_canvas_context(canvas: &HtmlCanvasElement) -> CanvasRenderingContext2d[src]

Get a 2D canvas context for a given canvas

+

impl Painter[src]

pub fn new(width: u32, height: u32, canvas_id: &str) -> Painter[src]

Default constructor which queries for canvas by ID

+

pub fn new_with_canvas(
    width: u32,
    height: u32,
    canvas: HtmlCanvasElement
) -> Painter
[src]

Constructor with given canvas element

+

pub fn set_square_outline(&mut self, value: JsValue)[src]

Set new square outline colour value

+

pub fn set_outline_width(&mut self, value: f64)[src]

Set new line width for outlining squares

+

pub fn set_draw_outline(&mut self, value: bool)[src]

Set whether squares are outlined

+

pub fn reset_dimensions(&self)[src]

Reset the canvas dimensions to the given width and height

+

pub fn validate_board_dim(&self, board: &Board) -> bool[src]

Check whether given canvas dimensions divide evenly by given board dimenions

+

pub fn draw(&self, board: &Board)[src]

Draw a board onto the canvas

+

Trait Implementations

impl Debug for Painter[src]

impl From<Painter> for JsValue[src]

impl FromWasmAbi for Painter[src]

type Abi = u32

The wasm ABI type that this converts from when coming back out from the ABI boundary. Read more

-

impl IntoWasmAbi for Painter[src]

type Abi = u32

The wasm ABI type that this converts into when crossing the ABI +

impl IntoWasmAbi for Painter[src]

type Abi = u32

The wasm ABI type that this converts into when crossing the ABI boundary. Read more

-

impl OptionFromWasmAbi for Painter[src]

impl OptionFromWasmAbi for Painter[src]

impl OptionIntoWasmAbi for Painter[src]

impl OptionIntoWasmAbi for Painter[src]

impl RefFromWasmAbi for Painter[src]

type Abi = u32

The wasm ABI type references to Self are recovered from.

+

impl RefFromWasmAbi for Painter[src]

type Abi = u32

The wasm ABI type references to Self are recovered from.

type Anchor = Ref<'static, Painter>

The type that holds the reference to Self for the duration of the invocation of the function that has an &Self parameter. This is required to ensure that the lifetimes don’t persist beyond one function call, and so that they remain anonymous. Read more

-

impl RefMutFromWasmAbi for Painter[src]

type Abi = u32

Same as RefFromWasmAbi::Abi

+

impl RefMutFromWasmAbi for Painter[src]

type Abi = u32

Same as RefFromWasmAbi::Abi

type Anchor = RefMut<'static, Painter>

Same as RefFromWasmAbi::Anchor

-

impl WasmDescribe for Painter[src]

Auto Trait Implementations

impl RefUnwindSafe for Painter

impl !Send for Painter

impl !Sync for Painter

impl Unpin for Painter

impl UnwindSafe for Painter

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl WasmDescribe for Painter[src]

Auto Trait Implementations

impl RefUnwindSafe for Painter

impl !Send for Painter

impl !Sync for Painter

impl Unpin for Painter

impl UnwindSafe for Painter

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

 //! Board module for components related to the checkers board and game structure
 
@@ -1390,6 +1427,7 @@
         }
     }
 
+    /// Get cell index of jumpee square given from and to locations
     pub fn jumpee_idx(&self, from: BrdIdx, to: BrdIdx) -> usize {
         let (row_diff, col_diff) = Board::idx_diffs(from, to);
         self.cell_idx(
@@ -1437,13 +1475,20 @@
         let mut white: isize = 0;
 
         for (_, square) in PieceIterator::new(self) {
-            if let Some(x) = square.occupant {
-                match x.team {
+            if let Some(piece) = square.occupant {
+                
+                // kings are move valuable than men
+                let increment = match piece.strength {
+                    Man => 1,
+                    King => 2,
+                };
+
+                match piece.team {
                     Black => {
-                        black += 1;
+                        black += increment;
                     },
                     White => {
-                        white += 1;
+                        white += increment;
                     },
                 }
             }
@@ -1457,6 +1502,7 @@
         self.cell(idx).state
     }
 
+    /// Get new board derived from current with given move applied
     pub fn apply_move(&self, from: BrdIdx, to: BrdIdx) -> Board {
         let mut new = self.clone();
 
@@ -1475,9 +1521,12 @@
             Square::empty() // empty piece
         );
 
+        Board::check_kinged(&mut new, to);
+
         new
     }
 
+    /// Get new board derived from current with given jump applied
     pub fn apply_jump(&self, from: BrdIdx, to: BrdIdx) -> Board {
         let mut new = self.clone();
 
@@ -1502,9 +1551,18 @@
             Square::empty() // empty piece
         );
 
+        Board::check_kinged(&mut new, to);
 
         new
     }
+
+    /// Get row index for current team, top row for black, bottom row for white
+    pub fn king_row_idx(&self) -> usize {
+        match self.current_turn {
+            White => self.height - 1,
+            Black => 0,
+        }
+    }
 }
 
 /////////////////////////
@@ -1534,6 +1592,22 @@
         return from.team.opponent() == jumpee.team
     }
 
+    /// Check and apply king strength
+    fn check_kinged(new_board: &mut Board, idx: BrdIdx) {
+        if new_board.king_row_idx() == idx.row {
+            let cell_idx = new_board.cell_idx(idx);
+            let cell = new_board.cell(cell_idx);
+            match cell.occupant {
+                Some(piece) => {
+                    new_board.set_cell(cell_idx, Square::pc(piece.team, King));
+                },
+                None => {
+                    panic!("No piece found when checking king, idx: {}", idx);
+                },
+            }
+        }
+    }
+
     /// Initialise a game board without game pieces
     #[wasm_bindgen(constructor)]
     pub fn new(width: usize, height: usize, current_turn: Team) -> Board {
diff --git a/doc/src/draught/comp/mod.rs.html b/doc/src/draught/comp/mod.rs.html
index ca79278..b981af4 100644
--- a/doc/src/draught/comp/mod.rs.html
+++ b/doc/src/draught/comp/mod.rs.html
@@ -152,16 +152,6 @@
 149
 150
 151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
 
 //! AI player logic
 
@@ -202,7 +192,6 @@
 /// Root-level structure for managing the game as a collection of board states
 #[derive(Debug)]
 pub struct Computer {
-    pub tree: Arena<Board>,
     pub root_node_id: NodeId,
     pub search_depth: usize,
     pub team: Team,
@@ -213,19 +202,13 @@
         let mut tree = Arena::new();
         let root_node_id = tree.new_node(initial_board);
         Computer {
-            tree,
             root_node_id,
             search_depth,
             team
         }
     }
 
-    pub fn update_board(&mut self, new_board: Board) {
-        let mut tree = Arena::new();
-        tree.new_node(new_board);
-        self.tree = tree;
-    }
-
+    /// Get vector of available moves for a given board
     pub fn available_turns(&self, board: &Board) -> Vec<Move> {
 
         // allocate capacity for 2 moves per piece, likely too much but will be shrunk
@@ -259,7 +242,7 @@
                             panic!("Unable to unwrap adjacent indices, from: {}, brd: {}", from_brd_idx, board);
                         }
 
-                        // iterate over adjacent indices
+                        // iterate over jumpable indices
                         if let Some(jump) = jump_op {
                             for i in jump {
                                 let to_brd_idx = board.board_index(i);
@@ -281,29 +264,26 @@
         moves
     }
 
-    // pub fn gen_tree(&mut self, tree: &mut Arena<Board>, board: Board) {
+    pub fn gen_tree(&mut self, tree: &mut Arena<Board>, board: Board) {
 
-        // let boards = self.get_move_boards(&board);
+        // possible boards from given
+        let boards = self.get_move_boards(&board);
 
-        // let root_id = vec!(tree.new_node(board));
-        // let ids = self.insert_boards(boards);
+        // root node of tree
+        let root = tree.new_node(board);
 
-        // for d in 0..self.search_depth {
+        // insert possible boards
+        let ids = self.insert_boards(tree, boards);
+        // append ids to root node
+        ids.iter().for_each( |id| root.append(*id, tree) );
 
-        //     for root in root_id.iter(){
-        //         for id in ids.into_iter() {
-        //             root.append(id, tree);
-        //         }
-        //     }
-        // }
+    }
 
-    // }
-
-    pub fn insert_boards(&mut self, boards: Vec<Board>) -> Vec<NodeId> {
+    pub fn insert_boards(&mut self, tree: &mut Arena<Board>, boards: Vec<Board>) -> Vec<NodeId> {
         
         boards
         .into_iter().map(
-            |b| self.tree.new_node(b)
+            |b| tree.new_node(b)
         ).collect()
     }
 
diff --git a/doc/src/draught/game/mod.rs.html b/doc/src/draught/game/mod.rs.html
index 89913f5..e89b7c5 100644
--- a/doc/src/draught/game/mod.rs.html
+++ b/doc/src/draught/game/mod.rs.html
@@ -151,6 +151,34 @@
 148
 149
 150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
 
 //! Top-level object for managing [`Board`]s, applying and managing turns
 
@@ -162,11 +190,11 @@
 use crate::log;
 
 use crate::board::{Square, BrdIdx};
-use crate::board::enums::{Moveable, Team};
+use crate::board::enums::{SquareState, Moveable, Team};
 use crate::paint::Painter;
 
 // use Team::*;
-// use SquareState::*;
+use SquareState::*;
 
 use std::fmt::{Display};
 
@@ -177,6 +205,7 @@
 #[derive(Debug)]
 pub struct Game {
     current: Board,
+    selected_piece: Option<BrdIdx>,
     previous_boards: Vec<Board>,
     painter: Option<Painter>
 }
@@ -210,10 +239,35 @@
         self.current.current_turn
     }
 
+    /// Get square on current board for given index
     pub fn current_cell_state(&self, idx: &BrdIdx) -> Square {
         self.current.cell(self.current.cell_idx(*idx))
     }
 
+    /// Set given index as selected piece
+    /// TODO: Check whether valid square?
+    pub fn set_selected(&mut self, idx: &BrdIdx) {
+        
+        if self.current.cell(self.current.cell_idx(*idx)).state != Occupied {
+            panic!("Tried to select an unoccupied or empty square");
+        } 
+
+        self.selected_piece = Some(*idx);
+        match &mut self.painter {
+            Some(p) => p.set_selected(&Some(*idx)),
+            None => {},
+        }
+    }
+
+    /// Clear currently selected piece
+    pub fn clear_selected(&mut self) {
+        self.selected_piece = None;
+        match &mut self.painter {
+            Some(p) => p.set_selected(&None),
+            None => {},
+        }
+    }
+
     /// Attempt to make a move given a source and destination index
     pub fn make_move(&mut self, from: BrdIdx, to: BrdIdx) -> Moveable {
         let able = self.current.can_move(from, to);
@@ -268,6 +322,7 @@
             current: Board::init_game(
                 Board::new(width, height, first_turn), piece_rows,
             ),
+            selected_piece: None,
             previous_boards: Vec::with_capacity(10),
             painter: None,
         }
@@ -278,6 +333,7 @@
             current: Board::init_game(
                 Board::new(width, height, first_turn), piece_rows,
             ),
+            selected_piece: None,
             previous_boards: Vec::with_capacity(10),
             painter: Some(
                 Painter::new(canvas_width, canvas_height, canvas_id)
diff --git a/doc/src/draught/paint.rs.html b/doc/src/draught/paint.rs.html
index 52f72f3..75d6699 100644
--- a/doc/src/draught/paint.rs.html
+++ b/doc/src/draught/paint.rs.html
@@ -341,6 +341,51 @@
 338
 339
 340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
 
 //! Components for painting board states onto HTML canvases
  
@@ -354,7 +399,7 @@
 use std::f64;
 
 use crate::log;
-use crate::board::{Board};
+use crate::board::{Board, BrdIdx};
 use crate::board::iter::PieceIterator;
 
 use crate::board::enums::Team::*;
@@ -376,11 +421,16 @@
 const WHITE_PIECE: &str = "#dbdbdb";
 /// Default hex colour value for black pieces
 const BLACK_PIECE: &str = "#ed0000";
+/// Default hex colour value for selected piece
+const SELECTED_PIECE: &str = "#fffd78";
 
 /// Default hex colour value for white piece outline
 const WHITE_PIECE_OUTLINE: &str = "#9c9c9c";
 /// Default hex colour value for black piece outline
 const BLACK_PIECE_OUTLINE: &str = "#a60000";
+/// Default hex colour value for selected piece outline
+// const SELECTED_PIECE_OUTLINE: &str = "#dedc73";
+const SELECTED_PIECE_OUTLINE: &str = "#d1cf45";
 /// Default hex colour value for black piece outline
 const KING_OUTLINE: &str = "#ffea00";
 /// Whether to outline pieces
@@ -397,15 +447,18 @@
 pub struct Painter {
     canvas: HtmlCanvasElement,
     context: CanvasRenderingContext2d,
+    selected_idx: Option<BrdIdx>,
 
     white_square: JsValue,
     black_square: JsValue,
 
     white_piece: JsValue,
     black_piece: JsValue,
+    selected_piece: JsValue,
 
     white_piece_line: JsValue,
     black_piece_line: JsValue,
+    selected_piece_line: JsValue,
     king_line: JsValue,
 
     piece_lines: bool,
@@ -420,6 +473,11 @@
 }
 
 impl Painter {
+    /// Set selected piece by board index
+    pub fn set_selected(&mut self, idx: &Option<BrdIdx>) {
+        self.selected_idx = *idx;
+    }
+
     /// Get a canvas by element ID
     fn get_canvas(canvas_id: &str) -> HtmlCanvasElement {
         // JS WINDOW
@@ -486,15 +544,18 @@
             canvas,
             context,
             width, height,
+            selected_idx: None,
 
             white_square: JsValue::from_str(WHITE_SQUARE),
             black_square: JsValue::from_str(BLACK_SQUARE),
             
             white_piece: JsValue::from_str(WHITE_PIECE),
             black_piece: JsValue::from_str(BLACK_PIECE),
+            selected_piece: JsValue::from_str(SELECTED_PIECE),
 
             white_piece_line: JsValue::from_str(WHITE_PIECE_OUTLINE),
             black_piece_line: JsValue::from_str(BLACK_PIECE_OUTLINE),
+            selected_piece_line: JsValue::from_str(SELECTED_PIECE_OUTLINE),
             king_line: JsValue::from_str(KING_OUTLINE),
             piece_lines: DRAW_PIECE_OUTLINES,
             piece_line_width: PIECE_OUTLINE_WIDTH,
@@ -516,15 +577,18 @@
             canvas,
             context,
             width, height,
+            selected_idx: None,
 
             white_square: JsValue::from_str(WHITE_SQUARE),
             black_square: JsValue::from_str(BLACK_SQUARE),
             
             white_piece: JsValue::from_str(WHITE_PIECE),
             black_piece: JsValue::from_str(BLACK_PIECE),
+            selected_piece: JsValue::from_str(SELECTED_PIECE),
 
             white_piece_line: JsValue::from_str(WHITE_PIECE_OUTLINE),
             black_piece_line: JsValue::from_str(BLACK_PIECE_OUTLINE),
+            selected_piece_line: JsValue::from_str(SELECTED_PIECE_OUTLINE),
             king_line: JsValue::from_str(KING_OUTLINE),
             piece_lines: DRAW_PIECE_OUTLINES,
             piece_line_width: PIECE_OUTLINE_WIDTH,
@@ -680,6 +744,32 @@
                 None => panic!("No piece found when attempting to draw, idx: {}, square: {:?}", idx, square),
             }
         }
+
+        if let Some(selected_idx) = self.selected_idx {
+            self.context.set_fill_style(&self.selected_piece);
+            self.context.set_stroke_style(&self.selected_piece_line);
+
+            let center_x: f64 = (selected_idx.col as f64 * cell_width as f64) + (cell_width as f64) / 2.0;
+            let center_y: f64 = (selected_idx.row as f64 * cell_height as f64) + (cell_height as f64) / 2.0;
+
+            self.context.begin_path();
+            match self.context.arc(
+                center_x, 
+                center_y, 
+                (cell_width as f64 / 2.0) - PIECE_MARGIN, // radius 
+                0.0, // start angle
+                f64::consts::PI * 2.0) // end angle
+            {
+                Ok(res) => res,
+                Err(err) => log!("Failed to paint selected piece, idx: {}, {:?}", selected_idx, err),
+            };
+            self.context.fill();
+
+            if self.piece_lines {
+                self.context.set_line_width(self.piece_line_width);
+                self.context.stroke()
+            }
+        }
     }
 }
diff --git a/index.html b/index.html index b725555..6ce688b 100644 --- a/index.html +++ b/index.html @@ -41,16 +41,18 @@
- Docs - + Docs +
-
+

-
+
+
+