# DG Game This folder contains documentations for games that this server can support, both technical and business logic. Currently, we have: - [Dice HiLo](https://hackmd.io/@tomm/dice1) - [Dice Sicbo](https://hackmd.io/@tomm/dice3) - [Dice Big Or Small](https://hackmd.io/@tomm/dice3_mini) - [Wheel](https://hackmd.io/@tomm/wheel) - [Roulette](https://hackmd.io/@tomm/roulette) - [Slots](https://hackmd.io/@tomm/slots) - [Baccarat](https://hackmd.io/@tomm/baccarat) - [Poker High low](https://hackmd.io/@tomm/hilo) - [Rock, paper, scissors](https://hackmd.io/@tomm/rps) - [Hoo hew how](https://hackmd.io/@tomm/hhh) - [Zodiac Racer](https://hackmd.io/@tomm/zodiac) Note despite the project name `cards`, but there's other type of games as well, and we will split this server into multiple services in future, if needed. Some game are easy, can be done within the scope of a single request. Some are pretty complicated. ## Conventions ### Naming Each game has a project-wide unique code name. Example: `dice_1`, `dice_3`, ... So that when you read the code (filename, constant, handler, tables), ... you can immediately know which game it's for. Whenever adding new game, be sure to assign it a unique and understandable code name. ### DB tables Each game usually has following DB tables: - `<code-name>_config`: store game config per Partner, and also serve as indicator for whether Partner can provide this game to their user. - `<code-name>_game_record`: store user betting data per games. Simple games like `dice_1` might have just one level (`dice_1_game_record`). Games like `dice_3` have a complex bet structure, in which one bet contains multiple sub-bet, each can be either `Win`, `Lose`, `Draw`, .... Thus, they require multiple game record level, i.e: `dice_1_game_record` for "big" bet, and `dice_1_bet_record` for sub-bet. The naming convention is: - 1st level: `*_game_record`. - 2nd and deeper levels: up to you, as long as it makes sense. ## Game types ### Single API games In this type, user just submit a bet, and we "roll the dice". It's simple, hence, it's the first game type we had done. Example in our system: - `dice_1` - `dice_3` - `dice_3_mini` ### Multiplayer games Example in our system: - `dice_1_multi`: 3 players can join a rooms together and bet on the same dice number Multi player games has suffix `_multi`, for example `dice_1_multi`. This type of game is when a user is aware of other users activities when they're playing together, against each others, or against our system. For more detail, see next sections [Multiplayer games](#multiplayer-games). This type requires websocket support and has much more complicated logics. This type of game is the **top selling point** of our system, since not many team can build this. And this will eventually be our main focus. #### Common retractions - Player can't play a same `_multi` game on different devices. This is to prevent the case that a user can join the game as 2+ players and then to control the game result at his will. - Player can't play different `_multi` games on the same devices. The app should already handle this logic. This note is mainly a reminder to check when implement API. - Player of different partners should not be able to play together. Different partners have different configurations that can affect our processing. And, it doesn't make sense to allow this use case, from partner perspective. ### Timing games Example in our system: - `dice_1_timing` Timing games has suffix `_timing`. This type of game is similar to `_multi`, in which many users can play together again our system. But it's "rooms" concept is much wider. It allow scope allow many users to play (usually all user of a Partner can place bet on same result). Its logic is simpler than the `_multi` variants, but the amount of data we need to proces for each game is much bigger.