---
# System prepended metadata

title: Dice 1

---

# Dice 1

This is a simple game, designed and implemented just to confirm that our
skills for both BE and FE. Though, it has some potential and is currently a
nice bonus for Partner.

## Single player

This is the basic version, one user play against our system.

Code name `dice_1`. That means related tables, constants should start with `dice_1`.

## Rules

- Use can choose between 2 types:
  - `BiggerWin`: enum value is 1
  - `SmallerWin`: enum value is 2
- User place a bet by calling our API.
- Server generate 2 numbers in range 1 to 6, one for User, one for Dealer (us).
- Who get the bigger value (or smaller, depend on the config) will win.

## Technical solution

### DB

1 table:

- `dice_1_game_record`
  - `id`, `ctime`: read-only, hence, no `mtime`
  - `user_id`
  - `result_type`: `UserWin` (1), `UserLost` (2), `Draw` (3)
  - `game_type`: `BiggerWin` (1) or `SmallerWin` (2)
  - `bet_amount`

We might introduce the second table `dice_1_config` later, if there's enough
requirements to add it.

## Staff API

- Read-only API for `dice_1_game_record`.
- CRUD API for `dice_1_config`.

## User API

RPC `/api/game/dice_1`

Request:

```json
{
  "type": 1,
  "bet_amount": 10000
}
```

Response format for `UserLost` case:

```json
{
  "dealer": 3,
  "user": 1,
  "status": 2,
  "reward": 0,
  "refund": 0
}
```

Response format for `Draw` case:

```json
{
  "dealer": 3,
  "user": 3,
  "status": 3,
  "reward": 0,
  "refund": 10000
}
```

Response format for `UserWin` case:

```json
{
  "dealer": 3,
  "user": 4,
  "status": 1,
  "reward": 20000,
  "refund": 10000
}
```

## Implementation

Once client submit their bet, the server should generate 2 numbers and
update user balance immediately. Following records should be created:

- 1 transction type `Bet` that substract user balance.
- 1 bet record go into `dice_1_game_record`.
- If game status is `Draw` or `UserWin`, 1 transcation with corresponding type
  should be created.

  - `UserWin`: a new transaction with type `Reward` will be created. Its value
    should be greater than absolute value of the `Bet` transaction.

  - `Draw`: a new transaction with type `Refund` will be created. Its value
    should be _equal_ to absolute value of the `Bet` transaction.

### Multi player with timer

See [its docs here](./dice_1_multi_player.md)
