1
0

Implemented Robin Hood Robber

Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
James Ketrenos 2022-03-27 01:59:25 -07:00
parent 5a83ab5a38
commit 6e3fe01df5
5 changed files with 58 additions and 26 deletions

View File

@ -168,6 +168,7 @@ body {
right: 0; right: 0;
bottom: 0; bottom: 0;
} }
.Table .ChooseCard { .Table .ChooseCard {
display: flex; display: flex;
position: relative; position: relative;
@ -187,7 +188,6 @@ body {
padding: 0.25rem 0.55rem; padding: 0.25rem 0.55rem;
} }
.Table button:disabled { .Table button:disabled {
opacity: 0.5; opacity: 0.5;
border: 1px solid #ccc; /* why !important */ border: 1px solid #ccc; /* why !important */

View File

@ -19,7 +19,6 @@
margin: 0.5em; margin: 0.5em;
width: 40em; width: 40em;
display: inline-flex; display: inline-flex;
padding: 0.5em;
flex-direction: column; flex-direction: column;
} }
@ -34,16 +33,22 @@
.HouseRules .HouseRule { .HouseRules .HouseRule {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: flex-start;
padding: 0 0.5rem;
} }
.HouseRules .Title { .HouseRules .Title {
padding-bottom: 0.5rem;
align-self: center; align-self: center;
padding: 2px; padding: 0.5rem;
font-weight: bold; font-weight: bold;
margin-bottom: 0.5em; margin-bottom: 0.5em;
} }
.HouseRules .HouseRule[data-enabled="true"] {
background-color: rgb(255, 254, 206);
}
.HouseRules .HouseRule b { .HouseRules .HouseRule b {
margin: 0;/* 0.25rem;*/ margin: 0;/* 0.25rem;*/
} }

View File

@ -108,13 +108,14 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
const setRule = useCallback((event, key) => { const setRule = useCallback((event, key) => {
const rules = houseRules ? Object.assign({}, houseRules) : {}; const rules = houseRules ? Object.assign({}, houseRules) : {};
if (!(key in rules)) { if (!(key in rules)) {
rules[key] = { enabled: true }; 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}`);
setHouseRules(rules); setHouseRules(rules);
ws.send(JSON.stringify({ ws.send(JSON.stringify({
type: 'rules', type: 'rules',
houseRules houseRules: rules
})); }));
}, [ws, houseRules]); }, [ws, houseRules]);
@ -185,11 +186,8 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
}, { }, {
title: `Robin Hood robber`, title: `Robin Hood robber`,
key: `robin-hood-robber`, key: `robin-hood-robber`,
description: `Robbers can't steal from players with fewer than two victory points.`, description: `Robbers can't steal from players with two or less victory points.`,
element: <NotImplemented {...{ element: <></>
ws, houseRules,
field: `robin-hood-robber`
}} />,
}, { }, {
title: `Crime and Punishment`, title: `Crime and Punishment`,
key: `crime-and-punishment`, key: `crime-and-punishment`,
@ -206,7 +204,8 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
ws, houseRules, ws, houseRules,
field: `credit` field: `credit`
}} />, }} />,
} ].map(item => { } ]
.map(item => {
const disabled = (state !== 'lobby'), const disabled = (state !== 'lobby'),
defaultChecked = houseRules defaultChecked = houseRules
&& (item.key in houseRules) && (item.key in houseRules)
@ -214,19 +213,24 @@ const HouseRules = ({ houseRulesActive, setHouseRulesActive }) => {
: false; : false;
console.log(`house-rules - ${item.key} - `, console.log(`house-rules - ${item.key} - `,
{ houseRules, defaultChecked, disabled }); { houseRules, defaultChecked, disabled });
return <div className="HouseRule" data-disabled={disabled} key={item.key}> return <div className="HouseRule"
data-enabled={
houseRules
&& item.key in houseRules
&& houseRules[item.key].enabled}
data-disabled={disabled} key={item.key}>
<div className="HouseSelector"> <div className="HouseSelector">
<div><b>{item.title}</b>: {item.description}</div> <div><b>{item.title}</b>: {item.description}</div>
<Switch <Switch
inputProps={{ 'aria-label': 'controlled' }} inputProps={{ 'aria-label': 'controlled' }}
checked={defaultChecked} value={defaultChecked}
onChange={(e) => setRule(e, item.key)} onChange={(e) => setRule(e, item.key)}
{...{ disabled }} /> {...{ disabled }} />
</div> </div>
{ defaultChecked && item.element } { defaultChecked && item.element }
</div> </div>
})); }));
}, [houseRules, setRules ]); }, [houseRules, setRules, setRule ]);
if (!houseRulesActive) { if (!houseRulesActive) {
return <></>; return <></>;

View File

@ -2,7 +2,6 @@
"name": "peddlers-of-ketran-server", "name": "peddlers-of-ketran-server",
"version": "1.0.0", "version": "1.0.0",
"main": "app.js", "main": "app.js",
"devDependencies": {},
"scripts": { "scripts": {
"start": "export $(cat ../.env | xargs) && node app.js" "start": "export $(cat ../.env | xargs) && node app.js"
}, },
@ -19,6 +18,7 @@
"express": "^4.17.3", "express": "^4.17.3",
"express-session": "^1.17.1", "express-session": "^1.17.1",
"express-ws": "^5.0.2", "express-ws": "^5.0.2",
"fast-deep-equal": "^3.1.3",
"handlebars": "^4.7.6", "handlebars": "^4.7.6",
"moment": "^2.24.0", "moment": "^2.24.0",
"morgan": "^1.9.1", "morgan": "^1.9.1",

View File

@ -6,8 +6,8 @@ const express = require("express"),
{ readFile, writeFile } = require("fs").promises, { readFile, writeFile } = require("fs").promises,
fs = require("fs"), fs = require("fs"),
accessSync = fs.accessSync, accessSync = fs.accessSync,
randomWords = require("random-words"); randomWords = require("random-words"),
equal = require("fast-deep-equal");
const layout = require('./layout.js'); const layout = require('./layout.js');
const MAX_SETTLEMENTS = 5; const MAX_SETTLEMENTS = 5;
@ -292,8 +292,19 @@ const distributeResources = (game, roll) => {
if (!tile.robber) { if (!tile.robber) {
receives[active.color][resource.type] += count; receives[active.color][resource.type] += count;
} else { } else {
trackTheft(game, active.color, 'robber', resource.type, count); if (`robin-hood-robber` in game.houseRules
receives.robber[resource.type] += count; && game.houseRules[`robin-hood-robber`].enabled
&& game.players[active.color].points <= 2) {
addChatMessage(game, null, `Robber does not steal ${count}
${resource.type} from ${game.players[active.color].name} ` +
`due to Robin Hood Robber house rule.`);
console.log(`robin-hood-robber`, game.players[active.color],
active.color);
receives[active.color][resource.type] += count;
} else {
trackTheft(game, active.color, 'robber', resource.type, count);
receives.robber[resource.type] += count;
}
} }
} }
}) })
@ -1277,7 +1288,8 @@ const calculateRoadLengths = (game, session) => {
if (debug.road) console.log('Graphs B:', graphs); if (debug.road) console.log('Graphs B:', graphs);
if (debug.road) console.log('Pre update:', game.placements.roads.filter(road => road.color)); if (debug.road) console.log('Pre update:',
game.placements.roads.filter(road => road.color));
for (let color in game.players) { for (let color in game.players) {
if (game.players[color] === 'Not active') { if (game.players[color] === 'Not active') {
@ -1299,7 +1311,8 @@ const calculateRoadLengths = (game, session) => {
game.placements.roads.forEach(road => delete road.walking); game.placements.roads.forEach(road => delete road.walking);
if (debug.road) console.log('Post update:', game.placements.roads.filter(road => road.color)); if (debug.road) console.log('Post update:',
game.placements.roads.filter(road => road.color));
let checkForTies = false; let checkForTies = false;
@ -2566,8 +2579,12 @@ const setHouseRules = (game, session, houseRules) => {
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 houseRules) {
if (equal(game.houseRules[rule], houseRules[rule])) {
continue;
}
switch (rule) { switch (rule) {
case 'victory-points': case 'victory-points':
if (!('points' in houseRules[rule])) { if (!('points' in houseRules[rule])) {
@ -2584,10 +2601,16 @@ const setHouseRules = (game, session, houseRules) => {
} }
game.houseRules[rule] = houseRules[rule]; game.houseRules[rule] = houseRules[rule];
break; break;
case 'robin-hood-robber':
addChatMessage(game, null,
`${getName(session)} has ${houseRules[rule].enabled ? 'en' : 'dis'}abled the Robin Hood Robber house rule.`);
game.houseRules[rule] = houseRules[rule];
break;
default: default:
return `Rule ${rule} not recognized.`; return `Rule ${rule} not recognized.`;
} }
} }
sendUpdateToPlayers(game, { sendUpdateToPlayers(game, {
rules: game.houseRules, rules: game.houseRules,
chat: game.chat chat: game.chat
@ -3275,7 +3298,8 @@ const sendUpdateToPlayer = async (game, session, update) => {
}); });
if (!session.ws) { if (!session.ws) {
console.log(`${session.id}: -> sendUpdateToPlayer: Currently no connection.`); console.log(`${session.id}: -> sendUpdateToPlayer: ` +
`Currently no connection.`);
} else { } else {
session.ws.send(message); session.ws.send(message);
} }
@ -3379,9 +3403,8 @@ const calculatePoints = (game, update) => {
} }
}); });
if (player.points === currentPoints) { if (player.points === currentPoints) {
return; continue;
} }
if (player.points < getVictoryPointRule(game)) { if (player.points < getVictoryPointRule(game)) {