diff --git a/src/components/farm/Board.jsx b/src/components/farm/Board.jsx index ce6da44..36d694b 100644 --- a/src/components/farm/Board.jsx +++ b/src/components/farm/Board.jsx @@ -31,7 +31,7 @@ import { connect } from 'react-redux' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faUser, faUsers, faTractor, faWindowRestore, faDollarSign, faTimes, faAsterisk, faExchangeAlt, - faInfoCircle } from '@fortawesome/free-solid-svg-icons' + faInfoCircle, faArrowUp } from '@fortawesome/free-solid-svg-icons' import { GroupBox, Row, Col, Button } from '../widgets.jsx' import SpaceNode from './SpaceNode.jsx' @@ -47,17 +47,17 @@ import { buy, roll, endTurn, loan, trade, submitTradeAccept, function netWorth(player) { return ((player.assets.hay + player.assets.grain) * 2000) + - (player.assets.fruit * 5000) + - (player.assets.cows * 500) + - ((player.assets.harvester + player.assets.tractor) * 10000) + - player.displayCash - player.debt; + (player.assets.fruit * 5000) + + (player.assets.cows * 500) + + ((player.assets.harvester + player.assets.tractor) * 10000) + + player.displayCash - player.debt; } function assetsValue(player) { return ((player.assets.hay + player.assets.grain) * 2000) + - (player.assets.fruit * 5000) + - (player.assets.cows * 500) + - ((player.assets.harvester + player.assets.tractor) * 10000); + (player.assets.fruit * 5000) + + (player.assets.cows * 500) + + ((player.assets.harvester + player.assets.tractor) * 10000); } function getElementValue(id) { @@ -120,10 +120,10 @@ class PlayerTradeProposed extends React.Component { return (

You GAIN something if it is POSITIVE and you GIVE something if it is NEGATIVE.

); } else if (this.props.player.trade.originator === this.props.player.name) { return (

You proposed a trade with {this.props.player.trade.player} for - {'\u00A0'}{tradeString(this.props.player, false)}.

); + {'\u00A0'}{tradeString(this.props.player, false)}.

); } else { return (

{this.props.player.trade.originator} proposed a trade for - {'\u00A0'}{tradeString(this.props.player, true)}.

); + {'\u00A0'}{tradeString(this.props.player, true)}.

); } } } @@ -161,11 +161,11 @@ class PlayerTradeButton extends React.Component { return (); } else { return ( - - - ); + + + ); } } } @@ -177,9 +177,12 @@ class ResourceUnit extends React.Component {
- {this.props.img ? () : ()} - {this.props.children} + borderTop: '3px solid ' + hslString + '%, 55%)'}}> + {this.props.img ? () : ()} + {this.props.children} + {this.props.doubled ? ( +

x2!

+ ) : (<>)}
); } @@ -189,79 +192,83 @@ class PlayerTradeResources extends React.Component { render () { let player = this.props.player; return (
tradeFormSubmit(e, player)}> -
- - {' '} - - {' '} - - {' '} - - {' '} - - {' '} - - -

- Ridges: {ridgeNames[0][0]}: {'\u00A0'} - R: {'\u00A0'} - C: {'\u00A0'} - T: {'\u00A0'} -

- - - - - - - - - - - - - - - - -
-
); +
+ + {' '} + + {' '} + + {' '} + + {' '} + + {' '} + + +

+ Ridges: {ridgeNames[0][0]}: {'\u00A0'} + R: {'\u00A0'} + C: {'\u00A0'} + T: {'\u00A0'} +

+ + + + + + + + + + + + + + + + +
+ ); } } class PlayerResources extends React.Component { render () { - const player = this.props.player; + const player = this.props.player; return (
- - {player.assets.hay} - {' '} - - {player.assets.grain} - {' '} - - {player.assets.fruit} - {' '} - - {player.assets.cows} - {' '} - - {player.assets.harvester} - {' '} - - {player.assets.tractor} - + + {player.assets.hay} + {' '} + + {player.assets.grain} + {' '} + + {player.assets.fruit} + {' '} + + {player.assets.cows} + {' '} + + {player.assets.harvester} + {' '} + + {player.assets.tractor} +
); } @@ -284,7 +291,7 @@ class PlayerSummary extends React.Component { const player = this.props.player; return (
{player.name} - )}> + )}> {' '} {' '}

@@ -314,13 +321,13 @@ class PlayerTurnContainer extends React.Component { const player = this.props.player, worth = netWorth(player), auditButton = (this.props.game.calledAudit === false && worth >= this.props.game.settings.auditThreshold) ? ( - ) : ''; + ) : ''; if (this.props.game.state === 'finished') { view = (Game finished!); } else if (player.state === GAME_STATES.preTurn) { view = ( - {' '}{auditButton} + {' '}{auditButton} ); } else if (player.state === GAME_STATES.midTurn) { @@ -330,38 +337,38 @@ class PlayerTurnContainer extends React.Component { } else { view = ( ); } } else { if (player.cash < 0) { view = ( ); } else { view = ( - {' '}{auditButton} + {' '}{auditButton} ); } } } else { view = ( ); } return ( - -
- {view} -
- + +
+ {view} +
+
); } @@ -408,10 +415,10 @@ class FarmsContainer extends React.Component { {ridgeNames[3][0]}: {'\u00A0'}

{this.props.otherPlayers - .map(p => ( + .map(p => (
{'\u00A0'} - {p.player.name} + {p.player.name}

))}
@@ -434,7 +441,7 @@ class CCBY extends React.Component { render() { return ( - License Creative Commons CCBY + License Creative Commons CCBY ); } @@ -444,33 +451,33 @@ class Misc extends React.Component { render() { return (
-

Credits

- +

Credits

+
); } @@ -482,24 +489,24 @@ class Messages extends React.Component { newTurn = false; return (
- {this.props.game.messages.map((m, i) => ( - {m[0] === this.props.player.name ? ({m[0]}) : m[0]}{': ' + m[2]}
- ))} - {this.props.game.messages.length > 0 ? (

) : ()} - {this.props.game.oldMessages.map((m, i) => { - newTurn = false; - if (m[1] !== lastTurn) { - lastTurn = m[1]; - newTurn = true; - } - return ( - - {newTurn ? (Turn {m[1]}
) : } - - {m[0] + ': ' + m[2]} -
-
- )})} + {this.props.game.messages.map((m, i) => ( + {m[0] === this.props.player.name ? ({m[0]}) : m[0]}{': ' + m[2]}
+ ))} + {this.props.game.messages.length > 0 ? (

) : ()} + {this.props.game.oldMessages.map((m, i) => { + newTurn = false; + if (m[1] !== lastTurn) { + lastTurn = m[1]; + newTurn = true; + } + return ( + + {newTurn ? (Turn {m[1]}
) : } + + {m[0] + ': ' + m[2]} +
+
+ )})}
); } @@ -555,6 +562,21 @@ class Loans extends React.Component { loan(1); } + maxRepay = e => { + e.preventDefault(); + this.setState({ repay: Math.max(0, Math.floor( + Math.min(this.props.player.debt + 900, this.props.player.displayCash) / 1000)) }); + } + + maxTakeout = e => { + e.preventDefault(); + this.setState({ takeOut: Math.max(0, Math.floor(this.state.maxLoan / 1000)) }); + } + + quickLoan = i => { + loan(i); + } + componentDidUpdate(prevProps) { if (this.props.player.debt !== prevProps.player.debt || this.props.game.settings.loanInterest !== prevProps.game.settings.loanInterest || @@ -578,7 +600,12 @@ class Loans extends React.Component {
- + + {this.props.player.displayCash >= 1000 ? ( + + ) : ({' '})} + +
$: + {' '} - + + {this.props.player.debt < this.props.game.settings.maxDebt ? ( + + ) : ({' ' })} + +
$: + {' '} @@ -863,19 +897,22 @@ class Harvest extends React.Component { case 'ready': view = (
-
-

{this.props.crop + ' harvest!'}

-
- - Get ready to harvest {this.props.acres} - {this.props.crop === 'cows' ? ' head of cow' : ' acres'}! +
+

{this.props.crop + ' harvest!'}

+
+ + Get ready to harvest {this.props.acres} + {this.props.crop === 'cows' ? ' head of cow' : ' acres'}! +
+ {isCurrentPlayer ? ( + + ) : ()} + {this.props.harvestMult !== 1 ? ( + Multiplied by {this.props.harvestMult}! + ) : (<>)}
- {isCurrentPlayer ? ( - - ) : ()} -
); break; @@ -1170,6 +1207,8 @@ class Action extends React.Component { case 'harvest': view = ( { e.preventDefault(); buy(this.props.card.id, this.state.cash); + this.setState({ cash: 0 }); } render () { diff --git a/src/components/farm/reducers.js b/src/components/farm/reducers.js index 8b03cf2..94e38a5 100644 --- a/src/components/farm/reducers.js +++ b/src/components/farm/reducers.js @@ -92,6 +92,8 @@ const initialState = { name: '', ridges: { ridge1: 0, ridge2: 0, ridge3: 0, ridge4: 0 }, space: 0, + hayDoubled: false, + cornDoubled: false, trade: {} }, game: { calledAudit: false, diff --git a/src/server/farm.scm b/src/server/farm.scm index 64e6143..be74496 100644 --- a/src/server/farm.scm +++ b/src/server/farm.scm @@ -93,7 +93,9 @@ (last-cash initform: 5000 accessor: player-last-cash) (mailbox initform: (make-mailbox) accessor: player-mailbox) (mutex initform: (make-mutex 'player) accessor: player-mutex) - (harvesting initform: #f accessor: player-harvesting))) + (harvesting initform: #f accessor: player-harvesting) + (hay-doubled initform: #f accessor: player-hay-doubled) + (corn-doubled initform: #f accessor: player-corn-doubled))) (define-class () ((id initform: 0 accessor: game-id) @@ -341,7 +343,9 @@ (color . ,(symbol->string (player-color p))) (name . ,(player-name p)) (trade . ,(player-trade p)) - (lastCash . ,(player-last-cash p)))))) + (lastCash . ,(player-last-cash p)) + (hayDoubled . ,(player-hay-doubled p)) + (cornDoubled . ,(player-corn-doubled p)))))) (define (game->list g player) `((game . ((messages . ,(list->vector (reverse (game-messages g)))) @@ -430,6 +434,8 @@ (safe-set! (player-finished player) #t)))))))) (safe-set! (player-year-rules player) (player-next-year-rules player)) (safe-set! (player-next-year-rules player) '()) + (safe-set! (player-hay-doubled player) #f) + (safe-set! (player-corn-doubled player) #f) (when (not (null? (player-farmers-fates player))) (safe-set! (game-farmers-fates game) (append (game-farmers-fates game) (player-farmers-fates player))) @@ -1588,6 +1594,8 @@ (when (not (already-harvested? 'wheat player)) ((make-player-pays-per-unit 'grain 50) player))) + + (define (get-actions player space) (let ((res '())) (let loop ((a @@ -1597,6 +1605,7 @@ ((jan2 draw ?p otb)) ((jan3 money ?p ,(pays 500)) (?p cows)) ((jan4 add-rule ?p ,(make-player-year-rule 9 '((?p hay harvest-mult 2) (?p hay))))) + ((jan4 player-action ?p ,(lambda (p) (safe-set! (player-hay-doubled p) #t)))) ((feb1 money ?p ,(gains 1000))) ((feb2 draw ?p farmers-fate)) ((feb3 goto ?p apr2)) @@ -1608,6 +1617,7 @@ ((apr1 draw ?p otb)) ((apr2 add-rule ?p ,(make-player-year-rule 10 '((?p corn harvest-mult 2) (?p grain))))) + ((apr2 player-action ?p ,(lambda (p) (safe-set! (player-corn-doubled p) #t)))) ((apr3 money ?p ,(pays 500))) ((apr4 money ?p ,(pays 1000))) ((may1 money ?p ,(gains 500))) @@ -1790,6 +1800,7 @@ (acres (alist-ref crop (player-assets player))) (harvest-amounts (get-harvest-amounts crop)) (rolled (+ (random 6) 1)) + (harvest-mult (player-harvest-mult player)) (income (farming-round ;; add one to skip the divisor @@ -1813,6 +1824,7 @@ ((alist-ref 'action operating-expense) player) `((rolled . ,rolled) (income . ,income) + (harvestMult . ,harvest-mult) (operatingExpense . ,(alist-ref 'contents operating-expense)) (operatingExpenseValue . ((,(string->symbol (player-name player)) . ,(- (player-cash player) @@ -1904,5 +1916,4 @@ ;; trade notification keeps popping up -;; you can see how much money you make before you harvest ;; show harvest multiplier