narrat 2.0.10 → 2.0.13-test

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +15 -0
  2. package/dist/assets/lib.d7c0f4e9.css +1 -0
  3. package/dist/components/hud.vue.d.ts +3 -1
  4. package/dist/components/screen-layer.vue.d.ts +54 -0
  5. package/dist/components/screens.vue.d.ts +46 -0
  6. package/dist/config.d.ts +21 -7
  7. package/dist/img/backgrounds/rpg.png +0 -0
  8. package/dist/img/backgrounds/test-layers.gif +0 -0
  9. package/dist/img/enemies/goblin.png +0 -0
  10. package/dist/img/enemies/skeleton.png +0 -0
  11. package/dist/img/enemies/slime.png +0 -0
  12. package/dist/img/levels/cave.png +0 -0
  13. package/dist/img/levels/dungeon.png +0 -0
  14. package/dist/img/levels/dungeon_F.png +0 -0
  15. package/dist/img/levels/dungeon_FL.png +0 -0
  16. package/dist/img/levels/dungeon_FR.png +0 -0
  17. package/dist/img/levels/dungeon_FRL.png +0 -0
  18. package/dist/img/levels/dungeon_LR.png +0 -0
  19. package/dist/img/levels/grass.png +0 -0
  20. package/dist/img/players/wizard.png +0 -0
  21. package/dist/img/ui/front.png +0 -0
  22. package/dist/img/ui/left.png +0 -0
  23. package/dist/img/ui/right.png +0 -0
  24. package/dist/img/ui/start.png +0 -0
  25. package/dist/main.d.ts +4 -4
  26. package/dist/narrat.es.js +30747 -33067
  27. package/dist/narrat.es.js.map +1 -1
  28. package/dist/narrat.umd.js +87 -96
  29. package/dist/narrat.umd.js.map +1 -1
  30. package/dist/stores/main-store.d.ts +72 -8
  31. package/dist/stores/screens-store.d.ts +9 -9
  32. package/dist/stores/skills.d.ts +4 -0
  33. package/dist/types/app-types.d.ts +1 -0
  34. package/dist/types/parser.d.ts +1 -1
  35. package/dist/vm/commands/arithmetic-commands.d.ts +6 -0
  36. package/dist/vm/commands/command-helpers.d.ts +1 -0
  37. package/dist/vm/commands/flow-commands.d.ts +3 -0
  38. package/dist/vm/commands/math-commands.d.ts +14 -0
  39. package/dist/vm/commands/random-commands.d.ts +10 -0
  40. package/dist/vm/commands/screen-commands.d.ts +5 -1
  41. package/dist/vm/commands/skill-commands.d.ts +12 -0
  42. package/dist/vm/vm-helpers.d.ts +2 -0
  43. package/dist/vm/vm.d.ts +0 -1
  44. package/package.json +5 -2
  45. package/dist/audio/click.ogg +0 -0
  46. package/dist/audio/failure.ogg +0 -0
  47. package/dist/audio/game_start.ogg +0 -0
  48. package/dist/audio/success.wav +0 -0
  49. package/dist/audio.7z +0 -0
  50. package/dist/data/characters.json +0 -62
  51. package/dist/data/config.json +0 -182
  52. package/dist/data/example.rpy +0 -367
  53. package/dist/data/refactor.rpy +0 -31
  54. package/dist/fonts/OpenDyslexic.ttf.eot +0 -0
  55. package/dist/fonts/OpenDyslexic.ttf.svg +0 -2326
  56. package/dist/fonts/OpenDyslexic.ttf.woff +0 -0
  57. package/dist/gameloop.d.ts +0 -3
  58. package/dist/img/characters/music_cat.jpeg +0 -0
  59. package/dist/lib.css +0 -1
  60. package/dist/music/calm.mp3 +0 -0
@@ -19,7 +19,27 @@ interface MainState {
19
19
  export interface MainSaveData {
20
20
  playTime: number;
21
21
  }
22
- export declare const useMain: import("pinia").StoreDefinition<"main", MainState, {}, {
22
+ export declare const useMain: import("pinia").StoreDefinition<"main", MainState, {
23
+ isInGame(state: {
24
+ ready: boolean;
25
+ playing: boolean;
26
+ errors: {
27
+ text: string;
28
+ }[];
29
+ playTime: {
30
+ start: number;
31
+ previousPlaytime: number;
32
+ };
33
+ options: {
34
+ baseAssetsPath?: string | undefined;
35
+ logging: boolean;
36
+ debug: boolean;
37
+ };
38
+ flowState: 'menu' | 'playing';
39
+ modal: string | false;
40
+ paused: boolean;
41
+ } & import("pinia").PiniaCustomStateProperties<MainState>): boolean;
42
+ }, {
23
43
  setup(scriptPaths: string[], config: Config): Promise<void>;
24
44
  startMachine(): void;
25
45
  startGame(): Promise<void>;
@@ -53,22 +73,62 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
53
73
  previousPlaytime: number;
54
74
  };
55
75
  options: {
76
+ baseAssetsPath?: string | undefined;
56
77
  logging: boolean;
57
78
  debug: boolean;
58
79
  };
59
80
  flowState: 'menu' | 'playing';
60
81
  modal: string | false;
61
82
  paused: boolean;
62
- } & import("pinia")._StoreWithState<"main", MainState, {}, any> & import("pinia")._StoreWithGetters<{}> & import("pinia").PiniaCustomProperties<string, import("pinia").StateTree, import("pinia")._GettersTree<import("pinia").StateTree>, import("pinia")._ActionsTree>;
83
+ } & import("pinia")._StoreWithState<"main", MainState, {
84
+ isInGame(state: {
85
+ ready: boolean;
86
+ playing: boolean;
87
+ errors: {
88
+ text: string;
89
+ }[];
90
+ playTime: {
91
+ start: number;
92
+ previousPlaytime: number;
93
+ };
94
+ options: {
95
+ baseAssetsPath?: string | undefined;
96
+ logging: boolean;
97
+ debug: boolean;
98
+ };
99
+ flowState: 'menu' | 'playing';
100
+ modal: string | false;
101
+ paused: boolean;
102
+ } & import("pinia").PiniaCustomStateProperties<MainState>): boolean;
103
+ }, any> & import("pinia")._StoreWithGetters<{
104
+ isInGame(state: {
105
+ ready: boolean;
106
+ playing: boolean;
107
+ errors: {
108
+ text: string;
109
+ }[];
110
+ playTime: {
111
+ start: number;
112
+ previousPlaytime: number;
113
+ };
114
+ options: {
115
+ baseAssetsPath?: string | undefined;
116
+ logging: boolean;
117
+ debug: boolean;
118
+ };
119
+ flowState: 'menu' | 'playing';
120
+ modal: string | false;
121
+ paused: boolean;
122
+ } & import("pinia").PiniaCustomStateProperties<MainState>): boolean;
123
+ }> & import("pinia").PiniaCustomProperties<string, import("pinia").StateTree, import("pinia")._GettersTree<import("pinia").StateTree>, import("pinia")._ActionsTree>;
63
124
  screens: import("pinia").Store<"screens", {
64
- currentScreen: string;
125
+ layers: string[];
65
126
  buttons: import("./screens-store").ButtonsState;
66
127
  }, {}, {
67
- setScreen(screen: string): void;
68
- setButtons(buttons: {
69
- [key: string]: import("../config").ButtonConfig;
70
- }): void;
71
- changeButton(button: string, newValue: boolean): void;
128
+ setScreen(screen: string, layer?: number | undefined): void;
129
+ emptyLayer(layer: number): void;
130
+ setButtons(config: Config): void;
131
+ changeButton(button: string, newValue: import("./screens-store").ButtonStateValue): void;
72
132
  generateSaveData(): import("./screens-store").ScreenState;
73
133
  loadSaveData(data: import("./screens-store").ScreenState): void;
74
134
  }>;
@@ -83,7 +143,11 @@ export declare const useMain: import("pinia").StoreDefinition<"main", MainState,
83
143
  setupSkills(skills: {
84
144
  [key: string]: import("../config").SkillData;
85
145
  }): void;
146
+ getSkill(skill: string): import("./skills").SkillState;
147
+ getSkillLevel(skill: string): number;
148
+ getSkillXp(skill: string): number;
86
149
  addXp(skill: string, xp: number): void;
150
+ setSkillLevel(skill: string, level: number): void;
87
151
  incrementSkill(skill: string, amount: number): void;
88
152
  levelledUp(skill: string): void;
89
153
  }>;
@@ -1,23 +1,23 @@
1
- import { ButtonConfig } from '../config';
1
+ import { Config } from '../config';
2
+ export declare type ButtonStateValue = boolean | 'hidden' | 'greyed';
2
3
  export interface ButtonsState {
3
4
  [key: string]: {
4
- enabled: boolean;
5
+ state: ButtonStateValue;
5
6
  };
6
7
  }
7
8
  export interface ScreenState {
8
- currentScreen: string;
9
+ layers: string[];
9
10
  buttons: ButtonsState;
10
11
  }
11
12
  export declare type ScreenSave = ScreenState;
12
13
  export declare const useScreens: import("pinia").StoreDefinition<"screens", {
13
- currentScreen: string;
14
+ layers: string[];
14
15
  buttons: ButtonsState;
15
16
  }, {}, {
16
- setScreen(screen: string): void;
17
- setButtons(buttons: {
18
- [key: string]: ButtonConfig;
19
- }): void;
20
- changeButton(button: string, newValue: boolean): void;
17
+ setScreen(screen: string, layer?: number): void;
18
+ emptyLayer(layer: number): void;
19
+ setButtons(config: Config): void;
20
+ changeButton(button: string, newValue: ButtonStateValue): void;
21
21
  generateSaveData(): ScreenSave;
22
22
  loadSaveData(data: ScreenSave): void;
23
23
  }>;
@@ -30,7 +30,11 @@ export declare const useSkills: import("pinia").StoreDefinition<"skills", Skills
30
30
  setupSkills(skills: {
31
31
  [key: string]: SkillData;
32
32
  }): void;
33
+ getSkill(skill: string): SkillState;
34
+ getSkillLevel(skill: string): number;
35
+ getSkillXp(skill: string): number;
33
36
  addXp(skill: string, xp: number): void;
37
+ setSkillLevel(skill: string, level: number): void;
34
38
  incrementSkill(skill: string, amount: number): void;
35
39
  levelledUp(skill: string): void;
36
40
  }>;
@@ -1,4 +1,5 @@
1
1
  export interface GameConfig {
2
+ baseAssetsPath?: string;
2
3
  charactersPath: string;
3
4
  configPath: string;
4
5
  }
@@ -1,5 +1,5 @@
1
1
  export declare namespace Parser {
2
- type Primitive = string | number | boolean;
2
+ type Primitive = string | number | boolean | undefined | null;
3
3
  type Expression = Array<Primitive | Expression>;
4
4
  interface IfOptions {
5
5
  condition: string;
@@ -7,6 +7,12 @@ export declare const substractionPlugin: CommandPlugin<{
7
7
  a: number;
8
8
  b: number;
9
9
  }, {}>;
10
+ export declare const negPlugin: CommandPlugin<{
11
+ a: number;
12
+ }, {}>;
13
+ export declare const absPlugin: CommandPlugin<{
14
+ a: number;
15
+ }, {}>;
10
16
  export declare const multiplicationPlugin: CommandPlugin<{
11
17
  a: number;
12
18
  b: number;
@@ -1,2 +1,3 @@
1
1
  import { Parser } from '../../types/parser';
2
2
  export declare function commandRuntimeError(cmd: Parser.Command<any, any>, errorText: string): void;
3
+ export declare function commandLog(cmd: Parser.Command<any, any>, ...log: any[]): void;
@@ -12,3 +12,6 @@ export declare const defineVariablePlugin: CommandPlugin<{
12
12
  export declare const returnPlugin: CommandPlugin<{
13
13
  value: any;
14
14
  }, {}>;
15
+ export declare const logPlugin: CommandPlugin<{
16
+ value: any;
17
+ }, {}>;
@@ -0,0 +1,14 @@
1
+ import { CommandPlugin } from './command-plugin';
2
+ export declare const minPlugin: CommandPlugin<{
3
+ min: number;
4
+ value: number;
5
+ }, {}>;
6
+ export declare const maxPlugin: CommandPlugin<{
7
+ max: number;
8
+ value: number;
9
+ }, {}>;
10
+ export declare const clampPlugin: CommandPlugin<{
11
+ min: number;
12
+ max: number;
13
+ value: number;
14
+ }, {}>;
@@ -0,0 +1,10 @@
1
+ import { CommandPlugin } from './command-plugin';
2
+ export declare const randomIntPlugin: CommandPlugin<{
3
+ a: number;
4
+ b: number;
5
+ }, {}>;
6
+ export declare const randomFloatPlugin: CommandPlugin<{
7
+ a: number;
8
+ b: number;
9
+ }, {}>;
10
+ export declare const randomFromArgsPlugin: CommandPlugin<{}, {}>;
@@ -1,8 +1,12 @@
1
1
  import { CommandPlugin } from './command-plugin';
2
2
  export declare const setScreenCommand: CommandPlugin<{
3
3
  screen: string;
4
+ layer: number;
5
+ }, {}>;
6
+ export declare const emptyLayerCommand: CommandPlugin<{
7
+ layer: number;
4
8
  }, {}>;
5
9
  export declare const setButtonCommand: CommandPlugin<{
6
10
  buttonId: string;
7
- enabled: boolean;
11
+ state: any;
8
12
  }, {}>;
@@ -5,11 +5,23 @@ export interface AddLevelArgs {
5
5
  amount: number;
6
6
  }
7
7
  export declare const addLevelPlugin: CommandPlugin<AddLevelArgs, {}>;
8
+ export declare const setLevelPlugin: CommandPlugin<{
9
+ skill: string;
10
+ level: number;
11
+ }, {}>;
8
12
  export interface AddXpArgs {
9
13
  xpKey: string;
10
14
  xpToAdd: number;
11
15
  }
12
16
  export declare const addXpPlugin: CommandPlugin<AddXpArgs, {}>;
17
+ export interface GetLevelArgs {
18
+ skillKey: string;
19
+ }
20
+ export declare const getLevelPlugin: CommandPlugin<GetLevelArgs, {}>;
21
+ export interface GetXpArgs {
22
+ xpKey: string;
23
+ }
24
+ export declare const getXpPlugin: CommandPlugin<GetXpArgs, {}>;
13
25
  export interface SkillCheckOptions {
14
26
  id: string;
15
27
  skill: string;
@@ -11,6 +11,8 @@ export interface SkillCheckParams {
11
11
  export declare function runSkillCheck(params: SkillCheckParams): SkillCheckState;
12
12
  export declare function runConditionCommand(command: Parser.Command<IfOptions, IfStaticOptions>): Parser.Branch | undefined;
13
13
  export declare function isExpression(arg: Parser.Arg): arg is Parser.ParsedExpression;
14
+ export declare type Variable = string | number | boolean | undefined | null;
15
+ export declare function isVariable(arg: Parser.Arg): arg is Variable;
14
16
  export declare function writeText(text: string): void;
15
17
  export declare function textCommand(dialog: AddDialogParams): Promise<void>;
16
18
  export declare function getLine(lines: Parser.Line[], index: number): Parser.Line | undefined;
package/dist/vm/vm.d.ts CHANGED
@@ -16,4 +16,3 @@ export declare function runCommand(expression: Parser.ParsedExpression, choices?
16
16
  export declare function generateCommand(expr: Parser.ParsedExpression, choices?: DialogChoice[]): Promise<Parser.Command>;
17
17
  export declare function runExpression<ReturnType = any>(expr: Parser.ParsedExpression, choices?: DialogChoice[]): Promise<ReturnType>;
18
18
  export declare function playerAnswered(choice: string | number): Promise<any>;
19
- export declare function finishGame(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "narrat",
3
- "version": "2.0.10",
3
+ "version": "2.0.13-test",
4
4
  "description": "narrat narrative engine",
5
5
  "main": "dist/narrat.umd.js",
6
6
  "module": "dist/narrat.es.js",
@@ -16,6 +16,8 @@
16
16
  "scripts": {
17
17
  "test": "cross-env NODE_OPTIONS=--experimental-vm-modules npx jest",
18
18
  "start": "npm run dev",
19
+ "rpg": "cross-env VITE_EXAMPLE=examples/rpg npx vite dev",
20
+ "build-rpg": "cross-env VITE_DEMO_BUILD=rpg npx vite build && shx cp -r examples/rpg/* built-example/rpg",
19
21
  "dev": "vite",
20
22
  "generate-types": "vue-tsc --emitDeclarationOnly --outDir dist && npm run fix-type-aliases",
21
23
  "fix-type-aliases": "tsc-alias -p tsconfig.json",
@@ -66,12 +68,13 @@
66
68
  "postcss": "^8.4.14",
67
69
  "prettier": "^2.7.1",
68
70
  "rollup-plugin-typescript2": "^0.32.1",
71
+ "shx": "^0.3.4",
69
72
  "tailwindcss": "^3.1.4",
70
73
  "ts-jest": "^28.0.5",
71
74
  "tsc-alias": "^1.6.11",
72
75
  "tslib": "^2.4.0",
73
76
  "typescript": "^4.7.4",
74
- "vite": "^2.9.9",
77
+ "vite": "^3.0.0",
75
78
  "vite-plugin-eslint": "^1.6.1",
76
79
  "vue": "^3.2.37",
77
80
  "vue-tsc": "^0.38.2"
Binary file
Binary file
Binary file
Binary file
package/dist/audio.7z DELETED
Binary file
@@ -1,62 +0,0 @@
1
- {
2
- "config": {
3
- "imagesPath": "./img/characters/"
4
- },
5
- "characters": {
6
- "game": {
7
- "name": "",
8
- "color": "white"
9
- },
10
- "player": {
11
- "style": {
12
- "color": "orange"
13
- },
14
- "name": "You"
15
- },
16
- "cat": {
17
- "sprites": {
18
- "idle": "cat_idle.jpg"
19
- },
20
- "style": {
21
- "color": "white"
22
- },
23
- "name": "Generic Cat"
24
- },
25
- "shopkeeper": {
26
- "sprites": {
27
- "idle": "music_cat.jpeg"
28
- },
29
- "style": {
30
- "color": "white"
31
- },
32
- "name": "Shopkeeper"
33
- },
34
- "helper": {
35
- "sprites": {
36
- "idle": "helper_cat.png"
37
- },
38
- "style": {
39
- "color": "green"
40
- },
41
- "name": "Helper Cat"
42
- },
43
- "music_cat": {
44
- "sprites": {
45
- "idle": "music_cat.jpeg"
46
- },
47
- "style": {
48
- "color": "green"
49
- },
50
- "name": "Music Cat"
51
- },
52
- "inner": {
53
- "sprites": {
54
- "idle": "inner_voice.png"
55
- },
56
- "style": {
57
- "color": "red"
58
- },
59
- "name": "Inner Voice"
60
- }
61
- }
62
- }
@@ -1,182 +0,0 @@
1
- {
2
- "gameTitle": "Narrat Game Example",
3
- "images": {
4
- "narrat": "img/backgrounds/narrat.png",
5
- "map": "img/backgrounds/map.png",
6
- "shopButton": "img/ui/shop-button.png",
7
- "parkButton": "img/ui/park-button.png"
8
- },
9
- "layout": {
10
- "backgrounds": {
11
- "width": 880,
12
- "height": 720
13
- },
14
- "dialogBottomPadding": 70,
15
- "minTextWidth": 475,
16
- "mobileDialogHeightPercentage": 60,
17
- "verticalLayoutThreshold": 1000,
18
- "portraits": {
19
- "width": 100,
20
- "height": 100
21
- }
22
- },
23
- "screens": {
24
- "default": {
25
- "background": "narrat"
26
- },
27
- "map": {
28
- "background": "map",
29
- "buttons": ["shopButton", "parkButton"]
30
- }
31
- },
32
- "buttons": {
33
- "shopButton": {
34
- "enabled": false,
35
- "background": "shopButton",
36
- "position": {
37
- "left": 38,
38
- "top": 6,
39
- "width": 255,
40
- "height": 226
41
- },
42
- "action": "shopButton"
43
- },
44
- "parkButton": {
45
- "enabled": false,
46
- "background": "parkButton",
47
- "position": {
48
- "left": 632,
49
- "top": 86,
50
- "width": 255,
51
- "height": 226
52
- },
53
- "action": "parkButton"
54
- }
55
- },
56
- "skills": {
57
- "agility": {
58
- "name": "Agility",
59
- "description": "How good you are at moving around.",
60
- "startingLevel": 0,
61
- "icon": "img/skills/agility.jpg",
62
- "hidden": true
63
- },
64
- "haggling": {
65
- "name": "Haggling",
66
- "description": "Get good prices on items",
67
- "icon": "img/skills/logic.jpg",
68
- "startingLevel": 1
69
- }
70
- },
71
- "skillChecks": {
72
- "rollRange": 100,
73
- "skillMultiplier": 10,
74
- "failureChance": 1,
75
- "difficultyText": [
76
- [0, "Very Easy"],
77
- [10, "Easy"],
78
- [30, "Medium"],
79
- [50, "Hard"],
80
- [70, "Very Hard"],
81
- [80, "Extremely Hard"],
82
- [90, "Near Impossible"]
83
- ]
84
- },
85
- "scripts": ["data/example.rpy"],
86
- "audio": {
87
- "calm": {
88
- "loop": true,
89
- "src": "music/calm.mp3"
90
- },
91
- "click": {
92
- "src": "audio/click.ogg"
93
- },
94
- "game_start": {
95
- "src": "audio/game_start.ogg"
96
- },
97
- "failure": {
98
- "src": "audio/failure.ogg"
99
- },
100
- "success": {
101
- "src": "audio/success.wav"
102
- }
103
- },
104
- "audioOptions": {
105
- "volume": 0.5,
106
- "musicFadeInTime": 0.5,
107
- "musicFadeInDelay": 0.5,
108
- "musicFadeOutTime": 0.5
109
- },
110
- "notifications": {
111
- "timeOnScreen": 2.5,
112
- "alsoPrintInDialogue": true
113
- },
114
- "hudStats": {
115
- "money": {
116
- "icon": "img/ui/money.png",
117
- "name": "Money",
118
- "startingValue": 10,
119
- "minValue": 0
120
- },
121
- "energy": {
122
- "icon": "img/ui/energy.png",
123
- "name": "Energy",
124
- "startingValue": 10,
125
- "minValue": 0,
126
- "maxValue": 10
127
- }
128
- },
129
- "items": {
130
- "bread": {
131
- "name": "Bread",
132
- "description": "A bread in the game.",
133
- "icon": "img/items/bread.png",
134
- "onUse": {
135
- "action": "jump",
136
- "label": "eat_bread"
137
- }
138
- },
139
- "book": {
140
- "name": "Ominous Book",
141
- "description": "An ominous book. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sed ullamcorper turpis. Aliquam tincidunt dolor sed mollis aliquet. Duis in odio eros. Maecenas sapien arcu, fermentum id tincidunt non, accumsan vel metus. Nullam pretium molestie accumsan. In ut rutrum tellus. Integer vitae nisl eleifend lorem tristique auctor quis sed nulla. Cras gravida viverra tristique. Mauris imperdiet tortor purus, fringilla vehicula metus ullamcorper eget. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla porta imperdiet justo, sed blandit orci. Aenean accumsan hendrerit arcu, laoreet vestibulum turpis vulputate eu. Etiam dignissim nibh dictum pharetra congue. Nulla ultrices, augue a blandit laoreet, metus enim sodales arcu, eget pellentesque lorem justo et ipsum. ",
142
- "icon": "img/items/book.png",
143
- "onUse": {
144
- "action": "run",
145
- "label": "read_book"
146
- },
147
- "tag": "always_interactable"
148
- }
149
- },
150
- "interactionTags": {
151
- "default": {
152
- "onlyInteractOutsideOfScripts": true
153
- }
154
- },
155
- "quests": {
156
- "breadShopping": {
157
- "title": "Bread Shopping",
158
- "description": "The helper cat asked you to buy bread for him.",
159
- "objectives": {
160
- "bread": {
161
- "description": "Buy bread for the helper cat."
162
- },
163
- "delivery": {
164
- "hidden": true,
165
- "description": "Deliver the bread to the helper cat."
166
- }
167
- }
168
- }
169
- },
170
- "audioTriggers": {
171
- "onPlayerAnswered": "click",
172
- "onPressStart": "game_start",
173
- "onSkillCheckFailure": "failure",
174
- "onSkillCheckSuccess": "success"
175
- },
176
- "menuButtons": {
177
- "menu": {
178
- "text": "Menu",
179
- "cssId": "my-custom-id"
180
- }
181
- }
182
- }