Initial frontend AI support.

logins
Thomas Hintz 5 years ago
parent 618d95f3b0
commit 9fae201e36

@ -45,7 +45,7 @@ import { setSelectedCard, setMessagePanelSpace, setMPDims, movePlayer,
setMovingSkip } from './actions.js'
import { buy, roll, endTurn, loan, trade, submitTradeAccept,
submitTradeDeny, submitTradeCancel, audit,
buyUncleBert, skip } from './interface.js'
buyUncleBert, skip, endAiTurn } from './interface.js'
function netWorth(player) {
return ((player.assets.hay + player.assets.grain) * 2000) +
@ -1447,9 +1447,11 @@ class Moving extends React.Component {
render() {
let buttons;
if (this.props.player.name !== this.props.game.currentPlayer) {
if ((this.props.player.name !== this.props.game.currentPlayer &&
!this.props.currentPlayer.ai)) {
buttons = (<Fragment />);
} else if (this.props.ui.playerSpaces[this.props.player.color] === this.props.ui.actionValue.to) {
} else if (this.props.ui.playerSpaces[(this.props.currentPlayer.ai && this.props.currentPlayer.color) || this.props.player.color]
=== this.props.ui.actionValue.to) {
buttons = (<Button onClick={() => this.props.showNextAction()}>Continue</Button>);
} else {
buttons = (<Button onClick={() => this.skip()}>Skip</Button>);
@ -1479,7 +1481,8 @@ class Moving extends React.Component {
class Action extends React.Component {
render() {
let view, buttons;
const currentPlayer = this.props.player.name === this.props.game.currentPlayer ?
const currentPlayer = (this.props.player.name === this.props.game.currentPlayer ||
this.props.game.currentPlayer === '') ?
this.props.player : this.props.game.otherPlayers
.find(p => p.player.name === this.props.game.currentPlayer).player;
switch (this.props.ui.action) {
@ -1587,6 +1590,7 @@ class Action extends React.Component {
case 'move':
view = (<Moving showNextAction={() => this.props.showNextAction()}
key={this.props.game.currentPlayer + '|' + this.props.ui.actionValue.from + '|' + this.props.ui.actionValue.to}
currentPlayer={currentPlayer}
player={this.props.player}
game={this.props.game}
spaces={this.props.spaces}
@ -1601,6 +1605,7 @@ class Action extends React.Component {
case 'resolve-move':
view = (<Moving showNextAction={() => this.props.showNextAction()}
key={this.props.game.currentPlayer + '|' + this.props.ui.actionValue.from + '|' + this.props.ui.actionValue.to}
currentPlayer={currentPlayer}
player={this.props.player}
game={this.props.game}
spaces={this.props.spaces}
@ -1615,6 +1620,7 @@ class Action extends React.Component {
case 'goto':
view = (<Moving showNextAction={() => this.props.showNextAction()}
timerId={this.props.timerId}
currentPlayer={currentPlayer}
setTimerId={this.props.setTimerId}
player={this.props.player}
game={this.props.game}
@ -1635,11 +1641,13 @@ class Action extends React.Component {
this.props.ui.actionValue.from - 49 : this.props.ui.actionValue.from);
view = (<Rolling num={roll}
name={this.props.game.currentPlayer}
showScreen={this.props.player.name === this.props.game.currentPlayer
showScreen={(this.props.player.name === this.props.game.currentPlayer ||
currentPlayer.ai)
? () => this.props.showNextAction()
: false}
autoSkip={this.props.ui.autoSkip}
skip={this.props.player.name === this.props.game.currentPlayer}
skip={(this.props.player.name === this.props.game.currentPlayer ||
currentPlayer.ai)}
showScreenDelay={2000} />);
buttons = (<Fragment />);
break;
@ -1650,6 +1658,12 @@ class Action extends React.Component {
screen={this.props.screen}
showScreen={this.props.showScreen}
game={this.props.game} />);
} else if (currentPlayer.ai) {
view = (
<Button onClick={endAiTurn}>
Next Player's Turn
</Button>
);
} else {
view = (<Fragment>Waiting for {this.props.game.currentPlayer}</Fragment>);
}
@ -1663,7 +1677,7 @@ class Action extends React.Component {
</div>
<br />
<div className={'center'}>
{this.props.otherPlayersTurn ? (<Fragment />) : buttons}
{(this.props.otherPlayersTurn && !currentPlayer.ai ) ? (<Fragment />) : buttons}
</div>
</Col>
</Row>

@ -30,7 +30,7 @@ import { itemCard, fateCard } from 'game.js'
export { initialize, buy, roll, endTurn, loan, trade, submitTradeAccept,
submitTradeDeny, submitTradeCancel, audit, handleMessage,
nextAction, buyUncleBert, actionsFinished, skip }
nextAction, buyUncleBert, actionsFinished, skip, endAiTurn }
let store;
let movingTimer = 0;
@ -84,9 +84,14 @@ function handleMessage(evt) {
store.dispatch(updateGame(data.game));
store.dispatch(setOldMessages(oldMessages));
store.dispatch(setCards(data.player.cards));
const currentPlayer = (data.player.name === data.game.currentPlayer
|| data.game.currentPlayer === '') ?
data.player : data.game.otherPlayers
.find(p => p.player.name === data.game.currentPlayer).player;
if (data.event === 'action') {
if (data.player.name !== data.game.currentPlayer &&
data.action !== 'roll') {
data.action !== 'roll' &&
!currentPlayer.ai) {
store.dispatch(nextUIAction());
}
store.dispatch(setNextAction(data.action, data.value));
@ -136,6 +141,10 @@ function endTurn() {
sendCommand({ type: 'turn-ended' });
}
function endAiTurn() {
sendCommand({ type: 'end-ai-turn' });
}
function loan(amount) {
sendCommand({ type: 'loan', amount: amount });
}
@ -192,10 +201,16 @@ function initialize(st, sc) {
rollTimer = false,
movingAction = { from: 99, to: 99 },
handledResolveMove = true;
const unsubscribe = store.subscribe(
() => {
const state = store.getState();
if (state.farm.player.name === state.farm.game.currentPlayer
const currentPlayer = (state.farm.player.name === state.farm.game.currentPlayer
|| state.farm.game.currentPlayer === '') ?
state.farm.player : state.farm.game.otherPlayers
.find(p => p.player.name === state.farm.game.currentPlayer).player;
if ((state.farm.player.name === state.farm.game.currentPlayer ||
(currentPlayer.ai)) // TODO add test for first player, or something. only one player should be doing this
&& !state.farm.ui.actionChangeHandled) {
store.dispatch(markActionChangeHandled());
nextAction();

@ -95,7 +95,8 @@ const initialState = {
space: 0,
hayDoubled: false,
cornDoubled: false,
trade: {}
trade: {},
ai: false
},
game: { calledAudit: false,
currentPlayer: '',

Loading…
Cancel
Save