{"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 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 On your turn, you take three (3) actions, in the following order:\r\n
\r\n\r\n The Pompeii cards contain 3 important pieces\r\n of information:\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\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\nFrom now on, there are two new rules:
\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\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 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\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 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\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\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 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\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 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\nThe game ends one of two ways:
\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 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 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 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\nCopyright © 2006, 2013 Mayfair Games, Inc.
\r\n