Implemented Robin Hood Robber
Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
parent
5a83ab5a38
commit
6e3fe01df5
@ -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 */
|
||||||
|
@ -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;*/
|
||||||
}
|
}
|
||||||
|
@ -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 <></>;
|
||||||
|
@ -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",
|
||||||
|
@ -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)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user