{"version":3,"sources":["data/constants.js","data/cardData.js","redux/Actions/SnackbarActions.js","redux/ActionTypes.js","data/messageData.js","redux/Actions/MessageActions.js","redux/Actions/FlagsActions.js","redux/Actions/GridActions.js","redux/Actions/PlayersActions.js","utils/utilsCommon.js","redux/Actions/CardsActions.js","data/tileData.js","redux/Actions/TilesActions.js","data/playerData.js","data/gridData.js","redux/Actions/GamePlayActions.js","redux/Actions.js","types/types.js","redux/Reducers/CardsReducer.js","redux/Reducers/FlagsReducer.js","data/flags.js","redux/Reducers/GamePlayReducer.js","redux/Reducers/GridReducer.js","redux/Reducers/MessageReducer.js","redux/Reducers/PlayersReducer.js","redux/Reducers/SnackbarReducer.js","redux/Reducers/TilesReducer.js","redux/configureStore.js","components/Logic/helperFunctions.js","components/Logic/runnerLogic.js","components/Logic/lavaLogic.js","components/Logic/placeRelativesLogic.js","components/Logic/placePeopleLogic.js","components/Logic/cardLogic.js","components/Board/Board.jsx","components/Board/CoordinatesLayers.jsx","components/Board/AnimatedPieceLayer.jsx","components/Board/OccupancyLayer.jsx","components/Board/CancelButtons.jsx","components/Board/BoardContainer.js","components/Helpers/Card.js","components/Deck/Deck.jsx","components/Deck/DeckContainer.js","components/Tiles/Tiles.jsx","components/Tiles/TilesContainer.js","components/Player/Player.jsx","components/Player/PlayersContainer.js","components/Board/PlacementHighlighter.jsx","components/Sidebars/AD79Sidebar.jsx","components/Sidebars/LavaTileSidebar.jsx","components/Helpers/SnackbarNotifier.jsx","components/Modals/GameOverModal.jsx","components/Modals/GameOverContainer.js","components/Modals/StartGameModal.jsx","components/Modals/StartGameContainer.js","components/Modals/GameStatisticsContainer.js","components/Modals/InstructionsModalBody.jsx","components/Modals/InstructionsModal.jsx","components/Board/RecommendationHighlighter.jsx","components/Main.jsx","components/MainContainer.js","App.jsx","serviceWorker.js","index.js"],"names":["WHITE","PLAY","DRAW","POMP","cardDictionary","CARD_1","name","type","constant","number","color","count","grid","CARD_2","CARD_3","CARD_4","CARD_5","CARD_6","CARD_7","CARD_8","CARD_9","CARD_10","CARD_11","OMEN","AD79","addSnackbar","messageObj","payload","stageData","text","setStageInStore","stage","updateInstructions","instructionObj","incrementStage","dispatch","getState","messageState","message","toggleFlags","flag","setRunCounter","counter","setRelativesCounter","setEruptionCounter","addGrid","placePeopleInSquare","squareId","occupants","placeLavaTileOnSquare","tile","setDangerZone","zone","setRunZone","setRunFromSquare","square","setRunner","runner","updateDistanceToExitInStore","distance","updateDistanceToExit","setPlayerArray","playerIds","addPlayers","playersObj","addPlayer","playerId","details","updatePlayerHand","hand","incrementPlayerPopulation","personObj","incrementPlayerCasualtiesInStore","addActivePlayer","incrementPlayerCasualties","playersState","setTimeout","_","get","incrementPlayerSavedInStore","incrementPlayerSaved","player","setPlayerTurn","incrementPlayerTurn","pile","tileState","gridState","census","Object","values","forEach","arr","population","length","keys","person","nextPlayer","turn","players","compareCards","a","b","cardA","parseFloat","split","cardB","shuffle","tiles","shuffledCards","s","i","j","Math","floor","random","randAndArrangeRecommendations","recommendationsArray","array","temp","sort","value","addCards","cards","addDeck","deck","takeCard","discardCard","card","setCardGridInStore","setCardGrid","generateDeck","stageTwo","omens","ad79s","push","hands","ii","shift","numberOfCards","splice","promises","idx","Promise","all","tileDictionary","Mask","Scroll","Helmet","Coin","Pillar","Urn","wildTileDictionary","WildHM","wilds","WildUS","WildPC","addTiles","addTilePile","takeTile","setLavaTile","generatePile","playerColors","aiPlayers","Corvus","cautious","social","chaotic","Graecus","Cassia","Severus","Aurelia","Proculus","gridSquares","gateName","distanceToExit","buildingName","buildingCapacity","offSets","ventName","buildingNumber","gridByColor","White","Grey","Purple","Turquoise","Brown","voidLavaSquares","voidRunSquares","escapeSquares","gateSquares","nextToVentSquares","addRecommendationsToStore","recommendations","addRecommendations","setPlacedRelativesToStore","relatives","setPlacedRelatives","saveGameSettings","settings","selectPerson","gameSetup","startPlayer","gameSettings","theseDetails","playersArray","prePopulate","potentialPop","actualPop","startPhase","ceil","rand","id","gender","totalPieces","noEruption","wildLava","actions","cardsActions","flagsActions","gamePlayActions","gridActions","messageActions","playersActions","snackBarActions","tileActions","types","shape","key","object","defaults","arrayOf","string","cardsState","discard","flagsState","flags","runCount","relativesCount","eruptionCount","occupant","lastMoved","gridSquare","dangerZone","runZone","runFromSquare","gamePlayState","autoPlayDisabled","bool","showStrategyValues","placedRelatives","selectedPerson","instruction","playerDetails","player1","casualties","saved","ai","activePlayer","totalTurns","snackbarState","oneOf","lavaTile","state","action","slice","defaultFlags","description","defaultState","filter","t","map","newFlags","flagListIdx","indexOf","newGrid","lava","transitionObj","populationArray","casualtiesArray","savedArray","p","newPile","pop","logger","createLogger","collapsed","diff","store","createStore","combineReducers","window","__REDUX_DEVTOOLS_EXTENSION__","applyMiddleware","thunk","vacancy","checkForSurroundedTiles","console","log","surroundedTiles","tempGrid","x","row","y","gridValue","includes","rows","columns","coords","surroundByLavaDFS","thisGrid","calculateRunZones","coord","runToDFS","uniqBy","squareHotness","coord0","coord1","discoveredLavas","lavas","runnerRecommendations","aiPlayer","myOccupants","diversity","runToSquare","toSquare","storeState","numberOfRuns","oldSquareOccupants","oldSquareIdx","undefined","utils","helper","sortedRecommendations","selectedSquare","selectedOccupant","selectRunner","lavaLogic","personPlusSquare","targetZones","startSquare","runForYourLives","placeLavaTile","tilesSurroundedByLava","burnSurroundedTiles","drawTile","runnerLogic","highlightDangerZones","hotZones","homeVent","warmZones","min","max","filteredZones","data","evaluations","sortedEvaluations","human","tilePile","takenTile","placeRelatives","currentOccupants","thisPlacedRelatives","orderedRecommendations","round","rec","val","placePerson","newGridArray","uniq","handCanPlaceHere","gridDetail","availableSpace","orderedEvaluations","drawCard","performSacrifice","sacrified","playPompCard","thisHand","cardIdx","gridHighlights","placePeopleLogic","chooseCardToPlay","gridArray","item","activePlayerHand","targetSpaces","target","delta","fullBuilding","fullOccupancy","room","occ","evals","updatedRecommendations","playThisCard","playSquare","playerHand","takenCard","resolveAd79","targetList","resolveOmen","newHand","Board","props","data-test","Alert","className","style","alt","src","defaultProps","TopCoordinatesDisplay","topCoords","top","left","LeftCoordinatesDisplay","AnimatedPieceLayer","useState","setLeft","setTop","useEffect","ButtonBase","backgroundColor","onClick","OccupancySquare","occupancySquare","playerName","offSetArray","position","Tooltip","title","placement","arrow","OccupancyLayer","occupancy","col","CancelButtons","IconButton","BoardContainer","connect","Card","cardId","cardName","setCardName","cardSrc","setCardSrc","CardBack","Deck","playerColor","topDiscard","deckSizes","deckEnabled","Row","Col","xs","focusRipple","disabled","borderColor","DeckContainer","lastDrawnCard","setLastDrawnCard","discardLength","Tiles","pileEnabled","Progress","striped","TilesContainer","PopulationIcons","populationIcons","HandCards","myTurn","playCard","Player","numberOfPlayers","height","transition","PlayerCards","PlayersContainer","isEmpty","PlacementHighlighter","validation","selectSquare","placementHighlighter","mapDispatchToProps","AD79Sidebar","LavaTileSidebar","resolveNoPlaceToPlace","tilesState","SnackbarNotifier","enqueueSnackbar","variant","withSnackbar","PlayerStats","winner","detailsArray","GameOverModal","isOpen","acceptGameOver","statisticsOnly","rankings","tie","victoryPoints","Modal","ModalHeader","toggle","ModalBody","code","ModalFooter","Button","GameOverContainer","setRankings","statistics","document","location","reload","HumanOrAI","formProps","checked","onlabel","onstyle","offstyle","offlabel","onChange","setFieldValue","AIDropDown","currentPlayers","aiDropDown","required","as","e","PlayerNameSelection","playerNameSelection","Label","StartGameModal","commitStartGame","initialValues","onSubmit","player2","player3","player4","player1AI","player2AI","player3AI","player4AI","Fragment","width","nextPhase","StartGameContainer","localStorage","getItem","JSON","parse","setItem","stringify","GameStatisticsContainer","InstructionsModalBody","tooltipOpen","setTooltipOpen","tip","href","InstructionsModal","RecommendationHighlighter","recommendationHighlighter","Main","cardGrid","maxSnack","runFlag","MainContainer","setActivePlayer","useCallback","App","Boolean","hostname","match","ReactDOM","render","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","error"],"mappings":"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","file":"static/js/main.730bb0e5.chunk.js","sourcesContent":["/** @module constants */\r\n\r\n// board\r\nexport const Y_OFFSET = 121;\r\nexport const X_OFFSET = 71;\r\nexport const WHITE = \"White\";\r\n\r\n// messages\r\nexport const PLAY = \"PLAY a Card\";\r\nexport const PLACE = \"PLACE a Person\";\r\nexport const DRAW = \"DRAW a Card\";\r\nexport const RELATIVE = \"PLACE a Relative\";\r\nexport const SACRIFICE = \"Choose a SACRIFICE\";\r\nexport const LAVA_TILE = \"Take and Place a Lava Tile\";\r\nexport const RUN = \"RUN FOR YOUR LIVES!!!\";\r\n\r\n// card types\r\nexport const POMP = \"Pomp\";\r\nexport const OMEN = \"Omen\";\r\nexport const AD79 = \"AD79\";\r\n","/** @module cardData */\r\n\r\nimport * as constant from \"./constants\";\r\n\r\nexport const cardDictionary = {\r\n CARD_1: {\r\n name: \"Grey 1\",\r\n type: constant.POMP,\r\n number: 1,\r\n color: \"G\",\r\n count: 4,\r\n grid: [\"1_0\", \"1_1\"]\r\n },\r\n CARD_2: {\r\n name: \"Purple 2\",\r\n type: constant.POMP,\r\n number: 2,\r\n color: \"P\",\r\n count: 4,\r\n grid: [\"0_4\", \"1_4\"]\r\n },\r\n CARD_3: {\r\n name: \"Purple 3\",\r\n type: constant.POMP,\r\n number: 3,\r\n color: \"P\",\r\n count: 5,\r\n grid: [\"2_2\", \"2_3\"]\r\n },\r\n CARD_4: {\r\n name: \"Grey 4\",\r\n type: constant.POMP,\r\n number: 4,\r\n color: \"G\",\r\n count: 7,\r\n grid: [\"2_5\", \"2_6\"]\r\n },\r\n CARD_5: {\r\n name: \"Purple 5\",\r\n type: constant.POMP,\r\n number: 5,\r\n color: \"P\",\r\n count: 4,\r\n grid: [\"2_8\"]\r\n },\r\n CARD_6: {\r\n name: \"Turquoise 6\",\r\n type: constant.POMP,\r\n number: 6,\r\n color: \"T\",\r\n count: 7,\r\n grid: [\"3_2\", \"3_3\", \"4_2\", \"4_3\"]\r\n },\r\n CARD_7: {\r\n name: \"Purple 7\",\r\n type: constant.POMP,\r\n number: 7,\r\n color: \"P\",\r\n count: 3,\r\n grid: [\"4_5\"]\r\n },\r\n CARD_8: {\r\n name: \"Grey 8\",\r\n type: constant.POMP,\r\n number: 8,\r\n color: \"G\",\r\n count: 5,\r\n grid: [\"3_6\", \"4_6\"]\r\n },\r\n CARD_9: {\r\n name: \"Turquoise 9\",\r\n type: constant.POMP,\r\n number: 9,\r\n color: \"T\",\r\n count: 4,\r\n grid: [\"5_4\"]\r\n },\r\n CARD_10: {\r\n name: \"Brown 10\",\r\n type: constant.POMP,\r\n number: 10,\r\n color: \"B\",\r\n count: 5,\r\n grid: [\"5_5\", \"6_5\"]\r\n },\r\n CARD_11: {\r\n name: \"Brown 11\",\r\n type: constant.POMP,\r\n number: 11,\r\n color: \"B\",\r\n count: 5,\r\n grid: [\"5_8\", \"6_8\", \"5_10\", \"6_10\"]\r\n },\r\n OMEN: {\r\n name: \"Omen\",\r\n type: constant.OMEN,\r\n number: 0,\r\n color: \"S\",\r\n count: 7\r\n },\r\n AD79: {\r\n name: \"AD 79\",\r\n type: constant.AD79,\r\n number: 0,\r\n color: \"S\",\r\n count: 2\r\n }\r\n};\r\n","/** @module SnackbarActions */\r\n\r\nimport { ADD_SNACKBAR } from \"../ActionTypes\";\r\n\r\n/**\r\n * @function addSnackbar\r\n * @description sets message state\r\n * @param {Object} messageObj\r\n * @example { message: \"message\", type: \"type\" }\r\n */\r\nexport const addSnackbar = messageObj => ({\r\n type: ADD_SNACKBAR,\r\n payload: messageObj\r\n});\r\n","/** @module ActionTypes */\r\n\r\n// card actions\r\nexport const ADD_CARDS = \"ADD_CARDS\";\r\nexport const ADD_DECK = \"ADD_DECK\";\r\nexport const TAKE_CARD = \"TAKE_CARD\";\r\nexport const DISCARD_CARD = \"DISCARD_CARD\";\r\nexport const SET_CARD_GRID = \"SET_CARD_GRID\";\r\n\r\n// flag actions\r\nexport const TOGGLE_FLAGS = \"TOGGLE_FLAGS\";\r\nexport const SET_RUN_COUNTER = \"SET_RUN_COUNTER\";\r\nexport const SET_RELATIVES_COUNTER = \"SET_RELATIVES_COUNTER\";\r\nexport const SET_ERUPTION_COUNTER = \"SET_ERUPTION_COUNTER\";\r\n\r\n// game play actions\r\nexport const ADD_RECOMMENDATIONS = \"ADD_RECOMMENDATIONS\";\r\nexport const SET_PLACED_RELATIVES = \"SET_PLACED_RELATIVES\";\r\nexport const SELECT_PERSON = \"SELECT_PERSON\";\r\n\r\n// grid actions\r\nexport const ADD_GRID = \"ADD_GRID\";\r\nexport const PLACE_PEOPLE = \"PLACE_PEOPLE\";\r\nexport const PLACE_LAVA = \"PLACE_LAVA\";\r\nexport const UPDATE_DISTANCE_TO_EXIT = \"UPDATE_DISTANCE_TO_EXIT\";\r\nexport const SET_DANGER_ZONE = \"SET_DANGER_ZONE\";\r\nexport const SET_RUN_ZONE = \"SET_RUN_ZONE\";\r\nexport const SET_RUN_FROM_SQUARE = \"SET_RUN_FROM_SQUARE\";\r\nexport const SET_RUNNER = \"SET_RUNNER\";\r\n\r\n// message actions\r\nexport const SET_STAGE = \"SET_STAGE\";\r\nexport const UPDATE_INSTRUCTIONS = \"UPDATE_INSTRUCTIONS\";\r\n\r\n// player actions\r\nexport const SET_PLAYERS_ARRAY = \"SET_PLAYERS_ARRAY\";\r\nexport const ADD_PLAYERS = \"ADD_PLAYERS\";\r\nexport const ADD_PLAYER = \"ADD_PLAYER\";\r\nexport const UPDATE_PLAYER_HAND = \"UPDATE_PLAYER_HAND\";\r\nexport const SET_PLAYER_TURN = \"SET_PLAYER_TURN\";\r\nexport const INCREMENT_PLAYER_POPULATION = \"INCREMENT_PLAYER_POPULATION\";\r\nexport const INCREMENT_PLAYER_CASUALTIES = \"INCREMENT_PLAYER_CASUALTIES\";\r\nexport const INCREMENT_PLAYER_SAVED = \"INCREMENT_PLAYER_SAVED\";\r\nexport const SET_ACTIVE_PLAYER = \"SET_ACTIVE_PLAYER\";\r\nexport const SAVE_GAME_SETTINGS = \"SAVE_GAME_SETTINGS\";\r\n\r\n// snackbar actions\r\nexport const ADD_SNACKBAR = \"ADD_SNACKBAR\";\r\n\r\n// tiles actions\r\nexport const ADD_TILES = \"ADD_TILES\";\r\nexport const ADD_TILE_PILE = \"ADD_TILE_PILE\";\r\nexport const TAKE_TILE = \"TAKE_TILE\";\r\nexport const SET_LAVA_TILE = \"SET_LAVA_TILE\";\r\n","/** @module messageData */\r\n\r\nexport const stageData = [\r\n {\r\n color: \"success\",\r\n text: \"A.D. 78: Vesuvius Sleeps\"\r\n },\r\n {\r\n color: \"warning\",\r\n text: \"A.D. 79: Vesuvius SEETHES!\"\r\n },\r\n {\r\n color: \"danger\",\r\n text: \"A.D. 79: VESUVIUS ERUPTS!\"\r\n }\r\n];\r\n\r\nexport const phaseMessage = [\"Play a Card\", \"Place a Person\", \"Draw a Card\"];\r\n","/** @module MessageActions */\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\nimport { addSnackbar } from \"./SnackbarActions\";\r\n\r\nimport { stageData } from \"../../data/messageData\";\r\n\r\n/**\r\n * @function setStageInStore\r\n * @description increments stage in MessageState store\r\n * @param {Number} stage\r\n */\r\nexport const setStageInStore = stage => ({\r\n type: actionTypes.SET_STAGE,\r\n payload: stage\r\n});\r\n\r\n/**\r\n * @function updateInstructions\r\n * @description updates instructions within MessageState store\r\n * @param {Object} instructionObj - instructions (replacing existing)\r\n */\r\nexport const updateInstructions = instructionObj => ({\r\n type: actionTypes.UPDATE_INSTRUCTIONS,\r\n payload: instructionObj\r\n});\r\n\r\n/**\r\n * @function incrementStage\r\n * @description increments stage with snackbar\r\n */\r\nexport const incrementStage = () => (dispatch, getState) => {\r\n const {\r\n messageState: { stage }\r\n } = getState();\r\n dispatch(\r\n addSnackbar({\r\n message: stageData[stage + 1].text,\r\n type: \"error\"\r\n })\r\n );\r\n dispatch(setStageInStore(stage + 1));\r\n};\r\n","/** @module FlagsActions */\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\n\r\n/**\r\n * @function toggleFlags\r\n * @description adds or removes flag name to flagState,\r\n * used to determine if flag et al is on or off\r\n * @param {String} toggle - name of flag being toggled\r\n */\r\nexport const toggleFlags = flag => ({\r\n type: actionTypes.TOGGLE_FLAGS,\r\n payload: flag\r\n});\r\n\r\n/**\r\n * @function setRunCounter\r\n * @description updates run counter within flagState\r\n * @param {Number} counter - counter (replacing existing)\r\n */\r\nexport const setRunCounter = counter => ({\r\n type: actionTypes.SET_RUN_COUNTER,\r\n payload: counter\r\n});\r\n\r\n/**\r\n * @function setRelativesCounter\r\n * @description updates relatives counter within flagState\r\n * @param {Number} counter - counter (replacing existing)\r\n */\r\nexport const setRelativesCounter = counter => ({\r\n type: actionTypes.SET_RELATIVES_COUNTER,\r\n payload: counter\r\n});\r\n\r\n/**\r\n * @function setEruptionCounter\r\n * @description updates eruption counter within flagState\r\n * @param {Number} counter - counter (replacing existing)\r\n */\r\nexport const setEruptionCounter = counter => ({\r\n type: actionTypes.SET_ERUPTION_COUNTER,\r\n payload: counter\r\n});\r\n","/** @module CardsActions */\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\n\r\n/**\r\n * @function addGrid\r\n * @description adds initial grid to GridState store\r\n * @param {Object} cards - cards dictionary\r\n */\r\nexport const addGrid = grid => ({\r\n type: actionTypes.ADD_GRID,\r\n payload: grid\r\n});\r\n\r\n/**\r\n * @function placePeopleInSquare\r\n * @description updates singular grid square within GridState store\r\n * with updated occupants (replacing existing)\r\n * @param {String} squareId - square Id\r\n * @param {Array} occupants - occupants array\r\n */\r\nexport const placePeopleInSquare = (squareId, occupants) => ({\r\n type: actionTypes.PLACE_PEOPLE,\r\n payload: { squareId, occupants }\r\n});\r\n\r\n/**\r\n * @function placeLavaTileOnSquare\r\n * @description updates singular grid square within GridState store\r\n * with lava tile\r\n * @param {String} squareId - square Id\r\n * @param {Array} tile - lava tile\r\n */\r\nexport const placeLavaTileOnSquare = (squareId, tile) => ({\r\n type: actionTypes.PLACE_LAVA,\r\n payload: { squareId, tile }\r\n});\r\n\r\n/**\r\n * @function setDangerZone\r\n * @description updates gridState.dangerZone\r\n * @param {Array} zone - array of squares\r\n */\r\nexport const setDangerZone = zone => ({\r\n type: actionTypes.SET_DANGER_ZONE,\r\n payload: zone\r\n});\r\n\r\n/**\r\n * @function setRunZone\r\n * @description updates gridState.runZone\r\n * @param {Array} zone - array of squares\r\n */\r\nexport const setRunZone = zone => ({\r\n type: actionTypes.SET_RUN_ZONE,\r\n payload: zone\r\n});\r\n\r\n/**\r\n * @function setRunFromSquare\r\n * @description updates gridState.runFromSquare\r\n * @param {String} square - squares\r\n */\r\nexport const setRunFromSquare = square => ({\r\n type: actionTypes.SET_RUN_FROM_SQUARE,\r\n payload: square\r\n});\r\n\r\n/**\r\n * @function setRunner\r\n * @description updates gridState.runner\r\n * @param {Object} runner - runner personObj\r\n */\r\nexport const setRunner = runner => ({\r\n type: actionTypes.SET_RUNNER,\r\n payload: runner\r\n});\r\n\r\n/**\r\n * @function updateDistanceToExitInStore\r\n * @description updates square's shortest safe distance to exit\r\n * @param {String} squareId - square Id\r\n * @param {Number} distance - distance\r\n */\r\nexport const updateDistanceToExitInStore = (squareId, distance) => ({\r\n type: actionTypes.UPDATE_DISTANCE_TO_EXIT,\r\n payload: { squareId, distance }\r\n});\r\n\r\n/**\r\n * @function updateDistanceToExit\r\n * @description dispatch updated distance to action\r\n * @param {String} squareId - square Id\r\n * @param {Number} distance - distance\r\n */\r\nexport const updateDistanceToExit = (squareId, distance) => dispatch => {\r\n dispatch(updateDistanceToExitInStore(squareId, distance));\r\n};\r\n","/** @module PlayersActions */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\nimport * as constant from \"../../data/constants\";\r\nimport { updateInstructions } from \"./MessageActions\";\r\nimport { addSnackbar } from \"./SnackbarActions\";\r\nimport { toggleFlags } from \"./FlagsActions\";\r\nimport { placeLavaTileOnSquare, placePeopleInSquare } from \"./GridActions\";\r\n\r\n/**\r\n * @function setPlayerArray\r\n * @description adds players array to PlayersState store\r\n * @param {Array} playerIds - array of player IDs\r\n */\r\nexport const setPlayerArray = playerIds => ({\r\n type: actionTypes.SET_PLAYERS_ARRAY,\r\n payload: playerIds\r\n});\r\n\r\n/**\r\n * @function addPlayers\r\n * @description adds all player object to PlayersState store\r\n * @param {Array} playersObj\r\n */\r\nexport const addPlayers = playersObj => ({\r\n type: actionTypes.ADD_PLAYERS,\r\n payload: playersObj\r\n});\r\n\r\n/**\r\n * @function addPlayer\r\n * @description adds/updates single player object to PlayersState store\r\n * @param {String} playerId\r\n * @param {Object} details - player object\r\n */\r\nexport const addPlayer = (playerId, details) => ({\r\n type: actionTypes.ADD_PLAYER,\r\n payload: { playerId, details }\r\n});\r\n\r\n/**\r\n * @function updatePlayerHand\r\n * @description adds/updates single player hand array to PlayersState store\r\n * @param {String} playerId\r\n * @param {Object} hand - player hand array\r\n */\r\nexport const updatePlayerHand = (playerId, hand) => ({\r\n type: actionTypes.UPDATE_PLAYER_HAND,\r\n payload: { playerId, hand }\r\n});\r\n\r\n/**\r\n * @function incrementPlayerPopulation\r\n * @description adds/updates single player population to PlayersState store\r\n * @param {String} playerId\r\n * @param {Object} personObj - person\r\n */\r\nexport const incrementPlayerPopulation = (playerId, personObj) => ({\r\n type: actionTypes.INCREMENT_PLAYER_POPULATION,\r\n payload: { playerId, personObj }\r\n});\r\n\r\n/**\r\n * @function incrementPlayerCasualtiesInStore\r\n * @description adds/updates single player casualties to PlayersState store\r\n * @param {Object} personObj - person\r\n */\r\nexport const incrementPlayerCasualtiesInStore = personObj => ({\r\n type: actionTypes.INCREMENT_PLAYER_CASUALTIES,\r\n payload: personObj\r\n});\r\n\r\n/**\r\n * @function addActivePlayer\r\n * @description updates active player in PlayersState store\r\n * @param {String} playerId\r\n */\r\nexport const addActivePlayer = playerId => ({\r\n type: actionTypes.SET_ACTIVE_PLAYER,\r\n payload: playerId\r\n});\r\n\r\n/**\r\n * @function incrementPlayerCasualties\r\n * @description adds/updates single player casualties with snackbar\r\n * @param {String} playerId\r\n * @param {Object} personObj - player casualty\r\n */\r\nexport const incrementPlayerCasualties = (playerId, personObj) => (\r\n dispatch,\r\n getState\r\n) => {\r\n const { playersState } = getState();\r\n setTimeout(() => {\r\n dispatch(\r\n addSnackbar({\r\n message: `${_.get(\r\n playersState,\r\n `details.${playerId}.name`\r\n )}'s people have suffered casualties!`,\r\n type: \"error\"\r\n })\r\n );\r\n }, 10);\r\n dispatch(incrementPlayerCasualtiesInStore(personObj));\r\n};\r\n\r\n/**\r\n * @function incrementPlayerSavedInStore\r\n * @description adds/updates single player saved to PlayersState store\r\n * @param {Object} personObj - saved person\r\n */\r\nexport const incrementPlayerSavedInStore = personObj => ({\r\n type: actionTypes.INCREMENT_PLAYER_SAVED,\r\n payload: personObj\r\n});\r\n\r\n/**\r\n * @function incrementPlayerSaved\r\n * @description adds/updates single player saved with snackbar\r\n * @param {Number} personObj - saved person\r\n */\r\nexport const incrementPlayerSaved = personObj => (dispatch, getState) => {\r\n if (personObj) {\r\n const { playersState } = getState();\r\n const playerId = personObj.player;\r\n setTimeout(() => {\r\n dispatch(\r\n addSnackbar({\r\n message: `One of ${playersState.details[playerId].name}'s people have escaped!`,\r\n type: \"success\"\r\n })\r\n );\r\n }, 10);\r\n dispatch(incrementPlayerSavedInStore(personObj));\r\n }\r\n};\r\n\r\n/**\r\n * @function setPlayerTurn\r\n * @description sets player turn in PlayersState store\r\n * @param {Number} player - whose turn it is\r\n */\r\nexport const setPlayerTurn = player => ({\r\n type: actionTypes.SET_PLAYER_TURN,\r\n payload: player\r\n});\r\n\r\n/**\r\n * @function incrementPlayerTurn\r\n * @description update player turn to next player (and check for end of game)\r\n */\r\nexport const incrementPlayerTurn = () => (dispatch, getState) => {\r\n const {\r\n playersState,\r\n messageState: { stage },\r\n tileState: { pile },\r\n gridState: { grid }\r\n } = getState();\r\n\r\n // game over?\r\n let census = [];\r\n Object.values(playersState.details).forEach(arr => {\r\n census = [...census, ...arr.population];\r\n });\r\n if (pile.length === 0 || census.length === 0) {\r\n const gridArray = Object.keys(grid);\r\n gridArray.forEach(square => {\r\n if (_.get(grid, `${square}.occupants.length`) > 0) {\r\n _.get(grid, `${square}.occupants`).forEach(person => {\r\n dispatch(incrementPlayerCasualtiesInStore(person.player, 1));\r\n });\r\n }\r\n if (!_.get(grid, `${square}.lava`)) {\r\n dispatch(placeLavaTileOnSquare(square, \"Lava\"));\r\n }\r\n dispatch(placePeopleInSquare(square, []));\r\n });\r\n dispatch(toggleFlags(\"game-over\"));\r\n }\r\n\r\n // get next player\r\n const nextPlayer = (playersState.turn + 1) % playersState.players.length;\r\n dispatch(setPlayerTurn(nextPlayer));\r\n dispatch(addActivePlayer(playersState.players[nextPlayer]));\r\n dispatch(\r\n updateInstructions({\r\n text: `${_.get(\r\n playersState,\r\n `details.${playersState.players[nextPlayer]}.name`\r\n )}: ${stage < 2 ? constant.PLAY : constant.LAVA_TILE}`,\r\n color: _.get(\r\n playersState,\r\n `details.${playersState.players[nextPlayer]}.color`\r\n )\r\n })\r\n );\r\n // dispatch(\r\n // addSnackbar({\r\n // message: `It is now ${_.get(\r\n // playersState,\r\n // `details.${playersState.players[nextPlayer]}.name`\r\n // )}'s turn`,\r\n // type: \"info\"\r\n // })\r\n // );\r\n};\r\n","/** @module utilsCommon */\r\n\r\n/**\r\n * @function compareCards\r\n * @description custom comparison function for card ids (card_x)\r\n * @param {string} a\r\n * @param {string} b\r\n * @returns {Number}\r\n */\r\nexport const compareCards = (a, b) => {\r\n const cardA = parseFloat(a.split(\"_\")[1]);\r\n const cardB = parseFloat(b.split(\"_\")[1]);\r\n if (cardA === cardB) {\r\n return 0;\r\n }\r\n return cardA < cardB ? -1 : 1;\r\n};\r\n\r\n/**\r\n * @function shuffle\r\n * @description shuffles any array of tiles provided and returns randomized (using Fisher-Yates shuffle)\r\n * @param {Array} tiles\r\n * @returns {Array}\r\n */\r\nexport const shuffle = tiles => {\r\n const shuffledCards = [...tiles];\r\n const numberOfShuffles = 5;\r\n for (let s = 0; s < numberOfShuffles; s += 1) {\r\n for (let i = shuffledCards.length - 1; i > 0; i -= 1) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffledCards[i], shuffledCards[j]] = [\r\n shuffledCards[j],\r\n shuffledCards[i]\r\n ];\r\n }\r\n }\r\n return shuffledCards;\r\n};\r\n\r\n/**\r\n * @function randAndArrangeRecommendations\r\n * @description randomize than arrange (sort) recommendationsArray\r\n * @param {Array} recommendationsArray\r\n * @returns {Array}\r\n */\r\nexport const randAndArrangeRecommendations = recommendationsArray => {\r\n const array = [...recommendationsArray];\r\n for (let i = array.length - 1; i > 0; i -= 1) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n const temp = array[i];\r\n array[i] = array[j];\r\n array[j] = temp;\r\n }\r\n const sortedEvaluations = array.sort((a, b) => (a.value < b.value ? 1 : -1));\r\n return sortedEvaluations;\r\n};\r\n","/** @module CardsActions */\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\nimport { cardDictionary } from \"../../data/cardData\";\r\nimport { updatePlayerHand } from \"./PlayersActions\";\r\nimport * as constant from \"../../data/constants\";\r\nimport { shuffle } from \"../../utils/utilsCommon\";\r\n\r\n/**\r\n * @function addCards\r\n * @description adds cards dictionary to CardsState store\r\n * @param {Object} cards - cards dictionary\r\n */\r\nexport const addCards = cards => ({\r\n type: actionTypes.ADD_CARDS,\r\n payload: cards\r\n});\r\n\r\n/**\r\n * @function addDeck\r\n * @description adds deck array to CardsState store\r\n * @param {Array} deck\r\n */\r\nexport const addDeck = deck => ({\r\n type: actionTypes.ADD_DECK,\r\n payload: deck\r\n});\r\n\r\n/**\r\n * @function takeCard\r\n * @description takes top card from deck\r\n */\r\nexport const takeCard = () => ({\r\n type: actionTypes.TAKE_CARD,\r\n payload: null\r\n});\r\n\r\n/**\r\n * @function discardCard\r\n * @description places card into discard pile\r\n * @param {String} card\r\n */\r\nexport const discardCard = card => ({\r\n type: actionTypes.DISCARD_CARD,\r\n payload: card\r\n});\r\n\r\n/**\r\n * @function setCardGridInStore\r\n * @description sets cardState.grid array\r\n * @param {Array} cards - cards array\r\n */\r\nexport const setCardGridInStore = cards => ({\r\n type: actionTypes.SET_CARD_GRID,\r\n payload: cards\r\n});\r\n\r\n/**\r\n * @function setCardGrid\r\n * @description dispatchs cards array to setCardGridInStore action\r\n * @param {Array} cards\r\n */\r\nexport const setCardGrid = cards => dispatch => {\r\n dispatch(setCardGridInStore(cards));\r\n};\r\n\r\n/**\r\n * @function generateDeck\r\n * @description generates deck for game\r\n * @param {Boolean} stageTwo - whether or not cards for stage one are not includes\r\n */\r\nexport const generateDeck = stageTwo => (dispatch, getState) => {\r\n const {\r\n playersState: { players }\r\n } = getState();\r\n\r\n // pull cards from cardDictionary\r\n dispatch(addCards(cardDictionary));\r\n\r\n // populate deck arrays\r\n let deck = [];\r\n const omens = [];\r\n const ad79s = [];\r\n Object.keys(cardDictionary).forEach(card => {\r\n for (let i = 0; i < cardDictionary[card].count; i += 1) {\r\n switch (cardDictionary[card].type) {\r\n case constant.OMEN:\r\n omens.push(card);\r\n break;\r\n case constant.AD79:\r\n ad79s.push(card);\r\n break;\r\n default:\r\n deck.push(card);\r\n }\r\n }\r\n });\r\n deck = shuffle(deck);\r\n\r\n // 7 hands of 4 cards each\r\n const hands = [];\r\n for (let i = 0; i < 7; i += 1) {\r\n hands.push([]);\r\n for (let ii = 0; ii < 4; ii += 1) {\r\n const hand = deck.shift();\r\n hands[i].push(hand);\r\n }\r\n }\r\n\r\n // add omens\r\n deck = shuffle([...deck, ...omens]);\r\n\r\n // add AD79 to first 10 (4 players) or 15 (2-3 players) cards\r\n const numberOfCards = players.length > 3 ? 10 : 15;\r\n deck.splice(Math.floor(Math.random(1) * numberOfCards), 0, ad79s.shift());\r\n\r\n // add two hands to end of deck (if not stage two)\r\n if (!stageTwo) {\r\n deck = [...deck, ...ad79s, ...hands[5], ...hands[6]];\r\n }\r\n\r\n dispatch(addDeck(deck));\r\n\r\n // pass hands to players\r\n const promises = [];\r\n players.forEach((player, idx) => {\r\n promises.push(dispatch(updatePlayerHand(player, hands[idx])));\r\n });\r\n Promise.all(promises);\r\n};\r\n","/** @module tileData */\r\n\r\nexport const tileDictionary = {\r\n Mask: {\r\n count: 7\r\n },\r\n Scroll: {\r\n count: 8\r\n },\r\n Helmet: {\r\n count: 7\r\n },\r\n Coin: {\r\n count: 8\r\n },\r\n Pillar: {\r\n count: 8\r\n },\r\n Urn: {\r\n count: 8\r\n }\r\n};\r\n\r\nexport const wildTileDictionary = {\r\n WildHM: {\r\n count: 1,\r\n wilds: [\"Helmet\", \"Mask\"]\r\n },\r\n WildUS: {\r\n count: 1,\r\n wilds: [\"Urn\", \"Scroll\"]\r\n },\r\n WildPC: {\r\n count: 1,\r\n wilds: [\"Pillar\", \"Coin\"]\r\n }\r\n};\r\n","/** @module TilesActions */\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\nimport { tileDictionary, wildTileDictionary } from \"../../data/tileData\";\r\nimport { shuffle } from \"../../utils/utilsCommon\";\r\n\r\n/**\r\n * @function addTiles\r\n * @description adds tiles dictionary to TileState store\r\n * @param {Object} tiles - tiles dictionary\r\n */\r\nexport const addTiles = tiles => ({\r\n type: actionTypes.ADD_TILES,\r\n payload: tiles\r\n});\r\n\r\n/**\r\n * @function addTilePile\r\n * @description adds pile array to TileState store\r\n * @param {Array} pile\r\n */\r\nexport const addTilePile = pile => ({\r\n type: actionTypes.ADD_TILE_PILE,\r\n payload: pile\r\n});\r\n\r\n/**\r\n * @function takeTile\r\n * @description takes top tile from pile\r\n */\r\nexport const takeTile = () => ({\r\n type: actionTypes.TAKE_TILE,\r\n payload: null\r\n});\r\n\r\n/**\r\n * @function setLavaTile\r\n * @description set lava tile in store\r\n * @param {String} tile\r\n */\r\nexport const setLavaTile = tile => ({\r\n type: actionTypes.SET_LAVA_TILE,\r\n payload: tile\r\n});\r\n\r\n/**\r\n * @function generatePile\r\n * @description generates tile pile for game\r\n * @param {Boolean} wilds - are wild tiles includes\r\n */\r\nexport const generatePile = wilds => dispatch => {\r\n // pull tiles from tileDictionary\r\n let tiles = tileDictionary;\r\n if (wilds) {\r\n tiles = {\r\n ...tiles,\r\n ...wildTileDictionary\r\n }\r\n }\r\n dispatch(addTiles(tiles));\r\n\r\n // populate pile arrays\r\n let pile = [];\r\n Object.keys(tiles).forEach(tile => {\r\n for (let i = 0; i < tiles[tile].count; i += 1) {\r\n pile.push(tile);\r\n }\r\n });\r\n pile = shuffle(pile);\r\n dispatch(addTilePile(pile));\r\n};\r\n","/** @module playerData */\r\n\r\nexport const playerColors = [\r\n \"39, 35, 156\",\r\n \"35, 156, 45\",\r\n \"201, 39, 34\",\r\n \"0, 0, 0\"\r\n];\r\n\r\nexport const aiPlayers = {\r\n Corvus: {\r\n name: \"Corvus\",\r\n cautious: 2,\r\n social: 1,\r\n chaotic: 1\r\n },\r\n Graecus: {\r\n name: \"Graecus\",\r\n cautious: 1,\r\n social: 2,\r\n chaotic: 1\r\n },\r\n Cassia: {\r\n name: \"Cassia\",\r\n cautious: 1,\r\n social: 1,\r\n chaotic: 2\r\n },\r\n Severus: {\r\n name: \"Severus\",\r\n cautious: 3,\r\n social: 2,\r\n chaotic: 0\r\n },\r\n Aurelia: {\r\n name: \"Aurelia\",\r\n cautious: 0,\r\n social: 3,\r\n chaotic: 2\r\n },\r\n Proculus: {\r\n name: \"Proculus\",\r\n cautious: 2,\r\n social: 0,\r\n chaotic: 3\r\n }\r\n};\r\n","/** @module gridData */\r\n\r\nimport * as constant from \"./constants\";\r\n\r\nexport const gridSquares = {\r\n \"0_0\": {\r\n gateName: \"Porta Errolano\",\r\n occupants: [],\r\n distanceToExit: 1\r\n },\r\n \"0_1\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 1,\r\n occupants: [],\r\n offSets: [[44, 35]],\r\n distanceToExit: 2\r\n },\r\n \"0_2\": {\r\n occupants: [],\r\n distanceToExit: 3\r\n },\r\n \"0_3\": {\r\n occupants: [],\r\n distanceToExit: 3\r\n },\r\n \"0_4\": {\r\n buildingName: \"Purple 2\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [27, 40],\r\n [63, 40]\r\n ],\r\n distanceToExit: 2\r\n },\r\n \"0_5\": {\r\n gateName: \"Porta Vesuvio\",\r\n occupants: [],\r\n distanceToExit: 1\r\n },\r\n \"0_6\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [44, 16],\r\n [44, 47]\r\n ],\r\n distanceToExit: 2\r\n },\r\n \"0_7\": {\r\n ventName: \"Scroll\"\r\n },\r\n \"1_0\": {\r\n buildingName: \"Grey 1\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [12, 9],\r\n [12, 45]\r\n ],\r\n distanceToExit: 2\r\n },\r\n \"1_1\": {\r\n buildingName: \"Grey 1\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [32, 46],\r\n [69, 46]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"1_2\": {\r\n ventName: \"Coin\"\r\n },\r\n \"1_3\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [22, 9],\r\n [56, 9],\r\n [22, 44]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"1_4\": {\r\n buildingName: \"Purple 2\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [27, 50],\r\n [64, 50]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"1_5\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"1_6\": {\r\n occupants: [],\r\n distanceToExit: 3\r\n },\r\n \"1_7\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [31, 46],\r\n [66, 46]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"1_8\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"1_9\": {\r\n gateName: \"Porta Di Nola\",\r\n occupants: [],\r\n distanceToExit: 1\r\n },\r\n \"2_0\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [56, 15],\r\n [56, 48]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"2_1\": {\r\n occupants: [],\r\n distanceToExit: 4\r\n },\r\n \"2_2\": {\r\n buildingName: \"Purple 3\",\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [39, 26],\r\n [21, 57],\r\n [58, 57]\r\n ],\r\n distanceToExit: 5\r\n },\r\n \"2_3\": {\r\n buildingName: \"Purple 3\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [26, 57],\r\n [63, 57]\r\n ],\r\n distanceToExit: 5\r\n },\r\n \"2_4\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [31, 15],\r\n [31, 47]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"2_5\": {\r\n buildingName: \"Grey 4\",\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [49, 25],\r\n [31, 56],\r\n [68, 56]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"2_6\": {\r\n buildingName: \"Grey 4\",\r\n buildingCapacity: 4,\r\n occupants: [],\r\n offSets: [\r\n [37, 20],\r\n [74, 20],\r\n [37, 56],\r\n [74, 56]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"2_7\": {\r\n occupants: [],\r\n distanceToExit: 4\r\n },\r\n \"2_8\": {\r\n buildingName: \"Purple 5\",\r\n buildingCapacity: 4,\r\n occupants: [],\r\n offSets: [\r\n [37, 40],\r\n [74, 40],\r\n [37, 75],\r\n [74, 75]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"2_9\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"2_10\": {\r\n ventName: \"Urn\"\r\n },\r\n \"3_0\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"3_1\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [24, 11],\r\n [58, 11],\r\n [24, 45]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"3_2\": {\r\n buildingName: \"Turquoise 6\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [34, 34],\r\n [68, 37]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"3_3\": {\r\n buildingName: \"Turquoise 6\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [21, 54],\r\n [58, 53]\r\n ],\r\n distanceToExit: 5\r\n },\r\n \"3_4\": {\r\n ventName: \"Pillar\"\r\n },\r\n \"3_5\": {\r\n occupants: [],\r\n distanceToExit: 4\r\n },\r\n \"3_6\": {\r\n buildingName: \"Grey 8\",\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [9, 19],\r\n [8, 57],\r\n [40, 38]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"3_7\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [25, 15],\r\n [58, 15],\r\n [25, 48]\r\n ],\r\n distanceToExit: 5\r\n },\r\n \"3_8\": {\r\n occupants: [],\r\n distanceToExit: 4\r\n },\r\n \"3_9\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [30, 10],\r\n [30, 42]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"3_10\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 1,\r\n occupants: [],\r\n offSets: [[41, 29]],\r\n distanceToExit: 2\r\n },\r\n \"4_0\": {\r\n gateName: \"Porta Marina\",\r\n occupants: [],\r\n distanceToExit: 1\r\n },\r\n \"4_1\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"4_2\": {\r\n buildingName: \"Turquoise 6\",\r\n buildingCapacity: 1,\r\n occupants: [],\r\n offSets: [[53, 68]],\r\n distanceToExit: 3\r\n },\r\n \"4_3\": {\r\n buildingName: \"Turquoise 6\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [21, 66],\r\n [58, 66]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"4_4\": {\r\n occupants: [],\r\n distanceToExit: 5\r\n },\r\n \"4_5\": {\r\n buildingName: \"Purple 7\",\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [51, 38],\r\n [33, 70],\r\n [70, 70]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"4_6\": {\r\n buildingName: \"Grey 8\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [37, 39],\r\n [74, 39]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"4_7\": {\r\n occupants: [],\r\n distanceToExit: 4\r\n },\r\n \"4_8\": {\r\n occupants: [],\r\n distanceToExit: 3\r\n },\r\n \"4_9\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"4_10\": {\r\n gateName: \"Porta Di Sano\",\r\n occupants: [],\r\n distanceToExit: 1\r\n },\r\n \"5_0\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"5_1\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [29, 44],\r\n [65, 44]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"5_2\": {\r\n occupants: [],\r\n distanceToExit: 4\r\n },\r\n \"5_3\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [28, 16],\r\n [28, 49]\r\n ],\r\n distanceToExit: 5\r\n },\r\n \"5_4\": {\r\n buildingName: \"Turquoise 9\",\r\n buildingNumber: 9,\r\n buildingCapacity: 4,\r\n occupants: [],\r\n offSets: [\r\n [38, 42],\r\n [74, 42],\r\n [38, 78],\r\n [74, 78]\r\n ],\r\n distanceToExit: 4\r\n },\r\n \"5_5\": {\r\n buildingName: \"Brown 10\",\r\n buildingCapacity: 3,\r\n occupants: [],\r\n offSets: [\r\n [49, 15],\r\n [31, 47],\r\n [68, 47]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"5_6\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"5_7\": {\r\n buildingName: constant.WHITE,\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [24, 12],\r\n [24, 44]\r\n ],\r\n distanceToExit: 3\r\n },\r\n \"5_8\": {\r\n buildingName: \"Brown 11\",\r\n buildingCapacity: 1,\r\n occupants: [],\r\n offSets: [[42, 13]],\r\n distanceToExit: 2\r\n },\r\n \"5_9\": {\r\n occupants: [],\r\n distanceToExit: 3\r\n },\r\n \"5_10\": {\r\n buildingName: \"Brown 11\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [10, 61],\r\n [48, 61]\r\n ],\r\n distanceToExit: 2\r\n },\r\n \"6_3\": {\r\n ventName: \"Mask\"\r\n },\r\n \"6_4\": {\r\n occupants: [],\r\n distanceToExit: 3\r\n },\r\n \"6_5\": {\r\n buildingName: \"Brown 10\",\r\n buildingCapacity: 2,\r\n occupants: [],\r\n offSets: [\r\n [21, 50],\r\n [59, 50]\r\n ],\r\n distanceToExit: 2\r\n },\r\n \"6_6\": {\r\n gateName: \"Porta De Stabia\",\r\n occupants: [],\r\n distanceToExit: 1\r\n },\r\n \"6_7\": {\r\n occupants: [],\r\n distanceToExit: 2\r\n },\r\n \"6_8\": {\r\n buildingName: \"Brown 11\",\r\n buildingCapacity: 1,\r\n gateName: \"Porta Nocera\",\r\n occupants: [],\r\n offSets: [[43, 21]],\r\n distanceToExit: 1\r\n },\r\n \"6_9\": {\r\n ventName: \"Helmet\"\r\n },\r\n \"6_10\": {\r\n buildingName: \"Brown 11\",\r\n buildingCapacity: 1,\r\n occupants: [],\r\n offSets: [[32, 8]],\r\n distanceToExit: 3\r\n }\r\n};\r\n\r\nexport const gridByColor = {\r\n White: [\r\n \"0_1\",\r\n \"0_6\",\r\n \"1_3\",\r\n \"1_7\",\r\n \"2_0\",\r\n \"2_4\",\r\n \"3_1\",\r\n \"3_7\",\r\n \"3_9\",\r\n \"3_10\",\r\n \"5_1\",\r\n \"5_3\",\r\n \"5_7\"\r\n ],\r\n Grey: [\"1_0\", \"1_1\", \"2_5\", \"2_6\", \"3_6\", \"4_6\"],\r\n Purple: [\"0_4\", \"1_4\", \"2_2\", \"2_3\", \"2_8\", \"4_5\"],\r\n Turquoise: [\"3_2\", \"3_3\", \"4_2\", \"4_3\", \"5_4\"],\r\n Brown: [\"5_5\", \"5_8\", \"5_9\", \"5_10\", \"6_5\", \"6_8\", \"6_10\"]\r\n};\r\n\r\nexport const voidLavaSquares = [\r\n \"0_8\",\r\n \"0_9\",\r\n \"0_10\",\r\n \"1_10\",\r\n \"6_0\",\r\n \"6_1\",\r\n \"6_2\"\r\n];\r\n\r\nexport const voidRunSquares = [\r\n \"0_8\",\r\n \"0_10\",\r\n \"1_10\",\r\n \"6_0\",\r\n \"6_1\",\r\n \"6_2\",\r\n \"-1_-1\",\r\n \"-1_0\",\r\n \"-1_1\",\r\n \"-1_2\",\r\n \"-1_3\",\r\n \"-1_4\",\r\n \"-1_6\",\r\n \"-1_7\",\r\n \"-1_8\",\r\n \"-1_9\",\r\n \"-1_10\",\r\n \"1_-1\",\r\n \"2_-1\",\r\n \"3_-1\",\r\n \"5_-1\",\r\n \"6_-1\",\r\n \"7_-1\",\r\n \"7_-1\",\r\n \"7_0\",\r\n \"7_1\",\r\n \"7_2\",\r\n \"7_3\",\r\n \"7_4\",\r\n \"7_5\",\r\n \"7_7\",\r\n \"7_9\",\r\n \"7_10\",\r\n \"0_11\",\r\n \"1_11\",\r\n \"2_11\",\r\n \"3_11\",\r\n \"5_11\",\r\n \"6_11\",\r\n \"7_11\"\r\n];\r\n\r\nexport const escapeSquares = [\r\n \"-1_5\",\r\n \"0_9\",\r\n \"0_-1\",\r\n \"4_-1\",\r\n \"4_11\",\r\n \"7_6\",\r\n \"7_8\"\r\n];\r\n\r\nexport const gateSquares = [\"0_0\", \"0_5\", \"1_9\", \"4_0\", \"4_10\", \"6_6\", \"6_8\"];\r\n\r\nexport const nextToVentSquares = [\r\n \"0_2\",\r\n \"0_6\",\r\n \"1_1\",\r\n \"1_3\",\r\n \"1_7\",\r\n \"2_2\",\r\n \"2_4\",\r\n \"2_9\",\r\n \"3_3\",\r\n \"3_5\",\r\n \"3_10\",\r\n \"4_4\",\r\n \"5_3\",\r\n \"5_9\",\r\n \"6_4\",\r\n \"6_8\",\r\n \"6_10\"\r\n];\r\n","/** @module GamePlayActions */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport * as actionTypes from \"../ActionTypes\";\r\nimport { generateDeck } from \"./CardsActions\";\r\nimport { setEruptionCounter } from \"./FlagsActions\";\r\nimport { addGrid } from \"./GridActions\";\r\nimport { updateInstructions, setStageInStore } from \"./MessageActions\";\r\nimport {\r\n setPlayerArray,\r\n addPlayers,\r\n setPlayerTurn,\r\n addActivePlayer\r\n} from \"./PlayersActions\";\r\nimport { generatePile } from \"./TilesActions\";\r\nimport { playerColors } from \"../../data/playerData\";\r\nimport { gridSquares } from \"../../data/gridData\";\r\nimport * as constant from \"../../data/constants\";\r\n\r\n/**\r\n * @function addRecommendationsToStore\r\n * @description adds initial grid to GamePlayState store\r\n * @param {Array} recommendations - array or recommendations\r\n */\r\nexport const addRecommendationsToStore = recommendations => ({\r\n type: actionTypes.ADD_RECOMMENDATIONS,\r\n payload: recommendations\r\n});\r\n\r\n/**\r\n * @function addRecommendations\r\n * @description dispatches initial grid to addRecommendationsToStore\r\n * @param {Array} recommendations - array or recommendations\r\n */\r\nexport const addRecommendations = recommendations => dispatch => {\r\n dispatch(addRecommendationsToStore(recommendations));\r\n};\r\n\r\n/**\r\n * @function setPlacedRelativesToStore\r\n * @description sets relatives array\r\n * @param {Array} relatives - array or relatives\r\n */\r\nexport const setPlacedRelativesToStore = relatives => ({\r\n type: actionTypes.SET_PLACED_RELATIVES,\r\n payload: relatives\r\n});\r\n\r\n/**\r\n * @function setPlacedRelatives\r\n * @description dispatches initial grid to setPlacedRelativesToStore\r\n * @param {Array} relatives - array or relatives\r\n */\r\nexport const setPlacedRelatives = relatives => dispatch => {\r\n dispatch(setPlacedRelativesToStore(relatives));\r\n};\r\n\r\n/**\r\n * @function saveGameSettings\r\n * @description saves dev-level game settings\r\n * @param {Object} settings\r\n */\r\nexport const saveGameSettings = settings => ({\r\n type: actionTypes.SAVE_GAME_SETTINGS,\r\n payload: settings\r\n});\r\n\r\n/**\r\n * @function selectPerson\r\n * @description saves selected person\r\n * @param {Object} personObj\r\n */\r\nexport const selectPerson = personObj => ({\r\n type: actionTypes.SELECT_PERSON,\r\n payload: personObj\r\n});\r\n\r\n/**\r\n * @function gameSetup\r\n * @description takes start game values and dispatches initial game store values\r\n * @param {Object} details playerState details object\r\n * @param {Number} startPlayer which player starts\r\n * @param {Object} gameSettings gameSettings object\r\n */\r\nexport const gameSetup = (\r\n details,\r\n startPlayer,\r\n gameSettings = {}\r\n) => async dispatch => {\r\n const theseDetails = { ...details };\r\n\r\n const playersArray = Object.keys(theseDetails);\r\n\r\n if (gameSettings.prePopulate) {\r\n // START PRE-POPULATION (TEST)\r\n const gridKeys = Object.keys(gridSquares);\r\n gridKeys.forEach(grid => {\r\n const potentialPop = _.get(gridSquares, `${grid}.buildingCapacity`, 0);\r\n const actualPop =\r\n gameSettings.startPhase === 2\r\n ? Math.ceil(Math.random() * potentialPop)\r\n : Math.floor(Math.random() * potentialPop);\r\n const occupants = [];\r\n for (let i = 0; i < actualPop; i += 1) {\r\n const rand = Math.floor(Math.random() * playersArray.length);\r\n const player = playersArray[rand];\r\n const id = `P${rand}-${theseDetails[player].population.length}s`;\r\n const personObj = {\r\n id,\r\n player,\r\n gender: Math.floor(Math.random() * 2) === 1 ? \"male\" : \"female\"\r\n };\r\n occupants.push(personObj);\r\n theseDetails[player].population.push(personObj);\r\n theseDetails[player].totalPieces =\r\n _.get(theseDetails, `${player}.totalPieces`, 0) + 1;\r\n }\r\n gridSquares[grid].occupants = occupants;\r\n });\r\n // END PRE-POPULATION (TEST)\r\n }\r\n\r\n if (gameSettings.startPhase > 0) {\r\n await dispatch(setStageInStore(gameSettings.startPhase));\r\n }\r\n await dispatch(saveGameSettings(gameSettings));\r\n await dispatch(addGrid(gridSquares));\r\n await dispatch(setEruptionCounter(gameSettings.noEruption ? 0 : 6));\r\n await dispatch(setPlayerArray(playersArray));\r\n await dispatch(addPlayers(theseDetails));\r\n await dispatch(setPlayerTurn(parseFloat(startPlayer) - 1));\r\n await dispatch(addActivePlayer(playersArray[startPlayer]));\r\n await dispatch(generateDeck(!!(gameSettings.startPhase === 1)));\r\n await dispatch(generatePile(gameSettings.wildLava));\r\n await dispatch(\r\n updateInstructions({\r\n text: `${details[`player${startPlayer}`].name}: ${constant.PLAY}`,\r\n color: playerColors[parseFloat(startPlayer) - 1]\r\n })\r\n );\r\n};\r\n","/** @module Actions */\r\n\r\nimport * as cardsActions from \"./Actions/CardsActions\";\r\nimport * as flagsActions from \"./Actions/FlagsActions\";\r\nimport * as gamePlayActions from \"./Actions/GamePlayActions\";\r\nimport * as gridActions from \"./Actions/GridActions\";\r\nimport * as messageActions from \"./Actions/MessageActions\";\r\nimport * as playersActions from \"./Actions/PlayersActions\";\r\nimport * as snackBarActions from \"./Actions/SnackbarActions\";\r\nimport * as tileActions from \"./Actions/TilesActions\";\r\n\r\nconst actions = {\r\n ...cardsActions,\r\n ...flagsActions,\r\n ...gamePlayActions,\r\n ...gridActions,\r\n ...messageActions,\r\n ...playersActions,\r\n ...snackBarActions,\r\n ...tileActions\r\n};\r\n\r\nexport default actions;\r\n","/** @module types */\r\n\r\nimport {\r\n arrayOf,\r\n bool,\r\n number,\r\n object,\r\n oneOf,\r\n string,\r\n shape\r\n} from \"prop-types\";\r\n\r\n/*\r\n CARD TYPES\r\n ----------*/\r\n\r\n/**\r\n * @const cards\r\n * @description Types for cards Redux store\r\n */\r\nexport const cards = {\r\n types: shape({\r\n key: object\r\n }),\r\n defaults: {\r\n key: {}\r\n }\r\n};\r\n\r\n/**\r\n * @const deck\r\n * @description Types for deck Redux store\r\n */\r\nexport const deck = {\r\n types: arrayOf(string),\r\n defaults: []\r\n};\r\n\r\n/**\r\n * @const cardsState\r\n * @description Types for cardsState Redux store\r\n */\r\nexport const cardsState = {\r\n types: shape({\r\n cards: cards.types,\r\n deck: deck.types,\r\n discard: deck.types,\r\n grid: deck.types\r\n }),\r\n defaults: {\r\n cards: cards.defaults,\r\n deck: deck.defaults,\r\n discard: deck.defaults,\r\n grid: deck.defaults\r\n }\r\n};\r\n\r\n/*\r\n FLAG TYPES\r\n ----------*/\r\n\r\n/**\r\n * @const flagsState\r\n * @description Types for flagsState Redux store\r\n */\r\nexport const flagsState = {\r\n types: shape({\r\n flags: arrayOf(string),\r\n runCount: number,\r\n relativesCount: number,\r\n eruptionCount: number\r\n }),\r\n defaults: {\r\n flags: [],\r\n runCount: 0,\r\n relativesCount: 0,\r\n eruptionCount: 0\r\n }\r\n};\r\n\r\n/*\r\n GRID TYPES\r\n ----------*/\r\n\r\n/**\r\n * @const occupant\r\n * @description Types for occupant Redux store\r\n */\r\nexport const occupant = {\r\n types: shape({\r\n id: string,\r\n player: string,\r\n gender: string,\r\n lastMoved: number\r\n }),\r\n defaults: {}\r\n};\r\n\r\n/**\r\n * @const gridSquare\r\n * @description Types for gridSquare Redux store\r\n */\r\nexport const gridSquare = {\r\n types: shape({\r\n buildingName: string,\r\n buildingCapacity: number,\r\n ventName: string,\r\n gateName: string,\r\n occupants: arrayOf(occupant.types),\r\n offSets: arrayOf(arrayOf(number)),\r\n distanceToExit: number\r\n }),\r\n defaults: {\r\n buildingName: null,\r\n buildingCapacity: null,\r\n ventName: null,\r\n gateName: null,\r\n occupants: [],\r\n offSets: [],\r\n distanceToExit: 0\r\n }\r\n};\r\n\r\n/**\r\n * @const gridState\r\n * @description Types for gridState Redux store\r\n */\r\nexport const gridState = {\r\n types: shape({\r\n grid: shape({\r\n \"0_0\": gridSquare.types\r\n }),\r\n dangerZone: arrayOf(string),\r\n runZone: arrayOf(string),\r\n runFromSquare: string,\r\n runner: occupant.types\r\n }),\r\n defaults: {\r\n grid: {\r\n \"0_0\": gridSquare.defaults\r\n },\r\n dangerZone: [],\r\n runZone: [],\r\n runFromSquare: \"\",\r\n runner: occupant.defaults\r\n }\r\n};\r\n\r\n/*\r\n GAME PLAY TYPES\r\n ---------------*/\r\n\r\n/**\r\n * @const gamePlayState\r\n * @description Types for gamePlayState Redux store\r\n */\r\nexport const gamePlayState = {\r\n types: shape({\r\n gameSettings: shape({\r\n autoPlayDisabled: bool,\r\n prePopulate: bool,\r\n startPhase: number,\r\n noEruption: bool,\r\n showStrategyValues: bool\r\n }),\r\n recommendations: arrayOf(\r\n shape({\r\n square: string,\r\n value: number\r\n })\r\n ),\r\n placedRelatives: arrayOf(string),\r\n selectedPerson: occupant.type\r\n }),\r\n defaults: {\r\n gameSettings: {\r\n autoPlayDisabled: false,\r\n prePopulate: false,\r\n startPhase: 0,\r\n noEruption: false,\r\n showStrategyValues: false\r\n },\r\n recommendations: [],\r\n placedRelatives: [],\r\n selectedPerson: null\r\n }\r\n};\r\n\r\n/*\r\n MESSAGE TYPES\r\n -------------*/\r\n\r\n/**\r\n * @const messageState\r\n * @description Types for messageState Redux store\r\n */\r\nexport const messageState = {\r\n types: shape({\r\n stage: number,\r\n instruction: shape({\r\n text: string,\r\n color: string\r\n })\r\n }),\r\n defaults: {\r\n stage: 0,\r\n instruction: {\r\n text: \"\",\r\n color: \"\"\r\n }\r\n }\r\n};\r\n\r\n/*\r\n PLAYER TYPES\r\n ------------*/\r\n\r\n/**\r\n * @const playerDetails\r\n * @description Types for playerDetails Redux store\r\n */\r\nexport const playerDetails = {\r\n types: shape({\r\n player1: shape({\r\n name: string,\r\n hand: arrayOf(string),\r\n color: string,\r\n casualties: arrayOf(object),\r\n population: arrayOf(object),\r\n saved: arrayOf(object),\r\n totalPieces: number,\r\n ai: bool\r\n })\r\n }),\r\n defaults: {\r\n player1: {\r\n name: \"\",\r\n hand: [],\r\n color: \"#FFFFFF\",\r\n casualties: [],\r\n population: [],\r\n saved: [],\r\n totalPieces: 0,\r\n ai: false\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * @const playersState\r\n * @description Types for playersState Redux store\r\n */\r\nexport const playersState = {\r\n types: shape({\r\n players: arrayOf(string),\r\n details: playerDetails.types,\r\n activePlayer: string,\r\n turn: number,\r\n totalTurns: number\r\n }),\r\n defaults: {\r\n players: [\"\"],\r\n details: playerDetails.defaults,\r\n activePlayer: \"\",\r\n turn: 0,\r\n totalTurns: 0\r\n }\r\n};\r\n\r\n/*\r\n SNACKBAR TYPES\r\n --------------*/\r\n\r\n/**\r\n * @const snackbarState\r\n * @description Types for snackbarState Redux store\r\n */\r\nexport const snackbarState = {\r\n types: shape({\r\n message: string,\r\n type: oneOf([\"info\", \"warning\", \"default\", \"error\", \"success\"])\r\n }),\r\n defaults: {\r\n message: null,\r\n type: \"info\"\r\n }\r\n};\r\n\r\n/*\r\n TILE TYPES\r\n ----------*/\r\n\r\n/**\r\n * @const tiles\r\n * @description Types for tiles Redux store\r\n */\r\nexport const tiles = {\r\n types: shape({\r\n key: object\r\n }),\r\n defaults: {\r\n key: {}\r\n }\r\n};\r\n\r\n/**\r\n * @const pile\r\n * @description Types for pile Redux store\r\n */\r\nexport const pile = {\r\n types: arrayOf(string),\r\n defaults: []\r\n};\r\n\r\n/**\r\n * @const tileState\r\n * @description Types for tileState Redux store\r\n */\r\nexport const tileState = {\r\n types: shape({\r\n tiles: tiles.types,\r\n pile: pile.types,\r\n lavaTile: string\r\n }),\r\n defaults: {\r\n tiles: tiles.defaults,\r\n pile: pile.defaults,\r\n lavaTile: \"\"\r\n }\r\n};\r\n","/** @module CardsReducer */\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\n\r\n/**\r\n * @constant cardsState\r\n * @param {Object} state - cards state object\r\n * @param {Object} action\r\n */\r\nconst cardsState = (state = types.cardsState.defaults, action) => {\r\n const { type, payload } = action;\r\n switch (type) {\r\n case actions.ADD_CARDS:\r\n return {\r\n ...state,\r\n cards: payload\r\n };\r\n case actions.ADD_DECK:\r\n return {\r\n ...state,\r\n deck: payload\r\n };\r\n case actions.TAKE_CARD:\r\n return {\r\n ...state,\r\n deck: state.deck.slice(0, -1)\r\n };\r\n case actions.DISCARD_CARD:\r\n return {\r\n ...state,\r\n discard: [...state.discard, payload]\r\n };\r\n case actions.SET_CARD_GRID:\r\n return {\r\n ...state,\r\n grid: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default cardsState;\r\n","/** @module FlagsReducer */\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\nimport flagsList from \"../../data/flags\";\r\n\r\n/**\r\n * @constant defaultFlags\r\n * @description Takes flagsList array of Objects, filters out those that\r\n * do are not true by default, and maps to array of names only\r\n */\r\nconst defaultFlags = flagsList.filter(t => t.defaultState).map(t => t.name);\r\n\r\n/**\r\n * @constant flagsState\r\n * @param {Object} state - flags state object\r\n * @param {Object} action\r\n */\r\nconst flagsState = (\r\n state = { ...types.flagsState.defaults, flags: defaultFlags },\r\n action\r\n) => {\r\n const { type, payload } = action;\r\n const { flags } = state;\r\n const newFlags = [...flags];\r\n const flagListIdx = flags.indexOf(payload);\r\n switch (type) {\r\n case actions.TOGGLE_FLAGS:\r\n if (flagListIdx === -1) {\r\n newFlags.push(payload);\r\n } else {\r\n newFlags.splice(flagListIdx, 1);\r\n }\r\n return {\r\n ...state,\r\n flags: newFlags\r\n };\r\n case actions.SET_RUN_COUNTER:\r\n return {\r\n ...state,\r\n runCount: payload\r\n };\r\n case actions.SET_RELATIVES_COUNTER:\r\n return {\r\n ...state,\r\n relativesCount: payload\r\n };\r\n case actions.SET_ERUPTION_COUNTER:\r\n return {\r\n ...state,\r\n eruptionCount: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default flagsState;\r\n","/** @module flags */\r\n\r\n/**\r\n * @constant flagsList\r\n * @description Array of objects listing flags used throughout app, their\r\n * descriptions, and default states\r\n */\r\nconst flagsList = [\r\n {\r\n name: \"placing-person\",\r\n description: \"In process of person placement\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"card-wild\",\r\n description: \"If no location per card, are we placing anywhere\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"card-omen\",\r\n description: \"Has omen card been drawn\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"card-ad79\",\r\n description: \"Has AD79 card been drawn\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"lava-tile\",\r\n description: \"Placing lava tile\", // ?\r\n defaultState: false\r\n },\r\n {\r\n name: \"wild-lava-tile\",\r\n description: \"Wild lava tile drawn\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"placing-lava-tile\",\r\n description: \"Placing Lava tile\", // ?\r\n defaultState: false\r\n },\r\n {\r\n name: \"no-place-to-place\",\r\n description: \"Placing Lava tile\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"game-over\",\r\n description: \"Game Over!\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"game-stats\",\r\n description: \"Game Statistics\",\r\n defaultState: false\r\n },\r\n {\r\n name: \"game-start\",\r\n description: \"Start of Game Modal\",\r\n defaultState: true\r\n },\r\n {\r\n name: \"rules-modal\",\r\n description: \"Rules Modal\",\r\n defaultState: false\r\n }\r\n];\r\n\r\nexport default flagsList;\r\n","/** @module GamePlayReducer */\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\n\r\n/**\r\n * @constant gamePlayState\r\n * @param {Object} state - cards state object\r\n * @param {Object} action\r\n */\r\nconst gamePlayState = (state = types.gamePlayState.defaults, action) => {\r\n const { type, payload } = action;\r\n switch (type) {\r\n case actions.ADD_RECOMMENDATIONS:\r\n return {\r\n ...state,\r\n recommendations: payload\r\n };\r\n case actions.SET_PLACED_RELATIVES:\r\n return {\r\n ...state,\r\n placedRelatives: payload\r\n };\r\n case actions.SAVE_GAME_SETTINGS:\r\n return {\r\n ...state,\r\n gameSettings: payload\r\n };\r\n case actions.SELECT_PERSON:\r\n return {\r\n ...state,\r\n selectedPerson: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default gamePlayState;\r\n","/** @module GridReducer */\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\n\r\n/**\r\n * @constant gridState\r\n * @param {Object} state - cards state object\r\n * @param {Object} action\r\n */\r\nconst gridState = (state = types.gridState.defaults, action) => {\r\n const { type, payload } = action;\r\n let newGrid = {};\r\n switch (type) {\r\n case actions.ADD_GRID:\r\n return {\r\n ...state,\r\n grid: payload\r\n };\r\n case actions.PLACE_PEOPLE:\r\n newGrid = { ...state.grid[payload.squareId] };\r\n newGrid.occupants = payload.occupants;\r\n return {\r\n ...state,\r\n grid: {\r\n ...state.grid,\r\n [payload.squareId]: newGrid\r\n }\r\n };\r\n case actions.PLACE_LAVA:\r\n newGrid = { ...state.grid[payload.squareId] };\r\n newGrid.lava = payload.tile;\r\n return {\r\n ...state,\r\n grid: {\r\n ...state.grid,\r\n [payload.squareId]: newGrid\r\n }\r\n };\r\n case actions.UPDATE_DISTANCE_TO_EXIT:\r\n newGrid = { ...state.grid[payload.squareId] };\r\n newGrid.distanceToExit = payload.distance;\r\n return {\r\n ...state,\r\n grid: {\r\n ...state.grid,\r\n [payload.squareId]: newGrid\r\n }\r\n };\r\n case actions.SET_DANGER_ZONE:\r\n return {\r\n ...state,\r\n dangerZone: payload\r\n };\r\n case actions.SET_RUN_ZONE:\r\n return {\r\n ...state,\r\n runZone: payload\r\n };\r\n case actions.SET_RUN_FROM_SQUARE:\r\n return {\r\n ...state,\r\n runFromSquare: payload\r\n };\r\n case actions.SET_RUNNER:\r\n return {\r\n ...state,\r\n runner: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default gridState;\r\n","/** @module MessageReducer */\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\n\r\n/**\r\n * @constant messageState\r\n * @param {Object} state - message state object\r\n * @param {Object} action\r\n */\r\nconst messageState = (state = types.messageState.defaults, action) => {\r\n const { type, payload } = action;\r\n switch (type) {\r\n case actions.SET_STAGE:\r\n return {\r\n ...state,\r\n stage: payload\r\n };\r\n case actions.UPDATE_INSTRUCTIONS:\r\n return {\r\n ...state,\r\n instruction: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default messageState;\r\n","/** @module PlayersReducer */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\nimport { compareCards } from \"../../utils/utilsCommon\";\r\n\r\n/**\r\n * @constant playersState\r\n * @param {Object} state - players state object\r\n * @param {Object} action\r\n */\r\nconst playersState = (state = types.playersState.defaults, action) => {\r\n const { type, payload } = action;\r\n let totalTurns;\r\n let populationArray = [];\r\n let casualtiesArray = [];\r\n let savedArray = [];\r\n const totalPieces = _.get(\r\n state,\r\n `details.${_.get(payload, \"playerId\", \"null\")}.totalPieces`,\r\n 0\r\n );\r\n let idx;\r\n let playerId;\r\n let transitionObj;\r\n switch (type) {\r\n case actions.SET_PLAYERS_ARRAY:\r\n return {\r\n ...state,\r\n players: payload\r\n };\r\n case actions.ADD_PLAYERS:\r\n return {\r\n ...state,\r\n details: payload\r\n };\r\n case actions.ADD_PLAYER:\r\n return {\r\n ...state,\r\n details: {\r\n ...state.details,\r\n [payload.playerId]: payload.details\r\n }\r\n };\r\n case actions.UPDATE_PLAYER_HAND:\r\n return {\r\n ...state,\r\n details: {\r\n ...state.details,\r\n [payload.playerId]: {\r\n ...state.details[payload.playerId],\r\n hand: payload.hand.sort(compareCards)\r\n }\r\n }\r\n };\r\n case actions.INCREMENT_PLAYER_POPULATION:\r\n populationArray = _.get(\r\n state,\r\n `details.${payload.playerId}.population`,\r\n []\r\n );\r\n populationArray.push(payload.personObj);\r\n return {\r\n ...state,\r\n details: {\r\n ...state.details,\r\n [payload.playerId]: {\r\n ...state.details[payload.playerId],\r\n population: populationArray,\r\n totalPieces: totalPieces + 1\r\n }\r\n }\r\n };\r\n case actions.INCREMENT_PLAYER_CASUALTIES:\r\n playerId = payload.player;\r\n if (playerId) {\r\n populationArray = _.get(state, `details.${playerId}.population`, []);\r\n casualtiesArray = _.get(state, `details.${playerId}.casualties`, []);\r\n idx = populationArray.map(p => p.id).indexOf(payload.id);\r\n transitionObj = populationArray.splice(idx, 1);\r\n casualtiesArray.push(transitionObj[0]);\r\n return {\r\n ...state,\r\n details: {\r\n ...state.details,\r\n [playerId]: {\r\n ...state.details[playerId],\r\n casualties: casualtiesArray,\r\n population: populationArray\r\n }\r\n }\r\n };\r\n }\r\n return { ...state };\r\n case actions.INCREMENT_PLAYER_SAVED:\r\n playerId = payload.player;\r\n if (playerId) {\r\n populationArray = _.get(state, `details.${playerId}.population`, []);\r\n savedArray = _.get(state, `details.${playerId}.saved`, []);\r\n idx = populationArray.map(p => p.id).indexOf(payload.id);\r\n transitionObj = populationArray.splice(idx, 1);\r\n savedArray.push(transitionObj[0]);\r\n return {\r\n ...state,\r\n details: {\r\n ...state.details,\r\n [playerId]: {\r\n ...state.details[playerId],\r\n saved: savedArray,\r\n population: populationArray\r\n }\r\n }\r\n };\r\n }\r\n return { ...state };\r\n\r\n case actions.SET_PLAYER_TURN:\r\n totalTurns = state.totalTurns + 1;\r\n return {\r\n ...state,\r\n turn: payload,\r\n totalTurns\r\n };\r\n case actions.SET_ACTIVE_PLAYER:\r\n return {\r\n ...state,\r\n activePlayer: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default playersState;\r\n","/**\r\n * @module SnackbarReducer\r\n * @description Reducer for Snackbar message data\r\n */\r\n\r\nimport { ADD_SNACKBAR } from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\n\r\n/**\r\n * @constant snackbarState\r\n * @param {Object} state - message Object\r\n * @param {Object} action\r\n */\r\nconst snackbarState = (state = types.snackbarState.defaults, action) => {\r\n const { type, payload } = action;\r\n switch (type) {\r\n case ADD_SNACKBAR:\r\n return {\r\n ...state,\r\n message: payload.message,\r\n type: payload.type\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default snackbarState;\r\n","/** @module TilesReducer */\r\n\r\nimport * as actions from \"../ActionTypes\";\r\nimport * as types from \"../../types/types\";\r\n\r\n/**\r\n * @constant tileState\r\n * @param {Object} state - cards state object\r\n * @param {Object} action\r\n */\r\nconst tileState = (state = types.tileState.defaults, action) => {\r\n const { type, payload } = action;\r\n const newPile = [...state.pile];\r\n switch (type) {\r\n case actions.ADD_TILES:\r\n return {\r\n ...state,\r\n tiles: payload\r\n };\r\n case actions.ADD_TILE_PILE:\r\n return {\r\n ...state,\r\n pile: payload\r\n };\r\n case actions.TAKE_TILE:\r\n newPile.pop();\r\n return {\r\n ...state,\r\n pile: newPile\r\n };\r\n case actions.SET_LAVA_TILE:\r\n return {\r\n ...state,\r\n lavaTile: payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default tileState;\r\n","/** @module configureStore */\r\n\r\nimport { createStore, applyMiddleware, combineReducers } from \"redux\";\r\nimport thunk from \"redux-thunk\";\r\nimport { createLogger } from \"redux-logger\";\r\n\r\nimport cardsState from \"./Reducers/CardsReducer\";\r\nimport flagsState from \"./Reducers/FlagsReducer\";\r\nimport gamePlayState from \"./Reducers/GamePlayReducer\";\r\nimport gridState from \"./Reducers/GridReducer\";\r\nimport messageState from \"./Reducers/MessageReducer\";\r\nimport playersState from \"./Reducers/PlayersReducer\";\r\nimport snackbarState from \"./Reducers/SnackbarReducer\";\r\nimport tileState from \"./Reducers/TilesReducer\";\r\n\r\nconst logger = createLogger({ collapsed: true, diff: true });\r\n\r\nconst ConfigureStore = () => {\r\n const storeTemplate = createStore(\r\n combineReducers({\r\n cardsState,\r\n flagsState,\r\n gamePlayState,\r\n gridState,\r\n messageState,\r\n playersState,\r\n snackbarState,\r\n tileState\r\n }),\r\n /* eslint-disable no-underscore-dangle */\r\n window.__REDUX_DEVTOOLS_EXTENSION__ &&\r\n window.__REDUX_DEVTOOLS_EXTENSION__(),\r\n /* eslint-enable no-underscore-dangle */\r\n applyMiddleware(thunk, logger)\r\n );\r\n return storeTemplate;\r\n};\r\n\r\nconst store = ConfigureStore();\r\n\r\nexport default store;\r\n","/** @module helperFunctions */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport store from \"../../redux/configureStore\";\r\nimport actions from \"../../redux/Actions\";\r\n\r\nimport { aiPlayers } from \"../../data/playerData\";\r\n\r\nimport {\r\n voidLavaSquares,\r\n voidRunSquares,\r\n gateSquares\r\n} from \"../../data/gridData\";\r\n\r\n/**\r\n * @function vacancy\r\n * @description checks for vacancy within a square\r\n * @param {String} square\r\n * @return {Boolean}\r\n */\r\nexport const vacancy = square => {\r\n const { gridState } = store.getState();\r\n if (\r\n _.get(gridState, `grid.${square}.occupants.length`, 0) <\r\n _.get(gridState, `grid.${square}.buildingCapacity`, 0)\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * @function surroundByLavaDFS\r\n * @description DFS helper function to check for surrounded by lava\r\n * @param {Array} grid\r\n * @param {Number} x\r\n * @param {Number} y\r\n */\r\nconst surroundByLavaDFS = (grid, x, y, distance) => {\r\n const thisGrid = [...grid];\r\n if (x > thisGrid.length - 1 || x < 0 || y > thisGrid[0].length || y < 0)\r\n return;\r\n\r\n if (\r\n parseFloat(thisGrid[x][y]) === 0 ||\r\n parseFloat(thisGrid[x][y]) > distance\r\n ) {\r\n thisGrid[x][y] = distance;\r\n }\r\n\r\n if (x > 0 && (thisGrid[x - 1][y] === 0 || thisGrid[x - 1][y] > distance)) {\r\n surroundByLavaDFS(thisGrid, x - 1, y, distance + 1);\r\n }\r\n\r\n if (\r\n x < thisGrid.length - 1 &&\r\n (thisGrid[x + 1][y] === 0 || thisGrid[x + 1][y] > distance)\r\n ) {\r\n surroundByLavaDFS(thisGrid, x + 1, y, distance + 1);\r\n }\r\n\r\n if (y > 0 && (thisGrid[x][y - 1] === 0 || thisGrid[x][y - 1] > distance)) {\r\n surroundByLavaDFS(thisGrid, x, y - 1, distance + 1);\r\n }\r\n\r\n if (\r\n x < thisGrid[0].length - 1 &&\r\n (thisGrid[x][y + 1] === 0 || thisGrid[x][y + 1] > distance)\r\n ) {\r\n surroundByLavaDFS(thisGrid, x, y + 1, distance + 1);\r\n }\r\n};\r\n\r\n/**\r\n * @function checkForSurroundedTiles\r\n * @description DFS-based check for tiles surrounded by lava\r\n * @param {String} tile most recently placed tile location\r\n * @returns {Array} array of surrounded tiles\r\n */\r\nexport const checkForSurroundedTiles = tile => {\r\n console.log(\"checkForSurroundedTiles\");\r\n const { gridState } = store.getState();\r\n const surroundedTiles = [];\r\n const tempGrid = [];\r\n for (let x = 0; x < 7; x += 1) {\r\n const row = [];\r\n for (let y = 0; y < 11; y += 1) {\r\n let gridValue = _.get(gridState, `grid.${x}_${y}.lava`) ? \"L\" : 0;\r\n if (tile === `${x}_${y}`) gridValue = \"L\";\r\n if (voidLavaSquares.includes(`${x}_${y}`)) {\r\n gridValue = \"W\";\r\n }\r\n if (gridValue === 0 && gateSquares.includes(`${x}_${y}`)) {\r\n gridValue = \"X\";\r\n }\r\n row.push(gridValue);\r\n }\r\n tempGrid.push(row);\r\n }\r\n\r\n const rows = tempGrid.length;\r\n const columns = tempGrid[0].length;\r\n\r\n gateSquares.forEach(square => {\r\n const coords = square.split(\"_\");\r\n const x = parseFloat(coords[0]);\r\n const y = parseFloat(coords[1]);\r\n\r\n if (tempGrid[x][y] === \"X\") surroundByLavaDFS(tempGrid, x, y, 1);\r\n });\r\n\r\n for (let x = 0; x < rows; x += 1) {\r\n for (let y = 0; y < columns; y += 1) {\r\n if (tempGrid[x][y] === 0) {\r\n tempGrid[x][y] = \"L\";\r\n surroundedTiles.push(`${x}_${y}`);\r\n } else if (\r\n typeof tempGrid[x][y] === \"number\" &&\r\n _.get(gridState, `grid.${x}_${y}.distanceToExit`) &&\r\n parseFloat(tempGrid[x][y]) !==\r\n _.get(gridState, `grid.${x}_${y}.distanceToExit`)\r\n ) {\r\n store.dispatch(\r\n actions.updateDistanceToExitInStore(`${x}_${y}`, tempGrid[x][y])\r\n );\r\n console.log(\"update grid\", x, y, \"distance to:\", tempGrid[x][y]);\r\n }\r\n }\r\n }\r\n return surroundedTiles;\r\n};\r\n\r\nlet grid = [];\r\n\r\n/**\r\n * @function runToDFS\r\n * @description recursive DFS helper function to determine run zone\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} distance\r\n */\r\nexport const runToDFS = (x, y, distance) => {\r\n const { gridState } = store.getState();\r\n const square = `${x}_${y}`;\r\n if (\r\n distance > 0 &&\r\n x > -2 &&\r\n x < 8 &&\r\n y > -2 &&\r\n y < 12 &&\r\n !_.get(gridState, `grid.${square}.lava`) &&\r\n !_.get(gridState, `grid.${square}.ventName`) &&\r\n !voidRunSquares.includes(`${square}`)\r\n ) {\r\n grid.push(square);\r\n runToDFS(x - 1, y, distance - 1);\r\n runToDFS(x + 1, y, distance - 1);\r\n runToDFS(x, y - 1, distance - 1);\r\n runToDFS(x, y + 1, distance - 1);\r\n }\r\n};\r\n\r\n/**\r\n * @function calculateRunZones\r\n * @description using DFS to determine true run zones\r\n * @param {String} square\r\n * @param {Number*} population\r\n * @returns {Array}\r\n */\r\nexport const calculateRunZones = (square, population) => {\r\n console.log(\"calculateRunZones\");\r\n const coord = square.split(\"_\");\r\n const coord0 = parseFloat(coord[0]);\r\n const coord1 = parseFloat(coord[1]);\r\n\r\n runToDFS(coord0, coord1, population);\r\n\r\n const newGrid = [...grid];\r\n grid = [];\r\n return _.uniqBy(newGrid);\r\n};\r\n\r\n/**\r\n * @function squareHotness\r\n * @description return number of unique lava tile types surrounding square\r\n * @param {Object} gridState\r\n * @param {String} square\r\n */\r\nexport const squareHotness = square => {\r\n const { gridState } = store.getState();\r\n const coord = square.split(\"_\");\r\n const coord0 = parseFloat(coord[0]);\r\n const coord1 = parseFloat(coord[1]);\r\n const discoveredLavas = [];\r\n const lavas = [\r\n _.get(gridState, `grid.${coord0 - 1}_${coord1}.lava`),\r\n _.get(gridState, `grid.${coord0 + 1}_${coord1}.lava`),\r\n _.get(gridState, `grid.${coord0}_${coord1 - 1}.lava`),\r\n _.get(gridState, `grid.${coord0}_${coord1 + 1}.lava`)\r\n ];\r\n for (let i = 0; i < 4; i += 1) {\r\n if (lavas[i] && !discoveredLavas.includes(lavas[i])) {\r\n discoveredLavas.push(lavas[i]);\r\n }\r\n }\r\n return discoveredLavas.length;\r\n};\r\n\r\n/**\r\n * @function runnerRecommendations\r\n * @description set recommendationsArray for running (initial run for your lives and after placement but with\r\n * run counters left over)\r\n * @returns {Array}\r\n */\r\nexport const runnerRecommendations = () => {\r\n const {\r\n gridState,\r\n playersState: { activePlayer, details, totalTurns }\r\n } = store.getState();\r\n const aiPlayer = aiPlayers[_.get(details, `${activePlayer}.name`)];\r\n const recommendations = [];\r\n Object.keys(gridState.grid).forEach(square => {\r\n const gridSquare = _.get(gridState, `grid.${square}`);\r\n const occupants = _.get(gridSquare, \"occupants\", []);\r\n const myOccupants = occupants.filter(\r\n occupant => occupant.player === activePlayer\r\n );\r\n const diversity = _.uniqBy(occupants.map(occupant => occupant.player));\r\n if (myOccupants.length > 0) {\r\n // in diverse group -\r\n let value = 2 + myOccupants.length - diversity.length;\r\n // next to lava +\r\n value += squareHotness(square) * aiPlayer.cautious;\r\n // close to exit\r\n value += 1 - gridSquare.distanceToExit * 0.2;\r\n // already moved this turn\r\n if (myOccupants.length === 1 && myOccupants[0].lastMoved === totalTurns) {\r\n value = -2;\r\n }\r\n\r\n recommendations.push({\r\n square,\r\n value\r\n });\r\n }\r\n });\r\n return recommendations;\r\n};\r\n\r\n/**\r\n * @function runToRecommendations\r\n * @description determine recommendation for run to square\r\n * @param {Array} targetZones\r\n * @param {String} startSquare\r\n * @param {String} activePlayer\r\n * @returns {Array}\r\n */\r\nexport const runToRecommendations = (targetZones, startSquare) => {\r\n const { gridState, playersState } = store.getState();\r\n const aiPlayer =\r\n aiPlayers[_.get(playersState, `details.${playersState.activePlayer}.name`)];\r\n const recommendations = [];\r\n targetZones.forEach(square => {\r\n if (square !== startSquare) {\r\n let value = 1;\r\n const gridSquare = _.get(gridState, `grid.${square}`);\r\n const occupants = _.get(gridSquare, \"occupants\", []);\r\n const diversity = _.uniqBy(occupants.map(occupant => occupant.player));\r\n // closest to exit\r\n value += 5 - _.get(gridSquare, \"distanceToExit\", 0);\r\n // most diverse group\r\n value += (occupants.length + diversity.length) * 0.1;\r\n // dangerous square\r\n value -= squareHotness(square) * 0.5 * aiPlayer.cautious;\r\n\r\n recommendations.push({\r\n square,\r\n value\r\n });\r\n }\r\n });\r\n\r\n return recommendations;\r\n};\r\n\r\n/**\r\n * @function AIDetermineCardToPlay\r\n * @description determine which card an AI player should play based on recommendations\r\n * @returns {String} card\r\n */\r\nexport const AIDetermineCardToPlay = () => {\r\n const {\r\n cardsState: { cards },\r\n gamePlayState,\r\n playersState\r\n } = store.getState();\r\n const playSquare = _.get(gamePlayState, \"recommendations[0].square\");\r\n const playerHand = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.hand`\r\n );\r\n let playThisCard = \"\";\r\n playerHand.forEach(card => {\r\n if (cards[card].grid.includes(playSquare)) {\r\n playThisCard = card;\r\n }\r\n });\r\n return playThisCard;\r\n};\r\n","/** @module runnerLogic */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport store from \"../../redux/configureStore\";\r\nimport actions from \"../../redux/Actions\";\r\n\r\nimport * as constant from \"../../data/constants\";\r\nimport * as utils from \"../../utils/utilsCommon\";\r\nimport * as helper from \"./helperFunctions\";\r\nimport { escapeSquares } from \"../../data/gridData\";\r\n// eslint-disable-next-line import/no-cycle\r\nimport * as lavaLogic from \"./lavaLogic\";\r\n\r\n/**\r\n * @function runToSquare\r\n * @description handle person running from one square to another\r\n * @param {String} toSquare\r\n */\r\nexport const runToSquare = toSquare => {\r\n const storeState = store.getState();\r\n const { flagsState, gamePlayState, gridState, playersState } = storeState;\r\n\r\n store.dispatch(actions.addRecommendations([]));\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n console.log(\"runToSquare; toSquare:\", toSquare);\r\n if (toSquare === gridState.runFromSquare) {\r\n store.dispatch(actions.selectPerson(null));\r\n store.dispatch(actions.setRunZone([]));\r\n return;\r\n }\r\n let numberOfRuns = toSquare ? flagsState.runCount : 0;\r\n\r\n if (numberOfRuns) {\r\n const oldSquareOccupants = _.get(\r\n gridState,\r\n `grid.${gridState.runFromSquare}.occupants`\r\n );\r\n const oldSquareIdx = oldSquareOccupants\r\n .map(occupant => occupant.id)\r\n .indexOf(_.get(gamePlayState, \"selectedPerson.id\"));\r\n oldSquareOccupants.splice(oldSquareIdx, 1);\r\n store.dispatch(\r\n actions.placePeopleInSquare(gridState.runFromSquare, oldSquareOccupants)\r\n );\r\n\r\n if (escapeSquares.includes(toSquare)) {\r\n store.dispatch(\r\n actions.incrementPlayerSaved(gamePlayState.selectedPerson)\r\n );\r\n if (playerDetails.population.length === 0) {\r\n numberOfRuns = 1;\r\n }\r\n } else {\r\n const newSquareOccupants = _.get(gridState, `grid.${toSquare}.occupants`);\r\n newSquareOccupants.push({\r\n ...gamePlayState.selectedPerson,\r\n lastMoved:\r\n oldSquareOccupants.length > 0 ? playersState.totalTurns : undefined\r\n });\r\n }\r\n\r\n numberOfRuns -= 1;\r\n }\r\n if (playerDetails.population.length < 1) {\r\n numberOfRuns = 0;\r\n }\r\n store.dispatch(actions.setRunCounter(numberOfRuns));\r\n store.dispatch(actions.setRunZone([]));\r\n store.dispatch(actions.setRunner());\r\n store.dispatch(actions.selectPerson(null));\r\n if (!numberOfRuns) {\r\n // let amIAI = false;\r\n if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !_.get(gamePlayState, \"gameSettings.autoPlayDisabled\")\r\n ) {\r\n // amIAI = true;\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) is auto-drawing a lava tile!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n lavaLogic.drawTile();\r\n }, 1000);\r\n }\r\n // const nextPlayer = (playersState.turn + 1) % playersState.players.length;\r\n\r\n console.log(\r\n `%c***If player AFTER ${playersState.activePlayer} is AI, should they auto-draw now?`,\r\n \"color: purple; font-weight: bold\"\r\n );\r\n store.dispatch(actions.incrementPlayerTurn());\r\n // if (\r\n // _.get(playersState, `details.${playersState.players[nextPlayer]}.ai`) &&\r\n // !_.get(gamePlayState, \"gameSettings.autoPlayDisabled\") &&\r\n // !amIAI\r\n // ) {\r\n // setTimeout(() => {\r\n // console.log(\r\n // `%c***AI (${playersState.players[nextPlayer]}) is auto-drawing a lava tile!`,\r\n // \"color: green; font-weight: bold\"\r\n // );\r\n // lavaLogic.drawTile();\r\n // }, 1000);\r\n // }\r\n } else if (playerDetails.ai) {\r\n setTimeout(() => {\r\n store.dispatch(\r\n actions.addRecommendations(\r\n utils.randAndArrangeRecommendations(helper.runnerRecommendations())\r\n )\r\n );\r\n const sortedRecommendations = utils.randAndArrangeRecommendations(\r\n helper.runnerRecommendations()\r\n );\r\n const selectedSquare = _.get(sortedRecommendations, \"[0].square\");\r\n if (selectedSquare) {\r\n const census = _.get(gridState, `grid.${selectedSquare}.occupants`);\r\n let selectedOccupant = \"\";\r\n census.forEach(occupant => {\r\n if (\r\n occupant.player === playersState.activePlayer &&\r\n !selectedOccupant\r\n ) {\r\n selectedOccupant = occupant;\r\n }\r\n });\r\n // eslint-disable-next-line no-use-before-define\r\n selectRunner(selectedOccupant, selectedSquare);\r\n }\r\n }, 100);\r\n }\r\n};\r\n\r\n/**\r\n * @function selectRunner\r\n * @description select person to run\r\n * @param {Object} person - person object\r\n * @param {String} square - square\r\n */\r\nexport const selectRunner = (person, square) => {\r\n console.log(\"selectRunner; person:\", person, \"square:\", square);\r\n const storeState = store.getState();\r\n const { gridState, playersState } = storeState;\r\n\r\n const personPlusSquare = {\r\n ...person,\r\n square\r\n };\r\n store.dispatch(actions.selectPerson(personPlusSquare));\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n store.dispatch(actions.setRunner(person));\r\n\r\n store.dispatch(actions.setRunFromSquare(square));\r\n if (person.player !== playersState.activePlayer) {\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: \"Not your person!\",\r\n type: \"info\"\r\n })\r\n );\r\n return;\r\n }\r\n if (\r\n person.lastMoved === playersState.totalTurns &&\r\n playerDetails.population.length !== 1\r\n ) {\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: \"Already ran this person this turn!\",\r\n type: \"info\"\r\n })\r\n );\r\n return;\r\n }\r\n\r\n const pop = _.get(gridState, `grid.${square}.occupants.length`);\r\n\r\n const targetZones = helper.calculateRunZones(square, pop + 1);\r\n\r\n store.dispatch(actions.setRunZone(targetZones));\r\n if (playerDetails.ai) {\r\n setTimeout(() => {\r\n const sortedRecommendations = utils.randAndArrangeRecommendations(\r\n helper.runToRecommendations(targetZones, square)\r\n );\r\n store.dispatch(actions.addRecommendations(sortedRecommendations));\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: `${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.name`\r\n )} ran a person from ${square} to ${sortedRecommendations[0].square}`,\r\n type: \"info\"\r\n })\r\n );\r\n runToSquare(sortedRecommendations[0].square);\r\n }, 750);\r\n }\r\n};\r\n\r\n/**\r\n * @function runForYourLives\r\n * @description player can now run two of their people\r\n */\r\nexport const runForYourLives = async () => {\r\n console.log(\"runForYourLives\");\r\n const storeState = store.getState();\r\n const {\r\n gridState,\r\n playersState\r\n // gamePlayState: { gameSettings: {autoPlayDisabled} }\r\n } = storeState;\r\n\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${playerDetails.name}: ${constant.RUN}`,\r\n color: playerDetails.color\r\n })\r\n );\r\n if (playerDetails.ai) {\r\n setTimeout(() => {\r\n const sortedRecommendations = utils.randAndArrangeRecommendations(\r\n helper.runnerRecommendations()\r\n );\r\n store.dispatch(actions.addRecommendations(sortedRecommendations));\r\n const startSquare = _.get(sortedRecommendations, \"[0].square\");\r\n if (startSquare) {\r\n const census = _.get(gridState, `grid.${startSquare}.occupants`);\r\n let selectedOccupant = \"\";\r\n census.forEach(occupant => {\r\n if (occupant.player === playersState.activePlayer) {\r\n selectedOccupant = occupant;\r\n }\r\n });\r\n selectRunner(selectedOccupant, startSquare);\r\n }\r\n }, 750);\r\n }\r\n};\r\n","/** @module lavaLogic */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport store from \"../../redux/configureStore\";\r\nimport actions from \"../../redux/Actions\";\r\nimport * as data from \"../../data/gridData\";\r\nimport * as utils from \"../../utils/utilsCommon\";\r\nimport * as helper from \"./helperFunctions\";\r\n// eslint-disable-next-line import/no-cycle\r\nimport * as runnerLogic from \"./runnerLogic\";\r\n\r\n/**\r\n * @function burnSurroundedTiles\r\n * @description if tiles are surrounded by lava, burn 'em all\r\n * @param {Array} tiles\r\n */\r\nexport const burnSurroundedTiles = tiles => {\r\n console.log(\"burnSurroundedTiled\");\r\n const storeState = store.getState();\r\n const { gridState } = storeState;\r\n\r\n tiles.forEach(tile => {\r\n store.dispatch(actions.placeLavaTileOnSquare(tile, \"Lava\"));\r\n\r\n _.get(gridState, `grid.${tile}.occupants`, []).forEach(person => {\r\n store.dispatch(actions.incrementPlayerCasualties(person.player, person));\r\n });\r\n store.dispatch(actions.placePeopleInSquare(tile, []));\r\n });\r\n};\r\n\r\n/**\r\n * @function placeLavaTile\r\n * @description placing tile in highlight area\r\n * @param {String} square\r\n */\r\nexport const placeLavaTile = square => {\r\n const storeState = store.getState();\r\n const {\r\n flagsState,\r\n gamePlayState: {\r\n gameSettings: { autoPlayDisabled }\r\n },\r\n gridState,\r\n playersState,\r\n tileState\r\n } = storeState;\r\n\r\n console.log(\"placeLavaTile:\", tileState.lavaTile, square);\r\n store.dispatch(actions.placeLavaTileOnSquare(square, tileState.lavaTile));\r\n\r\n _.get(gridState, `grid.${square}.occupants`, []).forEach(person => {\r\n store.dispatch(actions.incrementPlayerCasualties(person.player, person));\r\n });\r\n store.dispatch(actions.placePeopleInSquare(square, []));\r\n\r\n if (flagsState.flags.includes(\"placing-lava-tile\")) {\r\n store.dispatch(actions.toggleFlags(\"placing-lava-tile\"));\r\n }\r\n store.dispatch(actions.setLavaTile());\r\n store.dispatch(actions.setDangerZone([]));\r\n store.dispatch(actions.addRecommendations([]));\r\n\r\n // check for tiles surrounded by lava\r\n const tilesSurroundedByLava = helper.checkForSurroundedTiles(\r\n square,\r\n store.dispatch(actions.updateDistanceToExit)\r\n );\r\n if (tilesSurroundedByLava.length > 0) {\r\n burnSurroundedTiles(tilesSurroundedByLava);\r\n }\r\n\r\n if (flagsState.eruptionCount) {\r\n store.dispatch(actions.setEruptionCounter(flagsState.eruptionCount - 1));\r\n // let amIAI = false;\r\n if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !autoPlayDisabled\r\n ) {\r\n // amIAI = true;\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) is auto-drawing a lava tile! (${flagsState.eruptionCount})`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n // eslint-disable-next-line no-use-before-define\r\n drawTile();\r\n }, 1000);\r\n }\r\n // const nextPlayer = (playersState.turn + 1) % playersState.players.length;\r\n console.log(\r\n `%c***If player AFTER ${playersState.activePlayer} is AI, should they auto-draw now?`,\r\n \"color: purple; font-weight: bold\"\r\n );\r\n store.dispatch(actions.incrementPlayerTurn());\r\n // if (\r\n // _.get(playersState, `details.${playersState.players[nextPlayer]}.ai`) &&\r\n // !autoPlayDisabled &&\r\n // !amIAI\r\n // ) {\r\n // setTimeout(() => {\r\n // console.log(\r\n // `%c***AI (${playersState.players[nextPlayer]}) is auto-drawing a lava tile!`,\r\n // \"color: green; font-weight: bold\"\r\n // );\r\n // // eslint-disable-next-line no-use-before-define\r\n // drawTile();\r\n // }, 1000);\r\n // }\r\n } else if (\r\n _.get(playersState, `details.${playersState.activePlayer}.population`, [])\r\n .length < 1\r\n ) {\r\n if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !autoPlayDisabled\r\n ) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) is auto-drawing a lava tile! (no population)`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n // eslint-disable-next-line no-use-before-define\r\n drawTile();\r\n }, 1000);\r\n }\r\n // const nextPlayer = (playersState.turn + 1) % playersState.players.length;\r\n console.log(\r\n `%c***If player AFTER ${playersState.activePlayer} is AI, should they auto-draw now?`,\r\n \"color: purple; font-weight: bold\"\r\n );\r\n store.dispatch(actions.incrementPlayerTurn());\r\n // if (\r\n // _.get(playersState, `details.${playersState.players[nextPlayer]}.ai`) &&\r\n // !autoPlayDisabled\r\n // ) {\r\n // setTimeout(() => {\r\n // console.log(\r\n // `%c***AI (${playersState.players[nextPlayer]}) is auto-drawing a lava tile!`,\r\n // \"color: green; font-weight: bold\"\r\n // );\r\n // // eslint-disable-next-line no-use-before-define\r\n // drawTile();\r\n // }, 1000);\r\n // }\r\n } else {\r\n console.log(\r\n \"%cset run counter to 2 and continue\",\r\n \"color: fuschia;font-weight:bold;\"\r\n );\r\n store.dispatch(actions.setRunCounter(2));\r\n runnerLogic.runForYourLives();\r\n }\r\n};\r\n\r\n/**\r\n * @function highlightDangerZones\r\n * @description send list of available tiles to highlight component\r\n * @param {String} tile - picked lava tile\r\n */\r\nexport const highlightDangerZones = tile => {\r\n console.log(\"highlightDangerZones; tile:\", tile);\r\n const storeState = store.getState();\r\n const { flagsState, gridState, playersState } = storeState;\r\n\r\n store.dispatch(actions.setLavaTile(tile));\r\n\r\n if (flagsState.flags.includes(\"placing-lava-tile\")) {\r\n store.dispatch(actions.toggleFlags(\"placing-lava-tile\"));\r\n }\r\n if (flagsState.flags.includes(\"lava-tile\")) {\r\n store.dispatch(actions.toggleFlags(\"lava-tile\"));\r\n }\r\n\r\n const hotZones = [];\r\n let homeVent = \"\";\r\n let recommendations = [];\r\n const gridKeys = Object.keys(gridState.grid);\r\n gridKeys.forEach(key => {\r\n if (_.get(gridState, `grid.${key}.lava`) === tile) {\r\n hotZones.push(key);\r\n }\r\n if (_.get(gridState, `grid.${key}.ventName`) === tile) {\r\n homeVent = key;\r\n }\r\n });\r\n\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n if (!hotZones.length) {\r\n if (playerDetails.ai) {\r\n store.dispatch(\r\n actions.addRecommendations([{ square: homeVent, value: 1 }])\r\n );\r\n recommendations = [{ square: homeVent, value: 1 }];\r\n placeLavaTile(recommendations[0].square);\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: `${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.name`\r\n )} places ${tile} lava at ${recommendations[0].square}`,\r\n type: \"info\"\r\n })\r\n );\r\n }\r\n store.dispatch(actions.setDangerZone([homeVent]));\r\n } else {\r\n const warmZones = [];\r\n hotZones.forEach(zone => {\r\n const coord = zone.split(\"_\");\r\n warmZones.push(\r\n `${Math.min(parseFloat(coord[0]) + 1, 6)}_${coord[1]}`,\r\n `${Math.max(parseFloat(coord[0]) - 1, 0)}_${coord[1]}`,\r\n `${coord[0]}_${Math.min(parseFloat(coord[1]) + 1, 10)}`,\r\n `${coord[0]}_${Math.max(parseFloat(coord[1]) - 1, 0)}`\r\n );\r\n });\r\n const filteredZones = _.uniqBy(\r\n warmZones.filter(zone => {\r\n return (\r\n !_.get(gridState, `grid.${zone}.lava`) &&\r\n !data.voidLavaSquares.includes(zone)\r\n );\r\n })\r\n );\r\n if (filteredZones.length) {\r\n if (playerDetails.ai) {\r\n // recommendations\r\n const evaluations = [];\r\n filteredZones.forEach(zone => {\r\n let value = 1 + _.get(gridState, `grid.${zone}.occupants.length`);\r\n if (\r\n _.get(gridState, `grid.${zone}.occupants`)\r\n .map(occupant => occupant.player)\r\n .includes(playersState.activePlayer)\r\n ) {\r\n value = -2;\r\n }\r\n\r\n evaluations.push({\r\n square: zone,\r\n value\r\n });\r\n });\r\n const sortedEvaluations = utils.randAndArrangeRecommendations(\r\n evaluations\r\n );\r\n recommendations = sortedEvaluations;\r\n store.dispatch(actions.addRecommendations(sortedEvaluations));\r\n }\r\n\r\n store.dispatch(actions.setDangerZone(filteredZones));\r\n if (playerDetails.ai) {\r\n placeLavaTile(recommendations[0].square);\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: `${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.name`\r\n )} places ${tile} lava at ${recommendations[0].square}`,\r\n type: \"info\"\r\n })\r\n );\r\n }\r\n } else if (!flagsState.flags.includes(\"no-place-to-place\")) {\r\n store.dispatch(actions.toggleFlags(\"no-place-to-place\"));\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * @function drawTile\r\n * @description drawing a tile during stage 3\r\n */\r\nexport const drawTile = human => {\r\n console.log(\"drawTile\", human ? \"by a human!\" : \"\");\r\n const storeState = store.getState();\r\n const {\r\n flagsState,\r\n // gridState: { grid },\r\n tileState,\r\n playersState\r\n } = storeState;\r\n\r\n console.log(\r\n \"DrawTile: ActivePlayer:\",\r\n playersState.activePlayer,\r\n playersState.details[playersState.activePlayer].ai\r\n );\r\n\r\n // let census = [];\r\n // Object.values(playersState.details).forEach(arr => {\r\n // census = [...census, ...arr.population];\r\n // });\r\n // if (!_.get(tileState, \"pile.length\") || census.length === 0) {\r\n // alert(\"Out of tiles or people; GAME OVER!\");\r\n // const gridArray = Object.keys(grid);\r\n // gridArray.forEach(square => {\r\n // if (_.get(grid, `${square}.occupants.length`) > 0) {\r\n // _.get(grid, `${square}.occupants`).forEach(person => {\r\n // store.dispatch(\r\n // actions.incrementPlayerCasualtiesInStore(person.player, 1)\r\n // );\r\n // });\r\n // }\r\n // if (!_.get(grid, `${square}.lava`)) {\r\n // store.dispatch(actions.placeLavaTileOnSquare(square, \"Lava\"));\r\n // }\r\n // store.dispatch(actions.placePeopleInSquare(square, []));\r\n // });\r\n // store.dispatch(actions.toggleFlags(\"game-over\"));\r\n // }\r\n\r\n if (!(!human && !playersState.details[playersState.activePlayer].ai)) {\r\n const tilePile = [...tileState.pile];\r\n if (!flagsState.flags.includes(\"placing-lava-tile\")) {\r\n store.dispatch(actions.toggleFlags(\"placing-lava-tile\"));\r\n }\r\n\r\n // draw tile\r\n const takenTile = tilePile.pop();\r\n store.dispatch(actions.setLavaTile(takenTile));\r\n\r\n store.dispatch(actions.takeTile());\r\n\r\n const wilds = _.get(tileState, `tiles.${takenTile}.wilds`);\r\n if (wilds) {\r\n store.dispatch(actions.toggleFlags(\"wild-lava-tile\"));\r\n } else {\r\n highlightDangerZones(takenTile);\r\n }\r\n if (!flagsState.flags.includes(\"lava-tile\")) {\r\n store.dispatch(actions.toggleFlags(\"lava-tile\"));\r\n }\r\n }\r\n};\r\n","/** @module placeRelativesLogic */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport store from \"../../redux/configureStore\";\r\nimport * as constant from \"../../data/constants\";\r\nimport { randAndArrangeRecommendations } from \"../../utils/utilsCommon\";\r\nimport actions from \"../../redux/Actions\";\r\n\r\n// eslint-disable-next-line import/no-cycle\r\nimport { placePerson } from \"./placePeopleLogic\";\r\n\r\n/**\r\n * @function placeRelatives\r\n * @description function when relatives is placed\r\n * @param {String} square - square where \"parent\" was placed\r\n */\r\nexport const placeRelatives = square => {\r\n console.log(\"placeRelatives; square:\", square);\r\n const storeState = store.getState();\r\n const {\r\n cardsState,\r\n flagsState,\r\n gamePlayState,\r\n gridState,\r\n playersState\r\n } = storeState;\r\n\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n // current other occupants\r\n const currentOccupants = _.get(gridState, `grid.${square}.occupants`, []);\r\n let thisPlacedRelatives = gamePlayState.placedRelatives;\r\n let orderedRecommendations = [];\r\n\r\n if (square) {\r\n const id = `P${playersState.players.indexOf(\r\n playersState.activePlayer\r\n )}-${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.totalPieces`,\r\n 0\r\n )}r`;\r\n // place relative in square\r\n const personObj = {\r\n id,\r\n player: playersState.activePlayer,\r\n gender: Math.round(Math.random()) ? \"male\" : \"female\"\r\n };\r\n console.log(\r\n `%c${playersState.activePlayer} placed person ${id} on square ${square}`,\r\n \"color: blue;font-weight:bold;\"\r\n );\r\n store.dispatch(\r\n actions.placePeopleInSquare(square, [...currentOccupants, personObj])\r\n );\r\n store.dispatch(\r\n actions.incrementPlayerPopulation(playersState.activePlayer, personObj)\r\n );\r\n thisPlacedRelatives = [...gamePlayState.placedRelatives, square];\r\n store.dispatch(actions.setPlacedRelatives(thisPlacedRelatives));\r\n if (playerDetails.ai) {\r\n const idx = gamePlayState.recommendations\r\n .map(rec => rec.square)\r\n .indexOf(square);\r\n gamePlayState.recommendations.splice(idx, 1);\r\n orderedRecommendations = randAndArrangeRecommendations(\r\n gamePlayState.recommendations\r\n );\r\n store.dispatch(actions.addRecommendations(orderedRecommendations));\r\n }\r\n store.dispatch(\r\n actions.setCardGrid([...cardsState.grid].filter(val => val !== square))\r\n );\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: `${playerDetails.name} places a relative at ${\r\n square.split(\"_\")[1]\r\n } x ${square.split(\"_\")[0]}`,\r\n type: \"info\"\r\n })\r\n );\r\n }\r\n\r\n // if enough relatives have been placed, end relative placement\r\n if (thisPlacedRelatives.length === flagsState.relativesCount || !square) {\r\n store.dispatch(actions.setRelativesCounter(0));\r\n store.dispatch(actions.setPlacedRelatives([]));\r\n store.dispatch(actions.addRecommendations([]));\r\n store.dispatch(actions.setCardGrid([]));\r\n if (flagsState.flags.includes(\"placing-person\")) {\r\n store.dispatch(actions.toggleFlags(\"placing-person\"));\r\n }\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.name`\r\n )}: ${constant.DRAW}`,\r\n color: _.get(playersState, `details.${playersState.activePlayer}.color`)\r\n })\r\n );\r\n } else if (playerDetails.ai) {\r\n // AI: Place another relative\r\n setTimeout(() => {\r\n placePerson(orderedRecommendations[0].square);\r\n }, 500);\r\n }\r\n};\r\n","/** @module placePeopleLogic */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport store from \"../../redux/configureStore\";\r\nimport * as data from \"../../data/gridData\";\r\nimport { aiPlayers } from \"../../data/playerData\";\r\nimport * as constant from \"../../data/constants\";\r\nimport { randAndArrangeRecommendations } from \"../../utils/utilsCommon\";\r\nimport actions from \"../../redux/Actions\";\r\n\r\n// eslint-disable-next-line import/no-cycle\r\nimport { placeRelatives } from \"./placeRelativesLogic\";\r\n// eslint-disable-next-line import/no-cycle\r\nimport { drawCard } from \"./cardLogic\";\r\n\r\n/**\r\n * @function placePerson\r\n * @description function when person is placed\r\n * @param {String} square\r\n */\r\nexport const placePerson = square => {\r\n console.log(\"placePerson; grid:\", square);\r\n const storeState = store.getState();\r\n const {\r\n cardsState,\r\n flagsState,\r\n gamePlayState: {\r\n gameSettings: { autoPlayDisabled }\r\n },\r\n gridState,\r\n messageState,\r\n playersState\r\n } = storeState;\r\n\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n\r\n // if number of relatives is set, place relative instead\r\n if (flagsState.relativesCount > 0) {\r\n placeRelatives(square);\r\n return;\r\n }\r\n\r\n // current other occupants\r\n const currentOccupants = _.get(gridState, `grid.${square}.occupants`, []);\r\n\r\n // place person in square\r\n const id = `P${playersState.players.indexOf(\r\n playersState.activePlayer\r\n )}-${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.totalPieces`,\r\n 0\r\n )}p`;\r\n const personObj = {\r\n id,\r\n player: playersState.activePlayer,\r\n gender: Math.round(Math.random()) ? \"male\" : \"female\"\r\n };\r\n store.dispatch(\r\n actions.placePeopleInSquare(square, [...currentOccupants, personObj])\r\n );\r\n store.dispatch(\r\n actions.incrementPlayerPopulation(playersState.activePlayer, personObj)\r\n );\r\n store.dispatch(\r\n actions.addSnackbar({\r\n message: `${playerDetails.name} places a person at ${\r\n square.split(\"_\")[1]\r\n } x ${square.split(\"_\")[0]}`,\r\n type: \"info\"\r\n })\r\n );\r\n store.dispatch(actions.addRecommendations([]));\r\n\r\n // if there should be relatives, set relative states\r\n if (\r\n messageState.stage === 1 &&\r\n currentOccupants.length > 0 &&\r\n flagsState.relativesCount === 0 &&\r\n !flagsState.flags.includes(\"card-wild\")\r\n ) {\r\n store.dispatch(actions.setRelativesCounter(currentOccupants.length));\r\n store.dispatch(actions.setPlacedRelativesToStore([]));\r\n const newGridArray = _.uniq([\r\n ...cardsState.grid,\r\n ...data.gridByColor.White,\r\n ...data.gridByColor[\r\n _.get(gridState, `grid.${square}.buildingName`, \"\").split(\" \")[0]\r\n ]\r\n ]).filter(val => val !== square);\r\n store.dispatch(actions.setCardGrid(newGridArray));\r\n\r\n if (playerDetails.ai) {\r\n // placement evaluation/recommendations:\r\n const aiPlayer =\r\n aiPlayers[\r\n _.get(playersState, `details.${playersState.activePlayer}.name`)\r\n ];\r\n const evaluations = [];\r\n let handCanPlaceHere = [];\r\n const playerHand = playerDetails.hand;\r\n playerHand.forEach(card => {\r\n handCanPlaceHere = [\r\n ...handCanPlaceHere,\r\n ..._.get(cardsState, `cards.${card}.grid`)\r\n ];\r\n });\r\n newGridArray.forEach(newGrid => {\r\n // criteria:\r\n // - if empty colored build matching card in hand (capacity - 1)\r\n const gridDetail = _.get(gridState, `grid.${newGrid}`);\r\n let value = 1;\r\n if (data.nextToVentSquares.includes(newGrid)) {\r\n value -= 0.5 * aiPlayer.cautious; // next to vent, reduce delta\r\n }\r\n value += (5 - gridDetail.distanceToExit) * 0.5; // distance to exit; modified by strategy\r\n const availableSpace =\r\n gridDetail.buildingCapacity - gridDetail.occupants.length;\r\n if (availableSpace > 0 && gridDetail.buildingName === \"White\") {\r\n value += 1 + gridDetail.occupants.length;\r\n value += _.uniqBy(\r\n gridDetail.occupants.map(occupant => occupant.player)\r\n ).length;\r\n }\r\n if (\r\n gridDetail.occupants.length === 0 &&\r\n handCanPlaceHere.includes(newGrid)\r\n ) {\r\n value *= 2;\r\n }\r\n if (availableSpace < 1) {\r\n value = -1;\r\n }\r\n evaluations.push({\r\n square: newGrid,\r\n value\r\n });\r\n });\r\n const orderedEvaluations = randAndArrangeRecommendations(evaluations);\r\n store.dispatch(actions.addRecommendations(orderedEvaluations));\r\n\r\n // AI: Place first relative\r\n setTimeout(() => {\r\n placePerson(orderedEvaluations[0].square);\r\n }, 500);\r\n }\r\n\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${playerDetails.name}: ${constant.RELATIVE}`,\r\n color: playerDetails.color\r\n })\r\n );\r\n\r\n if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !autoPlayDisabled\r\n ) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) auto-drawing!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n drawCard();\r\n }, 500);\r\n }\r\n } else {\r\n // else complete placement\r\n store.dispatch(actions.setCardGrid([]));\r\n if (flagsState.flags.includes(\"placing-person\")) {\r\n store.dispatch(actions.toggleFlags(\"placing-person\"));\r\n }\r\n if (flagsState.flags.includes(\"card-wild\")) {\r\n store.dispatch(actions.toggleFlags(\"card-wild\"));\r\n }\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${playerDetails.name}: ${constant.DRAW}`,\r\n color: playerDetails.color\r\n })\r\n );\r\n\r\n if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !autoPlayDisabled\r\n ) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) auto-drawing!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n drawCard();\r\n }, 500);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * @function performSacrifice\r\n * @description upon selection of person, sacrifice if not your own\r\n * @param {Object} personObj\r\n * @param {String} square\r\n * @param {Boolean} ai - is sacrifice performed by AI?\r\n */\r\nexport const performSacrifice = (personObj, square, ai) => {\r\n console.log(\"performSacrifice; personObj:\", personObj, \"square:\", square, ai);\r\n const storeState = store.getState();\r\n const {\r\n flagsState,\r\n // gamePlayState: {\r\n // gameSettings: { autoPlayDisabled }\r\n // },\r\n gridState,\r\n playersState\r\n } = storeState;\r\n\r\n if (\r\n !ai &&\r\n (!flagsState.flags.includes(\"card-omen\") ||\r\n personObj.player === playersState.activePlayer)\r\n ) {\r\n return;\r\n }\r\n const currentOccupants = _.get(gridState, `grid.${square}.occupants`, []);\r\n\r\n const idx = currentOccupants\r\n .map(person => person.player)\r\n .indexOf(personObj.player);\r\n const sacrified = currentOccupants.splice(idx, 1);\r\n\r\n store.dispatch(actions.placePeopleInSquare(square, currentOccupants));\r\n store.dispatch(\r\n actions.incrementPlayerCasualties(personObj.player, sacrified[0])\r\n );\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.name`\r\n )}: ${constant.DRAW}`,\r\n color: _.get(playersState, `details.${playersState.activePlayer}.color`)\r\n })\r\n );\r\n if (flagsState.flags.includes(\"card-omen\")) {\r\n store.dispatch(actions.toggleFlags(\"card-omen\"));\r\n }\r\n};\r\n","/** @module cardLogic */\r\n\r\nimport _ from \"lodash\";\r\n\r\nimport store from \"../../redux/configureStore\";\r\nimport actions from \"../../redux/Actions\";\r\nimport * as data from \"../../data/gridData\";\r\nimport { aiPlayers } from \"../../data/playerData\";\r\nimport * as constant from \"../../data/constants\";\r\nimport { randAndArrangeRecommendations } from \"../../utils/utilsCommon\";\r\nimport * as helper from \"./helperFunctions\";\r\nimport * as lavaLogic from \"./lavaLogic\";\r\n// eslint-disable-next-line import/no-cycle\r\nimport * as placePeopleLogic from \"./placePeopleLogic\";\r\n\r\n/**\r\n * @function playPompCard\r\n * @description when player plays pompeii card\r\n * @param {String} card\r\n */\r\nexport const playPompCard = card => {\r\n console.log(\"playPompCard; card:\", card);\r\n const storeState = store.getState();\r\n const { cardsState, gamePlayState, flagsState, playersState } = storeState;\r\n\r\n store.dispatch(actions.discardCard(card));\r\n const thisHand = [...playersState.details[playersState.activePlayer].hand];\r\n const cardIdx = thisHand.indexOf(card);\r\n thisHand.splice(cardIdx, 1);\r\n store.dispatch(actions.updatePlayerHand(playersState.activePlayer, thisHand));\r\n\r\n let gridHighlights = cardsState.cards[card].grid.filter(val =>\r\n helper.vacancy(val)\r\n );\r\n\r\n if (!gridHighlights.length) {\r\n gridHighlights = _.uniqBy([\r\n ...data.gridByColor.White,\r\n ...data.gridByColor.Grey,\r\n ...data.gridByColor.Purple,\r\n ...data.gridByColor.Turquoise,\r\n ...data.gridByColor.Brown\r\n ]).filter(val => helper.vacancy(val));\r\n if (!flagsState.flags.includes(\"card-wild\")) {\r\n store.dispatch(actions.toggleFlags(\"card-wild\"));\r\n }\r\n }\r\n\r\n if (!flagsState.flags.includes(\"placing-person\")) {\r\n store.dispatch(actions.toggleFlags(\"placing-person\"));\r\n }\r\n\r\n store.dispatch(actions.setCardGrid(gridHighlights));\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${_.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.name`\r\n )}: ${constant.PLACE}`,\r\n color: _.get(playersState, `details.${playersState.activePlayer}.color`)\r\n })\r\n );\r\n // AI: Place person\r\n if (playersState.details[playersState.activePlayer].ai) {\r\n setTimeout(() => {\r\n placePeopleLogic.placePerson(\r\n _.get(gamePlayState, \"recommendations[0].square\")\r\n );\r\n }, 1000);\r\n }\r\n};\r\n\r\n/**\r\n * @function chooseCardToPlay\r\n * @description based on player hand and AI strategy, set play recommendations\r\n */\r\nexport const chooseCardToPlay = () => {\r\n const storeState = store.getState();\r\n const {\r\n playersState,\r\n gridState,\r\n cardsState,\r\n messageState: { stage }\r\n } = storeState;\r\n\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.players[playersState.turn]}`\r\n );\r\n const gridArray = Object.keys(gridState.grid).map(item => {\r\n return {\r\n ...gridState.grid[item],\r\n id: item\r\n };\r\n });\r\n // check for AI player\r\n if (stage < 2 && playerDetails.ai) {\r\n const aiPlayer =\r\n aiPlayers[\r\n _.get(playersState, `details.${playersState.activePlayer}.name`)\r\n ];\r\n const activePlayerHand = playerDetails.hand;\r\n // START recommendations (ai's only)\r\n if (activePlayerHand.length === 4) {\r\n const targetSpaces = [];\r\n activePlayerHand.forEach(card => {\r\n targetSpaces.push(...cardsState.cards[card].grid);\r\n });\r\n const evaluations = {};\r\n // evaluate each square\r\n targetSpaces.forEach(target => {\r\n let delta;\r\n const fullBuilding = gridArray.filter(\r\n square => square.buildingName === gridState.grid[target].buildingName\r\n );\r\n let fullOccupancy = 0;\r\n // stage 1\r\n if (stage === 0) {\r\n delta = gridState.grid[target].buildingCapacity; // + building capacity\r\n fullBuilding.forEach(room => {\r\n fullOccupancy += room.occupants.length;\r\n });\r\n delta -= fullOccupancy * (2 + aiPlayer.social); // - full building occupancy (x3)\r\n if (data.nextToVentSquares.includes(target)) {\r\n delta -= 0.5 * aiPlayer.cautious; // next to vent, reduce delta;\r\n }\r\n delta +=\r\n (5 - _.get(gridState, `grid.${target}.distanceToExit`)) * 0.5; // distance to exit; modified by strategy\r\n\r\n if (evaluations[target]) {\r\n evaluations[target].value += delta + 1; // if multiple copies of card, compound delta\r\n } else {\r\n evaluations[target] = {\r\n value: delta\r\n };\r\n }\r\n }\r\n // stage 2\r\n if (stage === 1) {\r\n delta =\r\n gridState.grid[target].buildingCapacity -\r\n gridState.grid[target].occupants.length; // + building capacity - building occupancy\r\n if (delta) {\r\n delta +=\r\n gridState.grid[target].occupants.length * (2 + aiPlayer.social); // + building occupancy\r\n const diversity = _.uniqBy(\r\n _.get(gridState, `grid.${target}.occupants`, []).map(\r\n occ => occ.player\r\n )\r\n ).length; // diversity\r\n if (diversity > 0) {\r\n delta += (diversity - 1) * 0.5 * aiPlayer.social;\r\n }\r\n if (data.nextToVentSquares.includes(target)) {\r\n delta -= 0.5 * aiPlayer.cautious; // next to vent, reduce delta;\r\n }\r\n delta +=\r\n (5 - _.get(gridState, `grid.${target}.distanceToExit`)) *\r\n 0.5 *\r\n aiPlayer.cautious; // distance to exit; modified by strategy\r\n }\r\n if (evaluations[target]) {\r\n evaluations[target].value += delta + 1; // if multiple copies of card, compound delta\r\n } else {\r\n evaluations[target] = {\r\n value: delta\r\n };\r\n }\r\n }\r\n });\r\n const recommendations = Object.keys(evaluations).map(evals => {\r\n return {\r\n square: evals,\r\n value: evaluations[evals].value\r\n };\r\n });\r\n const updatedRecommendations = randAndArrangeRecommendations(\r\n recommendations\r\n );\r\n store.dispatch(actions.addRecommendations(updatedRecommendations));\r\n // AI: play card\r\n const playThisCard = helper.AIDetermineCardToPlay();\r\n if (playThisCard) {\r\n playPompCard(playThisCard);\r\n }\r\n }\r\n // END recommendations (ai's only)\r\n }\r\n};\r\n\r\n/**\r\n * @function resolveAd79\r\n * @description resolve AD 79 card when drawn\r\n */\r\nexport const resolveAd79 = () => {\r\n console.log(\"resolveAd79\");\r\n const storeState = store.getState();\r\n const {\r\n flagsState,\r\n gamePlayState: {\r\n gameSettings: { autoPlayDisabled }\r\n },\r\n messageState,\r\n playersState\r\n } = storeState;\r\n\r\n if (!flagsState.flags.includes(\"card-ad79\")) {\r\n store.dispatch(actions.toggleFlags(\"card-ad79\"));\r\n }\r\n setTimeout(() => {\r\n if (messageState.stage === 1) {\r\n const nextPlayer = (playersState.turn + 1) % playersState.players.length;\r\n store.dispatch(actions.incrementPlayerTurn());\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${_.get(\r\n playersState,\r\n `details.${playersState.players[nextPlayer]}.name`\r\n )}: ${constant.LAVA_TILE}`,\r\n color: _.get(\r\n playersState,\r\n `details.${playersState.players[nextPlayer]}.color`\r\n )\r\n })\r\n );\r\n if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !autoPlayDisabled\r\n ) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) clicking SECOND AD79!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n store.dispatch(actions.toggleFlags(\"card-ad79\"));\r\n lavaLogic.drawTile();\r\n }, 1000);\r\n } /* else if (\r\n _.get(\r\n playersState,\r\n `details.${playersState.players[nextPlayer]}.ai` && !autoPlayDisabled\r\n )\r\n ) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.players[nextPlayer]}) is auto-drawing a lava tile!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n lavaLogic.drawTile();\r\n }, 1000);\r\n } */ else {\r\n console.log(\r\n `%c***If player AFTER ${playersState.activePlayer} is AI, should they auto-draw now?`,\r\n \"color: purple; font-weight: bold\"\r\n );\r\n }\r\n } else if (\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) &&\r\n !autoPlayDisabled\r\n ) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}) clicking FIRST AD79!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n store.dispatch(actions.toggleFlags(\"card-ad79\"));\r\n // eslint-disable-next-line no-use-before-define\r\n drawCard();\r\n }, 1000);\r\n }\r\n }, 100);\r\n\r\n store.dispatch(actions.addRecommendations([]));\r\n store.dispatch(actions.incrementStage());\r\n};\r\n\r\n/**\r\n * @function resolveOmen\r\n * @description resolve Omen card when drawn - sacrifice another player's person\r\n */\r\nexport const resolveOmen = () => {\r\n console.log(\"resolveOmen\");\r\n const storeState = store.getState();\r\n const {\r\n gamePlayState: {\r\n gameSettings: { autoPlayDisabled }\r\n },\r\n gridState,\r\n flagsState,\r\n playersState\r\n } = storeState;\r\n\r\n const playerDetails = _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}`\r\n );\r\n store.dispatch(\r\n actions.updateInstructions({\r\n text: `${playerDetails.name}: ${constant.SACRIFICE}`,\r\n color: playerDetails.color\r\n })\r\n );\r\n\r\n // ai performing sacrifice\r\n if (playerDetails.ai) {\r\n setTimeout(() => {\r\n const playersArray = [];\r\n Object.keys(_.get(playersState, \"details\")).forEach(player => {\r\n playersArray.push({\r\n ...playersState.details[player],\r\n player\r\n });\r\n });\r\n const playersScores = playersArray\r\n .filter(player => player.player !== playersState.activePlayer)\r\n .sort((a, b) =>\r\n // TODO if chaotic, perhaps a 0-1 to this comparison\r\n a.population.length - a.casualties.length * 0.1 <\r\n b.population.length - b.casualties.length * 0.1\r\n ? 1\r\n : -1\r\n );\r\n const target = playersScores[0];\r\n const census = [];\r\n Object.keys(_.get(gridState, \"grid\")).forEach(square => {\r\n _.get(gridState, `grid.${square}.occupants`, []).forEach(occupant => {\r\n census.push({\r\n player: occupant.player,\r\n square,\r\n personObj: occupant\r\n });\r\n });\r\n });\r\n const targetList = census.filter(person => {\r\n return person.player === target.player;\r\n });\r\n if (targetList.length > 0) {\r\n const rand = Math.floor(Math.random() * targetList.length);\r\n placePeopleLogic.performSacrifice(\r\n targetList[rand].personObj,\r\n targetList[rand].square,\r\n true\r\n );\r\n }\r\n if (!autoPlayDisabled) {\r\n setTimeout(() => {\r\n console.log(\r\n `%c***AI (${playersState.activePlayer}), after murdering an innocent, is drawing a card!!!`,\r\n \"color: green; font-weight: bold\"\r\n );\r\n // eslint-disable-next-line no-use-before-define\r\n drawCard();\r\n }, 1000);\r\n }\r\n }, 1000);\r\n } else if (!flagsState.flags.includes(\"card-omen\")) {\r\n store.dispatch(actions.toggleFlags(\"card-omen\"));\r\n }\r\n};\r\n\r\n/**\r\n * @function drawCard\r\n * @description draw card from deck\r\n */\r\nexport const drawCard = () => {\r\n console.log(\"drawCard\");\r\n const storeState = store.getState();\r\n const { playersState, cardsState } = storeState;\r\n\r\n // draw card\r\n const takenCard = cardsState.deck[cardsState.deck.length - 1];\r\n store.dispatch(actions.takeCard());\r\n\r\n // check for AD79\r\n if (_.get(cardsState, `cards.${takenCard}.type`) === constant.AD79) {\r\n store.dispatch(actions.discardCard(takenCard));\r\n resolveAd79();\r\n return;\r\n }\r\n\r\n // check for Omen\r\n if (_.get(cardsState, `cards.${takenCard}.type`) === constant.OMEN) {\r\n store.dispatch(actions.discardCard(takenCard));\r\n resolveOmen();\r\n return;\r\n }\r\n\r\n const newHand = [\r\n ..._.get(playersState, `details.${playersState.activePlayer}.hand`, []),\r\n takenCard\r\n ];\r\n\r\n store.dispatch(actions.incrementPlayerTurn());\r\n // add card to player hand\r\n setTimeout(() => {\r\n store.dispatch(\r\n actions.updatePlayerHand(playersState.activePlayer, newHand)\r\n );\r\n }, 0);\r\n};\r\n","/** @module Board */\r\n\r\nimport React from \"react\";\r\nimport { Alert } from \"reactstrap\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\nimport { stageData } from \"../../data/messageData\";\r\n\r\n/**\r\n * @function Board\r\n * @description Functional Presentational component for Board\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst Board = props => {\r\n const { messageState } = props;\r\n\r\n return (\r\n
\r\n \r\n 0 && \"font-weight-bold\"}`}\r\n >\r\n {stageData[messageState.stage].text}\r\n \r\n \r\n \r\n {_.get(messageState, \"instruction.text\")}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nBoard.propTypes = {\r\n messageState: types.messageState.types\r\n};\r\n\r\nBoard.defaultProps = {\r\n messageState: types.messageState.defaults\r\n};\r\n\r\nexport default Board;\r\n","/** @module CoordinatesLayers */\r\n\r\nimport React from \"react\";\r\n\r\nimport * as constant from \"../../data/constants\";\r\n\r\n/**\r\n * @function TopCoordinatesDisplay\r\n * @description display coordinates at top of map\r\n * @returns {React.Component}\r\n */\r\nexport const TopCoordinatesDisplay = () => {\r\n const topCoords = [];\r\n for (let i = 0; i < 11; i += 1) {\r\n topCoords.push(\r\n \r\n {i}\r\n \r\n );\r\n }\r\n return topCoords;\r\n};\r\n\r\n/**\r\n * @function LeftCoordinatesDisplay\r\n * @description display coordinates at left of map\r\n * @returns {React.Component}\r\n */\r\nexport const LeftCoordinatesDisplay = () => {\r\n const topCoords = [];\r\n for (let i = 0; i < 7; i += 1) {\r\n topCoords.push(\r\n \r\n {i}\r\n \r\n );\r\n }\r\n return topCoords;\r\n};\r\n","/** @module AnimatedPieceLayer */\r\n\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { ButtonBase } from \"@material-ui/core\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\nimport * as constant from \"../../data/constants\";\r\n\r\nimport { runToSquare } from \"../Logic/runnerLogic\";\r\n\r\nconst AnimatedPieceLayer = ({\r\n gamePlayState: { selectedPerson },\r\n playersState: { details }\r\n}) => {\r\n const [left, setLeft] = useState();\r\n const [top, setTop] = useState();\r\n\r\n useEffect(() => {\r\n console.log(\"square:\", selectedPerson.square);\r\n const coords = selectedPerson.square.split(\"_\");\r\n setLeft(`${parseFloat(coords[1] * 110) + constant.X_OFFSET + 35}px`);\r\n setTop(`${parseFloat(coords[0] * 110) + constant.Y_OFFSET + 35}px`);\r\n }, [selectedPerson.square]);\r\n\r\n return (\r\n {\r\n runToSquare(selectedPerson.square);\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nAnimatedPieceLayer.propTypes = {\r\n gamePlayState: types.gamePlayState.types,\r\n playersState: types.playersState.types\r\n};\r\n\r\nAnimatedPieceLayer.defaultProps = {\r\n gamePlayState: types.gamePlayState.defaults,\r\n playersState: types.playersState.defaults\r\n};\r\n\r\nexport default AnimatedPieceLayer;\r\n","/** @module OccupancyLayer */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ButtonBase, Tooltip } from \"@material-ui/core\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\nimport { selectRunner } from \"../Logic/runnerLogic\";\r\nimport * as constant from \"../../data/constants\";\r\n\r\nimport { performSacrifice } from \"../Logic/placePeopleLogic\";\r\n\r\nconst OccupancySquare = ({\r\n square,\r\n playersState,\r\n runCount,\r\n messageState,\r\n grid,\r\n selectedPerson\r\n}) => {\r\n const occupancySquare = _.get(grid, `${square}.occupants`, []).map(\r\n (person, idx) => {\r\n if (_.get(person, \"id\") !== _.get(selectedPerson, \"id\")) {\r\n const key = `${person.id}`;\r\n const color = `rgb(${_.get(\r\n playersState,\r\n `details.${person.player}.color`\r\n )})`;\r\n const playerName = `${_.get(\r\n playersState,\r\n `details.${person.player}.name`\r\n )}`;\r\n let style = {\r\n backgroundColor: color\r\n };\r\n const offSetArray = _.get(grid, `${square}.offSets`, []);\r\n\r\n if (messageState.stage < 2 && offSetArray.length > 0) {\r\n style = {\r\n ...style,\r\n position: \"absolute\",\r\n left: `${_.get(offSetArray, `[${idx}][0]`, 0)}px`,\r\n top: `${_.get(offSetArray, `[${idx}][1]`, 0)}px`\r\n };\r\n }\r\n return (\r\n \r\n {\r\n if (runCount) {\r\n selectRunner(person, square);\r\n } else {\r\n performSacrifice(person, square);\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n );\r\n }\r\n return null;\r\n }\r\n );\r\n return
{occupancySquare}
;\r\n};\r\n\r\nOccupancySquare.propTypes = {\r\n messageState: types.messageState.types,\r\n playersState: types.playersState.types,\r\n grid: types.gridSquare.types,\r\n selectedPerson: types.occupant.types,\r\n square: PropTypes.string,\r\n runCount: PropTypes.number\r\n};\r\n\r\nOccupancySquare.defaultProps = {\r\n messageState: types.messageState.defaults,\r\n playersState: types.playersState.defaults,\r\n grid: types.gridSquare.defaults,\r\n selectedPerson: {},\r\n square: \"\",\r\n runCount: 0\r\n};\r\n\r\n/**\r\n * @function OccupancyLayer\r\n * @description Functional Presentational component for occupants of board squares\r\n * @param {Object} props\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst OccupancyLayer = props => {\r\n const {\r\n gridState: { grid },\r\n playersState,\r\n runCount,\r\n messageState,\r\n selectedPerson\r\n } = props;\r\n\r\n const occupancy = Object.keys(grid).map(square => {\r\n const coords = square.split(\"_\");\r\n const row = parseFloat(coords[0]);\r\n const col = parseFloat(coords[1]);\r\n return (\r\n \r\n {_.get(grid, `${square}.lava`) && (\r\n \r\n )}\r\n {_.get(grid, `${square}.occupants.length`) > 0 && (\r\n \r\n )}\r\n \r\n );\r\n });\r\n\r\n return (\r\n
\r\n {occupancy}\r\n
\r\n );\r\n};\r\n\r\nOccupancyLayer.propTypes = {\r\n gridState: types.gridState.types,\r\n messageState: types.messageState.types,\r\n playersState: types.playersState.types,\r\n selectedPerson: types.occupant.types,\r\n runCount: PropTypes.number\r\n};\r\n\r\nOccupancyLayer.defaultProps = {\r\n gridState: types.gridState.defaults,\r\n messageState: types.messageState.defaults,\r\n playersState: types.playersState.defaults,\r\n selectedPerson: {},\r\n runCount: 0\r\n};\r\n\r\nexport default OccupancyLayer;\r\n","/** @module CancelButtons */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { IconButton, Tooltip } from \"@material-ui/core\";\r\n\r\nimport * as types from \"../../types/types\";\r\nimport { runToSquare } from \"../Logic/runnerLogic\";\r\n\r\nconst CancelButtons = props => {\r\n const {\r\n flagsState: { flags, runCount },\r\n messageState: { stage },\r\n placeRelatives,\r\n toggleFlags\r\n } = props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n toggleFlags(\"rules-modal\")}>\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n toggleFlags(\"game-stats\")}>\r\n \r\n \r\n
\r\n
\r\n {flags.includes(\"placing-person\") && stage === 1 && (\r\n \r\n
\r\n placeRelatives(null)}>\r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n {runCount > 0 && (\r\n \r\n
\r\n runToSquare(null)}>\r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nCancelButtons.propTypes = {\r\n flagsState: types.flagsState.types,\r\n messageState: types.messageState.types,\r\n placeRelatives: PropTypes.func,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nCancelButtons.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n messageState: types.messageState.defaults,\r\n placeRelatives: () => {},\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport default CancelButtons;\r\n","/** @module BoardContainer */\r\n\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport * as types from \"../../types/types\";\r\n\r\nimport Board from \"./Board\";\r\nimport {\r\n TopCoordinatesDisplay,\r\n LeftCoordinatesDisplay\r\n} from \"./CoordinatesLayers\";\r\nimport AnimatedPieceLayer from \"./AnimatedPieceLayer\";\r\nimport OccupancyLayer from \"./OccupancyLayer\";\r\nimport CancelButtons from \"./CancelButtons\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState,\r\n gamePlayState: state.gamePlayState,\r\n gridState: state.gridState,\r\n messageState: state.messageState,\r\n playersState: state.playersState\r\n };\r\n};\r\n\r\n/**\r\n * @function BoardContainer\r\n * @description Functional Container component for Board\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst BoardContainer = props => {\r\n const {\r\n flagsState,\r\n gamePlayState,\r\n gridState,\r\n messageState,\r\n playersState,\r\n placeRelatives,\r\n toggleFlags\r\n } = props;\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {gamePlayState.selectedPerson && (\r\n \r\n )}\r\n \r\n
\r\n );\r\n};\r\n\r\nBoardContainer.propTypes = {\r\n flagsState: types.flagsState.types,\r\n gamePlayState: types.gamePlayState.types,\r\n gridState: types.gridState.types,\r\n messageState: types.messageState.types,\r\n playersState: types.playersState.types,\r\n placeRelatives: PropTypes.func,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nBoardContainer.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n gamePlayState: types.gamePlayState.defaults,\r\n gridState: types.gridState.defaults,\r\n messageState: types.messageState.defaults,\r\n playersState: types.playersState.defaults,\r\n placeRelatives: () => {},\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport const BoardContainerTest = BoardContainer;\r\nexport default connect(mapStateToProps)(BoardContainer);\r\n","/** @module Card */\r\n\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n cardsState: state.cardsState\r\n };\r\n};\r\n\r\n/**\r\n * @function Card\r\n * @description Functional helper component for Card\r\n * @returns {React.Component} - Rendered Card image.\r\n */\r\nconst Card = props => {\r\n const {\r\n cardsState: { cards },\r\n cardId\r\n } = props;\r\n\r\n const [cardName, setCardName] = useState(\"\");\r\n const [cardSrc, setCardSrc] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (_.get(cards, `${cardId}`)) {\r\n setCardName(cards[cardId].name);\r\n setCardSrc(\r\n `${cards[cardId].type}-${cards[cardId].number}-${cards[cardId].color}`\r\n );\r\n }\r\n }, [cards, cardId]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nCard.propTypes = {\r\n cardsState: types.cardsState.types,\r\n cardId: PropTypes.string\r\n};\r\n\r\nCard.defaultProps = {\r\n cardsState: types.cardsState.defaults,\r\n cardId: \"\"\r\n};\r\n\r\nexport const CardBack = () => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const CardTest = Card;\r\nexport default connect(mapStateToProps, null)(Card);\r\n","/** @module Deck */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Col, Row } from \"reactstrap\";\r\nimport { ButtonBase } from \"@material-ui/core\";\r\n\r\nimport { drawCard } from \"../Logic/cardLogic\";\r\n\r\nimport Card, { CardBack } from \"../Helpers/Card\";\r\n\r\n/**\r\n * @function Deck\r\n * @description Functional Presentational component for Deck\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst Deck = props => {\r\n const { playerColor, topDiscard, deckSizes, deckEnabled } = props;\r\n\r\n return (\r\n \r\n \r\n
\r\n {deckSizes.deck > 0 ? (\r\n drawCard()}\r\n data-test=\"card-deck\"\r\n className=\"deck\"\r\n style={deckEnabled ? { borderColor: `rgb(${playerColor})` } : {}}\r\n >\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n
Deck ({deckSizes.deck})
\r\n
\r\n \r\n \r\n
\r\n {topDiscard ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
Discard ({deckSizes.discard})
\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nDeck.propTypes = {\r\n deckSizes: PropTypes.shape({\r\n deck: PropTypes.number,\r\n discard: PropTypes.number,\r\n tiles: PropTypes.number\r\n }),\r\n playerColor: PropTypes.string,\r\n topDiscard: PropTypes.string,\r\n deckEnabled: PropTypes.bool\r\n};\r\n\r\nDeck.defaultProps = {\r\n deckSizes: {\r\n deck: 0,\r\n discard: 0,\r\n tiles: 0\r\n },\r\n playerColor: \"\",\r\n topDiscard: \"\",\r\n deckEnabled: false\r\n};\r\nexport default Deck;\r\n","/** @module DeckContainer */\r\n\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\n\r\nimport Deck from \"./Deck\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n cardsState: state.cardsState,\r\n flagsState: state.flagsState,\r\n playersState: state.playersState\r\n };\r\n};\r\n\r\n/**\r\n * @function DeckContainer\r\n * @description Functional Container component for Deck\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst DeckContainer = props => {\r\n const { cardsState, playersState, deckEnabled } = props;\r\n\r\n const [lastDrawnCard, setLastDrawnCard] = useState(null);\r\n\r\n useEffect(() => {\r\n if (_.get(cardsState, \"discard.length\") > 0) {\r\n const discardLength = cardsState.discard.length;\r\n const topDiscard = cardsState.discard[discardLength - 1];\r\n if (topDiscard !== lastDrawnCard) {\r\n setLastDrawnCard(topDiscard);\r\n }\r\n }\r\n }, [cardsState, lastDrawnCard]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nDeckContainer.propTypes = {\r\n cardsState: types.cardsState.types,\r\n playersState: types.playersState.types,\r\n deckEnabled: PropTypes.bool\r\n};\r\n\r\nDeckContainer.defaultProps = {\r\n cardsState: types.cardsState.defaults,\r\n playersState: types.playersState.defaults,\r\n deckEnabled: false\r\n};\r\n\r\nexport const DeckContainerTest = DeckContainer;\r\nexport default connect(mapStateToProps)(DeckContainer);\r\n","/** @module Tiles */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Col, Row, Progress } from \"reactstrap\";\r\nimport { ButtonBase } from \"@material-ui/core\";\r\n\r\n/**\r\n * @function Tiles\r\n * @description Functional Presentational component for Tiles\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst Tiles = props => {\r\n const {\r\n deckSizes,\r\n pileEnabled,\r\n drawTile,\r\n lavaTile,\r\n playerColor,\r\n eruptionCount\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n
\r\n {eruptionCount > 0 && (\r\n \r\n Initial Eruption\r\n \r\n )}\r\n drawTile(true)}\r\n style={pileEnabled ? { borderColor: `rgb(${playerColor})` } : {}}\r\n >\r\n {lavaTile ? (\r\n {lavaTile}\r\n ) : (\r\n \"Tile\r\n )}\r\n \r\n
\r\n
\r\n Lava Tiles ({deckSizes.tiles})\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nTiles.propTypes = {\r\n deckSizes: PropTypes.shape({\r\n deck: PropTypes.number,\r\n discard: PropTypes.number,\r\n tiles: PropTypes.number\r\n }),\r\n playerColor: PropTypes.string,\r\n lavaTile: PropTypes.string,\r\n eruptionCount: PropTypes.number,\r\n pileEnabled: PropTypes.bool,\r\n drawTile: PropTypes.func\r\n};\r\n\r\nTiles.defaultProps = {\r\n deckSizes: {\r\n deck: 0,\r\n discard: 0,\r\n tiles: 0\r\n },\r\n playerColor: \"\",\r\n lavaTile: null,\r\n eruptionCount: 0,\r\n pileEnabled: false,\r\n drawTile: () => {}\r\n};\r\nexport default Tiles;\r\n","/** @module TilesContainer */\r\n\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\nimport * as lavaLogic from \"../Logic/lavaLogic\";\r\n\r\nimport Tiles from \"./Tiles\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState,\r\n playersState: state.playersState,\r\n tileState: state.tileState\r\n };\r\n};\r\n\r\n/**\r\n * @function TilesContainer\r\n * @description Functional Container component for Tiles\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst TilesContainer = props => {\r\n const { flagsState, playersState, tileState, pileEnabled } = props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nTilesContainer.propTypes = {\r\n flagsState: types.flagsState.types,\r\n playersState: types.playersState.types,\r\n tileState: types.tileState.types,\r\n pileEnabled: PropTypes.bool\r\n};\r\n\r\nTilesContainer.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n playersState: types.playersState.defaults,\r\n tileState: types.tileState.defaults,\r\n pileEnabled: false\r\n};\r\n\r\nexport const TilesContainerTest = TilesContainer;\r\nexport default connect(mapStateToProps)(TilesContainer);\r\n","/** @module Player */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ButtonBase, Tooltip } from \"@material-ui/core\";\r\nimport { Col, Row } from \"reactstrap\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\n\r\nimport Card, { CardBack } from \"../Helpers/Card\";\r\n\r\nconst PopulationIcons = ({ population, color }) => {\r\n const populationIcons = population.map(person => {\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n });\r\n return
{populationIcons}
;\r\n};\r\n\r\nPopulationIcons.propTypes = {\r\n population: PropTypes.arrayOf(PropTypes.object),\r\n color: PropTypes.string\r\n};\r\n\r\nPopulationIcons.defaultProps = {\r\n population: [],\r\n color: \"255, 255, 255\"\r\n};\r\n\r\nconst HandCards = ({ hand, ai, myTurn, playCard }) => {\r\n if (hand.length > 0) {\r\n const handCards = hand.map((card, idx) => {\r\n const key = `${card}-${idx}`;\r\n return (\r\n playCard(idx)}\r\n disabled={\r\n !myTurn ||\r\n hand.length < 4 ||\r\n (hand.includes(\"AD79\") && card !== \"AD79\") ||\r\n (hand.includes(\"OMEN\") && card !== \"OMEN\")\r\n }\r\n >\r\n {myTurn && !ai ? : }\r\n \r\n );\r\n });\r\n return handCards;\r\n }\r\n return null;\r\n};\r\n\r\nHandCards.propTypes = {\r\n hand: PropTypes.arrayOf(PropTypes.string),\r\n ai: PropTypes.bool,\r\n myTurn: PropTypes.bool,\r\n playCard: PropTypes.func\r\n};\r\n\r\nHandCards.defaultProps = {\r\n hand: [],\r\n ai: false,\r\n myTurn: false,\r\n playCard: () => {}\r\n};\r\n\r\n/**\r\n * @function Player\r\n * @description Functional Presentational component for Player\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst Player = props => {\r\n const { details, myTurn, playCard, stage, numberOfPlayers } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n {`${details.name}`}\r\n {details.ai ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {stage < 2 && (\r\n Population: {_.get(details, \"population\", []).length}\r\n )}\r\n {stage < 2 && (\r\n Casualites: {_.get(details, \"casualties\", []).length}\r\n )}\r\n \r\n \r\n {stage < 2 ? (\r\n \r\n ) : (\r\n
\r\n \r\n \r\n
Saved
\r\n \r\n \r\n \r\n
Population
\r\n \r\n \r\n \r\n
Casualites
\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nPlayer.propTypes = {\r\n details: types.playerDetails.types,\r\n stage: PropTypes.number,\r\n numberOfPlayers: PropTypes.number,\r\n myTurn: PropTypes.bool,\r\n playCard: PropTypes.func\r\n};\r\n\r\nPlayer.defaultProps = {\r\n details: types.playerDetails.defaults,\r\n stage: 0,\r\n numberOfPlayers: 2,\r\n myTurn: false,\r\n playCard: () => {}\r\n};\r\n\r\nexport default Player;\r\n","/** @module PlayersContainer */\r\n\r\nimport React, { useEffect } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\n\r\nimport Player from \"./Player\";\r\nimport { chooseCardToPlay } from \"../Logic/cardLogic\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n playersState: state.playersState,\r\n gamePlayState: state.gamePlayState\r\n };\r\n};\r\n\r\n/**\r\n * @function PlayerCards\r\n * @description List components for player cards\r\n * @param {Object} props.playersState\r\n * @returns {React.Component}\r\n */\r\nconst PlayerCards = ({ playersState, playCard, stage }) => {\r\n const playerCards = playersState.players.map((player, idx) => {\r\n return (\r\n playCard(player, cardIdx)}\r\n stage={stage}\r\n numberOfPlayers={playersState.players.length}\r\n />\r\n );\r\n });\r\n return playerCards;\r\n};\r\n\r\n/**\r\n * @function PlayersContainer\r\n * @description Functional Container component for Players\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst PlayersContainer = props => {\r\n const { playersState, gamePlayState, playPompCard, stage } = props;\r\n\r\n useEffect(() => {\r\n if (\r\n _.get(\r\n playersState,\r\n `details.${playersState.activePlayer}.hand.length`\r\n ) === 4 &&\r\n _.get(gamePlayState, \"recommendations.length\") === 0\r\n ) {\r\n chooseCardToPlay();\r\n }\r\n }, [playersState, gamePlayState]);\r\n\r\n /**\r\n * @function playCard\r\n * @decription fires/dispatches functions as result of playing (selecting) a card from hand\r\n * @param {String} player\r\n * @param {Number} cardIdx\r\n */\r\n const playCard = (player, cardIdx) => {\r\n const thisHand = [...playersState.details[player].hand];\r\n const cardId = thisHand[cardIdx];\r\n playPompCard(cardId);\r\n };\r\n\r\n return (\r\n
\r\n {!_.isEmpty(playersState.details) && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nPlayersContainer.propTypes = {\r\n playersState: types.playersState.types,\r\n gamePlayState: types.gamePlayState.types,\r\n stage: PropTypes.number,\r\n playPompCard: PropTypes.func\r\n};\r\n\r\nPlayersContainer.defaultProps = {\r\n playersState: types.playersState.defaults,\r\n gamePlayState: types.gamePlayState.defaults,\r\n stage: 0,\r\n playPompCard: () => {}\r\n};\r\n\r\nexport const PlayersContainerTest = PlayersContainer;\r\nexport default connect(mapStateToProps)(PlayersContainer);\r\n","/** @module PlacementHighlighter */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ButtonBase } from \"@material-ui/core\";\r\n\r\nimport * as constant from \"../../data/constants\";\r\n\r\n/**\r\n * @function PlacementHighlighter\r\n * @description Functional Presentational component for highlighting board squares\r\n * @param {Object} props\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst PlacementHighlighter = props => {\r\n const { gridArray, validation, selectSquare, activePlayer } = props;\r\n\r\n const placementHighlighter = gridArray.map(square => {\r\n if (validation(square)) {\r\n const coords = square.split(\"_\");\r\n const row = parseFloat(coords[0]);\r\n const col = parseFloat(coords[1]);\r\n return (\r\n selectSquare(square)}\r\n className={`highlighter ${activePlayer}`}\r\n style={{\r\n top: `${row * 110 + constant.Y_OFFSET}px`,\r\n left: `${col * 110 + constant.X_OFFSET}px`\r\n }}\r\n >\r\n
\r\n \r\n );\r\n }\r\n return null;\r\n });\r\n\r\n return (\r\n
{placementHighlighter}
\r\n );\r\n};\r\n\r\nPlacementHighlighter.propTypes = {\r\n gridArray: PropTypes.arrayOf(PropTypes.string),\r\n activePlayer: PropTypes.string,\r\n selectSquare: PropTypes.func,\r\n validation: PropTypes.func\r\n};\r\n\r\nPlacementHighlighter.defaultProps = {\r\n gridArray: [],\r\n activePlayer: \"\",\r\n selectSquare: () => {},\r\n validation: () => {}\r\n};\r\n\r\nexport default PlacementHighlighter;\r\n","/** @module AD79Sidebar */\r\n\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ButtonBase } from \"@material-ui/core\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\nimport { stageData } from \"../../data/messageData\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState,\r\n messageState: state.messageState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n toggleFlags: actions.toggleFlags\r\n};\r\n\r\n/**\r\n * @function AD79Sidebar\r\n * @description Functional Presentational component for AD 79 Sidebar\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst AD79Sidebar = props => {\r\n const { messageState, flagsState, toggleFlags } = props;\r\n return (\r\n
\r\n

\r\n {stageData[messageState.stage].text}\r\n

\r\n
\r\n {\r\n if (flagsState.flags.includes(\"card-ad79\")) {\r\n toggleFlags(\"card-ad79\");\r\n }\r\n }}\r\n >\r\n \r\n \r\n
(Click to Continue)
\r\n
\r\n
\r\n );\r\n};\r\n\r\nAD79Sidebar.propTypes = {\r\n flagsState: types.flagsState.types,\r\n messageState: types.messageState.types,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nAD79Sidebar.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n messageState: types.messageState.defaults,\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport const AD79SidebarTest = AD79Sidebar;\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AD79Sidebar);\r\n","/** @module LavaTileSidebar */\r\n\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport { ButtonBase } from \"@material-ui/core\";\r\nimport { Col, Row } from \"reactstrap\";\r\nimport _ from \"lodash\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\nimport * as lavaLogic from \"../Logic/lavaLogic\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState,\r\n tilesState: state.tilesState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n toggleFlags: actions.toggleFlags\r\n};\r\n\r\n/**\r\n * @function LavaTileSidebar\r\n * @description Functional Presentational component for AD 79 Sidebar\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst LavaTileSidebar = props => {\r\n const { flagsState, tileState, resolveNoPlaceToPlace, toggleFlags } = props;\r\n\r\n const wilds = _.get(tileState, `tiles.${tileState.lavaTile}.wilds`);\r\n\r\n return (\r\n
\r\n {flagsState.flags.includes(\"no-place-to-place\") && (\r\n
\r\n

{`No Place For ${tileState.lavaTile} To Be Placed!`}

\r\n
\r\n \r\n \r\n \r\n
(Click to Continue)
\r\n
\r\n
\r\n )}\r\n {!flagsState.flags.includes(\"no-place-to-place\") &&\r\n _.get(wilds, \"length\") === 2 && (\r\n
\r\n

Wild Lava Tile Drawn (Pick Type)!

\r\n \r\n \r\n
\r\n {\r\n lavaLogic.highlightDangerZones(wilds[0]);\r\n if (flagsState.flags.includes(\"wild-lava-tile\")) {\r\n toggleFlags(\"wild-lava-tile\");\r\n }\r\n }}\r\n >\r\n {wilds[0]}\r\n \r\n
{`(Click to Place ${wilds[0]})`}
\r\n
\r\n \r\n \r\n
\r\n {\r\n lavaLogic.highlightDangerZones(wilds[1]);\r\n if (flagsState.flags.includes(\"wild-lava-tile\")) {\r\n toggleFlags(\"wild-lava-tile\");\r\n }\r\n }}\r\n >\r\n {wilds[1]}\r\n \r\n
{`(Click to Place ${wilds[1]})`}
\r\n
\r\n \r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nLavaTileSidebar.propTypes = {\r\n flagsState: types.flagsState.types,\r\n tileState: types.tileState.types,\r\n resolveNoPlaceToPlace: PropTypes.func,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nLavaTileSidebar.defaultProps = {\r\n tileState: types.tileState.defaults,\r\n flagsState: types.flagsState.defaults,\r\n resolveNoPlaceToPlace: () => {},\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport const LavaTileSideBarTest = LavaTileSidebar;\r\nexport default connect(mapStateToProps, mapDispatchToProps)(LavaTileSidebar);\r\n","/** @module SnackbarNotifier */\r\n\r\nimport React, { useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { withSnackbar } from \"notistack\";\r\nimport _ from \"lodash\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n snackbarState: state.snackbarState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n addSnackbar: actions.addSnackbar\r\n};\r\n\r\n/**\r\n * @function SnackbarNotifier\r\n * @description Functional Presentational component for Snackbar Notifier\r\n * Temporarily displays snackbar message unobtrusively in lower left-hand corner when message should be\r\n * communicated to user (action success, etc)\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst SnackbarNotifier = props => {\r\n const { enqueueSnackbar, snackbarState, addSnackbar } = props;\r\n\r\n useEffect(() => {\r\n if (_.get(snackbarState, \"message\")) {\r\n enqueueSnackbar(snackbarState.message, {\r\n variant: `${snackbarState.type}`,\r\n className: `custom-snackbar ${snackbarState.type}`\r\n });\r\n addSnackbar({ message: null });\r\n }\r\n }, [snackbarState, enqueueSnackbar, addSnackbar]);\r\n\r\n return ;\r\n};\r\n\r\nSnackbarNotifier.propTypes = {\r\n snackbarState: types.snackbarState.types,\r\n addSnackbar: PropTypes.func,\r\n enqueueSnackbar: PropTypes.func\r\n};\r\n\r\nSnackbarNotifier.defaultProps = {\r\n snackbarState: types.snackbarState.defaults,\r\n addSnackbar: () => {},\r\n enqueueSnackbar: () => {}\r\n};\r\n\r\nexport const SnackbarNotifierTest = SnackbarNotifier;\r\nexport default withSnackbar(\r\n connect(mapStateToProps, mapDispatchToProps)(SnackbarNotifier)\r\n);\r\n","/** @module GameOverModal */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Col,\r\n Row,\r\n Modal,\r\n ModalHeader,\r\n ModalBody,\r\n ModalFooter\r\n} from \"reactstrap\";\r\nimport { Button } from \"@material-ui/core\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../../types/types\";\r\n\r\nimport \"./styles/modals.scss\";\r\n\r\nconst PlayerStats = ({ details, winner }) => {\r\n const detailsArray = Object.keys(details);\r\n const playersStats = detailsArray.map(player => {\r\n return (\r\n \r\n
\r\n {details[player].name}\r\n {winner && winner === player && (\r\n \r\n )}\r\n
\r\n \r\n Saved:\r\n {_.get(details, `${player}.saved.length`, 0)}\r\n \r\n \r\n Casualties:\r\n {_.get(details, `${player}.casualties.length`, 0)}\r\n \r\n \r\n Population:\r\n {_.get(details, `${player}.population.length`, 0)}\r\n \r\n \r\n );\r\n });\r\n return playersStats;\r\n};\r\n\r\n/**\r\n * @function GameOverModal\r\n * @description Functional Presentational component for Game Over Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst GameOverModal = props => {\r\n const {\r\n isOpen,\r\n playersState,\r\n acceptGameOver,\r\n statisticsOnly,\r\n toggleFlags,\r\n rankings\r\n } = props;\r\n\r\n const tie = !!(\r\n !statisticsOnly && rankings[0].victoryPoints === rankings[1].victoryPoints\r\n );\r\n\r\n return (\r\n \r\n {statisticsOnly ? (\r\n toggleFlags(\"game-stats\")}>\r\n Statistics\r\n \r\n ) : (\r\n Game Over!\r\n )}\r\n \r\n {!statisticsOnly && rankings && (\r\n \r\n \r\n \r\n {`Winner${tie ? \"s (tie):\" : \":\"} ${rankings[0].name}${\r\n tie ? ` and ${rankings[1].name}` : \"\"\r\n }!`}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {statisticsOnly && (\r\n {\r\n toggleFlags(\"game-over\");\r\n toggleFlags(\"game-stats\");\r\n }}\r\n >\r\n \r\n End Game\r\n \r\n )}\r\n acceptGameOver()}\r\n >\r\n \r\n Continue\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nGameOverModal.propTypes = {\r\n playersState: types.playersState.types,\r\n rankings: PropTypes.arrayOf(PropTypes.object),\r\n isOpen: PropTypes.bool,\r\n statisticsOnly: PropTypes.bool,\r\n acceptGameOver: PropTypes.func,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nGameOverModal.defaultProps = {\r\n playersState: types.playersState.defaults,\r\n rankings: [],\r\n isOpen: false,\r\n statisticsOnly: false,\r\n acceptGameOver: () => {},\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport default GameOverModal;\r\n","/** @module GameOverContainer */\r\n\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport _ from \"lodash\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\n\r\nimport GameOverModal from \"./GameOverModal\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState,\r\n playersState: state.playersState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n toggleFlags: actions.toggleFlags\r\n};\r\n\r\n/**\r\n * @function GameOverContainer\r\n * @description Functional Container component for Game Over Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst GameOverContainer = props => {\r\n const {\r\n flagsState: { flags },\r\n playersState\r\n } = props;\r\n\r\n const [rankings, setRankings] = useState();\r\n\r\n useEffect(() => {\r\n const statistics = _.get(playersState, \"players\").map(player => {\r\n return {\r\n code: player,\r\n name: _.get(playersState, `details.${player}.name`),\r\n victoryPoints:\r\n parseFloat(_.get(playersState, `details.${player}.saved.length`, 0)) *\r\n 100 +\r\n 99 -\r\n parseFloat(\r\n _.get(playersState, `details.${player}.casualties.length`, 0)\r\n )\r\n };\r\n });\r\n setRankings(\r\n statistics.sort((a, b) => (b.victoryPoints > a.victoryPoints ? 1 : -1))\r\n );\r\n }, [playersState]);\r\n\r\n const gameOver = \"game-over\";\r\n\r\n /**\r\n * @function acceptGameOver\r\n * @description After reading statistics, continue\r\n */\r\n const acceptGameOver = () => {\r\n document.location.reload();\r\n };\r\n\r\n return (\r\n
\r\n {rankings && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nGameOverContainer.propTypes = {\r\n playersState: types.playersState.types,\r\n flagsState: types.flagsState.types\r\n};\r\n\r\nGameOverContainer.defaultProps = {\r\n playersState: types.playersState.defaults,\r\n flagsState: types.flagsState.defaults\r\n};\r\n\r\nexport const GameOverContainerTest = GameOverContainer;\r\nexport default connect(mapStateToProps, mapDispatchToProps)(GameOverContainer);\r\n","/** @module StartGameModal */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Col,\r\n Label,\r\n Modal,\r\n ModalHeader,\r\n ModalBody,\r\n ModalFooter,\r\n Row\r\n} from \"reactstrap\";\r\nimport { Formik, Field, Form } from \"formik\";\r\nimport { IconButton, Button, Tooltip } from \"@material-ui/core\";\r\nimport BootstrapSwitchButton from \"bootstrap-switch-button-react\";\r\n\r\nimport { aiPlayers } from \"../../data/playerData\";\r\n\r\nimport \"./styles/modals.scss\";\r\n\r\n/**\r\n * @function HumanOrAI\r\n * @description React component to return Human/AI icon\r\n * @param {Object} formProps\r\n * @param {String} name\r\n * @returns {React.Component}\r\n */\r\nconst HumanOrAI = ({ formProps, name }) => {\r\n return (\r\n \r\n \r\n
\r\n }\r\n onstyle=\"light\"\r\n offstyle=\"light\"\r\n offlabel={}\r\n onChange={checked => {\r\n formProps.setFieldValue(`${name}AI`, !checked);\r\n formProps.setFieldValue(name, \"\");\r\n formProps.setFieldValue(\"wildLava\", false);\r\n }}\r\n />\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nHumanOrAI.propTypes = {\r\n formProps: PropTypes.shape({\r\n values: PropTypes.object,\r\n setFieldValue: PropTypes.func\r\n }),\r\n name: PropTypes.string\r\n};\r\n\r\nHumanOrAI.defaultProps = {\r\n formProps: {\r\n values: {},\r\n setFieldValue: () => {}\r\n },\r\n name: \"\"\r\n};\r\n\r\n/**\r\n * @function AIDropDown\r\n * @description React component to return AI drop down options\r\n * @param {Object} formProps\r\n * @param {String} name\r\n * @returns {React.Component}\r\n */\r\nconst AIDropDown = ({ formProps, name }) => {\r\n const currentPlayers = Object.values(formProps.values).map(value => value);\r\n const aiDropDown = Object.keys(aiPlayers).map(ai => {\r\n return (\r\n \r\n {ai}\r\n \r\n );\r\n });\r\n return (\r\n {\r\n formProps.setFieldValue(name, e.target.value);\r\n }}\r\n >\r\n \r\n {aiDropDown}\r\n \r\n );\r\n};\r\n\r\nAIDropDown.propTypes = {\r\n formProps: PropTypes.shape({\r\n values: PropTypes.object,\r\n setFieldValue: PropTypes.func\r\n }),\r\n name: PropTypes.string\r\n};\r\n\r\nAIDropDown.defaultProps = {\r\n formProps: {\r\n values: {},\r\n setFieldValue: () => {}\r\n },\r\n name: \"\"\r\n};\r\n\r\n/**\r\n * @function PlayerNameSelection\r\n * @description React component to return player selection\r\n * @param {Object} formProps\r\n * @returns {React.Component}\r\n */\r\nconst PlayerNameSelection = ({ formProps }) => {\r\n const playerNameSelection = [];\r\n for (let i = 1; i <= formProps.values.numberOfPlayers; i += 1) {\r\n playerNameSelection.push(\r\n \r\n \r\n \r\n {formProps.values[`player${i}AI`] ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n }\r\n return playerNameSelection;\r\n};\r\n\r\n/**\r\n * @function StartGameModal\r\n * @description Functional Presentational component for Game Over Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst StartGameModal = props => {\r\n const { flags, commitStartGame, initialValues, toggleFlags } = props;\r\n\r\n const startGame = \"game-start\";\r\n\r\n return (\r\n \r\n Start Game\r\n commitStartGame(values)}\r\n >\r\n {formProps => (\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\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\n \r\n {formProps.values.numberOfPlayers > 2 && (\r\n \r\n )}\r\n {formProps.values.numberOfPlayers > 3 && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
\r\n {!formProps.values.player1AI &&\r\n !formProps.values.player2AI &&\r\n !formProps.values.player3AI &&\r\n !formProps.values.player4AI && (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n formProps.setFieldValue(\"wildLava\", checked);\r\n }}\r\n />\r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n \r\n toggleFlags(\"rules-modal\")}\r\n >\r\n \r\n Game Rules\r\n \r\n
\r\n \r\n
\r\n \r\n formProps.setFieldValue(\r\n \"autoPlayDisabled\",\r\n !formProps.values.autoPlayDisabled\r\n )\r\n }\r\n >\r\n {formProps.values.autoPlayDisabled ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n formProps.setFieldValue(\r\n \"prePopulate\",\r\n !formProps.values.prePopulate\r\n )\r\n }\r\n >\r\n {formProps.values.prePopulate ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n \r\n \r\n
\r\n {\r\n const nextPhase =\r\n (formProps.values.startPhase + 1) % 3;\r\n formProps.setFieldValue(\"startPhase\", nextPhase);\r\n formProps.setFieldValue(\r\n \"prePopulate\",\r\n !!(nextPhase > 0)\r\n );\r\n }}\r\n >\r\n {(() => {\r\n switch (formProps.values.startPhase) {\r\n case 1:\r\n return (\r\n \r\n );\r\n case 2:\r\n return (\r\n \r\n );\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n })()}\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n formProps.setFieldValue(\r\n \"noEruption\",\r\n !formProps.values.noEruption\r\n )\r\n }\r\n disabled={formProps.values.startPhase !== 2}\r\n >\r\n {formProps.values.noEruption ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n formProps.setFieldValue(\r\n \"showStrategyValues\",\r\n !formProps.values.showStrategyValues\r\n )\r\n }\r\n >\r\n {formProps.values.showStrategyValues ? (\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\n \r\n Continue\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n );\r\n};\r\n\r\nStartGameModal.propTypes = {\r\n flags: PropTypes.arrayOf(PropTypes.string),\r\n initialValues: PropTypes.shape({\r\n key: PropTypes.any\r\n }),\r\n commitStartGame: PropTypes.func,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nStartGameModal.defaultProps = {\r\n flags: [],\r\n initialValues: {\r\n numberOfPlayers: 3,\r\n player1: \"Player 1\",\r\n player2: \"Player 2\",\r\n player3: \"Player 3\"\r\n },\r\n commitStartGame: () => {},\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport default StartGameModal;\r\n","/** @module StartGameContainer */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\nimport { playerColors } from \"../../data/playerData\";\r\n\r\nimport StartGameModal from \"./StartGameModal\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n toggleFlags: actions.toggleFlags,\r\n gameSetup: actions.gameSetup\r\n};\r\n\r\n/**\r\n * @function StartGameContainer\r\n * @description Functional Container component for Game Over Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst StartGameContainer = props => {\r\n const {\r\n flagsState: { flags },\r\n toggleFlags,\r\n gameSetup\r\n } = props;\r\n\r\n const startGame = \"game-start\";\r\n\r\n let initialValues = {\r\n numberOfPlayers: 3,\r\n player1: \"Player 1\",\r\n player2: \"Player 2\",\r\n player3: \"Player 3\",\r\n player4: \"Player 4\",\r\n player1AI: false,\r\n player2AI: false,\r\n player3AI: false,\r\n player4AI: false,\r\n startPlayer: 0,\r\n wildLava: false,\r\n autoPlayDisabled: false,\r\n prePopulate: false,\r\n startPhase: 0,\r\n noEruption: false,\r\n showStrategyValues: false\r\n };\r\n if (localStorage.getItem(\"pompeii\")) {\r\n initialValues = {\r\n ...initialValues,\r\n ...JSON.parse(localStorage.getItem(\"pompeii\"))\r\n };\r\n }\r\n\r\n /**\r\n * @function commitStartGame\r\n * @description After reading statistics, continue\r\n */\r\n const commitStartGame = values => {\r\n localStorage.setItem(\"pompeii\", JSON.stringify(values));\r\n const details = {};\r\n for (let i = 1; i <= parseFloat(values.numberOfPlayers); i += 1) {\r\n details[`player${i}`] = {\r\n name: values[`player${i}`],\r\n hand: [],\r\n color: playerColors[i - 1],\r\n casualties: [],\r\n population: [],\r\n saved: [],\r\n ai: values[`player${i}AI`]\r\n };\r\n }\r\n const gameSettings = {\r\n autoPlayDisabled: values.autoPlayDisabled,\r\n prePopulate: values.prePopulate,\r\n startPhase: values.startPhase,\r\n noEruption: values.noEruption,\r\n showStrategyValues: values.showStrategyValues,\r\n wildLava: values.wildLava\r\n };\r\n let { startPlayer } = values;\r\n if (parseFloat(startPlayer) === 0) {\r\n startPlayer = Math.ceil(\r\n Math.random() * parseFloat(values.numberOfPlayers)\r\n );\r\n }\r\n gameSetup(details, startPlayer, gameSettings);\r\n toggleFlags(startGame);\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nStartGameContainer.propTypes = {\r\n flagsState: types.flagsState.types,\r\n toggleFlags: PropTypes.func,\r\n gameSetup: PropTypes.func\r\n};\r\n\r\nStartGameContainer.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n toggleFlags: () => {},\r\n gameSetup: () => {}\r\n};\r\n\r\nexport const StartGameContainerTest = StartGameContainer;\r\nexport default connect(mapStateToProps, mapDispatchToProps)(StartGameContainer);\r\n","/** @module GameStatisticsContainer */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\n\r\nimport GameOverModal from \"./GameOverModal\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState,\r\n playersState: state.playersState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n toggleFlags: actions.toggleFlags\r\n};\r\n\r\n/**\r\n * @function GameStatisticsContainer\r\n * @description Functional Container component for Game Over Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst GameStatisticsContainer = props => {\r\n const {\r\n flagsState: { flags },\r\n playersState,\r\n toggleFlags\r\n } = props;\r\n\r\n const GameStats = \"game-stats\";\r\n\r\n /**\r\n * @function acceptGameOver\r\n * @description After reading statistics, continue\r\n */\r\n const acceptGameOver = () => {\r\n toggleFlags(GameStats);\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nGameStatisticsContainer.propTypes = {\r\n playersState: types.playersState.types,\r\n flagsState: types.flagsState.types,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nGameStatisticsContainer.defaultProps = {\r\n playersState: types.playersState.defaults,\r\n flagsState: types.flagsState.defaults,\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport const GameStatisticsContainerTest = GameStatisticsContainer;\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(GameStatisticsContainer);\r\n","/** @module InstructionsModalBody */\r\n\r\nimport React, { useState } from \"react\";\r\nimport { Tooltip } from \"reactstrap\";\r\n\r\n/**\r\n * @function InstructionsModal\r\n * @description Functional Container component for Instructions Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst InstructionsModalBody = () => {\r\n const [tooltipOpen, setTooltipOpen] = useState(\"\");\r\n\r\n const toggle = tip => {\r\n let value = tip;\r\n if (tooltipOpen.includes(tip)) {\r\n value = \"\";\r\n }\r\n setTooltipOpen(value);\r\n };\r\n\r\n return (\r\n \r\n toggle(\"card\")}\r\n >\r\n \r\n \r\n toggle(\"ad79\")}\r\n >\r\n \r\n \r\n toggle(\"lava\")}\r\n >\r\n \r\n \r\n toggle(\"omen\")}\r\n >\r\n \r\n \r\n
\r\n

Game Overview

\r\n

\r\n The Downfall of Pompeii (aka Pompeii) is played in two phases:\r\n In the first, you try to bring as many of your own people into the\r\n city as you can by playing Pompeii cards. If\r\n you play a house number 3, for example, you may put one of your people\r\n into a build with that number. There are 2 "\r\n AD 79" cards. As soon as the second AD 79\r\n card appears, Vesuvius erupts and the second phase of the game begins.\r\n Now, move as many of your people out of the city through the gates as\r\n you can before lava tiles cover Pompeii. You\r\n win if you are the player who has saved the most of your own people\r\n before the end of the game.\r\n

\r\n
\r\n
\r\n

How to Play

\r\n\r\n
\r\n
\r\n First Phase Part I: New Citizens Move to Pompeii (Vesuvius Sleeps)\r\n
\r\n

\r\n On your turn, you take three (3) actions, in the following order:\r\n

\r\n
    \r\n
  1. Play 1 of the 4 cards from your hand
  2. \r\n
  3. \r\n Put 1 of your people on an open space in a build whose number\r\n matches that on the card being played\r\n
  4. \r\n
  5. Draw a card from the deck
  6. \r\n
\r\n

\r\n The Pompeii cards contain 3 important pieces\r\n of information:\r\n

\r\n
    \r\n
  • \r\n The Number on the card\r\n corresponds to one of 11 buildings on the board. This is the build\r\n that you will place a person into when you play a card on your\r\n turn.\r\n
  • \r\n
  • \r\n The Color of the card\r\n (grey, turquoise, brown, or purple) corresponds to the color of a\r\n set of buildings on the board (and will match the color of the\r\n specific building designated by the number).\r\n
  • \r\n
  • \r\n The Symbols at the\r\n bottom of the card show both the number of the cards in the deck\r\n with that number, and the number and grouping of available spaces\r\n within the corresponding building. All of the buildings on the\r\n board show the number of available spaces for people to be put\r\n into. The specific group(s) of spaces within a building becomes\r\n important later in the game (see Phase One, Part II).\r\n
  • \r\n
\r\n

\r\n In addition, there are neutral (beige) buildings on the board with\r\n no number. These become important in Phase One, Part II.\r\n

\r\n

\r\n NOTE: The house numbers 3, 4, 6, 7, 10, and 11 are building with at\r\n least two parts. When playing a card with one of these numbers, you\r\n can place your person in any part of the building.\r\n

\r\n
First Phase Part II: Relatives and Omens (Vesuvius Seethes)
\r\n

\r\n When the first AD 79 card is drawn, you\r\n immediately get another card as a replacement. Vesuvius seethes.\r\n

\r\n

From now on, there are two new rules:

\r\n
New Rule: Omen Cards
\r\n

\r\n When you draw an Omen card off the deck,\r\n discard it immediately. Then, take another player's person from\r\n anywhere on the board and sacrifice it. This piece is now a casualty\r\n and is out of the game. Then draw a replacement card. If you draw\r\n another Omen card, repeat the process. Your turn ends when you draw\r\n a non-Omen card as a replacement.\r\n

\r\n
New Rule: Relatives
\r\n

\r\n If you add a person to a building that already contains one or more\r\n occupants (regardless of color), you may optionally put additional\r\n pieces ("relatives") in different squares as part of the\r\n same move. Relatives can be placed in buildings of the same color or\r\n neutral (beige) buildings. Since there are no Pompeii cards for the\r\n neutral buildings, they can only be filled by meanws of the\r\n "relatives" rule.\r\n

\r\n

\r\n For each game piece already in the part of the building you place\r\n your piece, you place another into:\r\n

\r\n
    \r\n
  • A different building of the same color
  • \r\n
  • \r\n Another part of the same building if the building has multiple\r\n parts/squares\r\n
  • \r\n
  • A neutral (beige non-numbered) building
  • \r\n
\r\n

\r\n You cannot place relatives into the same part/square of the building\r\n as your original piece was placed in. You may place relatives into\r\n multiple different neutral buildings, but never multiple relatives\r\n into the same neutral building.\r\n

\r\n

\r\n When counting existing pieces to determine the number of relatives,\r\n ignore pieces in different parts of the same building. You can only\r\n place one relative into any given building in the same move.\r\n

\r\n

\r\n Putting relatives into buildings that already have game pieces in\r\n them does not trigger the "relatives" rule again; in other\r\n words, there are no "chain reactions". It may happen that\r\n there are not enough free spaces for all relatives to be placed -\r\n that case, you cannot place the extra relatives.\r\n

\r\n
Wild Cards
\r\n

\r\n If all of the spaces within a building belonging to the number on a\r\n card are occupied, you may play the card as a wild card. You put one\r\n person on any free space in any building, regardless of color of\r\n building.\r\n

\r\n

\r\n However, pieces moved into a build by means of a wild card do not\r\n trigger the "relatives" rule!\r\n

\r\n
\r\n
\r\n
Phase Part II: VESUVIUS ERUPTS!
\r\n

\r\n The first phase of the game ends when the second{\" \"}\r\n AD 79 card is drawn. No more cards will be\r\n played, nor will any new pieces be placed onto the board.\r\n

\r\n
The Lava Begins to Flow!
\r\n

\r\n Every lava tile shows one of six different symbols. For each symbol\r\n (scroll, vase, helmet, mask, coin, and column) there is a vent space\r\n on the board. The first tile of a symbol is put on its corresponding\r\n vent.\r\n

\r\n

\r\n All lava tiles must be placed either on their vent or orthogonally\r\n (up, down, left, or right, but not diagonally) adjacent to existing\r\n tiles of the same type.\r\n

\r\n

\r\n The player in turn after the player who drew the{\" \"}\r\n AD 79 card (and thus triggered the eruption!)\r\n draws the first lava tile and places it on\r\n its vent. Then the next player draws a tile and places it either on\r\n its vent or orthogonally adjacent to an existing tile of the same\r\n type, and so on until there are{\" \"}\r\n six (6) tiles thus placed\r\n upon the board.\r\n

\r\n

\r\n Any pieces on a square that is covered with a lava tile are\r\n immediately removed from the board as casualties of the eruption!\r\n

\r\n
RUN FOR YOUR LIVES!
\r\n

\r\n Once there are six (6) lava tiles on the board, the second phase\r\n begins. Each subsequent turn consists of two (2) steps:\r\n

\r\n
    \r\n
  1. Draw one (1) lava tile and place it on the board
  2. \r\n
  3. Move two (2) of your game pieces
  4. \r\n
\r\n
Draw a lava tile
\r\n

\r\n The player whose turn it is starts by drawing a lava tile and\r\n placing it on the board. If it's the first tile of its type,\r\n the tile is placed upon its vent. Otherwise, it is placed\r\n orthogonally adjacent to an existing lava tile of the same type.\r\n

\r\n

\r\n Any pieces on a square that is covered with a lava tile (even your\r\n own!) are immediately removed from the board as casualties of the\r\n eruption!\r\n

\r\n

\r\n If there is no place to place a lava tile, no tile is placed. In\r\n other words, if you draw a Scroll lava tile but there are no\r\n available spots orthogonally adjacent to existing Scroll lava tiles,\r\n no tiles are placed and you move on to the next step of your turn.\r\n

\r\n

\r\n The goal is to escape as many of your people from Pompeii as\r\n possible by passing them through the gates of the city. All spaces\r\n that are blocked from all exits (surrounded by lava with no access\r\n to any city gate) are also immediately covered in lava, with any\r\n pieces therein removed (since there is no way for them to escape).\r\n

\r\n
Move game pieces
\r\n

\r\n On your turn, you may move up to two (2) of your game pieces.\r\n Typically, this would be moving two different pieces (exceptions are\r\n below). The total number of pieces (regardless of color) in a square\r\n determines the maximum movement for each piece in the square. You\r\n many move your piece one (1) city block (square) for each piece in\r\n the square that piece starts from. You are not required to move the\r\n maxiumum.\r\n

\r\n

\r\n NOTE: During this phase of the game, you ignore the actual\r\n buildings; you are only concerned with squares. Thus a building\r\n covering two squares still counts as two spaces, not one. Also,\r\n ignore the maximum number of pieces a building can contain; while\r\n the city evacuates, there is no limit to the number of pieces that\r\n may occupy the same space.\r\n

\r\n

\r\n You can move a piece vertically or horizontally, but not diagonally.\r\n Changing direction is allowed, even more than once in the same move,\r\n but moving back and forth is not. You may move a game piece onto any\r\n city square except those covered in lava or empty lava vents. You\r\n may leave "move points" unused if you do not want to move\r\n the maximum allowed.\r\n

\r\n

\r\n Pieces that are moved through a\r\n city gate are safe from the volcano. Just moving to the gate is not\r\n enough; it takes one "move point" to pass through the gate\r\n and into safety.\r\n

\r\n

\r\n You are allowed to move two pieces during this step. There are two\r\n exceptions that will allow you to move only one:\r\n

\r\n
    \r\n
  1. \r\n If you only have one piece left on the board, you can move it\r\n twice. Each move will use the number of existing occupants in the\r\n square to determine "move points". For example: if a\r\n player's only place starts in a square with three people,\r\n they can move that piece three spaces. If that piece stops in a\r\n square with one other person, then it can immediately move two\r\n spaces (since when they start running, there are two people in the\r\n square they start from).\r\n
  2. \r\n
  3. \r\n If a piece is alone in a square at the start of your turn, you may\r\n move that piece twice instead of moving two separate pieces. The\r\n first move will be only one square (since it started in a square\r\n with only the one occupant), but the second move will be\r\n determined by the number of pieces in the square they moved into.\r\n
  4. \r\n
\r\n

\r\n There is one additional exception: If you do not have any pieces\r\n remaining on the board, you cannot move any pieces. Instead, your\r\n turn ends after placing your lava tile.\r\n

\r\n
\r\n
\r\n
End of the Game
\r\n

The game ends one of two ways:

\r\n
    \r\n
  • \r\n When you draw the last lava tile, the game ends. All remaining\r\n spaces on the board are immediately covered in lava, and all\r\n pieces remaining are removed as casualties.\r\n
  • \r\n
  • \r\n If there are no game pieces left on the board, the game also ends.\r\n
  • \r\n
\r\n

\r\n The player who has saved the most pieces wins the game! If there is\r\n a tie, then the player who saved the most and who has the least\r\n number of casualties is the winner.\r\n

\r\n
\r\n
\r\n
\r\n
Dual Vent Variant
\r\n

\r\n If all players are human, you can select the Wild Lava Tiles variant.\r\n This adds three "wild" lava tiles that each can be played as\r\n either one lava tile type or another. For instance, there is a wild\r\n tile that can be played as either a Helmet or as a Mask.\r\n

\r\n
\r\n
\r\n
Notes on the Computer Version
\r\n

\r\n This game is based on the board game The Downfall of Pompeii,\r\n and utilizes the same rules as the board game.\r\n

\r\n

\r\n When starting the game, you can choose two (2) to four (4) players,\r\n and each player can either be a human or an AI. There are six AI\r\n players, and each uses a slightly different strategy based on\r\n different values (courage, sociability, and lawfulness).\r\n

\r\n

\r\n Game play proceeds as described above. For humans playing against AIs,\r\n you may need to click the card deck or lava tile pile in order to draw\r\n the AI's card or tile. Otherwise, the AI's should play their\r\n own pieces.\r\n

\r\n

\r\n When a human player has a choice of where to place a person, lava\r\n tile, or where to run a piece, the available choices will be\r\n highlighted, and you simply click on the one to make your choice.\r\n

\r\n

\r\n At the top right of the game board an icon will appear next to the\r\n statistics icon; clicking this will either bypass any further\r\n placement of relatives or any further running (depending on phase).\r\n

\r\n

\r\n Finally, there are some "Dev Mode" options which can be\r\n selected, which can enable/disable AI autoplay, set starting phase,\r\n allow pre-population of the board, disable the six turns of lava tile\r\n placement before pieces can run ("surprise"), and/or show\r\n the relative values the AI's place on their move choices.\r\n

\r\n

\r\n This web app is unlicensed and not intended for profit; I simply love\r\n this board game and wanted to embark on the adventure of coding it in\r\n React. If you like this game, I highly recommend purchasing the\r\n physical version.\r\n

\r\n

\r\n Any questions or comments, please email me (Brian Redd) at{\" \"}\r\n \r\n me@rbrianredd.com\r\n \r\n

\r\n
\r\n
\r\n
Boardgame Credits
\r\n

\r\n Designer: Klaus-Jü\r\n Wrede\r\n

\r\n

\r\n Dual Vent Variant: Morgan\r\n Dontanville\r\n

\r\n

\r\n Development: AMIGO Spiel +\r\n Freizeit, GmbH\r\n

\r\n

\r\n Artist: Oliver Freudenreich\r\n (contents) & Guido Hoffman (cover)\r\n

\r\n

\r\n Translation: Alex Yeager\r\n

\r\n

\r\n \r\n Production (2nd English Edition):\r\n {\" \"}\r\n Ron Magin & Pete Fenlon\r\n

\r\n

\r\n Special Thanks: Richard\r\n Bertok, Peter Bromley, Robert T. Carty, Jr., Coleman Charlton, Dan\r\n Decker, Marinda Darnell, Morgan Dontanville, Nick Johnson, Misty\r\n Kesler, Kim Marino, Marty McDonnell, Brad McWilliams, Jim Miles,\r\n Jacqui Rex, Chuck Rice, Bridget and Larry Roznai, Loren Roznai, Brad\r\n Steffen, Brian Steffen, Guido Teuber, Bill and Elaine Wordelmann, Alex\r\n and Julie Yeager\r\n

\r\n

\r\n Email:{\" \"}\r\n \r\n CustServ@mayfairgames.com\r\n \r\n

\r\n

\r\n \r\n WWW.MAYFAIRGAMES.COM\r\n \r\n

\r\n

Copyright © 2006, 2013 Mayfair Games, Inc.

\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default InstructionsModalBody;\r\n","/** @module InstructionsModal */\r\n\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Modal, ModalHeader, ModalBody, ModalFooter } from \"reactstrap\";\r\nimport { Button } from \"@material-ui/core\";\r\n\r\nimport InstructionsModalBody from \"./InstructionsModalBody\";\r\n\r\nimport actions from \"../../redux/Actions\";\r\nimport * as types from \"../../types/types\";\r\n\r\nimport \"./styles/modals.scss\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n flagsState: state.flagsState\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n toggleFlags: actions.toggleFlags\r\n};\r\n\r\n/**\r\n * @function InstructionsModal\r\n * @description Functional Container component for Instructions Modal\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst InstructionsModal = props => {\r\n const {\r\n flagsState: { flags },\r\n toggleFlags\r\n } = props;\r\n\r\n return (\r\n \r\n toggleFlags(\"rules-modal\")}>\r\n \r\n Game Rules\r\n \r\n \r\n \r\n \r\n \r\n toggleFlags(\"rules-modal\")}\r\n >\r\n \r\n Continue\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nInstructionsModal.propTypes = {\r\n flagsState: types.flagsState.types,\r\n toggleFlags: PropTypes.func\r\n};\r\n\r\nInstructionsModal.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n toggleFlags: () => {}\r\n};\r\n\r\nexport const InstructionsModalTest = InstructionsModal;\r\nexport default connect(mapStateToProps, mapDispatchToProps)(InstructionsModal);\r\n","/** @module RecommendationHighlighter */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport * as constant from \"../../data/constants\";\r\n\r\n/**\r\n * @function RecommendationHighlighter\r\n * @description Functional Presentational component for highlighting board squares\r\n * @param {Object} props\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst RecommendationHighlighter = props => {\r\n const { recommendations } = props;\r\n\r\n /**\r\n * @function recommendationHighlighter\r\n * @description generates recommendation components array\r\n * @returns {Array}\r\n */\r\n const recommendationHighlighter = recommendations.map((square, idx) => {\r\n const coords = square.square.split(\"_\");\r\n const row = parseFloat(coords[0]);\r\n const col = parseFloat(coords[1]);\r\n return (\r\n \r\n {Math.round(parseFloat(square.value) * 10) / 10}\r\n
\r\n );\r\n });\r\n\r\n return (\r\n
\r\n {recommendationHighlighter}\r\n
\r\n );\r\n};\r\n\r\nRecommendationHighlighter.propTypes = {\r\n recommendations: PropTypes.arrayOf(PropTypes.object)\r\n};\r\n\r\nRecommendationHighlighter.defaultProps = {\r\n recommendations: []\r\n};\r\n\r\nexport default RecommendationHighlighter;\r\n","/** @module Main */\r\n\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { SnackbarProvider } from \"notistack\";\r\nimport { Col, Row } from \"reactstrap\";\r\nimport _ from \"lodash\";\r\n\r\nimport * as types from \"../types/types\";\r\nimport { playPompCard } from \"./Logic/cardLogic\";\r\nimport { runToSquare } from \"./Logic/runnerLogic\";\r\n\r\nimport BoardContainer from \"./Board/BoardContainer\";\r\nimport DeckContainer from \"./Deck/DeckContainer\";\r\nimport TilesContainer from \"./Tiles/TilesContainer\";\r\nimport PlayersContainer from \"./Player/PlayersContainer\";\r\nimport PlacementHighlighter from \"./Board/PlacementHighlighter\";\r\nimport AD79Sidebar from \"./Sidebars/AD79Sidebar\";\r\nimport LavaTileSidebar from \"./Sidebars/LavaTileSidebar\";\r\nimport SnackbarNotifier from \"./Helpers/SnackbarNotifier\";\r\nimport GameOverContainer from \"./Modals/GameOverContainer\";\r\nimport StartGameContainer from \"./Modals/StartGameContainer\";\r\nimport GameStatisticsContainer from \"./Modals/GameStatisticsContainer\";\r\nimport InstructionsModal from \"./Modals/InstructionsModal\";\r\nimport RecommendationHighlighter from \"./Board/RecommendationHighlighter\";\r\n\r\n/**\r\n * @function Main\r\n * @description Functional Presentational component for Main\r\n * @param {Object} props\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst Main = props => {\r\n const {\r\n flagsState,\r\n gamePlayState,\r\n gridState,\r\n messageState,\r\n playersState,\r\n tileState,\r\n deckEnabled,\r\n cardGrid,\r\n vacancy,\r\n resolveNoPlaceToPlace,\r\n pileEnabled,\r\n dangerZone,\r\n placeLavaTile,\r\n placeRelatives,\r\n toggleFlags,\r\n placePerson\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n {messageState.stage === 2 && (\r\n \r\n
\r\n
\r\n \r\n )}\r\n \r\n \r\n {!flagsState.flags.includes(\"game-start\") && (\r\n
\r\n {flagsState.flags.includes(\"card-ad79\") && }\r\n {(flagsState.flags.includes(\"wild-lava-tile\") ||\r\n flagsState.flags.includes(\"no-place-to-place\")) && (\r\n \r\n )}\r\n {messageState.stage < 2 &&\r\n !flagsState.flags.includes(\"card-ad79\") &&\r\n !flagsState.flags.includes(\"lava-tile\") && (\r\n \r\n )}\r\n {messageState.stage === 2 &&\r\n !flagsState.flags.includes(\"card-ad79\") &&\r\n !flagsState.flags.includes(\"wild-lava-tile\") &&\r\n !flagsState.flags.includes(\"no-place-to-place\") && (\r\n \r\n )}\r\n \r\n
\r\n )}\r\n
\r\n {_.get(gamePlayState, \"gameSettings.showStrategyValues\") &&\r\n messageState.stage === 2 && (\r\n \r\n )}\r\n {(() => {\r\n if (\r\n messageState.stage < 2 &&\r\n !(\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) ||\r\n _.get(gamePlayState, \"gameSettings.showStrategyValues\")\r\n )\r\n ) {\r\n return (\r\n \r\n );\r\n }\r\n if (\r\n flagsState.runCount &&\r\n !(\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) ||\r\n _.get(gamePlayState, \"gameSettings.showStrategyValues\")\r\n )\r\n ) {\r\n return (\r\n {\r\n return true;\r\n }}\r\n activePlayer={playersState.activePlayer}\r\n />\r\n );\r\n }\r\n if (\r\n !(\r\n _.get(playersState, `details.${playersState.activePlayer}.ai`) ||\r\n _.get(gamePlayState, \"gameSettings.showStrategyValues\")\r\n )\r\n ) {\r\n return (\r\n {\r\n return true;\r\n }}\r\n activePlayer={playersState.activePlayer}\r\n />\r\n );\r\n }\r\n return
;\r\n })()}\r\n \r\n {flagsState.flags.includes(\"game-over\") && }\r\n {flagsState.flags.includes(\"game-stats\") && }\r\n {flagsState.flags.includes(\"game-start\") && }\r\n {flagsState.flags.includes(\"rules-modal\") && }\r\n \r\n );\r\n};\r\n\r\nMain.propTypes = {\r\n flagsState: types.flagsState.types,\r\n gamePlayState: types.gamePlayState.types,\r\n gridState: types.gridState.types,\r\n messageState: types.messageState.types,\r\n playersState: types.playersState.types,\r\n tileState: types.tileState.types,\r\n cardGrid: PropTypes.arrayOf(PropTypes.string),\r\n dangerZone: PropTypes.arrayOf(PropTypes.string),\r\n deckEnabled: PropTypes.bool,\r\n pileEnabled: PropTypes.bool,\r\n resolveNoPlaceToPlace: PropTypes.func,\r\n vacancy: PropTypes.func,\r\n placeLavaTile: PropTypes.func,\r\n placeRelatives: PropTypes.func,\r\n toggleFlags: PropTypes.func,\r\n placePerson: PropTypes.func\r\n};\r\n\r\nMain.defaultProps = {\r\n flagsState: types.flagsState.defaults,\r\n gamePlayState: types.gamePlayState.defaults,\r\n gridState: types.gridState.defaults,\r\n messageState: types.messageState.defaults,\r\n playersState: types.playersState.defaults,\r\n tileState: types.tileState.defaults,\r\n cardGrid: [],\r\n dangerZone: [],\r\n deckEnabled: false,\r\n pileEnabled: false,\r\n resolveNoPlaceToPlace: () => {},\r\n vacancy: () => {},\r\n placeLavaTile: () => {},\r\n placeRelatives: () => {},\r\n toggleFlags: () => {},\r\n placePerson: () => {}\r\n};\r\n\r\nexport default Main;\r\n","/** @module MainContainer */\r\n\r\nimport React, { useEffect, useCallback } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PropTypes from \"prop-types\";\r\nimport _ from \"lodash\";\r\n\r\nimport actions from \"../redux/Actions\";\r\nimport * as types from \"../types/types\";\r\nimport * as helper from \"./Logic/helperFunctions\";\r\nimport { playPompCard } from \"./Logic/cardLogic\";\r\nimport { placePerson } from \"./Logic/placePeopleLogic\";\r\nimport { placeRelatives } from \"./Logic/placeRelativesLogic\";\r\nimport * as lavaLogic from \"./Logic/lavaLogic\";\r\nimport { runForYourLives } from \"./Logic/runnerLogic\";\r\n\r\nimport Main from \"./Main\";\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n ...state\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n ...actions\r\n};\r\n\r\n/**\r\n * @function MainContainer\r\n * @description Functional Container component for Main\r\n * @returns {React.Component} - Rendered component.\r\n */\r\nconst MainContainer = props => {\r\n const {\r\n cardsState,\r\n flagsState,\r\n gamePlayState,\r\n gridState,\r\n messageState,\r\n playersState,\r\n playersState: { activePlayer },\r\n tileState,\r\n toggleFlags,\r\n incrementPlayerTurn,\r\n setRunCounter,\r\n addActivePlayer,\r\n setEruptionCounter,\r\n setLavaTile,\r\n setDangerZone\r\n } = props;\r\n\r\n /**\r\n * @function setActivePlayer\r\n * @description dispatches addActivePlayer action within useCallback\r\n * @param {String} player\r\n */\r\n const setActivePlayer = useCallback(\r\n player => {\r\n if (player !== playersState.activePlayer) {\r\n addActivePlayer(player);\r\n }\r\n },\r\n [playersState, addActivePlayer]\r\n );\r\n\r\n useEffect(() => {\r\n setActivePlayer(_.get(playersState, `players.${playersState.turn}`));\r\n }, [playersState, setActivePlayer]);\r\n\r\n /**\r\n * @function resolveNoPlaceToPlace\r\n * @description continue from no place to place\r\n */\r\n const resolveNoPlaceToPlace = () => {\r\n console.log(\"resolveNoPlaceToPlace\");\r\n if (flagsState.flags.includes(\"no-place-to-place\")) {\r\n toggleFlags(\"no-place-to-place\");\r\n }\r\n if (flagsState.flags.includes(\"placing-lava-tile\")) {\r\n toggleFlags(\"placing-lava-tile\");\r\n }\r\n setLavaTile();\r\n setDangerZone([]);\r\n if (flagsState.eruptionCount) {\r\n setEruptionCounter(flagsState.eruptionCount - 1);\r\n console.log(\r\n `%c***If ${activePlayer} is AI, should they auto-draw now?`,\r\n \"color: red; font-weight: bold\"\r\n );\r\n incrementPlayerTurn();\r\n } else if (\r\n _.get(playersState, `details.${activePlayer}.population.length`) < 1\r\n ) {\r\n console.log(\r\n `%c***If player AFTER ${activePlayer} is AI, should they auto-draw now?`,\r\n \"color: purple; font-weight: bold\"\r\n );\r\n // const nextPlayer = (playersState.turn + 1) % playersState.players.length;\r\n incrementPlayerTurn();\r\n // if (\r\n // _.get(playersState, `details.${playersState.players[nextPlayer]}.ai`) &&\r\n // !_.get(gamePlayState, \"gameSettings.autoPlayDisabled\")\r\n // ) {\r\n // setTimeout(() => {\r\n // console.log(\r\n // `%c***AI (${playersState.players[nextPlayer]}) is auto-drawing a lava tile!`,\r\n // \"color: green; font-weight: bold\"\r\n // );\r\n // lavaLogic.drawTile();\r\n // }, 1000);\r\n // }\r\n } else {\r\n console.log(\r\n `%c***If ${activePlayer} is AI, should they auto-draw now?`,\r\n \"color: red; font-weight: bold\"\r\n );\r\n setRunCounter(2);\r\n runForYourLives();\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nMainContainer.propTypes = {\r\n cardsState: types.cardsState.types,\r\n flagsState: types.flagsState.types,\r\n gamePlayState: types.gamePlayState.types,\r\n gridState: types.gridState.types,\r\n messageState: types.messageState.types,\r\n playersState: types.playersState.types,\r\n tileState: types.tileState.types,\r\n toggleFlags: PropTypes.func,\r\n incrementPlayerTurn: PropTypes.func,\r\n setRunCounter: PropTypes.func,\r\n addActivePlayer: PropTypes.func,\r\n setEruptionCounter: PropTypes.func,\r\n setLavaTile: PropTypes.func,\r\n setDangerZone: PropTypes.func\r\n};\r\n\r\nMainContainer.defaultProps = {\r\n cardsState: types.cardsState.defaults,\r\n flagsState: types.flagsState.defaults,\r\n gamePlayState: types.gamePlayState.defaults,\r\n gridState: types.gridState.defaults,\r\n messageState: types.messageState.defaults,\r\n playersState: types.playersState.defaults,\r\n tileState: types.tileState.defaults,\r\n toggleFlags: () => {},\r\n incrementPlayerTurn: () => {},\r\n setRunCounter: () => {},\r\n addActivePlayer: () => {},\r\n setEruptionCounter: () => {},\r\n setLavaTile: () => {},\r\n setDangerZone: () => {}\r\n};\r\n\r\nexport const MainContainerTest = MainContainer;\r\nexport default connect(mapStateToProps, mapDispatchToProps)(MainContainer);\r\n","/* istanbul ignore file */\n/** @module App */\n\nimport React from \"react\";\nimport { Provider } from \"react-redux\";\n\nimport \"./styles/App.scss\";\n\nimport MainContainer from \"./components/MainContainer\";\n\nimport store from \"./redux/configureStore\";\n\nfunction App() {\n return (\n \n
\n \n
\n
\n );\n}\n\nexport default App;\n","/* istanbul ignore file */\n// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","/* istanbul ignore file */\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport \"@fortawesome/fontawesome-free/css/all.css\";\nimport \"./styles/custom.scss\";\nimport \"./styles/index.scss\";\n\nimport App from \"./App\";\n\nimport * as serviceWorker from \"./serviceWorker\";\n\nReactDOM.render(, document.getElementById(\"root\"));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}