board-game-engine 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +2 -0
- package/.eslintrc.js +3 -0
- package/README.md +1 -0
- package/babel.config.js +6 -0
- package/board-game-engine.test.js +46 -0
- package/dist/board-game-engine.js +7037 -0
- package/dist/board-game-engine.min.js +1 -0
- package/jest.config.js +21 -0
- package/package.json +40 -0
- package/src/action/action-factory.js +13 -0
- package/src/action/action.js +34 -0
- package/src/action/move-piece-action.js +11 -0
- package/src/action/select-piece-action.js +23 -0
- package/src/action/swap-action.js +14 -0
- package/src/board/board-factory.js +12 -0
- package/src/board/board-group.js +9 -0
- package/src/board/board.js +11 -0
- package/src/board/grid.js +52 -0
- package/src/board/stack.js +16 -0
- package/src/condition/action-type-matches-condition.js +7 -0
- package/src/condition/bingo-condition.js +50 -0
- package/src/condition/blackout-condition.js +9 -0
- package/src/condition/condition-factory.js +31 -0
- package/src/condition/condition.js +9 -0
- package/src/condition/contains-condition.js +14 -0
- package/src/condition/does-not-contain-condition.js +15 -0
- package/src/condition/is-valid-player-condition.js +7 -0
- package/src/condition/piece-matches-condition.js +23 -0
- package/src/condition/relative-move-condition.js +16 -0
- package/src/condition/some-condition.js +7 -0
- package/src/game/game.ts +362 -0
- package/src/index.ts +1 -0
- package/src/piece/piece-factory.js +5 -0
- package/src/piece/piece.ts +25 -0
- package/src/piece/pile.js +70 -0
- package/src/player/player.ts +13 -0
- package/src/registry.ts +51 -0
- package/src/round/round-factory.js +7 -0
- package/src/round/round.js +41 -0
- package/src/round/sequential-player-turn.js +18 -0
- package/src/space/space.ts +22 -0
- package/src/utils/find-value-path.js +37 -0
- package/src/utils/resolve-board.ts +38 -0
- package/src/utils/resolve-piece.ts +43 -0
- package/tic-tac-toe-verbose.json +54 -0
- package/webpack.config.js +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.BoardGameEngine=t():e.BoardGameEngine=t()}(this,(()=>(()=>{var e={9448:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return"movePiece"===e.type?new n.default(e,t):"swap"===e.type?new o.default(e,t):"selectPiece"===e.type?new a.default(e,t):void 0};var n=u(r(9278)),o=u(r(5149)),a=u(r(9645));function u(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},2655:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(3534)),o=a(r(6863));function a(e){return e&&e.__esModule?e:{default:e}}class u extends o.default{constructor(e,t){super(e,t),this.game=t,this.rules=e;const r=[{type:"actionTypeMatches",actionRule:this.rules},{type:"pieceMatches",actionRule:this.rules},{type:"isValidPlayer"}];this.conditions=[...r,...this.rules.conditions||[]].map((e=>(0,n.default)(e,t)))}assertIsValid(e){const t=this.conditions.filter((t=>!t.isMet(e)));if(t.length)throw console.log("=================="),console.log("unmetConditions",t),console.log("actionPayload",e),new Error("conditions not met ^")}do(){}}t.default=u,e.exports=t.default},9278:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(r(2655)),o=u(r(6123)),a=u(r(4093));function u(e){return e&&e.__esModule?e:{default:e}}class s extends n.default{do(e){const t=(0,a.default)(e.piece,this.game);(0,o.default)(e.board,this.game).placePiece(e.target,t)}}t.default=s,e.exports=t.default},9645:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(2655))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t){super(e,t)}do(e){let t;e.piece?.id?t=this.game.getPiece({id:e.piece?.id}):"player"===e.from&&(t=this.game.players.find((t=>t.id===e.playerId)).pieces.find((t=>t.name===e.piece.name)).getOne()),this.game.context.selectedPiece=t}}t.default=a,e.exports=t.default},5149:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(2655))&&n.__esModule?n:{default:n};class a extends o.default{do(e){let t;"player"===e.from&&(t=this.game.players.find((t=>t.id===e.playerId)).pieces.find((t=>t.name===e.piece.name)).getOne()),this.game.get(e.board).placePiece(e.target,t)}}t.default=a,e.exports=t.default},9534:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return"grid"===e.type?new n.default(e,t):"stack"===e.type?new o.default(e,t):void console.log("missing board type:",e)};var n=a(r(893)),o=a(r(21));function a(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},5059:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(9578))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t){this.sections=e.sections.map((()=>o.default.factory(e,t)))}}t.default=a,e.exports=t.default},9578:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(6863))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(e,t),this.rule=e,this.player&&(this.player=t.player)}placePiece(e,t){}}t.default=a,e.exports=t.default},893:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(r(8156)),o=u(r(9578)),a=u(r(7971));function u(e){return e&&e.__esModule?e:{default:e}}class s extends o.default{constructor(e,t){super(e,t),this.grid=function(e){const t=e.width,r=e.height;if(!t||!r)throw new Error("No size provided for grid");const n=[];for(let e=0;e<r;e++){const r=[];for(let n=0;n<t;n++)r.push(new a.default([e,n]));n.push(r)}return n}(e)}getEmptySpaces(){const e=[];for(const t of this.grid)for(const r of t)r.isEmpty()&&e.push(r);return e}getSpace(e){return(0,n.default)(this.grid,e)}getPieces(e){return this.getSpace(e).pieces}placePiece(e,t){this.getSpace(e).placePiece(t)}}t.default=s,e.exports=t.default},21:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(9578))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t){super(e,t),this.stack=[]}placePiece(e,t){e||this.stack.push(t)}}t.default=a,e.exports=t.default},6829:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(7213))&&n.__esModule?n:{default:n};class a extends o.default{isMet(e){return e.actionRule?.type===this.rules.actionType}}t.default=a,e.exports=t.default},3551:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(7213)),o=a(r(6123));function a(e){return e&&e.__esModule?e:{default:e}}class u extends n.default{isMet(){const e=(0,o.default)(this.rules.boardPath,this.game).grid,t=e.length;for(let r=0;r<t;r++)if(this.checkLine(e[r]))return!0;for(let r=0;r<t;r++){const n=[];for(let o=0;o<t;o++)n.push(e[o][r]);if(this.checkLine(n))return!0}const r=[],n=[];for(let o=0;o<t;o++)r.push(e[o][o]),n.push(e[o][t-1-o]);return!(!this.checkLine(r)&&!this.checkLine(n))}checkLine(e){return e.every((e=>e.pieces.some((e=>e.doesRuleMatch(this.rules.piece)))))}}t.default=u,e.exports=t.default},7963:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(7213)),o=a(r(6123));function a(e){return e&&e.__esModule?e:{default:e}}class u extends n.default{isMet(){return(0,o.default)(this.rules.boardPath,this.game).grid.every((e=>e.every((e=>!e.isEmpty()))))}}t.default=u,e.exports=t.default},3534:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return"contains"===e.type?new o.default(e,t):"doesNotContain"===e.type?new n.default(e,t):"bingo"===e.type?new a.default(e,t):"blackout"===e.type?new u.default(e,t):"some"===e.type?new s.default(e,t):"relativeMove"===e.type?new i.default(e,t):"actionTypeMatches"===e.type?new c.default(e,t):"isValidPlayer"===e.type?new l.default(e,t):"pieceMatches"===e.type?new f.default(e,t):void 0};var n=d(r(3790)),o=d(r(923)),a=d(r(3551)),u=d(r(7963)),s=d(r(7102)),i=d(r(3402)),c=d(r(6829)),l=d(r(3395)),f=d(r(226));function d(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},7213:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(6863))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t){super(e,t),this.rules=e,this.game=t}isMet(e){}}t.default=a,e.exports=t.default},923:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(1505)),o=a(r(7213));function a(e){return e&&e.__esModule?e:{default:e}}class u extends o.default{isMet(e){return!!this.game.get(e.board).getPieces(e.target).filter(filterPieces).length}filterPieces(e){return"any"===this.rules.piece||(0,n.default)(this.rules.piece)(e)}}t.default=u,e.exports=t.default},3790:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(r(1505)),o=u(r(7213)),a=u(r(6123));function u(e){return e&&e.__esModule?e:{default:e}}class s extends o.default{isMet(e){return!(0,a.default)(e.board,this.game).getPieces(e.target).filter(this.filterPieces.bind(this)).length}filterPieces(e){return"any"===this.rules.piece||(0,n.default)(e,this.rules.piece||{})}}t.default=s,e.exports=t.default},3395:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(7213))&&n.__esModule?n:{default:n};class a extends o.default{isMet(e){return this.game.players[this.game.currentRound.currentPlayerIndex].id===e.playerId}}t.default=a,e.exports=t.default},226:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(r(1505)),o=u(r(7213)),a=u(r(4093));function u(e){return e&&e.__esModule?e:{default:e}}class s extends o.default{isMet(e){const t=(0,a.default)(e.piece,this.game);if(this.rules.actionRule?.piece&&!t)return console.error("no piece found"),!1;if(this.rules.actionRule?.piece){const e={...this.rules.actionRule.piece};return(0,n.default)(e)(t.rule)}return!0}}t.default=s,e.exports=t.default},3402:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(1505)),o=a(r(7213));function a(e){return e&&e.__esModule?e:{default:e}}class u extends o.default{isMet(e){return!this.game.get(e.board).getPieces(e.target).filter(this.filterPieces.bind(this)).length}filterPieces(e){return"any"===this.rules.piece||(0,n.default)(e,this.rules.piece={})}}t.default=u,e.exports=t.default},7102:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(7213))&&n.__esModule?n:{default:n};class a extends o.default{isMet(){return this.rules.conditions.some((e=>new o.default(e).isMet()))}}t.default=a,e.exports=t.default},8989:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPathToRules=b,t.makeMove=function(e,t,r){if(!t)return{context:{},winner:null,status:"waiting",players:[]};const n=function(e){const t={},r=new Map,n=JSON.parse(JSON.stringify(e),(function(e,n){if(n?.constructorName){const e=r.get(n.id);if(e)return e;{const e=new d.registry[n.constructorName](...n.args,t);return Object.assign(e,n),r.set(e.id,e),e}}return n}));return Object.assign(t,n)}(t);if("done"===n.status)throw new Error("Game is over!");if(void 0===r)return n;if("join"===r?.type)return function(e,t,r){if(!(e.players.length<t.playerCountRange[1]))throw new Error("game is full!");e.players.push(new u.default(t.player,e.players.length,r.playerId))}(n,e,r),_(n);if("start"===r.type)return function(e,t){if(!(e.players.length>=t.playerCountRange[0]))throw new Error("not enough players");!function(e,t){(function(e){b(e)})(t),e.sharedBoard=Object.entries(t.sharedBoard).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:(0,a.default)({...n,path:["sharedBoard",r]})}}),{}),e.personalBoards=e.players.reduce(((e,r)=>({...e,[r.id]:Object.entries(t.personalBoard||[]).reduce(((e,t)=>{let[n,o]=t;return{...e,[n]:(0,a.default)({...o,path:["sharedBoard",n]},{player:r})}}),{})})),{}),e.pieces=t.pieces.reduce(((t,r)=>r.perPlayer?[...t,...e.players.map((e=>new l.default(r,{player:e})))]:[...t,new l.default(r)]),[]),t.initialPlacements?.forEach((t=>{t.perPlayer?e.players.forEach((r=>{h(t,r,{sharedBoard:e.sharedBoard,personalBoards:e.personalBoards,pieces:e.pieces})})):h(t,null,{sharedBoard:e.sharedBoard,personalBoards:e.personalBoards,pieces:e.pieces})}));const r=t.round.phases?t.round.phases[0]:t.round;e.currentRound=(0,s.default)(r,e),e.status="active"}(e,t)}(n,e),_(n);const o=v(r,n,e),c=n.currentRound;if(c.doAction(o),c.isOver(n))if(e.round.phases){const t=e.round.phases[n.currentRound.currentPhaseIndex];(0,s.default)(t,n).isOver(n)&&(n.currentRound.currentPhaseIndex++,n.currentRound.currentPhaseIndex>=e.round.phases.length&&(n.currentRound.currentPhaseIndex=0,n.currentRound.currentRoundIndex++))}else n.currentRound.currentRoundIndex++;const f=function(e,t){return e.players.find((r=>{const n={...t.winCondition,piece:{...t.winCondition.piece,player:r}};return(0,i.default)(n,e).isMet()}))||null}(n,e),p=function(e,t){return!(!t.drawCondition||!(0,i.default)(t.drawCondition,e).isMet())}(n,e);return(f||p)&&(n.status="done",n.winner=f),_(n)};var n=p(r(8055)),o=p(r(1505)),a=(p(r(5364)),p(r(9534))),u=p(r(6835)),s=p(r(6270)),i=p(r(3534)),c=p(r(9448)),l=p(r(1595)),f=p(r(4229)),d=r(8353);function p(e){return e&&e.__esModule?e:{default:e}}function v(e,t,r){const a=t.players.find((t=>t.id===e.playerId));if(!a&&"join"!==e.type&&"start"!==e.type)throw new Error("Invalid player ID");const u=r.pieces.find((t=>t.name===e.piece?.name)),s=(0,n.default)(e);return u?.perPlayer&&!s.player&&(s.piece.player={id:a.id}),s.board||(s.board=function(e,t){return function(e,t,r){const n={personalBoards:t.personalBoards,sharedBoard:t.sharedBoard,pieces:t.pieces};return Array.from((0,f.default)(n,(0,o.default)(e))).filter((e=>"rule"!==e[e.length-1])).sort((e=>"pieces"===e[0]?1:-1)).map((e=>y(e,r)))}(e,t,void 0)[0]}(s.piece,t)),s.board=y(s.board,{player:a}),s}function h(e,t,r){const n=e.action,o=e.payload||{};t&&(o.player=t),Array.from(new Array(e.count||1)).forEach((()=>{(0,c.default)(n,r).do(v(o,r,rules))}))}function y(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"personalBoard"===e[0]&&t.player?["personalBoards",t.player.id.toString(),...e.slice(1)]:e}function b(e){const t=["phases","rounds"];function r(e,n){if(e&&"object"==typeof e){e.path=n.join(".");for(const o of t){const t=e[o];Array.isArray(t)&&t.forEach(((e,t)=>{r(e,n.concat(o,t))}))}}}e.round&&"object"==typeof e.round&&r(e.round,["round"]),Array.isArray(e.rounds)&&e.rounds.forEach(((e,t)=>r(e,["rounds",t])))}function _(e){return JSON.parse(JSON.stringify(e,((e,t)=>t)))}},4570:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return new o.default(e,t)};var n,o=(n=r(5923))&&n.__esModule?n:{default:n};e.exports=t.default},5923:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(6863))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t){super(e,t),this.rule=e,void 0!==t.player&&({player:this.player}=t)}doesRuleMatch(e){return void 0===e.player||e.player===this.player}}t.default=a,e.exports=t.default},1595:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(4570)),o=a(r(6863));function a(e){return e&&e.__esModule?e:{default:e}}class u extends o.default{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(e,t),this.pieceRule=e,this.name=e.name,t.player&&(this.player=t.player),this.options=t,this.pool=(e.variants?Object.entries(e.variants):[]).reduce(((t,r)=>{let[o,a]=r;const u=a.count||1;return[...t,...Array.from(Array(u)).map((t=>(0,n.default)({...{...e,variantId:o},...a},this.options)))]}),[]),e.shuffled&&(this.pool=this.pool.map((e=>({value:e,sort:Math.random()}))).sort(((e,t)=>e.sort-t.sort)).map((e=>{let{value:t}=e;return t}))),this.count=this.pool.length||e.count}getOne(){return this.getMultiple(1)[0]}getMultiple(e){const t=[];if(void 0===this.count||this.count>=e){this.count&&(this.count-=e);const r=e-this.pool.length;t.push(...this.pool.splice(0,e)),r>0&&t.push(...Array.from(new Array(r)).map((()=>(0,n.default)(this.pieceRule,this.options))))}return t}put(e){void 0!==this.count&&(this.count+=1),this.pool.push(e)}}t.default=u,e.exports=t.default},6835:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(6863))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t,r){super(e,t,r),this.rule=e,this.index=t,r&&(this.id=r)}}t.default=a,e.exports=t.default},8353:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registry=void 0;var n=S(r(2655)),o=S(r(9278)),a=S(r(9645)),u=S(r(5149)),s=S(r(5059)),i=S(r(9578)),c=S(r(893)),l=S(r(21)),f=S(r(6829)),d=S(r(3551)),p=S(r(7963)),v=S(r(7213)),h=S(r(923)),y=S(r(3790)),b=S(r(3395)),_=S(r(226)),x=S(r(3402)),g=S(r(7102)),j=S(r(5923)),w=S(r(1595)),O=S(r(6835)),m=S(r(4221)),M=S(r(7820)),P=S(r(6863)),A=S(r(7971));function S(e){return e&&e.__esModule?e:{default:e}}t.registry={Action:n.default,MovePieceAction:o.default,SelectPieceAction:a.default,SwapAction:u.default,BoardGroup:s.default,Board:i.default,Grid:c.default,Stack:l.default,ActionTypeMatchesCondition:f.default,BingoCondition:d.default,BlackoutCondition:p.default,Condition:v.default,ContainsCondition:h.default,DoesNotContainCondition:y.default,IsValidPlayerCondition:b.default,PieceMatchesCondition:_.default,RelativeMoveCondition:x.default,SomeCondition:g.default,Piece:j.default,Pile:w.default,Player:O.default,Round:m.default,SequentialPlayerTurn:M.default,Serializable:P.default,Space:A.default}},6270:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("sequentialPlayerTurn"===e.type)return new o.default(e,t)};var n,o=(n=r(7820))&&n.__esModule?n:{default:n};e.exports=t.default},4221:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(9448)),o=a(r(6863));function a(e){return e&&e.__esModule?e:{default:e}}class u extends o.default{constructor(e,t){super(e,t),this.rules=e,this.game=t,this.history=[],this.actions=e.actions?.map((e=>(0,n.default)(e,this.game)))}getCorrectAction(e){for(const t of this.actions)try{return t.assertIsValid(e),t}catch(e){throw e}throw new Error(`Invalid Action: ${JSON.stringify(e)}`)}doAction(e){this.getCorrectAction(e).do(e,this.game),this.afterDoAction(),this.history.push(e)}isOver(){return!0}afterDoAction(){}}t.default=u,e.exports=t.default},7820:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(4221))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e,t){super(e,t),this.currentPlayerIndex=0}afterDoAction(){this.currentPlayerIndex=(this.currentPlayerIndex+1)%this.game.players.length}isOver(){return this.game.players.every((e=>this.history.some((t=>t===e))))}}t.default=a,e.exports=t.default},6863:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=class{constructor(){this.args=[...arguments].filter((e=>!e||void 0===e.status)),this.id=`${Math.random()}`}toJSON(){const e={...this,constructorName:this.constructor.name};return delete e.game,e}},e.exports=t.default},7971:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,o=(n=r(6863))&&n.__esModule?n:{default:n};class a extends o.default{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];super(e,t),this.coordinates=e,this.pieces=t}placePiece(e){this.pieces.push(e)}isEmpty(){return 0===this.pieces.length}}t.default=a,e.exports=t.default},4229:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t,r){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:new Set,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:new Set;if(o.has(t))return a;if(o.add(t),r(t)&&a.add(n),"object"==typeof t&&null!==t)for(const u in t){const s=[...n,u];e(t[u],r,s,o,a).length&&a.add(n)}return a},e.exports=t.default},6123:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(Array.isArray(e))return(0,o.default)(t,e);const r=new WeakSet;return function t(n){if(!n||"object"!=typeof n)return null;if(r.has(n))return null;if(r.add(n),n.id===e.id)return n;if(n.grid&&Array.isArray(n.grid))for(const e of n.grid)for(const r of e){const e=t(r);if(e)return e}for(const e of Object.values(n)){const r=t(e);if(r)return r}return null}(t)};var n,o=(n=r(8156))&&n.__esModule?n:{default:n};e.exports=t.default},4093:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e?.id){const r=[t.sharedBoard,t.personalBoards];for(;r.length;){const t=r.pop();if(t)if(Array.isArray(t))r.push(...t);else if(t.grid)for(const e of t.grid)r.push(...e);else if(t.coordinates&&t.pieces){const r=t.pieces.find((t=>t.id===e.id));if(r)return r}else"object"==typeof t&&r.push(...Object.values(t))}return null}let r;if(r=e?t.pieces.find((t=>t.name===e.name&&(!t.player||t.player.id===e.player?.id))):t.pieces.find((e=>"playerMarker"===e.name&&(!e.player||e.player.id===t.players[t.currentRound.currentPlayerIndex].id))),!r)throw new Error(`No piece group found for ${e.name}`);return r.getOne()},e.exports=t.default},5580:(e,t,r)=>{var n=r(6110)(r(9325),"DataView");e.exports=n},1549:(e,t,r)=>{var n=r(2032),o=r(3862),a=r(6721),u=r(2749),s=r(5749);function i(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}i.prototype.clear=n,i.prototype.delete=o,i.prototype.get=a,i.prototype.has=u,i.prototype.set=s,e.exports=i},79:(e,t,r)=>{var n=r(3702),o=r(80),a=r(4739),u=r(8655),s=r(1175);function i(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}i.prototype.clear=n,i.prototype.delete=o,i.prototype.get=a,i.prototype.has=u,i.prototype.set=s,e.exports=i},8223:(e,t,r)=>{var n=r(6110)(r(9325),"Map");e.exports=n},3661:(e,t,r)=>{var n=r(3040),o=r(7670),a=r(289),u=r(4509),s=r(2949);function i(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}i.prototype.clear=n,i.prototype.delete=o,i.prototype.get=a,i.prototype.has=u,i.prototype.set=s,e.exports=i},2804:(e,t,r)=>{var n=r(6110)(r(9325),"Promise");e.exports=n},6545:(e,t,r)=>{var n=r(6110)(r(9325),"Set");e.exports=n},8859:(e,t,r)=>{var n=r(3661),o=r(1380),a=r(1459);function u(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new n;++t<r;)this.add(e[t])}u.prototype.add=u.prototype.push=o,u.prototype.has=a,e.exports=u},7217:(e,t,r)=>{var n=r(79),o=r(1420),a=r(938),u=r(3605),s=r(9817),i=r(945);function c(e){var t=this.__data__=new n(e);this.size=t.size}c.prototype.clear=o,c.prototype.delete=a,c.prototype.get=u,c.prototype.has=s,c.prototype.set=i,e.exports=c},1873:(e,t,r)=>{var n=r(9325).Symbol;e.exports=n},7828:(e,t,r)=>{var n=r(9325).Uint8Array;e.exports=n},8303:(e,t,r)=>{var n=r(6110)(r(9325),"WeakMap");e.exports=n},1033:e=>{e.exports=function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}},3729:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length;++r<n&&!1!==t(e[r],r,e););return e}},9770:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length,o=0,a=[];++r<n;){var u=e[r];t(u,r,e)&&(a[o++]=u)}return a}},695:(e,t,r)=>{var n=r(8096),o=r(2428),a=r(6449),u=r(3656),s=r(361),i=r(7167),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var r=a(e),l=!r&&o(e),f=!r&&!l&&u(e),d=!r&&!l&&!f&&i(e),p=r||l||f||d,v=p?n(e.length,String):[],h=v.length;for(var y in e)!t&&!c.call(e,y)||p&&("length"==y||f&&("offset"==y||"parent"==y)||d&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||s(y,h))||v.push(y);return v}},4932:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}},4528:e=>{e.exports=function(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e}},4248:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1}},7805:(e,t,r)=>{var n=r(3360),o=r(5288);e.exports=function(e,t,r){(void 0!==r&&!o(e[t],r)||void 0===r&&!(t in e))&&n(e,t,r)}},6547:(e,t,r)=>{var n=r(3360),o=r(5288),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,r){var u=e[t];a.call(e,t)&&o(u,r)&&(void 0!==r||t in e)||n(e,t,r)}},6025:(e,t,r)=>{var n=r(5288);e.exports=function(e,t){for(var r=e.length;r--;)if(n(e[r][0],t))return r;return-1}},4733:(e,t,r)=>{var n=r(1791),o=r(5950);e.exports=function(e,t){return e&&n(t,o(t),e)}},3838:(e,t,r)=>{var n=r(1791),o=r(7241);e.exports=function(e,t){return e&&n(t,o(t),e)}},3360:(e,t,r)=>{var n=r(3243);e.exports=function(e,t,r){"__proto__"==t&&n?n(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}},9999:(e,t,r)=>{var n=r(7217),o=r(3729),a=r(6547),u=r(4733),s=r(3838),i=r(3290),c=r(3007),l=r(2271),f=r(8948),d=r(2),p=r(3349),v=r(5861),h=r(6189),y=r(7199),b=r(5529),_=r(6449),x=r(3656),g=r(7730),j=r(3805),w=r(8440),O=r(5950),m=r(7241),M="[object Arguments]",P="[object Function]",A="[object Object]",S={};S[M]=S["[object Array]"]=S["[object ArrayBuffer]"]=S["[object DataView]"]=S["[object Boolean]"]=S["[object Date]"]=S["[object Float32Array]"]=S["[object Float64Array]"]=S["[object Int8Array]"]=S["[object Int16Array]"]=S["[object Int32Array]"]=S["[object Map]"]=S["[object Number]"]=S[A]=S["[object RegExp]"]=S["[object Set]"]=S["[object String]"]=S["[object Symbol]"]=S["[object Uint8Array]"]=S["[object Uint8ClampedArray]"]=S["[object Uint16Array]"]=S["[object Uint32Array]"]=!0,S["[object Error]"]=S[P]=S["[object WeakMap]"]=!1,e.exports=function e(t,r,B,I,E,R){var C,k=1&r,z=2&r,T=4&r;if(B&&(C=E?B(t,I,E,R):B(t)),void 0!==C)return C;if(!j(t))return t;var N=_(t);if(N){if(C=h(t),!k)return c(t,C)}else{var F=v(t),D=F==P||"[object GeneratorFunction]"==F;if(x(t))return i(t,k);if(F==A||F==M||D&&!E){if(C=z||D?{}:b(t),!k)return z?f(t,s(C,t)):l(t,u(C,t))}else{if(!S[F])return E?t:{};C=y(t,F,k)}}R||(R=new n);var U=R.get(t);if(U)return U;R.set(t,C),w(t)?t.forEach((function(n){C.add(e(n,r,B,n,t,R))})):g(t)&&t.forEach((function(n,o){C.set(o,e(n,r,B,o,t,R))}));var $=N?void 0:(T?z?p:d:z?m:O)(t);return o($||t,(function(n,o){$&&(n=t[o=n]),a(C,o,e(n,r,B,o,t,R))})),C}},9344:(e,t,r)=>{var n=r(3805),o=Object.create,a=function(){function e(){}return function(t){if(!n(t))return{};if(o)return o(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();e.exports=a},6649:(e,t,r)=>{var n=r(3221)();e.exports=n},7422:(e,t,r)=>{var n=r(1769),o=r(7797);e.exports=function(e,t){for(var r=0,a=(t=n(t,e)).length;null!=e&&r<a;)e=e[o(t[r++])];return r&&r==a?e:void 0}},2199:(e,t,r)=>{var n=r(4528),o=r(6449);e.exports=function(e,t,r){var a=t(e);return o(e)?a:n(a,r(e))}},2552:(e,t,r)=>{var n=r(1873),o=r(659),a=r(9350),u=n?n.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":u&&u in Object(e)?o(e):a(e)}},7534:(e,t,r)=>{var n=r(2552),o=r(346);e.exports=function(e){return o(e)&&"[object Arguments]"==n(e)}},270:(e,t,r)=>{var n=r(7068),o=r(346);e.exports=function e(t,r,a,u,s){return t===r||(null==t||null==r||!o(t)&&!o(r)?t!=t&&r!=r:n(t,r,a,u,e,s))}},7068:(e,t,r)=>{var n=r(7217),o=r(5911),a=r(1986),u=r(689),s=r(5861),i=r(6449),c=r(3656),l=r(7167),f="[object Arguments]",d="[object Array]",p="[object Object]",v=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,h,y,b){var _=i(e),x=i(t),g=_?d:s(e),j=x?d:s(t),w=(g=g==f?p:g)==p,O=(j=j==f?p:j)==p,m=g==j;if(m&&c(e)){if(!c(t))return!1;_=!0,w=!1}if(m&&!w)return b||(b=new n),_||l(e)?o(e,t,r,h,y,b):a(e,t,g,r,h,y,b);if(!(1&r)){var M=w&&v.call(e,"__wrapped__"),P=O&&v.call(t,"__wrapped__");if(M||P){var A=M?e.value():e,S=P?t.value():t;return b||(b=new n),y(A,S,r,h,b)}}return!!m&&(b||(b=new n),u(e,t,r,h,y,b))}},9172:(e,t,r)=>{var n=r(5861),o=r(346);e.exports=function(e){return o(e)&&"[object Map]"==n(e)}},1799:(e,t,r)=>{var n=r(7217),o=r(270);e.exports=function(e,t,r,a){var u=r.length,s=u,i=!a;if(null==e)return!s;for(e=Object(e);u--;){var c=r[u];if(i&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++u<s;){var l=(c=r[u])[0],f=e[l],d=c[1];if(i&&c[2]){if(void 0===f&&!(l in e))return!1}else{var p=new n;if(a)var v=a(f,d,l,e,t,p);if(!(void 0===v?o(d,f,3,a,p):v))return!1}}return!0}},5083:(e,t,r)=>{var n=r(1882),o=r(7296),a=r(3805),u=r(7473),s=/^\[object .+?Constructor\]$/,i=Function.prototype,c=Object.prototype,l=i.toString,f=c.hasOwnProperty,d=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!a(e)||o(e))&&(n(e)?d:s).test(u(e))}},6038:(e,t,r)=>{var n=r(5861),o=r(346);e.exports=function(e){return o(e)&&"[object Set]"==n(e)}},4901:(e,t,r)=>{var n=r(2552),o=r(294),a=r(346),u={};u["[object Float32Array]"]=u["[object Float64Array]"]=u["[object Int8Array]"]=u["[object Int16Array]"]=u["[object Int32Array]"]=u["[object Uint8Array]"]=u["[object Uint8ClampedArray]"]=u["[object Uint16Array]"]=u["[object Uint32Array]"]=!0,u["[object Arguments]"]=u["[object Array]"]=u["[object ArrayBuffer]"]=u["[object Boolean]"]=u["[object DataView]"]=u["[object Date]"]=u["[object Error]"]=u["[object Function]"]=u["[object Map]"]=u["[object Number]"]=u["[object Object]"]=u["[object RegExp]"]=u["[object Set]"]=u["[object String]"]=u["[object WeakMap]"]=!1,e.exports=function(e){return a(e)&&o(e.length)&&!!u[n(e)]}},8984:(e,t,r)=>{var n=r(5527),o=r(3650),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return o(e);var t=[];for(var r in Object(e))a.call(e,r)&&"constructor"!=r&&t.push(r);return t}},2903:(e,t,r)=>{var n=r(3805),o=r(5527),a=r(181),u=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return a(e);var t=o(e),r=[];for(var s in e)("constructor"!=s||!t&&u.call(e,s))&&r.push(s);return r}},3663:(e,t,r)=>{var n=r(1799),o=r(776),a=r(7197);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(r){return r===e||n(r,e,t)}}},5250:(e,t,r)=>{var n=r(7217),o=r(7805),a=r(6649),u=r(2824),s=r(3805),i=r(7241),c=r(4974);e.exports=function e(t,r,l,f,d){t!==r&&a(r,(function(a,i){if(d||(d=new n),s(a))u(t,r,i,l,e,f,d);else{var p=f?f(c(t,i),a,i+"",t,r,d):void 0;void 0===p&&(p=a),o(t,i,p)}}),i)}},2824:(e,t,r)=>{var n=r(7805),o=r(3290),a=r(1961),u=r(3007),s=r(5529),i=r(2428),c=r(6449),l=r(3693),f=r(3656),d=r(1882),p=r(3805),v=r(1331),h=r(7167),y=r(4974),b=r(9884);e.exports=function(e,t,r,_,x,g,j){var w=y(e,r),O=y(t,r),m=j.get(O);if(m)n(e,r,m);else{var M=g?g(w,O,r+"",e,t,j):void 0,P=void 0===M;if(P){var A=c(O),S=!A&&f(O),B=!A&&!S&&h(O);M=O,A||S||B?c(w)?M=w:l(w)?M=u(w):S?(P=!1,M=o(O,!0)):B?(P=!1,M=a(O,!0)):M=[]:v(O)||i(O)?(M=w,i(w)?M=b(w):p(w)&&!d(w)||(M=s(O))):P=!1}P&&(j.set(O,M),x(M,O,_,g,j),j.delete(O)),n(e,r,M)}}},9302:(e,t,r)=>{var n=r(3488),o=r(6757),a=r(2865);e.exports=function(e,t){return a(o(e,t,n),e+"")}},9570:(e,t,r)=>{var n=r(7334),o=r(3243),a=r(3488),u=o?function(e,t){return o(e,"toString",{configurable:!0,enumerable:!1,value:n(t),writable:!0})}:a;e.exports=u},8096:e=>{e.exports=function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}},7556:(e,t,r)=>{var n=r(1873),o=r(4932),a=r(6449),u=r(4394),s=n?n.prototype:void 0,i=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(a(t))return o(t,e)+"";if(u(t))return i?i.call(t):"";var r=t+"";return"0"==r&&1/t==-1/0?"-0":r}},7301:e=>{e.exports=function(e){return function(t){return e(t)}}},9219:e=>{e.exports=function(e,t){return e.has(t)}},1769:(e,t,r)=>{var n=r(6449),o=r(8586),a=r(1802),u=r(3222);e.exports=function(e,t){return n(e)?e:o(e,t)?[e]:a(u(e))}},9653:(e,t,r)=>{var n=r(7828);e.exports=function(e){var t=new e.constructor(e.byteLength);return new n(t).set(new n(e)),t}},3290:(e,t,r)=>{e=r.nmd(e);var n=r(9325),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,u=a&&a.exports===o?n.Buffer:void 0,s=u?u.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var r=e.length,n=s?s(r):new e.constructor(r);return e.copy(n),n}},6169:(e,t,r)=>{var n=r(9653);e.exports=function(e,t){var r=t?n(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}},3201:e=>{var t=/\w*$/;e.exports=function(e){var r=new e.constructor(e.source,t.exec(e));return r.lastIndex=e.lastIndex,r}},3736:(e,t,r)=>{var n=r(1873),o=n?n.prototype:void 0,a=o?o.valueOf:void 0;e.exports=function(e){return a?Object(a.call(e)):{}}},1961:(e,t,r)=>{var n=r(9653);e.exports=function(e,t){var r=t?n(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}},3007:e=>{e.exports=function(e,t){var r=-1,n=e.length;for(t||(t=Array(n));++r<n;)t[r]=e[r];return t}},1791:(e,t,r)=>{var n=r(6547),o=r(3360);e.exports=function(e,t,r,a){var u=!r;r||(r={});for(var s=-1,i=t.length;++s<i;){var c=t[s],l=a?a(r[c],e[c],c,r,e):void 0;void 0===l&&(l=e[c]),u?o(r,c,l):n(r,c,l)}return r}},2271:(e,t,r)=>{var n=r(1791),o=r(4664);e.exports=function(e,t){return n(e,o(e),t)}},8948:(e,t,r)=>{var n=r(1791),o=r(6375);e.exports=function(e,t){return n(e,o(e),t)}},5481:(e,t,r)=>{var n=r(9325)["__core-js_shared__"];e.exports=n},999:(e,t,r)=>{var n=r(9302),o=r(6800);e.exports=function(e){return n((function(t,r){var n=-1,a=r.length,u=a>1?r[a-1]:void 0,s=a>2?r[2]:void 0;for(u=e.length>3&&"function"==typeof u?(a--,u):void 0,s&&o(r[0],r[1],s)&&(u=a<3?void 0:u,a=1),t=Object(t);++n<a;){var i=r[n];i&&e(t,i,n,u)}return t}))}},3221:e=>{e.exports=function(e){return function(t,r,n){for(var o=-1,a=Object(t),u=n(t),s=u.length;s--;){var i=u[e?s:++o];if(!1===r(a[i],i,a))break}return t}}},3243:(e,t,r)=>{var n=r(6110),o=function(){try{var e=n(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=o},5911:(e,t,r)=>{var n=r(8859),o=r(4248),a=r(9219);e.exports=function(e,t,r,u,s,i){var c=1&r,l=e.length,f=t.length;if(l!=f&&!(c&&f>l))return!1;var d=i.get(e),p=i.get(t);if(d&&p)return d==t&&p==e;var v=-1,h=!0,y=2&r?new n:void 0;for(i.set(e,t),i.set(t,e);++v<l;){var b=e[v],_=t[v];if(u)var x=c?u(_,b,v,t,e,i):u(b,_,v,e,t,i);if(void 0!==x){if(x)continue;h=!1;break}if(y){if(!o(t,(function(e,t){if(!a(y,t)&&(b===e||s(b,e,r,u,i)))return y.push(t)}))){h=!1;break}}else if(b!==_&&!s(b,_,r,u,i)){h=!1;break}}return i.delete(e),i.delete(t),h}},1986:(e,t,r)=>{var n=r(1873),o=r(7828),a=r(5288),u=r(5911),s=r(317),i=r(4247),c=n?n.prototype:void 0,l=c?c.valueOf:void 0;e.exports=function(e,t,r,n,c,f,d){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!f(new o(e),new o(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return a(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var p=s;case"[object Set]":var v=1&n;if(p||(p=i),e.size!=t.size&&!v)return!1;var h=d.get(e);if(h)return h==t;n|=2,d.set(e,t);var y=u(p(e),p(t),n,c,f,d);return d.delete(e),y;case"[object Symbol]":if(l)return l.call(e)==l.call(t)}return!1}},689:(e,t,r)=>{var n=r(2),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,a,u,s){var i=1&r,c=n(e),l=c.length;if(l!=n(t).length&&!i)return!1;for(var f=l;f--;){var d=c[f];if(!(i?d in t:o.call(t,d)))return!1}var p=s.get(e),v=s.get(t);if(p&&v)return p==t&&v==e;var h=!0;s.set(e,t),s.set(t,e);for(var y=i;++f<l;){var b=e[d=c[f]],_=t[d];if(a)var x=i?a(_,b,d,t,e,s):a(b,_,d,e,t,s);if(!(void 0===x?b===_||u(b,_,r,a,s):x)){h=!1;break}y||(y="constructor"==d)}if(h&&!y){var g=e.constructor,j=t.constructor;g==j||!("constructor"in e)||!("constructor"in t)||"function"==typeof g&&g instanceof g&&"function"==typeof j&&j instanceof j||(h=!1)}return s.delete(e),s.delete(t),h}},4840:(e,t,r)=>{var n="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g;e.exports=n},2:(e,t,r)=>{var n=r(2199),o=r(4664),a=r(5950);e.exports=function(e){return n(e,a,o)}},3349:(e,t,r)=>{var n=r(2199),o=r(6375),a=r(7241);e.exports=function(e){return n(e,a,o)}},2651:(e,t,r)=>{var n=r(4218);e.exports=function(e,t){var r=e.__data__;return n(t)?r["string"==typeof t?"string":"hash"]:r.map}},776:(e,t,r)=>{var n=r(756),o=r(5950);e.exports=function(e){for(var t=o(e),r=t.length;r--;){var a=t[r],u=e[a];t[r]=[a,u,n(u)]}return t}},6110:(e,t,r)=>{var n=r(5083),o=r(392);e.exports=function(e,t){var r=o(e,t);return n(r)?r:void 0}},8879:(e,t,r)=>{var n=r(4335)(Object.getPrototypeOf,Object);e.exports=n},659:(e,t,r)=>{var n=r(1873),o=Object.prototype,a=o.hasOwnProperty,u=o.toString,s=n?n.toStringTag:void 0;e.exports=function(e){var t=a.call(e,s),r=e[s];try{e[s]=void 0;var n=!0}catch(e){}var o=u.call(e);return n&&(t?e[s]=r:delete e[s]),o}},4664:(e,t,r)=>{var n=r(9770),o=r(3345),a=Object.prototype.propertyIsEnumerable,u=Object.getOwnPropertySymbols,s=u?function(e){return null==e?[]:(e=Object(e),n(u(e),(function(t){return a.call(e,t)})))}:o;e.exports=s},6375:(e,t,r)=>{var n=r(4528),o=r(8879),a=r(4664),u=r(3345),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)n(t,a(e)),e=o(e);return t}:u;e.exports=s},5861:(e,t,r)=>{var n=r(5580),o=r(8223),a=r(2804),u=r(6545),s=r(8303),i=r(2552),c=r(7473),l="[object Map]",f="[object Promise]",d="[object Set]",p="[object WeakMap]",v="[object DataView]",h=c(n),y=c(o),b=c(a),_=c(u),x=c(s),g=i;(n&&g(new n(new ArrayBuffer(1)))!=v||o&&g(new o)!=l||a&&g(a.resolve())!=f||u&&g(new u)!=d||s&&g(new s)!=p)&&(g=function(e){var t=i(e),r="[object Object]"==t?e.constructor:void 0,n=r?c(r):"";if(n)switch(n){case h:return v;case y:return l;case b:return f;case _:return d;case x:return p}return t}),e.exports=g},392:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},2032:(e,t,r)=>{var n=r(1042);e.exports=function(){this.__data__=n?n(null):{},this.size=0}},3862:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},6721:(e,t,r)=>{var n=r(1042),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(n){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return o.call(t,e)?t[e]:void 0}},2749:(e,t,r)=>{var n=r(1042),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return n?void 0!==t[e]:o.call(t,e)}},5749:(e,t,r)=>{var n=r(1042);e.exports=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=n&&void 0===t?"__lodash_hash_undefined__":t,this}},6189:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e){var r=e.length,n=new e.constructor(r);return r&&"string"==typeof e[0]&&t.call(e,"index")&&(n.index=e.index,n.input=e.input),n}},7199:(e,t,r)=>{var n=r(9653),o=r(6169),a=r(3201),u=r(3736),s=r(1961);e.exports=function(e,t,r){var i=e.constructor;switch(t){case"[object ArrayBuffer]":return n(e);case"[object Boolean]":case"[object Date]":return new i(+e);case"[object DataView]":return o(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return s(e,r);case"[object Map]":case"[object Set]":return new i;case"[object Number]":case"[object String]":return new i(e);case"[object RegExp]":return a(e);case"[object Symbol]":return u(e)}}},5529:(e,t,r)=>{var n=r(9344),o=r(8879),a=r(5527);e.exports=function(e){return"function"!=typeof e.constructor||a(e)?{}:n(o(e))}},361:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,r){var n=typeof e;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&t.test(e))&&e>-1&&e%1==0&&e<r}},6800:(e,t,r)=>{var n=r(5288),o=r(4894),a=r(361),u=r(3805);e.exports=function(e,t,r){if(!u(r))return!1;var s=typeof t;return!!("number"==s?o(r)&&a(t,r.length):"string"==s&&t in r)&&n(r[t],e)}},8586:(e,t,r)=>{var n=r(6449),o=r(4394),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,u=/^\w*$/;e.exports=function(e,t){if(n(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!o(e))||u.test(e)||!a.test(e)||null!=t&&e in Object(t)}},4218:e=>{e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},7296:(e,t,r)=>{var n,o=r(5481),a=(n=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function(e){return!!a&&a in e}},5527:e=>{var t=Object.prototype;e.exports=function(e){var r=e&&e.constructor;return e===("function"==typeof r&&r.prototype||t)}},756:(e,t,r)=>{var n=r(3805);e.exports=function(e){return e==e&&!n(e)}},3702:e=>{e.exports=function(){this.__data__=[],this.size=0}},80:(e,t,r)=>{var n=r(6025),o=Array.prototype.splice;e.exports=function(e){var t=this.__data__,r=n(t,e);return!(r<0||(r==t.length-1?t.pop():o.call(t,r,1),--this.size,0))}},4739:(e,t,r)=>{var n=r(6025);e.exports=function(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}},8655:(e,t,r)=>{var n=r(6025);e.exports=function(e){return n(this.__data__,e)>-1}},1175:(e,t,r)=>{var n=r(6025);e.exports=function(e,t){var r=this.__data__,o=n(r,e);return o<0?(++this.size,r.push([e,t])):r[o][1]=t,this}},3040:(e,t,r)=>{var n=r(1549),o=r(79),a=r(8223);e.exports=function(){this.size=0,this.__data__={hash:new n,map:new(a||o),string:new n}}},7670:(e,t,r)=>{var n=r(2651);e.exports=function(e){var t=n(this,e).delete(e);return this.size-=t?1:0,t}},289:(e,t,r)=>{var n=r(2651);e.exports=function(e){return n(this,e).get(e)}},4509:(e,t,r)=>{var n=r(2651);e.exports=function(e){return n(this,e).has(e)}},2949:(e,t,r)=>{var n=r(2651);e.exports=function(e,t){var r=n(this,e),o=r.size;return r.set(e,t),this.size+=r.size==o?0:1,this}},317:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}},7197:e=>{e.exports=function(e,t){return function(r){return null!=r&&r[e]===t&&(void 0!==t||e in Object(r))}}},2224:(e,t,r)=>{var n=r(104);e.exports=function(e){var t=n(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}},1042:(e,t,r)=>{var n=r(6110)(Object,"create");e.exports=n},3650:(e,t,r)=>{var n=r(4335)(Object.keys,Object);e.exports=n},181:e=>{e.exports=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t}},6009:(e,t,r)=>{e=r.nmd(e);var n=r(4840),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,u=a&&a.exports===o&&n.process,s=function(){try{return a&&a.require&&a.require("util").types||u&&u.binding&&u.binding("util")}catch(e){}}();e.exports=s},9350:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},4335:e=>{e.exports=function(e,t){return function(r){return e(t(r))}}},6757:(e,t,r)=>{var n=r(1033),o=Math.max;e.exports=function(e,t,r){return t=o(void 0===t?e.length-1:t,0),function(){for(var a=arguments,u=-1,s=o(a.length-t,0),i=Array(s);++u<s;)i[u]=a[t+u];u=-1;for(var c=Array(t+1);++u<t;)c[u]=a[u];return c[t]=r(i),n(e,this,c)}}},9325:(e,t,r)=>{var n=r(4840),o="object"==typeof self&&self&&self.Object===Object&&self,a=n||o||Function("return this")();e.exports=a},4974:e=>{e.exports=function(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]}},1380:e=>{e.exports=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},1459:e=>{e.exports=function(e){return this.__data__.has(e)}},4247:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},2865:(e,t,r)=>{var n=r(9570),o=r(1811)(n);e.exports=o},1811:e=>{var t=Date.now;e.exports=function(e){var r=0,n=0;return function(){var o=t(),a=16-(o-n);if(n=o,a>0){if(++r>=800)return arguments[0]}else r=0;return e.apply(void 0,arguments)}}},1420:(e,t,r)=>{var n=r(79);e.exports=function(){this.__data__=new n,this.size=0}},938:e=>{e.exports=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},3605:e=>{e.exports=function(e){return this.__data__.get(e)}},9817:e=>{e.exports=function(e){return this.__data__.has(e)}},945:(e,t,r)=>{var n=r(79),o=r(8223),a=r(3661);e.exports=function(e,t){var r=this.__data__;if(r instanceof n){var u=r.__data__;if(!o||u.length<199)return u.push([e,t]),this.size=++r.size,this;r=this.__data__=new a(u)}return r.set(e,t),this.size=r.size,this}},1802:(e,t,r)=>{var n=r(2224),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,a=/\\(\\)?/g,u=n((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(o,(function(e,r,n,o){t.push(n?o.replace(a,"$1"):r||e)})),t}));e.exports=u},7797:(e,t,r)=>{var n=r(4394);e.exports=function(e){if("string"==typeof e||n(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}},7473:e=>{var t=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return t.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},8055:(e,t,r)=>{var n=r(9999);e.exports=function(e){return n(e,5)}},7334:e=>{e.exports=function(e){return function(){return e}}},5288:e=>{e.exports=function(e,t){return e===t||e!=e&&t!=t}},8156:(e,t,r)=>{var n=r(7422);e.exports=function(e,t,r){var o=null==e?void 0:n(e,t);return void 0===o?r:o}},3488:e=>{e.exports=function(e){return e}},2428:(e,t,r)=>{var n=r(7534),o=r(346),a=Object.prototype,u=a.hasOwnProperty,s=a.propertyIsEnumerable,i=n(function(){return arguments}())?n:function(e){return o(e)&&u.call(e,"callee")&&!s.call(e,"callee")};e.exports=i},6449:e=>{var t=Array.isArray;e.exports=t},4894:(e,t,r)=>{var n=r(1882),o=r(294);e.exports=function(e){return null!=e&&o(e.length)&&!n(e)}},3693:(e,t,r)=>{var n=r(4894),o=r(346);e.exports=function(e){return o(e)&&n(e)}},3656:(e,t,r)=>{e=r.nmd(e);var n=r(9325),o=r(9935),a=t&&!t.nodeType&&t,u=a&&e&&!e.nodeType&&e,s=u&&u.exports===a?n.Buffer:void 0,i=(s?s.isBuffer:void 0)||o;e.exports=i},1882:(e,t,r)=>{var n=r(2552),o=r(3805);e.exports=function(e){if(!o(e))return!1;var t=n(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},294:e=>{e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},7730:(e,t,r)=>{var n=r(9172),o=r(7301),a=r(6009),u=a&&a.isMap,s=u?o(u):n;e.exports=s},3805:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},346:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},1331:(e,t,r)=>{var n=r(2552),o=r(8879),a=r(346),u=Function.prototype,s=Object.prototype,i=u.toString,c=s.hasOwnProperty,l=i.call(Object);e.exports=function(e){if(!a(e)||"[object Object]"!=n(e))return!1;var t=o(e);if(null===t)return!0;var r=c.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&i.call(r)==l}},8440:(e,t,r)=>{var n=r(6038),o=r(7301),a=r(6009),u=a&&a.isSet,s=u?o(u):n;e.exports=s},4394:(e,t,r)=>{var n=r(2552),o=r(346);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==n(e)}},7167:(e,t,r)=>{var n=r(4901),o=r(7301),a=r(6009),u=a&&a.isTypedArray,s=u?o(u):n;e.exports=s},5950:(e,t,r)=>{var n=r(695),o=r(8984),a=r(4894);e.exports=function(e){return a(e)?n(e):o(e)}},7241:(e,t,r)=>{var n=r(695),o=r(2903),a=r(4894);e.exports=function(e){return a(e)?n(e,!0):o(e)}},1505:(e,t,r)=>{var n=r(9999),o=r(3663);e.exports=function(e){return o(n(e,1))}},104:(e,t,r)=>{var n=r(3661);function o(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],a=r.cache;if(a.has(o))return a.get(o);var u=e.apply(this,n);return r.cache=a.set(o,u)||a,u};return r.cache=new(o.Cache||n),r}o.Cache=n,e.exports=o},5364:(e,t,r)=>{var n=r(5250),o=r(999)((function(e,t,r){n(e,t,r)}));e.exports=o},3345:e=>{e.exports=function(){return[]}},9935:e=>{e.exports=function(){return!1}},9884:(e,t,r)=>{var n=r(1791),o=r(7241);e.exports=function(e){return n(e,o(e))}},3222:(e,t,r)=>{var n=r(7556);e.exports=function(e){return null==e?"":n(e)}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={id:n,loaded:!1,exports:{}};return e[n](a,a.exports,r),a.loaded=!0,a.exports}r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var n={};return(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"makeMove",{enumerable:!0,get:function(){return t.makeMove}});var t=r(8989)})(),n})()));
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
testEnvironment: 'node',
|
|
3
|
+
transform: {
|
|
4
|
+
'^.+\\.(js|ts)$': ['babel-jest', {
|
|
5
|
+
presets: [
|
|
6
|
+
'@babel/preset-typescript',
|
|
7
|
+
['@babel/preset-env', {
|
|
8
|
+
modules: 'cjs',
|
|
9
|
+
targets: { node: 'current' }
|
|
10
|
+
}]
|
|
11
|
+
],
|
|
12
|
+
plugins: ['add-module-exports']
|
|
13
|
+
}]
|
|
14
|
+
},
|
|
15
|
+
clearMocks: true,
|
|
16
|
+
moduleFileExtensions: ['js', 'ts', 'json'],
|
|
17
|
+
testMatch: [
|
|
18
|
+
'**/__tests__/**/*.(js|ts)',
|
|
19
|
+
'**/*.(test|spec).(js|ts)'
|
|
20
|
+
]
|
|
21
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "board-game-engine",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "wip board game engine",
|
|
5
|
+
"main": "dist/board-game-engine.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "jest --coverage --verbose false",
|
|
8
|
+
"lint": "eslint .",
|
|
9
|
+
"build": "webpack",
|
|
10
|
+
"prepublish": "npm run build"
|
|
11
|
+
},
|
|
12
|
+
"author": "Matthew Broatch",
|
|
13
|
+
"license": "ISC",
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@babel/preset-env": "^7.16.7",
|
|
16
|
+
"@babel/preset-typescript": "^7.27.1",
|
|
17
|
+
"babel-jest": "^27.4.4",
|
|
18
|
+
"babel-loader": "",
|
|
19
|
+
"babel-plugin-add-module-exports": "^1.0.4",
|
|
20
|
+
"core-js": "^3.20.2",
|
|
21
|
+
"eslint": "",
|
|
22
|
+
"eslint-config-standard": "^16.0.3",
|
|
23
|
+
"eslint-plugin-import": "^2.3.0",
|
|
24
|
+
"jest": "^27.4.3",
|
|
25
|
+
"standard": "^16.0.4",
|
|
26
|
+
"webpack": "^5.65.0",
|
|
27
|
+
"webpack-cli": "^4.9.1"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"wackson": "^1.1.0"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/mnbroatch/board-game-engine.git"
|
|
35
|
+
},
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/mnbroatch/board-game-engine/issues"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/mnbroatch/board-game-engine#readme"
|
|
40
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import MovePieceAction from "./move-piece-action.js";
|
|
2
|
+
import SwapAction from "./swap-action.js";
|
|
3
|
+
import SelectPieceAction from "./select-piece-action.js";
|
|
4
|
+
|
|
5
|
+
export default function actionFactory(actionPayload, game) {
|
|
6
|
+
if (actionPayload.type === "movePiece") {
|
|
7
|
+
return new MovePieceAction(actionPayload, game);
|
|
8
|
+
} else if (actionPayload.type === "swap") {
|
|
9
|
+
return new SwapAction(actionPayload, game);
|
|
10
|
+
} else if (actionPayload.type === "selectPiece") {
|
|
11
|
+
return new SelectPieceAction(actionPayload, game);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import conditionFactory from '../condition/condition-factory.js'
|
|
2
|
+
|
|
3
|
+
export default class Action {
|
|
4
|
+
constructor (rules, game) {
|
|
5
|
+
this.game = game
|
|
6
|
+
this.rules = rules
|
|
7
|
+
this.id = `${Math.random()}`
|
|
8
|
+
|
|
9
|
+
const invariantConditionRules = [
|
|
10
|
+
{ type: 'actionTypeMatches', actionRule: this.rules },
|
|
11
|
+
{ type: 'pieceMatches', actionRule: this.rules },
|
|
12
|
+
{ type: 'isValidPlayer' }
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
this.conditions = [
|
|
16
|
+
...invariantConditionRules,
|
|
17
|
+
...(this.rules.conditions || [])
|
|
18
|
+
].map((conditionRule) => conditionFactory(conditionRule, game))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
assertIsValid (actionPayload) {
|
|
22
|
+
const unmetConditions = this.conditions.filter(
|
|
23
|
+
(condition) => !condition.isMet(actionPayload)
|
|
24
|
+
)
|
|
25
|
+
if (unmetConditions.length) {
|
|
26
|
+
console.log('==================')
|
|
27
|
+
console.log('unmetConditions', unmetConditions)
|
|
28
|
+
console.log('actionPayload', actionPayload)
|
|
29
|
+
throw new Error('conditions not met ^')
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
do () {}
|
|
34
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Action from "./action.js";
|
|
2
|
+
import resolveBoard from "../utils/resolve-board.ts";
|
|
3
|
+
import resolvePiece from "../utils/resolve-piece.ts";
|
|
4
|
+
|
|
5
|
+
export default class MovePieceAction extends Action {
|
|
6
|
+
do(actionPayload) {
|
|
7
|
+
const piece = resolvePiece(actionPayload.piece, this.game);
|
|
8
|
+
const board = resolveBoard(actionPayload.board, this.game)
|
|
9
|
+
board.placePiece(actionPayload.target, piece);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Action from "./action.js";
|
|
2
|
+
|
|
3
|
+
export default class SelectPieceAction extends Action {
|
|
4
|
+
constructor(actionPayload, game) {
|
|
5
|
+
super(actionPayload, game);
|
|
6
|
+
}
|
|
7
|
+
do(actionPayload) {
|
|
8
|
+
let piece;
|
|
9
|
+
if (actionPayload.piece?.id) {
|
|
10
|
+
piece = this.game.getPiece({
|
|
11
|
+
id: actionPayload.piece?.id,
|
|
12
|
+
});
|
|
13
|
+
} else if (actionPayload.from === "player") {
|
|
14
|
+
piece = this.game.players
|
|
15
|
+
.find((player) => player.id === actionPayload.playerId)
|
|
16
|
+
.pieces.find((piece) => piece.name === actionPayload.piece.name)
|
|
17
|
+
.getOne();
|
|
18
|
+
}
|
|
19
|
+
this.game.context.selectedPiece = piece;
|
|
20
|
+
|
|
21
|
+
// do the "then"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Action from "./action.js";
|
|
2
|
+
|
|
3
|
+
export default class SwapAction extends Action {
|
|
4
|
+
do(actionPayload) {
|
|
5
|
+
let piece;
|
|
6
|
+
if (actionPayload.from === "player") {
|
|
7
|
+
piece = this.game.players
|
|
8
|
+
.find((player) => player.id === actionPayload.playerId)
|
|
9
|
+
.pieces.find((piece) => piece.name === actionPayload.piece.name)
|
|
10
|
+
.getOne();
|
|
11
|
+
}
|
|
12
|
+
this.game.get(actionPayload.board).placePiece(actionPayload.target, piece);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Grid from "./grid.js";
|
|
2
|
+
import Stack from "./stack.js";
|
|
3
|
+
|
|
4
|
+
export default function boardFactory(boardRule, options) {
|
|
5
|
+
if (boardRule.type === "grid") {
|
|
6
|
+
return new Grid(boardRule, options);
|
|
7
|
+
} else if (boardRule.type === "stack") {
|
|
8
|
+
return new Stack(boardRule, options);
|
|
9
|
+
} else {
|
|
10
|
+
console.log("missing board type:", boardRule);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import get from "lodash/get.js";
|
|
2
|
+
import Board from "./board.js";
|
|
3
|
+
import Space from "../space/space.ts";
|
|
4
|
+
|
|
5
|
+
export default class Grid extends Board {
|
|
6
|
+
constructor(boardRule, options) {
|
|
7
|
+
super(boardRule, options);
|
|
8
|
+
this.grid = makeGrid(boardRule);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
getEmptySpaces() {
|
|
12
|
+
const emptySpaces = [];
|
|
13
|
+
for (const row of this.grid) {
|
|
14
|
+
for (const space of row) {
|
|
15
|
+
if (space.isEmpty()) {
|
|
16
|
+
emptySpaces.push(space);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return emptySpaces;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
getSpace(target) {
|
|
24
|
+
return get(this.grid, target);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
getPieces(target) {
|
|
28
|
+
return this.getSpace(target).pieces;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
placePiece(target, piece) {
|
|
32
|
+
this.getSpace(target).placePiece(piece);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function makeGrid(boardRule) {
|
|
37
|
+
const x = boardRule.width;
|
|
38
|
+
const y = boardRule.height;
|
|
39
|
+
if (!x || !y) {
|
|
40
|
+
throw new Error("No size provided for grid");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const grid = [];
|
|
44
|
+
for (let i = 0; i < y; i++) {
|
|
45
|
+
const row = [];
|
|
46
|
+
for (let j = 0; j < x; j++) {
|
|
47
|
+
row.push(new Space([i, j]));
|
|
48
|
+
}
|
|
49
|
+
grid.push(row);
|
|
50
|
+
}
|
|
51
|
+
return grid;
|
|
52
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import Board from "./board.js";
|
|
2
|
+
|
|
3
|
+
export default class Stack extends Board {
|
|
4
|
+
constructor(boardRule, options) {
|
|
5
|
+
super(boardRule, options);
|
|
6
|
+
this.stack = [];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
placePiece(target, piece) {
|
|
10
|
+
if (target) {
|
|
11
|
+
// insert by index?
|
|
12
|
+
} else {
|
|
13
|
+
this.stack.push(piece);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import Condition from "../condition/condition.js";
|
|
2
|
+
import resolveBoard from "../utils/resolve-board.ts";
|
|
3
|
+
|
|
4
|
+
export default class BingoCondition extends Condition {
|
|
5
|
+
isMet() {
|
|
6
|
+
const grid = resolveBoard(this.rules.boardPath, this.game).grid;
|
|
7
|
+
|
|
8
|
+
// TODO: handle rectangles in addition to squares
|
|
9
|
+
const size = grid.length;
|
|
10
|
+
|
|
11
|
+
// Check rows
|
|
12
|
+
for (let i = 0; i < size; i++) {
|
|
13
|
+
if (this.checkLine(grid[i])) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Check columns
|
|
19
|
+
for (let i = 0; i < size; i++) {
|
|
20
|
+
const column = [];
|
|
21
|
+
for (let j = 0; j < size; j++) {
|
|
22
|
+
column.push(grid[j][i]);
|
|
23
|
+
}
|
|
24
|
+
if (this.checkLine(column)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Check diagonals
|
|
30
|
+
const diagonal1 = [];
|
|
31
|
+
const diagonal2 = [];
|
|
32
|
+
for (let i = 0; i < size; i++) {
|
|
33
|
+
diagonal1.push(grid[i][i]);
|
|
34
|
+
diagonal2.push(grid[i][size - 1 - i]);
|
|
35
|
+
}
|
|
36
|
+
if (this.checkLine(diagonal1) || this.checkLine(diagonal2)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
checkLine(line) {
|
|
44
|
+
return line.every((space) =>
|
|
45
|
+
space.pieces.some((piece) => {
|
|
46
|
+
return piece.doesRuleMatch(this.rules.piece);
|
|
47
|
+
}),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import Condition from "../condition/condition.js";
|
|
2
|
+
import resolveBoard from "../utils/resolve-board.ts";
|
|
3
|
+
|
|
4
|
+
export default class BlackoutCondition extends Condition {
|
|
5
|
+
isMet() {
|
|
6
|
+
const grid = resolveBoard(this.rules.boardPath, this.game).grid;
|
|
7
|
+
return grid.every((row) => row.every((space) => !space.isEmpty()));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import DoesNotContainCondition from "./does-not-contain-condition.js";
|
|
2
|
+
import ContainsCondition from "./contains-condition.js";
|
|
3
|
+
import BingoCondition from "./bingo-condition.js";
|
|
4
|
+
import BlackoutCondition from "./blackout-condition.js";
|
|
5
|
+
import SomeCondition from "./some-condition.js";
|
|
6
|
+
import RelativeMoveCondition from "./relative-move-condition.js";
|
|
7
|
+
import ActionTypeMatchesCondition from "./action-type-matches-condition.js";
|
|
8
|
+
import IsValidPlayerCondition from "./is-valid-player-condition.js";
|
|
9
|
+
import PieceMatchesCondition from "./piece-matches-condition.js";
|
|
10
|
+
|
|
11
|
+
export default function conditionFactory(conditionRule, game) {
|
|
12
|
+
if (conditionRule.type === "contains") {
|
|
13
|
+
return new ContainsCondition(conditionRule, game);
|
|
14
|
+
} else if (conditionRule.type === "doesNotContain") {
|
|
15
|
+
return new DoesNotContainCondition(conditionRule, game);
|
|
16
|
+
} else if (conditionRule.type === "bingo") {
|
|
17
|
+
return new BingoCondition(conditionRule, game);
|
|
18
|
+
} else if (conditionRule.type === "blackout") {
|
|
19
|
+
return new BlackoutCondition(conditionRule, game);
|
|
20
|
+
} else if (conditionRule.type === "some") {
|
|
21
|
+
return new SomeCondition(conditionRule, game);
|
|
22
|
+
} else if (conditionRule.type === "relativeMove") {
|
|
23
|
+
return new RelativeMoveCondition(conditionRule, game);
|
|
24
|
+
} else if (conditionRule.type === "actionTypeMatches") {
|
|
25
|
+
return new ActionTypeMatchesCondition(conditionRule, game);
|
|
26
|
+
} else if (conditionRule.type === "isValidPlayer") {
|
|
27
|
+
return new IsValidPlayerCondition(conditionRule, game);
|
|
28
|
+
} else if (conditionRule.type === "pieceMatches") {
|
|
29
|
+
return new PieceMatchesCondition(conditionRule, game);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import matches from "lodash/matches.js";
|
|
2
|
+
import Condition from "../condition/condition.js";
|
|
3
|
+
|
|
4
|
+
export default class ContainsCondition extends Condition {
|
|
5
|
+
isMet(actionPayload) {
|
|
6
|
+
const board = this.game.get(actionPayload.board);
|
|
7
|
+
const pieces = board.getPieces(actionPayload.target);
|
|
8
|
+
return !!pieces.filter(filterPieces).length;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
filterPieces(piece) {
|
|
12
|
+
return this.rules.piece === "any" || matches(this.rules.piece)(piece);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import matches from "lodash/matches.js";
|
|
2
|
+
import Condition from "../condition/condition.js";
|
|
3
|
+
import resolveBoard from "../utils/resolve-board.ts";
|
|
4
|
+
|
|
5
|
+
export default class DoesNotContainCondition extends Condition {
|
|
6
|
+
isMet(actionPayload) {
|
|
7
|
+
const board = resolveBoard(actionPayload.board, this.game);
|
|
8
|
+
const pieces = board.getPieces(actionPayload.target);
|
|
9
|
+
return !pieces.filter(this.filterPieces.bind(this)).length;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
filterPieces(piece) {
|
|
13
|
+
return this.rules.piece === "any" || matches(piece, this.rules.piece || {});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import matches from "lodash/matches.js";
|
|
2
|
+
import Condition from "../condition/condition.js";
|
|
3
|
+
import resolvePiece from "../utils/resolve-piece.ts";
|
|
4
|
+
|
|
5
|
+
export default class PieceMatchesCondition extends Condition {
|
|
6
|
+
isMet(actionPayload) {
|
|
7
|
+
const piece = resolvePiece(actionPayload.piece, this.game);
|
|
8
|
+
|
|
9
|
+
if (this.rules.actionRule?.piece && !piece) {
|
|
10
|
+
console.error("no piece found");
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (this.rules.actionRule?.piece) {
|
|
15
|
+
const matcher = {
|
|
16
|
+
...this.rules.actionRule.piece,
|
|
17
|
+
};
|
|
18
|
+
return matches(matcher)(piece.rule);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import matches from "lodash/matches.js";
|
|
2
|
+
import Condition from "../condition/condition.js";
|
|
3
|
+
|
|
4
|
+
export default class RelativeMoveCondition extends Condition {
|
|
5
|
+
isMet(actionPayload) {
|
|
6
|
+
const board = this.game.get(actionPayload.board);
|
|
7
|
+
const pieces = board.getPieces(actionPayload.target);
|
|
8
|
+
return !pieces.filter(this.filterPieces.bind(this)).length;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
filterPieces(piece) {
|
|
12
|
+
return (
|
|
13
|
+
this.rules.piece === "any" || matches(piece, (this.rules.piece = {}))
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
}
|