1
0

Volcano working!

Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
James Ketrenos 2022-05-29 16:44:27 -07:00
parent af83538027
commit 9cda7c17cf
3 changed files with 99 additions and 18 deletions

View File

@ -166,6 +166,7 @@ const Actions = ({
(turn.actions.indexOf('place-road') !== -1
|| turn.actions.indexOf('place-city') !== -1
|| turn.actions.indexOf('place-settlement') !== -1);
if (tradeActive
&& (!turn || !turn.actions || turn.actions.indexOf('trade'))) {
setTradeActive(false);
@ -190,6 +191,7 @@ const Actions = ({
{ name && !inLobby && <>
<Button disabled={
robberActions ||
(turn && turn.select) ||
(inGame && (!isTurn || hasRolled)) ||
(inGameOrder && hasGameOrderRolled) ||
(!inGame && !inGameOrder && (!isTurn || !volcanoActive))

View File

@ -12,9 +12,10 @@ const ChooseCard = () => {
const { ws } = useContext(GlobalContext);
const [turn, setTurn] = useState(undefined);
const [color, setColor] = useState(undefined);
const [state, setState] = useState(undefined);
const [cards, setCards] = useState([]);
const fields = useMemo(() => [
'turn', 'color'
'turn', 'color', 'state'
], []);
const onWsMessage = (event) => {
@ -28,6 +29,9 @@ const ChooseCard = () => {
if ('color' in data.update && data.update.color !== color) {
setColor(data.update.color);
}
if ('state' in data.update && data.update.state !== state) {
setState(data.update.state);
}
break;
default:
break;
@ -56,7 +60,19 @@ const ChooseCard = () => {
}));
}, [ws, cards]);
const count = (turn && turn.active === 'monopoly') ? 1 : 2;
let count = 0;
if (turn && turn.color === color) {
count = turn.active === 'monopoly' ? 1 : 2;
}
if (state === 'volcano') {
if (!turn.select) {
count = 0;
} else if (color in turn.select) {
count = turn.select[color];
} else {
count = 0;
}
}
const selectCard = useCallback((event) => {
event.target.classList.toggle('Selected');
@ -77,11 +93,9 @@ const ChooseCard = () => {
setCards(tmp);
}, [ setCards, count ]);
if (!turn
|| turn.color !== color
|| !turn.actions
|| turn.actions.indexOf('select-resources') === -1
|| !turn.active) {
if (!turn || !turn.active
|| (count === 0)
|| !turn.actions || turn.actions.indexOf('select-resources') === -1) {
return <></>;
}
@ -103,6 +117,9 @@ const ChooseCard = () => {
case 'year-of-plenty':
title = <><b>Year of Plenty</b>! Tap the two resources you want to receive from the bank!</>;
break;
case 'volcano':
title = <><b>Volcano has minerals</b>! Tap the {count} resources you want to receive from the bank!</>;
break;
default:
title = <>Unknown card type {turn.active}.</>;
break;

View File

@ -230,6 +230,7 @@ const processVolcano = (game, session, dice) => {
addChatMessage(game, session, `${name} rolled ${dice[0]} for the Volcano!`);
game.state = 'normal';
game.turn.volcano = layout.tiles[volcano].corners[dice[0] % 6];
const corner = game.placements.corners[game.turn.volcano];
if (corner.color) {
@ -296,6 +297,9 @@ const roll = (game, session, dice) => {
if (game.turn.color !== session.color) {
return `It is not your turn.`;
}
if (game.turn.select) {
return `You can not roll for the Volcano until all players have mined their resources.`;
}
processVolcano(game, session, dice);
return;
@ -451,7 +455,40 @@ const processRoll = (game, session, dice) => {
addChatMessage(game, session, `House rule 'Volcano' activated. The
Volcano is erupting! You must roll the die to determine which
direciton the lava will flow!`);
game.state = 'volcano';
let count = 0;
console.log(game.rules['volcano']);
if (game.rules['volcano'].gold) {
game.turn.select = {};
const volcano = layout.tiles.find((tile, index) =>
staticData.tiles[game.tileOrder[index]].type === 'desert');
console.log(volcano);
volcano.corners.forEach(index => {
const corner = game.placements.corners[index];
console.log({ index, corner });
if (corner.color) {
if (!(corner.color in game.turn.select)) {
game.turn.select[corner.color] = 0;
}
game.turn.select[corner.color] +=
corner.type === 'settlement' ? 1 : 2;
count += corner.type === 'settlement' ? 1 : 2;
}
});
if (count) {
game.turn.actions = [ 'select-resources' ];
if (volcano === layout.tiles[game.robber]) {
addChatMessage(game, null, `That pesky ${game.robberName} Robber Roberson blocked ${count} resources!`);
delete game.turn.selected;
} else {
addChatMessage(game, null, `House rule 'Volcanoes have minerals' activated. Players must select which resources to receive from the Volcano!`);
game.turn.active = 'volcano';
}
}
}
}
}
@ -2235,7 +2272,7 @@ const buyDevelopment = (game, session) => {
const player = session.player;
if (game.state !== 'normal') {
return `You cannot purchase a development card unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -2290,7 +2327,7 @@ const playCard = (game, session, card) => {
const name = session.name, player = session.player;
if (game.state !== 'normal') {
return `You cannot play a development card unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -2412,7 +2449,7 @@ const placeSettlement = (game, session, index) => {
const player = session.player;
index = parseInt(index);
if (game.state !== 'initial-placement' && game.state !== 'normal') {
return `You cannot place an item unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -2540,7 +2577,7 @@ const placeRoad = (game, session, index) => {
const player = session.player;
index = parseInt(index);
if (game.state !== 'initial-placement' && game.state !== 'normal') {
return `You cannot place an item unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -2858,7 +2895,7 @@ const buyRoad = (game, session) => {
const player = session.player;
if (game.state !== 'normal') {
return `You cannot purchase a road unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -2896,11 +2933,29 @@ const selectResources = (game, session, cards) => {
return `Please, let's not cheat. Ok?`;
}
if (session.color !== game.turn.color) {
if ((session.color !== game.turn.color)
&& (!game.turn.select || !(session.color in game.turn.select))) {
console.log(session.color, game.turn.color, game.turn.select);
return `It is not your turn! It is ${game.turn.name}'s turn.`;
}
const count = (game.turn.active === 'monopoly') ? 1 : 2;
let count = 2;
if (game.turn && game.turn.active === 'monopoly') {
count = 1;
}
if (game.state === 'volcano') {
if (!game.turn.select) {
count = 0;
} else if (session.color in game.turn.select) {
count = game.turn.select[session.color];
delete game.turn.select[session.color];
if (Object.getOwnPropertyNames(game.turn.select).length === 0) {
delete game.turn.select;
}
} else {
count = 0;
}
}
if (!cards || cards.length > count || cards.length === 0) {
return `You have chosen the wrong number of cards!`;
@ -2982,6 +3037,13 @@ const selectResources = (game, session, cards) => {
addChatMessage(game, session, `${session.name} player Year of Plenty.` +
`They chose to receive ${display.join(', ')} from the bank.`);
break;
case 'volcano':
cards.forEach(type => {
session.player[type]++;
session.player.resources++;
});
addChatMessage(game, session, `${session.name} player mined ${display.join(', ')} from the Volcano!`);
break;
}
delete game.turn.active;
game.turn.actions = [];
@ -2998,7 +3060,7 @@ const selectResources = (game, session, cards) => {
const buySettlement = (game, session) => {
const player = session.player;
if (game.state !== 'normal') {
return `You cannot purchase a settlement unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -3034,7 +3096,7 @@ const buySettlement = (game, session) => {
const buyCity = (game, session) => {
const player = session.player;
if (game.state !== 'normal') {
return `You cannot purchase a city unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;
@ -3070,7 +3132,7 @@ const placeCity = (game, session, index) => {
const player = session.player;
index = parseInt(index);
if (game.state !== 'normal') {
return `You cannot place an item unless the game is active.`;
return `You cannot purchase a development card unless the game is active (${game.state}).`;
}
if (session.color !== game.turn.color) {
return `It is not your turn! It is ${game.turn.name}'s turn.`;