Initial frontend AI support.
This commit is contained in:
@@ -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: '',
|
||||
|
||||
Reference in New Issue
Block a user