diff --git a/src/components/farm/Board.jsx b/src/components/farm/Board.jsx
index 74386ee..0fc2b01 100644
--- a/src/components/farm/Board.jsx
+++ b/src/components/farm/Board.jsx
@@ -34,7 +34,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faUser, faUsers, faTractor, faWindowRestore,
faDollarSign, faTimes, faAsterisk, faExchangeAlt,
faInfoCircle, faArrowUp, faArrowDown, faAward,
- faTimesCircle } from '@fortawesome/free-solid-svg-icons'
+ faTimesCircle, faBan } from '@fortawesome/free-solid-svg-icons'
import { GroupBox, Row, Col, Button } from '../widgets.jsx'
import SpaceNode from './SpaceNode.jsx'
@@ -48,7 +48,7 @@ import { setSelectedCard, setMessagePanelSpace, setMPDims, movePlayer,
import { buy, roll, endTurn, loan, trade, submitTradeAccept,
submitTradeDeny, submitTradeCancel, audit,
buyUncleBert, skip, endAiTurn, startGame, readyToStart,
- leaveGame } from './interface.js'
+ leaveGame, kickPlayer } from './interface.js'
function netWorth(player) {
return ((player.assets.hay + player.assets.grain) * 2000) +
@@ -1935,7 +1935,8 @@ class Info extends React.Component {
class StartGame extends React.Component {
render() {
const { auditThreshold, downPayment, loanInterest, maxDebt, startingOtbs, startingCash, startingDebt } = this.props.game.settings;
- const { name } = this.props.game;
+ const playerName = this.props.player.name;
+ const { name, host } = this.props.game;
return (
<>
Lobby
@@ -1948,6 +1949,11 @@ class StartGame extends React.Component {
{this.props.game.otherPlayers.map((p, i) => (
{p.player.name}
+ {playerName === host ? (
+ kickPlayer(p.player.name)}>
+
+
+ ): (<>>)}
))}
diff --git a/src/components/farm/interface.js b/src/components/farm/interface.js
index 1137018..a21b62c 100644
--- a/src/components/farm/interface.js
+++ b/src/components/farm/interface.js
@@ -31,7 +31,7 @@ import { itemCard, fateCard } from 'game.js'
export { initialize, buy, roll, endTurn, loan, trade, submitTradeAccept,
submitTradeDeny, submitTradeCancel, audit, handleMessage,
nextAction, buyUncleBert, actionsFinished, skip, endAiTurn,
- startGame, readyToStart, leaveGame }
+ startGame, readyToStart, leaveGame, kickPlayer }
let store;
let movingTimer = 0;
@@ -213,6 +213,10 @@ function leaveGame() {
sendCommand({ type: 'leave-game' });
}
+function kickPlayer(name) {
+ sendCommand({ type: 'kick-player', name });
+}
+
// TODO share with Board.jsx
// http://stackoverflow.com/questions/149055
function formatMoney(n) {
diff --git a/src/components/farm/reducers.js b/src/components/farm/reducers.js
index a75e8e0..2ae0baa 100644
--- a/src/components/farm/reducers.js
+++ b/src/components/farm/reducers.js
@@ -106,6 +106,7 @@ const initialState = {
turn: 0,
oldMessages: [],
name: '',
+ host: '',
settings: { downPayment: 0.2,
loanInterest: 0.2,
maxDebt: 50000,
diff --git a/src/server/farm.scm b/src/server/farm.scm
index f685249..835eda2 100644
--- a/src/server/farm.scm
+++ b/src/server/farm.scm
@@ -577,7 +577,8 @@
(readyToStart . ,(fold (lambda (p r)
(and (player-ready-to-start p) r))
#t
- (game-players g)))))))
+ (game-players g)))
+ (host . ,(player-name (car (game-players g))))))))
(define (buy-crop crop unnormalized-crop amount cash-value player game)
(let ((total-cost (* amount (alist-ref unnormalized-crop
@@ -1448,11 +1449,13 @@
(player-otbs kicked-player)))
(safe-set! (game-players (*game*))
(filter (lambda (p)
- (eq? p kicked-player))
+ (not (eq? p kicked-player)))
(game-players (*game*))))
- (db-remove-user-game (player-user-id kicked-player) (game-id (*game*))))
- (message-players! (*game*) (*player*) '() type: "update")
- (create-ws-response (*player*) "update" '()))
+ (db-remove-user-game (player-user-id kicked-player) (game-id (*game*)))
+ (mailbox-send! (player-mailbox kicked-player) '((type . "left-game") (value . ())))
+ (message-players! (*game*) (*player*) `((color . ,(symbol->string (player-color kicked-player))))
+ type: "player-left-game")
+ (create-ws-response (*player*) "player-left-game" `((color . ,(symbol->string (player-color kicked-player)))))))
((string=? type "leave-game")
(safe-set! (game-colors (*game*))
(cons (player-color (*player*)) (game-colors (*game*))))
diff --git a/src/style.scss b/src/style.scss
index ecc8bbe..28bb831 100644
--- a/src/style.scss
+++ b/src/style.scss
@@ -928,70 +928,11 @@ $intro-time: 6s;
position: absolute;
bottom: 1rem; }
-/* -------- MENU ------- */
-/* Position and sizing of burger button */
-.bm-burger-button {
- position: fixed;
- width: 36px;
- height: 30px;
- left: 36px;
- top: 36px;
-}
-
-/* Color/shape of burger icon bars */
-.bm-burger-bars {
- background: #373a47;
-}
-
-/* Color/shape of burger icon bars on hover*/
-.bm-burger-bars-hover {
- background: #a90000;
-}
-
-/* Position and sizing of clickable cross button */
-.bm-cross-button {
- height: 24px;
- width: 24px;
-}
-
-/* Color/shape of close button cross */
-.bm-cross {
- background: #bdc3c7;
-}
-
-/*
-Sidebar wrapper styles
-Note: Beware of modifying this element as it can break the animations - you should not need to touch it in most cases
-*/
-.bm-menu-wrap {
- position: fixed;
- height: 100%;
-}
-
-/* General sidebar styles */
-.bm-menu {
- background: #373a47;
- padding: 2.5em 1.5em 0;
- font-size: 1.15em;
-}
-
-/* Morph shape necessary with bubble or elastic */
-.bm-morph-shape {
- fill: #373a47;
-}
-
-/* Wrapper for item list */
-.bm-item-list {
- color: #b8b7ad;
- padding: 0.8em;
-}
-
-/* Individual item */
-.bm-item {
- display: inline-block;
-}
+.kick-player {
+ cursor: pointer;
+ color: red;
+ margin-left: 0.2rem; }
-/* Styling of overlay */
-.bm-overlay {
- background: rgba(0, 0, 0, 0.3);
-}
+ul {
+ margin-left: 0;
+ list-style-type: none; }