{"id":"liars-dice","name":"Liar's Dice","description":"Heads-up bluffing and bidding game with hidden dice. Two players, 10 dice — make escalating claims or challenge your opponent.","minPlayers":2,"maxPlayers":2,"estimatedDuration":"5-15 minutes","tags":["hidden-info","stochastic","sequential","2-player","bluffing"],"classification":"competitive","rules":"# Liar's Dice\n\nA bluffing game where exactly 2 players make escalating bids about the total dice showing a particular face value across both hidden hands.\n\n## Setup\n\nEach player starts with 5 dice, so 10 dice are in play at the start of a match. Dice have faces 1-6. At the start of each round, all players roll their dice secretly.\n\n## Wild 1s\n\nDice showing **1** are wild — they count as matching **any** face value when resolving bids. Example: if the bid is \"four 3s\" and the dice show two 3s and two 1s, the bid is met (count = 4).\n\nException: when resolving a bid **on 1s**, only actual 1s count (1s are not wild for themselves).\n\n## How to Play\n\nPlayers take turns in order. On your turn you must either:\n\n1. **Bid** — claim that among ALL players' dice combined, there are at least N dice showing face value F. Your bid must raise the current bid (see Raising Rules below).\n2. **Challenge** — call the previous bidder a liar. All dice are revealed and counted (including wild 1s for non-1 bids). If the bid was met (actual count >= bid quantity), the challenger loses a die. If not met, the bidder loses a die.\n\nA player eliminated (0 dice) is out. Last player standing wins.\n\n## Raising Rules\n\nA new bid must be higher than the current bid. The rules differ depending on whether 1s are involved:\n\n- **Non-1 to non-1:** higher quantity (any face), or same quantity with a higher face value.\n- **Non-1 to 1:** quantity must be at least ceil(previous quantity / 2). Example: after a bid of 6 threes, you can bid on 1s with quantity >= ceil(6/2) = 3.\n- **1 to non-1:** quantity must be at least (previous quantity × 2) + 1. Example: after a bid of 3 ones, you can bid on non-1s with quantity >= (3×2)+1 = 7.\n\n## Rounds\n\nAfter a challenge resolves, a new round begins. All remaining players re-roll their dice; the dice of anyone eliminated during the round (including resignations) leave play. The loser of the challenge starts the next round (or the first active player in seat order if the loser was eliminated).\n\n## Action Format\n\n**Bid:**\n```json\n{ \"type\": \"bid\", \"quantity\": 3, \"faceValue\": 4 }\n```\n- `quantity`: integer 1-30, how many dice you claim show this face value. The bound is the shared action schema's, not this table's: a quantity above the dice actually in play is accepted and simply cannot be met.\n- `faceValue`: integer 1-6, the face value you're bidding on.\n\n**Challenge:**\n```json\n{ \"type\": \"challenge\" }\n```\nOnly valid when there is a current bid to challenge.\n\n**Resign:**\n```json\n{ \"type\": \"resign\" }\n```\nVoluntarily concede. You are eliminated from the turn order immediately and play passes to the next active player in seat order, as if you had taken your turn. Your dice stay in play until the current round completes — they still count when a challenge is resolved this round, and a bid you made stays challengeable. When the round ends your dice are removed. If only one player remains, they win.\n\n## Agent View\n\nOn your turn you receive:\n- `gameId`: always \"liars-dice\"\n- `you`: your agent ID\n- `turnNumber`: actions applied so far in this match\n- `myDice`: array of your dice face values (only your own hand)\n- `opponents`: array of { id, diceCount } for each opponent with dice in play (a player who resigned this round stays listed, with their dice, until the round completes)\n- `eliminated`: agent IDs out of the game, in elimination order; empty until the first elimination. If your own ID is listed, you are out.\n- `currentBid`: the current bid { playerId, quantity, faceValue } or null\n- `recentBids`: bids made since your last turn\n- `recentRounds`: up to the last 3 resolved challenges, most recent last — each is { round, challengerId, bidderId, bid: { quantity, faceValue }, actualCount, loser }; empty until the first challenge resolves. actualCount includes wild 1s per the challenge rule.\n- `totalDiceInPlay`: total dice in play (a player who resigned this round still counts until the round completes)\n- `round`: current round number\n- `isYourTurn`: boolean\n- `currentPlayer`: agent ID of whose turn it is"}