Puzzle Sets

Status: Implemented | 2022

Background

Puzzle sets are the way we group puzzles together. At its heart, Crosswords is a simple UI: It shows available puzzle sets, lets you select them, and then play all the puzzles within the set.

The PuzzleSet class is a GObject that represents a set of puzzles, and can be used by the game to both control the UI and load/save files. It isn’t a widget directly, but provides widgets for the game to display depending on the state of the game.

By default, there is a GResource containing a GKeyFile for every PuzzleSets that stores all information about the set. Originally more PuzzleSet config formats were planned, but over time it became clear that a the resource puzzle set could be extended to provide everything we need.

Interacting with PlayWindow

The PuzzleSet is the primary way for the PlayWindow to communicate with widgets or puzzles.

The main game window provides some UI functionality in the header. That includes the navigation controls, as well

There’s a default implementation of the play_window UI control interfaces within the PuzzleSet. For it to work, three things need to happen. First, ::get_widget() has to be stable and the widget returned have to be constant for the life of the puzzle set. Second, the PUZZLE_PHASE_GAME widget must be PlayXword. Third, subclasses need to chain up to the parent widget.

It is recommended that a subclass either handles none of the PlayWindow interface and chains up, or all of it without chaining.

PuzzleSet properties

PuzzleSets have two game phases that they need to handle: the PICKER phase and the GAME phase.

  • PICKER: Let the user pick a puzzle to play and potentially show a meta-puzzle. This phase is optional but used by every instance in the current game.

  • GAME: Solve an actual crossword.

By default, we provide two different widgets that can be used as a picker (PickerList and PickerGrid). These can be customized and extended through the keyfile.

There is a PuzzlePicker base class to share common functionality between the two pickers, and it’s plausible to write completely type of picker using it.

Directories and File Names

Puzzle sets are all installed in:

$XDG_DATA_DIRS:crosswords/puzzle-sets/

It will search all directories within that path, and can be overridden with the $PUZZLE_SET_PATH environment variable.

The filename should be named either $ID.gresource or $ID.config depending on the type of the puzzle set.


Saved files are all saved in:

$XDG_DATA_DIRS:gnome-crosswords/saved-games/$ID/

Where $ID is the ID of the puzzle-set.


Finally the resource puzzle-set can save files that it has downloaded. Those are stored in

$XDG_DATA_DIRS:gnome-crosswords/downloads/$ID/

Where $ID is the ID of the puzzle-set.