/**************************************************************
* LInE - Free Education, Private Data - http://www.usp.br/line
*
* This file holds all global elements to the game.
*
* Generating game levels in menu:
* .....................................................
* ...............square....................circle...... } = gameShape
* .........../...........\....................|........ } = gameName (game)
* ........One.............Two................One....... }
* ......./...\.........../...\............./....\......
* ......a.....b.........a.....b...........a......b..... = gameMode (game mode)
* .(floor)..(stack)..(top)..(bottom)..(floor)..(stack).
* .......\./.............\./................\./........
* ........|...............|..................|.........
* ......./.\..............|................/.|.\.......
* ...plus...minus.......equals........plus.minus.mixed. = gameOperation (game math operation)
* .......\./..............|................\.|./.......
* ........|...............|..................|.........
* ......1,2,3.........1,2,3,4,5............1,2,3,...... = gameDifficulty (difficulty level)
* .....................................................
*
* About levels in map:
*
* ..................(game.levels)......................
* ......................__|__..........................
* .....................|.|.|.|.........................
* ...................0,1,2,3,4,5....................... = curMapPosition (map positions)
* ...................|.........|.......................
* ................(start)....(end).....................
**************************************************************/
/** FOR MOODLE
*
* iFractions can run on a server or inside moodle through iAssign.
* This variable should be set according to where it is suposed to run:
* - if true, on moodle
* - if false, on a server
*/
const moodle = false;
let moodleVar = {
hits: [0, 0, 0, 0],
errors: [0, 0, 0, 0],
time: [0, 0, 0, 0],
};
/**
* Index of the current game in gameList array
*
* @type {number}
*/
let gameId;
/**
* Selected game name.
* Can be: 'squareOne', 'squareTwo' or 'circleOne'.
*
* @type {string}
*/
let gameName;
/**
* Used for text and game information.
* Shape that makes the name of the game - e.g in 'squareOne' it is 'square'.
* Can be: 'circle' or 'square'.
*
* @type {string}
*/
let gameShape;
/**
* Holds selected game mode.
* In squareOne/circleOne can be: 'a' (click on the floor) or 'b' (click on the amount to go/stacked figures).
* In squareTwo can be: 'a' (more subdivisions on top) or 'b' (more subdivisions on bottom).
*
* @type {string}
*/
let gameMode;
/**
* Holds game math operation.
* In squareOne can be: 'plus' (green tractor goes right) or 'minus' (red tractor goes left).
* In circleOne can be: 'plus' (green tractor goes right), 'minus' (red tractor goes left) or 'mixed' (green tractor goes both sides).
* In squareTwo can be: 'minus' (compares two rectangle subdivisions).
*
* @type {string}
*/
let gameOperation;
/**
* Holds game overall difficulty. 1 (easier) -> n (harder).
* In squareOne can be: 1..3.
* In circleOne/squareTwo can be: 1..5.
*
* @type {number}
*/
let gameDifficulty;
/**
* Turns displaying the fraction labels on levels ON/OFF
* @type {boolean}
*/
let showFractions = true;
/**
* When true, the character can move to next position in the map
* @type {boolean}
*/
let canGoToNextMapPosition;
/**
* Character position on the map, aka game levels (1..4: valid; 5: end)
* @type {number}
*/
let curMapPosition;
/**
* Number of finished levels in the map
* @type {number}
*/
let completedLevels;
/**
* Turns game audio ON/OFF
* @type {boolean}
*/
let audioStatus = false;
/**
* Player's name
* @type {string}
*/
let playerName;
/**
* String that contains the selected language.
* It is the name of the language file.
* @type {string}
*/
let langString;
/**
* Holds the current state.
* Is used as if it was a 'this' inside state functions.
* @type {object}
*/
let self;
/**
* Information for all the games
* @type {Array}
*/
const gameList = [
{
gameName: 'squareOne',
gameMode: ['a', 'b'],
gameOperation: ['plus', 'minus'],
gameDifficulty: 3,
gameShape: 'square',
assets: {
menu: {
gameNameBtn: 'game_0',
infoBox: () => ({
title: `${game.lang.game}: ${game.lang.square} I`,
body: `
${game.lang.infoBox_squareOne}
`,
img: ``,
}),
},
customMenu: {
gameModeBtn: ['mode_0', 'mode_1'],
gameOperationBtn: ['operation_plus', 'operation_minus'],
gameModeDescription: ['s1_a_description', 's1_b_description'],
gameOperationDescription: [
'op_plus_description',
'op_minus_description',
],
gameDifficultyDescription: [
'diff_1_description',
'diff_2_description',
'diff_3_description',
],
gameLabelDescription: 'label_description',
auxiliarTitle: (x, y, offsetW, offsetH) => {
game.add.text(
x + 5 * offsetW,
y + offsetH + 50,
game.lang.show + '\n' + game.lang.title,
textStyles.h4_
);
},
infoBox: () => ({
gameMode: {
title: game.lang.game_modes,
body: `${game.lang.infoBox_mode}
`,
img: `
${game.lang.mode}: A - ${game.lang.infoBox_mode_s1_A} |
${game.lang.mode}: B - ${game.lang.infoBox_mode_s1_B} |
 |
 |
`,
},
gameDifficulty: {
title: game.lang.difficulties,
body: `${game.lang.infoBox_diff}
${game.lang.infoBox_diff_obs}
`,
img: `
${game.lang.difficulty}: 1 |
${game.lang.difficulty}: 3 |
 |
 |
${game.lang.infoBox_diff_aux}
`,
},
gameMisc: {
title: `${game.lang.show} ${self.auxText}`,
body: game.lang.infoBox_misc_label,
img: `
`,
},
}),
},
map: {
characterAnimation: (operation) => {
return operation === 'plus'
? ['move', [0, 1, 2, 3, 4], 3]
: ['move', [10, 11, 12, 13, 14], 3];
},
character: (operation) => {
let char;
if (operation == 'plus') {
char = game.add.sprite(
self.scene.roadPoints.x[curMapPosition],
self.scene.roadPoints.y[curMapPosition],
'tractor',
0,
0.75
);
}
if (operation === 'minus') {
char = game.add.sprite(
self.scene.roadPoints.x[curMapPosition],
self.scene.roadPoints.y[curMapPosition],
'tractor',
10,
0.75
);
}
char.rotate = -30; // 25 counterclockwise
char.anchor(0.25, 0.5);
return char;
},
startBuilding: () => {
return game.add.image(
self.scene.roadPoints.x[0] - 60,
self.scene.roadPoints.y[0] - 155,
'garage',
0.6
);
},
endBuilding: () => {
return game.add.image(
self.scene.roadPoints.x[5] - 10,
self.scene.roadPoints.y[5] - 215,
'farm',
0.9
);
},
},
end: {
characterAnimation: () =>
gameOperation === 'plus'
? ['move', [0, 1, 2, 3, 4], 3]
: ['move', [10, 11, 12, 13, 14], 3],
character: () => {
const char = game.add.sprite(
0,
context.canvas.height - 170 - 80,
'tractor',
0,
1.05
);
char.anchor(0.5, 0.5);
if (gameOperation === 'minus') char.curFrame = 10;
return char;
},
building: () =>
game.add
.image(
context.canvas.width - 420,
context.canvas.height - 100,
'farm',
1.7
)
.anchor(0, 1),
},
},
},
{
gameName: 'circleOne',
gameMode: ['a', 'b'],
gameOperation: ['plus', 'minus', 'mixed'],
gameDifficulty: 3,
// info
gameShape: 'circle',
assets: {
menu: {
gameNameBtn: 'game_1',
infoBox: () => ({
title: `${game.lang.game}: ${game.lang.circle} I`,
body: `${game.lang.infoBox_circleOne}
`,
img: `
`,
}),
},
customMenu: {
gameModeBtn: ['mode_2', 'mode_3'],
gameModeDescription: ['c1_a_description', 'c1_b_description'],
gameOperationDescription: [
'op_plus_description',
'op_minus_description',
'op_mixed_description',
],
gameDifficultyDescription: [
'diff_1_description',
'diff_2_description',
'diff_3_description',
],
gameLabelDescription: 'label_description',
gameOperationBtn: [
'operation_plus',
'operation_minus',
'operation_mixed',
],
auxiliarTitle: (x, y, offsetW, offsetH) => {
game.add.text(
x + 5 * offsetW,
y + offsetH + 50,
game.lang.show + '\n' + game.lang.title,
textStyles.h4_
);
},
infoBox: () => ({
gameMode: {
title: game.lang.game_modes,
body: `${game.lang.infoBox_mode}
`,
img: `
|
${game.lang.mode}: A - ${game.lang.infoBox_mode_c1_A} |
 |
${game.lang.mode}: B - ${game.lang.infoBox_mode_c1_B} |
`,
},
gameDifficulty: {
title: game.lang.difficulties,
body: `${game.lang.infoBox_diff}
${game.lang.infoBox_diff_obs}
`,
img: `
${game.lang.difficulty}: 1
|
${game.lang.difficulty}: 5
|
|
|
${game.lang.infoBox_diff_aux}
`,
},
gameMisc: {
title: `${game.lang.show} ${self.auxText}`,
body: game.lang.infoBox_misc_label,
img: `
`,
},
}),
},
map: {
characterAnimation: (operation) => {
return ['kid', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3];
},
character: (operation) => {
const char = game.add.sprite(
self.scene.roadPoints.x[curMapPosition],
self.scene.roadPoints.y[curMapPosition],
'kid_running',
0,
0.57
);
char.anchor(0, 0.85);
return char;
},
startBuilding: () => {
return game.add.image(
self.scene.roadPoints.x[0] - 193,
self.scene.roadPoints.y[0] - 205,
'house',
1.03
);
},
endBuilding: () => {
return game.add.image(
self.scene.roadPoints.x[5] - 28,
self.scene.roadPoints.y[5] - 215,
'school',
0.52
);
},
},
end: {
characterAnimation: () => [
'move',
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
3,
],
character: () => {
const char = game.add.sprite(
0,
context.canvas.height - 240,
'kid_running',
0,
1.05
);
char.anchor(0.5, 0.5);
return char;
},
building: () =>
game.add
.image(
context.canvas.width - 620,
context.canvas.height - 20 - 15,
'school',
1.3
)
.anchor(0, 1),
},
},
},
{
gameName: 'squareTwo',
gameMode: ['a', 'b'],
gameOperation: ['minus'],
gameDifficulty: 5,
// info
gameShape: 'square',
assets: {
menu: {
gameNameBtn: 'game_2',
infoBox: () => ({
title: `${game.lang.game}: ${game.lang.square} II`,
body: `${game.lang.infoBox_squareTwo}
`,
img: `
`,
}),
},
customMenu: {
gameModeBtn: ['mode_4', 'mode_5'],
gameOperationBtn: ['operation_equals'],
gameModeDescription: ['s2_a_description', 's2_b_description'],
gameOperationDescription: ['op_equals_description'],
gameDifficultyDescription: [
's2_diff_1_description',
's2_diff_2_description',
's2_diff_3_description',
's2_diff_4_description',
's2_diff_5_description',
],
gameLabelDescription: 'label_description',
auxiliarTitle: (x, y, offsetW, offsetH) => {
game.add.text(
x + 5 * offsetW,
y + offsetH + 50,
game.lang.show + '\n' + game.lang.title,
textStyles.h4_
);
},
infoBox: () => ({
gameMode: {
title: game.lang.game_modes,
body: `${game.lang.infoBox_mode}
`,
img: `
${game.lang.mode}: A - ${game.lang.infoBox_mode_s2_A} |
${game.lang.mode}: B - ${game.lang.infoBox_mode_s2_B} |
 |
 |
`,
},
gameDifficulty: {
title: game.lang.difficulties,
body: game.lang.infoBox_diff,
img: `
${game.lang.difficulty}: 1 |
${game.lang.difficulty}: 5 |
 |
 |
${game.lang.infoBox_diff_aux}
`,
},
gameMisc: {
title: `${game.lang.show} ${self.auxText}`,
body: game.lang.infoBox_misc_rect,
img: `
`,
},
}),
},
map: {
characterAnimation: (operation) => {
return ['kid', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3];
},
character: (operation) => {
const char = game.add.sprite(
self.scene.roadPoints.x[curMapPosition],
self.scene.roadPoints.y[curMapPosition],
'kid_running',
0,
0.57
);
char.anchor(0, 0.85);
return char;
},
startBuilding: () => {
return game.add.image(
self.scene.roadPoints.x[0] - 193,
self.scene.roadPoints.y[0] - 205,
'house',
1.03
);
},
endBuilding: () => {
return game.add.image(
self.scene.roadPoints.x[5] - 28,
self.scene.roadPoints.y[5] - 215,
'school',
0.52
);
},
},
end: {
characterAnimation: () => [
'move',
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
3,
],
character: () => {
const char = game.add.sprite(
0,
context.canvas.height - 240,
'kid_running',
0,
1.05
);
char.anchor(0.5, 0.5);
return char;
},
building: () =>
game.add
.image(
context.canvas.width - 620,
context.canvas.height - 20 - 15,
'school',
1.3
)
.anchor(0, 1),
},
},
},
{
gameName: 'scaleOne',
gameMode: ['a'],
gameOperation: ['plus'],
gameDifficulty: 1,
gameShape: 'noShape',
assets: {
menu: {
gameNameBtn: 'game_3',
// TODO: infoBox
},
customMenu: {
gameModeBtn: ['mode_6'],
gameOperationBtn: ['operation_equals'],
gameModeDescription: ['sc1_a_description'],
gameOperationDescription: ['op_plus_description'],
gameDifficultyDescription: ['diff_1_description'],
gameLabelDescription: 'label_description',
auxiliarTitle: (x, y, offsetW, offsetH) => {
game.add.text(
x + 5 * offsetW,
y + offsetH + 50,
game.lang.show + '\n' + game.lang.title,
textStyles.h4_
);
},
// TODO: infoBox
},
map: {
characterAnimation: (operation) => {
return operation === 'plus'
? ['green_tractor', [0, 1, 2, 3, 4], 3]
: ['red_tractor', [10, 11, 12, 13, 14], 3];
},
character: (operation) => {
let char;
if (operation == 'plus') {
char = game.add.sprite(
self.scene.roadPoints.x[curMapPosition],
self.scene.roadPoints.y[curMapPosition],
'tractor',
0,
0.75
);
}
if (operation === 'minus') {
char = game.add.sprite(
self.scene.roadPoints.x[curMapPosition],
self.scene.roadPoints.y[curMapPosition],
'tractor',
10,
0.75
);
}
char.rotate = -30; // 25 counterclockwise
return char;
},
startBuilding: () => {
return game.add
.image(
self.scene.roadPoints.x[0],
self.scene.roadPoints.y[0],
'garage',
0.6
)
.anchor(0.5, 1);
},
endBuilding: () => {
return game.add
.image(
self.scene.roadPoints.x[5],
self.scene.roadPoints.y[5],
'farm',
0.9
)
.anchor(0.4, 0.7);
},
},
end: {
// TODO
},
},
},
];