/************************************************************** * 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.......minus........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 = true; 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: ``, img: ``, }), }, customMenu: { gameModeBtn: ['mode_0', 'mode_1'], gameOperationBtn: ['operation_plus', 'operation_minus'], 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: ``, img: ``, }), }, customMenu: { gameModeBtn: ['mode_2', 'mode_3'], 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, -152, '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: ``, img: ``, }), }, customMenu: { gameModeBtn: ['mode_4', 'mode_5'], gameOperationBtn: ['operation_equals'], auxiliarTitle: (x, y, offsetW, offsetH) => { game.add.text( x + 5 * offsetW, y + offsetH + 50, game.lang.show + '\n' + game.lang.aux_rectangle, 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, // // info // gameShape: 'noShape', // assets: { // menu: { // gameNameBtn: 'game_3', // // infoBox // }, // customMenu: { // gameModeBtn: ['mode_6'], // gameOperationBtn: ['operation_equals'], // auxiliarTitle: (x, y, offsetW, offsetH) => {}, // // 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 // }, // }, // }, ];