1
0

Fixed some ACCEPT boxes in trades so only perfect matches are accept.

Moved "Offer" button to try and make it more clear when you need to submit a new offer

Fixed meetClicked to update the offer text and resource counts.

Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
James Ketrenos 2022-02-26 14:58:07 -08:00
parent 09690ee4e0
commit 1ca27a51f3
2 changed files with 60 additions and 29 deletions

View File

@ -102,11 +102,20 @@ const Trade = ({table}) => {
gives: offer.gets.slice(),
gets: offer.gives.slice()
};
console.log(trade);
trade.gives.forEach(give => giveCount(give.type, give.count));
trade.gets.forEach(get => getCount(get.type, get.count));
table.offerTrade(trade);
}, [giveCount, getCount]);
let tmp = {};
trade.gives.forEach(give => {
tmp[give.type] = give.count;
});
setGives(tmp);
tmp = {};
trade.gets.forEach(get => {
tmp[get.type] = get.count;
});
setGets(tmp);
}, [giveCount, getCount, setGives, setGets]);
if (!table.game) {
return (<></>);
@ -194,26 +203,44 @@ const Trade = ({table}) => {
if (table.game.turn.offer) {
players.forEach(trade => {
let valid = trade.gets.length && trade.gives.length;
trade.gets.forEach(resource => {
if (!valid) {
trade.valid = trade.gets.length
&& trade.gives.length
&& trade.gets.length === game.turn.offer.gives.length
&& trade.gives.length === game.turn.offer.gets.length;
if (!trade.valid) {
return;
}
trade.gets.forEach(get => {
if (!trade.valid) {
return;
}
if (resource.type !== 'bank') {
const offer = table.game.turn.offer.gives.find(item => item.type === resource.type);
valid = offer && (offer.count >= resource.count);
if (get.type !== 'bank') {
const offer = table.game.turn.offer.gives.find(give => give.type === get.type);
trade.valid = offer && (offer.count === get.count);
} else {
valid = false;
/* Doesn't matter what the resource type is so long as there
* are enough of the one kind */
table.game.turn.offer.gives.forEach(offer => {
if (offer.count >= resource.count) {
valid = true;
}
});
trade.valid = table.game.turn.offer.gives[0].count === get.count;
}
});
trade.valid = valid;
if (!trade.valid) {
return;
}
trade.gives.forEach(give => {
if (!trade.valid) {
return;
}
if (give.type !== '*') {
const offer = table.game.turn.offer.gets.find(get => give.type === get.type);
trade.valid = offer && (offer.count === give.count);
} else {
/* Doesn't matter what the resource type is so long as there
* are enough of the one kind */
trade.valid = table.game.turn.offer.gets[0].count === give.count;
}
})
});
canAccept = true;
@ -238,6 +265,7 @@ const Trade = ({table}) => {
</div>
</div>;
}
const gets = item.gets.map(get =>
`${get.count} ${(get.type === 'bank') ? 'of any one resource' : get.type}`)
.join(', '),
@ -281,6 +309,9 @@ const Trade = ({table}) => {
{ players }
</div>
{ !player.haveResources && <b>You have no resources to participate in this trade.</b> }
<Button disabled={getLine === 'nothing' || giveLine === 'nothing'}
onClick={offerClicked}>Offer to give {giveLine} in exchange for {getLine}</Button>
{ player.haveResources &&
<div className='TradeLine'
style={{
@ -288,7 +319,7 @@ const Trade = ({table}) => {
alignItems: 'flex-start'
}}>
<div style={{display: 'flex' }}>
<b>You want to receive {getLine}.</b>
<b>You want to receive {getLine}:</b>
</div>
<div style={{display: 'flex' }}>
<ResourceCounter count={gets.brick} onCount={getCount} type='brick'/>
@ -298,7 +329,7 @@ const Trade = ({table}) => {
<ResourceCounter count={gets.stone} onCount={getCount} type='stone'/>
</div>
<div style={{display: 'flex' }}>
<b>You are willing to give {giveLine}.</b>
<b>You are willing to give {giveLine}:</b>
</div>
<div style={{display: 'flex' }}>
{ player.brick > 0 && <ResourceCounter count={gives.brick} onCount={giveCount} type='brick' max={player.brick}/> }
@ -309,8 +340,6 @@ const Trade = ({table}) => {
</div>
</div>
}
<Button disabled={getLine === 'nothing' || giveLine === 'nothing'}
onClick={offerClicked}>Offer</Button>
{ isTurn && <Button onClick={cancelClicked}>cancel</Button> }
</Paper>
</div>

View File

@ -1372,17 +1372,19 @@ const isSameOffer = (player, offer) => {
return same;
};
const checkOffer = (game, player, offer) => {
/* Verifies player can make the offer */
const checkPlayerOffer = (game, player, offer) => {
let error = undefined;
console.log({
player: getPlayerName(game, player),
gets: player.gets,
gives: player.gives
}, {
name: offer.name,
name: getPlayerName(game, player),
gets: offer.gets,
gives: offer.gives
gives: offer.gives,
sheep: player.sheep,
wheat: player.wheat,
brick: player.brick,
stone: player.stone,
wood: player.wood,
});
offer.gives.forEach(give => {
@ -1589,7 +1591,7 @@ router.put("/:id/:action/:value?", async (req, res) => {
if (value === 'offer') {
const offer = req.body;
error = checkOffer(game, session.player, offer);
error = checkPlayerOffer(game, session.player, offer);
if (error) {
break;
}
@ -1632,7 +1634,7 @@ router.put("/:id/:action/:value?", async (req, res) => {
const offer = req.body;
let target;
error = checkOffer(game, session.player, offer);
error = checkPlayerOffer(game, session.player, offer);
if (error) {
break;
}