API
Last updated
Was this helpful?
Last updated
Was this helpful?
Elements on this page refer to the f, , and of an Empirica experiment.
This document describes Empirica's , and APIs.
Empirica.gameInit(callback)
The gameInit
callback is called just before a game starts, when all players are ready, and it must create rounds and stages for the game.
One (and one only) gameInit callback is required for Empirica to work.
The callback receives one argument, the , which gives access to the players
and the treatment for this game.
It also offers the addRound()
method, which allows to add a round to the game
. The returned Round object will implement the addStage(stageArgs)
method, which allows to add a Stage to the Round. The stageArgs
object to be passed to the stage creation method must contain:
name
: the name used to identify this stage in the UI code
displayName
: which will be showed to the UI to players
durationInSeconds
: the stage duration, in seconds
Note that the Game has not yet been created when the callback is called, and you do not have access to the other properties of the Game which will be created subsequently.
Game hooks are optional methods attached to various events throughout the game life cycle to update data on the server-side.
Contrary to client side data updates, sever-side updates are synchronous, there is no risk of conflicting updates, and important calculations can be taken at precise points along the game.
Empirica.onGameStart(callback)
Empirica.onRoundStart(callback)
Empirica.onStageStart(callback)
Empirica.onStageEnd(callback)
Empirica.onRoundEnd(callback)
Empirica.onGameEnd(callback)
onGameEnd
is triggered when the game ends. It receives the game
that just ended.
It is very useful to be able to react to each update a user makes. Try nontheless to limit the amount of computations and database saves done in these callbacks. You can also try to limit the amount of calls to set()
and append()
you make (avoid calling them on a continuous drag of a slider for example) and inside these callbacks use the key
argument at the very beginning of the callback to filter out which keys your need to run logic against.
If you are not using these callbacks, comment them out, so the system does not call them for nothing.
Empirica.onSet(callback)
onSet
is called when the experiment code call the .set()
method on games, rounds, stages, players, playerRounds or playerStages.
Empirica.onAppend(callback)
onSet
is called when the experiment code call the .append()
method on games, rounds, stages, players, playerRounds or playerStages.
Empirica.onChange(callback)
onChange
is called when the experiment code call the .set()
or the .append()
method on games, rounds, stages, players, playerRounds or playerStages.
onChange
is useful to run server-side logic for any user interaction. Note the extra isAppend
boolean that will allow to differenciate sets and appends.
Empirica.onSubmit(callback)
onSubmit
is called when the experiment code call the .submit()
on a Stage.
Note that onSubmit is only called if .submit()
is explicitely called on the Stage object. Players for which the stage times out naturally, onSubmit
will not be triggered.
Adding bots to a game is as simple as defining a few callbacks. You can add different bots with different behaviors.
Empirica.bot(name, configuration)
The bot
method allows to add a bot with name
(e.g. "Alice"), while the configuration
is a set of callbacks that will allow to configure how the bot is suppose to react in certain conditions.
The configuration
has the follows callbacks:
onStageTick
: called during each stage at 1 second interval
onStageStart
: CURRENTLY NOT SUPPORTED called at the beginning of each
stage (after onRoundStart
/onStageStart
)
onStageEnd
: CURRENTLY NOT SUPPORTED called at the end of each stage
(after onStageEnd
, before onRoundEnd
if it's the enf of the round)
onPlayerChange
: CURRENTLY NOT SUPPORTED called each time any (human)
player has changed a value
All callbacks are called with the following arguments:
bot
: is the Player
object representing this bot
game
: the current Game
round
: the current Round
stage
: the current Stage
secondsRemaining
: the number of remaining seconds in the stage
Empirica.round(Component)
Set the Round
Component that will contain all of the UI logic for your game.
Component will receive the following props:
Prop
Type
Description
game
The current game.
player
The current player.
round
The current round.
stage
The current stage.
Empirica.consent(Component)
Optionally set the Consent
Component you want to present players before they are allowed to register.
Component will receive the following props:
Prop
Type
Description
onConsent
Function
A function to call when the user has given consent (usually, clicked a "I consent" button).
Empirica.introSteps(callback)
Set the intro steps to present to the user after consent and registration, and before they are allowed into the Lobby. These steps might be instructions, a quiz/test, a survey... You may present the steps in multiple pages.
The introSteps
callback should return an array of 0 or more React Components to show the user in order.
Component will receive the following props:
Prop
Type
Description
game
player
N.B.: The game
given here only has the treatment
field defined as the game has not yet been created.
N.B.: InstructionStepOne
or Quiz
, in this example, are components that are not implemented in this example, they are simply React Components.
Empirica.exitSteps(callback)
Set the exit steps to present to the user after the game has finished successfully (all rounds finished) or not (lobby timeout, cancelled game,...)
The exitSteps
callback should return an array of 1 or more React Components to show the user in order.
Component will receive the following props:
Prop
Type
Description
game
The current game.
player
The current player.
N.B.: ExitSurvey
or Thanks
, in this example, are components that are not implemented in this example, they are simply React Components.
Empirica.lobby(Component)
Optionally set the Lobby
Component to replace the default lobby.
Component will receive the following props:
Prop
Type
Description
gameLobby
The current game lobby.
player
The current player.
Empirica.header(Component)
Optionally set the Header
Component to replace the default app header.
Component will NOT receive any props.
Empirica.breadcrumb(Component)
Optionally set the Breadcrumb
Component to replace the default Round/Stage progress indicator. This is the UI that shows which are the current Round and Stage, between the page Header and the Round
Component will receive the following props:
Prop
Type
Description
game
The current game.
player
The current player.
round
The current round.
stage
The current stage.
Empirica.routes()
routes
are the entry point for the Empirica app. It is required to be used as part of the React render tree for Empirica to work properly and the example below usually does not need changing, other than the HTML node to attach to (document.getElementById("app")
here).
N.B.: This must be called after any other Empirica calls (Empirica.round(), Empirica.introSteps(), ...).
Game
objectProperty
Type
Description
index
Number
An auto-increment number assigned to each Game in order (1, 2, 3...)
treatment
Object (key: String, value: String or Integer)
An object representing the Factors set on this game, e.g. { "playerCount": 12 }
.
players
Players participating in this Game.
rounds
On the server side, this will show every round that makes up the game. But on the client side, this will only show the current round.
createdAt
Date
Time at which the game was created which corresponds approximately to the time at which the Game started.
Round
objectProperty
Type
Description
index
Object
The 0 based position of the current round in the ordered list of rounds in a game.
stages
Stages composing this Round.
Stage
objectProperty
Type
Description
index
Object
The 0 based position of the current stage in the ordered list of a all of the game's stages.
name
String
Programmatic name of stage (i.e. to be used in code, e.g if (name === "outcome") ...
).
displayName
String
Human name of stage (i.e. to be showed to the Player, e.g "Round Outcome").
durationInSeconds
Integer
The stage duration, in seconds.
startTimeAt
Date
Time at which the stage started. (only set if stage has already started, i.e. not set in onStageStart
).
Player
objectProperty
Type
Description
index
Number
An auto-increment number assigned to each Player in order (1, 2, 3...)
id
String
The ID the player used to register (e.g. MTurk ID).
urlParams
Object (key/value: String)
Parameters that were set on the URL when the user registered.
bot
String
Name of the bot used for this player, if the player is a bot (e.g. Alice
).
readyAt
Date
Time at witch the player became ready (done with intro steps).
exitAt
Date
Time when the player exited the Game (whether the game ended normally or not, see exitStatus).
exitStatus
String
Status of the Player at Game exit. Can be: "gameFull", "gameCancelled", "gameLobbyTimedOut", "playerEndedLobbyWait", "playerLobbyTimedOut", "finished". "finished" represent the normal exit.
online
Boolean
True if the player is currently online.
idle
Boolean
True if the player is currently online but idle. Idleness is defined as either the page not being active (on another tab/window) or not detecting any activity (mouse/keyboard) for more than 60s.
lastActivityAt
Date
Time when the player was last seen online and active (not idle). Server only (this is not accessible on the client at the moment).
lastLogin.at
Date
Time the player last come online (registered, reopened page and auto-login kicked in or re-entered player ID – if they were forgotten).
lastLogin.ip
String
lastLogin.userAgent
String
GameLobby
objectProperty
Type
Description
treatment
Object (key: String, value: String or Integer)
An object representing the Factors set on this game, e.g. { "playerCount": 12 }
.
queuedCount
Integer
Total number of players queued for this game, including ready players and players currently going through the intro steps.
N.B.: There could be more players in queuedCount than specified by the playerCount
Factor, as Empirica can sometimes overbook Games to shorten wait times.
Use gameLobby.treatment.playerCount
to get the expected number of players.
readyCount
Integer
Number of players ready to play. They have completed the intro steps, and they are on the lobby page.
onGameStart
is triggered once per game, before the game starts, and before the first onRoundStart
. It receives the . Contrary to gameInit
, the Game has been created at this point.
onRoundStart
is triggered before each round starts, and before onStageStart
. It receives the same options as , and the that is starting.
onRoundStart
is triggered before each stage starts. It receives the same options as , and the that is starting.
onStageEnd
is triggered after each stage. It receives the current , the current , and that just ended.
onRoundEnd
is triggered after each round. It receives the current , and the that just ended.
, and are called on every single update made by all players in each game, so they can rapidly become computationally expensive and have the potential to seriously slow down the app. Use wisely.
The current .
The current .
Array of
Array of
Array of
of player on last connection.
of player on last connection.