DAILY YACHT v2026.10.13.3
A one-game-a-day dice door
alexcorris@outlook.com bbswordle.com https://bsky.app/profile/bbswordle.com
======================================================================

Five dice, three rolls a turn, thirteen boxes.  Every caller gets ONE
game a day, and everybody's game that day is ranked together: best
score wins the day, scores add up over the month and all-time, and
there is a board for the longest daily play streaks.  Missed days can
be made up from the calendar while they are still open, and late in
each month the rest of it can be played ahead.

The dice are truly random - as if the callers sat at the same table -
so nobody can learn a day's rolls on one BBS and use them on another.

BBSes can play each other through the same league server Daily Blocks
uses (version 2026.10.13.1 or later): see INTERBBS LEAGUES below.

Use the right exe for your system - 
  dyacht        Linux
  dyachtpi      Linux ARM/Raspberry Pi
  dyachtW32.exe Windows 32bit
  dyachtW64.exe Windows 64bit
  dyacht.exe    MS-DOS (no inter-bbs capability)
  
Created at run time, next to the executable:
  dyacht.ini    settings (written with defaults on first run)
  dyacht.dat    every game ever played (96-byte records)
  dyacht.lck    a lock DIRECTORY that exists for a few milliseconds
                while a record is added
  dyacht.lgr    InterBBS only: the other BBSes' scores, as collected
  dyacht.lgb    InterBBS only: the league's BBS names
  dyacht.lgs    InterBBS only: where the exchange got to, and when


RUNNING
----------------------------------------------------------------------

  dyacht -D<path>DOOR32.SYS        (or DOOR.SYS, DORINFOx.DEF, BBSDEV.DRP)
  dyacht -N<node> -S<socket>
  dyacht -L                        local mode, asks for a name

Extra switches:

  -U           local mode on Linux: send UTF-8 instead of CP437 so the
               dice look right in a modern terminal
  -PName       local mode: log in as Name without the prompt (_ = space)
  -TYYYYMMDD   pretend today is that date - for testing only

The door needs ANSI and an 80x24 (or bigger) screen.  Players are
identified by alias (real name if the drop file has no alias).  All
data lives in the directory the executable is in.


DYACHT.INI
----------------------------------------------------------------------
  MakeupDays=30       how many days back a missed day stays open
                      (0 = no make-ups)
  PlayAheadDay=22     from this day of each month, the rest of that
                      month can be played ahead (0 = never, 1 = the
                      whole month is open from the 1st)
  StartDate=YYYYMMDD  first day of play; set automatically on first run.
                      Set it earlier to open past days for make-ups.

  InterBBS=0          1 = take part in an InterBBS league
  LeagueServer=       the league server: host, or host:port
  BBSName=            your BBS's name as the other boards will see it

There is no board seed and nothing that has to stay fixed: every game
is just five random dice, so any setting can be changed at any time.

PLAYING AHEAD works as in Daily Blocks: from PlayAheadDay to the end of
the month, the rest of THAT month can be played early from the
calendar.  A score played ahead is SEALED until its own day - banked,
and seen by its owner, but left off every scoreboard, standing, record
and streak, and not sent to a league, until that date.  On the day it
appears, marked "early".


HOW IT PLAYS
----------------------------------------------------------------------
Everything is on one screen: the card (upper and lower halves), a
panel with the turn, the roll, the boxes left and the score to beat,
and five dice drawn in ANSI underneath.  There is no clock: time never
ranks anybody, so there is nothing to hurry for.

On the card, a box still to fill shows a white [ ] and a bright name,
so what is left stands out at a glance; a filled box shows a green
tick, its name dims, and its score stays yellow.

The screen has two halves, DICE and CARD, and the keys work on one of
them at a time.  The one in use is lit - its frame, its title, and the
    or the blue bar - and the bottom line shows its keys.  ENTER
always acts on that half: on the dice it ROLLS, on the card it SCORES.
So pressing ENTER again and again just rolls; it never scores a box.

  TAB            switch between DICE and CARD

  On the DICE (every turn starts here)
  ENTER          roll - the first roll of a turn throws all five
  Left/Right     move the     to a die (A D also work)
  SPACE          hold / let go of that die (held dice turn cyan, HELD)
  Up/Down        go to the card

  On the CARD
  Up/Down        choose a box (W S); Left/Right jumps between halves
  ENTER          put the dice in the chosen box
  ESC or SPACE   back to the dice

  Anywhere
  1 - 5          hold / let go of that die
  R              roll
  H or ?         the rules
  Q              leave the game here and finish later, or end it now

After the third roll ENTER on the dice just says there are no rolls
left; moving to the card is always your own TAB.  After a box is
scored, the next turn starts back on the dice.

After every roll each open box shows, in green, what the dice would
score there - so it is easy to see the choices.  Putting a 0 in a box
asks first if anything else would have scored.  A Yacht moves the
card's marker to the YACHT box (or the box the joker rule demands).

When dice are rolled they tumble for a moment and settle one after
another, with a | / - \ spinner beside ROLLS LEFT; a Yacht flashes.

Scoring (the standard rules)
  Ones - Sixes     the dice of that number, added
  Upper bonus      +35 if the six upper boxes reach 63 (three of each)
  3 of a Kind      all five dice added, with at least three alike
  4 of a Kind      all five dice added, with at least four alike
  Full House       25 (three of one, two of another)
  Sm Straight      30 (four in a row)
  Lg Straight      40 (five in a row)
  YACHT            50 (five of a kind)
  Chance           all five dice added
  Extra Yachts     +100 each, once the YACHT box holds 50

The joker rule: a further Yacht, once the YACHT box is filled (with 50
or with 0), must go in the upper box of its number if that is open.
If it is not, it may go in any open lower box, where Full House and
the straights count in full.  If none of those is open either, it
fills an open upper box for zero.  The door enforces this: boxes the
dice may not go in show "--" and cannot be chosen.  The +100 is only
paid when the YACHT box holds 50.

The highest possible game is 1,575.


RULES WORTH KNOWING
----------------------------------------------------------------------
* One game a day.  The game is on file the moment the first die is
  thrown, and it is rewritten after every roll and every box - always
  BEFORE the dice are shown.

* A dropped call costs nothing.  Hang up, time out, lose the
  connection or have the door killed, and the game waits exactly as it
  was, dice and all: the home screen says "unfinished", the calendar
  shows RESUME, and Play picks it up.  Because the dice were written
  down before they were shown, coming back can never get a better
  roll.  A game can be picked up for as long as its day is still open
  (today, or a make-up within MakeupDays).

* Q (or ESC) during a game offers both: L leaves it to finish later,
  E ends it now - empty boxes score nothing and the day is used.

* While a game is under way its score so far shows on the boards,
  marked "Playing".

* Make-ups count in full - for the day's ranking, the month, streaks,
  everything.  A day's winner can still change until its make-up
  window closes; the boards mark such days "open".

* Equal scores are a tie and share the place: a day can have two
  winners, and both get the win (BBS vs BBS counts it once per BBS).
  The boards mark a shared place "=".  Unlike Daily Blocks, time
  plays no part - nobody should feel rushed in a dice game.


SCOREBOARDS
----------------------------------------------------------------------
  1 Day        ranking for any one day; a shared place shows "=".  Up/Down picks a player and
               ENTER shows their whole card; Up/Down there steps
               through the rest of the day's cards
  2 Winners    who won each day of a month
  3 Month      monthly standings (total, games, wins, average, best,
               Yachts)
  4 Champs     the champion of every month
  5 All-Time   lifetime standings
  6 Top        the 50 highest single games ever
  7 Streaks    the longest daily play streaks: best run, when it
               ended (or "still going"), the run alive now, games.
               A make-up fills its day, so a missed day can be mended
               while it is still open
  8 Records    hall of records (highest game, most Yachts in a game,
               best upper section, longest streak, longest streak going,
               most wins, most Yachts ever, best average, biggest
               month, most games) + the caller's own numbers

Left/Right switches board, , and . move through days or months, 1-8
jump straight to a board.  Long lists scroll with Up/Down, PgUp/PgDn,
Home/End.

YOUR CARDS on the main menu shows every card the caller has played,
newest first, with their place on that day.


INTERBBS LEAGUES
----------------------------------------------------------------------
Daily Yacht uses the Daily Blocks league server - the SAME program, on
the SAME address and port.  The server keeps a separate league for
each game, so a BBS in the Daily Blocks league is not in the Daily
Yacht league until its Daily Yacht door joins, and the two never mix.

JOINING.  In dyacht.ini set

  InterBBS=1
  LeagueServer=their.address.example        (add :port if they say so)
  BBSName=Your BBS Name

and that is it.  The next caller's door says hello, the server signs
the BBS up and hands back the league's rules; the door writes them
into dyacht.ini itself.  Use the same BBSName as in dblocks.ini if you
like - each game's league keeps its own list, so there is no clash.

THE SERVER HAS TO BE 2026.10.13.1 OR LATER.  An older Daily Blocks
league server does not know about other games: the door then says
"that league server is too old for Daily Yacht and needs updating" on
the home screen and carries on locally.  (Nothing is signed up on the
old server.)

WHAT THE LEAGUE DECIDES.  Its first day, how far back a day can be
made up, and the play-ahead day.  While InterBBS=1 the league's
MakeupDays and PlayAheadDay are used instead of your own.

WHEN IT STARTS.  Games from the league's first day on count in the
league - including any this BBS played before it joined, since every
game of dice is like every other.  So a new BBS can make up every day
the league has had so far (as far back as its make-up rule allows).

WHAT CALLERS SEE.  The same as Daily Blocks: the boards open on the
league, each row showing player and BBS; L switches between the league
and this BBS's own scores; B is BBS vs BBS - one line per BBS, ranked
for the month by each BBS's BEST game of each day added up, so a BBS
is not on top just for having the most callers.  BBS names that do
not fit their column lose a leading "The", then are cut.

IF THE SERVER IS DOWN.  The game carries on with what it has; it tries
again five minutes later.  A caller never waits more than a few
seconds on the network.  Scores move when a caller enters the door,
comes back to the menu, opens the scoreboards or finishes a game - at
most every two minutes unless there is a score to post.

CHEATING.  The server checks every card it is sent: each box has to
be something five dice can make, the extra-Yacht count has to fit the
card, a finished game needs all thirteen boxes, and the score has to
be exactly what the boxes add up to.  Anything else is turned away.
It cannot tell whether the dice really fell that way - every league
row shows handle and BBS so odd results can be seen.

Your BBS name is yours once joined: the server gave your door a key
(LeagueKey in dyacht.ini) and will not accept the name without it.
Keep a copy with your backups.  To leave, set InterBBS=0.


FOR LEAGUE HOSTS
----------------------------------------------------------------------
Nothing to do but run dbserver 2026.10.13.1 or later.  On its first
run it adds yacht.ini, yacht.dat and yacht.bbs beside its own files
and opens a Daily Yacht league; dbserver.ini, league.dat and
league.bbs - the Daily Blocks league - are never touched.

yacht.ini holds the Daily Yacht league's name, its MakeupDays and
PlayAheadDay, its first day (Created=) and its LeagueID.  banned.ini
applies to every league.  "dbserver -list" lists each league's BBSes.


MAINTENANCE
----------------------------------------------------------------------
Delete dyacht.dat to wipe all scores.  dyacht.ini can be deleted too
(it is rewritten with defaults), but on a BBS in a league keep its
LeagueKey line.  A stale dyacht.lck directory after a crash is
harmless; the door takes it over after three seconds.

