This is a documentation for Board Game Arena: play board games online !
Game options and preferences: gameoptions.inc.php: Розніца паміж версіямі
Victoria la (размовы | уклад) Няма тлумачэння праўкі |
Victoria La (размовы | уклад) |
||
(Не паказана 27 прамежкавых версій 10 удзельнікаў) | |||
Радок 1: | Радок 1: | ||
In this file, you can define your game options (= game variants). | {{Studio_Framework_Navigation}} | ||
In this file, you can define your game options (= game variants) and user preferences. | |||
Note: If your game has no | Note: If your game has no variants or preferences, you don't have to modify this file. | ||
'''IMPORTANT:''' after you edited this file in your SFTP folder you have to go to the control panel and press "Reload game options configuration" for your changes to take effect. | |||
== Game Options == | |||
Game options is something selected by table creator and usually correspond to game variant, for example if game includes expansion or certain special rule. | |||
These variants defined in gameoptions.inc.php as variable | |||
$game_options = array(...); // exactly named that | |||
Each option is pair number => 'option description array'. | |||
All options defined in this file should have a corresponding "game state label" with the same ID (see "initGameStateLabels" in yourgame.game.php) | |||
self::initGameStateLabels ( array ( | |||
... | |||
"my_first_game_variant" => 100, | |||
) ); | |||
That is how you access them during runtime: | |||
$this->gamestate->table_globals[100] | |||
The following are the parameters of option description array: | |||
* '''name''' - '''mandatory'''. The name of the option visible for table creator. Value must be wrapped in totranslate function. | |||
* '''values''' - '''mandatory'''. The array (map) of values with additional parameters per value. | |||
** '''name''' - '''mandatory'''. String representation of the numeric value visible to table creator. Value must be wrapped in totranslate function. | |||
** '''description''' - String description of this value to use when the name of the option is not self-explanatory. Displayed at the table under the option when this value is selected. | |||
** '''tmdisplay''' - String representation of the option visible in the table description, usually if variant "names" are On and Off, but the description would be same as option name when On, and nothing when Off. | |||
** '''nobeginner''' - Set to true if not recommended for begginers | |||
** '''beta''' - Option in beta stage on development | |||
** '''premium''' - Option can be only used by premium members | |||
* '''default''' - indicates the default value to use for this option (optional, if not present the first value listed is the default) | |||
* '''displaycondition''' - checks the conditions before displaying the option for selection. All conditions must be true for the option to display. Supported condition types: | |||
** ''otheroption'' condition ensures another option is set to this given values. | |||
** ''otheroptionisnot'' conditions ensure another option is NOT set to this given values | |||
* '''displayconditionoperand''' - can be 'and' (this is the default) or 'or'. Allows to change the behaviour to display the option if one of the conditions is true instead of all of them. | |||
* '''startcondition''' - checks the conditions (on options VALUES) before starting the game. All conditions must be true for the game to start, otherwise players will get a red error message when attempting to begin the game. Supported condition types: | |||
** ''minplayers'' condition ensures at least this many players | |||
** ''maxplayers'' conditions ensure at most this many players | |||
** ''otheroption'' conditions ensure another option is set to this given values. That works the same as in '''displaycondition'''. | |||
** ''otheroptionisnot'' conditions ensure another option is NOT set to this given value. That works the same as in '''displaycondition'''. | |||
* '''notdisplayedmessage''' - if option is not suppose to be visible because of displaycondition but this is set, the text will be visible instead of combo drop down | |||
Common options for all tables (reserved range 200-299): | |||
*201 (const GAMESTATE_RATING_MODE) - ELO OFF (aka Training mode), | |||
*200 (const GAMESTATE_CLOCK_MODE) - game speed profile, array(0,1,2) - realtime, values 11-21 - turn based | |||
Example: | |||
<pre> | |||
$game_options = array( | |||
100 => array( | |||
'name' => totranslate('my game option'), | |||
'values' => array( | |||
// A simple value for this option: | |||
1 => array( | |||
'name' => totranslate('option 1') | |||
), | |||
// A simple value for this option. | |||
// If this value is chosen, the value of "tmdisplay" is displayed in the game lobby | |||
2 => array( | |||
'name' => totranslate('option 2'), | |||
'tmdisplay' => totranslate('option 2') | |||
), | |||
// Another value, with other options: | |||
// beta=true => this option is in beta version right now. | |||
// nobeginner=true => this option is not recommended for beginners | |||
3 => array( | |||
'name' => totranslate('option 3'), | |||
'beta' => true, | |||
'nobeginner' => true | |||
), | |||
), | |||
'default' => 1 | |||
), | |||
101 => array( | |||
'name' => totranslate('Draft variant'), | |||
'values' => array( | |||
1 => array( | |||
'name' => totranslate('No draft') | |||
), | |||
2 => array( | |||
'name' => totranslate('Draft'), | |||
'tmdisplay' => totranslate('Draft'), | |||
'premium' => true, | |||
'nobeginner' => true | |||
), | |||
), | |||
'displaycondition' => array( | |||
// Note: do not display this option unless these conditions are met | |||
array( | |||
'type' => 'otheroption', | |||
'id' => 100, // Game specific option defined in the same array above | |||
'value' => array(2, 3, 4) | |||
), | |||
// Note: do not display this option unless these conditions are met | |||
array( 'type' => 'otheroption', | |||
'id' => 201, // ELO OFF hardcoded framework option | |||
'value' => 1 // 1 if OFF | |||
) | |||
), | |||
'startcondition' => array( | |||
1 => array(), | |||
2 => array( | |||
array( | |||
'type' => 'maxplayers', | |||
'value' => 3, | |||
'message' => totranslate('Draft option is available for 3 players maximum.') | |||
) | |||
), | |||
), | |||
), | |||
102 => array( | |||
'name' => totranslate('Takeovers'), | |||
'values' => array( | |||
2 => array( | |||
'name' => totranslate('No takeover') | |||
), | |||
1 => array( | |||
'name' => totranslate('Allow takeovers'), | |||
'tmdisplay' => totranslate('Takeovers'), | |||
'premium' => true, | |||
'nobeginner' => true | |||
), | |||
), | |||
'displaycondition' => array( // Note: do not display this option unless these conditions are met | |||
array( | |||
'type' => 'otheroption', | |||
'id' => 100, | |||
'value' => array(3, 4) | |||
) | |||
), | |||
'startcondition' => array( | |||
2 => array(), | |||
1 => array( | |||
array( | |||
'type' => 'maxplayers', | |||
'value' => 2, | |||
'message' => totranslate('Rebel vs Imperium Takeover Scenario is available for 2 players only.') | |||
) | |||
), | |||
), | |||
) | |||
); | |||
</pre> | |||
Example of option that condition on ELO off | |||
<pre> | <pre> | ||
$game_options = array ( | $game_options = array( | ||
100 => array ( | 100 => array( | ||
'name' => totranslate ( ' | 'name' => totranslate('Learning Game (No Research)'), | ||
'values' => array ( | 'values' => array( | ||
1 => array( 'name' => totranslate('Off'), 'tmdisplay' => totranslate('') ), | |||
1 => array ( | 2 => array( 'name' => totranslate('On'), 'tmdisplay' => totranslate('Learning Game') ), | ||
), | |||
// | ), | ||
// | 'displaycondition' => array( | ||
// Note: do not display this option unless these conditions are met | |||
array( 'type' => 'otheroption', | |||
'tmdisplay' => totranslate ( ' | 'id' => 201, // ELO OFF hardcoded framework option | ||
'value' => 1, // 1 if OFF | |||
) | |||
), | |||
'notdisplayedmessage' => totranslate('Learning variant available only with ELO off') | |||
), | |||
); | |||
</pre> | |||
Example of condition that is only available for REALTIME game mode | |||
'displaycondition' => array( // Note: do not display this option until these conditions are met - game speed is selected as realtime | |||
array( 'type' => 'otheroption', 'id' => GAMESTATE_CLOCK_MODE, 'value' => array(0,1,2) ) | |||
), | |||
Example of using condition on your own option | |||
<pre> | |||
102 => array( | |||
'name' => totranslate('Scenarios'), | |||
'values' => array( | |||
1 => array( 'name' => totranslate('Off'), | |||
'nobeginner' => false ), | |||
2 => array( 'name' => totranslate('On'), 'tmdisplay' => totranslate('Scenarios'), | |||
'nobeginner' => true ), | |||
// | ), | ||
// | 'displaycondition' => array( | ||
// Note: do not display this option unless these conditions are met | |||
array( 'type' => 'otheroptionisnot', | |||
'id' => 100, // learning variant | |||
'value' => 2, // 1 if OFF,2 is ON | |||
) | |||
), | |||
'notdisplayedmessage' => totranslate('Scenarios variant is not available if Learning variant is chosen') | |||
), | |||
</pre> | |||
== User Preferences == | |||
User preferences is something cosmetic about the game interface which however can create user wars, so you can satisfy all users | |||
by giving them individual preferences. You should use this only if it significantly improves the interface for a large proportion of users. | |||
<pre> | |||
$game_preferences = array( | |||
100 => array( | |||
'name' => totranslate('Notation style'), | |||
'needReload' => true, // after user changes this preference game interface would auto-reload | |||
'values' => array( | |||
1 => array( 'name' => totranslate( 'Classic' ), 'cssPref' => 'notation_classic' ), | |||
2 => array( 'name' => totranslate( 'Tournament' ), 'cssPref' => 'notation_tournament' ) | |||
) | |||
) | |||
); | ); | ||
</pre> | |||
There is two ways to check/apply this. In java Script | |||
if (this.prefs[100].value == 2) ... | |||
This checks if preferences 100 has selected value 2. | |||
Second, if cssPref specified it will be applied to the '''<html>''' tag. So you can use different css styling for the preference. Note: it seems needed to set needReload to true for that class change to be effective. | |||
As user you have to select them from the Gear menu when game is started. On studio only user0 will have it actually working (bug?). | |||
Актуальная версія на 01:22, 4 кастрычніка 2020
- Main game logic: yourgamename.game.php
- Your game state machine: states.inc.php
- Game database model: dbmodel.sql
- Players actions: yourgamename.action.php
- Game material description: material.inc.php
- Game statistics: stats.inc.php
- Game interface logic: yourgamename.js
- Game art: img directory
- Game interface stylesheet: yourgamename.css
- Game layout: view and template: yourgamename.view.php and yourgamename_yourgamename.tpl
- Your game mobile version
- Translations (how to make your game translatable)
- Game options and preferences: gameoptions.inc.php
- Game meta-information: gameinfos.inc.php
- Game replay
- 3D
- Some usual board game elements image ressources
- Deck: a PHP component to manage cards (deck, hands, picking cards, moving cards, shuffle deck, ...).
- Counter: a JS component to manage a counter that can increase/decrease (ex: player's score).
- Scrollmap: a JS component to manage a scrollable game area (useful when the game area can be infinite. Examples: Saboteur or Takenoko games).
- Stock: a JS component to manage and display a set of game elements displayed at a position.
- Zone: a JS component to manage a zone of the board where several game elements can come and leave, but should be well displayed together (See for example: token's places at Can't Stop).
Undocumented component (if somebody knows please help with docs)
- Draggable: a JS component to manage drag'n'drop actions.
- ExpandableSection: a JS component to manage a rectangular block of HTML than can be displayed/hidden.
- Wrapper: a JS component to wrap a <div> element around its child, even if these elements are absolute positioned.
- BGA game Lifecycle
- First steps with BGA Studio
- Tutorial reversi
- Tutorial gomoku
- Tutorial hearts
- Create a game in BGA Studio: Complete Walkthrough
- Tools and tips of BGA Studio - Tips and instructions on setting up development environment
- Practical debugging - Tips focused on debugging
- Studio logs - Instructions for log access
- BGA Studio Cookbook - Tips and instructions on using API's, libraries and frameworks
- BGA Studio Guidelines
- Troubleshooting - Most common "I am really stuck" situations
- Studio FAQ
- Pre-release checklist - Go throught this list if you think you done development
- Post-release phase
- BGA Code Sharing - Shared resources, projects on git hub, common code, other links
In this file, you can define your game options (= game variants) and user preferences.
Note: If your game has no variants or preferences, you don't have to modify this file.
IMPORTANT: after you edited this file in your SFTP folder you have to go to the control panel and press "Reload game options configuration" for your changes to take effect.
Game Options
Game options is something selected by table creator and usually correspond to game variant, for example if game includes expansion or certain special rule.
These variants defined in gameoptions.inc.php as variable
$game_options = array(...); // exactly named that
Each option is pair number => 'option description array'.
All options defined in this file should have a corresponding "game state label" with the same ID (see "initGameStateLabels" in yourgame.game.php)
self::initGameStateLabels ( array ( ... "my_first_game_variant" => 100, ) );
That is how you access them during runtime:
$this->gamestate->table_globals[100]
The following are the parameters of option description array:
- name - mandatory. The name of the option visible for table creator. Value must be wrapped in totranslate function.
- values - mandatory. The array (map) of values with additional parameters per value.
- name - mandatory. String representation of the numeric value visible to table creator. Value must be wrapped in totranslate function.
- description - String description of this value to use when the name of the option is not self-explanatory. Displayed at the table under the option when this value is selected.
- tmdisplay - String representation of the option visible in the table description, usually if variant "names" are On and Off, but the description would be same as option name when On, and nothing when Off.
- nobeginner - Set to true if not recommended for begginers
- beta - Option in beta stage on development
- premium - Option can be only used by premium members
- default - indicates the default value to use for this option (optional, if not present the first value listed is the default)
- displaycondition - checks the conditions before displaying the option for selection. All conditions must be true for the option to display. Supported condition types:
- otheroption condition ensures another option is set to this given values.
- otheroptionisnot conditions ensure another option is NOT set to this given values
- displayconditionoperand - can be 'and' (this is the default) or 'or'. Allows to change the behaviour to display the option if one of the conditions is true instead of all of them.
- startcondition - checks the conditions (on options VALUES) before starting the game. All conditions must be true for the game to start, otherwise players will get a red error message when attempting to begin the game. Supported condition types:
- minplayers condition ensures at least this many players
- maxplayers conditions ensure at most this many players
- otheroption conditions ensure another option is set to this given values. That works the same as in displaycondition.
- otheroptionisnot conditions ensure another option is NOT set to this given value. That works the same as in displaycondition.
- notdisplayedmessage - if option is not suppose to be visible because of displaycondition but this is set, the text will be visible instead of combo drop down
Common options for all tables (reserved range 200-299):
- 201 (const GAMESTATE_RATING_MODE) - ELO OFF (aka Training mode),
- 200 (const GAMESTATE_CLOCK_MODE) - game speed profile, array(0,1,2) - realtime, values 11-21 - turn based
Example:
$game_options = array( 100 => array( 'name' => totranslate('my game option'), 'values' => array( // A simple value for this option: 1 => array( 'name' => totranslate('option 1') ), // A simple value for this option. // If this value is chosen, the value of "tmdisplay" is displayed in the game lobby 2 => array( 'name' => totranslate('option 2'), 'tmdisplay' => totranslate('option 2') ), // Another value, with other options: // beta=true => this option is in beta version right now. // nobeginner=true => this option is not recommended for beginners 3 => array( 'name' => totranslate('option 3'), 'beta' => true, 'nobeginner' => true ), ), 'default' => 1 ), 101 => array( 'name' => totranslate('Draft variant'), 'values' => array( 1 => array( 'name' => totranslate('No draft') ), 2 => array( 'name' => totranslate('Draft'), 'tmdisplay' => totranslate('Draft'), 'premium' => true, 'nobeginner' => true ), ), 'displaycondition' => array( // Note: do not display this option unless these conditions are met array( 'type' => 'otheroption', 'id' => 100, // Game specific option defined in the same array above 'value' => array(2, 3, 4) ), // Note: do not display this option unless these conditions are met array( 'type' => 'otheroption', 'id' => 201, // ELO OFF hardcoded framework option 'value' => 1 // 1 if OFF ) ), 'startcondition' => array( 1 => array(), 2 => array( array( 'type' => 'maxplayers', 'value' => 3, 'message' => totranslate('Draft option is available for 3 players maximum.') ) ), ), ), 102 => array( 'name' => totranslate('Takeovers'), 'values' => array( 2 => array( 'name' => totranslate('No takeover') ), 1 => array( 'name' => totranslate('Allow takeovers'), 'tmdisplay' => totranslate('Takeovers'), 'premium' => true, 'nobeginner' => true ), ), 'displaycondition' => array( // Note: do not display this option unless these conditions are met array( 'type' => 'otheroption', 'id' => 100, 'value' => array(3, 4) ) ), 'startcondition' => array( 2 => array(), 1 => array( array( 'type' => 'maxplayers', 'value' => 2, 'message' => totranslate('Rebel vs Imperium Takeover Scenario is available for 2 players only.') ) ), ), ) );
Example of option that condition on ELO off
$game_options = array( 100 => array( 'name' => totranslate('Learning Game (No Research)'), 'values' => array( 1 => array( 'name' => totranslate('Off'), 'tmdisplay' => totranslate('') ), 2 => array( 'name' => totranslate('On'), 'tmdisplay' => totranslate('Learning Game') ), ), 'displaycondition' => array( // Note: do not display this option unless these conditions are met array( 'type' => 'otheroption', 'id' => 201, // ELO OFF hardcoded framework option 'value' => 1, // 1 if OFF ) ), 'notdisplayedmessage' => totranslate('Learning variant available only with ELO off') ), );
Example of condition that is only available for REALTIME game mode
'displaycondition' => array( // Note: do not display this option until these conditions are met - game speed is selected as realtime
array( 'type' => 'otheroption', 'id' => GAMESTATE_CLOCK_MODE, 'value' => array(0,1,2) ) ),
Example of using condition on your own option
102 => array( 'name' => totranslate('Scenarios'), 'values' => array( 1 => array( 'name' => totranslate('Off'), 'nobeginner' => false ), 2 => array( 'name' => totranslate('On'), 'tmdisplay' => totranslate('Scenarios'), 'nobeginner' => true ), ), 'displaycondition' => array( // Note: do not display this option unless these conditions are met array( 'type' => 'otheroptionisnot', 'id' => 100, // learning variant 'value' => 2, // 1 if OFF,2 is ON ) ), 'notdisplayedmessage' => totranslate('Scenarios variant is not available if Learning variant is chosen') ),
User Preferences
User preferences is something cosmetic about the game interface which however can create user wars, so you can satisfy all users by giving them individual preferences. You should use this only if it significantly improves the interface for a large proportion of users.
$game_preferences = array( 100 => array( 'name' => totranslate('Notation style'), 'needReload' => true, // after user changes this preference game interface would auto-reload 'values' => array( 1 => array( 'name' => totranslate( 'Classic' ), 'cssPref' => 'notation_classic' ), 2 => array( 'name' => totranslate( 'Tournament' ), 'cssPref' => 'notation_tournament' ) ) ) );
There is two ways to check/apply this. In java Script
if (this.prefs[100].value == 2) ...
This checks if preferences 100 has selected value 2.
Second, if cssPref specified it will be applied to the <html> tag. So you can use different css styling for the preference. Note: it seems needed to set needReload to true for that class change to be effective.
As user you have to select them from the Gear menu when game is started. On studio only user0 will have it actually working (bug?).