DUXPLIMA Documentation

The interface

The seat panel, the HUD, the result banner, and the instance names they need.

Client/uxrTicTacToeSystemGui is a ScreenGui. It shows only while a player is seated at a table.

The instance contract

uxrTicTacToeSystemGui
  TTTUI
    SeatPanel
      SizeRow                   TextButtons, each with a numeric Size attribute
      DifficultyRow             TextButtons, each with a string Difficulty attribute
      Start                     TextButton
    BotButton
    Waiting
    HUD
      Turn
      Clock
      Resign
    Result                      TextLabel, the result banner
  CoreScript                    the code. Do not rename or move it

The seat panel

Shown to a seated player before a game starts.

SizeRow holds one TextButton per board size. The button is matched to a size by a numeric Size attribute on it, not by its text, so you can label a button "Classic" and give it Size = 3.

DifficultyRow works the same way with a string Difficulty attribute matching a key in Settings.Difficulties. Adding a difficulty to the settings means adding a button with the right attribute.

Only sizes in Settings.BoardSizes do anything. A button carrying Size = 7 is ignored.

The HUD

InstanceHolds
TurnWhose move it is, from Settings.Messages
ClockThe per-move countdown. Hidden when MoveSeconds is nil
ResignA button. Resigning ends the game as a loss

The result banner

Result is a TextLabel. It shows one of the ResultMessages strings and stays up for ResetDelay seconds, during which the win line is highlighted on the board itself.

The board is in the world, not on screen

Clicking a cell happens on the board model, not in the interface. The client turns a click into a cell index using the same geometry the server uses, and the server rejects an index that is not a legal move for that player at that moment.

That means a re-skin of the interface cannot break the board, and a modified client cannot place a mark out of turn.

Mobile

A responsive module scales the interface for small screens. Keep buttons at a size a thumb can hit, and keep corner radii small: the house style is square-ish, and a large radius on a small button reads as a different product.

Re-skinning it

Edit the copy under ServerScriptService/uxrTicTacToeSystem/Client/. The bootstrap clones it into StarterGui at startup and only when no ScreenGui of that name is already there, so edits made to the StarterGui copy last until the next Play.

Frames you add in Studio are kept, because the ScreenGui is marked to ignore unknown instances. Frames the code looks for by name are not optional; renaming one stops that part of the interface updating and leaves the rest working.