1
0

Implemented Tiles Start Down

Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
James Ketrenos 2022-03-28 14:39:19 -07:00
parent 502bccdc68
commit 394b86e38f
4 changed files with 90 additions and 73 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

@ -47,11 +47,13 @@ const Board = () => {
const [ turn, setTurn ] = useState({}); const [ turn, setTurn ] = useState({});
const [ state, setState ] = useState(""); const [ state, setState ] = useState("");
const [ color, setColor ] = useState(""); const [ color, setColor ] = useState("");
const [ rules, setRules ] = useState({});
const [ longestRoadLength, setLongestRoadLength ] = useState(0); const [ longestRoadLength, setLongestRoadLength ] = useState(0);
const fields = useMemo(() => [ const fields = useMemo(() => [
'signature', 'robber', 'robberName', 'signature', 'robber', 'robberName',
'pips', 'pipOrder', 'borders', 'borderOrder', 'tiles', 'tileOrder', 'pips', 'pipOrder', 'borders', 'borderOrder', 'tiles', 'tileOrder',
'placements', 'turn', 'state', 'color', 'longestRoadLength' 'placements', 'turn', 'state', 'color', 'longestRoadLength',
'rules'
], []); ], []);
console.log(`board - ws`, ws); console.log(`board - ws`, ws);
@ -68,7 +70,8 @@ const Board = () => {
setRobber(data.update.robber); setRobber(data.update.robber);
} }
if ('robberName' in data.update && data.update.robberName !== robberName) { if ('robberName' in data.update
&& data.update.robberName !== robberName) {
setRobberName(data.update.robberName); setRobberName(data.update.robberName);
} }
@ -76,6 +79,11 @@ const Board = () => {
setState(data.update.state); setState(data.update.state);
} }
if ('rules' in data.update
&& !equal(data.update.rules, rules)) {
setRules(data.update.rules);
}
if ('color' in data.update && data.update.color !== color) { if ('color' in data.update && data.update.color !== color) {
setColor(data.update.color); setColor(data.update.color);
} }
@ -485,8 +493,15 @@ const Board = () => {
const tile = Object.assign({}, const tile = Object.assign({},
tiles[order], tiles[order],
{ index: index++, left: x, top: y}); { index: index++, left: x, top: y});
if ('tiles-start-facing-down' in rules
&& rules[`tiles-start-facing-down`].enabled
&& state !== 'normal'
&& state !== 'winner') {
tile.type = 'jungle';
tile.card = 0;
}
let div = <Tile let div = <Tile
key={`${tile.type}-${tile.card}`} key={`tile-${order}`}
tile={tile} tile={tile}
/>; />;
if (++rowCount === rows[row]) { if (++rowCount === rows[row]) {
@ -550,7 +565,7 @@ const Board = () => {
}, [ }, [
signature, generated, signature, generated,
pips, pipOrder, borders, borderOrder, tiles, tileOrder, pips, pipOrder, borders, borderOrder, tiles, tileOrder,
ws ws, state, rules
]); ]);
/* Re-render turn info after every render */ /* Re-render turn info after every render */

View File

@ -9,32 +9,32 @@ import "./HouseRules.css";
import { GlobalContext } from "./GlobalContext.js"; import { GlobalContext } from "./GlobalContext.js";
const VictoryPoints = ({ ws, houseRules, field }) => { const VictoryPoints = ({ ws, rules, field }) => {
const minVP = 10; const minVP = 10;
const [points, setPoints] = useState(houseRules[field].points || minVP); const [points, setPoints] = useState(rules[field].points || minVP);
console.log(`house-rules - ${field} - `, houseRules[field]); console.log(`house-rules - ${field} - `, rules[field]);
if (!(field in houseRules)) { if (!(field in rules)) {
houseRules[field] = { rules[field] = {
points: minVP points: minVP
} }
}; };
if (houseRules[field].points && houseRules[field].points !== points) { if (rules[field].points && rules[field].points !== points) {
setPoints(houseRules[field].points); setPoints(rules[field].points);
} }
const update = (value) => { const update = (value) => {
let points = (houseRules[field].points || minVP) + value; let points = (rules[field].points || minVP) + value;
if (points < minVP) { if (points < minVP) {
return; return;
} }
if (points !== houseRules[field].points) { if (points !== rules[field].points) {
setPoints(points); setPoints(points);
houseRules[field].points = points; rules[field].points = points;
ws.send(JSON.stringify({ ws.send(JSON.stringify({
type: 'rules', type: 'rules',
houseRules rules: rules
})); }));
} }
}; };
@ -52,9 +52,8 @@ const NotImplemented = () => {
const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => { const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
const { ws } = useContext(GlobalContext); const { ws } = useContext(GlobalContext);
const [houseRules, setHouseRules] = useState(undefined); const [rules, setRules] = useState(undefined);
const [state, setState] = useState(undefined); const [state, setState] = useState(undefined);
const [rules, setRules] = useState([]);
const [ruleElements, setRuleElements] = useState([]); const [ruleElements, setRuleElements] = useState([]);
const fields = useMemo(() => [ const fields = useMemo(() => [
'state', 'rules' 'state', 'rules'
@ -67,10 +66,11 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
if ('state' in data.update && data.update.state !== state) { if ('state' in data.update && data.update.state !== state) {
setState(data.update.state); setState(data.update.state);
} }
if ('rules' in data.update && !equal(data.update.rules, houseRules)) { if ('rules' in data.update
&& !equal(data.update.rules, rules)) {
console.log(`house-rules - setting house rules to `, console.log(`house-rules - setting house rules to `,
data.update.rules); data.update.rules);
setHouseRules(data.update.rules); setRules(data.update.rules);
} }
break; break;
default: default:
@ -104,45 +104,43 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
}*/ }*/
}, [setHouseRulesActive]);//ws, HouseRulesDismissed, setHouseRulesDismissed]); }, [setHouseRulesActive]);//ws, HouseRulesDismissed, setHouseRulesDismissed]);
console.log(`house-rules - render - `, { houseRules }); console.log(`house-rules - render - `, { rules });
const setRule = useCallback((event, key) => { const setRule = useCallback((event, key) => {
const rules = houseRules ? Object.assign({}, houseRules) : {};
if (!(key in rules)) { if (!(key in rules)) {
rules[key] = { enabled: false }; rules[key] = { enabled: false };
} }
rules[key].enabled = !rules[key].enabled; rules[key].enabled = !rules[key].enabled;
console.log(`house-rules - set ${key} - ${rules[key].enabled}`); console.log(`house-rules - set ${key} - ${rules[key].enabled}`);
setHouseRules(rules); setRules(Object.assign({}, rules));
ws.send(JSON.stringify({ ws.send(JSON.stringify({
type: 'rules', type: 'rules',
houseRules: rules rules
})); }));
}, [ws, houseRules]); }, [ws, rules]);
useEffect(() => { useEffect(() => {
const _rules = [ { setRuleElements([ {
title: `More victory points`, title: `More victory points`,
key: `victory-points`, key: `victory-points`,
description: `Customize how many Victory Points are required to win. ` + description: `Customize how many Victory Points are required to win.`,
`The minimum number of Victory Points is 10.`, element: <VictoryPoints {...{ ws, rules,
element: <VictoryPoints {...{ ws, houseRules,
field: `victory-points` }}/>, field: `victory-points` }}/>,
implemented: true implemented: true
}, { }, {
title: `Tiles start facing down`, title: `Tiles start facing down`,
key: `tiles-start-facing-down`, key: `tiles-start-facing-down`,
description: `Flip resource tiles upside - down while placing starting settlements.`, description: `Resource tiles start upside-down while placing starting settlements.`,
element: <NotImplemented {...{ element: <div>Once all players have placed their initial settlements
ws, houseRules, and roads, the tiles are flipped and you discover what the
field: `tiles-start-facing-down` resources are.</div>,
}} />, implemented: true
}, { }, {
title: `Bribery`, title: `Bribery`,
key: `bribery`, key: `bribery`,
description: `Dissuade enemies from robbing you by offering resources voluntarily.`, description: `Dissuade enemies from robbing you by offering resources voluntarily.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `bribery` field: `bribery`
}} />, }} />,
}, { }, {
@ -150,7 +148,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `king-of-the-hill`, key: `king-of-the-hill`,
description: `Keep your lead for one full turn after you reach max victory points.`, description: `Keep your lead for one full turn after you reach max victory points.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `king-of-the-hill` field: `king-of-the-hill`
}} />, }} />,
}, { }, {
@ -158,7 +156,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `everyone-gets-one-reroll`, key: `everyone-gets-one-reroll`,
description: `Each player gets one chance re - roll at any point.`, description: `Each player gets one chance re - roll at any point.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `everyone-gets-one-reroll` field: `everyone-gets-one-reroll`
}} />, }} />,
}, { }, {
@ -166,7 +164,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `the-bridge`, key: `the-bridge`,
description: `Build a super-bridge across one resource tile.`, description: `Build a super-bridge across one resource tile.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `the-bridge` field: `the-bridge`
}} />, }} />,
}, { }, {
@ -174,7 +172,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `discard-desert`, key: `discard-desert`,
description: `Scrap the desert in favour of an additional resource tile.`, description: `Scrap the desert in favour of an additional resource tile.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `discard-desert` field: `discard-desert`
}} />, }} />,
}, { }, {
@ -182,7 +180,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `roll-double-roll-again`, key: `roll-double-roll-again`,
description: `Roll again if you roll two of the same number.`, description: `Roll again if you roll two of the same number.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `roll-double-roll-again` field: `roll-double-roll-again`
}} />, }} />,
}, { }, {
@ -196,7 +194,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `crime-and-punishment`, key: `crime-and-punishment`,
description: `Change how the robber works to make Catan more or less competitive.`, description: `Change how the robber works to make Catan more or less competitive.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `crime-and-punishment` field: `crime-and-punishment`
}} />, }} />,
}, { }, {
@ -204,7 +202,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
key: `credit`, key: `credit`,
description: `Trade with resources you don't have.`, description: `Trade with resources you don't have.`,
element: <NotImplemented {...{ element: <NotImplemented {...{
ws, houseRules, ws, rules,
field: `credit` field: `credit`
}} />, }} />,
} ] } ]
@ -220,24 +218,20 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
return +1; return +1;
} }
return A.title.localeCompare(); return A.title.localeCompare();
}); })
setRules(_rules);
setRuleElements(_rules
.map(item => { .map(item => {
const disabled = (state !== 'lobby' || !item.implemented), const disabled = (state !== 'lobby' || !item.implemented),
defaultChecked = houseRules defaultChecked = rules
&& (item.key in houseRules) && (item.key in rules)
? houseRules[item.key].enabled ? rules[item.key].enabled
: false; : false;
console.log(`house-rules - ${item.key} - `, console.log(`house-rules - ${item.key} - `,
{ houseRules, defaultChecked, disabled }); { rules, defaultChecked, disabled });
return <div className="HouseRule" return <div className="HouseRule"
data-enabled={ data-enabled={
houseRules rules
&& item.key in houseRules && item.key in rules
&& houseRules[item.key].enabled} && rules[item.key].enabled}
data-disabled={disabled} data-disabled={disabled}
key={item.key} key={item.key}
data-key={item.key}> data-key={item.key}>
@ -254,7 +248,7 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
{ defaultChecked && item.element } { defaultChecked && item.element }
</div> </div>
})); }));
}, [houseRules, setRules, setRule ]); }, [rules, setRules, setRuleElements, state, ws ]);
if (!houseRulesActive) { if (!houseRulesActive) {
return <></>; return <></>;

View File

@ -292,8 +292,8 @@ const distributeResources = (game, roll) => {
if (!tile.robber) { if (!tile.robber) {
receives[active.color][resource.type] += count; receives[active.color][resource.type] += count;
} else { } else {
if (`robin-hood-robber` in game.houseRules if (`robin-hood-robber` in game.rules
&& game.houseRules[`robin-hood-robber`].enabled && game.rules[`robin-hood-robber`].enabled
&& game.players[active.color].points <= 2) { && game.players[active.color].points <= 2) {
addChatMessage(game, null, `Robber does not steal ${count} addChatMessage(game, null, `Robber does not steal ${count}
${resource.type} from ${game.players[active.color].name} ` + ${resource.type} from ${game.players[active.color].name} ` +
@ -2568,43 +2568,51 @@ const placeRoad = (game, session, index) => {
const getVictoryPointRule = (game) => { const getVictoryPointRule = (game) => {
const minVP = 10; const minVP = 10;
if (!('victory-points' in game.houseRules) if (!('victory-points' in game.rules)
|| !game.houseRules['victory-points'].enabled) { || !game.rules['victory-points'].enabled) {
return minVP; return minVP;
} }
return game.houseRules['victory-pionts'].points; return game.rules['victory-pionts'].points;
} }
const setHouseRules = (game, session, houseRules) => { const setRules = (game, session, rules) => {
if (game.state !== 'lobby') { if (game.state !== 'lobby') {
return `You can not modify House Rules once the game has started.`; return `You can not modify House Rules once the game has started.`;
} }
for (let rule in houseRules) { for (let rule in rules) {
if (equal(game.houseRules[rule], houseRules[rule])) { if (equal(game.rules[rule], rules[rule])) {
continue; continue;
} }
switch (rule) { switch (rule) {
case 'victory-points': case 'victory-points':
if (!('points' in houseRules[rule])) { if (!('points' in rules[rule])) {
return `No points specified for victory-points`; return `No points specified for victory-points`;
} }
if (!houseRules[rule].enabled) { if (!rules[rule].enabled) {
addChatMessage(game, null, addChatMessage(game, null,
`${getName(session)} has disabled the Victory Point ` + `${getName(session)} has disabled the Victory Point ` +
`house rule.`); `house rule.`);
} else { } else {
addChatMessage(game, null, addChatMessage(game, null,
`${getName(session)} set the minimum Victory Points to ` + `${getName(session)} set the minimum Victory Points to ` +
`${houseRules[rule].points}`); `${rules[rule].points}`);
} }
game.houseRules[rule] = houseRules[rule]; game.rules[rule] = rules[rule];
break;
case 'tiles-start-facing-down':
addChatMessage(game, null,
`${getName(session)} has ${rules[rule].enabled ? 'en' : 'dis'}abled the Tiles Start Facing Down house rule.`);
if (rules[rule].enabled) {
shuffle(game, session);
}
game.rules[rule] = rules[rule];
break; break;
case 'robin-hood-robber': case 'robin-hood-robber':
addChatMessage(game, null, addChatMessage(game, null,
`${getName(session)} has ${houseRules[rule].enabled ? 'en' : 'dis'}abled the Robin Hood Robber house rule.`); `${getName(session)} has ${rules[rule].enabled ? 'en' : 'dis'}abled the Robin Hood Robber house rule.`);
game.houseRules[rule] = houseRules[rule]; game.rules[rule] = rules[rule];
break; break;
default: default:
return `Rule ${rule} not recognized.`; return `Rule ${rule} not recognized.`;
@ -2612,7 +2620,7 @@ const setHouseRules = (game, session, houseRules) => {
} }
sendUpdateToPlayers(game, { sendUpdateToPlayers(game, {
rules: game.houseRules, rules: game.rules,
chat: game.chat chat: game.chat
}); });
}; };
@ -3725,7 +3733,7 @@ router.ws("/ws/:id", async (ws, req) => {
update[field] = game[field]; update[field] = game[field];
break; break;
case 'rules': case 'rules':
update[field] = game.houseRules ? game.houseRules : {}; update[field] = game.rules ? game.rules : {};
break; break;
case 'name': case 'name':
update.name = session.name; update.name = session.name;
@ -3949,8 +3957,8 @@ router.ws("/ws/:id", async (ws, req) => {
break; break;
case 'rules': case 'rules':
console.log(`${short} - <- rules:${getName(session)} - `, console.log(`${short} - <- rules:${getName(session)} - `,
data.houseRules); data.rules);
warning = setHouseRules(game, session, data.houseRules); warning = setRules(game, session, data.rules);
if (warning) { if (warning) {
sendWarning(session, warning); sendWarning(session, warning);
} }
@ -4303,7 +4311,7 @@ const createGame = (id) => {
sessions: {}, sessions: {},
unselected: [], unselected: [],
active: 0, active: 0,
houseRules: { rules: {
'victory-points': { 'victory-points': {
points: 10 points: 10
} }