Skip to content

Session zero

tilttek/table-safety

A session zero is the questionnaire a table answers before it plays: the tone, the themes, the expectations, the schedule. Its answers, gathered, form the table's pact.

Questions

A Question has a key, a kind and, for a choice, its options:

KindAnswer
QuestionKind::Texta text, trimmed, up to 2,000 characters
QuestionKind::Choiceone option
QuestionKind::Choicesseveral options, kept in the order of the question

A built-in question has no prompt and no option labels: the application translates them from their keys, as session_zero.questions.<key> and session_zero.options.<question>.<option>. A question the game master writes carries its own prompt — 1 to 300 characters — and its own labels:

new Question('snacks', QuestionKind::Choice, 'What do we snack on?', ['chips' => 'Chips', 'fruit' => 'Fruit']);

A choice question has 2 to 20 options; a question may be required.

The built-in templates

TemplateQuestions
one-shottone, pillars, themes welcome, conflict between characters, character death, comfort
campaign — the defaulttone, pillars, expectations, themes welcome, conflict between characters, character death, frequency, schedule, table rules, comfort
conventionexperience, tone, conflict between characters, comfort
onlinetone, pillars, themes welcome, camera, recording, table rules, comfort

Templates::get('online') returns one, Templates::all() every one. The tone is required, and so is the recording of an online table.

A game master's template

A game master starts from a template and changes it; a Template has 1 to 50 questions, each key once:

$template = Templates::get('convention')
    ->with(new Question('own-1', QuestionKind::Text, 'Anything we should know?'))
    ->without('experience');

with() adds a question at the end, or puts it in the place of the one with its key. The template is kept in the table's settings.

Answers

Template::answer() accepts a participant's answers by question key: a text is trimmed, an option must be one of the question's, an empty answer is left out, a required question needs an answer, and a key the template does not have is refused.

$safety->answerSessionZero($table, $participant, ['tone' => 'dark', 'pillars' => ['mystery', 'social']], $now);

The pact

TableSafety::pact() gathers the answers of a table without saying who gave which: for a choice question, how many chose each option; for a text question, the answers in alphabetical order rather than in the order they were given.

$pact = $safety->pact($table);

$pact->tally('tone');      // ['light' => 0, 'mixed' => 1, 'serious' => 0, 'dark' => 3]
$pact->texts('comfort');   // ['Breaks every hour', 'Captions']
$pact->respondents;        // 4

An answer to an option or a question the template no longer has is left out.