ctx.events.endGame({ winner: opponent })
), but I would like players to be able to concede at any moment. By default, moves cannot be executed while a player is not active, and thus my players can only concede during their turn. Is there a way to declare that a move can be called at any time, in any phase or stage?
Hi!
I'm making a card game, you can can see it in action here and the code here
I'm having trouble with the AI.
I'm building a practice mode for single player where the AI makes a random move. The possible moves are listed out fine, problem is, I don't know how to tell it to make a move.
My idea was to to put the function in the general onEnd attribute. I found a function makeMove
in boardgame.io/src/core/action-creators.ts
tat might do the trick, but it is not exported. Are there currently any ways I can do this?
Hi everyone! First of all, I want to thank the creators of this library. It is super awesome.
My question is: I'm trying to reuse some moves function already defined for the moves object in stages. I have 2 files: moves.ts and stages.ts
When I define the stages in stages.ts with moves imported from the moves file, I got this "cannot access [move name] of undefined" error. When I copy the move from moves.ts to stages.ts, it works fine. Why is this happening? I don't have a lot of moves I'm planning to use in stages but if I had hundreds of moves, copy and pasting doesn't really makes sense
Hi everyone! I'm trying to implement a server version of my game, per the Multiplayer instructions in the documentation, but when I try to run the server, I get this error:
Error: Cannot find module './Game/Game'
Require stack:
- /Users/kylegsessions/projects/ww-ttg/src/server.js
at Object.<anonymous> (/Users/kylegsessions/projects/ww-ttg/src/server.js:2:24)
at Generator.next (<anonymous>) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/Users/kylegsessions/projects/ww-ttg/src/server.js' ]
}
My server itself is very simple:
const { Server } = require('boardgame.io/server')
const { WeedWizard } = require('./Game/Game')
const server = Server({ games: [WeedWizard] })
server.run(8000)
and here's the game it's trying to access:
import { Game } from 'boardgame.io'
...
export interface IPlayer { ... }
export interface IGameState { ... }
export const WeedWizard: Game = { ... }
Does anyone have any ideas what might be going on? (If it makes a difference, the server file is .js
, but the rest of the project, including the Game file, is .ts/.tsx
.)
Is it possible to access/modify game state in anonymous callback functions within moves? I'm getting the following error when I try to do so:
TypeError: Cannot perform 'get' on a proxy that has been revoked
I'm trying to do something like this:
const moves = {
moveName: (G: IGameState, ctx: Ctx) => {
const onSelect = (value:number) => {
// modify game state in here
// close modal here
}
// open modal here
const modal = Modal.info({
// modal properties where I gather info from the player
// modal contains a button that calls the above onSelect method
})
}
}
If I modify the game state directly within the move itself, it's fine, but when I try to modify it within a callback method like this, I get the above error.
I was trying to figure out how to get a hold of the player's name via React. Turns out it's in matchData, which doesn't turn up anywhere in the documentation. It's an array of Server.PlayerMetadata, indexed by the player order. So the current player name is:
const playerIx = ctx.playOrder.indexOf(playerID);
const name = matchData[playerIx].name
(I'm not sure if that's the best way to determine the player index).
endTurn
no longer ends the player's turn, so we're just stuck on the first player, in the first phase, forever. But when I use the Client interface instead of Lobby, I don't have this problem. Has anyone else had this experience, or know a workaround?
const NUM_PLAYERS = 3
const WWClient = Client({
// debug: false,
game: WeedWizard,
board: PlayerBoard,
numPlayers: NUM_PLAYERS,
multiplayer: SocketIO({ server: 'localhost:8000' })
})
const App = () => {
const playerID = window.location.pathname.split('/')[1]
return (
<WWClient playerID={playerID} />
// <Lobby
// debug
// gameComponents={[
// { board: PlayerBoard, game: WeedWizard }
// ]}
// gameServer="http://localhost:8000"
// lobbyServer="http://localhost:8000"
// />
)
}
export default App
@jfengel You can look up a player’s metadata something like
const playerMetadata = matchData.find(player => player.id == playerID);
const { name } = playerMetadata;
matchData
is documented in the list of React board props in the client docs.
TypeScript error in C:/Users/rawrjun/code/game-lobby-example/src/components/Game/multiplayer.tsx(30,10):
Property 'gameState' is missing in type '{ matchID: string; playerID: string | undefined; credentials: string | undefined; debug: true; }' but required in typ
e 'Pick<Pick<Readonly<Pick<ClientOpts<any, Ctx>, "matchID" | "playerID" | "credentials" | "debug"> & Pick<LocalBoardProps, "gameState">> & Readonly<...>, "mat
chID" | ... 4 more ... | "children"> & Pick<...> & Pick<...>, "gameState" | "children">'. TS2741
28 | <div className="row flex-center">
29 | <div className="col no-padding">
> 30 | <MultiplayerClient
| ^
31 | matchID={matchID}
32 | playerID={player}
33 | credentials={credentials}
Hi @delucis, I'm trying to use bgio-effects and I got this error when I used the React Wrapper component:
Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
Everything was working fine before I added EffectsBoardWrapper. I tried to look into the code but couldn't figure out why that happened. Do you know what could be the problem? Here's what my Board component looks like:
const GameBoard: React.FC<BoardProps<IGameState>> = ({
G,
ctx,
moves,
events,
playerID,
isActive,
matchData: playersInfo,
}) => {
return (
<GameContext.Provider
value={{
G,
ctx,
moves,
events,
playerID,
isActive,
playersInfo,
}}
>
<ErrorProvider>
<AnimationProvider>
<GameTable />
</AnimationProvider>
</ErrorProvider>
</GameContext.Provider>
);
};
export default GameBoard;
debug={true}
, the debug panel is available and is opened automatically upon launching the game and can be closed and reopened via the .
key. If I set debug={false}
, the debug panel is not available at all. Is it possible to set things such that the debug panel will be available, but closed by default until/unless I hit the .
key? (For context, I'm using bgio to build a prototype of a game that I intend to make an actual physical version of. During playtesting, it would be nice if I have access to the debug panel, but other players don't have access to it, or at least, don't know that they do have access to it :P.)
Hi, I just discovered this framework and finding it so cool. And working on a project on this,
However, I didn't find any documentation of how to store player data (in the multiplayer scenario) in the Game state.
How do you recommend I do it? Is there any other projects that I can study from? I am coding the project in plain JS
turn: {
onBegin: (G, ctx) => {
if (condition) {
// do something
ctx.events.endTurn(); <--- Everything else but this works
}
}
}