{"version":3,"sources":["components/Dice.module.css","components/playing-field/PlayingField.module.css","reducers/gameReducers.js","actions/gameActions.js","actions/types.js","actions/scoreActions.js","actions/diceActions.js","components/Dice.js","reducers/diceReducers.js","reducers/possibleScoreReducers.js","reducers/rulesReducers.js","reducers/index.js","store.js","components/playing-field/FieldRow.js","components/playing-field/Field.js","App.js","index.js"],"names":["module","exports","initialPlayers","name","id","score","bonus","singlesSum","scoreSum","initialState","players","map","a","winner","currentPlayer","idx","rollsLeft","message","currentTurn","instructions","regWinner","dispatch","getState","game","reduce","player","highetsScorePlayer","type","payload","consumeTurn","consumeDiceRoll","newRollsLeft","disableRollButton","arraySum","arr","val","total","rollDice","diceSides","rules","dice","saved","Math","floor","random","possibleScores","diceCounts","forEach","combinations","combination","valueCounts","values","every","reqVal","includes","sort","reverse","validDice","diceSum","valueCount","highestValidDice","diceVal","Number","push","length","unsaveAllDice","enableRollButton","Dice","toggleDice","e","props","roll","this","genDice","noOfDice","curPlayer","className","styles","diceContainer","key","disabled","rollBtnEnabled","checked","onChange","diceCheckbox","htmlFor","diceLabel","title","onClick","Component","connect","state","enabled","target","i","playingField","header","user","bonusRequirment","turns","noOfTurns","row","combineReducers","action","possibleScore","middleWare","thunk","composeEnhancers","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","createStore","rootReducer","applyMiddleware","FieldRow","getCell","playerId","currentPlayerIdx","curPlayerIdx","rowScoreType","isNaN","posScoreVal","posScore","scoreObj","saveScore","bind","style","color","cursor","Fragment","newScore","playerScore","scoreType","Object","keys","newPlayerIdx","Field","prevProps","alert","resetGame","rows","playerName","rowData","App","store","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/main.d36d94fd.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"diceContainer\":\"Dice_diceContainer__2OD5o\",\"diceLabel\":\"Dice_diceLabel__21_wb\",\"diceCheckbox\":\"Dice_diceCheckbox__gyKPD\",\"dice\":\"Dice_dice__ecBxB\",\"dice-1\":\"Dice_dice-1__3F_CY\",\"dice-2\":\"Dice_dice-2__2-Woy\",\"dice-3\":\"Dice_dice-3__2JN-D\",\"dice-4\":\"Dice_dice-4__3W6Vz\",\"dice-5\":\"Dice_dice-5__1jq4v\",\"dice-6\":\"Dice_dice-6__3dHF4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"playingField\":\"PlayingField_playingField__2Ttza\",\"playerName\":\"PlayingField_playerName__2aaPu\",\"currentPlayer\":\"PlayingField_currentPlayer__3WWWf\"};","import { CYCLE_PLAYERS, CONSUME_DICE_ROLL, SAVE_SCORE, CONSUME_TURN, SET_WINNER, SET_INSTRUCTION, RESET_GAME } from \"../actions/types\";\r\n\r\nexport const rollsPerPlayer = 3;\r\n\r\nconst initialPlayers = [\r\n {\r\n name: 'Player 1',\r\n id: 0,\r\n score: {\r\n bonus: 0\r\n },\r\n singlesSum: 0,\r\n scoreSum: 0,\r\n },\r\n {\r\n name: 'Player 2',\r\n id: 1,\r\n score: {\r\n bonus: 0\r\n },\r\n singlesSum: 0,\r\n scoreSum: 0,\r\n }\r\n];\r\n\r\nconst initialState = {\r\n players: initialPlayers.map(a => ({...a})),\r\n winner: null,\r\n currentPlayer: {\r\n idx: 0,\r\n rollsLeft: rollsPerPlayer,\r\n message: 'Select the dice you wish to save and hit roll, or click on a score to register it'\r\n },\r\n currentTurn: 1\r\n}\r\n\r\nexport default function (state = initialState, action) {\r\n switch (action.type) {\r\n case CYCLE_PLAYERS:\r\n return {\r\n ...state,\r\n currentPlayer: {\r\n ...state.currentPlayer,\r\n ...action.payload\r\n }\r\n };\r\n case CONSUME_DICE_ROLL:\r\n return {\r\n ...state, \r\n currentPlayer: {\r\n ...state.currentPlayer,\r\n rollsLeft: action.payload\r\n }\r\n }\r\n case SAVE_SCORE:\r\n return {\r\n ...state,\r\n players: action.payload\r\n }\r\n case SET_INSTRUCTION:\r\n return {\r\n ...state,\r\n currentPlayer: {\r\n ...state.currentPlayer,\r\n message: action.payload\r\n }\r\n }\r\n case SET_WINNER:\r\n return {\r\n ...state,\r\n winner: action.payload\r\n }\r\n case RESET_GAME:\r\n return {\r\n ...initialState,\r\n players: initialPlayers.map(a => ({...a}))\r\n }\r\n case CONSUME_TURN:\r\n return {\r\n ...state,\r\n currentTurn: state.currentTurn + 1\r\n }\r\n default: \r\n return state;\r\n } \r\n}","import { CYCLE_PLAYERS, CONSUME_DICE_ROLL, CONSUME_TURN, SET_WINNER, SET_INSTRUCTION, RESET_GAME } from \"./types\";\r\nimport { rollsPerPlayer } from '../reducers/gameReducers';\r\nimport { disableRollButton, enableRollButton, unsaveAllDice, rollDice } from \"./diceActions\";\r\n\r\nconst instructions = {\r\n rollsLeft: 'Select the dice you wish to save and hit roll, or click on a score to register it',\r\n endOfTurn: 'Click on a score to register it',\r\n endOfGame: ''\r\n}\r\n\r\nexport const cyclePlayers = () => (dispatch, getState) => {\r\n const players = getState().game.players.length;\r\n const currentPlayerIdx = getState().game.currentPlayer.idx;\r\n const newPlayerIdx = (currentPlayerIdx === players - 1) ? 0 : currentPlayerIdx + 1;\r\n\r\n if (newPlayerIdx === 0) { // A full turn has been completed\r\n dispatch(consumeTurn());\r\n\r\n const currentTurn = getState().game.currentTurn;\r\n const totalTurns = getState().rules.turns;\r\n\r\n if (currentTurn > totalTurns) dispatch(regWinner());\r\n }\r\n\r\n dispatch({\r\n type: SET_INSTRUCTION,\r\n payload: instructions.rollsLeft\r\n });\r\n dispatch({\r\n type: CYCLE_PLAYERS,\r\n payload: {\r\n idx: newPlayerIdx,\r\n rollsLeft: rollsPerPlayer\r\n }\r\n });\r\n\r\n dispatch(enableRollButton());\r\n\r\n dispatch(unsaveAllDice());\r\n\r\n dispatch(rollDice());\r\n}\r\n\r\nexport const regWinner = () => (dispatch, getState) => {\r\n const players = getState().game.players;\r\n const winner = players.reduce((player, highetsScorePlayer) => (!highetsScorePlayer || player.scoreSum > highetsScorePlayer.scoreSum) ? player : highetsScorePlayer ) // Compare player score with current highest score player\r\n\r\n dispatch({\r\n type: SET_INSTRUCTION,\r\n payload: instructions.endOfGame\r\n });\r\n dispatch({\r\n type: SET_WINNER,\r\n payload: winner\r\n });\r\n}\r\n\r\nexport const resetGame = () => (dispatch) => {\r\n dispatch({\r\n type: RESET_GAME\r\n });\r\n dispatch(consumeDiceRoll());\r\n}\r\n\r\nexport const consumeTurn = () => {\r\n return {\r\n type: CONSUME_TURN\r\n }\r\n}\r\n\r\nexport const consumeDiceRoll = () => (dispatch, getState) => {\r\n const currentRollsLeft = getState().game.currentPlayer.rollsLeft;\r\n const newRollsLeft = currentRollsLeft - 1;\r\n\r\n // Disable roll button if there are no rolls left\r\n if (newRollsLeft === 0) {\r\n dispatch({\r\n type: SET_INSTRUCTION,\r\n payload: instructions.endOfTurn\r\n });\r\n dispatch(disableRollButton())\r\n };\r\n\r\n dispatch ({\r\n type: CONSUME_DICE_ROLL,\r\n payload: newRollsLeft\r\n })\r\n \r\n}","export const ROLL_DICE = 'ROLL_DICE';\r\nexport const TOGGLE_DICE = 'TOGGLE_DICE';\r\nexport const UNSAVE_DICE = 'UNSAVE_DICE';\r\nexport const GEN_DICE = 'GEN_DICE';\r\nexport const ENABLE_ROLL_BTN = 'ENABLE_ROLL_BTN';\r\nexport const DISABLE_ROLL_BTN = 'DISABLE_ROLL_BTN';\r\nexport const CALC_POSSIBLE_SCORES = 'CALC_POSSIBLE_SCORES';\r\nexport const SAVE_SCORE = 'SAVE_SCORE';\r\nexport const CYCLE_PLAYERS = 'CYCLE_PLAYERS';\r\nexport const SET_WINNER = 'SET_WINNER';\r\nexport const CONSUME_TURN = 'CONSUME_TURN';\r\nexport const CONSUME_DICE_ROLL = 'CONSUME_DICE_ROLL';\r\nexport const SET_INSTRUCTION = 'SET_INSTRUCTION';\r\nexport const RESET_GAME = 'RESET_GAME';","import { CALC_POSSIBLE_SCORES, SAVE_SCORE } from './types';\r\nimport { cyclePlayers } from './gameActions'\r\n\r\nexport const calcPossibleScores = () => (dispatch, getState) => {\r\n\r\n let possibleScores = {};\r\n\r\n // Store dice values in array\r\n const dice = getState().dice.dice.map(dice => dice.val);\r\n\r\n // Create object with dice counts\r\n const diceCounts = {};\r\n dice.forEach(dice => (diceCounts[dice]) ? diceCounts[dice]++ : diceCounts[dice] = 1);\r\n\r\n // Get criteria for combinations (straights, yatzy, pairs etc)\r\n const combinations = getState().rules.combinations;\r\n\r\n // Check for combinations (Pairs, full house etc)\r\n for (const combination of combinations) {\r\n const { valueCounts, values, name, score } = combination;\r\n\r\n if (values) { // If exact values are required, for example, in a straight\r\n if (values.every(reqVal => dice.includes(reqVal))) possibleScores[name] = score || arraySum(values) // If all criterial dice are rolled\r\n }\r\n\r\n else { // If exact values are NOT required, for example, in a four of a kind\r\n valueCounts.sort().reverse(); // The most dice should priorotize the highest value, i.e pick value first\r\n let validDice = [];\r\n let diceSum = 0;\r\n \r\n // Loop through criteria and check for count in dice count and add to validDice if not already there\r\n for (const valueCount of valueCounts) {\r\n let highestValidDice;\r\n for (const diceVal in diceCounts) {\r\n if (diceCounts[diceVal] >= valueCount && !validDice.includes(Number(diceVal))) highestValidDice = Number(diceVal); // Select highest valid dice\r\n }\r\n if (highestValidDice) {\r\n diceSum += highestValidDice * valueCount;\r\n validDice.push(highestValidDice);\r\n }\r\n }\r\n if (validDice.length === valueCounts.length) possibleScores[name] = score || diceSum; // If length of valid dice and criteria array are equal, all critera are met\r\n }\r\n };\r\n\r\n // Fill possible scores with chance\r\n possibleScores['chance'] = arraySum(dice);\r\n\r\n // Fill possible scores object of singles\r\n for (const dice in diceCounts) {\r\n // Singels (ones, twos, etc)\r\n possibleScores[dice] = dice * diceCounts[dice];\r\n }\r\n\r\n dispatch({\r\n type: CALC_POSSIBLE_SCORES,\r\n payload: possibleScores\r\n });\r\n}\r\n\r\nexport const saveScore = (newScore, player) => (dispatch, getState) => {\r\n \r\n const { diceSides, bonus, bonusRequirment } = getState().rules;\r\n\r\n const players = getState().game.players;\r\n let playerScore = players[player].score;\r\n\r\n // Add new score to score object\r\n playerScore = {\r\n ...playerScore,\r\n ...newScore\r\n };\r\n\r\n const scoreType = Object.keys(newScore)[0];\r\n\r\n // If new score is a single, add to singlesSum\r\n if (scoreType > 0 && scoreType <= diceSides){\r\n players[player].singlesSum += newScore[scoreType];\r\n\r\n // If singles sum are higher than 63, add bonus\r\n if (players[player].singlesSum >= bonusRequirment) playerScore.bonus = bonus;\r\n }\r\n\r\n // Add new score to player sum\r\n players[player].scoreSum += newScore[scoreType];\r\n\r\n // Add score object to player\r\n players[player].score = playerScore;\r\n\r\n dispatch ({\r\n type: SAVE_SCORE,\r\n payload: players\r\n });\r\n\r\n dispatch (cyclePlayers());\r\n}\r\n\r\nfunction arraySum(arr) {\r\n return arr.reduce((val, total) => val + total, 0);\r\n}","import { ROLL_DICE, TOGGLE_DICE, DISABLE_ROLL_BTN, ENABLE_ROLL_BTN, UNSAVE_DICE, GEN_DICE } from './types';\r\nimport { calcPossibleScores } from './scoreActions';\r\nimport { consumeDiceRoll } from './gameActions';\r\n\r\nexport const rollDice = () => (dispatch, getState) => {\r\n const diceSides = getState().rules.diceSides;\r\n function diceRoll() {\r\n return Math.floor(Math.random() * diceSides ) + 1;\r\n } \r\n\r\n const newDice = getState().dice.dice.map(dice => {\r\n if (!dice.saved) dice.val = diceRoll();\r\n return dice;\r\n });\r\n\r\n dispatch ({\r\n type: ROLL_DICE,\r\n payload: newDice\r\n });\r\n\r\n dispatch (consumeDiceRoll());\r\n\r\n dispatch (calcPossibleScores());\r\n}\r\n\r\nexport const genDice = noOfDice => dispatch => {\r\n let dice = [];\r\n for (let i = 1; i <= noOfDice; i++){\r\n dice.push({\r\n id: `dice${i}`,\r\n val: 0,\r\n saved: false\r\n });\r\n }\r\n dispatch({\r\n type: GEN_DICE,\r\n payload: dice\r\n });\r\n}\r\n\r\nexport const toggleDice = e => (dispatch, getState) => {\r\n const newDice = getState().dice.dice.map(dice => {\r\n if (e.target.id === dice.id) dice.saved = !dice.saved;\r\n return dice;\r\n });\r\n\r\n dispatch ({\r\n type: TOGGLE_DICE,\r\n payload: newDice\r\n });\r\n}\r\n\r\nexport const unsaveAllDice = () => (dispatch, getState) => {\r\n const newDice = getState().dice.dice.map(dice => {\r\n dice.saved = false;\r\n return dice;\r\n });\r\n\r\n dispatch ({\r\n type: UNSAVE_DICE,\r\n payload: newDice\r\n });\r\n}\r\n\r\nexport const disableRollButton = () => {\r\n return ({\r\n type: DISABLE_ROLL_BTN,\r\n payload: false\r\n })\r\n}\r\n\r\nexport const enableRollButton = () => {\r\n return ({\r\n type: ENABLE_ROLL_BTN,\r\n payload: true\r\n })\r\n}","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { rollDice, toggleDice, genDice } from '../actions/diceActions';\r\nimport styles from './Dice.module.css';\r\n\r\nclass Dice extends Component {\r\n\r\n componentDidMount() {\r\n this.props.genDice(this.props.noOfDice);\r\n this.props.rollDice();\r\n }\r\n\r\n toggleDice = e => {\r\n this.props.toggleDice(e);\r\n }\r\n\r\n\r\n roll = () => {\r\n this.props.rollDice();\r\n }\r\n\r\n render() {\r\n const { curPlayer } = this.props;\r\n return (\r\n
\r\n

{curPlayer.rollsLeft} rolls left

\r\n

{curPlayer.message}

\r\n
\r\n {this.props.dice.map(dice => \r\n
\r\n \r\n \r\n
\r\n
\r\n )}\r\n
\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n dice: state.dice.dice,\r\n rollBtnEnabled: state.dice.enabled,\r\n curPlayer: state.game.currentPlayer,\r\n players: state.game.players,\r\n noOfDice: state.rules.dice\r\n});\r\n\r\nexport default connect(mapStateToProps, { rollDice, toggleDice, genDice })(Dice)\r\n","import { ROLL_DICE, TOGGLE_DICE, UNSAVE_DICE, ENABLE_ROLL_BTN, DISABLE_ROLL_BTN, GEN_DICE } from '../actions/types';\r\n\r\nconst initialState = {\r\n dice: [],\r\n enabled: true\r\n};\r\n\r\nexport default function (state = initialState, action){\r\n switch(action.type){\r\n case ROLL_DICE:\r\n case TOGGLE_DICE:\r\n case UNSAVE_DICE:\r\n return {...state, dice: action.payload};\r\n case ENABLE_ROLL_BTN:\r\n case DISABLE_ROLL_BTN:\r\n return {\r\n ...state,\r\n enabled: action.payload\r\n }\r\n case GEN_DICE:\r\n return {\r\n ...state,\r\n dice: [...action.payload]\r\n }\r\n default:\r\n return state;\r\n }\r\n}","import { CALC_POSSIBLE_SCORES } from '../actions/types';\r\n\r\nconst initialState = {\r\n possibleScores: {}\r\n}\r\n\r\nexport default function (state = initialState, action) {\r\n switch (action.type) {\r\n case CALC_POSSIBLE_SCORES:\r\n return {\r\n ...state, \r\n possibleScores: action.payload\r\n };\r\n default: \r\n return state;\r\n }\r\n}","import { RESET_GAME } from '../actions/types'\r\n\r\nconst playingField = [\r\n {header: 'Ones', score: '1', user: true},\r\n {header: 'Twos', score: '2', user: true},\r\n {header: 'Threes', score: '3', user: true},\r\n {header: 'Fours', score: '4', user: true},\r\n {header: 'Fives', score: '5', user: true},\r\n {header: 'Sixes', score: '6', user: true},\r\n {header: 'Sum', type: 'singlesSum'},\r\n {header: 'Bonus', score: 'bonus'},\r\n {header: '1 pair', score: 'one pair', user: true},\r\n {header: '2 pairs', score: 'two pairs', user: true},\r\n {header: 'Three of a kind', score: 'threeOfAKind', user: true},\r\n {header: 'Four of a kind', score: 'fourOfAKind', user: true},\r\n {header: 'Small straight', score: 'small straight', user: true},\r\n {header: 'Large straight', score: 'large straight', user: true},\r\n {header: 'Full house', score: 'full house', user: true},\r\n {header: 'Chance', score: 'chance', user: true},\r\n {header: 'Yatzy', score: 'yatzy', user: true},\r\n {header: 'Sum', type: 'scoreSum'}\r\n];\r\n\r\nconst noOfTurns = playingField.reduce((noOfTurns, row) => row.user ? noOfTurns + 1 : noOfTurns, 0) // Calculate total number of turns (add one for each row where user input is required)\r\n\r\nconst initialState = {\r\n dice: 5,\r\n diceSides: 6,\r\n bonus: 50,\r\n bonusRequirment: 63,\r\n turns: noOfTurns,\r\n playingField: playingField,\r\n combinations: [\r\n {\r\n name: 'one pair',\r\n valueCounts: [2]\r\n },\r\n {\r\n name: 'threeOfAKind',\r\n valueCounts: [3]\r\n },\r\n {\r\n name: 'fourOfAKind',\r\n valueCounts: [4]\r\n },\r\n {\r\n name: 'two pairs',\r\n valueCounts: [2, 2]\r\n },\r\n {\r\n name: 'full house',\r\n valueCounts: [3, 2]\r\n },\r\n {\r\n name: 'yatzy',\r\n valueCounts: [5],\r\n score: 50\r\n },\r\n {\r\n name: 'small straight',\r\n values: [1, 2, 3, 4, 5]\r\n },\r\n {\r\n name: 'large straight',\r\n values: [2, 3, 4, 5, 6]\r\n }\r\n ]\r\n\r\n};\r\n\r\nexport default function (state = initialState, action) {\r\n switch (action.type) {\r\n case RESET_GAME:\r\n return {\r\n ...state,\r\n playingField: playingField\r\n }\r\n default: \r\n return state;\r\n }\r\n}","import { combineReducers } from 'redux';\r\nimport diceReducers from './diceReducers';\r\nimport possibleScoreReducers from './possibleScoreReducers';\r\nimport gameReducers from './gameReducers';\r\nimport rulesReducers from './rulesReducers';\r\n\r\nexport default combineReducers({\r\n dice: diceReducers,\r\n possibleScore: possibleScoreReducers,\r\n game: gameReducers,\r\n rules: rulesReducers\r\n});","import { createStore, applyMiddleware, compose } from \"redux\";\r\nimport rootReducer from './reducers';\r\nimport thunk from 'redux-thunk';\r\n\r\nconst initialState = {};\r\n\r\nconst middleWare = [thunk];\r\n\r\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\r\n\r\nexport default createStore(rootReducer, initialState, composeEnhancers(applyMiddleware(...middleWare)))","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux';\r\nimport { saveScore } from '../../actions/scoreActions';\r\n\r\nclass FieldRow extends Component {\r\n\r\n getCell = playerId => {\r\n\r\n const currentPlayerIdx = this.props.curPlayerIdx;\r\n const rowScoreType = this.props.score;\r\n const player = this.props.players[playerId];\r\n\r\n // Return special row if row has a type\r\n if (this.props.type) {\r\n return (\r\n {player[this.props.type]}\r\n )\r\n }\r\n\r\n // Return table cell with saved score\r\n if (!isNaN(player.score[rowScoreType])){\r\n return (\r\n {player.score[rowScoreType]}\r\n )\r\n }\r\n\r\n // Return table cell with possible score for current player\r\n if (playerId === currentPlayerIdx) {\r\n const posScoreVal = this.props.posScore[rowScoreType] || 0; \r\n const scoreObj = {[rowScoreType]: posScoreVal}\r\n\r\n return (\r\n \r\n {posScoreVal}\r\n \r\n );\r\n }\r\n else return (\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { players, header } = this.props;\r\n return (\r\n \r\n {`${header}:`}\r\n {players.map(player => \r\n \r\n {this.getCell(player.id)}\r\n \r\n )}\r\n \r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n posScore: state.possibleScore.possibleScores,\r\n players: state.game.players,\r\n curPlayerIdx: state.game.currentPlayer.idx\r\n});\r\n\r\nexport default connect(mapStateToProps, { saveScore })(FieldRow);","import React, { Component } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport FieldRow from './FieldRow';\r\nimport styles from './PlayingField.module.css';\r\nimport { resetGame } from '../../actions/gameActions'\r\n\r\nclass Field extends Component {\r\n\r\n componentDidUpdate(prevProps){\r\n const { winner } = this.props;\r\n if (prevProps.winner !== this.props.winner){\r\n if (this.props.winner){\r\n alert(`The winner is ${winner.name} with ${winner.scoreSum} points.`);\r\n this.props.resetGame();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { players, rows, curPlayerIdx } = this.props;\r\n return (\r\n \r\n \r\n \r\n {players.map(player => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n {players.map(player => \r\n \r\n )}\r\n \r\n \r\n \r\n {rows.map(rowData =>\r\n \r\n )}\r\n \r\n
\r\n Player:\r\n \r\n {player.name}\r\n
\r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n posScore: state.possibleScore.possibleScores,\r\n players: state.game.players,\r\n rows: state.rules.playingField,\r\n winner: state.game.winner,\r\n curPlayerIdx: state.game.currentPlayer.idx\r\n});\r\n\r\nexport default connect(mapStateToProps, { resetGame })(Field);\r\n","import React from 'react';\r\nimport './App.css';\r\nimport Dice from './components/Dice';\r\nimport { Provider } from 'react-redux';\r\nimport store from './store';\r\nimport Field from './components/playing-field/Field';\r\n\r\nfunction App() {\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n"],"sourceRoot":""}