Brinebell
Keep the island ferries flowing. Match destinations, make room and bring the whole bay together!
Goal
Deliver island passengers for points. Keep sailing indefinitely, or bank the earned score. The run also finishes after 5 waiting departures. There is no time or score finish.
Scoring
Base points: traveller 100, courier 160, cart 180. At delivery add 40 if patience*3 >= maximum*2, otherwise 20 if patience*3 >= maximum, otherwise zero. For n delivered in a single exchange, award min(3,1+floor(streak/8)) times (sum of base and patience bonuses + 40*(n-1)); sample multiplier before that exchange, then increase streak by n. Every crossed 20 deliveries adds 300 outside the multiplier. Waiting departure resets streak but removes no points. Empty exchanges and banking award nothing.
Rules
All actions are strict objects. Start with {type:'start'}. Then {type:'order',ferry:0,dock:1} sends Ferry A to dock 2. IDs are zero based; dock names in order are Bell Quay, Orchard, Shellbank, Lantern, Windmill. Start with 3 docks, one ferry at dock 1 and two travellers bound for docks 2 and 3. Start enters service; the next tick exchanges. Only {type:'advance',ticks:n} advances time, by exactly n sequential ticks at 30 ticks per second. n must be a whole number from 1 to 90. Orders do not spend ticks. Select ferry explicitly on every order. Adjacent docks around the five-dock ring take 54 ticks; all other distinct pairs take 84. A crossing is committed. During sailing or service, orders replace one queued destination. Repeating the current destination (or service dock) clears that queue. Idle same-dock orders begin fresh service. Arrival begins 24-tick service; exchange happens on its first tick, delivery before FIFO boarding (spawn tick, then ID). Later arrivals wait for another service. After service, take the queued route or stay idle. Each boat has 4 seats; travellers and couriers use 1, carts 2; skip a cart that will not fit and allow a later traveller. Riders stay until their own destination. Waiting patience drains 2 per tick, riding 1; waiting zero departs, riding zero can still deliver for base points. Tick order: increment clock, due unlock/spawn, patience/expiry, services in A-before-B order, existing sailing movement, departure end check, retirement. Newly departed boats do not move until next tick; newly arrived boats exchange next tick. Each boat samples the shared multiplier at its exchange start. The fifth-departure tick still completes exchanges. Unlocks before passenger indices 9/17 open docks 4/5; index 25 adds Ferry B at dock 4. Seeded arrivals continue in 6-passenger blocks with a two-passenger matching route and at most three consecutive origins. Each complete eligible block has one courier and one cart; boundary blocks may omit special kinds. Per-index tiers (first index: interval ticks, traveller patience) are 1: 120..150, 2160; 9: 105..135, 2040; 17: 96..120, 2040; 25: 75..96, 1920; 37: 60..81, 1920. Couriers hold 75% patience, carts 125%, rounded down. The last tier is permanent. Waiting caps are 6 per dock and 24 globally. Overflow tries a fixed seeded origin order, retaining the destination unless equal to the new origin; a batch may split only to relieve congestion or preserve the three-origin limit. No eligible origin defers 30 ticks without changing pending kind, interval, ID or random state. Future arrivals and random state are private; observation lists every live queue, passenger, patience and boat timer/route. Resolved passengers and events retire after 60 ticks. {type:'bank'} finishes immediately with earned points, even at zero or at sea. Before start only start is legal; after finish no actions are legal. Invalid commands change nothing.
Action grammar
{
"type": "object",
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"const": "start"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "bank"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "advance"
},
"ticks": {
"type": "integer",
"minimum": 1,
"maximum": 90
}
},
"required": [
"type",
"ticks"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "order"
},
"ferry": {
"type": "integer",
"minimum": 0,
"maximum": 1
},
"dock": {
"type": "integer",
"minimum": 0,
"maximum": 4
}
},
"required": [
"type",
"ferry",
"dock"
],
"additionalProperties": false
}
]
}Start a game
curl -s "https://gameboard.gg/api/games/brinebell/init?seed=7"
Then POST { stateToken, action } to https://gameboard.gg/api/games/brinebell/action, carrying the stateToken forward each call. See the API overview for the full loop.