| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | /** |
| 3 | - * Desktop Mode — Games bootstrap. | |
| 3 | + * OpenStation — Games bootstrap. | |
| 4 | 4 | * |
| 5 | 5 | * Loads the game system: schema (scores + challenges tables), the |
| 6 | 6 | * framework config (shared dictionary URL), the server-side |
| 7 | 7 | * game registry, the score/challenge store, the play-time store, |
| @@ -8,23 +8,73 @@ | ||
| 8 | 8 | * REST routes, the Heartbeat challenge channel, the Games window + |
| 9 | 9 | * desktop icon, and the built-in game registrations (Inkfall, |
| 10 | 10 | * Alphabet Soup). |
| 11 | 11 | * |
| 12 | - * New `require_once` lines belong here so the rest of the codebase | |
| 13 | - * keeps loading the feature through one entry point. | |
| 12 | + * The whole module is gated on the site-wide `games` extended option | |
| 13 | + * (OS Settings → Features → Extended options, admins only), which is | |
| 14 | + * OFF by default — games are opt-in. While the option is off, none of | |
| 15 | + * the module files load — no tables check on `init`, no REST routes, | |
| 16 | + * no Heartbeat channel, no window/icon — so the games framework costs | |
| 17 | + * nothing beyond the option read below. | |
| 18 | + * For third-party plugins the disabled state is indistinguishable from | |
| 19 | + * OpenStation not being active: `openstation_register_game()` is | |
| 20 | + * undefined, which the documented `function_exists()` guard already | |
| 21 | + * handles (see docs/examples/register-game.md). | |
| 14 | 22 | * |
| 15 | - * @package WPDesktopMode | |
| 16 | - * @since 0.9.6 | |
| 23 | + * Loading is deferred to `plugins_loaded` (priority 5) so any regular | |
| 24 | + * plugin can hook the `openstation_games_enabled` filter in time to | |
| 25 | + * influence the decision. | |
| 26 | + * | |
| 27 | + * New `require_once` lines belong in the loader below so the rest of | |
| 28 | + * the codebase keeps loading the feature through one entry point. | |
| 29 | + * | |
| 30 | + * @package OpenStation | |
| 17 | 31 | */ |
| 18 | 32 | |
| 19 | 33 | defined( 'ABSPATH' ) || exit; |
| 20 | 34 | |
| 21 | -require_once DESKTOP_MODE_DIR . 'includes/games/schema.php'; | |
| 22 | -require_once DESKTOP_MODE_DIR . 'includes/games/config.php'; | |
| 23 | -require_once DESKTOP_MODE_DIR . 'includes/games/registry.php'; | |
| 24 | -require_once DESKTOP_MODE_DIR . 'includes/games/store.php'; | |
| 25 | -require_once DESKTOP_MODE_DIR . 'includes/games/playtime.php'; | |
| 26 | -require_once DESKTOP_MODE_DIR . 'includes/games/rest.php'; | |
| 27 | -require_once DESKTOP_MODE_DIR . 'includes/games/heartbeat.php'; | |
| 28 | -require_once DESKTOP_MODE_DIR . 'includes/games/window.php'; | |
| 29 | -require_once DESKTOP_MODE_DIR . 'includes/games/inkfall.php'; | |
| 30 | -require_once DESKTOP_MODE_DIR . 'includes/games/alphabet-soup.php'; | |
| 35 | +/** | |
| 36 | + * Whether the games framework is enabled site-wide. | |
| 37 | + * | |
| 38 | + * Backed by the `games` key of the extended options bundle | |
| 39 | + * (`openstation_get_extended_options()`), default off — opt-in. | |
| 40 | + * | |
| 41 | + * @return bool | |
| 42 | + */ | |
| 43 | +function openstation_games_enabled() { | |
| 44 | + $options = openstation_get_extended_options(); | |
| 45 | + $enabled = ! empty( $options['games'] ); | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Filters whether the games framework is enabled site-wide. | |
| 49 | + * | |
| 50 | + * Runs on `plugins_loaded` (priority 5) to decide whether the | |
| 51 | + * games module loads at all, and again at runtime wherever the | |
| 52 | + * enabled state is consulted (payload build, shell config). | |
| 53 | + * | |
| 54 | + * @param bool $enabled Whether the games framework is enabled. | |
| 55 | + */ | |
| 56 | + return (bool) apply_filters( 'openstation_games_enabled', $enabled ); | |
| 57 | +} | |
| 58 | + | |
| 59 | +/** | |
| 60 | + * Loads the games module when the framework is enabled. | |
| 61 | + * | |
| 62 | + * @access private | |
| 63 | + */ | |
| 64 | +function openstation_games_load() { | |
| 65 | + if ( ! openstation_games_enabled() ) { | |
| 66 | + return; | |
| 67 | + } | |
| 68 | + | |
| 69 | + require_once OPENSTATION_DIR . 'includes/games/schema.php'; | |
| 70 | + require_once OPENSTATION_DIR . 'includes/games/config.php'; | |
| 71 | + require_once OPENSTATION_DIR . 'includes/games/registry.php'; | |
| 72 | + require_once OPENSTATION_DIR . 'includes/games/store.php'; | |
| 73 | + require_once OPENSTATION_DIR . 'includes/games/playtime.php'; | |
| 74 | + require_once OPENSTATION_DIR . 'includes/games/rest.php'; | |
| 75 | + require_once OPENSTATION_DIR . 'includes/games/heartbeat.php'; | |
| 76 | + require_once OPENSTATION_DIR . 'includes/games/window.php'; | |
| 77 | + require_once OPENSTATION_DIR . 'includes/games/inkfall.php'; | |
| 78 | + require_once OPENSTATION_DIR . 'includes/games/alphabet-soup.php'; | |
| 79 | +} | |
| 80 | +add_action( 'plugins_loaded', 'openstation_games_load', 5 ); | |