From 4fa5d8662e0247455c2010ed101667c432c73e83 Mon Sep 17 00:00:00 2001 From: samreid Date: Thu, 27 Feb 2020 11:38:07 -0700 Subject: [PATCH] Add repo to migration list, see https://github.com/phetsims/chipper/issues/875 --- arithmetic_en.html | 48 +- images/large-pointing-hand_png.js | 5 + images/small-pointing-hand_png.js | 5 + js/arithmetic-config.js | 51 -- js/arithmetic-main.js | 57 +- js/arithmetic-strings.js | 14 + js/arithmetic.js | 8 +- js/common/ArithmeticConstants.js | 35 +- js/common/ArithmeticGlobals.js | 19 +- js/common/ArithmeticQueryParameters.js | 26 +- js/common/model/ArithmeticModel.js | 636 +++++++++--------- js/common/model/FaceModel.js | 80 ++- js/common/model/GameState.js | 33 +- js/common/model/LevelModel.js | 192 +++--- js/common/model/ProblemModel.js | 48 +- .../view/ArithmeticFaceWithPointsNode.js | 167 +++-- js/common/view/ArithmeticView.js | 391 ++++++----- js/common/view/EquationInputNode.js | 230 ++++--- js/common/view/EquationNode.js | 120 ++-- js/common/view/LevelCompletedNodeWrapper.js | 93 ++- js/common/view/LevelSelectionNode.js | 277 ++++---- js/common/view/ScoreboardNode.js | 238 ++++--- js/common/view/WorkspaceNode.js | 409 ++++++----- js/common/view/table/AbstractCell.js | 282 ++++---- .../view/table/MultiplicationTableBodyCell.js | 81 ++- .../table/MultiplicationTableHeaderCell.js | 83 ++- .../view/table/MultiplicationTableNode.js | 548 ++++++++------- js/divide/DivideScreen.js | 79 ++- js/divide/model/DivideModel.js | 196 +++--- js/divide/view/DivideEquationNode.js | 115 ++-- js/divide/view/DivideScreenIconNode.js | 89 ++- js/divide/view/DivideScreenTableNode.js | 111 ++- js/divide/view/DivideView.js | 71 +- js/factor/FactorScreen.js | 79 ++- js/factor/model/FactorModel.js | 197 +++--- js/factor/view/CellInteractionListener.js | 102 ++- js/factor/view/FactorEquationNode.js | 85 ++- js/factor/view/FactorScreenIconNode.js | 111 ++- js/factor/view/FactorScreenTableNode.js | 454 ++++++------- js/factor/view/FactorView.js | 69 +- js/multiply/MultiplyScreen.js | 79 ++- js/multiply/model/MultiplyModel.js | 157 +++-- js/multiply/view/MultiplyEquationNode.js | 85 ++- js/multiply/view/MultiplyScreenIconNode.js | 79 ++- js/multiply/view/MultiplyScreenTableNode.js | 115 ++-- js/multiply/view/MultiplyView.js | 77 +-- .../arithmetic-phet-io-elements-baseline.js | 1 + .../arithmetic-phet-io-elements-overrides.js | 1 + js/phet-io/arithmetic-phet-io-types.js | 1 + mipmaps/divide_level_1_icon_png.js | 38 ++ mipmaps/divide_level_2_icon_png.js | 38 ++ mipmaps/divide_level_3_icon_png.js | 38 ++ mipmaps/factor_level_1_icon_png.js | 38 ++ mipmaps/factor_level_2_icon_png.js | 38 ++ mipmaps/factor_level_3_icon_png.js | 38 ++ mipmaps/multiply_level_1_icon_png.js | 38 ++ mipmaps/multiply_level_2_icon_png.js | 38 ++ mipmaps/multiply_level_3_icon_png.js | 38 ++ 58 files changed, 3532 insertions(+), 3339 deletions(-) create mode 100644 images/large-pointing-hand_png.js create mode 100644 images/small-pointing-hand_png.js delete mode 100644 js/arithmetic-config.js create mode 100644 js/arithmetic-strings.js create mode 100644 mipmaps/divide_level_1_icon_png.js create mode 100644 mipmaps/divide_level_2_icon_png.js create mode 100644 mipmaps/divide_level_3_icon_png.js create mode 100644 mipmaps/factor_level_1_icon_png.js create mode 100644 mipmaps/factor_level_2_icon_png.js create mode 100644 mipmaps/factor_level_3_icon_png.js create mode 100644 mipmaps/multiply_level_1_icon_png.js create mode 100644 mipmaps/multiply_level_2_icon_png.js create mode 100644 mipmaps/multiply_level_3_icon_png.js diff --git a/arithmetic_en.html b/arithmetic_en.html index ea03e2a9..b75ae5b6 100644 --- a/arithmetic_en.html +++ b/arithmetic_en.html @@ -17,6 +17,36 @@ \ No newline at end of file diff --git a/images/large-pointing-hand_png.js b/images/large-pointing-hand_png.js new file mode 100644 index 00000000..0d345d2b --- /dev/null +++ b/images/large-pointing-hand_png.js @@ -0,0 +1,5 @@ +/* eslint-disable */ +var img = new Image(); +window.phetImages.push( img ); +img.src = 'data:image/png;base64,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'; +export default img; diff --git a/images/small-pointing-hand_png.js b/images/small-pointing-hand_png.js new file mode 100644 index 00000000..a91cad0f --- /dev/null +++ b/images/small-pointing-hand_png.js @@ -0,0 +1,5 @@ +/* eslint-disable */ +var img = new Image(); +window.phetImages.push( img ); +img.src = 'data:image/png;base64,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'; +export default img; diff --git a/js/arithmetic-config.js b/js/arithmetic-config.js deleted file mode 100644 index 83f7001a..00000000 --- a/js/arithmetic-config.js +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014-2019, University of Colorado Boulder - -/* - * IMPORTANT: This file was auto-generated by "grunt generate-config". Please do not modify this directly. Instead - * please modify arithmetic/package.json to control dependencies. - * - * RequireJS configuration file for the arithmetic sim. - * Paths are relative to the location of this file. - */ - -require.config( { - - deps: [ 'arithmetic-main' ], - - paths: { - - // Third-party libs - text: '../../sherpa/lib/text-2.0.12', - - // PhET plugins - sound: '../../chipper/js/requirejs-plugins/sound', - image: '../../chipper/js/requirejs-plugins/image', - mipmap: '../../chipper/js/requirejs-plugins/mipmap', - string: '../../chipper/js/requirejs-plugins/string', - ifphetio: '../../chipper/js/requirejs-plugins/ifphetio', - - // PhET libs, uppercase names to identify them in require.js imports. - // IMPORTANT: DO NOT modify. This file is auto-generated. See documentation at the top. - ARITHMETIC: '.', - AXON: '../../axon/js', - BRAND: '../../brand/' + phet.chipper.brand + '/js', - DOT: '../../dot/js', - JOIST: '../../joist/js', - KITE: '../../kite/js', - PHETCOMMON: '../../phetcommon/js', - PHET_CORE: '../../phet-core/js', - PHET_IO: '../../phet-io/js', - REPOSITORY: '..', - SCENERY: '../../scenery/js', - SCENERY_PHET: '../../scenery-phet/js', - SUN: '../../sun/js', - TAMBO: '../../tambo/js', - TANDEM: '../../tandem/js', - TWIXT: '../../twixt/js', - UTTERANCE_QUEUE: '../../utterance-queue/js', - VEGAS: '../../vegas/js' - }, - - // Cache busting is applied by default, but can be disabled via ?cacheBust=false, see initialize-globals.js - urlArgs: phet.chipper.getCacheBustArgs() -} ); diff --git a/js/arithmetic-main.js b/js/arithmetic-main.js index 2ba1763c..4dcc0120 100644 --- a/js/arithmetic-main.js +++ b/js/arithmetic-main.js @@ -5,39 +5,36 @@ * * @author John Blanco, Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const DivideScreen = require( 'ARITHMETIC/divide/DivideScreen' ); - const FactorScreen = require( 'ARITHMETIC/factor/FactorScreen' ); - const MultiplyScreen = require( 'ARITHMETIC/multiply/MultiplyScreen' ); - const Sim = require( 'JOIST/Sim' ); - const SimLauncher = require( 'JOIST/SimLauncher' ); - const Tandem = require( 'TANDEM/Tandem' ); +import Sim from '../../joist/js/Sim.js'; +import SimLauncher from '../../joist/js/SimLauncher.js'; +import Tandem from '../../tandem/js/Tandem.js'; +import arithmeticStrings from './arithmetic-strings.js'; +import DivideScreen from './divide/DivideScreen.js'; +import FactorScreen from './factor/FactorScreen.js'; +import MultiplyScreen from './multiply/MultiplyScreen.js'; - // strings and images - const arithmeticTitleString = require( 'string!ARITHMETIC/arithmetic.title' ); +// strings and images +const arithmeticTitleString = arithmeticStrings.arithmetic.title; - // constants - const tandem = Tandem.ROOT; +// constants +const tandem = Tandem.ROOT; - const simOptions = { - credits: { - leadDesign: 'Michael Dubson, Amanda McGarry', - softwareDevelopment: 'John Blanco, Michael Dubson', - team: 'Bryce Gruneich, Karina K. R. Hensberry, Trish Loeblein, Ariel Paul, Kathy Perkins, Beth Stade', - qualityAssurance: 'Steele Dalton, Bryce Griebenow, Elise Morgan, Oliver Orejola, Ben Roberts, Bryan Yoelin', - thanks: 'Thanks to Mobile Learner Labs for working with the PhET development team to convert this simulation to HTML5.' - } - }; +const simOptions = { + credits: { + leadDesign: 'Michael Dubson, Amanda McGarry', + softwareDevelopment: 'John Blanco, Michael Dubson', + team: 'Bryce Gruneich, Karina K. R. Hensberry, Trish Loeblein, Ariel Paul, Kathy Perkins, Beth Stade', + qualityAssurance: 'Steele Dalton, Bryce Griebenow, Elise Morgan, Oliver Orejola, Ben Roberts, Bryan Yoelin', + thanks: 'Thanks to Mobile Learner Labs for working with the PhET development team to convert this simulation to HTML5.' + } +}; - SimLauncher.launch( function() { - // Create and start the sim - new Sim( arithmeticTitleString, [ - new MultiplyScreen( { tandem: tandem.createTandem( 'multiplyScreen' ) } ), - new FactorScreen( { tandem: tandem.createTandem( 'factorScreen' ) } ), - new DivideScreen( { tandem: tandem.createTandem( 'divideScreen' ) } ) - ], simOptions ).start(); - } ); +SimLauncher.launch( function() { + // Create and start the sim + new Sim( arithmeticTitleString, [ + new MultiplyScreen( { tandem: tandem.createTandem( 'multiplyScreen' ) } ), + new FactorScreen( { tandem: tandem.createTandem( 'factorScreen' ) } ), + new DivideScreen( { tandem: tandem.createTandem( 'divideScreen' ) } ) + ], simOptions ).start(); } ); \ No newline at end of file diff --git a/js/arithmetic-strings.js b/js/arithmetic-strings.js new file mode 100644 index 00000000..009b8d71 --- /dev/null +++ b/js/arithmetic-strings.js @@ -0,0 +1,14 @@ +// Copyright 2020, University of Colorado Boulder + +/** + * Auto-generated from modulify, DO NOT manually modify. + */ + +import getStringModule from '../../chipper/js/getStringModule.js'; +import arithmetic from './arithmetic.js'; + +const arithmeticStrings = getStringModule( 'ARITHMETIC' ); + +arithmetic.register( 'arithmeticStrings', arithmeticStrings ); + +export default arithmeticStrings; diff --git a/js/arithmetic.js b/js/arithmetic.js index 07a17042..fd807b3a 100644 --- a/js/arithmetic.js +++ b/js/arithmetic.js @@ -5,11 +5,7 @@ * * @author John Blanco */ -define( require => { - 'use strict'; - // modules - const Namespace = require( 'PHET_CORE/Namespace' ); +import Namespace from '../../phet-core/js/Namespace.js'; - return new Namespace( 'arithmetic' ); -} ); \ No newline at end of file +export default new Namespace( 'arithmetic' ); \ No newline at end of file diff --git a/js/common/ArithmeticConstants.js b/js/common/ArithmeticConstants.js index 441e9ec0..5ae18f72 100644 --- a/js/common/ArithmeticConstants.js +++ b/js/common/ArithmeticConstants.js @@ -6,26 +6,21 @@ * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; +import Screen from '../../../joist/js/Screen.js'; +import PhetFont from '../../../scenery-phet/js/PhetFont.js'; +import arithmetic from '../arithmetic.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const Screen = require( 'JOIST/Screen' ); +const ArithmeticConstants = { + BACKGROUND_COLOR: 'rgb( 173, 202, 255 )', + CURSOR_BLINK_INTERVAL: 500, // duration of animation in milliseconds + EQUATION_FONT_TEXT: new PhetFont( { size: 32 } ), + ICON_BACKGROUND_COLOR: 'rgb( 173, 202, 255 )', + INPUT_LENGTH_MAX: 3, // max input length + SCREEN_ICON_SIZE: Screen.MINIMUM_HOME_SCREEN_ICON_SIZE, // size of screen icons + NUM_STARS: 5, // number of stars in select level buttons + WORKSPACE_BACKGROUND_COLOR: 'rgb(130,181,252)' +}; - const ArithmeticConstants = { - BACKGROUND_COLOR: 'rgb( 173, 202, 255 )', - CURSOR_BLINK_INTERVAL: 500, // duration of animation in milliseconds - EQUATION_FONT_TEXT: new PhetFont( { size: 32 } ), - ICON_BACKGROUND_COLOR: 'rgb( 173, 202, 255 )', - INPUT_LENGTH_MAX: 3, // max input length - SCREEN_ICON_SIZE: Screen.MINIMUM_HOME_SCREEN_ICON_SIZE, // size of screen icons - NUM_STARS: 5, // number of stars in select level buttons - WORKSPACE_BACKGROUND_COLOR: 'rgb(130,181,252)' - }; +arithmetic.register( 'ArithmeticConstants', ArithmeticConstants ); - arithmetic.register( 'ArithmeticConstants', ArithmeticConstants ); - - return ArithmeticConstants; -} ); \ No newline at end of file +export default ArithmeticConstants; \ No newline at end of file diff --git a/js/common/ArithmeticGlobals.js b/js/common/ArithmeticGlobals.js index 2383c07b..a5e83aca 100644 --- a/js/common/ArithmeticGlobals.js +++ b/js/common/ArithmeticGlobals.js @@ -6,18 +6,13 @@ * @author John Blanco */ -define( require => { - 'use strict'; +import Property from '../../../axon/js/Property.js'; +import arithmetic from '../arithmetic.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const Property = require( 'AXON/Property' ); +const ArithmeticGlobals = { + timerEnabledProperty: new Property( false ) +}; - const ArithmeticGlobals = { - timerEnabledProperty: new Property( false ) - }; +arithmetic.register( 'ArithmeticGlobals', ArithmeticGlobals ); - arithmetic.register( 'ArithmeticGlobals', ArithmeticGlobals ); - - return ArithmeticGlobals; -} ); \ No newline at end of file +export default ArithmeticGlobals; \ No newline at end of file diff --git a/js/common/ArithmeticQueryParameters.js b/js/common/ArithmeticQueryParameters.js index 7f21559f..87dd292b 100644 --- a/js/common/ArithmeticQueryParameters.js +++ b/js/common/ArithmeticQueryParameters.js @@ -5,24 +5,20 @@ * * @author John Blanco */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); +import arithmetic from '../arithmetic.js'; - const ArithmeticQueryParameters = QueryStringMachine.getAll( { +const ArithmeticQueryParameters = QueryStringMachine.getAll( { - // automatically answer most problems to enable faster testing of level completion - autoAnswer: { type: 'flag' } - } ); + // automatically answer most problems to enable faster testing of level completion + autoAnswer: { type: 'flag' } +} ); - // prevent auto answer in versions that are intended for publication - if ( phet.chipper.isProduction && !phet.chipper.isDebugBuild ) { - ArithmeticQueryParameters.autoAnswer = false; - } +// prevent auto answer in versions that are intended for publication +if ( phet.chipper.isProduction && !phet.chipper.isDebugBuild ) { + ArithmeticQueryParameters.autoAnswer = false; +} - arithmetic.register( 'ArithmeticQueryParameters', ArithmeticQueryParameters ); +arithmetic.register( 'ArithmeticQueryParameters', ArithmeticQueryParameters ); - return ArithmeticQueryParameters; -} ); +export default ArithmeticQueryParameters; \ No newline at end of file diff --git a/js/common/model/ArithmeticModel.js b/js/common/model/ArithmeticModel.js index 04a1bbae..195713a6 100644 --- a/js/common/model/ArithmeticModel.js +++ b/js/common/model/ArithmeticModel.js @@ -7,357 +7,353 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticGlobals = require( 'ARITHMETIC/common/ArithmeticGlobals' ); - const ArithmeticQueryParameters = require( 'ARITHMETIC/common/ArithmeticQueryParameters' ); - const BooleanIO = require( 'TANDEM/types/BooleanIO' ); - const Emitter = require( 'AXON/Emitter' ); - const FaceModel = require( 'ARITHMETIC/common/model/FaceModel' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LevelModel = require( 'ARITHMETIC/common/model/LevelModel' ); - const merge = require( 'PHET_CORE/merge' ); - const NumberIO = require( 'TANDEM/types/NumberIO' ); - const ProblemModel = require( 'ARITHMETIC/common/model/ProblemModel' ); - const Property = require( 'AXON/Property' ); - const StringIO = require( 'TANDEM/types/StringIO' ); - const timer = require( 'AXON/timer' ); - - // constants - const FEEDBACK_TIME = 1200; // in milliseconds, time that the feedback is presented before moving to next problem - /** - * Constructor for ArithmeticModel - * @constructor - */ - function ArithmeticModel( tandem, options ) { - const self = this; +import Emitter from '../../../../axon/js/Emitter.js'; +import Property from '../../../../axon/js/Property.js'; +import timer from '../../../../axon/js/timer.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import BooleanIO from '../../../../tandem/js/types/BooleanIO.js'; +import NumberIO from '../../../../tandem/js/types/NumberIO.js'; +import StringIO from '../../../../tandem/js/types/StringIO.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticGlobals from '../ArithmeticGlobals.js'; +import ArithmeticQueryParameters from '../ArithmeticQueryParameters.js'; +import FaceModel from './FaceModel.js'; +import GameState from './GameState.js'; +import LevelModel from './LevelModel.js'; +import ProblemModel from './ProblemModel.js'; + +// constants +const FEEDBACK_TIME = 1200; // in milliseconds, time that the feedback is presented before moving to next problem - // @private - for PhET-iO - this.checkAnswerEmitter = new Emitter( { - tandem: tandem.createTandem( 'checkAnswerEmitter' ), - parameters: [ - { name: 'multiplicand', phetioType: NumberIO }, - { name: 'product', phetioType: NumberIO }, - { name: 'multiplier', phetioType: NumberIO }, - { name: 'isCorrect', phetioType: BooleanIO }, - { name: 'asString', phetioType: StringIO }, - { name: 'input', phetioType: StringIO } - ] - } ); +/** + * Constructor for ArithmeticModel + * @constructor + */ +function ArithmeticModel( tandem, options ) { + const self = this; + + // @private - for PhET-iO + this.checkAnswerEmitter = new Emitter( { + tandem: tandem.createTandem( 'checkAnswerEmitter' ), + parameters: [ + { name: 'multiplicand', phetioType: NumberIO }, + { name: 'product', phetioType: NumberIO }, + { name: 'multiplier', phetioType: NumberIO }, + { name: 'isCorrect', phetioType: BooleanIO }, + { name: 'asString', phetioType: StringIO }, + { name: 'input', phetioType: StringIO } + ] + } ); - // set up the 'fillEquation' function, which is used to fill in the missing portion(s) based on the user's inputs - options = merge( { fillEquation: null }, options ); - this.fillEquation = options.fillEquation; // @public + // set up the 'fillEquation' function, which is used to fill in the missing portion(s) based on the user's inputs + options = merge( { fillEquation: null }, options ); + this.fillEquation = options.fillEquation; // @public - // @public - active game level, null represents none - this.levelNumberProperty = new Property( null ); + // @public - active game level, null represents none + this.levelNumberProperty = new Property( null ); - // @public - user's input value - this.inputProperty = new Property( '' ); + // @public - user's input value + this.inputProperty = new Property( '' ); - // @public - reference to the portion of the equation that is awaiting input from the user - this.activeInputProperty = new Property( null ); + // @public - reference to the portion of the equation that is awaiting input from the user + this.activeInputProperty = new Property( null ); - // @public - current game state - this.stateProperty = new Property( GameState.SELECTING_LEVEL ); + // @public - current game state + this.stateProperty = new Property( GameState.SELECTING_LEVEL ); - // @public - emitter that emits an even when a refresh occurs - this.refreshEmitter = new Emitter(); + // @public - emitter that emits an even when a refresh occurs + this.refreshEmitter = new Emitter(); - // @public - array of models that correspond to a given difficulty level - this.levelModels = [ - // level 1 - new LevelModel( 6 ), - // level 2 - new LevelModel( 9 ), - // level 3 - new LevelModel( 12 ) - ]; + // @public - array of models that correspond to a given difficulty level + this.levelModels = [ + // level 1 + new LevelModel( 6 ), + // level 2 + new LevelModel( 9 ), + // level 3 + new LevelModel( 12 ) + ]; - // @public - portion of the model that represents a single problem - this.problemModel = new ProblemModel(); + // @public - portion of the model that represents a single problem + this.problemModel = new ProblemModel(); - // @public - model for smile face - this.faceModel = new FaceModel(); + // @public - model for smile face + this.faceModel = new FaceModel(); - // handles game state transitions that pertain to the model (does not require handling GameState.SELECTING_LEVEL) - this.stateProperty.lazyLink( function( newState, oldState ) { - if ( oldState === GameState.SELECTING_LEVEL && newState === GameState.AWAITING_USER_INPUT ) { + // handles game state transitions that pertain to the model (does not require handling GameState.SELECTING_LEVEL) + this.stateProperty.lazyLink( function( newState, oldState ) { + if ( oldState === GameState.SELECTING_LEVEL && newState === GameState.AWAITING_USER_INPUT ) { - // start (or restart) the game timer - self.activeLevelModel.gameTimer.start(); + // start (or restart) the game timer + self.activeLevelModel.gameTimer.start(); - // update display score - self.activeLevelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); - } - } ); - } + // update display score + self.activeLevelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); + } + } ); +} - arithmetic.register( 'ArithmeticModel', ArithmeticModel ); +arithmetic.register( 'ArithmeticModel', ArithmeticModel ); - return inherit( Object, ArithmeticModel, { +export default inherit( Object, ArithmeticModel, { - // @protected - get the current level model, use this to make the code more readable - get activeLevelModel() { - return this.levelModels[ this.levelNumberProperty.get() ]; - }, + // @protected - get the current level model, use this to make the code more readable + get activeLevelModel() { + return this.levelModels[ this.levelNumberProperty.get() ]; + }, - /** - * Check whether the answer submitted by the user is correct. The user's answer must have been stored in the - * appropriate portion of the problem model before this method is invoked. Doing it this way allows this general - * method to be used to verify the answer. - * @public - */ - submitAnswer: function() { - const self = this; + /** + * Check whether the answer submitted by the user is correct. The user's answer must have been stored in the + * appropriate portion of the problem model before this method is invoked. Doing it this way allows this general + * method to be used to verify the answer. + * @public + */ + submitAnswer: function() { + const self = this; - const isCorrect = this.problemModel.multiplicandProperty.get() * this.problemModel.multiplierProperty.get() === this.problemModel.productProperty.get(); - const string = this.problemModel.multiplicandProperty.get() + ' x ' + this.problemModel.multiplierProperty.get() + ' = ' + this.problemModel.productProperty.get(); - this.checkAnswerEmitter.emit( + const isCorrect = this.problemModel.multiplicandProperty.get() * this.problemModel.multiplierProperty.get() === this.problemModel.productProperty.get(); + const string = this.problemModel.multiplicandProperty.get() + ' x ' + this.problemModel.multiplierProperty.get() + ' = ' + this.problemModel.productProperty.get(); + this.checkAnswerEmitter.emit( + this.problemModel.multiplicandProperty.get(), + this.problemModel.productProperty.get(), + this.problemModel.multiplierProperty.get(), + isCorrect, + string, + this.inputProperty.get() ); + if ( isCorrect ) { + + // add the problem value to the total score + this.activeLevelModel.currentScoreProperty.value += this.problemModel.possiblePointsProperty.get(); + + // update the displayed score + this.activeLevelModel.displayScoreProperty.set( this.activeLevelModel.currentScoreProperty.get() ); + + // set the face to smile + this.faceModel.pointsToDisplayProperty.set( this.problemModel.possiblePointsProperty.get() ); + this.faceModel.isSmileProperty.set( true ); + this.faceModel.showFace(); + + // mark this table entry as solved + this.activeLevelModel.markCellAsUsed( this.problemModel.multiplicandProperty.get(), - this.problemModel.productProperty.get(), - this.problemModel.multiplierProperty.get(), - isCorrect, - string, - this.inputProperty.get() ); - if ( isCorrect ) { - - // add the problem value to the total score - this.activeLevelModel.currentScoreProperty.value += this.problemModel.possiblePointsProperty.get(); - - // update the displayed score - this.activeLevelModel.displayScoreProperty.set( this.activeLevelModel.currentScoreProperty.get() ); - - // set the face to smile - this.faceModel.pointsToDisplayProperty.set( this.problemModel.possiblePointsProperty.get() ); - this.faceModel.isSmileProperty.set( true ); - this.faceModel.showFace(); - - // mark this table entry as solved - this.activeLevelModel.markCellAsUsed( - this.problemModel.multiplicandProperty.get(), - this.problemModel.multiplierProperty.get() - ); - - // show the feedback that indicates a correct answer - this.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); - - // start a timer that will set up the next problem - this.feedbackTimer = timer.setTimeout( - function() { - self.feedbackTimer = null; - self.nextProblem(); - }, - FEEDBACK_TIME - ); - } - // incorrect answer - else { - // player will not get points for this task - this.problemModel.possiblePointsProperty.set( 0 ); - - // set face model state - this.faceModel.pointsToDisplayProperty.set( this.problemModel.possiblePointsProperty.get() ); - this.faceModel.isSmileProperty.set( false ); - this.faceModel.showFace(); - - // set the appropriate state - this.stateProperty.set( GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); - } - }, - - /** - * Move to the next problem or, if all problems have been answered, move to the state where results are shown. - * @private - */ - nextProblem: function() { - if ( this.setUpUnansweredProblem() ) { - this.inputProperty.reset(); - this.stateProperty.set( GameState.AWAITING_USER_INPUT ); - } - else { - // all problems have been answered, the level is now complete - this.stateProperty.set( GameState.SHOWING_LEVEL_COMPLETED_DIALOG ); - this.activeLevelModel.gameTimer.stop(); - } - }, + this.problemModel.multiplierProperty.get() + ); + + // show the feedback that indicates a correct answer + this.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); + + // start a timer that will set up the next problem + this.feedbackTimer = timer.setTimeout( + function() { + self.feedbackTimer = null; + self.nextProblem(); + }, + FEEDBACK_TIME + ); + } + // incorrect answer + else { + // player will not get points for this task + this.problemModel.possiblePointsProperty.set( 0 ); + + // set face model state + this.faceModel.pointsToDisplayProperty.set( this.problemModel.possiblePointsProperty.get() ); + this.faceModel.isSmileProperty.set( false ); + this.faceModel.showFace(); + + // set the appropriate state + this.stateProperty.set( GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); + } + }, - /** - * Retry the currently presented problem. - * @public - */ - retryProblem: function() { + /** + * Move to the next problem or, if all problems have been answered, move to the state where results are shown. + * @private + */ + nextProblem: function() { + if ( this.setUpUnansweredProblem() ) { + this.inputProperty.reset(); this.stateProperty.set( GameState.AWAITING_USER_INPUT ); - }, - - /** - * Pick an unanswered problem and set it up in the model. Must be overridden in sub-types, since the way problems - * are set up varies. - * - * Returns true if able to set up a problem, false if not. A return value of false generally indicates that all - * problems have been answered. - * - * @protected - */ - setUpUnansweredProblem: function() { - throw new Error( 'this function must be overridden in sub-classes' ); - }, - - /** - * Automatically answer most of the problems for this level. This is useful for testing, since it can save time - * when testing how the sim behaves when a user finishing answering all questions for a level. - * - * IMPORTANT: We need to be VERY CAREFUL that this is never available in the published sim. - * - * @protected - */ - autoAnswer: function() { - // does nothing in the base class, override in descendant classes if desired - }, - - // @public - returnToLevelSelectScreen: function() { - - if ( this.stateProperty.get() === GameState.AWAITING_USER_INPUT ) { - // reset any partial input that the user may have entered - this.inputProperty.reset(); - } + } + else { + // all problems have been answered, the level is now complete + this.stateProperty.set( GameState.SHOWING_LEVEL_COMPLETED_DIALOG ); + this.activeLevelModel.gameTimer.stop(); + } + }, - // save state of current level - this.saveGameEnvironment(); + /** + * Retry the currently presented problem. + * @public + */ + retryProblem: function() { + this.stateProperty.set( GameState.AWAITING_USER_INPUT ); + }, - // if there is a timer running for displaying feedback, cancel it - if ( this.feedbackTimer ) { - timer.clearTimeout( this.feedbackTimer ); - } + /** + * Pick an unanswered problem and set it up in the model. Must be overridden in sub-types, since the way problems + * are set up varies. + * + * Returns true if able to set up a problem, false if not. A return value of false generally indicates that all + * problems have been answered. + * + * @protected + */ + setUpUnansweredProblem: function() { + throw new Error( 'this function must be overridden in sub-classes' ); + }, - // go back to the level selection screen - this.stateProperty.set( GameState.SELECTING_LEVEL ); - }, + /** + * Automatically answer most of the problems for this level. This is useful for testing, since it can save time + * when testing how the sim behaves when a user finishing answering all questions for a level. + * + * IMPORTANT: We need to be VERY CAREFUL that this is never available in the published sim. + * + * @protected + */ + autoAnswer: function() { + // does nothing in the base class, override in descendant classes if desired + }, - // @public - refreshLevel: function() { - if ( this.feedbackTimer ) { - timer.clearTimeout( this.feedbackTimer ); - } - this.resetLevel(); - this.activeLevelModel.displayScoreProperty.reset(); - this.nextProblem(); - this.activeLevelModel.gameTimer.start(); // may already be running, if so this is a no-op - this.refreshEmitter.emit(); + // @public + returnToLevelSelectScreen: function() { - // automatically answer most of the problems if enabled - this is for testing - ArithmeticQueryParameters.autoAnswer && this.autoAnswer(); - }, - - // @private - resetLevelModels: function() { - this.levelModels.forEach( function( levelModel ) { - levelModel.reset(); - } ); - }, - - // @public - set the level to be played, initializing or restoring the level as appropriate - setLevel: function( level ) { - this.levelNumberProperty.set( level ); - - // restore or init new environment for game - if ( this.levelModels[ level ].environment ) { - this.restoreGameEnvironment( this.levelModels[ level ].environment ); - if ( this.stateProperty.get() === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ) { - - // The user hit the back button before the feedback timer expired, so the next problem wasn't set up. We need - // to set it up now. See https://github.com/phetsims/arithmetic/issues/145 - this.nextProblem(); - } - } - else { - this.nextProblem(); + if ( this.stateProperty.get() === GameState.AWAITING_USER_INPUT ) { + // reset any partial input that the user may have entered + this.inputProperty.reset(); + } - // automatically answer most of the problems if enabled - this is for testing - ArithmeticQueryParameters.autoAnswer && this.autoAnswer(); - } - }, + // save state of current level + this.saveGameEnvironment(); - // @private - resetLevel: function() { - this.activeLevelModel.reset(); - this.inputProperty.reset(); - this.problemModel.reset(); - this.faceModel.reset(); - this.faceModel.hideFace(); - }, + // if there is a timer running for displaying feedback, cancel it + if ( this.feedbackTimer ) { + timer.clearTimeout( this.feedbackTimer ); + } - // @public - select an unused multiplican-multiplier pair - selectUnusedMultiplierPair: function() { - return this.activeLevelModel.selectUnusedMultiplierPair(); - }, + // go back to the level selection screen + this.stateProperty.set( GameState.SELECTING_LEVEL ); + }, - // @public - reset the scores, clear the boards - reset: function() { + // @public + refreshLevel: function() { + if ( this.feedbackTimer ) { + timer.clearTimeout( this.feedbackTimer ); + } + this.resetLevel(); + this.activeLevelModel.displayScoreProperty.reset(); + this.nextProblem(); + this.activeLevelModel.gameTimer.start(); // may already be running, if so this is a no-op + this.refreshEmitter.emit(); + + // automatically answer most of the problems if enabled - this is for testing + ArithmeticQueryParameters.autoAnswer && this.autoAnswer(); + }, + + // @private + resetLevelModels: function() { + this.levelModels.forEach( function( levelModel ) { + levelModel.reset(); + } ); + }, - this.levelNumberProperty.reset(); - this.inputProperty.reset(); - this.activeInputProperty.reset(); - this.stateProperty.reset(); - - // reset levels model - this.resetLevelModels(); - - // clear game level states - this.clearGameEnvironments(); - - // reset sound and timer on/off settings - ArithmeticGlobals.timerEnabledProperty.reset(); - }, - - // clear environments of all levels - clearGameEnvironments: function() { - this.levelModels.forEach( function( levelModel ) { - levelModel.environment = null; - } ); - }, - - // @private - set the 'game environment', generally used when switching to a different level - restoreGameEnvironment: function( environment ) { - this.activeLevelModel.currentScoreProperty.set( environment.currentScore ); - this.activeInputProperty.set( environment.activeInput ); - this.problemModel.multiplicandProperty.set( environment.multiplicand ); - this.problemModel.multiplierProperty.set( environment.multiplier ); - this.problemModel.productProperty.set( environment.product ); - this.problemModel.possiblePointsProperty.set( environment.possiblePoints ); - this.stateProperty.set( environment.state ); - this.inputProperty.set( environment.input ); - this.activeLevelModel.gameTimer.elapsedTimeProperty.value = environment.elapsedTime; - - // Elapsed time must account for any time that has gone by since the environment was saved. - if ( this.stateProperty.get() !== GameState.LEVEL_COMPLETED && - this.stateProperty.get() !== GameState.SHOWING_LEVEL_COMPLETED_DIALOG ) { - this.activeLevelModel.gameTimer.elapsedTimeProperty.value = - this.activeLevelModel.gameTimer.elapsedTimeProperty.value + - Math.floor( ( new Date().getTime() - environment.systemTimeWhenSaveOccurred ) / 1000 ); + // @public - set the level to be played, initializing or restoring the level as appropriate + setLevel: function( level ) { + this.levelNumberProperty.set( level ); + + // restore or init new environment for game + if ( this.levelModels[ level ].environment ) { + this.restoreGameEnvironment( this.levelModels[ level ].environment ); + if ( this.stateProperty.get() === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ) { + + // The user hit the back button before the feedback timer expired, so the next problem wasn't set up. We need + // to set it up now. See https://github.com/phetsims/arithmetic/issues/145 + this.nextProblem(); } - }, - - // save game environment of current level - saveGameEnvironment: function() { - this.activeLevelModel.environment = { - input: this.inputProperty.get(), - multiplicand: this.problemModel.multiplicandProperty.get(), - multiplier: this.problemModel.multiplierProperty.get(), - product: this.problemModel.productProperty.get(), - state: this.stateProperty.get(), - currentScore: this.activeLevelModel.currentScoreProperty.get(), - elapsedTime: this.activeLevelModel.gameTimer.elapsedTimeProperty.value, - systemTimeWhenSaveOccurred: new Date().getTime(), - possiblePoints: this.problemModel.possiblePointsProperty.get(), - activeInput: this.activeInputProperty.get() - }; } - } ); -} ); + else { + this.nextProblem(); + + // automatically answer most of the problems if enabled - this is for testing + ArithmeticQueryParameters.autoAnswer && this.autoAnswer(); + } + }, + + // @private + resetLevel: function() { + this.activeLevelModel.reset(); + this.inputProperty.reset(); + this.problemModel.reset(); + this.faceModel.reset(); + this.faceModel.hideFace(); + }, + + // @public - select an unused multiplican-multiplier pair + selectUnusedMultiplierPair: function() { + return this.activeLevelModel.selectUnusedMultiplierPair(); + }, + + // @public - reset the scores, clear the boards + reset: function() { + + this.levelNumberProperty.reset(); + this.inputProperty.reset(); + this.activeInputProperty.reset(); + this.stateProperty.reset(); + + // reset levels model + this.resetLevelModels(); + + // clear game level states + this.clearGameEnvironments(); + + // reset sound and timer on/off settings + ArithmeticGlobals.timerEnabledProperty.reset(); + }, + + // clear environments of all levels + clearGameEnvironments: function() { + this.levelModels.forEach( function( levelModel ) { + levelModel.environment = null; + } ); + }, + + // @private - set the 'game environment', generally used when switching to a different level + restoreGameEnvironment: function( environment ) { + this.activeLevelModel.currentScoreProperty.set( environment.currentScore ); + this.activeInputProperty.set( environment.activeInput ); + this.problemModel.multiplicandProperty.set( environment.multiplicand ); + this.problemModel.multiplierProperty.set( environment.multiplier ); + this.problemModel.productProperty.set( environment.product ); + this.problemModel.possiblePointsProperty.set( environment.possiblePoints ); + this.stateProperty.set( environment.state ); + this.inputProperty.set( environment.input ); + this.activeLevelModel.gameTimer.elapsedTimeProperty.value = environment.elapsedTime; + + // Elapsed time must account for any time that has gone by since the environment was saved. + if ( this.stateProperty.get() !== GameState.LEVEL_COMPLETED && + this.stateProperty.get() !== GameState.SHOWING_LEVEL_COMPLETED_DIALOG ) { + this.activeLevelModel.gameTimer.elapsedTimeProperty.value = + this.activeLevelModel.gameTimer.elapsedTimeProperty.value + + Math.floor( ( new Date().getTime() - environment.systemTimeWhenSaveOccurred ) / 1000 ); + } + }, + + // save game environment of current level + saveGameEnvironment: function() { + this.activeLevelModel.environment = { + input: this.inputProperty.get(), + multiplicand: this.problemModel.multiplicandProperty.get(), + multiplier: this.problemModel.multiplierProperty.get(), + product: this.problemModel.productProperty.get(), + state: this.stateProperty.get(), + currentScore: this.activeLevelModel.currentScoreProperty.get(), + elapsedTime: this.activeLevelModel.gameTimer.elapsedTimeProperty.value, + systemTimeWhenSaveOccurred: new Date().getTime(), + possiblePoints: this.problemModel.possiblePointsProperty.get(), + activeInput: this.activeInputProperty.get() + }; + } +} ); \ No newline at end of file diff --git a/js/common/model/FaceModel.js b/js/common/model/FaceModel.js index e62e9536..f8040ada 100644 --- a/js/common/model/FaceModel.js +++ b/js/common/model/FaceModel.js @@ -5,51 +5,47 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const Emitter = require( 'AXON/Emitter' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); +import Emitter from '../../../../axon/js/Emitter.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; - function FaceModel() { +function FaceModel() { - // @public - Points to be displayed near the face. In this simulation, the user gets 1 point when they get a - // challenge correct on the first try, zero otherwise. - this.pointsToDisplayProperty = new Property( 1 ); + // @public - Points to be displayed near the face. In this simulation, the user gets 1 point when they get a + // challenge correct on the first try, zero otherwise. + this.pointsToDisplayProperty = new Property( 1 ); - // @public - flag that controls the expression that the face should depict - this.isSmileProperty = new Property( true ); + // @public - flag that controls the expression that the face should depict + this.isSmileProperty = new Property( true ); - // @public - emitters for showing and hiding the face - this.showFaceEmitter = new Emitter(); - this.hideFaceEmitter = new Emitter(); - } + // @public - emitters for showing and hiding the face + this.showFaceEmitter = new Emitter(); + this.hideFaceEmitter = new Emitter(); +} + +arithmetic.register( 'FaceModel', FaceModel ); + +export default inherit( Object, FaceModel, { - arithmetic.register( 'FaceModel', FaceModel ); - - return inherit( Object, FaceModel, { - - // @public - showFace: function() { - // Use an emitter to indicate that the face should be shown rather than a property, since by design it is shown - // and then fades. - this.showFaceEmitter.emit(); - }, - - // @public - hideFace: function() { - // Emit an event that indicates that the face should be hidden, should be ignored if the face is not currently - // shown. - this.hideFaceEmitter.emit(); - }, - - // public - reset: function() { - this.pointsToDisplayProperty.reset(); - this.isSmileProperty.reset(); - } - } ); -} ); + // @public + showFace: function() { + // Use an emitter to indicate that the face should be shown rather than a property, since by design it is shown + // and then fades. + this.showFaceEmitter.emit(); + }, + + // @public + hideFace: function() { + // Emit an event that indicates that the face should be hidden, should be ignored if the face is not currently + // shown. + this.hideFaceEmitter.emit(); + }, + + // public + reset: function() { + this.pointsToDisplayProperty.reset(); + this.isSmileProperty.reset(); + } +} ); \ No newline at end of file diff --git a/js/common/model/GameState.js b/js/common/model/GameState.js index 6fe07574..ea59c768 100644 --- a/js/common/model/GameState.js +++ b/js/common/model/GameState.js @@ -6,27 +6,22 @@ * @author Andrey Zelenkov (Mlearner) * @author John Blanco */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); +import arithmetic from '../../arithmetic.js'; - // @public - const GameState = { - SELECTING_LEVEL: 'SELECTING_LEVEL', - AWAITING_USER_INPUT: 'AWAITING_USER_INPUT', - DISPLAYING_CORRECT_ANSWER_FEEDBACK: 'DISPLAYING_CORRECT_ANSWER_FEEDBACK', - DISPLAYING_INCORRECT_ANSWER_FEEDBACK: 'DISPLAYING_INCORRECT_ANSWER_FEEDBACK', - SHOWING_LEVEL_COMPLETED_DIALOG: 'SHOWING_LEVEL_COMPLETED_DIALOG', - LEVEL_COMPLETED: 'LEVEL_COMPLETED' - }; +// @public +const GameState = { + SELECTING_LEVEL: 'SELECTING_LEVEL', + AWAITING_USER_INPUT: 'AWAITING_USER_INPUT', + DISPLAYING_CORRECT_ANSWER_FEEDBACK: 'DISPLAYING_CORRECT_ANSWER_FEEDBACK', + DISPLAYING_INCORRECT_ANSWER_FEEDBACK: 'DISPLAYING_INCORRECT_ANSWER_FEEDBACK', + SHOWING_LEVEL_COMPLETED_DIALOG: 'SHOWING_LEVEL_COMPLETED_DIALOG', + LEVEL_COMPLETED: 'LEVEL_COMPLETED' +}; - // verify that enum is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( GameState ); } +// verify that enum is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( GameState ); } - arithmetic.register( 'GameState', GameState ); +arithmetic.register( 'GameState', GameState ); - return GameState; - -} ); \ No newline at end of file +export default GameState; \ No newline at end of file diff --git a/js/common/model/LevelModel.js b/js/common/model/LevelModel.js index 09c59c11..656f9ef8 100644 --- a/js/common/model/LevelModel.js +++ b/js/common/model/LevelModel.js @@ -6,116 +6,112 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const GameTimer = require( 'VEGAS/GameTimer' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); - - /** - * @param {number} tableSize - width and height of the multiplication table, which is assumed to be square - * @constructor - */ - function LevelModel( tableSize ) { - - // observable model properties - this.bestTimeProperty = new Property( null ); // @public - best time for level - this.currentScoreProperty = new Property( 0 ); // @public - current score for level - this.displayScoreProperty = new Property( 0 ); // @public - score for displaying in level select buttons - - // non-Property model values - this.tableSize = tableSize; // @public, read only - this.perfectScore = tableSize * tableSize; // @public, read only - this.gameTimer = new GameTimer(); // @public - timer for this level - - // @private - 2d array that tracks the 'used' state of each of the cells in the multiplication table for this level, - // accessed through methods defined in the inherit block - this.cellUsedStates = new Array( tableSize ); - for ( let i = 0; i < tableSize; i++ ) { - this.cellUsedStates[ i ] = new Array( tableSize ); - } - this.clearCellUsedStates(); - this.environment = null; // @public - storage area used for saving/restoring this level's state in the parent model +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import GameTimer from '../../../../vegas/js/GameTimer.js'; +import arithmetic from '../../arithmetic.js'; + +/** + * @param {number} tableSize - width and height of the multiplication table, which is assumed to be square + * @constructor + */ +function LevelModel( tableSize ) { + + // observable model properties + this.bestTimeProperty = new Property( null ); // @public - best time for level + this.currentScoreProperty = new Property( 0 ); // @public - current score for level + this.displayScoreProperty = new Property( 0 ); // @public - score for displaying in level select buttons + + // non-Property model values + this.tableSize = tableSize; // @public, read only + this.perfectScore = tableSize * tableSize; // @public, read only + this.gameTimer = new GameTimer(); // @public - timer for this level + + // @private - 2d array that tracks the 'used' state of each of the cells in the multiplication table for this level, + // accessed through methods defined in the inherit block + this.cellUsedStates = new Array( tableSize ); + for ( let i = 0; i < tableSize; i++ ) { + this.cellUsedStates[ i ] = new Array( tableSize ); } + this.clearCellUsedStates(); - arithmetic.register( 'LevelModel', LevelModel ); + this.environment = null; // @public - storage area used for saving/restoring this level's state in the parent model +} - return inherit( Object, LevelModel, { +arithmetic.register( 'LevelModel', LevelModel ); - // @public - reset this level - reset: function() { +export default inherit( Object, LevelModel, { - // reset this level model's explicitly defined properties - this.bestTimeProperty.reset(); - this.currentScoreProperty.reset(); - this.displayScoreProperty.reset(); + // @public - reset this level + reset: function() { - // reset the states of the cells - this.clearCellUsedStates(); + // reset this level model's explicitly defined properties + this.bestTimeProperty.reset(); + this.currentScoreProperty.reset(); + this.displayScoreProperty.reset(); - // reset game timer - this.gameTimer.stop(); - this.gameTimer.elapsedTimeProperty.value = 0; - }, + // reset the states of the cells + this.clearCellUsedStates(); - // @private - clear the usage state for all cells - clearCellUsedStates: function() { - // done as c-style loops for optimum performance - for ( let i = 0; i < this.tableSize; i++ ) { - for ( let j = 0; j < this.tableSize; j++ ) { - this.cellUsedStates[ i ][ j ] = false; - } + // reset game timer + this.gameTimer.stop(); + this.gameTimer.elapsedTimeProperty.value = 0; + }, + + // @private - clear the usage state for all cells + clearCellUsedStates: function() { + // done as c-style loops for optimum performance + for ( let i = 0; i < this.tableSize; i++ ) { + for ( let j = 0; j < this.tableSize; j++ ) { + this.cellUsedStates[ i ][ j ] = false; } - }, - - // @public - mark the cell associated with the provided multiplicand and multiplier as used - markCellAsUsed: function( multiplicand, multiplier ) { - this.cellUsedStates[ multiplicand - 1 ][ multiplier - 1 ] = true; - }, - - // @public - get the usage state for the requested cell - isCellUsed: function( multiplicand, multiplier ) { - return this.cellUsedStates[ multiplicand - 1 ][ multiplier - 1 ]; - }, - - // @public - chose a multiplicand-multiplier pair randomly from those that are available - selectUnusedMultiplierPair: function() { - const availableMultiplicands = []; - const availableMultipliers = []; - - // find available multiplicand rows with at least one unused cell - this.cellUsedStates.forEach( function( multipliers, index ) { - if ( multipliers.indexOf( false ) !== -1 ) { - availableMultiplicands.push( index + 1 ); - } - } ); - - // no more available multipliers - if ( !availableMultiplicands.length ) { - return null; + } + }, + + // @public - mark the cell associated with the provided multiplicand and multiplier as used + markCellAsUsed: function( multiplicand, multiplier ) { + this.cellUsedStates[ multiplicand - 1 ][ multiplier - 1 ] = true; + }, + + // @public - get the usage state for the requested cell + isCellUsed: function( multiplicand, multiplier ) { + return this.cellUsedStates[ multiplicand - 1 ][ multiplier - 1 ]; + }, + + // @public - chose a multiplicand-multiplier pair randomly from those that are available + selectUnusedMultiplierPair: function() { + const availableMultiplicands = []; + const availableMultipliers = []; + + // find available multiplicand rows with at least one unused cell + this.cellUsedStates.forEach( function( multipliers, index ) { + if ( multipliers.indexOf( false ) !== -1 ) { + availableMultiplicands.push( index + 1 ); } + } ); + + // no more available multipliers + if ( !availableMultiplicands.length ) { + return null; + } - // set multiplicand - const multiplicand = phet.joist.random.shuffle( availableMultiplicands )[ 0 ]; + // set multiplicand + const multiplicand = phet.joist.random.shuffle( availableMultiplicands )[ 0 ]; - // find available multipliers - this.cellUsedStates[ multiplicand - 1 ].forEach( function( isProblemAnswered, index ) { - if ( !isProblemAnswered ) { - availableMultipliers.push( index + 1 ); - } - } ); + // find available multipliers + this.cellUsedStates[ multiplicand - 1 ].forEach( function( isProblemAnswered, index ) { + if ( !isProblemAnswered ) { + availableMultipliers.push( index + 1 ); + } + } ); - // set multiplier - const multiplier = phet.joist.random.sample( availableMultipliers ); + // set multiplier + const multiplier = phet.joist.random.sample( availableMultipliers ); - return { - multiplicand: multiplicand, - multiplier: multiplier - }; - } - } ); -} ); + return { + multiplicand: multiplicand, + multiplier: multiplier + }; + } +} ); \ No newline at end of file diff --git a/js/common/model/ProblemModel.js b/js/common/model/ProblemModel.js index 67353623..a7cb4934 100644 --- a/js/common/model/ProblemModel.js +++ b/js/common/model/ProblemModel.js @@ -6,36 +6,32 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; - /** - * @constructor - */ - function ProblemModel() { +/** + * @constructor + */ +function ProblemModel() { - // @public - model properties, initialized to undefined, but only ever set to {number} - this.multiplicandProperty = new Property( undefined ); - this.multiplierProperty = new Property( undefined ); - this.productProperty = new Property( undefined ); // product of multiplication - this.possiblePointsProperty = new Property( 1 ); // points for correct completion of current task, can go down on incorrect answers - } + // @public - model properties, initialized to undefined, but only ever set to {number} + this.multiplicandProperty = new Property( undefined ); + this.multiplierProperty = new Property( undefined ); + this.productProperty = new Property( undefined ); // product of multiplication + this.possiblePointsProperty = new Property( 1 ); // points for correct completion of current task, can go down on incorrect answers +} - arithmetic.register( 'ProblemModel', ProblemModel ); +arithmetic.register( 'ProblemModel', ProblemModel ); - return inherit( Object, ProblemModel, { +export default inherit( Object, ProblemModel, { - // @public - reset: function() { - this.multiplicandProperty.reset(); - this.multiplierProperty.reset(); - this.productProperty.reset(); - this.possiblePointsProperty.reset(); - } - } ); + // @public + reset: function() { + this.multiplicandProperty.reset(); + this.multiplierProperty.reset(); + this.productProperty.reset(); + this.possiblePointsProperty.reset(); + } } ); \ No newline at end of file diff --git a/js/common/view/ArithmeticFaceWithPointsNode.js b/js/common/view/ArithmeticFaceWithPointsNode.js index 62e53a54..d092c6ef 100644 --- a/js/common/view/ArithmeticFaceWithPointsNode.js +++ b/js/common/view/ArithmeticFaceWithPointsNode.js @@ -7,97 +7,94 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const FaceWithPointsNode = require( 'SCENERY_PHET/FaceWithPointsNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const timer = require( 'AXON/timer' ); - const Utils = require( 'DOT/Utils' ); - - // constants - const UPDATE_PERIOD = 1 / 60 * 1000; // milliseconds, intended to match the expected frame rate - const OPAQUE_TIME = 1000; // milliseconds - const FADE_TIME = 1000; // milliseconds - - /** - * @param {Object} faceModel model for smile face. - * @param {Object} [options] for face node. - * - * @constructor - */ - function ArithmeticFaceWithPointsNode( faceModel, options ) { - const self = this; - - FaceWithPointsNode.call( this, merge( { - pointsFont: new PhetFont( { size: 26, weight: 'bold' } ), - visible: false // Initially invisible, must receive a showFace event to become visible. - }, options ) ); - - // set score of smile face - faceModel.pointsToDisplayProperty.link( function( points ) { - self.setPoints( points ); - } ); - - // set the facial expression - faceModel.isSmileProperty.link( function( isFaceSmile ) { - if ( isFaceSmile ) { - self.smile(); - } - else { - self.frown(); - } - } ); - - // Timer for fading the face. - let timerID = null; - // Handle the event that indicates that the face should be shown. - faceModel.showFaceEmitter.addListener( function() { +import timer from '../../../../axon/js/timer.js'; +import Utils from '../../../../dot/js/Utils.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import FaceWithPointsNode from '../../../../scenery-phet/js/FaceWithPointsNode.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import arithmetic from '../../arithmetic.js'; - // make face fully visible - self.visible = true; - self.opacity = 1; +// constants +const UPDATE_PERIOD = 1 / 60 * 1000; // milliseconds, intended to match the expected frame rate +const OPAQUE_TIME = 1000; // milliseconds +const FADE_TIME = 1000; // milliseconds - // Set the countdown to the total for the opaque time and the fade time. - let countdown = OPAQUE_TIME + FADE_TIME; - - // cancel previous timer if it exists - if ( timerID !== null ) { +/** + * @param {Object} faceModel model for smile face. + * @param {Object} [options] for face node. + * + * @constructor + */ +function ArithmeticFaceWithPointsNode( faceModel, options ) { + const self = this; + + FaceWithPointsNode.call( this, merge( { + pointsFont: new PhetFont( { size: 26, weight: 'bold' } ), + visible: false // Initially invisible, must receive a showFace event to become visible. + }, options ) ); + + // set score of smile face + faceModel.pointsToDisplayProperty.link( function( points ) { + self.setPoints( points ); + } ); + + // set the facial expression + faceModel.isSmileProperty.link( function( isFaceSmile ) { + if ( isFaceSmile ) { + self.smile(); + } + else { + self.frown(); + } + } ); + + // Timer for fading the face. + let timerID = null; + + // Handle the event that indicates that the face should be shown. + faceModel.showFaceEmitter.addListener( function() { + + // make face fully visible + self.visible = true; + self.opacity = 1; + + // Set the countdown to the total for the opaque time and the fade time. + let countdown = OPAQUE_TIME + FADE_TIME; + + // cancel previous timer if it exists + if ( timerID !== null ) { + timer.clearInterval( timerID ); + } + + // start up the new timer + timerID = timer.setInterval( function() { + countdown -= UPDATE_PERIOD; + self.opacity = Utils.clamp( countdown / FADE_TIME, 0, 1 ); + if ( self.opacity === 0 ) { timer.clearInterval( timerID ); - } - - // start up the new timer - timerID = timer.setInterval( function() { - countdown -= UPDATE_PERIOD; - self.opacity = Utils.clamp( countdown / FADE_TIME, 0, 1 ); - if ( self.opacity === 0 ) { - timer.clearInterval( timerID ); - timerID = null; - self.visible = false; - } - }, UPDATE_PERIOD ); - } ); - - // Handle the event that indicates that the face should be hidden. - faceModel.hideFaceEmitter.addListener( function() { - - // Cancel the timer (if running) - if ( timerID !== null ) { - timer.clearTimeout( timerID ); timerID = null; + self.visible = false; } + }, UPDATE_PERIOD ); + } ); + + // Handle the event that indicates that the face should be hidden. + faceModel.hideFaceEmitter.addListener( function() { + + // Cancel the timer (if running) + if ( timerID !== null ) { + timer.clearTimeout( timerID ); + timerID = null; + } - // Go completely invisible. - self.visible = false; - } ); - } + // Go completely invisible. + self.visible = false; + } ); +} - arithmetic.register( 'ArithmeticFaceWithPointsNode', ArithmeticFaceWithPointsNode ); +arithmetic.register( 'ArithmeticFaceWithPointsNode', ArithmeticFaceWithPointsNode ); - return inherit( FaceWithPointsNode, ArithmeticFaceWithPointsNode ); -} ); \ No newline at end of file +inherit( FaceWithPointsNode, ArithmeticFaceWithPointsNode ); +export default ArithmeticFaceWithPointsNode; \ No newline at end of file diff --git a/js/common/view/ArithmeticView.js b/js/common/view/ArithmeticView.js index d53a0e75..e3a34dc2 100644 --- a/js/common/view/ArithmeticView.js +++ b/js/common/view/ArithmeticView.js @@ -6,207 +6,204 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const Animation = require( 'TWIXT/Animation' ); - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const Bounds2 = require( 'DOT/Bounds2' ); - const Easing = require( 'TWIXT/Easing' ); - const GameAudioPlayer = require( 'VEGAS/GameAudioPlayer' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LevelSelectionNode = require( 'ARITHMETIC/common/view/LevelSelectionNode' ); - const merge = require( 'PHET_CORE/merge' ); - const ScreenView = require( 'JOIST/ScreenView' ); - const WorkspaceNode = require( 'ARITHMETIC/common/view/WorkspaceNode' ); - - // constants - const SCREEN_CHANGE_TIME = 0.75; // seconds - - /** - * @param {ArithmeticModel} model - Main model for screen. - * @param {Node} multiplicationTableNode - Multiplication table node for given screen. - * @param {Node} equationNode - Equation node for given screen. - * @param {Object} [options] - Configuration and position options, see usage in code for details. - * @constructor - */ - function ArithmeticView( model, multiplicationTableNode, equationNode, options ) { - const self = this; - ScreenView.call( this, { layoutBounds: new Bounds2( 0, 0, 768, 504 ) } ); - - // defaults - options = merge( { - titleString: '', - showKeypad: true, - levelSelectButtonColor: 'white', - levelSelectIconSet: 'multiply' - }, options ); - - // create and add the node that allows the user to select the game level - const levelSelectionNode = new LevelSelectionNode( - model, - options.titleString, - function( level ) { model.setLevel( level ); }, - this.layoutBounds, - { - centerX: this.layoutBounds.centerX, - centerY: this.layoutBounds.centerY, - buttonBaseColor: options.levelSelectButtonColor, - iconSet: options.levelSelectIconSet - } - ); - this.addChild( levelSelectionNode ); - - // add the game components - const workspaceNode = new WorkspaceNode( - model, - multiplicationTableNode, - equationNode, - this.layoutBounds, - { showKeypad: options.showKeypad, scoreboardTitle: options.titleString } - ); - workspaceNode.left = this.layoutBounds.maxX; - workspaceNode.visible = false; - this.addChild( workspaceNode ); - - // sounds player that is used to produce the feedback sounds for the game - const gameAudioPlayer = new GameAudioPlayer(); - - // set the origin of the answer animation in the multiplication table, which depends upon the newly set position of - // the equation node. - multiplicationTableNode.animationOrigin = equationNode.productInput.center; - - // create the animations that will slide the level selection screen and the workspaces in and out - const levelSelectionScreenInAnimator = new Animation( { - duration: SCREEN_CHANGE_TIME, - easing: Easing.CUBIC_IN_OUT, - getValue: function() { - return levelSelectionNode.x; - }, - setValue: function( newXPosition ) { - levelSelectionNode.x = newXPosition; - }, - to: self.layoutBounds.minX - } ); - levelSelectionScreenInAnimator.beginEmitter.addListener( function() { - levelSelectionNode.visible = true; - levelSelectionNode.pickable = false; // prevent interaction during animation - } ); - levelSelectionScreenInAnimator.finishEmitter.addListener( function() { - levelSelectionNode.pickable = true; - } ); - - const levelSelectionScreenOutAnimator = new Animation( { - duration: SCREEN_CHANGE_TIME, - easing: Easing.CUBIC_IN_OUT, - getValue: function() { - return levelSelectionNode.x; - }, - setValue: function( newXPosition ) { - levelSelectionNode.x = newXPosition; - }, - to: self.layoutBounds.minX - levelSelectionNode.width - } ); - levelSelectionScreenOutAnimator.beginEmitter.addListener( function() { - levelSelectionNode.pickable = false; // prevent interaction during animation - } ); - levelSelectionScreenOutAnimator.finishEmitter.addListener( function() { - levelSelectionNode.visible = false; - } ); - - const workspaceNodeInAnimator = new Animation( { - duration: SCREEN_CHANGE_TIME, - easing: Easing.CUBIC_IN_OUT, - getValue: function() { - return workspaceNode.x; - }, - setValue: function( newXPosition ) { - workspaceNode.x = newXPosition; - }, - to: self.layoutBounds.minX - } ); - workspaceNodeInAnimator.beginEmitter.addListener( function() { - workspaceNode.visible = true; - workspaceNode.pickable = false; // prevent interaction during animation - } ); - workspaceNodeInAnimator.finishEmitter.addListener( function() { - workspaceNode.pickable = true; - } ); - - const workspaceNodeOutAnimator = new Animation( { - duration: SCREEN_CHANGE_TIME, - easing: Easing.CUBIC_IN_OUT, - getValue: function() { - return workspaceNode.x; - }, - setValue: function( newXPosition ) { - workspaceNode.x = newXPosition; - }, - to: self.layoutBounds.maxX - } ); - workspaceNodeOutAnimator.beginEmitter.addListener( function() { - workspaceNode.pickable = false; // prevent interaction during animation - } ); - workspaceNodeOutAnimator.finishEmitter.addListener( function() { - workspaceNode.visible = false; - } ); - - // monitor the game state and update the view and changes occur - model.stateProperty.link( function( newState, oldState ) { - - // animate the transition between the level select screen and the selected level - if ( newState === GameState.SELECTING_LEVEL && oldState ) { - - // Slide out the workspace node - workspaceNodeInAnimator.stop(); - workspaceNodeOutAnimator.start(); - - // Slide in the level selection screen - levelSelectionScreenOutAnimator.stop(); - levelSelectionScreenInAnimator.start(); - } - else if ( newState !== GameState.SELECTING_LEVEL && oldState === GameState.SELECTING_LEVEL ) { - - // Slide in the workspace node - workspaceNodeOutAnimator.stop(); - workspaceNodeInAnimator.start(); - // Slide out the level selection screen - levelSelectionScreenInAnimator.stop(); - levelSelectionScreenOutAnimator.start(); - // levelSelectionScreenAnimatorOld.stop().to( { x: self.layoutBounds.minX - levelSelectionNode.width }, ANIMATION_TIME ).start( phet.joist.elapsedTime ); - } +import Bounds2 from '../../../../dot/js/Bounds2.js'; +import ScreenView from '../../../../joist/js/ScreenView.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Animation from '../../../../twixt/js/Animation.js'; +import Easing from '../../../../twixt/js/Easing.js'; +import GameAudioPlayer from '../../../../vegas/js/GameAudioPlayer.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../model/GameState.js'; +import LevelSelectionNode from './LevelSelectionNode.js'; +import WorkspaceNode from './WorkspaceNode.js'; + +// constants +const SCREEN_CHANGE_TIME = 0.75; // seconds - // play the appropriate audio, if any, for this state transition - if ( ( oldState === GameState.AWAITING_USER_INPUT || oldState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) - && newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ) { - // play the correct answer sound - gameAudioPlayer.correctAnswer(); +/** + * @param {ArithmeticModel} model - Main model for screen. + * @param {Node} multiplicationTableNode - Multiplication table node for given screen. + * @param {Node} equationNode - Equation node for given screen. + * @param {Object} [options] - Configuration and position options, see usage in code for details. + * @constructor + */ +function ArithmeticView( model, multiplicationTableNode, equationNode, options ) { + const self = this; + ScreenView.call( this, { layoutBounds: new Bounds2( 0, 0, 768, 504 ) } ); + + // defaults + options = merge( { + titleString: '', + showKeypad: true, + levelSelectButtonColor: 'white', + levelSelectIconSet: 'multiply' + }, options ); + + // create and add the node that allows the user to select the game level + const levelSelectionNode = new LevelSelectionNode( + model, + options.titleString, + function( level ) { model.setLevel( level ); }, + this.layoutBounds, + { + centerX: this.layoutBounds.centerX, + centerY: this.layoutBounds.centerY, + buttonBaseColor: options.levelSelectButtonColor, + iconSet: options.levelSelectIconSet + } + ); + this.addChild( levelSelectionNode ); + + // add the game components + const workspaceNode = new WorkspaceNode( + model, + multiplicationTableNode, + equationNode, + this.layoutBounds, + { showKeypad: options.showKeypad, scoreboardTitle: options.titleString } + ); + workspaceNode.left = this.layoutBounds.maxX; + workspaceNode.visible = false; + this.addChild( workspaceNode ); + + // sounds player that is used to produce the feedback sounds for the game + const gameAudioPlayer = new GameAudioPlayer(); + + // set the origin of the answer animation in the multiplication table, which depends upon the newly set position of + // the equation node. + multiplicationTableNode.animationOrigin = equationNode.productInput.center; + + // create the animations that will slide the level selection screen and the workspaces in and out + const levelSelectionScreenInAnimator = new Animation( { + duration: SCREEN_CHANGE_TIME, + easing: Easing.CUBIC_IN_OUT, + getValue: function() { + return levelSelectionNode.x; + }, + setValue: function( newXPosition ) { + levelSelectionNode.x = newXPosition; + }, + to: self.layoutBounds.minX + } ); + levelSelectionScreenInAnimator.beginEmitter.addListener( function() { + levelSelectionNode.visible = true; + levelSelectionNode.pickable = false; // prevent interaction during animation + } ); + levelSelectionScreenInAnimator.finishEmitter.addListener( function() { + levelSelectionNode.pickable = true; + } ); + + const levelSelectionScreenOutAnimator = new Animation( { + duration: SCREEN_CHANGE_TIME, + easing: Easing.CUBIC_IN_OUT, + getValue: function() { + return levelSelectionNode.x; + }, + setValue: function( newXPosition ) { + levelSelectionNode.x = newXPosition; + }, + to: self.layoutBounds.minX - levelSelectionNode.width + } ); + levelSelectionScreenOutAnimator.beginEmitter.addListener( function() { + levelSelectionNode.pickable = false; // prevent interaction during animation + } ); + levelSelectionScreenOutAnimator.finishEmitter.addListener( function() { + levelSelectionNode.visible = false; + } ); + + const workspaceNodeInAnimator = new Animation( { + duration: SCREEN_CHANGE_TIME, + easing: Easing.CUBIC_IN_OUT, + getValue: function() { + return workspaceNode.x; + }, + setValue: function( newXPosition ) { + workspaceNode.x = newXPosition; + }, + to: self.layoutBounds.minX + } ); + workspaceNodeInAnimator.beginEmitter.addListener( function() { + workspaceNode.visible = true; + workspaceNode.pickable = false; // prevent interaction during animation + } ); + workspaceNodeInAnimator.finishEmitter.addListener( function() { + workspaceNode.pickable = true; + } ); + + const workspaceNodeOutAnimator = new Animation( { + duration: SCREEN_CHANGE_TIME, + easing: Easing.CUBIC_IN_OUT, + getValue: function() { + return workspaceNode.x; + }, + setValue: function( newXPosition ) { + workspaceNode.x = newXPosition; + }, + to: self.layoutBounds.maxX + } ); + workspaceNodeOutAnimator.beginEmitter.addListener( function() { + workspaceNode.pickable = false; // prevent interaction during animation + } ); + workspaceNodeOutAnimator.finishEmitter.addListener( function() { + workspaceNode.visible = false; + } ); + + // monitor the game state and update the view and changes occur + model.stateProperty.link( function( newState, oldState ) { + + // animate the transition between the level select screen and the selected level + if ( newState === GameState.SELECTING_LEVEL && oldState ) { + + // Slide out the workspace node + workspaceNodeInAnimator.stop(); + workspaceNodeOutAnimator.start(); + + // Slide in the level selection screen + levelSelectionScreenOutAnimator.stop(); + levelSelectionScreenInAnimator.start(); + } + else if ( newState !== GameState.SELECTING_LEVEL && oldState === GameState.SELECTING_LEVEL ) { + + // Slide in the workspace node + workspaceNodeOutAnimator.stop(); + workspaceNodeInAnimator.start(); + + // Slide out the level selection screen + levelSelectionScreenInAnimator.stop(); + levelSelectionScreenOutAnimator.start(); + // levelSelectionScreenAnimatorOld.stop().to( { x: self.layoutBounds.minX - levelSelectionNode.width }, ANIMATION_TIME ).start( phet.joist.elapsedTime ); + } + + // play the appropriate audio, if any, for this state transition + if ( ( oldState === GameState.AWAITING_USER_INPUT || oldState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) + && newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ) { + // play the correct answer sound + gameAudioPlayer.correctAnswer(); + } + else if ( oldState === GameState.AWAITING_USER_INPUT && newState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + // play the incorrect answer sound + gameAudioPlayer.wrongAnswer(); + } + else if ( oldState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK && newState === GameState.SHOWING_LEVEL_COMPLETED_DIALOG ) { + const resultScore = model.activeLevelModel.currentScoreProperty.get(); + const perfectScore = model.activeLevelModel.perfectScore; + + if ( resultScore === perfectScore ) { + gameAudioPlayer.gameOverPerfectScore(); } - else if ( oldState === GameState.AWAITING_USER_INPUT && newState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - // play the incorrect answer sound - gameAudioPlayer.wrongAnswer(); + else if ( resultScore === 0 ) { + gameAudioPlayer.gameOverZeroScore(); } - else if ( oldState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK && newState === GameState.SHOWING_LEVEL_COMPLETED_DIALOG ) { - const resultScore = model.activeLevelModel.currentScoreProperty.get(); - const perfectScore = model.activeLevelModel.perfectScore; - - if ( resultScore === perfectScore ) { - gameAudioPlayer.gameOverPerfectScore(); - } - else if ( resultScore === 0 ) { - gameAudioPlayer.gameOverZeroScore(); - } - else { - gameAudioPlayer.gameOverImperfectScore(); - } + else { + gameAudioPlayer.gameOverImperfectScore(); } - } ); - } + } + } ); +} - arithmetic.register( 'ArithmeticView', ArithmeticView ); +arithmetic.register( 'ArithmeticView', ArithmeticView ); - return inherit( ScreenView, ArithmeticView ); -} ); +inherit( ScreenView, ArithmeticView ); +export default ArithmeticView; \ No newline at end of file diff --git a/js/common/view/EquationInputNode.js b/js/common/view/EquationInputNode.js index 103625a9..abacaacc 100644 --- a/js/common/view/EquationInputNode.js +++ b/js/common/view/EquationInputNode.js @@ -7,124 +7,120 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const Text = require( 'SCENERY/nodes/Text' ); - const timer = require( 'AXON/timer' ); - - // strings - const unknownValueIndicatorString = require( 'string!ARITHMETIC/unknownValueIndicator' ); - - // constants - const INTERACTIVE_FILL = 'white'; - const NON_INTERACTIVE_FILL = '#dddddd'; - const MIN_X_MARGIN = 5; - const CURSOR_HEIGHT = new Text( '8', { font: ArithmeticConstants.EQUATION_FONT_TEXT } ).height * 0.7; - - // convenience function to avoid duplicated code - const updateBoxPosition = function( box, inputSize ) { - box.centerX = inputSize.width / 2; - box.centerY = inputSize.height / 2; - }; + +import timer from '../../../../axon/js/timer.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticConstants from '../ArithmeticConstants.js'; + +const unknownValueIndicatorString = arithmeticStrings.unknownValueIndicator; + +// constants +const INTERACTIVE_FILL = 'white'; +const NON_INTERACTIVE_FILL = '#dddddd'; +const MIN_X_MARGIN = 5; +const CURSOR_HEIGHT = new Text( '8', { font: ArithmeticConstants.EQUATION_FONT_TEXT } ).height * 0.7; + +// convenience function to avoid duplicated code +const updateBoxPosition = function( box, inputSize ) { + box.centerX = inputSize.width / 2; + box.centerY = inputSize.height / 2; +}; + +/** + * @param {Property} valueProperty for observing and changing by input + * @param {Dimension2} size - Dimensions of this input component. + * + * @constructor + */ +function EquationInputNode( valueProperty, size ) { + const self = this; + Node.call( this ); + + // @private - create text and save reference for use in public methods + this.inputText = new Text( unknownValueIndicatorString, { + font: ArithmeticConstants.EQUATION_FONT_TEXT, + maxWidth: size.width - 2 * MIN_X_MARGIN + } ); + + // @private - create cursor and save reference for use in public methods + this.textCursor = new Rectangle( 0, 2, 1, CURSOR_HEIGHT, { fill: 'black' } ); + this.cursorContainer = new Node( { children: [ this.textCursor ] } ); + + // @private - save reference to input size value for use in public methods + this.inputSize = size; + + // update text when the value changes + valueProperty.lazyLink( function( value ) { + self.inputText.setText( isNaN( value ) ? '' : value ); + updateBoxPosition( self._box, size ); + } ); + + // set up blinking of cursor + timer.setInterval( function() { + self.textCursor.visible = !self.textCursor.visible; + }, ArithmeticConstants.CURSOR_BLINK_INTERVAL ); + + // @private - background of this input box + this.background = new Rectangle( 0, 0, size.width, size.height, 5, 5, { fill: NON_INTERACTIVE_FILL } ); + this.addChild( this.background ); + + // @private - horizontal box containing the input text and the cursor + this._box = new HBox( { + children: [ this.inputText, this.cursorContainer ], + centerX: size.width / 2, + centerY: size.height / 2 + } ); + this.addChild( this._box ); + + // unfocused state by default + this.setFocus( false ); +} + +arithmetic.register( 'EquationInputNode', EquationInputNode ); + +export default inherit( Node, EquationInputNode, { /** - * @param {Property} valueProperty for observing and changing by input - * @param {Dimension2} size - Dimensions of this input component. - * - * @constructor + * Clear the textual value shown in this node. This is done regardless of the value of the value property that is + * being monitored by this node. + * @public */ - function EquationInputNode( valueProperty, size ) { - const self = this; - Node.call( this ); - - // @private - create text and save reference for use in public methods - this.inputText = new Text( unknownValueIndicatorString, { - font: ArithmeticConstants.EQUATION_FONT_TEXT, - maxWidth: size.width - 2 * MIN_X_MARGIN - } ); - - // @private - create cursor and save reference for use in public methods - this.textCursor = new Rectangle( 0, 2, 1, CURSOR_HEIGHT, { fill: 'black' } ); - this.cursorContainer = new Node( { children: [ this.textCursor ] } ); - - // @private - save reference to input size value for use in public methods - this.inputSize = size; - - // update text when the value changes - valueProperty.lazyLink( function( value ) { - self.inputText.setText( isNaN( value ) ? '' : value ); - updateBoxPosition( self._box, size ); - } ); - - // set up blinking of cursor - timer.setInterval( function() { - self.textCursor.visible = !self.textCursor.visible; - }, ArithmeticConstants.CURSOR_BLINK_INTERVAL ); - - // @private - background of this input box - this.background = new Rectangle( 0, 0, size.width, size.height, 5, 5, { fill: NON_INTERACTIVE_FILL } ); - this.addChild( this.background ); - - // @private - horizontal box containing the input text and the cursor - this._box = new HBox( { - children: [ this.inputText, this.cursorContainer ], - centerX: size.width / 2, - centerY: size.height / 2 - } ); - this.addChild( this._box ); - - // unfocused state by default - this.setFocus( false ); - } + clear: function() { + this.inputText.setText( '' ); + updateBoxPosition( this._box, this.inputSize ); + }, - arithmetic.register( 'EquationInputNode', EquationInputNode ); - - return inherit( Node, EquationInputNode, { - - /** - * Clear the textual value shown in this node. This is done regardless of the value of the value property that is - * being monitored by this node. - * @public - */ - clear: function() { - this.inputText.setText( '' ); - updateBoxPosition( this._box, this.inputSize ); - }, - - /** - * Set or remove focus, which for this component simply turns the blinking cursor on or off. - * @param {boolean} focus - * @public - */ - setFocus: function( focus ) { - this.cursorContainer.visible = focus; - }, - - /** - * Set the appearance of this node to indicate to the user that it is interactive, meaning that their actions are - * going to change its value. - * @param {boolean} interactive - * @public - */ - setInteractiveAppearance: function( interactive ) { - this.background.fill = interactive ? INTERACTIVE_FILL : NON_INTERACTIVE_FILL; - }, - - /** - * Set the textual value of this node to a 'placeholder' value (a question mark at the time of this writing). - * @public - */ - setPlaceholder: function() { - this.inputText.setText( unknownValueIndicatorString ); - updateBoxPosition( this._box, this.inputSize ); - } - } ); -} ); + /** + * Set or remove focus, which for this component simply turns the blinking cursor on or off. + * @param {boolean} focus + * @public + */ + setFocus: function( focus ) { + this.cursorContainer.visible = focus; + }, + + /** + * Set the appearance of this node to indicate to the user that it is interactive, meaning that their actions are + * going to change its value. + * @param {boolean} interactive + * @public + */ + setInteractiveAppearance: function( interactive ) { + this.background.fill = interactive ? INTERACTIVE_FILL : NON_INTERACTIVE_FILL; + }, + + /** + * Set the textual value of this node to a 'placeholder' value (a question mark at the time of this writing). + * @public + */ + setPlaceholder: function() { + this.inputText.setText( unknownValueIndicatorString ); + updateBoxPosition( this._box, this.inputSize ); + } +} ); \ No newline at end of file diff --git a/js/common/view/EquationNode.js b/js/common/view/EquationNode.js index 553d0163..7a9663e7 100644 --- a/js/common/view/EquationNode.js +++ b/js/common/view/EquationNode.js @@ -6,76 +6,72 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const Dimension2 = require( 'DOT/Dimension2' ); - const EquationInputNode = require( 'ARITHMETIC/common/view/EquationInputNode' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const merge = require( 'PHET_CORE/merge' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const Text = require( 'SCENERY/nodes/Text' ); +import Dimension2 from '../../../../dot/js/Dimension2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import arithmetic from '../../arithmetic.js'; +import EquationInputNode from './EquationInputNode.js'; - // constants - const FONT_EQUALS = new PhetFont( 45 ); - const FONT_X = new PhetFont( 50 ); - const INPUT_SIZE_MULTIPLIER = new Dimension2( 70, 45 ); // size of input boxes for multiplier - const INPUT_SIZE_PRODUCT = new Dimension2( 80, 45 ); // size of input box for product - const SPACING = 20; // spacing between equation elements - const SYMBOL_COLOR = '#FFFF00'; +// constants +const FONT_EQUALS = new PhetFont( 45 ); +const FONT_X = new PhetFont( 50 ); +const INPUT_SIZE_MULTIPLIER = new Dimension2( 70, 45 ); // size of input boxes for multiplier +const INPUT_SIZE_PRODUCT = new Dimension2( 80, 45 ); // size of input box for product +const SPACING = 20; // spacing between equation elements +const SYMBOL_COLOR = '#FFFF00'; - /** - * @param {Property.} multiplicandProperty - Property necessary for creating multiplicand input. - * @param {Property.} multiplierProperty - Property necessary for creating multiplier input. - * @param {Property.} productProperty - Property necessary for creating product input. - * @param {Property.} productProperty - Property necessary for creating product input. - * @param {Object} [options] - * @constructor - */ - function EquationNode( multiplicandProperty, multiplierProperty, productProperty, options ) { +/** + * @param {Property.} multiplicandProperty - Property necessary for creating multiplicand input. + * @param {Property.} multiplierProperty - Property necessary for creating multiplier input. + * @param {Property.} productProperty - Property necessary for creating product input. + * @param {Property.} productProperty - Property necessary for creating product input. + * @param {Object} [options] + * @constructor + */ +function EquationNode( multiplicandProperty, multiplierProperty, productProperty, options ) { - options = merge( { - spacing: SPACING, - resize: false - }, options ); + options = merge( { + spacing: SPACING, + resize: false + }, options ); - // @public - Set up the three nodes that depict the numbers in the equation. - this.multiplicandInput = new EquationInputNode( multiplicandProperty, INPUT_SIZE_MULTIPLIER ); - this.multiplierInput = new EquationInputNode( multiplierProperty, INPUT_SIZE_MULTIPLIER ); - this.productInput = new EquationInputNode( productProperty, INPUT_SIZE_PRODUCT ); + // @public - Set up the three nodes that depict the numbers in the equation. + this.multiplicandInput = new EquationInputNode( multiplicandProperty, INPUT_SIZE_MULTIPLIER ); + this.multiplierInput = new EquationInputNode( multiplierProperty, INPUT_SIZE_MULTIPLIER ); + this.productInput = new EquationInputNode( productProperty, INPUT_SIZE_PRODUCT ); - // @private - Set up the equals sign, which can potentially be changed to a not equals sign. - this.equalsSign = new Text( '', { font: FONT_EQUALS, fill: SYMBOL_COLOR } ); - this.setShowEqual( true ); // Default to equals equation until set otherwise. + // @private - Set up the equals sign, which can potentially be changed to a not equals sign. + this.equalsSign = new Text( '', { font: FONT_EQUALS, fill: SYMBOL_COLOR } ); + this.setShowEqual( true ); // Default to equals equation until set otherwise. - options.children = [ - this.multiplicandInput, - new Text( MathSymbols.TIMES, { font: FONT_X, fill: SYMBOL_COLOR } ), - this.multiplierInput, - this.equalsSign, - this.productInput - ]; + options.children = [ + this.multiplicandInput, + new Text( MathSymbols.TIMES, { font: FONT_X, fill: SYMBOL_COLOR } ), + this.multiplierInput, + this.equalsSign, + this.productInput + ]; - // Perform the layout by placing everything in an HBox. - HBox.call( this, options ); - } + // Perform the layout by placing everything in an HBox. + HBox.call( this, options ); +} - arithmetic.register( 'EquationNode', EquationNode ); +arithmetic.register( 'EquationNode', EquationNode ); - return inherit( HBox, EquationNode, { +export default inherit( HBox, EquationNode, { - /** - * Set the equation to depict equals or not equals. - * - * @param {boolean} showEqual - * @protected - */ - setShowEqual: function( showEqual ) { - this.equalsSign.text = showEqual ? MathSymbols.EQUAL_TO : MathSymbols.NOT_EQUAL_TO; - } - } ); -} ); + /** + * Set the equation to depict equals or not equals. + * + * @param {boolean} showEqual + * @protected + */ + setShowEqual: function( showEqual ) { + this.equalsSign.text = showEqual ? MathSymbols.EQUAL_TO : MathSymbols.NOT_EQUAL_TO; + } +} ); \ No newline at end of file diff --git a/js/common/view/LevelCompletedNodeWrapper.js b/js/common/view/LevelCompletedNodeWrapper.js index 096fc844..f4e4a0df 100644 --- a/js/common/view/LevelCompletedNodeWrapper.js +++ b/js/common/view/LevelCompletedNodeWrapper.js @@ -5,56 +5,53 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const Color = require( 'SCENERY/util/Color' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LevelCompletedNode = require( 'VEGAS/LevelCompletedNode' ); - const Node = require( 'SCENERY/nodes/Node' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Color from '../../../../scenery/js/util/Color.js'; +import LevelCompletedNode from '../../../../vegas/js/LevelCompletedNode.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticConstants from '../ArithmeticConstants.js'; +import GameState from '../model/GameState.js'; - /** - * @param {Array} levelModels - Array of descriptions for each level. Necessary to get perfect and current score for - * completed level. - * @param {Property} levelNumberProperty - Level property. - * @param {Property} stateProperty - Game state property. - * @param {Property} timerEnabledProperty - Timer enabled flag. - * @param {Function} continueCallback - Callback listener for continue button. - * @param {Bounds2} layoutBounds - Bounds of main screen. Necessary for placing components. - * @constructor - */ - function LevelCompletedNodeWrapper( levelModels, levelNumberProperty, stateProperty, timerEnabledProperty, continueCallback, layoutBounds ) { - const self = this; - Node.call( this ); +/** + * @param {Array} levelModels - Array of descriptions for each level. Necessary to get perfect and current score for + * completed level. + * @param {Property} levelNumberProperty - Level property. + * @param {Property} stateProperty - Game state property. + * @param {Property} timerEnabledProperty - Timer enabled flag. + * @param {Function} continueCallback - Callback listener for continue button. + * @param {Bounds2} layoutBounds - Bounds of main screen. Necessary for placing components. + * @constructor + */ +function LevelCompletedNodeWrapper( levelModels, levelNumberProperty, stateProperty, timerEnabledProperty, continueCallback, layoutBounds ) { + const self = this; + Node.call( this ); - // Show this node only when the level has been completed. - stateProperty.lazyLink( function( state ) { - if ( state === GameState.SHOWING_LEVEL_COMPLETED_DIALOG ) { - const levelModel = levelModels[ levelNumberProperty.value ]; - self.addChild( new LevelCompletedNode( - levelNumberProperty.value + 1, - levelModel.currentScoreProperty.get(), - levelModel.perfectScore, - ArithmeticConstants.NUM_STARS, - timerEnabledProperty.value, - levelModel.gameTimer.elapsedTimeProperty.value, - levelModel.bestTimeProperty.get(), - ( levelModel.gameTimer.elapsedTimeProperty.get() < levelModel.bestTimeProperty.get() ), - continueCallback, - { fill: new Color( 255, 235, 205 ), centerX: layoutBounds.maxX / 2, centerY: layoutBounds.maxY / 2 } - ) ); - } - else if ( state === GameState.AWAITING_USER_INPUT || state === GameState.LEVEL_COMPLETED ) { - self.removeAllChildren(); - } - } ); - } + // Show this node only when the level has been completed. + stateProperty.lazyLink( function( state ) { + if ( state === GameState.SHOWING_LEVEL_COMPLETED_DIALOG ) { + const levelModel = levelModels[ levelNumberProperty.value ]; + self.addChild( new LevelCompletedNode( + levelNumberProperty.value + 1, + levelModel.currentScoreProperty.get(), + levelModel.perfectScore, + ArithmeticConstants.NUM_STARS, + timerEnabledProperty.value, + levelModel.gameTimer.elapsedTimeProperty.value, + levelModel.bestTimeProperty.get(), + ( levelModel.gameTimer.elapsedTimeProperty.get() < levelModel.bestTimeProperty.get() ), + continueCallback, + { fill: new Color( 255, 235, 205 ), centerX: layoutBounds.maxX / 2, centerY: layoutBounds.maxY / 2 } + ) ); + } + else if ( state === GameState.AWAITING_USER_INPUT || state === GameState.LEVEL_COMPLETED ) { + self.removeAllChildren(); + } + } ); +} - arithmetic.register( 'LevelCompletedNodeWrapper', LevelCompletedNodeWrapper ); +arithmetic.register( 'LevelCompletedNodeWrapper', LevelCompletedNodeWrapper ); - return inherit( Node, LevelCompletedNodeWrapper ); -} ); \ No newline at end of file +inherit( Node, LevelCompletedNodeWrapper ); +export default LevelCompletedNodeWrapper; \ No newline at end of file diff --git a/js/common/view/LevelSelectionNode.js b/js/common/view/LevelSelectionNode.js index 7e186598..9a0b1403 100644 --- a/js/common/view/LevelSelectionNode.js +++ b/js/common/view/LevelSelectionNode.js @@ -6,147 +6,142 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const ArithmeticGlobals = require( 'ARITHMETIC/common/ArithmeticGlobals' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LevelSelectionButton = require( 'VEGAS/LevelSelectionButton' ); - const merge = require( 'PHET_CORE/merge' ); - const Node = require( 'SCENERY/nodes/Node' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const ResetAllButton = require( 'SCENERY_PHET/buttons/ResetAllButton' ); - const Text = require( 'SCENERY/nodes/Text' ); - const TimerToggleButton = require( 'SCENERY_PHET/buttons/TimerToggleButton' ); - const VBox = require( 'SCENERY/nodes/VBox' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import ResetAllButton from '../../../../scenery-phet/js/buttons/ResetAllButton.js'; +import TimerToggleButton from '../../../../scenery-phet/js/buttons/TimerToggleButton.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Image from '../../../../scenery/js/nodes/Image.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import LevelSelectionButton from '../../../../vegas/js/LevelSelectionButton.js'; +import divideLevel1Icon from '../../../mipmaps/divide_level_1_icon_png.js'; +import divideLevel2Icon from '../../../mipmaps/divide_level_2_icon_png.js'; +import divideLevel3Icon from '../../../mipmaps/divide_level_3_icon_png.js'; +import factorLevel1Icon from '../../../mipmaps/factor_level_1_icon_png.js'; +import factorLevel2Icon from '../../../mipmaps/factor_level_2_icon_png.js'; +import factorLevel3Icon from '../../../mipmaps/factor_level_3_icon_png.js'; +import multiplyLevel1Icon from '../../../mipmaps/multiply_level_1_icon_png.js'; +import multiplyLevel2Icon from '../../../mipmaps/multiply_level_2_icon_png.js'; +import multiplyLevel3Icon from '../../../mipmaps/multiply_level_3_icon_png.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticConstants from '../ArithmeticConstants.js'; +import ArithmeticGlobals from '../ArithmeticGlobals.js'; + +// constants +const CHOOSE_LEVEL_TITLE_FONT = new PhetFont( { size: 24 } ); +const TAB_TITLE_FONT = new PhetFont( { size: 54 } ); +const BUTTON_LENGTH = 150; + +// icon sets, used to place on the buttons +const ICON_SETS = { + multiply: [ + multiplyLevel1Icon, + multiplyLevel2Icon, + multiplyLevel3Icon + ], + factor: [ + factorLevel1Icon, + factorLevel2Icon, + factorLevel3Icon + ], + divide: [ + divideLevel1Icon, + divideLevel2Icon, + divideLevel3Icon + ] +}; + +const chooseYourLevelString = arithmeticStrings.chooseYourLevel; - // images - const multiplyLevel1Icon = require( 'mipmap!ARITHMETIC/multiply_level_1_icon.png' ); - const multiplyLevel2Icon = require( 'mipmap!ARITHMETIC/multiply_level_2_icon.png' ); - const multiplyLevel3Icon = require( 'mipmap!ARITHMETIC/multiply_level_3_icon.png' ); - const factorLevel1Icon = require( 'mipmap!ARITHMETIC/factor_level_1_icon.png' ); - const factorLevel2Icon = require( 'mipmap!ARITHMETIC/factor_level_2_icon.png' ); - const factorLevel3Icon = require( 'mipmap!ARITHMETIC/factor_level_3_icon.png' ); - const divideLevel1Icon = require( 'mipmap!ARITHMETIC/divide_level_1_icon.png' ); - const divideLevel2Icon = require( 'mipmap!ARITHMETIC/divide_level_2_icon.png' ); - const divideLevel3Icon = require( 'mipmap!ARITHMETIC/divide_level_3_icon.png' ); - - // constants - const CHOOSE_LEVEL_TITLE_FONT = new PhetFont( { size: 24 } ); - const TAB_TITLE_FONT = new PhetFont( { size: 54 } ); - const BUTTON_LENGTH = 150; - - // icon sets, used to place on the buttons - const ICON_SETS = { - multiply: [ - multiplyLevel1Icon, - multiplyLevel2Icon, - multiplyLevel3Icon - ], - factor: [ - factorLevel1Icon, - factorLevel2Icon, - factorLevel3Icon - ], - divide: [ - divideLevel1Icon, - divideLevel2Icon, - divideLevel3Icon - ] - }; - - // strings - const chooseYourLevelString = require( 'string!ARITHMETIC/chooseYourLevel' ); - - /** - * @param {ArithmeticModel} model - Main model for screen. - * @param {string} titleString - Title string for given screen. - * @param {Function} callback - Callback function call after pressing button. - * @param {Bounds2} layoutBounds - Bounds of screen on which this will appear, used for layout - * @param {Object} [options] - * @constructor - */ - function LevelSelectionNode( model, titleString, callback, layoutBounds, options ) { - Node.call( this ); - - // Default options - options = merge( { - buttonBaseColor: 'white', - iconSet: 'multiply' // valid values are 'multiply', 'factor', and 'divide' - }, options ); - - // add title - const tabTitle = new Text( titleString, { - font: TAB_TITLE_FONT, - centerX: layoutBounds.centerX, - top: layoutBounds.height * 0.1 - } ); - this.addChild( tabTitle ); - - // add choose level title - const chooseLevelTitle = new Text( chooseYourLevelString, { - font: CHOOSE_LEVEL_TITLE_FONT, - centerX: layoutBounds.centerX, - top: tabTitle.bottom + 15 - } ); - this.addChild( chooseLevelTitle ); - - // add select level buttons - assert && assert( model.levelModels.length === ICON_SETS[ options.iconSet ].length, 'Number of icons doesn\'t match number of levels' ); - const levelSelectButtons = model.levelModels.map( function( level, levelIndex ) { - return new LevelSelectionButton( - new Image( ICON_SETS[ options.iconSet ][ levelIndex ] ), - model.levelModels[ levelIndex ].displayScoreProperty, - { - buttonWidth: BUTTON_LENGTH, - buttonHeight: BUTTON_LENGTH, - baseColor: options.buttonBaseColor, - bestTimeProperty: model.levelModels[ levelIndex ].bestTimeProperty, - bestTimeVisibleProperty: ArithmeticGlobals.timerEnabledProperty, - listener: function() { - callback( levelIndex ); - }, - scoreDisplayOptions: { - numberOfStars: ArithmeticConstants.NUM_STARS, - perfectScore: level.perfectScore - } +/** + * @param {ArithmeticModel} model - Main model for screen. + * @param {string} titleString - Title string for given screen. + * @param {Function} callback - Callback function call after pressing button. + * @param {Bounds2} layoutBounds - Bounds of screen on which this will appear, used for layout + * @param {Object} [options] + * @constructor + */ +function LevelSelectionNode( model, titleString, callback, layoutBounds, options ) { + Node.call( this ); + + // Default options + options = merge( { + buttonBaseColor: 'white', + iconSet: 'multiply' // valid values are 'multiply', 'factor', and 'divide' + }, options ); + + // add title + const tabTitle = new Text( titleString, { + font: TAB_TITLE_FONT, + centerX: layoutBounds.centerX, + top: layoutBounds.height * 0.1 + } ); + this.addChild( tabTitle ); + + // add choose level title + const chooseLevelTitle = new Text( chooseYourLevelString, { + font: CHOOSE_LEVEL_TITLE_FONT, + centerX: layoutBounds.centerX, + top: tabTitle.bottom + 15 + } ); + this.addChild( chooseLevelTitle ); + + // add select level buttons + assert && assert( model.levelModels.length === ICON_SETS[ options.iconSet ].length, 'Number of icons doesn\'t match number of levels' ); + const levelSelectButtons = model.levelModels.map( function( level, levelIndex ) { + return new LevelSelectionButton( + new Image( ICON_SETS[ options.iconSet ][ levelIndex ] ), + model.levelModels[ levelIndex ].displayScoreProperty, + { + buttonWidth: BUTTON_LENGTH, + buttonHeight: BUTTON_LENGTH, + baseColor: options.buttonBaseColor, + bestTimeProperty: model.levelModels[ levelIndex ].bestTimeProperty, + bestTimeVisibleProperty: ArithmeticGlobals.timerEnabledProperty, + listener: function() { + callback( levelIndex ); + }, + scoreDisplayOptions: { + numberOfStars: ArithmeticConstants.NUM_STARS, + perfectScore: level.perfectScore } - ); - } ); - const selectLevelButtonsHBox = new HBox( { spacing: 50, children: levelSelectButtons } ); - selectLevelButtonsHBox.top = chooseLevelTitle.bottom + 15; - selectLevelButtonsHBox.centerX = chooseLevelTitle.centerX; - this.addChild( selectLevelButtonsHBox ); - - // add timer and sound buttons - const soundAndTimerButtons = new VBox( { - spacing: 5, - children: [ - new TimerToggleButton( ArithmeticGlobals.timerEnabledProperty ) - ], - right: layoutBounds.maxX * 0.08, - bottom: layoutBounds.maxY * 0.95 - } ); - this.addChild( soundAndTimerButtons ); - - // add reset all button - const resetAllButton = new ResetAllButton( { - listener: function() {model.reset(); }, - right: layoutBounds.maxX * 0.98, - bottom: layoutBounds.maxY * 0.95 - } ); - this.addChild( resetAllButton ); - - // pass options through to superclass - this.mutate( options ); - } - - arithmetic.register( 'LevelSelectionNode', LevelSelectionNode ); - - return inherit( Node, LevelSelectionNode ); -} ); + } + ); + } ); + const selectLevelButtonsHBox = new HBox( { spacing: 50, children: levelSelectButtons } ); + selectLevelButtonsHBox.top = chooseLevelTitle.bottom + 15; + selectLevelButtonsHBox.centerX = chooseLevelTitle.centerX; + this.addChild( selectLevelButtonsHBox ); + + // add timer and sound buttons + const soundAndTimerButtons = new VBox( { + spacing: 5, + children: [ + new TimerToggleButton( ArithmeticGlobals.timerEnabledProperty ) + ], + right: layoutBounds.maxX * 0.08, + bottom: layoutBounds.maxY * 0.95 + } ); + this.addChild( soundAndTimerButtons ); + + // add reset all button + const resetAllButton = new ResetAllButton( { + listener: function() {model.reset(); }, + right: layoutBounds.maxX * 0.98, + bottom: layoutBounds.maxY * 0.95 + } ); + this.addChild( resetAllButton ); + + // pass options through to superclass + this.mutate( options ); +} + +arithmetic.register( 'LevelSelectionNode', LevelSelectionNode ); + +inherit( Node, LevelSelectionNode ); +export default LevelSelectionNode; \ No newline at end of file diff --git a/js/common/view/ScoreboardNode.js b/js/common/view/ScoreboardNode.js index 687ef1f0..0fb7efc5 100644 --- a/js/common/view/ScoreboardNode.js +++ b/js/common/view/ScoreboardNode.js @@ -6,124 +6,122 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const GameTimer = require( 'VEGAS/GameTimer' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Panel = require( 'SUN/Panel' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const RefreshButton = require( 'SCENERY_PHET/buttons/RefreshButton' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Text = require( 'SCENERY/nodes/Text' ); - const VBox = require( 'SCENERY/nodes/VBox' ); - - // strings - const labelScorePatternString = require( 'string!VEGAS/label.scorePattern' ); - const labelTimeString = require( 'string!VEGAS/label.time' ); - const patternLevel0LevelNumberString = require( 'string!ARITHMETIC/pattern.level.0levelNumber' ); - - // constants - const FONT = new PhetFont( { size: 18 } ); - const FONT_BOLD = new PhetFont( { size: 18, weight: 'bold' } ); - const PANEL_OPTIONS = { - fill: '#dddddd', - lineWidth: 0.5, - xMargin: 23, - yMargin: 23, - cornerRadius: 5, - align: 'center' + +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import RefreshButton from '../../../../scenery-phet/js/buttons/RefreshButton.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import Panel from '../../../../sun/js/Panel.js'; +import GameTimer from '../../../../vegas/js/GameTimer.js'; +import vegasStrings from '../../../../vegas/js/vegas-strings.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../model/GameState.js'; + +const labelScorePatternString = vegasStrings.label.scorePattern; +const labelTimeString = vegasStrings.label.time; +const patternLevel0LevelNumberString = arithmeticStrings.pattern.level[ '0levelNumber' ]; + +// constants +const FONT = new PhetFont( { size: 18 } ); +const FONT_BOLD = new PhetFont( { size: 18, weight: 'bold' } ); +const PANEL_OPTIONS = { + fill: '#dddddd', + lineWidth: 0.5, + xMargin: 23, + yMargin: 23, + cornerRadius: 5, + align: 'center' +}; +const SPACING = 16; + +/** + * @param {Property} levelNumberProperty - property for level displaying label. + * @param {Property} stateProperty - State of game property. + * @param {Array.} levelModels - Array of properties for score counter component. + * @param {Property} timerEnabledProperty - Time enabling flag. + * @param {Function} refreshLevelCallback - Callback listener for refresh level button. + * @param {Object} [options] - optional parameters that control the appearance and behavior of the panel + * @constructor + */ +function ScoreboardNode( levelNumberProperty, stateProperty, levelModels, timerEnabledProperty, refreshLevelCallback, options ) { + + options = merge( { + title: '' + }, options ); + const levelText = new Text( StringUtils.format( patternLevel0LevelNumberString, '' ), { font: FONT_BOLD } ); + const scoreText = new Text( StringUtils.format( labelScorePatternString, '0' ), { font: FONT } ); + const timeText = new Text( StringUtils.format( labelTimeString, GameTimer.formatTime( 0 ) ), { font: FONT } ); + + const panelOptions = merge( {}, PANEL_OPTIONS, options ); + + Node.call( this ); + + // add control panel components + const vBox = new VBox( { + spacing: SPACING, + children: [ + new Text( options.title, { font: FONT_BOLD } ), + levelText, + scoreText, + timeText, + // add refresh button + new RefreshButton( { + iconScale: 0.6, + xMargin: 14, + yMargin: 7, + listener: refreshLevelCallback + } ) + ] + } ); + this.addChild( new Panel( vBox, panelOptions ) ); + + // add observers + const updateScore = function( score ) { + scoreText.text = StringUtils.format( labelScorePatternString, score.toString() ); }; - const SPACING = 16; - - /** - * @param {Property} levelNumberProperty - property for level displaying label. - * @param {Property} stateProperty - State of game property. - * @param {Array.} levelModels - Array of properties for score counter component. - * @param {Property} timerEnabledProperty - Time enabling flag. - * @param {Function} refreshLevelCallback - Callback listener for refresh level button. - * @param {Object} [options] - optional parameters that control the appearance and behavior of the panel - * @constructor - */ - function ScoreboardNode( levelNumberProperty, stateProperty, levelModels, timerEnabledProperty, refreshLevelCallback, options ) { - - options = merge( { - title: '' - }, options ); - const levelText = new Text( StringUtils.format( patternLevel0LevelNumberString, '' ), { font: FONT_BOLD } ); - const scoreText = new Text( StringUtils.format( labelScorePatternString, '0' ), { font: FONT } ); - const timeText = new Text( StringUtils.format( labelTimeString, GameTimer.formatTime( 0 ) ), { font: FONT } ); - - const panelOptions = merge( {}, PANEL_OPTIONS, options ); - - Node.call( this ); - - // add control panel components - const vBox = new VBox( { - spacing: SPACING, - children: [ - new Text( options.title, { font: FONT_BOLD } ), - levelText, - scoreText, - timeText, - // add refresh button - new RefreshButton( { - iconScale: 0.6, - xMargin: 14, - yMargin: 7, - listener: refreshLevelCallback - } ) - ] - } ); - this.addChild( new Panel( vBox, panelOptions ) ); - - // add observers - const updateScore = function( score ) { - scoreText.text = StringUtils.format( labelScorePatternString, score.toString() ); - }; - - const updateTime = function( time ) { - timeText.text = StringUtils.format( labelTimeString, GameTimer.formatTime( time ) ); - }; - - levelNumberProperty.lazyLink( function( levelNew, levelPrevious ) { - if ( levelNew !== null ) { - levelText.text = StringUtils.format( patternLevel0LevelNumberString, ( levelNew + 1 ).toString() ); - } - else { - levelText.text = ''; - } - - // unlink observers for previous level - if ( levelModels[ levelPrevious ] ) { - levelModels[ levelPrevious ].currentScoreProperty.unlink( updateScore ); - levelModels[ levelPrevious ].gameTimer.elapsedTimeProperty.unlink( updateTime ); - } - - // link observers for new level - if ( stateProperty.value === GameState.SELECTING_LEVEL && levelModels[ levelNew ] ) { - levelModels[ levelNew ].currentScoreProperty.link( updateScore ); - levelModels[ levelNew ].gameTimer.elapsedTimeProperty.link( updateTime ); - } - } ); - - // add/remove time readout - timerEnabledProperty.link( function( isTimerEnabled ) { - if ( isTimerEnabled ) { - vBox.insertChild( 2, timeText ); // 2 - index of initial place for time - } - else { - vBox.removeChild( timeText ); - } - } ); - } - - arithmetic.register( 'ScoreboardNode', ScoreboardNode ); - - return inherit( Node, ScoreboardNode ); -} ); + + const updateTime = function( time ) { + timeText.text = StringUtils.format( labelTimeString, GameTimer.formatTime( time ) ); + }; + + levelNumberProperty.lazyLink( function( levelNew, levelPrevious ) { + if ( levelNew !== null ) { + levelText.text = StringUtils.format( patternLevel0LevelNumberString, ( levelNew + 1 ).toString() ); + } + else { + levelText.text = ''; + } + + // unlink observers for previous level + if ( levelModels[ levelPrevious ] ) { + levelModels[ levelPrevious ].currentScoreProperty.unlink( updateScore ); + levelModels[ levelPrevious ].gameTimer.elapsedTimeProperty.unlink( updateTime ); + } + + // link observers for new level + if ( stateProperty.value === GameState.SELECTING_LEVEL && levelModels[ levelNew ] ) { + levelModels[ levelNew ].currentScoreProperty.link( updateScore ); + levelModels[ levelNew ].gameTimer.elapsedTimeProperty.link( updateTime ); + } + } ); + + // add/remove time readout + timerEnabledProperty.link( function( isTimerEnabled ) { + if ( isTimerEnabled ) { + vBox.insertChild( 2, timeText ); // 2 - index of initial place for time + } + else { + vBox.removeChild( timeText ); + } + } ); +} + +arithmetic.register( 'ScoreboardNode', ScoreboardNode ); + +inherit( Node, ScoreboardNode ); +export default ScoreboardNode; \ No newline at end of file diff --git a/js/common/view/WorkspaceNode.js b/js/common/view/WorkspaceNode.js index 0db10bb8..6fdabcfc 100644 --- a/js/common/view/WorkspaceNode.js +++ b/js/common/view/WorkspaceNode.js @@ -7,228 +7,225 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticFaceWithPointsNode = require( 'ARITHMETIC/common/view/ArithmeticFaceWithPointsNode' ); - const ArithmeticGlobals = require( 'ARITHMETIC/common/ArithmeticGlobals' ); - const BackButton = require( 'SCENERY_PHET/buttons/BackButton' ); - const Dimension2 = require( 'DOT/Dimension2' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LevelCompletedNodeWrapper = require( 'ARITHMETIC/common/view/LevelCompletedNodeWrapper' ); - const merge = require( 'PHET_CORE/merge' ); - const Node = require( 'SCENERY/nodes/Node' ); - const NumberKeypad = require( 'SCENERY_PHET/NumberKeypad' ); - const PhetColorScheme = require( 'SCENERY_PHET/PhetColorScheme' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const ScoreboardNode = require( 'ARITHMETIC/common/view/ScoreboardNode' ); - const TextPushButton = require( 'SUN/buttons/TextPushButton' ); - - // constants - const BACK_BUTTON_BASE_COLOR = PhetColorScheme.BUTTON_YELLOW; // base color of back button - const BACK_BUTTON_MARGIN = new Dimension2( 20, 10 ); // margin of background of back button - const BUTTON_BASE_COLOR = PhetColorScheme.BUTTON_YELLOW; - const BUTTON_FONT = new PhetFont( { size: 20 } ); - - // strings - const checkString = require( 'string!ARITHMETIC/check' ); - const tryAgainString = require( 'string!ARITHMETIC/tryAgain' ); - - /** - * @param {ArithmeticModel} model - main model for screen. - * @param {Node} multiplicationTableNode - Multiplication table node for given screen. This can be (and generally is) - * different depending on the flavor of the game, i.e. multiplication, division, or factoring. This is why it is - * passed in rather than locally created. - * @param {Node} equationNode - Equation node for given screen. This can be (and generally is) different depending - * on the flavor of the game, i.e. multiplication, division, or factoring. This is why it is passed in rather than - * locally created. - * @param {Bounds2} layoutBounds - Bounds of main screen. Necessary for placing components. - * @param {Object} [options] - * - * @constructor - */ - function WorkspaceNode( model, multiplicationTableNode, equationNode, layoutBounds, options ) { - Node.call( this ); - - options = merge( { - scoreboardTitle: '', - showKeypad: true - }, options ); - - // add button for returning to the level select screen - const backButton = new BackButton( { - baseColor: BACK_BUTTON_BASE_COLOR, - xMargin: BACK_BUTTON_MARGIN.width, - yMargin: BACK_BUTTON_MARGIN.height, - scale: 0.75, // empirically determined - left: layoutBounds.maxX * 0.02, - top: layoutBounds.maxY * 0.02, - listener: function() { - model.returnToLevelSelectScreen(); - } - } ); - this.addChild( backButton ); +import Dimension2 from '../../../../dot/js/Dimension2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import BackButton from '../../../../scenery-phet/js/buttons/BackButton.js'; +import NumberKeypad from '../../../../scenery-phet/js/NumberKeypad.js'; +import PhetColorScheme from '../../../../scenery-phet/js/PhetColorScheme.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import TextPushButton from '../../../../sun/js/buttons/TextPushButton.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticGlobals from '../ArithmeticGlobals.js'; +import GameState from '../model/GameState.js'; +import ArithmeticFaceWithPointsNode from './ArithmeticFaceWithPointsNode.js'; +import LevelCompletedNodeWrapper from './LevelCompletedNodeWrapper.js'; +import ScoreboardNode from './ScoreboardNode.js'; + +// constants +const BACK_BUTTON_BASE_COLOR = PhetColorScheme.BUTTON_YELLOW; // base color of back button +const BACK_BUTTON_MARGIN = new Dimension2( 20, 10 ); // margin of background of back button +const BUTTON_BASE_COLOR = PhetColorScheme.BUTTON_YELLOW; +const BUTTON_FONT = new PhetFont( { size: 20 } ); + +const checkString = arithmeticStrings.check; +const tryAgainString = arithmeticStrings.tryAgain; - // add multiplication table - multiplicationTableNode.mutate( { top: layoutBounds.maxY * 0.02, centerX: layoutBounds.width * 0.43 } ); - this.addChild( multiplicationTableNode ); - - // clear the multiplication table node on a refresh event. - model.refreshEmitter.addListener( function() { - multiplicationTableNode.refreshLevel( model.levelNumberProperty.get() ); +/** + * @param {ArithmeticModel} model - main model for screen. + * @param {Node} multiplicationTableNode - Multiplication table node for given screen. This can be (and generally is) + * different depending on the flavor of the game, i.e. multiplication, division, or factoring. This is why it is + * passed in rather than locally created. + * @param {Node} equationNode - Equation node for given screen. This can be (and generally is) different depending + * on the flavor of the game, i.e. multiplication, division, or factoring. This is why it is passed in rather than + * locally created. + * @param {Bounds2} layoutBounds - Bounds of main screen. Necessary for placing components. + * @param {Object} [options] + * + * @constructor + */ +function WorkspaceNode( model, multiplicationTableNode, equationNode, layoutBounds, options ) { + Node.call( this ); + + options = merge( { + scoreboardTitle: '', + showKeypad: true + }, options ); + + // add button for returning to the level select screen + const backButton = new BackButton( { + baseColor: BACK_BUTTON_BASE_COLOR, + xMargin: BACK_BUTTON_MARGIN.width, + yMargin: BACK_BUTTON_MARGIN.height, + scale: 0.75, // empirically determined + left: layoutBounds.maxX * 0.02, + top: layoutBounds.maxY * 0.02, + listener: function() { + model.returnToLevelSelectScreen(); + } + } ); + + this.addChild( backButton ); + + // add multiplication table + multiplicationTableNode.mutate( { top: layoutBounds.maxY * 0.02, centerX: layoutBounds.width * 0.43 } ); + this.addChild( multiplicationTableNode ); + + // clear the multiplication table node on a refresh event. + model.refreshEmitter.addListener( function() { + multiplicationTableNode.refreshLevel( model.levelNumberProperty.get() ); + } ); + + // add equation + equationNode.bottom = layoutBounds.maxY * 0.87; + equationNode.centerX = layoutBounds.width * 0.45; + this.addChild( equationNode ); + + // hide the equation node when the level has been completed + model.stateProperty.link( function( newGameState, oldGameState ) { + + // Hide the equation node when the level has been completed and when returning to the level selection screen + // after the level is complete. + equationNode.visible = !( newGameState === GameState.LEVEL_COMPLETED || + ( oldGameState === GameState.LEVEL_COMPLETED && + newGameState === GameState.SELECTING_LEVEL ) ); + } ); + + // define the width of the control panel so that it fits between the table and the bounds with some margin + const controlPanelWidth = layoutBounds.maxX - multiplicationTableNode.right - 60; + + // add control panel + const controlPanelNode = new ScoreboardNode( + model.levelNumberProperty, + model.stateProperty, + model.levelModels, + ArithmeticGlobals.timerEnabledProperty, + function() { + model.refreshLevel(); + }, + { + title: options.scoreboardTitle, + minWidth: controlPanelWidth, + maxWidth: controlPanelWidth, + centerX: ( multiplicationTableNode.right + layoutBounds.maxX ) / 2, + top: backButton.top + } + ); + controlPanelNode.top = multiplicationTableNode.top; + this.addChild( controlPanelNode ); + + // set up some variables needed for positioning the buttons + const buttonYCenter = ( equationNode.bottom + layoutBounds.maxY ) / 2 - 5; // tweaked a bit empirically + const maxButtonWidth = layoutBounds.maxX - multiplicationTableNode.bounds.maxX; + + // add keypad if necessary + if ( options.showKeypad ) { + // create and add the keypad + const keypad = new NumberKeypad( { + valueStringProperty: model.inputProperty, + validateKey: NumberKeypad.validateMaxDigits( { maxDigits: 3 } ), + centerX: controlPanelNode.centerX, + bottom: layoutBounds.maxY * 0.85 } ); + this.addChild( keypad ); - // add equation - equationNode.bottom = layoutBounds.maxY * 0.87; - equationNode.centerX = layoutBounds.width * 0.45; - this.addChild( equationNode ); - - // hide the equation node when the level has been completed + // Update the keypad state based on the game state. model.stateProperty.link( function( newGameState, oldGameState ) { - // Hide the equation node when the level has been completed and when returning to the level selection screen - // after the level is complete. - equationNode.visible = !( newGameState === GameState.LEVEL_COMPLETED || - ( oldGameState === GameState.LEVEL_COMPLETED && - newGameState === GameState.SELECTING_LEVEL ) ); - } ); - - // define the width of the control panel so that it fits between the table and the bounds with some margin - const controlPanelWidth = layoutBounds.maxX - multiplicationTableNode.right - 60; - - // add control panel - const controlPanelNode = new ScoreboardNode( - model.levelNumberProperty, - model.stateProperty, - model.levelModels, - ArithmeticGlobals.timerEnabledProperty, - function() { - model.refreshLevel(); - }, - { - title: options.scoreboardTitle, - minWidth: controlPanelWidth, - maxWidth: controlPanelWidth, - centerX: ( multiplicationTableNode.right + layoutBounds.maxX ) / 2, - top: backButton.top + if ( newGameState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + // Arm the keypad for auto-clear when showing incorrect feedback. This is part of the feature where the user + // can simply start entering values again if they got the wrong answer initially. + keypad.clearOnNextKeyPress = true; } - ); - controlPanelNode.top = multiplicationTableNode.top; - this.addChild( controlPanelNode ); - - // set up some variables needed for positioning the buttons - const buttonYCenter = ( equationNode.bottom + layoutBounds.maxY ) / 2 - 5; // tweaked a bit empirically - const maxButtonWidth = layoutBounds.maxX - multiplicationTableNode.bounds.maxX; - - // add keypad if necessary - if ( options.showKeypad ) { - // create and add the keypad - const keypad = new NumberKeypad( { - valueStringProperty: model.inputProperty, - validateKey: NumberKeypad.validateMaxDigits( { maxDigits: 3 } ), - centerX: controlPanelNode.centerX, - bottom: layoutBounds.maxY * 0.85 - } ); - this.addChild( keypad ); - - // Update the keypad state based on the game state. - model.stateProperty.link( function( newGameState, oldGameState ) { - - if ( newGameState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - // Arm the keypad for auto-clear when showing incorrect feedback. This is part of the feature where the user - // can simply start entering values again if they got the wrong answer initially. - keypad.clearOnNextKeyPress = true; - } - else if ( newGameState === GameState.AWAITING_USER_INPUT && - oldGameState !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - keypad.clear(); - } - - // Only allow the user to input digits when expecting them. We use 'pickable' here instead of 'enabled' so that - // we don't gray out the keypad, which might visually draw attention to it. - keypad.pickable = newGameState === GameState.AWAITING_USER_INPUT || - newGameState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK; - - // The keypad should be invisible once the level is completed, and should stay invisible on transition to the - // SELECTING_LEVEL state. - keypad.visible = !( newGameState === GameState.LEVEL_COMPLETED || - ( oldGameState === GameState.LEVEL_COMPLETED && - newGameState === GameState.SELECTING_LEVEL ) ); - } ); - - // add the 'Check' button, which is only used in conjunction with the keypad - const checkButton = new TextPushButton( checkString, { - font: BUTTON_FONT, - centerY: buttonYCenter, - centerX: controlPanelNode.centerX, - baseColor: BUTTON_BASE_COLOR, - maxWidth: maxButtonWidth, - listener: function() { model.fillEquation(); } - } ); - this.addChild( checkButton ); - - const updateCheckButtonState = function() { - checkButton.visible = ( model.stateProperty.get() === GameState.AWAITING_USER_INPUT ); - checkButton.enabled = model.inputProperty.get().length > 0; - }; - - // control the visibility of the 'Check' button - model.stateProperty.link( updateCheckButtonState ); - - // Monitor the string entered from the keypad and, if the user starts entering something immediately after - // receiving the feedback indicating an incorrect answer, allow them to retry the problem. - model.inputProperty.link( function( input ) { - if ( model.stateProperty.get() === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - model.retryProblem(); - } - updateCheckButtonState(); - } ); - } + else if ( newGameState === GameState.AWAITING_USER_INPUT && + oldGameState !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + keypad.clear(); + } + + // Only allow the user to input digits when expecting them. We use 'pickable' here instead of 'enabled' so that + // we don't gray out the keypad, which might visually draw attention to it. + keypad.pickable = newGameState === GameState.AWAITING_USER_INPUT || + newGameState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK; - // add smile face - this.addChild( new ArithmeticFaceWithPointsNode( model.faceModel, { - bottom: layoutBounds.maxY * 0.92, - left: layoutBounds.maxX * 0.04 - } ) ); + // The keypad should be invisible once the level is completed, and should stay invisible on transition to the + // SELECTING_LEVEL state. + keypad.visible = !( newGameState === GameState.LEVEL_COMPLETED || + ( oldGameState === GameState.LEVEL_COMPLETED && + newGameState === GameState.SELECTING_LEVEL ) ); + } ); - // add the 'try again' button - const tryAgainButton = new TextPushButton( tryAgainString, { + // add the 'Check' button, which is only used in conjunction with the keypad + const checkButton = new TextPushButton( checkString, { font: BUTTON_FONT, centerY: buttonYCenter, centerX: controlPanelNode.centerX, baseColor: BUTTON_BASE_COLOR, maxWidth: maxButtonWidth, - listener: function() { - model.inputProperty.reset(); - model.retryProblem(); - } + listener: function() { model.fillEquation(); } } ); - this.addChild( tryAgainButton ); + this.addChild( checkButton ); - // control the visibility of the 'Try Again' button - model.stateProperty.link( function( state ) { - tryAgainButton.visible = ( state === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); - } ); + const updateCheckButtonState = function() { + checkButton.visible = ( model.stateProperty.get() === GameState.AWAITING_USER_INPUT ); + checkButton.enabled = model.inputProperty.get().length > 0; + }; - // add the dialog that indicates that the level has been completed - this.addChild( new LevelCompletedNodeWrapper( - model.levelModels, - model.levelNumberProperty, - model.stateProperty, - ArithmeticGlobals.timerEnabledProperty, - function() { - model.stateProperty.set( GameState.LEVEL_COMPLETED ); - model.returnToLevelSelectScreen(); - }, - layoutBounds ) - ); - } + // control the visibility of the 'Check' button + model.stateProperty.link( updateCheckButtonState ); - arithmetic.register( 'WorkspaceNode', WorkspaceNode ); + // Monitor the string entered from the keypad and, if the user starts entering something immediately after + // receiving the feedback indicating an incorrect answer, allow them to retry the problem. + model.inputProperty.link( function( input ) { + if ( model.stateProperty.get() === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + model.retryProblem(); + } + updateCheckButtonState(); + } ); + } - return inherit( Node, WorkspaceNode ); -} ); + // add smile face + this.addChild( new ArithmeticFaceWithPointsNode( model.faceModel, { + bottom: layoutBounds.maxY * 0.92, + left: layoutBounds.maxX * 0.04 + } ) ); + + // add the 'try again' button + const tryAgainButton = new TextPushButton( tryAgainString, { + font: BUTTON_FONT, + centerY: buttonYCenter, + centerX: controlPanelNode.centerX, + baseColor: BUTTON_BASE_COLOR, + maxWidth: maxButtonWidth, + listener: function() { + model.inputProperty.reset(); + model.retryProblem(); + } + } ); + this.addChild( tryAgainButton ); + + // control the visibility of the 'Try Again' button + model.stateProperty.link( function( state ) { + tryAgainButton.visible = ( state === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); + } ); + + // add the dialog that indicates that the level has been completed + this.addChild( new LevelCompletedNodeWrapper( + model.levelModels, + model.levelNumberProperty, + model.stateProperty, + ArithmeticGlobals.timerEnabledProperty, + function() { + model.stateProperty.set( GameState.LEVEL_COMPLETED ); + model.returnToLevelSelectScreen(); + }, + layoutBounds ) + ); +} + +arithmetic.register( 'WorkspaceNode', WorkspaceNode ); + +inherit( Node, WorkspaceNode ); +export default WorkspaceNode; \ No newline at end of file diff --git a/js/common/view/table/AbstractCell.js b/js/common/view/table/AbstractCell.js index bab54412..fe6ce9e1 100644 --- a/js/common/view/table/AbstractCell.js +++ b/js/common/view/table/AbstractCell.js @@ -12,155 +12,151 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const Text = require( 'SCENERY/nodes/Text' ); - - // constants - const SMALL_FONT = new PhetFont( 17 ); - const MEDIUM_FONT = new PhetFont( 22 ); - const LARGE_FONT = new PhetFont( 30 ); - const EXAMPLE_HEIGHT_STRING = '123456789'; - const SMALL_FONT_HEIGHT = new Text( EXAMPLE_HEIGHT_STRING, { font: SMALL_FONT } ).bounds.height; - const MEDIUM_FONT_HEIGHT = new Text( EXAMPLE_HEIGHT_STRING, { font: MEDIUM_FONT } ).bounds.height; - const LARGE_FONT_HEIGHT = new Text( EXAMPLE_HEIGHT_STRING, { font: LARGE_FONT } ).bounds.height; - /** - * @param {Object} backgroundOptions - Background options for button. - * @param {Object} textOptions - Text options for button. - * @constructor - */ - function AbstractCell( backgroundOptions, textOptions ) { - Rectangle.call( this, 0, 0, backgroundOptions.width, backgroundOptions.height, merge( { - fill: 'white', - stroke: 'white', - lineWidth: 2.5 - }, backgroundOptions ) ); - - // @private - save/define text options for when the text node is created - this._textOptions = merge( { - font: chooseFont( this.bounds.height ), - fill: 'white', - centerY: this.bounds.height / 2, - initiallyVisible: true - }, textOptions ); - - // @private - define the _text variable, but create it only when needed in order to save time during startup - this._textNode = null; - - // @private - string to be displayed, used to support lazy creation of the node - this._text = ''; - - // if the text is initially visible, create the text node now, otherwise wait until it is shown - if ( this._textOptions.initiallyVisible ) { - createTextNodeIfNeeded( this ); - } +import inherit from '../../../../../phet-core/js/inherit.js'; +import merge from '../../../../../phet-core/js/merge.js'; +import PhetFont from '../../../../../scenery-phet/js/PhetFont.js'; +import Rectangle from '../../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import arithmetic from '../../../arithmetic.js'; + +// constants +const SMALL_FONT = new PhetFont( 17 ); +const MEDIUM_FONT = new PhetFont( 22 ); +const LARGE_FONT = new PhetFont( 30 ); +const EXAMPLE_HEIGHT_STRING = '123456789'; +const SMALL_FONT_HEIGHT = new Text( EXAMPLE_HEIGHT_STRING, { font: SMALL_FONT } ).bounds.height; +const MEDIUM_FONT_HEIGHT = new Text( EXAMPLE_HEIGHT_STRING, { font: MEDIUM_FONT } ).bounds.height; +const LARGE_FONT_HEIGHT = new Text( EXAMPLE_HEIGHT_STRING, { font: LARGE_FONT } ).bounds.height; + +/** + * @param {Object} backgroundOptions - Background options for button. + * @param {Object} textOptions - Text options for button. + * @constructor + */ +function AbstractCell( backgroundOptions, textOptions ) { + Rectangle.call( this, 0, 0, backgroundOptions.width, backgroundOptions.height, merge( { + fill: 'white', + stroke: 'white', + lineWidth: 2.5 + }, backgroundOptions ) ); + + // @private - save/define text options for when the text node is created + this._textOptions = merge( { + font: chooseFont( this.bounds.height ), + fill: 'white', + centerY: this.bounds.height / 2, + initiallyVisible: true + }, textOptions ); + + // @private - define the _text variable, but create it only when needed in order to save time during startup + this._textNode = null; + + // @private - string to be displayed, used to support lazy creation of the node + this._text = ''; + + // if the text is initially visible, create the text node now, otherwise wait until it is shown + if ( this._textOptions.initiallyVisible ) { + createTextNodeIfNeeded( this ); } +} + +// Convenience function for selecting appropriate font size for this cell. This is done as an optimization so that +// a new font doesn't need to be created for each cell. The sizes were empirically determined. +function chooseFont( cellHeight ) { + let font; + if ( cellHeight < 27 ) { + font = SMALL_FONT; + } + else if ( cellHeight < 35 ) { + font = MEDIUM_FONT; + } + else { + font = LARGE_FONT; + } + return font; +} - // Convenience function for selecting appropriate font size for this cell. This is done as an optimization so that - // a new font doesn't need to be created for each cell. The sizes were empirically determined. - function chooseFont( cellHeight ) { - let font; - if ( cellHeight < 27 ) { - font = SMALL_FONT; - } - else if ( cellHeight < 35 ) { - font = MEDIUM_FONT; - } - else { - font = LARGE_FONT; - } - return font; +// Convenience function that supports 'lazy' creation of the text node, which is done to minimize startup time. +function createTextNodeIfNeeded( cell ) { + + if ( cell._textNode ) { + // the text node already exists + return; } - // Convenience function that supports 'lazy' creation of the text node, which is done to minimize startup time. - function createTextNodeIfNeeded( cell ) { + cell._textNode = new Text( cell._text, cell._textOptions ); + cell._textNode.centerX = cell.bounds.width / 2; + cell.addChild( cell._textNode ); +} - if ( cell._textNode ) { - // the text node already exists - return; - } +arithmetic.register( 'AbstractCell', AbstractCell ); - cell._textNode = new Text( cell._text, cell._textOptions ); - cell._textNode.centerX = cell.bounds.width / 2; - cell.addChild( cell._textNode ); - } +export default inherit( Rectangle, AbstractCell, { + + // @public + setBackgroundFill: function( fill ) { + this.fill = fill; + }, - arithmetic.register( 'AbstractCell', AbstractCell ); - - return inherit( Rectangle, AbstractCell, { - - // @public - setBackgroundFill: function( fill ) { - this.fill = fill; - }, - - // @protected - setText: function( text ) { - this._text = text; - if ( this._textNode ) { - this._textNode.text = text; - this._textNode.centerX = this.width / 2; - } - }, - - // @public - setTextFill: function( fill ) { - createTextNodeIfNeeded( this ); - this._textNode.setFill( fill ); - }, - - // @public - showText: function() { - createTextNodeIfNeeded( this ); - this._textNode.visible = true; - }, - - // @public - hideText: function() { - if ( this._textNode ) { - this._textNode.visible = false; - } - }, - - /** - * Get the text string contained in this cell (not the text node). - * @public - * @returns {string} - */ - getTextString: function() { - return this._text; - }, - - // @public - isTextVisible: function() { - return this._textNode ? this._textNode.visible : false; - }, - - // @public - getTextHeight: function() { - let height; - switch( this._textOptions.font ) { - case SMALL_FONT: - height = SMALL_FONT_HEIGHT; - break; - case MEDIUM_FONT: - height = MEDIUM_FONT_HEIGHT; - break; - case LARGE_FONT: - height = LARGE_FONT_HEIGHT; - break; - default: - assert && assert( false, 'unrecognized font' ); - } - return height; + // @protected + setText: function( text ) { + this._text = text; + if ( this._textNode ) { + this._textNode.text = text; + this._textNode.centerX = this.width / 2; + } + }, + + // @public + setTextFill: function( fill ) { + createTextNodeIfNeeded( this ); + this._textNode.setFill( fill ); + }, + + // @public + showText: function() { + createTextNodeIfNeeded( this ); + this._textNode.visible = true; + }, + + // @public + hideText: function() { + if ( this._textNode ) { + this._textNode.visible = false; } - } ); -} ); + }, + + /** + * Get the text string contained in this cell (not the text node). + * @public + * @returns {string} + */ + getTextString: function() { + return this._text; + }, + + // @public + isTextVisible: function() { + return this._textNode ? this._textNode.visible : false; + }, + + // @public + getTextHeight: function() { + let height; + switch( this._textOptions.font ) { + case SMALL_FONT: + height = SMALL_FONT_HEIGHT; + break; + case MEDIUM_FONT: + height = MEDIUM_FONT_HEIGHT; + break; + case LARGE_FONT: + height = LARGE_FONT_HEIGHT; + break; + default: + assert && assert( false, 'unrecognized font' ); + } + return height; + } +} ); \ No newline at end of file diff --git a/js/common/view/table/MultiplicationTableBodyCell.js b/js/common/view/table/MultiplicationTableBodyCell.js index 58867822..19682320 100644 --- a/js/common/view/table/MultiplicationTableBodyCell.js +++ b/js/common/view/table/MultiplicationTableBodyCell.js @@ -7,52 +7,47 @@ * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const AbstractCell = require( 'ARITHMETIC/common/view/table/AbstractCell' ); - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - - // constants - const HOVER_COLOR = 'rgb(238,253,77)'; - const NORMAL_COLOR = 'rgb(50,70,255)'; - const SELECT_COLOR = 'rgb(77,0,153)'; - - /** - * @param {Text} contentText - Text label for button. - * @param {Object} backgroundOptions - Background options for button. - * @constructor - */ - function MultiplicationTableBodyCell( contentText, backgroundOptions ) { - backgroundOptions = merge( { - fill: NORMAL_COLOR - }, backgroundOptions ); - AbstractCell.call( this, backgroundOptions, { initiallyVisible: false } ); - - this.setText( contentText ); - } +import inherit from '../../../../../phet-core/js/inherit.js'; +import merge from '../../../../../phet-core/js/merge.js'; +import arithmetic from '../../../arithmetic.js'; +import AbstractCell from './AbstractCell.js'; + +// constants +const HOVER_COLOR = 'rgb(238,253,77)'; +const NORMAL_COLOR = 'rgb(50,70,255)'; +const SELECT_COLOR = 'rgb(77,0,153)'; - arithmetic.register( 'MultiplicationTableBodyCell', MultiplicationTableBodyCell ); +/** + * @param {Text} contentText - Text label for button. + * @param {Object} backgroundOptions - Background options for button. + * @constructor + */ +function MultiplicationTableBodyCell( contentText, backgroundOptions ) { + backgroundOptions = merge( { + fill: NORMAL_COLOR + }, backgroundOptions ); + AbstractCell.call( this, backgroundOptions, { initiallyVisible: false } ); - return inherit( AbstractCell, MultiplicationTableBodyCell, { + this.setText( contentText ); +} - // @public - set cell into the state that indicates that the user is hovering over it - setHover: function() { - this.setBackgroundFill( HOVER_COLOR ); - }, +arithmetic.register( 'MultiplicationTableBodyCell', MultiplicationTableBodyCell ); - // @public - set cell to normal, default appearance state - setNormal: function() { - this.setBackgroundFill( NORMAL_COLOR ); - }, +export default inherit( AbstractCell, MultiplicationTableBodyCell, { - // @public - set cell to the selected state - setSelected: function() { - this.setBackgroundFill( SELECT_COLOR ); - } + // @public - set cell into the state that indicates that the user is hovering over it + setHover: function() { + this.setBackgroundFill( HOVER_COLOR ); + }, + + // @public - set cell to normal, default appearance state + setNormal: function() { + this.setBackgroundFill( NORMAL_COLOR ); + }, + + // @public - set cell to the selected state + setSelected: function() { + this.setBackgroundFill( SELECT_COLOR ); + } - } ); -} ); +} ); \ No newline at end of file diff --git a/js/common/view/table/MultiplicationTableHeaderCell.js b/js/common/view/table/MultiplicationTableHeaderCell.js index 0cdb7364..892a0919 100644 --- a/js/common/view/table/MultiplicationTableHeaderCell.js +++ b/js/common/view/table/MultiplicationTableHeaderCell.js @@ -6,51 +6,46 @@ * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - - // modules - const AbstractCell = require( 'ARITHMETIC/common/view/table/AbstractCell' ); - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - - // constants - const NORMAL_COLOR_BACKGROUND = 'rgb(220,60,33)'; // background normal color - const SELECT_COLOR_BACKGROUND = 'rgb(0,0,128)'; // background select color - const NORMAL_COLOR_TEXT = 'white'; // text normal color - const SELECT_COLOR_TEXT = 'rgb(255,253,56)'; // text select color - - /** - * @param {Text} contentText - Text label for button. - * @param {Object} backgroundOptions - Background options for button. - * @param {Object} textOptions - Text options for button. - * - * @constructor - */ - function MultiplicationTableHeaderCell( contentText, backgroundOptions, textOptions ) { - backgroundOptions = merge( { - fill: NORMAL_COLOR_BACKGROUND - }, backgroundOptions ); - AbstractCell.call( this, backgroundOptions, textOptions ); - - this.setText( contentText ); - } +import inherit from '../../../../../phet-core/js/inherit.js'; +import merge from '../../../../../phet-core/js/merge.js'; +import arithmetic from '../../../arithmetic.js'; +import AbstractCell from './AbstractCell.js'; + +// constants +const NORMAL_COLOR_BACKGROUND = 'rgb(220,60,33)'; // background normal color +const SELECT_COLOR_BACKGROUND = 'rgb(0,0,128)'; // background select color +const NORMAL_COLOR_TEXT = 'white'; // text normal color +const SELECT_COLOR_TEXT = 'rgb(255,253,56)'; // text select color + +/** + * @param {Text} contentText - Text label for button. + * @param {Object} backgroundOptions - Background options for button. + * @param {Object} textOptions - Text options for button. + * + * @constructor + */ +function MultiplicationTableHeaderCell( contentText, backgroundOptions, textOptions ) { + backgroundOptions = merge( { + fill: NORMAL_COLOR_BACKGROUND + }, backgroundOptions ); + AbstractCell.call( this, backgroundOptions, textOptions ); - arithmetic.register( 'MultiplicationTableHeaderCell', MultiplicationTableHeaderCell ); + this.setText( contentText ); +} - return inherit( AbstractCell, MultiplicationTableHeaderCell, { +arithmetic.register( 'MultiplicationTableHeaderCell', MultiplicationTableHeaderCell ); - // @public - setSelected: function() { - this.setBackgroundFill( SELECT_COLOR_BACKGROUND ); - this.setTextFill( SELECT_COLOR_TEXT ); - }, +export default inherit( AbstractCell, MultiplicationTableHeaderCell, { - // @public - setNormal: function() { - this.setBackgroundFill( NORMAL_COLOR_BACKGROUND ); - this.setTextFill( NORMAL_COLOR_TEXT ); - } - } ); -} ); + // @public + setSelected: function() { + this.setBackgroundFill( SELECT_COLOR_BACKGROUND ); + this.setTextFill( SELECT_COLOR_TEXT ); + }, + + // @public + setNormal: function() { + this.setBackgroundFill( NORMAL_COLOR_BACKGROUND ); + this.setTextFill( NORMAL_COLOR_TEXT ); + } +} ); \ No newline at end of file diff --git a/js/common/view/table/MultiplicationTableNode.js b/js/common/view/table/MultiplicationTableNode.js index 113cd65e..532f3601 100644 --- a/js/common/view/table/MultiplicationTableNode.js +++ b/js/common/view/table/MultiplicationTableNode.js @@ -10,314 +10,310 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const Animation = require( 'TWIXT/Animation' ); - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const Dimension2 = require( 'DOT/Dimension2' ); - const Easing = require( 'TWIXT/Easing' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const MultiplicationTableBodyCell = require( 'ARITHMETIC/common/view/table/MultiplicationTableBodyCell' ); - const MultiplicationTableHeaderCell = require( 'ARITHMETIC/common/view/table/MultiplicationTableHeaderCell' ); - const Node = require( 'SCENERY/nodes/Node' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const ScreenView = require( 'JOIST/ScreenView' ); - const Text = require( 'SCENERY/nodes/Text' ); - const Utils = require( 'DOT/Utils' ); - const Vector2 = require( 'DOT/Vector2' ); - - // constants - const TABLE_SIZE = new Dimension2( 434, 320 ); // table size in screen coordinates, empirically determined - const ANSWER_ANIMATION_TIME = 0.8; // in seconds - - // Starting point for the animation of the answer. It is not ideal that this is a constant, because it means that if - // the layout changes, this will need to be manually updated, but it's tricky to get it coordinated with the layout - // in some other way. - const ANSWER_ANIMATION_ORIGIN = new Vector2( 370, 380 ); - /** - * @param {Property.} levelNumberProperty - level property. - * @param {Property.} stateProperty - current state property - * @param {Array.} levelModels - array of models for each level - * @param {boolean} animateAnswer - flag that controls whether answer appears to fly into the cell or just appears - * @constructor - */ - function MultiplicationTableNode( levelNumberProperty, stateProperty, levelModels, animateAnswer ) { - const self = this; - Node.call( this ); +import Dimension2 from '../../../../../dot/js/Dimension2.js'; +import Utils from '../../../../../dot/js/Utils.js'; +import Vector2 from '../../../../../dot/js/Vector2.js'; +import ScreenView from '../../../../../joist/js/ScreenView.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import MathSymbols from '../../../../../scenery-phet/js/MathSymbols.js'; +import PhetFont from '../../../../../scenery-phet/js/PhetFont.js'; +import Node from '../../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import Animation from '../../../../../twixt/js/Animation.js'; +import Easing from '../../../../../twixt/js/Easing.js'; +import arithmetic from '../../../arithmetic.js'; +import ArithmeticConstants from '../../ArithmeticConstants.js'; +import GameState from '../../model/GameState.js'; +import MultiplicationTableBodyCell from './MultiplicationTableBodyCell.js'; +import MultiplicationTableHeaderCell from './MultiplicationTableHeaderCell.js'; + +// constants +const TABLE_SIZE = new Dimension2( 434, 320 ); // table size in screen coordinates, empirically determined +const ANSWER_ANIMATION_TIME = 0.8; // in seconds + +// Starting point for the animation of the answer. It is not ideal that this is a constant, because it means that if +// the layout changes, this will need to be manually updated, but it's tricky to get it coordinated with the layout +// in some other way. +const ANSWER_ANIMATION_ORIGIN = new Vector2( 370, 380 ); - this.levelNumberProperty = levelNumberProperty; // @protected - needs to be available to sub-classes - this.viewForLevel = new Array( levelModels.length ); // @private - array with views for each level +/** + * @param {Property.} levelNumberProperty - level property. + * @param {Property.} stateProperty - current state property + * @param {Array.} levelModels - array of models for each level + * @param {boolean} animateAnswer - flag that controls whether answer appears to fly into the cell or just appears + * @constructor + */ +function MultiplicationTableNode( levelNumberProperty, stateProperty, levelModels, animateAnswer ) { + const self = this; + Node.call( this ); - // @private - three-dimensional array of the cells, indexed by [levelNumber][multiplicand][multiplier] - this.cells = new Array( levelModels.length ); + this.levelNumberProperty = levelNumberProperty; // @protected - needs to be available to sub-classes + this.viewForLevel = new Array( levelModels.length ); // @private - array with views for each level - // add stroke for all multiplication table views - const backgroundRect = new Rectangle( 0, 0, 0, 0, { - fill: 'white', - cursor: 'pointer' // this is done so that the cursor doesn't change when moving between cells - } ); - this.addChild( backgroundRect ); - - // create view of multiplication table for each of the levels - levelModels.forEach( function( level, levelIndex ) { - const tableSize = level.tableSize; - const cellOptions = { - lineWidth: Math.max( Math.ceil( ( TABLE_SIZE.width / ( tableSize + 1 ) ) / 40 ), 2 ), - width: TABLE_SIZE.width / ( tableSize + 1 ), - height: TABLE_SIZE.height / ( tableSize + 1 ) - }; - const levelRootNode = new Node( { visible: false } ); // root node for a single level - let row; - let column; - - // init store for cells - self.cells[ levelIndex ] = new Array( tableSize + 1 ); - - let cell; - let cellTop = 0; - let cellLeft = 0; - - // create the table row by row - for ( row = 0; row <= tableSize; row++ ) { - self.cells[ levelIndex ][ row ] = new Array( tableSize + 1 ); - - // first row - if ( row === 0 ) { - for ( column = 0; column <= tableSize; column++ ) { - - // first cell is the multiplier operator, others are multipliers - if ( column === 0 ) { - cell = new MultiplicationTableHeaderCell( MathSymbols.TIMES, cellOptions, { - - // specify font and size, equation empirically determined, makes font smaller for larger tables - font: new PhetFont( { size: Utils.roundSymmetric( cellOptions.height * 0.85 ) } ) - } ); - } - else { - cell = new MultiplicationTableHeaderCell( column.toString(), cellOptions ); - } - cell.top = cellTop; - cell.left = cellLeft; - cellLeft += cellOptions.width; - levelRootNode.addChild( cell ); - self.cells[ levelIndex ][ row ][ column ] = cell; + // @private - three-dimensional array of the cells, indexed by [levelNumber][multiplicand][multiplier] + this.cells = new Array( levelModels.length ); + + // add stroke for all multiplication table views + const backgroundRect = new Rectangle( 0, 0, 0, 0, { + fill: 'white', + cursor: 'pointer' // this is done so that the cursor doesn't change when moving between cells + } ); + this.addChild( backgroundRect ); + + // create view of multiplication table for each of the levels + levelModels.forEach( function( level, levelIndex ) { + const tableSize = level.tableSize; + const cellOptions = { + lineWidth: Math.max( Math.ceil( ( TABLE_SIZE.width / ( tableSize + 1 ) ) / 40 ), 2 ), + width: TABLE_SIZE.width / ( tableSize + 1 ), + height: TABLE_SIZE.height / ( tableSize + 1 ) + }; + const levelRootNode = new Node( { visible: false } ); // root node for a single level + let row; + let column; + + // init store for cells + self.cells[ levelIndex ] = new Array( tableSize + 1 ); + + let cell; + let cellTop = 0; + let cellLeft = 0; + + // create the table row by row + for ( row = 0; row <= tableSize; row++ ) { + self.cells[ levelIndex ][ row ] = new Array( tableSize + 1 ); + + // first row + if ( row === 0 ) { + for ( column = 0; column <= tableSize; column++ ) { + + // first cell is the multiplier operator, others are multipliers + if ( column === 0 ) { + cell = new MultiplicationTableHeaderCell( MathSymbols.TIMES, cellOptions, { + + // specify font and size, equation empirically determined, makes font smaller for larger tables + font: new PhetFont( { size: Utils.roundSymmetric( cellOptions.height * 0.85 ) } ) + } ); + } + else { + cell = new MultiplicationTableHeaderCell( column.toString(), cellOptions ); } + cell.top = cellTop; + cell.left = cellLeft; + cellLeft += cellOptions.width; + levelRootNode.addChild( cell ); + self.cells[ levelIndex ][ row ][ column ] = cell; } + } - // other rows - else { - for ( column = 0; column <= tableSize; column++ ) { + // other rows + else { + for ( column = 0; column <= tableSize; column++ ) { - // first cell in each row is a multiplier, others are products - if ( column === 0 ) { - cell = new MultiplicationTableHeaderCell( row.toString(), cellOptions ); - } - else { - cell = new MultiplicationTableBodyCell( - ( row * column ).toString(), - cellOptions - ); - } - cell.top = cellTop; - cell.left = cellLeft; - cellLeft += cellOptions.width; - levelRootNode.addChild( cell ); - self.cells[ levelIndex ][ row ][ column ] = cell; + // first cell in each row is a multiplier, others are products + if ( column === 0 ) { + cell = new MultiplicationTableHeaderCell( row.toString(), cellOptions ); + } + else { + cell = new MultiplicationTableBodyCell( + ( row * column ).toString(), + cellOptions + ); } + cell.top = cellTop; + cell.left = cellLeft; + cellLeft += cellOptions.width; + levelRootNode.addChild( cell ); + self.cells[ levelIndex ][ row ][ column ] = cell; } - cellTop += cellOptions.height; - cellLeft = 0; } + cellTop += cellOptions.height; + cellLeft = 0; + } - // add view to node - self.addChild( levelRootNode ); + // add view to node + self.addChild( levelRootNode ); - // save view - self.viewForLevel[ levelIndex ] = levelRootNode; - } ); + // save view + self.viewForLevel[ levelIndex ] = levelRootNode; + } ); - // set background size - backgroundRect.setRectWidth( this.bounds.width ); - backgroundRect.setRectHeight( this.bounds.height ); + // set background size + backgroundRect.setRectWidth( this.bounds.width ); + backgroundRect.setRectHeight( this.bounds.height ); - levelNumberProperty.link( function( levelNumberCurrent, levelNumberPrev ) { + levelNumberProperty.link( function( levelNumberCurrent, levelNumberPrev ) { - // show multiplication table view for the current level - if ( self.viewForLevel[ levelNumberCurrent ] ) { - self.viewForLevel[ levelNumberCurrent ].visible = true; - } + // show multiplication table view for the current level + if ( self.viewForLevel[ levelNumberCurrent ] ) { + self.viewForLevel[ levelNumberCurrent ].visible = true; + } - // hide previous multiplication table view - if ( self.viewForLevel[ levelNumberPrev ] ) { - self.viewForLevel[ levelNumberPrev ].visible = false; - } - } ); + // hide previous multiplication table view + if ( self.viewForLevel[ levelNumberPrev ] ) { + self.viewForLevel[ levelNumberPrev ].visible = false; + } + } ); - // @private - node that will be used to animate the answer moving from the equation to the location of the cell. - this.flyingProduct = new Text( 'X', { - font: ArithmeticConstants.EQUATION_FONT_TEXT, - fill: 'white', - visible: false - } ); - this.addChild( this.flyingProduct ); - - // @private - define the animation that will move the flying product - this.flyingProductAnimation = null; - - // update the visible answers each time the user gets a correct answer - stateProperty.link( function( newState, oldState ) { - if ( newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK || oldState === GameState.SELECTING_LEVEL ) { - - const level = levelNumberProperty.value; // convenience var - const levelModel = levelModels[ level ]; // convenience var - - // make sure the appropriate cells are displaying their numerical values - for ( let multiplicand = 1; multiplicand <= levelModel.tableSize; multiplicand++ ) { - for ( let multiplier = 1; multiplier <= levelModel.tableSize; multiplier++ ) { - var cell = self.cells[ levelNumberProperty.value ][ multiplicand ][ multiplier ]; - if ( levelModel.isCellUsed( multiplicand, multiplier ) ) { - - // If the cell is marked as used but the text is not yet visible, animate the product to the cell. - if ( animateAnswer && !cell.isTextVisible() ) { - - // Animate the product moving from the equation to the appropriate cell within the table. - ( function() { - const destinationCell = cell; - self.flyingProduct.text = destinationCell.getTextString(); - self.flyingProduct.setScaleMagnitude( 1 ); - const flyingProductDestination = self.globalToLocalPoint( destinationCell.parentToGlobalPoint( destinationCell.center ) ); - - // create the animation - self.flyingProductAnimation = new Animation( { - duration: ANSWER_ANIMATION_TIME, - targets: [ - - // position - { - object: self.flyingProduct, - attribute: 'center', - from: ANSWER_ANIMATION_ORIGIN, - to: flyingProductDestination, - easing: Easing.CUBIC_IN_OUT + // @private - node that will be used to animate the answer moving from the equation to the location of the cell. + this.flyingProduct = new Text( 'X', { + font: ArithmeticConstants.EQUATION_FONT_TEXT, + fill: 'white', + visible: false + } ); + this.addChild( this.flyingProduct ); + + // @private - define the animation that will move the flying product + this.flyingProductAnimation = null; + + // update the visible answers each time the user gets a correct answer + stateProperty.link( function( newState, oldState ) { + if ( newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK || oldState === GameState.SELECTING_LEVEL ) { + + const level = levelNumberProperty.value; // convenience var + const levelModel = levelModels[ level ]; // convenience var + + // make sure the appropriate cells are displaying their numerical values + for ( let multiplicand = 1; multiplicand <= levelModel.tableSize; multiplicand++ ) { + for ( let multiplier = 1; multiplier <= levelModel.tableSize; multiplier++ ) { + var cell = self.cells[ levelNumberProperty.value ][ multiplicand ][ multiplier ]; + if ( levelModel.isCellUsed( multiplicand, multiplier ) ) { + + // If the cell is marked as used but the text is not yet visible, animate the product to the cell. + if ( animateAnswer && !cell.isTextVisible() ) { + + // Animate the product moving from the equation to the appropriate cell within the table. + ( function() { + const destinationCell = cell; + self.flyingProduct.text = destinationCell.getTextString(); + self.flyingProduct.setScaleMagnitude( 1 ); + const flyingProductDestination = self.globalToLocalPoint( destinationCell.parentToGlobalPoint( destinationCell.center ) ); + + // create the animation + self.flyingProductAnimation = new Animation( { + duration: ANSWER_ANIMATION_TIME, + targets: [ + + // position + { + object: self.flyingProduct, + attribute: 'center', + from: ANSWER_ANIMATION_ORIGIN, + to: flyingProductDestination, + easing: Easing.CUBIC_IN_OUT + }, + + // scale + { + from: 1, + to: destinationCell.getTextHeight() / self.flyingProduct.height, + setValue: function( newScale ) { + self.flyingProduct.setScaleMagnitude( newScale ); }, - - // scale - { - from: 1, - to: destinationCell.getTextHeight() / self.flyingProduct.height, - setValue: function( newScale ) { - self.flyingProduct.setScaleMagnitude( newScale ); - }, - easing: Easing.CUBIC_IN_OUT - } - ] - } ); - self.flyingProductAnimation.beginEmitter.addListener( function() { - self.flyingProduct.visible = true; - } ); - self.flyingProductAnimation.finishEmitter.addListener( function() { - destinationCell.showText(); - self.flyingProduct.visible = false; - self.flyingProductAnimation = null; - } ); - - // start the animation - self.flyingProductAnimation.start(); - } )(); - } - else { - // No animation, so just show the text. - cell.showText(); - } + easing: Easing.CUBIC_IN_OUT + } + ] + } ); + self.flyingProductAnimation.beginEmitter.addListener( function() { + self.flyingProduct.visible = true; + } ); + self.flyingProductAnimation.finishEmitter.addListener( function() { + destinationCell.showText(); + self.flyingProduct.visible = false; + self.flyingProductAnimation = null; + } ); + + // start the animation + self.flyingProductAnimation.start(); + } )(); } else { - cell.hideText(); + // No animation, so just show the text. + cell.showText(); } } + else { + cell.hideText(); + } } } - } ); - } + } + } ); +} - arithmetic.register( 'MultiplicationTableNode', MultiplicationTableNode ); +arithmetic.register( 'MultiplicationTableNode', MultiplicationTableNode ); - return inherit( Node, MultiplicationTableNode, { +export default inherit( Node, MultiplicationTableNode, { - /** - * Set all cells for given level to the default background color - * @param {number} level - * @public - */ - setCellsToDefaultColor: function( level ) { - this.cells[ level ].forEach( function( multiplicands ) { - multiplicands.forEach( function( cell ) { - cell.setNormal(); - } ); - } ); - }, - - /** - * Clear all cells for the given level, meaning that the text is hidden and the background color is set to default. - * @param {number} level - * @public - */ - clearCells: function( level ) { - this.setCellsToDefaultColor( level ); - this.cells[ level ].forEach( function( cellRow, cellRowIndex ) { - if ( cellRowIndex > 0 ) { - cellRow.forEach( function( cell, index ) { - if ( index > 0 ) { - cell.hideText(); - } - } ); - } + /** + * Set all cells for given level to the default background color + * @param {number} level + * @public + */ + setCellsToDefaultColor: function( level ) { + this.cells[ level ].forEach( function( multiplicands ) { + multiplicands.forEach( function( cell ) { + cell.setNormal(); } ); - }, - - // @public - refresh the level, may need additional behavior added by subclasses - refreshLevel: function( level ) { - if ( this.flyingProductAnimation ) { + } ); + }, - // A refresh was initiated while the animation was in progress. This is a race condition, and details about - // it can be seen in https://github.com/phetsims/arithmetic/issues/148. The animation should be cancelled. - this.flyingProductAnimation.stop(); - self.flyingProductAnimation = null; - this.flyingProduct.visible = false; + /** + * Clear all cells for the given level, meaning that the text is hidden and the background color is set to default. + * @param {number} level + * @public + */ + clearCells: function( level ) { + this.setCellsToDefaultColor( level ); + this.cells[ level ].forEach( function( cellRow, cellRowIndex ) { + if ( cellRowIndex > 0 ) { + cellRow.forEach( function( cell, index ) { + if ( index > 0 ) { + cell.hideText(); + } + } ); } - this.clearCells( level ); - }, - - /** - * Get the position, in global coordinates, of the specified cell. - * - * @param level - * @param column - * @param row - * @public - */ - whereIsCellCenter: function( level, column, row ) { - - // Find the parent screen by moving up the scene graph. - const cell = this.cells[ level ][ row ][ column ]; - let testNode = cell; - let parentScreen = null; - while ( testNode !== null ) { - if ( testNode instanceof ScreenView ) { - parentScreen = testNode; - break; - } - testNode = testNode.parents[ 0 ]; // Move up the scene graph by one level + } ); + }, + + // @public - refresh the level, may need additional behavior added by subclasses + refreshLevel: function( level ) { + if ( this.flyingProductAnimation ) { + + // A refresh was initiated while the animation was in progress. This is a race condition, and details about + // it can be seen in https://github.com/phetsims/arithmetic/issues/148. The animation should be cancelled. + this.flyingProductAnimation.stop(); + self.flyingProductAnimation = null; + this.flyingProduct.visible = false; + } + this.clearCells( level ); + }, + + /** + * Get the position, in global coordinates, of the specified cell. + * + * @param level + * @param column + * @param row + * @public + */ + whereIsCellCenter: function( level, column, row ) { + + // Find the parent screen by moving up the scene graph. + const cell = this.cells[ level ][ row ][ column ]; + let testNode = cell; + let parentScreen = null; + while ( testNode !== null ) { + if ( testNode instanceof ScreenView ) { + parentScreen = testNode; + break; } - return parentScreen.globalToLocalPoint( cell.parentToGlobalPoint( cell.center ) ); + testNode = testNode.parents[ 0 ]; // Move up the scene graph by one level } + return parentScreen.globalToLocalPoint( cell.parentToGlobalPoint( cell.center ) ); + } - } ); -} ); +} ); \ No newline at end of file diff --git a/js/divide/DivideScreen.js b/js/divide/DivideScreen.js index 5b684056..578797de 100644 --- a/js/divide/DivideScreen.js +++ b/js/divide/DivideScreen.js @@ -6,44 +6,41 @@ * Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const DivideModel = require( 'ARITHMETIC/divide/model/DivideModel' ); - const DivideScreenIconNode = require( 'ARITHMETIC/divide/view/DivideScreenIconNode' ); - const DivideView = require( 'ARITHMETIC/divide/view/DivideView' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Property = require( 'AXON/Property' ); - const Screen = require( 'JOIST/Screen' ); - const Tandem = require( 'TANDEM/Tandem' ); - - // strings - const divideString = require( 'string!ARITHMETIC/divide' ); - - /** - * @param {Object} [options] - * @constructor - */ - function DivideScreen( options ) { - - options = merge( { - name: divideString, - backgroundColorProperty: new Property( ArithmeticConstants.BACKGROUND_COLOR ), - homeScreenIcon: new DivideScreenIconNode(), - tandem: Tandem.REQUIRED - }, options ); - - Screen.call( this, - function() { return new DivideModel( options.tandem.createTandem( 'model' ) ); }, - function( model ) { return new DivideView( model ); }, - options ); - } - - arithmetic.register( 'DivideScreen', DivideScreen ); - - return inherit( Screen, DivideScreen ); -} ); \ No newline at end of file + +import Property from '../../../axon/js/Property.js'; +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import merge from '../../../phet-core/js/merge.js'; +import Tandem from '../../../tandem/js/Tandem.js'; +import arithmeticStrings from '../arithmetic-strings.js'; +import arithmetic from '../arithmetic.js'; +import ArithmeticConstants from '../common/ArithmeticConstants.js'; +import DivideModel from './model/DivideModel.js'; +import DivideScreenIconNode from './view/DivideScreenIconNode.js'; +import DivideView from './view/DivideView.js'; + +const divideString = arithmeticStrings.divide; + +/** + * @param {Object} [options] + * @constructor + */ +function DivideScreen( options ) { + + options = merge( { + name: divideString, + backgroundColorProperty: new Property( ArithmeticConstants.BACKGROUND_COLOR ), + homeScreenIcon: new DivideScreenIconNode(), + tandem: Tandem.REQUIRED + }, options ); + + Screen.call( this, + function() { return new DivideModel( options.tandem.createTandem( 'model' ) ); }, + function( model ) { return new DivideView( model ); }, + options ); +} + +arithmetic.register( 'DivideScreen', DivideScreen ); + +inherit( Screen, DivideScreen ); +export default DivideScreen; \ No newline at end of file diff --git a/js/divide/model/DivideModel.js b/js/divide/model/DivideModel.js index f7a72854..6b74e63b 100644 --- a/js/divide/model/DivideModel.js +++ b/js/divide/model/DivideModel.js @@ -7,120 +7,114 @@ * @author John Blanco */ -define( require => { - 'use strict'; +import Random from '../../../../dot/js/Random.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import soundManager from '../../../../tambo/js/soundManager.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticModel from '../../common/model/ArithmeticModel.js'; +import GameState from '../../common/model/GameState.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticModel = require( 'ARITHMETIC/common/model/ArithmeticModel' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Random = require( 'DOT/Random' ); - const soundManager = require( 'TAMBO/soundManager' ); +/** + * @param {Tandem} tandem + * @constructor + */ +function DivideModel( tandem ) { + const self = this; + ArithmeticModel.call( this, tandem, { + fillEquation: function() { - /** - * @param {Tandem} tandem - * @constructor - */ - function DivideModel( tandem ) { - const self = this; - ArithmeticModel.call( this, tandem, { - fillEquation: function() { + // Convert any strings entered by the user into numerical values. + self.problemModel.multiplierProperty.set( parseInt( self.problemModel.multiplierProperty.get(), 10 ) ); + self.problemModel.multiplicandProperty.set( parseInt( self.problemModel.multiplicandProperty.get(), 10 ) ); - // Convert any strings entered by the user into numerical values. - self.problemModel.multiplierProperty.set( parseInt( self.problemModel.multiplierProperty.get(), 10 ) ); - self.problemModel.multiplicandProperty.set( parseInt( self.problemModel.multiplicandProperty.get(), 10 ) ); + // Submit this answer so that it can be checked. + self.submitAnswer(); + } + } ); + this.random = new Random( { staticSeed: true } ); +} - // Submit this answer so that it can be checked. - self.submitAnswer(); - } - } ); - this.random = new Random( { staticSeed: true } ); - } +arithmetic.register( 'DivideModel', DivideModel ); - arithmetic.register( 'DivideModel', DivideModel ); +export default inherit( ArithmeticModel, DivideModel, { - return inherit( ArithmeticModel, DivideModel, { + // @public + setUpUnansweredProblem: function() { - // @public - setUpUnansweredProblem: function() { + // get available multiplier pair + const multipliers = this.selectUnusedMultiplierPair(); - // get available multiplier pair - const multipliers = this.selectUnusedMultiplierPair(); + if ( multipliers ) { - if ( multipliers ) { + // reset multiplierPair and score properties + this.problemModel.multiplicandProperty.reset(); + this.problemModel.multiplierProperty.reset(); + this.problemModel.productProperty.reset(); + this.problemModel.possiblePointsProperty.reset(); - // reset multiplierPair and score properties - this.problemModel.multiplicandProperty.reset(); - this.problemModel.multiplierProperty.reset(); - this.problemModel.productProperty.reset(); - this.problemModel.possiblePointsProperty.reset(); + // set product + this.problemModel.productProperty.set( multipliers.multiplicand * multipliers.multiplier ); - // set product - this.problemModel.productProperty.set( multipliers.multiplicand * multipliers.multiplier ); + // set multiplicand or multiplier + if ( this.random.nextBoolean() ) { + this.problemModel.multiplicandProperty.set( multipliers.multiplicand ); + this.activeInputProperty.set( 'multiplier' ); + } + else { + this.problemModel.multiplierProperty.set( multipliers.multiplier ); + this.activeInputProperty.set( 'multiplicand' ); + } - // set multiplicand or multiplier - if ( this.random.nextBoolean() ) { - this.problemModel.multiplicandProperty.set( multipliers.multiplicand ); - this.activeInputProperty.set( 'multiplier' ); - } - else { - this.problemModel.multiplierProperty.set( multipliers.multiplier ); - this.activeInputProperty.set( 'multiplicand' ); - } + return true; + } - return true; - } + // All multiplier pairs have been used, so false is returned. + return false; + }, - // All multiplier pairs have been used, so false is returned. - return false; - }, - - /** - * Automatically answer most of the questions. This is useful for testing, since it can save time when testing - * how the sim behaves when a user finishing answering all questions for a level. We need to be very careful that - * this is never available in the published sim. - * @override - * @protected - */ - autoAnswer: function() { - const self = this; - - // make sure that sound is off, since otherwise it dings for every solved problem - const soundState = soundManager.enabled; - soundManager.enabled = false; - - // answer the questions - const numQuestions = this.activeLevelModel.tableSize * this.activeLevelModel.tableSize; - const numQuestionsToAnswer = numQuestions - 1; - console.log( 'Automatically answering', numQuestionsToAnswer, 'of', numQuestions, 'questions.' ); - _.times( numQuestionsToAnswer, function( index ) { - if ( !self.problemModel.multiplicandProperty.get() ) { - self.problemModel.multiplicandProperty.set( - self.problemModel.productProperty.get() / self.problemModel.multiplierProperty.get() - ); - } - else if ( !self.problemModel.multiplierProperty.get() ) { - self.problemModel.multiplierProperty.set( - self.problemModel.productProperty.get() / self.problemModel.multiplicandProperty.get() - ); - } - else { - throw new Error( 'unexpected problem structure for problem', index ); - } - self.activeLevelModel.currentScoreProperty.value += self.problemModel.possiblePointsProperty.get(); - self.activeLevelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); - self.activeLevelModel.markCellAsUsed( - self.problemModel.multiplicandProperty.get(), - self.problemModel.multiplierProperty.get() - ); - self.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); - self.nextProblem(); - } ); + /** + * Automatically answer most of the questions. This is useful for testing, since it can save time when testing + * how the sim behaves when a user finishing answering all questions for a level. We need to be very careful that + * this is never available in the published sim. + * @override + * @protected + */ + autoAnswer: function() { + const self = this; - // restore the original sound state - soundManager.enabled = soundState; - } - } ); + // make sure that sound is off, since otherwise it dings for every solved problem + const soundState = soundManager.enabled; + soundManager.enabled = false; + + // answer the questions + const numQuestions = this.activeLevelModel.tableSize * this.activeLevelModel.tableSize; + const numQuestionsToAnswer = numQuestions - 1; + console.log( 'Automatically answering', numQuestionsToAnswer, 'of', numQuestions, 'questions.' ); + _.times( numQuestionsToAnswer, function( index ) { + if ( !self.problemModel.multiplicandProperty.get() ) { + self.problemModel.multiplicandProperty.set( + self.problemModel.productProperty.get() / self.problemModel.multiplierProperty.get() + ); + } + else if ( !self.problemModel.multiplierProperty.get() ) { + self.problemModel.multiplierProperty.set( + self.problemModel.productProperty.get() / self.problemModel.multiplicandProperty.get() + ); + } + else { + throw new Error( 'unexpected problem structure for problem', index ); + } + self.activeLevelModel.currentScoreProperty.value += self.problemModel.possiblePointsProperty.get(); + self.activeLevelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); + self.activeLevelModel.markCellAsUsed( + self.problemModel.multiplicandProperty.get(), + self.problemModel.multiplierProperty.get() + ); + self.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); + self.nextProblem(); + } ); -} ); + // restore the original sound state + soundManager.enabled = soundState; + } +} ); \ No newline at end of file diff --git a/js/divide/view/DivideEquationNode.js b/js/divide/view/DivideEquationNode.js index 20d44bd1..39a3ef26 100644 --- a/js/divide/view/DivideEquationNode.js +++ b/js/divide/view/DivideEquationNode.js @@ -5,73 +5,70 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const EquationNode = require( 'ARITHMETIC/common/view/EquationNode' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../../common/model/GameState.js'; +import EquationNode from '../../common/view/EquationNode.js'; - /** - * @param {Property} stateProperty - State of game property. - * @param {Property} multiplicandProperty - Property necessary for creating multiplicand input. - * @param {Property} multiplierProperty - Property necessary for creating multiplier input. - * @param {Property} productProperty - Property necessary for creating product input. - * @param {Property} inputProperty - Input property. - * @param {Property} activeInputProperty - Link to active input. - * - * @constructor - */ - function DivideEquationNode( stateProperty, multiplicandProperty, multiplierProperty, productProperty, inputProperty, activeInputProperty ) { - const self = this; - EquationNode.call( this, multiplicandProperty, multiplierProperty, productProperty ); +/** + * @param {Property} stateProperty - State of game property. + * @param {Property} multiplicandProperty - Property necessary for creating multiplicand input. + * @param {Property} multiplierProperty - Property necessary for creating multiplier input. + * @param {Property} productProperty - Property necessary for creating product input. + * @param {Property} inputProperty - Input property. + * @param {Property} activeInputProperty - Link to active input. + * + * @constructor + */ +function DivideEquationNode( stateProperty, multiplicandProperty, multiplierProperty, productProperty, inputProperty, activeInputProperty ) { + const self = this; + EquationNode.call( this, multiplicandProperty, multiplierProperty, productProperty ); - // If the input value changes, it means that the user entered something, so put it in the appropriate equation node. - inputProperty.lazyLink( function( inputString ) { - if ( activeInputProperty.get() === 'multiplicand' ) { - multiplicandProperty.set( parseInt( inputString, 10 ) ); - } - else if ( activeInputProperty.get() === 'multiplier' ) { - multiplierProperty.set( parseInt( inputString, 10 ) ); - } - } ); + // If the input value changes, it means that the user entered something, so put it in the appropriate equation node. + inputProperty.lazyLink( function( inputString ) { + if ( activeInputProperty.get() === 'multiplicand' ) { + multiplicandProperty.set( parseInt( inputString, 10 ) ); + } + else if ( activeInputProperty.get() === 'multiplier' ) { + multiplierProperty.set( parseInt( inputString, 10 ) ); + } + } ); - function updateFocus() { - if ( stateProperty.value === GameState.AWAITING_USER_INPUT ) { - self.multiplierInput.setFocus( activeInputProperty.value === 'multiplier' ); - self.multiplicandInput.setFocus( activeInputProperty.value === 'multiplicand' ); - } - else { - // Not awaiting user input, so neither input gets focus. - self.multiplierInput.setFocus( false ); - self.multiplicandInput.setFocus( false ); - } + function updateFocus() { + if ( stateProperty.value === GameState.AWAITING_USER_INPUT ) { + self.multiplierInput.setFocus( activeInputProperty.value === 'multiplier' ); + self.multiplicandInput.setFocus( activeInputProperty.value === 'multiplicand' ); } + else { + // Not awaiting user input, so neither input gets focus. + self.multiplierInput.setFocus( false ); + self.multiplicandInput.setFocus( false ); + } + } - activeInputProperty.link( function( activeInput ) { - if ( activeInput === 'multiplier' ) { - self.multiplierInput.clear(); - } - else if ( activeInput === 'multiplicand' ) { - self.multiplicandInput.clear(); - } - self.multiplicandInput.setInteractiveAppearance( activeInput === 'multiplicand' ); - self.multiplierInput.setInteractiveAppearance( activeInput === 'multiplier' ); - updateFocus(); - } ); + activeInputProperty.link( function( activeInput ) { + if ( activeInput === 'multiplier' ) { + self.multiplierInput.clear(); + } + else if ( activeInput === 'multiplicand' ) { + self.multiplicandInput.clear(); + } + self.multiplicandInput.setInteractiveAppearance( activeInput === 'multiplicand' ); + self.multiplierInput.setInteractiveAppearance( activeInput === 'multiplier' ); + updateFocus(); + } ); - stateProperty.link( function( state ) { + stateProperty.link( function( state ) { - // Display a not equal sign if the user input and incorrect answer. - self.setShowEqual( state !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); + // Display a not equal sign if the user input and incorrect answer. + self.setShowEqual( state !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); - updateFocus(); - } ); - } + updateFocus(); + } ); +} - arithmetic.register( 'DivideEquationNode', DivideEquationNode ); +arithmetic.register( 'DivideEquationNode', DivideEquationNode ); - return inherit( EquationNode, DivideEquationNode ); -} ); +inherit( EquationNode, DivideEquationNode ); +export default DivideEquationNode; \ No newline at end of file diff --git a/js/divide/view/DivideScreenIconNode.js b/js/divide/view/DivideScreenIconNode.js index a00136c2..f8901a2d 100644 --- a/js/divide/view/DivideScreenIconNode.js +++ b/js/divide/view/DivideScreenIconNode.js @@ -6,49 +6,46 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const Circle = require( 'SCENERY/nodes/Circle' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - - // constants - const ICON_SIZE = ArithmeticConstants.SCREEN_ICON_SIZE; - const SYMBOL_COLOR = '#FFF31E'; - const CIRCLE_RADIUS = 30; // Empirically determined - - /** - * @constructor - */ - function DivideScreenIconNode() { - - // create the background - Rectangle.call( this, 0, 0, ICON_SIZE.width, ICON_SIZE.height, { fill: ArithmeticConstants.ICON_BACKGROUND_COLOR } ); - - // Create and add the divide symbol. We are doing our own, since the Unicode one doesn't look very good. - this.addChild( new Line( 0, 0, ICON_SIZE.width * 0.4, 0, { - stroke: SYMBOL_COLOR, - lineWidth: 33, // empirically determined - center: this.center - } ) ); - this.addChild( new Circle( CIRCLE_RADIUS, { - fill: SYMBOL_COLOR, - centerX: ICON_SIZE.width / 2, - centerY: ICON_SIZE.height * 0.3 - } ) ); - this.addChild( new Circle( CIRCLE_RADIUS, { - fill: SYMBOL_COLOR, - centerX: ICON_SIZE.width / 2, - centerY: ICON_SIZE.height * 0.7 - } ) ); - } - - arithmetic.register( 'DivideScreenIconNode', DivideScreenIconNode ); - - return inherit( Rectangle, DivideScreenIconNode ); -} ); + +import inherit from '../../../../phet-core/js/inherit.js'; +import Circle from '../../../../scenery/js/nodes/Circle.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticConstants from '../../common/ArithmeticConstants.js'; + +// constants +const ICON_SIZE = ArithmeticConstants.SCREEN_ICON_SIZE; +const SYMBOL_COLOR = '#FFF31E'; +const CIRCLE_RADIUS = 30; // Empirically determined + +/** + * @constructor + */ +function DivideScreenIconNode() { + + // create the background + Rectangle.call( this, 0, 0, ICON_SIZE.width, ICON_SIZE.height, { fill: ArithmeticConstants.ICON_BACKGROUND_COLOR } ); + + // Create and add the divide symbol. We are doing our own, since the Unicode one doesn't look very good. + this.addChild( new Line( 0, 0, ICON_SIZE.width * 0.4, 0, { + stroke: SYMBOL_COLOR, + lineWidth: 33, // empirically determined + center: this.center + } ) ); + this.addChild( new Circle( CIRCLE_RADIUS, { + fill: SYMBOL_COLOR, + centerX: ICON_SIZE.width / 2, + centerY: ICON_SIZE.height * 0.3 + } ) ); + this.addChild( new Circle( CIRCLE_RADIUS, { + fill: SYMBOL_COLOR, + centerX: ICON_SIZE.width / 2, + centerY: ICON_SIZE.height * 0.7 + } ) ); +} + +arithmetic.register( 'DivideScreenIconNode', DivideScreenIconNode ); + +inherit( Rectangle, DivideScreenIconNode ); +export default DivideScreenIconNode; \ No newline at end of file diff --git a/js/divide/view/DivideScreenTableNode.js b/js/divide/view/DivideScreenTableNode.js index 13b6ea16..6bc54810 100644 --- a/js/divide/view/DivideScreenTableNode.js +++ b/js/divide/view/DivideScreenTableNode.js @@ -6,76 +6,71 @@ * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../../common/model/GameState.js'; +import MultiplicationTableNode from '../../common/view/table/MultiplicationTableNode.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MultiplicationTableNode = require( 'ARITHMETIC/common/view/table/MultiplicationTableNode' ); - - /** - * @param {ArithmeticModel} model - * @constructor - */ - function DivideScreenTableNode( model ) { - const self = this; - MultiplicationTableNode.call( this, model.levelNumberProperty, model.stateProperty, model.levelModels, true ); - this.problemModel = model.problemModel; - this.levelNumberProperty = model.levelNumberProperty; - - model.stateProperty.lazyLink( function( state ) { +/** + * @param {ArithmeticModel} model + * @constructor + */ +function DivideScreenTableNode( model ) { + const self = this; + MultiplicationTableNode.call( this, model.levelNumberProperty, model.stateProperty, model.levelModels, true ); + this.problemModel = model.problemModel; + this.levelNumberProperty = model.levelNumberProperty; - // set view for multiplication table after choosing multiplicand and multiplier - if ( state === GameState.AWAITING_USER_INPUT ) { + model.stateProperty.lazyLink( function( state ) { - // clear cell colors prior to showing the problem - self.setCellsToDefaultColor( self.levelNumberProperty.value ); + // set view for multiplication table after choosing multiplicand and multiplier + if ( state === GameState.AWAITING_USER_INPUT ) { - // highlight the active multiplicand or multiplier - if ( model.activeInputProperty.get() === 'multiplier' ) { - self.cells[ self.levelNumberProperty.value ][ self.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); - } - else { - assert && assert( model.activeInputProperty.get() === 'multiplicand' ); - self.cells[ self.levelNumberProperty.value ][ 0 ][ self.problemModel.multiplierProperty.get() ].setSelected(); - } - } - else if ( state === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ) { + // clear cell colors prior to showing the problem + self.setCellsToDefaultColor( self.levelNumberProperty.value ); - // Make the cells that correspond to the answer change color. + // highlight the active multiplicand or multiplier + if ( model.activeInputProperty.get() === 'multiplier' ) { self.cells[ self.levelNumberProperty.value ][ self.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); + } + else { + assert && assert( model.activeInputProperty.get() === 'multiplicand' ); self.cells[ self.levelNumberProperty.value ][ 0 ][ self.problemModel.multiplierProperty.get() ].setSelected(); - for ( let multiplicand = 1; multiplicand <= self.problemModel.multiplicandProperty.get(); multiplicand++ ) { - for ( let multiplier = 1; multiplier <= self.problemModel.multiplierProperty.get(); multiplier++ ) { - self.cells[ self.levelNumberProperty.value ][ multiplicand ][ multiplier ].setSelected(); - } - } } - else if ( state === GameState.LEVEL_COMPLETED ) { + } + else if ( state === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ) { - // set all cells to default conditions when the table has been filled - self.setCellsToDefaultColor( self.levelNumberProperty.value ); + // Make the cells that correspond to the answer change color. + self.cells[ self.levelNumberProperty.value ][ self.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); + self.cells[ self.levelNumberProperty.value ][ 0 ][ self.problemModel.multiplierProperty.get() ].setSelected(); + for ( let multiplicand = 1; multiplicand <= self.problemModel.multiplicandProperty.get(); multiplicand++ ) { + for ( let multiplier = 1; multiplier <= self.problemModel.multiplierProperty.get(); multiplier++ ) { + self.cells[ self.levelNumberProperty.value ][ multiplicand ][ multiplier ].setSelected(); + } } - } ); - } + } + else if ( state === GameState.LEVEL_COMPLETED ) { - arithmetic.register( 'DivideScreenTableNode', DivideScreenTableNode ); + // set all cells to default conditions when the table has been filled + self.setCellsToDefaultColor( self.levelNumberProperty.value ); + } + } ); +} - return inherit( MultiplicationTableNode, DivideScreenTableNode, { +arithmetic.register( 'DivideScreenTableNode', DivideScreenTableNode ); - // @public, @override - refreshLevel: function() { - MultiplicationTableNode.prototype.refreshLevel.call( this, this.levelNumberProperty.value ); +export default inherit( MultiplicationTableNode, DivideScreenTableNode, { - // highlight the appropriate header cell - if ( this.problemModel.multiplicandProperty.get() ) { - this.cells[ this.levelNumberProperty.value ][ this.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); - } - else { - this.cells[ this.levelNumberProperty.value ][ 0 ][ this.problemModel.multiplierProperty.get() ].setSelected(); - } + // @public, @override + refreshLevel: function() { + MultiplicationTableNode.prototype.refreshLevel.call( this, this.levelNumberProperty.value ); + + // highlight the appropriate header cell + if ( this.problemModel.multiplicandProperty.get() ) { + this.cells[ this.levelNumberProperty.value ][ this.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); } - } ); -} ); + else { + this.cells[ this.levelNumberProperty.value ][ 0 ][ this.problemModel.multiplierProperty.get() ].setSelected(); + } + } +} ); \ No newline at end of file diff --git a/js/divide/view/DivideView.js b/js/divide/view/DivideView.js index c3415a3f..56cd9da2 100644 --- a/js/divide/view/DivideView.js +++ b/js/divide/view/DivideView.js @@ -5,46 +5,43 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticView = require( 'ARITHMETIC/common/view/ArithmeticView' ); - const DivideEquationNode = require( 'ARITHMETIC/divide/view/DivideEquationNode' ); - const DivideScreenTableNode = require( 'ARITHMETIC/divide/view/DivideScreenTableNode' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticView from '../../common/view/ArithmeticView.js'; +import DivideEquationNode from './DivideEquationNode.js'; +import DivideScreenTableNode from './DivideScreenTableNode.js'; - // strings - const divideString = require( 'string!ARITHMETIC/divide' ); +const divideString = arithmeticStrings.divide; - /** - * @param {DivideModel} model - Main model for screen. - * @constructor - */ - function DivideView( model ) { +/** + * @param {DivideModel} model - Main model for screen. + * @constructor + */ +function DivideView( model ) { - ArithmeticView.call( - this, - model, - new DivideScreenTableNode( model ), - new DivideEquationNode( - model.stateProperty, - model.problemModel.multiplicandProperty, - model.problemModel.multiplierProperty, - model.problemModel.productProperty, - model.inputProperty, - model.activeInputProperty - ), - { - titleString: divideString, - levelSelectButtonColor: '#BC76A5', - levelSelectIconSet: 'divide' - } - ); - } + ArithmeticView.call( + this, + model, + new DivideScreenTableNode( model ), + new DivideEquationNode( + model.stateProperty, + model.problemModel.multiplicandProperty, + model.problemModel.multiplierProperty, + model.problemModel.productProperty, + model.inputProperty, + model.activeInputProperty + ), + { + titleString: divideString, + levelSelectButtonColor: '#BC76A5', + levelSelectIconSet: 'divide' + } + ); +} - arithmetic.register( 'DivideView', DivideView ); +arithmetic.register( 'DivideView', DivideView ); - return inherit( ArithmeticView, DivideView ); -} ); +inherit( ArithmeticView, DivideView ); +export default DivideView; \ No newline at end of file diff --git a/js/factor/FactorScreen.js b/js/factor/FactorScreen.js index 2050631a..ac7844f8 100644 --- a/js/factor/FactorScreen.js +++ b/js/factor/FactorScreen.js @@ -5,44 +5,41 @@ * * @author John Blanco, Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const FactorModel = require( 'ARITHMETIC/factor/model/FactorModel' ); - const FactorScreenIconNode = require( 'ARITHMETIC/factor/view/FactorScreenIconNode' ); - const FactorView = require( 'ARITHMETIC/factor/view/FactorView' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Property = require( 'AXON/Property' ); - const Screen = require( 'JOIST/Screen' ); - const Tandem = require( 'TANDEM/Tandem' ); - - // strings - const factorString = require( 'string!ARITHMETIC/factor' ); - - /** - * @param {Object} [options] - * @constructor - */ - function FactorScreen( options ) { - - options = merge( { - name: factorString, - homeScreenIcon: new FactorScreenIconNode(), - backgroundColorProperty: new Property( ArithmeticConstants.BACKGROUND_COLOR ), - tandem: Tandem.REQUIRED - }, options ); - - Screen.call( this, - function() { return new FactorModel( options.tandem.createTandem( 'model' ) ); }, - function( model ) { return new FactorView( model ); }, - options ); - } - - arithmetic.register( 'FactorScreen', FactorScreen ); - - return inherit( Screen, FactorScreen ); -} ); \ No newline at end of file + +import Property from '../../../axon/js/Property.js'; +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import merge from '../../../phet-core/js/merge.js'; +import Tandem from '../../../tandem/js/Tandem.js'; +import arithmeticStrings from '../arithmetic-strings.js'; +import arithmetic from '../arithmetic.js'; +import ArithmeticConstants from '../common/ArithmeticConstants.js'; +import FactorModel from './model/FactorModel.js'; +import FactorScreenIconNode from './view/FactorScreenIconNode.js'; +import FactorView from './view/FactorView.js'; + +const factorString = arithmeticStrings.factor; + +/** + * @param {Object} [options] + * @constructor + */ +function FactorScreen( options ) { + + options = merge( { + name: factorString, + homeScreenIcon: new FactorScreenIconNode(), + backgroundColorProperty: new Property( ArithmeticConstants.BACKGROUND_COLOR ), + tandem: Tandem.REQUIRED + }, options ); + + Screen.call( this, + function() { return new FactorModel( options.tandem.createTandem( 'model' ) ); }, + function( model ) { return new FactorView( model ); }, + options ); +} + +arithmetic.register( 'FactorScreen', FactorScreen ); + +inherit( Screen, FactorScreen ); +export default FactorScreen; \ No newline at end of file diff --git a/js/factor/model/FactorModel.js b/js/factor/model/FactorModel.js index 0616e7c9..f7949f24 100644 --- a/js/factor/model/FactorModel.js +++ b/js/factor/model/FactorModel.js @@ -7,117 +7,112 @@ * @author John Blanco */ -define( require => { - 'use strict'; +import inherit from '../../../../phet-core/js/inherit.js'; +import soundManager from '../../../../tambo/js/soundManager.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticModel from '../../common/model/ArithmeticModel.js'; +import GameState from '../../common/model/GameState.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticModel = require( 'ARITHMETIC/common/model/ArithmeticModel' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const soundManager = require( 'TAMBO/soundManager' ); +/** + * @param {Tandem} tandem + * @constructor + */ +function FactorModel( tandem ) { + ArithmeticModel.call( this, tandem ); +} - /** - * @param {Tandem} tandem - * @constructor - */ - function FactorModel( tandem ) { - ArithmeticModel.call( this, tandem ); - } +arithmetic.register( 'FactorModel', FactorModel ); - arithmetic.register( 'FactorModel', FactorModel ); +export default inherit( ArithmeticModel, FactorModel, { - return inherit( ArithmeticModel, FactorModel, { + // @public + setUpUnansweredProblem: function() { - // @public - setUpUnansweredProblem: function() { + // get available multiplier pair + const multiplierPair = this.selectUnusedMultiplierPair(); - // get available multiplier pair - const multiplierPair = this.selectUnusedMultiplierPair(); + if ( multiplierPair ) { - if ( multiplierPair ) { + // reset multiplierPair and score properties + this.problemModel.possiblePointsProperty.reset(); + this.problemModel.multiplicandProperty.reset(); + this.problemModel.multiplierProperty.reset(); - // reset multiplierPair and score properties - this.problemModel.possiblePointsProperty.reset(); - this.problemModel.multiplicandProperty.reset(); - this.problemModel.multiplierProperty.reset(); + // set product + this.problemModel.productProperty.set( + multiplierPair.multiplicand * multiplierPair.multiplier + ); - // set product - this.problemModel.productProperty.set( - multiplierPair.multiplicand * multiplierPair.multiplier - ); + return true; + } - return true; - } + // All multiplier pairs have been used, so false is returned. + return false; + }, - // All multiplier pairs have been used, so false is returned. - return false; - }, - - /** - * Submit an answer for the currently active problem. This override exists to handle one very special case on the - * Factor screen: the situation where the user submits two or more incorrect answers in a row without pressing the - * "Try Again" button in between. In this case, there is no natural state transition, so the feedback sound is - * never played. This override forces the state transition. - * - * See https://github.com/phetsims/arithmetic/issues/160#issuecomment-164507798 for more. - * - * @override - * @public - */ - submitAnswer: function() { - if ( this.stateProperty.get() === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - - // force a change to the AWAITING_USER_INPUT state before checking the answer - const multiplicand = this.problemModel.multiplicandProperty.get(); - const multiplier = this.problemModel.multiplierProperty.get(); - this.retryProblem(); - this.problemModel.multiplicandProperty.set( multiplicand ); - this.problemModel.multiplierProperty.set( multiplier ); - } - ArithmeticModel.prototype.submitAnswer.call( this ); - }, - - /** - * Automatically answer most of the questions. This is useful for testing, since it can save time when testing - * how the sim behaves when a user finishing answering all questions for a level. We need to be very careful that - * this is never available in the published sim. - * @override - * @protected - */ - autoAnswer: function() { - - // make sure that sound is off, since otherwise it dings for every solved problem - const soundState = soundManager.enabled; - soundManager.enabled = false; - - // answer the questions - const self = this; - const tableSize = this.activeLevelModel.tableSize; - const numQuestions = tableSize * tableSize; - const numQuestionsToAnswer = numQuestions - 1; - const levelModel = this.activeLevelModel; // convenience var - console.log( 'Automatically answering', numQuestionsToAnswer, 'of', numQuestions, 'questions.' ); - _.times( numQuestionsToAnswer, function( index ) { - // do a brute-force factoring method, since performance isn't really an issue here - let answerFound = false; - for ( let multiplicand = 1; multiplicand <= tableSize && !answerFound; multiplicand++ ) { - for ( let multiplier = 1; multiplier <= tableSize && !answerFound; multiplier++ ) { - if ( multiplicand * multiplier === self.problemModel.productProperty.get() && !levelModel.isCellUsed( multiplicand, multiplier ) ) { - - answerFound = true; - levelModel.markCellAsUsed( multiplicand, multiplier ); - } + /** + * Submit an answer for the currently active problem. This override exists to handle one very special case on the + * Factor screen: the situation where the user submits two or more incorrect answers in a row without pressing the + * "Try Again" button in between. In this case, there is no natural state transition, so the feedback sound is + * never played. This override forces the state transition. + * + * See https://github.com/phetsims/arithmetic/issues/160#issuecomment-164507798 for more. + * + * @override + * @public + */ + submitAnswer: function() { + if ( this.stateProperty.get() === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + + // force a change to the AWAITING_USER_INPUT state before checking the answer + const multiplicand = this.problemModel.multiplicandProperty.get(); + const multiplier = this.problemModel.multiplierProperty.get(); + this.retryProblem(); + this.problemModel.multiplicandProperty.set( multiplicand ); + this.problemModel.multiplierProperty.set( multiplier ); + } + ArithmeticModel.prototype.submitAnswer.call( this ); + }, + + /** + * Automatically answer most of the questions. This is useful for testing, since it can save time when testing + * how the sim behaves when a user finishing answering all questions for a level. We need to be very careful that + * this is never available in the published sim. + * @override + * @protected + */ + autoAnswer: function() { + + // make sure that sound is off, since otherwise it dings for every solved problem + const soundState = soundManager.enabled; + soundManager.enabled = false; + + // answer the questions + const self = this; + const tableSize = this.activeLevelModel.tableSize; + const numQuestions = tableSize * tableSize; + const numQuestionsToAnswer = numQuestions - 1; + const levelModel = this.activeLevelModel; // convenience var + console.log( 'Automatically answering', numQuestionsToAnswer, 'of', numQuestions, 'questions.' ); + _.times( numQuestionsToAnswer, function( index ) { + // do a brute-force factoring method, since performance isn't really an issue here + let answerFound = false; + for ( let multiplicand = 1; multiplicand <= tableSize && !answerFound; multiplicand++ ) { + for ( let multiplier = 1; multiplier <= tableSize && !answerFound; multiplier++ ) { + if ( multiplicand * multiplier === self.problemModel.productProperty.get() && !levelModel.isCellUsed( multiplicand, multiplier ) ) { + + answerFound = true; + levelModel.markCellAsUsed( multiplicand, multiplier ); } } - levelModel.currentScoreProperty.value += self.problemModel.possiblePointsProperty.get(); - levelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); - self.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); - self.nextProblem(); - } ); - - // restore the original sound state - soundManager.enabled = soundState; - } - } ); -} ); + } + levelModel.currentScoreProperty.value += self.problemModel.possiblePointsProperty.get(); + levelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); + self.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); + self.nextProblem(); + } ); + + // restore the original sound state + soundManager.enabled = soundState; + } +} ); \ No newline at end of file diff --git a/js/factor/view/CellInteractionListener.js b/js/factor/view/CellInteractionListener.js index 36f9cbca..89bd6560 100644 --- a/js/factor/view/CellInteractionListener.js +++ b/js/factor/view/CellInteractionListener.js @@ -9,67 +9,63 @@ * * @author John Blanco */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const Emitter = require( 'AXON/Emitter' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); +import Emitter from '../../../../axon/js/Emitter.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; - /** - * @constructor - */ - function CellInteractionListener() { - this.mouseOverProperty = new Property( false ); - this.touchedProperty = new Property( false ); - this.enabledProperty = new Property( true ); +/** + * @constructor + */ +function CellInteractionListener() { + this.mouseOverProperty = new Property( false ); + this.touchedProperty = new Property( false ); + this.enabledProperty = new Property( true ); - this.mouseDownEmitter = new Emitter(); - this.mouseUpEmitter = new Emitter(); - this.touchUpEmitter = new Emitter(); - } + this.mouseDownEmitter = new Emitter(); + this.mouseUpEmitter = new Emitter(); + this.touchUpEmitter = new Emitter(); +} - arithmetic.register( 'CellInteractionListener', CellInteractionListener ); +arithmetic.register( 'CellInteractionListener', CellInteractionListener ); - return inherit( Object, CellInteractionListener, { +export default inherit( Object, CellInteractionListener, { - // @public - enter: function( event, trail ) { - if ( event.pointer.type === 'mouse' ) { - this.mouseOverProperty.set( true ); - } - else if ( event.pointer.type === 'touch' ) { - this.touchedProperty.set( true ); - } - }, + // @public + enter: function( event, trail ) { + if ( event.pointer.type === 'mouse' ) { + this.mouseOverProperty.set( true ); + } + else if ( event.pointer.type === 'touch' ) { + this.touchedProperty.set( true ); + } + }, - // @public - exit: function( event, trail ) { - if ( event.pointer.type === 'mouse' ) { - this.mouseOverProperty.set( false ); - } - else if ( event.pointer.type === 'touch' ) { - this.touchedProperty.set( false ); - } - }, + // @public + exit: function( event, trail ) { + if ( event.pointer.type === 'mouse' ) { + this.mouseOverProperty.set( false ); + } + else if ( event.pointer.type === 'touch' ) { + this.touchedProperty.set( false ); + } + }, - // @public - down: function( event, trail ) { - if ( event.pointer.type === 'mouse' ) { - this.mouseDownEmitter.emit(); - } - }, + // @public + down: function( event, trail ) { + if ( event.pointer.type === 'mouse' ) { + this.mouseDownEmitter.emit(); + } + }, - // @public - up: function( event, trail ) { - if ( event.pointer.type === 'mouse' ) { - this.mouseUpEmitter.emit(); - } - else if ( event.pointer.type === 'touch' ) { - this.touchUpEmitter.emit(); - } + // @public + up: function( event, trail ) { + if ( event.pointer.type === 'mouse' ) { + this.mouseUpEmitter.emit(); } - } ); + else if ( event.pointer.type === 'touch' ) { + this.touchUpEmitter.emit(); + } + } } ); \ No newline at end of file diff --git a/js/factor/view/FactorEquationNode.js b/js/factor/view/FactorEquationNode.js index ce9cc882..eb63771a 100644 --- a/js/factor/view/FactorEquationNode.js +++ b/js/factor/view/FactorEquationNode.js @@ -5,47 +5,44 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const EquationNode = require( 'ARITHMETIC/common/view/EquationNode' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - - /** - * @param {Property} stateProperty - State of game property. - * @param {Property} multiplicandProperty - Property necessary for creating multiplicand input. - * @param {Property} multiplierProperty - Property necessary for creating multiplier input. - * @param {Property} productProperty - Property necessary for creating product input. - * @constructor - */ - function FactorEquationNode( stateProperty, multiplicandProperty, multiplierProperty, productProperty ) { - const self = this; - EquationNode.call( this, multiplicandProperty, multiplierProperty, productProperty ); - - // The two multipliers are always interactive in the factor equation, so set this up now. - this.multiplicandInput.setInteractiveAppearance( true ); - this.multiplierInput.setInteractiveAppearance( true ); - - // Update contents and focus at the state changes. - stateProperty.link( function( state ) { - self.setShowEqual( state !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); - if ( state === GameState.AWAITING_USER_INPUT ) { - - // Reset any previous answers from the user. - multiplicandProperty.reset(); - multiplierProperty.reset(); - - // Show the placeholders - self.multiplicandInput.setPlaceholder(); - self.multiplierInput.setPlaceholder(); - } - } ); - } - - arithmetic.register( 'FactorEquationNode', FactorEquationNode ); - - return inherit( EquationNode, FactorEquationNode ); -} ); + +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../../common/model/GameState.js'; +import EquationNode from '../../common/view/EquationNode.js'; + +/** + * @param {Property} stateProperty - State of game property. + * @param {Property} multiplicandProperty - Property necessary for creating multiplicand input. + * @param {Property} multiplierProperty - Property necessary for creating multiplier input. + * @param {Property} productProperty - Property necessary for creating product input. + * @constructor + */ +function FactorEquationNode( stateProperty, multiplicandProperty, multiplierProperty, productProperty ) { + const self = this; + EquationNode.call( this, multiplicandProperty, multiplierProperty, productProperty ); + + // The two multipliers are always interactive in the factor equation, so set this up now. + this.multiplicandInput.setInteractiveAppearance( true ); + this.multiplierInput.setInteractiveAppearance( true ); + + // Update contents and focus at the state changes. + stateProperty.link( function( state ) { + self.setShowEqual( state !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); + if ( state === GameState.AWAITING_USER_INPUT ) { + + // Reset any previous answers from the user. + multiplicandProperty.reset(); + multiplierProperty.reset(); + + // Show the placeholders + self.multiplicandInput.setPlaceholder(); + self.multiplierInput.setPlaceholder(); + } + } ); +} + +arithmetic.register( 'FactorEquationNode', FactorEquationNode ); + +inherit( EquationNode, FactorEquationNode ); +export default FactorEquationNode; \ No newline at end of file diff --git a/js/factor/view/FactorScreenIconNode.js b/js/factor/view/FactorScreenIconNode.js index 8df3b358..43bf9a20 100644 --- a/js/factor/view/FactorScreenIconNode.js +++ b/js/factor/view/FactorScreenIconNode.js @@ -6,70 +6,67 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const Text = require( 'SCENERY/nodes/Text' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticConstants from '../../common/ArithmeticConstants.js'; - // constants - const ICON_SIZE = ArithmeticConstants.SCREEN_ICON_SIZE; - const CONNECTING_LINES_COLOR = '#FFF31E'; - const CONNECTING_LINE_WIDTH = 15; - const NUMBER_FONT = new PhetFont( 90 ); // Font size empirically determined - const QUESTION_MARK_FONT = new PhetFont( { size: 120, weight: 'bold' } ); // Font size empirically determined - const BOX_VERTICAL_INSET = 25; // Empirically determined - const CONNECTING_LINES_OPTIONS = { - stroke: CONNECTING_LINES_COLOR, - lineWidth: CONNECTING_LINE_WIDTH, - lineCap: 'round' - }; +// constants +const ICON_SIZE = ArithmeticConstants.SCREEN_ICON_SIZE; +const CONNECTING_LINES_COLOR = '#FFF31E'; +const CONNECTING_LINE_WIDTH = 15; +const NUMBER_FONT = new PhetFont( 90 ); // Font size empirically determined +const QUESTION_MARK_FONT = new PhetFont( { size: 120, weight: 'bold' } ); // Font size empirically determined +const BOX_VERTICAL_INSET = 25; // Empirically determined +const CONNECTING_LINES_OPTIONS = { + stroke: CONNECTING_LINES_COLOR, + lineWidth: CONNECTING_LINE_WIDTH, + lineCap: 'round' +}; - // utility function for creating a rectangle with text in it. - function createRectangleWithEnclosedText( text, font, xMargin, yMargin ) { - const textNode = new Text( text, { font: font } ); - const box = new Rectangle( 0, 0, textNode.width + 2 * xMargin, textNode.height + 2 * yMargin, 20, 20, { fill: 'white' } ); - textNode.center = box.center; - box.addChild( textNode ); - return box; - } +// utility function for creating a rectangle with text in it. +function createRectangleWithEnclosedText( text, font, xMargin, yMargin ) { + const textNode = new Text( text, { font: font } ); + const box = new Rectangle( 0, 0, textNode.width + 2 * xMargin, textNode.height + 2 * yMargin, 20, 20, { fill: 'white' } ); + textNode.center = box.center; + box.addChild( textNode ); + return box; +} - /** - * @constructor - */ - function FactorScreenIconNode() { +/** + * @constructor + */ +function FactorScreenIconNode() { - // create the background - Rectangle.call( this, 0, 0, ICON_SIZE.width, ICON_SIZE.height, { fill: ArithmeticConstants.ICON_BACKGROUND_COLOR } ); + // create the background + Rectangle.call( this, 0, 0, ICON_SIZE.width, ICON_SIZE.height, { fill: ArithmeticConstants.ICON_BACKGROUND_COLOR } ); - // Create and position the boxes, but don't add them yet so that we can get the layering right. - const topBox = createRectangleWithEnclosedText( '12', NUMBER_FONT, 15, 5 ); - topBox.centerX = this.width / 2; - topBox.top = BOX_VERTICAL_INSET; - const multiplicandBox = createRectangleWithEnclosedText( '?', QUESTION_MARK_FONT, 20, 5 ); - multiplicandBox.centerX = ICON_SIZE.width * 0.3; - multiplicandBox.bottom = ICON_SIZE.height - BOX_VERTICAL_INSET; - const multiplierBox = createRectangleWithEnclosedText( '?', QUESTION_MARK_FONT, 20, 5 ); - multiplierBox.centerX = ICON_SIZE.width * 0.7; - multiplierBox.bottom = multiplicandBox.bottom; + // Create and position the boxes, but don't add them yet so that we can get the layering right. + const topBox = createRectangleWithEnclosedText( '12', NUMBER_FONT, 15, 5 ); + topBox.centerX = this.width / 2; + topBox.top = BOX_VERTICAL_INSET; + const multiplicandBox = createRectangleWithEnclosedText( '?', QUESTION_MARK_FONT, 20, 5 ); + multiplicandBox.centerX = ICON_SIZE.width * 0.3; + multiplicandBox.bottom = ICON_SIZE.height - BOX_VERTICAL_INSET; + const multiplierBox = createRectangleWithEnclosedText( '?', QUESTION_MARK_FONT, 20, 5 ); + multiplierBox.centerX = ICON_SIZE.width * 0.7; + multiplierBox.bottom = multiplicandBox.bottom; - // Add the connecting lines - this.addChild( new Line( topBox.centerX, topBox.bottom, multiplicandBox.centerX, multiplicandBox.top, CONNECTING_LINES_OPTIONS ) ); - this.addChild( new Line( topBox.centerX, topBox.bottom, multiplierBox.centerX, multiplierBox.top, CONNECTING_LINES_OPTIONS ) ); + // Add the connecting lines + this.addChild( new Line( topBox.centerX, topBox.bottom, multiplicandBox.centerX, multiplicandBox.top, CONNECTING_LINES_OPTIONS ) ); + this.addChild( new Line( topBox.centerX, topBox.bottom, multiplierBox.centerX, multiplierBox.top, CONNECTING_LINES_OPTIONS ) ); - // Add the text boxes - this.addChild( topBox ); - this.addChild( multiplicandBox ); - this.addChild( multiplierBox ); - } + // Add the text boxes + this.addChild( topBox ); + this.addChild( multiplicandBox ); + this.addChild( multiplierBox ); +} - arithmetic.register( 'FactorScreenIconNode', FactorScreenIconNode ); +arithmetic.register( 'FactorScreenIconNode', FactorScreenIconNode ); - return inherit( Rectangle, FactorScreenIconNode ); -} ); +inherit( Rectangle, FactorScreenIconNode ); +export default FactorScreenIconNode; \ No newline at end of file diff --git a/js/factor/view/FactorScreenTableNode.js b/js/factor/view/FactorScreenTableNode.js index 88793b9b..89aa57f8 100644 --- a/js/factor/view/FactorScreenTableNode.js +++ b/js/factor/view/FactorScreenTableNode.js @@ -6,258 +6,252 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const CellInteractionListener = require( 'ARITHMETIC/factor/view/CellInteractionListener' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MultiplicationTableNode = require( 'ARITHMETIC/common/view/table/MultiplicationTableNode' ); - - // images - const cellPointerHandImage = require( 'image!ARITHMETIC/small-pointing-hand.png' ); - const overlayPointingHandImage = require( 'image!ARITHMETIC/large-pointing-hand.png' ); - - /** - * @param {FactorModel} model - main model class for the factor screen - * @constructor - */ - function FactorScreenTableNode( model ) { - const self = this; - MultiplicationTableNode.call( this, model.levelNumberProperty, model.stateProperty, model.levelModels, false ); - - // convenience var - const gameState = model.stateProperty; - - // Create an image of a transparent hand that will cue the user that they need to interact with the table. - const handImage = new Image( overlayPointingHandImage, { pickable: false } ); // @private - handImage.scale( ( this.width / overlayPointingHandImage.width ) * 0.25 ); - handImage.centerX = this.width * 0.55; // position empirically determined - handImage.centerY = this.height / 2; - - // Create another hand that will appear over each cell to indicate that the user can click on it. This was - // originally handled in the individual cells, but caused startup to be long due to the large number of images - // created, so was moved here. - this.cellPointer = new Image( cellPointerHandImage, { pickable: false } ); // @private - this.addChild( this.cellPointer ); - - // variables used to track cell interaction - this.cellListeners = []; // @private - this.activeCell = null; // @private - this.mouseDownCell = null; // @private - - // add 'hover' and 'down' listeners for each cell in table - this.cells.forEach( function( tableForLevel, levelIndex ) { - - self.cellListeners[ levelIndex ] = []; - - tableForLevel.forEach( function( multiplicandRow, multiplicandRowIndex ) { - - // skip zero-index because it's the header column - if ( multiplicandRowIndex ) { - - multiplicandRow.forEach( function( cell, multiplierIndex ) { - let cellListener; - - // skip zero-index because it's the header row - if ( multiplierIndex ) { - cellListener = new CellInteractionListener(); - cell.addInputListener( cellListener ); - cell.cursor = 'pointer'; - - // store cell listeners for each level - self.cellListeners[ levelIndex ].push( cellListener ); - - const updateHover = function() { - if ( model.stateProperty.get() === GameState.AWAITING_USER_INPUT ) { - self.setCellsToDefaultColor( model.levelNumberProperty.get() ); - if ( cellListener.enabledProperty.get() ) { - self.setSelectedRect( model.levelNumberProperty.get(), multiplicandRowIndex, multiplierIndex ); - cell.setHover(); - self.cellPointer.visible = true; - - if ( Math.abs( self.cellPointer.height - cell.height * 0.7 ) > 0.01 ) { - self.cellPointer.setScaleMagnitude( 1 ); - self.cellPointer.setScaleMagnitude( cell.height * 0.7 / self.cellPointer.height ); - } - self.cellPointer.centerX = cell.centerX; - self.cellPointer.centerY = cell.centerY; - self.activeCell = cell; - } - else { - self.activeCell = null; - } - } - }; - - // add 'hover' listeners - cellListener.mouseOverProperty.link( updateHover ); - cellListener.touchedProperty.link( function( touched ) { - if ( touched ) { - if ( model.stateProperty.get() === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - // The user has re-touched the grid after submitting an incorrect answer, so assume they want to retry. - model.retryProblem(); - } - handImage.visible = false; // stop showing hand after first interaction - updateHover(); - } - } ); - // When the user presses the mouse button, record it. - cellListener.mouseDownEmitter.addListener( function() { - self.mouseDownCell = cell; - self.activeCell = cell; - handImage.visible = false; // stop showing hand after first interaction - updateHover(); - } ); +import inherit from '../../../../phet-core/js/inherit.js'; +import Image from '../../../../scenery/js/nodes/Image.js'; +import overlayPointingHandImage from '../../../images/large-pointing-hand_png.js'; +import cellPointerHandImage from '../../../images/small-pointing-hand_png.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../../common/model/GameState.js'; +import MultiplicationTableNode from '../../common/view/table/MultiplicationTableNode.js'; +import CellInteractionListener from './CellInteractionListener.js'; - // Define a function for submitting an answer that can be used by both mouse and the touch handlers. - const submitAnswer = function() { +/** + * @param {FactorModel} model - main model class for the factor screen + * @constructor + */ +function FactorScreenTableNode( model ) { + const self = this; + MultiplicationTableNode.call( this, model.levelNumberProperty, model.stateProperty, model.levelModels, false ); - // Record the user's answer. - model.problemModel.multiplicandProperty.set( multiplicandRowIndex ); - model.problemModel.multiplierProperty.set( multiplierIndex ); + // convenience var + const gameState = model.stateProperty; - // Disable this cell if the user's answer is correct. - if ( multiplicandRowIndex * multiplierIndex === model.problemModel.productProperty.get() ) { - cellListener.enabledProperty.set( false ); - } + // Create an image of a transparent hand that will cue the user that they need to interact with the table. + const handImage = new Image( overlayPointingHandImage, { pickable: false } ); // @private + handImage.scale( ( this.width / overlayPointingHandImage.width ) * 0.25 ); + handImage.centerX = this.width * 0.55; // position empirically determined + handImage.centerY = this.height / 2; - // Submit the user's answer for checking. - model.submitAnswer(); + // Create another hand that will appear over each cell to indicate that the user can click on it. This was + // originally handled in the individual cells, but caused startup to be long due to the large number of images + // created, so was moved here. + this.cellPointer = new Image( cellPointerHandImage, { pickable: false } ); // @private + this.addChild( this.cellPointer ); - // Update the cell highlighting to match the latest submission, which may be necessary if the user - // submitted a new answer after first submitting one or more incorrect ones. - self.setSelectedRect( model.levelNumberProperty.get(), multiplicandRowIndex, multiplierIndex ); - }; + // variables used to track cell interaction + this.cellListeners = []; // @private + this.activeCell = null; // @private + this.mouseDownCell = null; // @private - // When the user releases the mouse button, check that it's the same cell where the mouse down occurred, - // and fire if so. - cellListener.mouseUpEmitter.addListener( function() { - if ( cellListener.enabledProperty.get() && self.mouseDownCell === cell && - ( gameState.value === GameState.AWAITING_USER_INPUT || - gameState.value === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) ) { - submitAnswer(); - } - } ); + // add 'hover' and 'down' listeners for each cell in table + this.cells.forEach( function( tableForLevel, levelIndex ) { + + self.cellListeners[ levelIndex ] = []; + + tableForLevel.forEach( function( multiplicandRow, multiplicandRowIndex ) { + + // skip zero-index because it's the header column + if ( multiplicandRowIndex ) { + + multiplicandRow.forEach( function( cell, multiplierIndex ) { + let cellListener; + + // skip zero-index because it's the header row + if ( multiplierIndex ) { + cellListener = new CellInteractionListener(); + cell.addInputListener( cellListener ); + cell.cursor = 'pointer'; - // Add listener for handling the event where the user was touching and lifts their finger. - cellListener.touchUpEmitter.addListener( function() { - // It takes two touchUp events in a row from the same cell to submit an answer. + // store cell listeners for each level + self.cellListeners[ levelIndex ].push( cellListener ); + + const updateHover = function() { + if ( model.stateProperty.get() === GameState.AWAITING_USER_INPUT ) { + self.setCellsToDefaultColor( model.levelNumberProperty.get() ); if ( cellListener.enabledProperty.get() ) { - if ( self.touchUpCell === cell && gameState.value === GameState.AWAITING_USER_INPUT ) { - submitAnswer(); - } - else { - self.touchUpCell = cell; + self.setSelectedRect( model.levelNumberProperty.get(), multiplicandRowIndex, multiplierIndex ); + cell.setHover(); + self.cellPointer.visible = true; + + if ( Math.abs( self.cellPointer.height - cell.height * 0.7 ) > 0.01 ) { + self.cellPointer.setScaleMagnitude( 1 ); + self.cellPointer.setScaleMagnitude( cell.height * 0.7 / self.cellPointer.height ); } + self.cellPointer.centerX = cell.centerX; + self.cellPointer.centerY = cell.centerY; + self.activeCell = cell; } - } ); - - // cancel hover for disabled cell before next task - model.stateProperty.lazyLink( function( state ) { - if ( state === GameState.AWAITING_USER_INPUT && !cellListener.enabledProperty.get() ) { - self.setCellsToDefaultColor( model.levelNumberProperty.get() ); + else { + self.activeCell = null; + } + } + }; + + // add 'hover' listeners + cellListener.mouseOverProperty.link( updateHover ); + cellListener.touchedProperty.link( function( touched ) { + if ( touched ) { + if ( model.stateProperty.get() === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + // The user has re-touched the grid after submitting an incorrect answer, so assume they want to retry. + model.retryProblem(); + } + handImage.visible = false; // stop showing hand after first interaction + updateHover(); + } + } ); + + // When the user presses the mouse button, record it. + cellListener.mouseDownEmitter.addListener( function() { + self.mouseDownCell = cell; + self.activeCell = cell; + handImage.visible = false; // stop showing hand after first interaction + updateHover(); + } ); + + // Define a function for submitting an answer that can be used by both mouse and the touch handlers. + const submitAnswer = function() { + + // Record the user's answer. + model.problemModel.multiplicandProperty.set( multiplicandRowIndex ); + model.problemModel.multiplierProperty.set( multiplierIndex ); + + // Disable this cell if the user's answer is correct. + if ( multiplicandRowIndex * multiplierIndex === model.problemModel.productProperty.get() ) { + cellListener.enabledProperty.set( false ); + } + + // Submit the user's answer for checking. + model.submitAnswer(); + + // Update the cell highlighting to match the latest submission, which may be necessary if the user + // submitted a new answer after first submitting one or more incorrect ones. + self.setSelectedRect( model.levelNumberProperty.get(), multiplicandRowIndex, multiplierIndex ); + }; + + // When the user releases the mouse button, check that it's the same cell where the mouse down occurred, + // and fire if so. + cellListener.mouseUpEmitter.addListener( function() { + if ( cellListener.enabledProperty.get() && self.mouseDownCell === cell && + ( gameState.value === GameState.AWAITING_USER_INPUT || + gameState.value === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) ) { + submitAnswer(); + } + } ); + + // Add listener for handling the event where the user was touching and lifts their finger. + cellListener.touchUpEmitter.addListener( function() { + // It takes two touchUp events in a row from the same cell to submit an answer. + if ( cellListener.enabledProperty.get() ) { + if ( self.touchUpCell === cell && gameState.value === GameState.AWAITING_USER_INPUT ) { + submitAnswer(); } - } ); - } - } ); - } - } ); + else { + self.touchUpCell = cell; + } + } + } ); + + // cancel hover for disabled cell before next task + model.stateProperty.lazyLink( function( state ) { + if ( state === GameState.AWAITING_USER_INPUT && !cellListener.enabledProperty.get() ) { + self.setCellsToDefaultColor( model.levelNumberProperty.get() ); + } + } ); + } + } ); + } } ); + } ); - // Add the hand image here for proper layering. - this.addChild( handImage ); + // Add the hand image here for proper layering. + this.addChild( handImage ); - // Update the cell's appearance and state as the game state changes. - model.stateProperty.link( function( newState, oldState ) { + // Update the cell's appearance and state as the game state changes. + model.stateProperty.link( function( newState, oldState ) { - if ( oldState === GameState.SELECTING_LEVEL && newState === GameState.AWAITING_USER_INPUT ) { - self.setCellsToDefaultColor( model.levelNumberProperty.get() ); - self.updateCellListenerEnabledStates( model.levelNumberProperty.get(), model.activeLevelModel ); - } - else if ( ( newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK || - newState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) && - self.activeCell !== null ) { + if ( oldState === GameState.SELECTING_LEVEL && newState === GameState.AWAITING_USER_INPUT ) { + self.setCellsToDefaultColor( model.levelNumberProperty.get() ); + self.updateCellListenerEnabledStates( model.levelNumberProperty.get(), model.activeLevelModel ); + } + else if ( ( newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK || + newState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) && + self.activeCell !== null ) { - // Cancel hover when showing feedback - self.activeCell.setSelected(); - } + // Cancel hover when showing feedback + self.activeCell.setSelected(); + } - if ( newState === GameState.LEVEL_COMPLETED || - ( oldState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK && - newState === GameState.AWAITING_USER_INPUT ) ) { + if ( newState === GameState.LEVEL_COMPLETED || + ( oldState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK && + newState === GameState.AWAITING_USER_INPUT ) ) { - // clear previously selected region - self.setCellsToDefaultColor( model.levelNumberProperty.get() ); - } + // clear previously selected region + self.setCellsToDefaultColor( model.levelNumberProperty.get() ); + } - // hide the pointer when showing correct or incorrect answer feedback - if ( newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK || - newState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - self.cellPointer.visible = false; - } + // hide the pointer when showing correct or incorrect answer feedback + if ( newState === GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK || + newState === GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + self.cellPointer.visible = false; + } + + // don't allow interaction when displaying a completed board + self.pickable = newState !== GameState.LEVEL_COMPLETED; + } ); +} + +arithmetic.register( 'FactorScreenTableNode', FactorScreenTableNode ); + +export default inherit( MultiplicationTableNode, FactorScreenTableNode, { - // don't allow interaction when displaying a completed board - self.pickable = newState !== GameState.LEVEL_COMPLETED; + // @private, enable all cells for given level + enableAllCells: function( levelNumber ) { + this.cellListeners[ levelNumber ].forEach( function( cellListener ) { + cellListener.enabledProperty.set( true ); } ); - } + }, - arithmetic.register( 'FactorScreenTableNode', FactorScreenTableNode ); - - return inherit( MultiplicationTableNode, FactorScreenTableNode, { - - // @private, enable all cells for given level - enableAllCells: function( levelNumber ) { - this.cellListeners[ levelNumber ].forEach( function( cellListener ) { - cellListener.enabledProperty.set( true ); - } ); - }, - - // @private, enabled or disable the cell listeners based on whether or not the cell has been used - updateCellListenerEnabledStates: function( levelNumber, levelModel ) { - const self = this; - const tableSize = levelModel.tableSize; - for ( let multiplicand = 1; multiplicand <= tableSize; multiplicand++ ) { - for ( let multiplier = 1; multiplier <= tableSize; multiplier++ ) { - self.cellListeners[ levelNumber ][ ( multiplicand - 1 ) * tableSize + ( multiplier - 1 ) ].enabledProperty.set( - !levelModel.isCellUsed( multiplicand, multiplier ) - ); - } + // @private, enabled or disable the cell listeners based on whether or not the cell has been used + updateCellListenerEnabledStates: function( levelNumber, levelModel ) { + const self = this; + const tableSize = levelModel.tableSize; + for ( let multiplicand = 1; multiplicand <= tableSize; multiplicand++ ) { + for ( let multiplier = 1; multiplier <= tableSize; multiplier++ ) { + self.cellListeners[ levelNumber ][ ( multiplicand - 1 ) * tableSize + ( multiplier - 1 ) ].enabledProperty.set( + !levelModel.isCellUsed( multiplicand, multiplier ) + ); } - }, - - // @private, set 'selected' state for all cells in given bounds and highlight the multipliers (i.e. header cells) - setSelectedRect: function( levelNumber, leftBound, rightBound ) { - // highlight multipliers - this.cells[ levelNumber ][ 0 ][ rightBound ].setSelected(); - this.cells[ levelNumber ][ leftBound ][ 0 ].setSelected(); - - // set 'selected' state for all cell in given bounds - this.cells[ levelNumber ].forEach( function( multiplicands, multiplicandIndex ) { - if ( multiplicandIndex && multiplicandIndex <= leftBound ) { - multiplicands.forEach( function( cell, multiplierIndex ) { - if ( multiplierIndex && multiplierIndex <= rightBound ) { - cell.setSelected(); - } - } ); - } - } ); - }, - - // @public, @override - setCellsToDefaultColor: function( level ) { - this.cellPointer.visible = false; - MultiplicationTableNode.prototype.setCellsToDefaultColor.call( this, level ); - }, - - // @public, @override - refreshLevel: function( level ) { - MultiplicationTableNode.prototype.refreshLevel.call( this, level ); - this.enableAllCells( level ); } - } ); -} ); + }, + + // @private, set 'selected' state for all cells in given bounds and highlight the multipliers (i.e. header cells) + setSelectedRect: function( levelNumber, leftBound, rightBound ) { + // highlight multipliers + this.cells[ levelNumber ][ 0 ][ rightBound ].setSelected(); + this.cells[ levelNumber ][ leftBound ][ 0 ].setSelected(); + + // set 'selected' state for all cell in given bounds + this.cells[ levelNumber ].forEach( function( multiplicands, multiplicandIndex ) { + if ( multiplicandIndex && multiplicandIndex <= leftBound ) { + multiplicands.forEach( function( cell, multiplierIndex ) { + if ( multiplierIndex && multiplierIndex <= rightBound ) { + cell.setSelected(); + } + } ); + } + } ); + }, + + // @public, @override + setCellsToDefaultColor: function( level ) { + this.cellPointer.visible = false; + MultiplicationTableNode.prototype.setCellsToDefaultColor.call( this, level ); + }, + + // @public, @override + refreshLevel: function( level ) { + MultiplicationTableNode.prototype.refreshLevel.call( this, level ); + this.enableAllCells( level ); + } +} ); \ No newline at end of file diff --git a/js/factor/view/FactorView.js b/js/factor/view/FactorView.js index 0bdeb04b..a28883d6 100644 --- a/js/factor/view/FactorView.js +++ b/js/factor/view/FactorView.js @@ -5,44 +5,41 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticView = require( 'ARITHMETIC/common/view/ArithmeticView' ); - const FactorEquationNode = require( 'ARITHMETIC/factor/view/FactorEquationNode' ); - const FactorScreenTableNode = require( 'ARITHMETIC/factor/view/FactorScreenTableNode' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticView from '../../common/view/ArithmeticView.js'; +import FactorEquationNode from './FactorEquationNode.js'; +import FactorScreenTableNode from './FactorScreenTableNode.js'; - // strings - const factorString = require( 'string!ARITHMETIC/factor' ); +const factorString = arithmeticStrings.factor; - /** - * @param {FactorModel} model - Main model for screen. - * @constructor - */ - function FactorView( model ) { - ArithmeticView.call( - this, - model, - new FactorScreenTableNode( model ), - new FactorEquationNode( - model.stateProperty, - model.problemModel.multiplicandProperty, - model.problemModel.multiplierProperty, - model.problemModel.productProperty - ), - { - showKeypad: false, - titleString: factorString, - levelSelectButtonColor: '#FFC266', - levelSelectIconSet: 'factor' - } - ); - } +/** + * @param {FactorModel} model - Main model for screen. + * @constructor + */ +function FactorView( model ) { + ArithmeticView.call( + this, + model, + new FactorScreenTableNode( model ), + new FactorEquationNode( + model.stateProperty, + model.problemModel.multiplicandProperty, + model.problemModel.multiplierProperty, + model.problemModel.productProperty + ), + { + showKeypad: false, + titleString: factorString, + levelSelectButtonColor: '#FFC266', + levelSelectIconSet: 'factor' + } + ); +} - arithmetic.register( 'FactorView', FactorView ); +arithmetic.register( 'FactorView', FactorView ); - return inherit( ArithmeticView, FactorView ); -} ); +inherit( ArithmeticView, FactorView ); +export default FactorView; \ No newline at end of file diff --git a/js/multiply/MultiplyScreen.js b/js/multiply/MultiplyScreen.js index 8cd39aac..800711b3 100644 --- a/js/multiply/MultiplyScreen.js +++ b/js/multiply/MultiplyScreen.js @@ -5,44 +5,41 @@ * * @author John Blanco, Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const MultiplyModel = require( 'ARITHMETIC/multiply/model/MultiplyModel' ); - const MultiplyScreenIconNode = require( 'ARITHMETIC/multiply/view/MultiplyScreenIconNode' ); - const MultiplyView = require( 'ARITHMETIC/multiply/view/MultiplyView' ); - const Property = require( 'AXON/Property' ); - const Screen = require( 'JOIST/Screen' ); - const Tandem = require( 'TANDEM/Tandem' ); - - // strings - const multiplyString = require( 'string!ARITHMETIC/multiply' ); - - /** - * @param {Object} [options] - * @constructor - */ - function MultiplyScreen( options ) { - - options = merge( { - name: multiplyString, - homeScreenIcon: new MultiplyScreenIconNode(), - backgroundColorProperty: new Property( ArithmeticConstants.BACKGROUND_COLOR ), - tandem: Tandem.REQUIRED - }, options ); - - Screen.call( this, - function() { return new MultiplyModel( options.tandem.createTandem( 'model' ) ); }, - function( model ) { return new MultiplyView( model ); }, - options ); - } - - arithmetic.register( 'MultiplyScreen', MultiplyScreen ); - - return inherit( Screen, MultiplyScreen ); -} ); \ No newline at end of file + +import Property from '../../../axon/js/Property.js'; +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import merge from '../../../phet-core/js/merge.js'; +import Tandem from '../../../tandem/js/Tandem.js'; +import arithmeticStrings from '../arithmetic-strings.js'; +import arithmetic from '../arithmetic.js'; +import ArithmeticConstants from '../common/ArithmeticConstants.js'; +import MultiplyModel from './model/MultiplyModel.js'; +import MultiplyScreenIconNode from './view/MultiplyScreenIconNode.js'; +import MultiplyView from './view/MultiplyView.js'; + +const multiplyString = arithmeticStrings.multiply; + +/** + * @param {Object} [options] + * @constructor + */ +function MultiplyScreen( options ) { + + options = merge( { + name: multiplyString, + homeScreenIcon: new MultiplyScreenIconNode(), + backgroundColorProperty: new Property( ArithmeticConstants.BACKGROUND_COLOR ), + tandem: Tandem.REQUIRED + }, options ); + + Screen.call( this, + function() { return new MultiplyModel( options.tandem.createTandem( 'model' ) ); }, + function( model ) { return new MultiplyView( model ); }, + options ); +} + +arithmetic.register( 'MultiplyScreen', MultiplyScreen ); + +inherit( Screen, MultiplyScreen ); +export default MultiplyScreen; \ No newline at end of file diff --git a/js/multiply/model/MultiplyModel.js b/js/multiply/model/MultiplyModel.js index db0ade4b..148f52f4 100644 --- a/js/multiply/model/MultiplyModel.js +++ b/js/multiply/model/MultiplyModel.js @@ -7,95 +7,90 @@ * @author John Blanco */ -define( require => { - 'use strict'; +import inherit from '../../../../phet-core/js/inherit.js'; +import soundManager from '../../../../tambo/js/soundManager.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticModel from '../../common/model/ArithmeticModel.js'; +import GameState from '../../common/model/GameState.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticModel = require( 'ARITHMETIC/common/model/ArithmeticModel' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const soundManager = require( 'TAMBO/soundManager' ); - - /** - * @constructor - */ - function MultiplyModel( tandem ) { - const self = this; - ArithmeticModel.call( - this, - tandem, { - fillEquation: function() { - self.problemModel.productProperty.set( parseInt( self.inputProperty.get(), 10 ) ); - self.submitAnswer(); - } +/** + * @constructor + */ +function MultiplyModel( tandem ) { + const self = this; + ArithmeticModel.call( + this, + tandem, { + fillEquation: function() { + self.problemModel.productProperty.set( parseInt( self.inputProperty.get(), 10 ) ); + self.submitAnswer(); } - ); - } - - arithmetic.register( 'MultiplyModel', MultiplyModel ); + } + ); +} - return inherit( ArithmeticModel, MultiplyModel, { +arithmetic.register( 'MultiplyModel', MultiplyModel ); - // @public - setUpUnansweredProblem: function() { +export default inherit( ArithmeticModel, MultiplyModel, { - // get available multiplier pair - const multiplierPair = this.selectUnusedMultiplierPair(); + // @public + setUpUnansweredProblem: function() { - if ( multiplierPair ) { + // get available multiplier pair + const multiplierPair = this.selectUnusedMultiplierPair(); - // reset the problem and score properties - this.problemModel.multiplicandProperty.reset(); - this.problemModel.multiplierProperty.reset(); - this.problemModel.productProperty.reset(); - this.problemModel.possiblePointsProperty.reset(); + if ( multiplierPair ) { - // set up the problem - this.problemModel.multiplicandProperty.set( multiplierPair.multiplicand ); - this.problemModel.multiplierProperty.set( multiplierPair.multiplier ); + // reset the problem and score properties + this.problemModel.multiplicandProperty.reset(); + this.problemModel.multiplierProperty.reset(); + this.problemModel.productProperty.reset(); + this.problemModel.possiblePointsProperty.reset(); - return true; - } + // set up the problem + this.problemModel.multiplicandProperty.set( multiplierPair.multiplicand ); + this.problemModel.multiplierProperty.set( multiplierPair.multiplier ); - // All multiplier pairs have been used, so false is returned. - return false; - }, - - /** - * Automatically answer most of the problems. This is useful for testing, since it can save time when evaluating - * how the sim behaves when a user finishes answering all questions for a level. We need to be very careful that - * this is never available in the published sim. - * @override - * @protected - */ - autoAnswer: function() { - - // make sure that sound is off, since otherwise it dings for every solved problem - const soundState = soundManager.enabled; - soundManager.enabled = false; - - // answer the questions - const self = this; - const numQuestions = this.activeLevelModel.tableSize * this.activeLevelModel.tableSize; - const numQuestionsToAnswer = numQuestions - 1; - console.log( 'Automatically answering', numQuestionsToAnswer, 'of', numQuestions, 'questions.' ); - _.times( numQuestionsToAnswer, function() { - self.problemModel.productProperty.set( - self.problemModel.multiplicandProperty.get() * self.problemModel.multiplierProperty.get() - ); - self.activeLevelModel.currentScoreProperty.value += self.problemModel.possiblePointsProperty.get(); - self.activeLevelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); - self.activeLevelModel.markCellAsUsed( - self.problemModel.multiplicandProperty.get(), - self.problemModel.multiplierProperty.get() - ); - self.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); - self.nextProblem(); - } ); - - // restore the original sound state - soundManager.enabled = soundState; + return true; } - } ); -} ); + + // All multiplier pairs have been used, so false is returned. + return false; + }, + + /** + * Automatically answer most of the problems. This is useful for testing, since it can save time when evaluating + * how the sim behaves when a user finishes answering all questions for a level. We need to be very careful that + * this is never available in the published sim. + * @override + * @protected + */ + autoAnswer: function() { + + // make sure that sound is off, since otherwise it dings for every solved problem + const soundState = soundManager.enabled; + soundManager.enabled = false; + + // answer the questions + const self = this; + const numQuestions = this.activeLevelModel.tableSize * this.activeLevelModel.tableSize; + const numQuestionsToAnswer = numQuestions - 1; + console.log( 'Automatically answering', numQuestionsToAnswer, 'of', numQuestions, 'questions.' ); + _.times( numQuestionsToAnswer, function() { + self.problemModel.productProperty.set( + self.problemModel.multiplicandProperty.get() * self.problemModel.multiplierProperty.get() + ); + self.activeLevelModel.currentScoreProperty.value += self.problemModel.possiblePointsProperty.get(); + self.activeLevelModel.displayScoreProperty.set( self.activeLevelModel.currentScoreProperty.get() ); + self.activeLevelModel.markCellAsUsed( + self.problemModel.multiplicandProperty.get(), + self.problemModel.multiplierProperty.get() + ); + self.stateProperty.set( GameState.DISPLAYING_CORRECT_ANSWER_FEEDBACK ); + self.nextProblem(); + } ); + + // restore the original sound state + soundManager.enabled = soundState; + } +} ); \ No newline at end of file diff --git a/js/multiply/view/MultiplyEquationNode.js b/js/multiply/view/MultiplyEquationNode.js index 61a3d468..ff691ad9 100644 --- a/js/multiply/view/MultiplyEquationNode.js +++ b/js/multiply/view/MultiplyEquationNode.js @@ -5,47 +5,44 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const EquationNode = require( 'ARITHMETIC/common/view/EquationNode' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - - /** - * @param {Property} stateProperty - State of game property. - * @param {Property} multiplicandProperty - Property necessary for creating multiplicand input. - * @param {Property} multiplierProperty - Property necessary for creating multiplier input. - * @param {Property} inputProperty - Input property, which is the product, and is input by the user. - * - * @constructor - */ - function MultiplyEquationNode( stateProperty, multiplicandProperty, multiplierProperty, inputProperty ) { - const self = this; - EquationNode.call( this, multiplicandProperty, multiplierProperty, inputProperty ); - - // The product is always the interactive part for this equation, so set up the appearance now. - this.productInput.setInteractiveAppearance( true ); - - // Update contents and focus at the state changes. - stateProperty.link( function( newState, oldState ) { - - // Set the state of the product portion of the equation. - if ( newState === GameState.AWAITING_USER_INPUT && oldState !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { - self.productInput.clear(); - } - - // The input should only have focus (i.e. blinking cursor) when awaiting input from the user. - self.productInput.setFocus( newState === GameState.AWAITING_USER_INPUT ); - - // If the user got it wrong, the equation should depict a not equals sign. - self.setShowEqual( newState !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); - } ); - } - - arithmetic.register( 'MultiplyEquationNode', MultiplyEquationNode ); - - return inherit( EquationNode, MultiplyEquationNode ); -} ); + +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../../common/model/GameState.js'; +import EquationNode from '../../common/view/EquationNode.js'; + +/** + * @param {Property} stateProperty - State of game property. + * @param {Property} multiplicandProperty - Property necessary for creating multiplicand input. + * @param {Property} multiplierProperty - Property necessary for creating multiplier input. + * @param {Property} inputProperty - Input property, which is the product, and is input by the user. + * + * @constructor + */ +function MultiplyEquationNode( stateProperty, multiplicandProperty, multiplierProperty, inputProperty ) { + const self = this; + EquationNode.call( this, multiplicandProperty, multiplierProperty, inputProperty ); + + // The product is always the interactive part for this equation, so set up the appearance now. + this.productInput.setInteractiveAppearance( true ); + + // Update contents and focus at the state changes. + stateProperty.link( function( newState, oldState ) { + + // Set the state of the product portion of the equation. + if ( newState === GameState.AWAITING_USER_INPUT && oldState !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ) { + self.productInput.clear(); + } + + // The input should only have focus (i.e. blinking cursor) when awaiting input from the user. + self.productInput.setFocus( newState === GameState.AWAITING_USER_INPUT ); + + // If the user got it wrong, the equation should depict a not equals sign. + self.setShowEqual( newState !== GameState.DISPLAYING_INCORRECT_ANSWER_FEEDBACK ); + } ); +} + +arithmetic.register( 'MultiplyEquationNode', MultiplyEquationNode ); + +inherit( EquationNode, MultiplyEquationNode ); +export default MultiplyEquationNode; \ No newline at end of file diff --git a/js/multiply/view/MultiplyScreenIconNode.js b/js/multiply/view/MultiplyScreenIconNode.js index 73335129..c07b1eca 100644 --- a/js/multiply/view/MultiplyScreenIconNode.js +++ b/js/multiply/view/MultiplyScreenIconNode.js @@ -6,44 +6,41 @@ * @author Andrey Zelenkov (MLearner) * @author John Blanco (MLearner) */ -define( require => { - 'use strict'; - - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticConstants = require( 'ARITHMETIC/common/ArithmeticConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - - // constants - const ICON_SIZE = ArithmeticConstants.SCREEN_ICON_SIZE; - const SYMBOL_COLOR = '#FFF31E'; - const LINE_WIDTH = 33; // empirically determined - - /** - * @constructor - */ - function MultiplyScreenIconNode() { - - // create the background - Rectangle.call( this, 0, 0, ICON_SIZE.width, ICON_SIZE.height, { fill: ArithmeticConstants.ICON_BACKGROUND_COLOR } ); - - // Add the multiply symbol. Create our own rather than use the Unicode char, since this gives us more control. - const symbolWidth = ICON_SIZE.width * 0.3; - this.addChild( new Line( 0, 0, symbolWidth, symbolWidth, { - stroke: SYMBOL_COLOR, - lineWidth: LINE_WIDTH, - center: this.center - } ) ); - this.addChild( new Line( symbolWidth, 0, 0, symbolWidth, { - stroke: SYMBOL_COLOR, - lineWidth: LINE_WIDTH, // empirically determined - center: this.center - } ) ); - } - - arithmetic.register( 'MultiplyScreenIconNode', MultiplyScreenIconNode ); - - return inherit( Rectangle, MultiplyScreenIconNode ); -} ); + +import inherit from '../../../../phet-core/js/inherit.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticConstants from '../../common/ArithmeticConstants.js'; + +// constants +const ICON_SIZE = ArithmeticConstants.SCREEN_ICON_SIZE; +const SYMBOL_COLOR = '#FFF31E'; +const LINE_WIDTH = 33; // empirically determined + +/** + * @constructor + */ +function MultiplyScreenIconNode() { + + // create the background + Rectangle.call( this, 0, 0, ICON_SIZE.width, ICON_SIZE.height, { fill: ArithmeticConstants.ICON_BACKGROUND_COLOR } ); + + // Add the multiply symbol. Create our own rather than use the Unicode char, since this gives us more control. + const symbolWidth = ICON_SIZE.width * 0.3; + this.addChild( new Line( 0, 0, symbolWidth, symbolWidth, { + stroke: SYMBOL_COLOR, + lineWidth: LINE_WIDTH, + center: this.center + } ) ); + this.addChild( new Line( symbolWidth, 0, 0, symbolWidth, { + stroke: SYMBOL_COLOR, + lineWidth: LINE_WIDTH, // empirically determined + center: this.center + } ) ); +} + +arithmetic.register( 'MultiplyScreenIconNode', MultiplyScreenIconNode ); + +inherit( Rectangle, MultiplyScreenIconNode ); +export default MultiplyScreenIconNode; \ No newline at end of file diff --git a/js/multiply/view/MultiplyScreenTableNode.js b/js/multiply/view/MultiplyScreenTableNode.js index 7cbfe340..51620775 100644 --- a/js/multiply/view/MultiplyScreenTableNode.js +++ b/js/multiply/view/MultiplyScreenTableNode.js @@ -6,74 +6,69 @@ * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmetic from '../../arithmetic.js'; +import GameState from '../../common/model/GameState.js'; +import MultiplicationTableNode from '../../common/view/table/MultiplicationTableNode.js'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const GameState = require( 'ARITHMETIC/common/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MultiplicationTableNode = require( 'ARITHMETIC/common/view/table/MultiplicationTableNode' ); - - /** - * @param {ProblemModel} problemModel - Model for single multiplication problem. - * @param {Property} levelNumberProperty - Level difficulty property. - * @param {Property} stateProperty - Current state property. - * @param {Array} levelModels - Array of descriptions for each level. - * - * @constructor - */ - function MultiplyScreenTableNode( problemModel, stateProperty, levelNumberProperty, levelModels ) { - const self = this; - MultiplicationTableNode.call( this, levelNumberProperty, stateProperty, levelModels, true ); - this.problemModel = problemModel; // @private +/** + * @param {ProblemModel} problemModel - Model for single multiplication problem. + * @param {Property} levelNumberProperty - Level difficulty property. + * @param {Property} stateProperty - Current state property. + * @param {Array} levelModels - Array of descriptions for each level. + * + * @constructor + */ +function MultiplyScreenTableNode( problemModel, stateProperty, levelNumberProperty, levelModels ) { + const self = this; + MultiplicationTableNode.call( this, levelNumberProperty, stateProperty, levelModels, true ); + this.problemModel = problemModel; // @private - stateProperty.lazyLink( function( state ) { + stateProperty.lazyLink( function( state ) { - // set view for multiplication table after choosing multiplicand and multiplier - if ( state === GameState.AWAITING_USER_INPUT ) { + // set view for multiplication table after choosing multiplicand and multiplier + if ( state === GameState.AWAITING_USER_INPUT ) { - // select the cells that correspond to the current problem - self.setCellAppearanceForProblem( levelNumberProperty.value ); - } - else if ( state === GameState.LEVEL_COMPLETED ) { + // select the cells that correspond to the current problem + self.setCellAppearanceForProblem( levelNumberProperty.value ); + } + else if ( state === GameState.LEVEL_COMPLETED ) { - // set all cells to default conditions when the table has been filled - self.setCellsToDefaultColor( levelNumberProperty.value ); - } - } ); - } + // set all cells to default conditions when the table has been filled + self.setCellsToDefaultColor( levelNumberProperty.value ); + } + } ); +} - arithmetic.register( 'MultiplyScreenTableNode', MultiplyScreenTableNode ); +arithmetic.register( 'MultiplyScreenTableNode', MultiplyScreenTableNode ); - return inherit( MultiplicationTableNode, MultiplyScreenTableNode, { +export default inherit( MultiplicationTableNode, MultiplyScreenTableNode, { - // @public, @override - refreshLevel: function( level ) { - MultiplicationTableNode.prototype.refreshLevel.call( this, level ); - this.setCellAppearanceForProblem( level ); - }, + // @public, @override + refreshLevel: function( level ) { + MultiplicationTableNode.prototype.refreshLevel.call( this, level ); + this.setCellAppearanceForProblem( level ); + }, - // @private, set the appearance of the cells based on the currently presented problem - setCellAppearanceForProblem: function( level ) { - const self = this; - this.setCellsToDefaultColor( level ); + // @private, set the appearance of the cells based on the currently presented problem + setCellAppearanceForProblem: function( level ) { + const self = this; + this.setCellsToDefaultColor( level ); - // set the header cells for this problem to the selected state - this.cells[ level ][ 0 ][ this.problemModel.multiplierProperty.get() ].setSelected(); - this.cells[ level ][ this.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); + // set the header cells for this problem to the selected state + this.cells[ level ][ 0 ][ this.problemModel.multiplierProperty.get() ].setSelected(); + this.cells[ level ][ this.problemModel.multiplicandProperty.get() ][ 0 ].setSelected(); - // create a rectangle of selected body cells with a width defined by the multiplier and a height defined by the - // multplicand - this.cells[ level ].forEach( function( multiplicand, index ) { - if ( index && index <= self.problemModel.multiplicandProperty.get() ) { - multiplicand.forEach( function( cell, index ) { - if ( index && index <= self.problemModel.multiplierProperty.get() ) { - cell.setSelected(); - } - } ); - } - } ); - } - } ); -} ); + // create a rectangle of selected body cells with a width defined by the multiplier and a height defined by the + // multplicand + this.cells[ level ].forEach( function( multiplicand, index ) { + if ( index && index <= self.problemModel.multiplicandProperty.get() ) { + multiplicand.forEach( function( cell, index ) { + if ( index && index <= self.problemModel.multiplierProperty.get() ) { + cell.setSelected(); + } + } ); + } + } ); + } +} ); \ No newline at end of file diff --git a/js/multiply/view/MultiplyView.js b/js/multiply/view/MultiplyView.js index bb80a513..b60838d1 100644 --- a/js/multiply/view/MultiplyView.js +++ b/js/multiply/view/MultiplyView.js @@ -5,48 +5,45 @@ * * @author Andrey Zelenkov (MLearner) */ -define( require => { - 'use strict'; - // modules - const arithmetic = require( 'ARITHMETIC/arithmetic' ); - const ArithmeticView = require( 'ARITHMETIC/common/view/ArithmeticView' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MultiplyEquationNode = require( 'ARITHMETIC/multiply/view/MultiplyEquationNode' ); - const MultiplyScreenTableNode = require( 'ARITHMETIC/multiply/view/MultiplyScreenTableNode' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import arithmeticStrings from '../../arithmetic-strings.js'; +import arithmetic from '../../arithmetic.js'; +import ArithmeticView from '../../common/view/ArithmeticView.js'; +import MultiplyEquationNode from './MultiplyEquationNode.js'; +import MultiplyScreenTableNode from './MultiplyScreenTableNode.js'; - // strings - const multiplyString = require( 'string!ARITHMETIC/multiply' ); +const multiplyString = arithmeticStrings.multiply; - /** - * @param {MultiplyModel} model - Main model for screen. - * @constructor - */ - function MultiplyView( model ) { - ArithmeticView.call( - this, - model, - new MultiplyScreenTableNode( - model.problemModel, - model.stateProperty, - model.levelNumberProperty, - model.levelModels - ), - new MultiplyEquationNode( - model.stateProperty, - model.problemModel.multiplicandProperty, - model.problemModel.multiplierProperty, - model.inputProperty - ), - { - titleString: multiplyString, - levelSelectButtonColor: '#D8F58A', - levelSelectIconSet: 'multiply' - } - ); - } +/** + * @param {MultiplyModel} model - Main model for screen. + * @constructor + */ +function MultiplyView( model ) { + ArithmeticView.call( + this, + model, + new MultiplyScreenTableNode( + model.problemModel, + model.stateProperty, + model.levelNumberProperty, + model.levelModels + ), + new MultiplyEquationNode( + model.stateProperty, + model.problemModel.multiplicandProperty, + model.problemModel.multiplierProperty, + model.inputProperty + ), + { + titleString: multiplyString, + levelSelectButtonColor: '#D8F58A', + levelSelectIconSet: 'multiply' + } + ); +} - arithmetic.register( 'MultiplyView', MultiplyView ); +arithmetic.register( 'MultiplyView', MultiplyView ); - return inherit( ArithmeticView, MultiplyView ); -} ); +inherit( ArithmeticView, MultiplyView ); +export default MultiplyView; \ No newline at end of file diff --git a/js/phet-io/arithmetic-phet-io-elements-baseline.js b/js/phet-io/arithmetic-phet-io-elements-baseline.js index 09779497..0fb46dab 100644 --- a/js/phet-io/arithmetic-phet-io-elements-baseline.js +++ b/js/phet-io/arithmetic-phet-io-elements-baseline.js @@ -1,3 +1,4 @@ + /* eslint-disable */ window.phet.phetio.phetioElementsBaseline = assert && { diff --git a/js/phet-io/arithmetic-phet-io-elements-overrides.js b/js/phet-io/arithmetic-phet-io-elements-overrides.js index cedf0757..1985c30f 100644 --- a/js/phet-io/arithmetic-phet-io-elements-overrides.js +++ b/js/phet-io/arithmetic-phet-io-elements-overrides.js @@ -1,2 +1,3 @@ + /* eslint-disable */ window.phet.phetio.phetioElementsOverrides = {}; \ No newline at end of file diff --git a/js/phet-io/arithmetic-phet-io-types.js b/js/phet-io/arithmetic-phet-io-types.js index 03cd1e2a..105613b0 100644 --- a/js/phet-io/arithmetic-phet-io-types.js +++ b/js/phet-io/arithmetic-phet-io-types.js @@ -1,3 +1,4 @@ + /* eslint-disable */ window.phet.phetio.phetioTypes = assert && { diff --git a/mipmaps/divide_level_1_icon_png.js b/mipmaps/divide_level_1_icon_png.js new file mode 100644 index 00000000..36054083 --- /dev/null +++ b/mipmaps/divide_level_1_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 109, + "height": 304, + "url": "data:image/png;base64,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" +}, { + "width": 55, + "height": 152, + "url": "data:image/png;base64,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" +}, { + "width": 28, + "height": 76, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAABMCAYAAAB+g9djAAAAAklEQVR4AewaftIAAA4lSURBVLXBCXxU9YEH8N/7v/97M/Pmnkkm90USDGASIKBCQEGleK6tt3alltV+tn6suqzr6m53NVBdD/BCwSpFV8XWli4tsSiCFBWi3EdCIJAhYRJgkskxyUxm3rxzJ3TSnU86mQQ/n/1+WVwkXddp7YJ7tz/08OMLfvXOq3/ERWJxka5evOTTtz5svLa1rXf6yheXT3lv/esbcRFYXISdu1vr3/mo8fpgWEF/SMbpM/2Xrn7t2enr1732MSaIYIJ0Xb9r996Oxb0DMkacC4jYd+jc1bquL8YEsZigurq6Y2+tecnk9wcv8/eIFHFzpmdEltw5499tVuNHmCAWF2H16y998c5bL2EwGK7NzxKU++6Y/h9F+c5X8f/N2977z8dP+n+O74BBGixv+PFNlxfPK8yyFjIMGFXV9dazwVPbD3bsUGVpI74DBimwHP+jf7mrZoXbZiowmziMNjAUQ/+g2PLV0Y4N3zadXYGLwCKFRbOKnqwu89QKRg6pGHkKh9WYUZbvXFiUbb/6SFvfLl1T+zABLEZ54ObpX8yekn1zdzACh8WIdHjKIstpLirJtt14oLVnv66pHRgHQRLBbLq3LM9xZTAUg6wZMSTKGA8hDKYUuUp/+ndV6yjHuzAOFkmW3lj5mttmKqWUoCC/FEOiAsrICAxEQU2ZMJg9sDpywRrdMFmz0OrrQjAUksSYEnLajAW5bnP1kdbuDUiDIoHleGu20zxTlBQ4LEbIioSqyllo9vrw93fPg4HnMKLDH0CW2wFN09HWekBd/v6eSwHUTsqx3cDy/OWqJO3BGAgSBCN90G4x2MWYilBUxczqGpQV5cFmtWAgNIRkTSfbcbarF1VTK6DAYJpS6PyJKku/PeXruV+VpD1IgyDh6ur8KUaeQtE0VM9YgIIcDwSTEWWFORgMRzBMkhV8e+Q4rppdCY/LAZfdih/cdCs8bucNmCCChDyPpQBxHocASilGTC7OR1lRLobxHEV2hguCyQizYMSwDKcdi2tnTc9y25ZiAggSNE1XECcYORw73oSxFOdlQVYUxCQZIzKcNnrPtRVPsRxvxThYJBgN/JzKSZmXIU6VQtCoAx63E8MURcVxbweCg2H0h8Lo7g3C43KAEAbDvO0+WGnE5XGY5je292/UNVXCGFgknO2L0tppuXcbecpQlqDd1w5PdiEsggmEEHjcDridNrjsVnhcDhDCYMTR5kZQiMhymQvL8xzfbzwT7JFl+RhSIEhQZam+PyyeQoLDTLBt2x9xsq0D6QyEhhAOnsUwyhKYDDRTkpR+jIFFEsHEF5bmOWpZQjDMxBO0tbWg9VwEk4sLQAgDVdWgaRoIIRi29ctdENgIdF1Hu3+g640/HHkkJsY2YwwskpzpHvrz1ELnD102kwtx53uHUD1jIeZfVg3KsojGJLS0dSLDYYOu69i2aw9iQS+GRFltbu/5au3mxiWSGNuONFgk0TVV6+yJhC4tcV/XOxClgpEiIgFOhwtWswCOsshyO3CuK4DNn/4Jvd1tkc5A6Nu19Y0rGo52PKZrqh/jYDHKYFg8bBWMOQBmuW0mhlHDOHriNGqqqzGi4dCxjvW//3zNpt3ef9h7rPMVMSYdQgq6rldet/DuNx772eNz1r792lbEsUihxde75WhbX++OQx1Htx/0fbTrSHvT0tu+N8/AcxgWHhKDb378+b2qLHUjBV3XK6+Zd8eb9R/veW7Dyr0zTE4yafNnH6yvq6uLUqTw6lPGtTyH66rKmd7uPj1AGGZeoC8Iq9mECxipaOUyUr95p2FvOAr94HG9U5Wl1UjYtKHhkw9e3FMIDRfs2Hgy64qrLvkFgIdYjMJyfN7zj5I3589kcgbCyF0wmynrCYLnaASEnQqe4xCNfI3Sgtbif13K1D5wK1O7eC65fstu4gsPqYcR9/iyJ2c1bD1Vpau4QIlp4O3Iq9/64VqCUZ75KfnF5GI4LQJgNACyAlSUAFZhD4ZC63Cq7Q+YOWULCMFfUQq8+gR7FxJm1ZY/s/DO8iASrJk8bA4T4q5nkYTl+LwXl5FXcj0QEOeyASwLCEZAjAGq1oXZ007C2wHkZwFGA6AoAMMANgsy3v49eVfX1KG6urq+Z/7z6armxs7Kq24t89338Pz1C66r/j7DMI0USf7rEfLC1FK4kXAuANjMgN0KFGQDoQhwoBnI8wAOKwGggWWBgRBQUgDHfTeRJ97bhMcRN3v+5KeLy7I7MnNsP2cYRkECi4TSIsMDzz9G/sllB4eEVh9Qko+/MnBAbiZgsS8G43kWCG8EwwDnAkB+FpDpYqzvblLWIq6urq7v5ddfbgl6Dy9ftvS2FZKiVbWc9m2hSJhbDY/ZBBOSUBZ/i50PUrwGUGPQ8Rc8hwsKczCN8vzt0NH81jMPrysvyquxmQX+6wNNDZ98ufdVxLFIONqifl1RwtWUF+ESnsMFgT4gy43/w84DmfQeGEMOoIWh972BYb5zQJYbaGxdxNx785JbL6+u+Nnc6VMLsjNd7NmunqHPdx/cWpznMR33+g4SJPmfHdWn9jU/gX3H5uNAs2Vg3zG9DSNIDZjit8EYsqHLfoA1YgTHAbsPz0BB7m2YXFxAp5QWwm41IypKOBfoNd9z04KHAGYK4iiSLLrm6prCvBJQthTLXoisCw7sk++7mXmS48rBlLwPIhRDG9wHxlINQMMIMab3nu+90l1WQjGsp28A/kAfNE2LOKwW5enVH27Y23jybcRRJEwtL/6JIfe6uVvbACMTxuJ7nq+tmprZdD4wHYU5XuhnV0GzXQtdOgNGqABDrQCTAeg9MJuYsCQrvt7g4Ayjgcf5QN83boe14Mv9TZt++ev6R5CEIuHJZY/ecsQX4Y55B/EX4Ss4ypntNnQBWhbE9dDF9YDhbuiBTdCiJwEQDGMYMD9+auVMluOXlBflZp9obX8RY6AOh/2WX614dEX+pEmlv/kmhGRZHktHqBcEQBZGSDuhS5OBoZcxgmFAEafK0vsnWtuRDnn20SVrBKOhkKUWIRoOQBIHoCoxDCsr8bQMhuFHMt0PDC5HMp5DBsvxFBNAH3nul3eAgfedF1Z0PneXkZ5sb8eR1jC4jCpUlGd82/Cxng0wSMdkAM8AcwF8hXEQVZYaoMNqYUL+Q8e9Yafdol81IwuVuf17AdQbDeAxjgwnkJ3BLMAEMEhCOb4GYJw6dAuAraosRXdvMB25vBJVGMfyt/R1y9eID2IcFEkUWTqAJJTjL3HaUIEJmD2NKcMEsEiDYdkBSat50G4mNo8rBErxN/oHgd9uq8LqTQXeDp/vfYyDIr2aAbU49793TsW6z4JYWNmN8oIzyM3oRkyiOHRqCrbsL4HJbEdmRk8eJoAijfy8vNsFs0AIQ2AQXGjwutDgrYCqqgADsISFyYwLKOUKKce7FFnqQxoEaUyePHkaYQiSKYoCVVXBEhaKomCESTAJLKU/xDgI0hAEcwlGoZRiIDQARVHQ29eLETzHY1ZNzRUYB8EYWI63cpQrQAoMGEQiEXgyPUjmdLoqMA6KMRgNhvtNgsmMFBiGgc1mw2gG3lCMcRCMYebMmgU8xyMVTdOQCs/zLpbjb0QaBGNwOZ1VSEGSJcRiMT9SEAQBxYVF30MaBClQznCLSRAmIQUxGo0pinwAY5hUOqkCaRCkMHfunKVmwUyQgqwo571ebwvGIAjmfKRBkJpVVVWkIoqir7Oz87AYE5EKS1g30iBIYXdDw41n2lp3RyJDGM3v958E0KDICkaTJAmBnu4dSIMiBVWWorddVemvnTENzac74e8Loen02UBja+eWxqbGdwH4/F3+zzPVjMs5jrPrAOwGBoP9XZ99/dWX9yINijE4rBaP22nD/Jqp8Pf046u9B17Yv2/PKiR8uXPHYsrxD29f/9xqu9UMl92Kr/c3sr/7ZBvSoUiBcvyU/OyMmUjyyc59jRhlUe2MkhyPGyYDj2H7j7X6MA6CFO7/waKHinKzzEgwm4yIK8Iod19/5TSTgceIPUdP9mEcBClcM6e6mmUJRgxFRcS1YRSOUoqLRJCC3WLORJLu3qBXlaXtGKW7L9iPJJIs6xgHQQo8R01IUFQVX3xzaAdS+HDzn1sUVcWIwydOaxgHQQqEECMSfOe6w69vqH8RKRxuOV0f6BvAxSBIgaOsHQmtvvP7VFlqRQqKJO0JR6IBxMmygrgYxkEwCsvxlRylRsQNDkXwzJoPNyONqCh1I06UZMSdxTgIRmOw0G4xY1h3T3/f+e7+N5BGaCjSjbhoTAIDGDAOglFmOew3bK7fgda2TvQNhL2qLCkYA8vx89rbOi5B3MYN9XgiO2cly/HZSINFEpbjK5Y43Ksqz/YzzWYOTV6f9u3RE69gDIRlC+bJeDRwvhv+bxpxCWekNpb8qEvXZ0XBBHRNPYNRKJLMFMyriw0GIus6Ypt3walpOtIggC8/GIXnm+PIMgg4J8uoFsyZZUbTnafF6C0ejju4qsv/tCpL25BAkFBitvxmodV2rahpOB0TUWU0oS0mxpCGDqaqU4ohrGnQAeRyHMoMRpgYgtucbsN8i23Ov+XkPokkFHFVVvvDy7JzbnezFMNOiCI6ZRlbBgZ2IQ0d+o4uWf5Tj6JMlXXNVmgwuu0sCw/HYYSBIZORhCKu2iT8o5ulLBLKjUZ80BtQe1Xld0hDlaXomvOdNyGO5XjTnU7XKo4h11pZUmhjqcFICM7ERBFJKOI8HCc3i1GUG03QocMriigxGA6rsvQpJkiVpeivu/0PIY5yBpcO/QoAmQA+RRIWcU1SzH+ZxTqzUxJd7bFYRIK+b1WXf5muqR34DjRNjeqaekrX1CO6pg4hyf8Cg+aV4P2dhSsAAAAASUVORK5CYII=" +}, { + "width": 14, + "height": 38, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAmCAYAAAD0t6qKAAAAAklEQVR4AewaftIAAAVtSURBVHXBe0xVdQAH8O/vd37nnPviPrjIVfHiAEFBmiQRSkWvZam9sCwra/bYwszyj562MqutXLm1sq0H2ZwOsWkP5nojWOlioZMS0oQBXhRC3lwu955zz+/XYTttZ3f0+Uj4H7tqjv9we9Vjaw5//ekBzEDCDPZ+3rK3vuF8Vef5iUXbX3kx++CBj+qRgmEG5aXZ+9rODl1LKeGVFXmfYgYENlRWSjesKFztcjDXvCvW9dxx14NnCwtmH8EMCCyVJdmP3laR94HbqagwJQ2O6JTW2XFh9O3dh1s/QgoJJpfLsWT9TYW1XFCPS2WYRimBQ2Hp6WmOG3PnBrSWM33HYcNgerKq5GmnyvyBzHw4FBnheWFwDgyPjqD11K/djJEbqCzXcV2PwEJh8nvUEsmRgcply5AZCiMnHIYsK1i4YAHmhIul9w+eWMl1PQIbCpNEid/nccHldKBoQTYoJQhlBOB1O1GUn5dfXbX0ZaSgMCUNMZCI9uNcVw+EEBgcGUcsngAhBIQIkp/lf6b6zqUvwIbCdHEw2gACnG5tQmvbGQT9aQh4PSCEIBLpBiXEocrUBxsJphPnBpuWF81Zp+tGRk5eEQI+L0bHJtByqtXo6vyj/WxkaPuHX53aARsGE0/q/Pcz/c9nZ3q3Hmn6HrkPPXKlnjTG3vy4bl1b18B3MAkhQrU1ja+PDk+WPvHcrVdLsHz8+uSmspKBysWLetO1ZJmLUMNRdeN3ZZvuYw991UROXrZg1aa9O5qf6G4bmUPdupPBRJnszQvj7jQ3MmQGdEZ2IZDmg9uJhYYBHNwpbbzqztLnjzeeXccNEZcVNi7B1PSZ8uGiXFwTnQScKhD0T4KLAAIZKxCdaIPXA78v9+W36g7V/PVPx/7Bz7/cc5LB5FThFhwwDIAxmMIIFu8Hoq2AOABGc3Nqd97R0PtbbenczIx+Ifi3FKb65odb27u34afm9CYuAiDhAyDO2YDkgQD0yKX1ZGFO+AZNT3qisSkvoXQWg8kz7+a1dackpAf3BcajqzX/QI0ivNcB2gBkhtjwGI4Ao6TrQn/Hxm3vPQsTq935YvO4nCxu+DuK0iJFSSbFIBK752K4CzAaQQjUVdXb7uZJncOGrn/hnQeCpD1+/5I2keXqaeccUUwzGjHNqcIRSic3IwWBSWJyFgjJAtB1sYF2Bv1Ig82+w3h1w9b4dthIMAnOJwQ3LhBKgx7/ii1OxcMUaRzDYwF8/Us56o7mnO7s6PgWNgw2y8rL7+sZmeOo+XEuksliUEpBKYXXO16EFBQ2odDsywkhmKbpGuLxKUyTmZyLFBQ2qqoWwsblcmOaJElZlMkLYUNhkZhSxCRWAEsiHu+DRVEUeXn5sjWwobBcVVGxXlEUJywT0YljnHP8Z1ZmZiFsKCy/Hj/2Skk4rTs7XYWemLrY19d/KBabHNR0DYY2NTo0dOkb2FBYCBCoXFrgW3v9EvR1t284/WdrXW/n6S3Prq3A5qrll375+ec62FBY3t36eHXA6wlIlKKh+U8Npup7VxX709wQQkSRgsJSMD8rjxCCaCx+nuvaUZjaOnr6hRCYCYVFVWUvTBcGBhtheXv3oS8mJmOaEIIjBYVFleVgNDalb3xt1yewGLoeSRp8KKEnE0ghwUSZPKtgYOSNIVWe2lffsBkWKsuLr82bv+X3PfXzfZoROqfrfwnOR2GSYHogI/Ngfty4bOLkmcQPoyM7YJEom7UyMvLUPJ2TkKKU3ebzb1js9owdGx9rofdkhF5aEwjeEpAYejXtHGw4xN8tk9FdzbHo0XHDmKSE+LjAcphYSJYTPVpiiguREAS1sOFJPflBX+9mmCSmOAVEGYATMP0LnHMvy+XhVz8AAAAASUVORK5CYII=" +}, { + "width": 7, + "height": 19, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAATCAYAAABcFRdeAAAAAklEQVR4AewaftIAAAIKSURBVC3BXUhTURwA8P899+zjbt4tbdN9eLVcsK3aEiqVslUStCCKZBiyJ0XwIfpGIoLoQcIXX8KHRlCSLxl7iCAIemhuYoUJrVIXsprNcaVW3LbdO9O7nU6w34+Fmqmn7/scrjPPr18byUWnI8tAIaAYrHGm4hPm7Wb2Q+CQax5qGI7T2W+GO2ctZq5tS62US8rmo1sP4heAwjf6D1507fK3OezNAMBwiTeJVgZjM1HVP0inYS31ZhMIDjs4bY2wx+PxD5/2tQOFsj+K0aXPbxWpUABZUUgumy7pNKweKHY+JaaH+0lnnbHVSkgp3dL8OPJdGjt75MC5ARyb1IX8bjEIENFWwdugKDBi5HUPoVpsYkPB7h4j5w00Oo7rDcJVkHJr/DajxYcgJ+JsebDvVbx+c9Q6tsEhgx4heW49//vZ+Suj47gBfZvZza9+hcpCL5QX9LwBUOjSzDhQbPRl7HVe+SvJWx1DvyQnMx3bV559tzgBFAZKEFpOfRFNKJnRA2axwLDYQipqHgGl1Wi74D9CRIwxFzwZDAGFgAof84qH3dYVRZGnAl5bsVQqzAGFgNrptHr2u4XlHp8j2bV3h5KIxz8ChYCqVAmfyqw9uXz3/gu5vCFDDRu2Ng2o6z97B+9NhhFibR2SfPuoik60G+uWUDdvGqouZlaBqhKS/ZRcucMAKBUCrf8AuajFmsOCygsAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/divide_level_2_icon_png.js b/mipmaps/divide_level_2_icon_png.js new file mode 100644 index 00000000..43ebc5be --- /dev/null +++ b/mipmaps/divide_level_2_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 119, + "height": 306, + "url": "data:image/png;base64,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" +}, { + "width": 60, + "height": 153, + "url": "data:image/png;base64,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" +}, { + "width": 30, + "height": 77, + "url": "data:image/png;base64,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" +}, { + "width": 15, + "height": 39, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAnCAYAAADQKRIRAAAAAklEQVR4AewaftIAAAXnSURBVJXBeWxT9wEH8O/7vd+zn+/YzkEOcBIn4T66CMpKQos26AVZL9pCS2n/2NEOddnGhKYxtsCYtrUMpNKuBRV1RYhBprVsjBQCbUhTKEkoJCQkJocJTuKcTuLbfvZ7e0wP6ekJTdrng7uGBwJV+B/OX7z1es1bF26dquvYBRW2ucmz8dC++mNPbdhSdfDdfcMH/7K/Byqt131vHjrWfsBzO5wlJJPzmj4/eqKmpiYIGblwum2n9+q04etP76xorL+xDRrlSwvem5Nnug1FT//EKihIYWl2k2uZLehebp989qXKX0PGUm4hodwcyBiGSVWunP3n5x51nfzDznUrytxZJ6BgIBvoHX2kp3toydljry/Oshs3UpbYJElKJ1Oib3QycvJAbcsO3AcDxbZny3+TYeZ35DhMBpYwuCedFiX/ZPj0749eroIGC0VVRekhhuVncXwGHM485OQWg/IOjAdmwDIpKcPCu7oGJuuhQiEjlFvFMIzbXTQPRUUlMOh0sJiN8I9Nwml3MH98/8jHF6753oEGgaxycf5Si1HHuovcKMjJhN1mhiCkMDsvG2XuIjy+ZvVGMSWEoUEg8/pnhiRJQldXOyRJQiiWRMiYD9+UgLsyjGTZLzavPA4NAtmdkalTsUTKFwsN4cvLl6BjGeQyARQ69YgnkghN+5ksm+Gx4nzH41ChUPgDkZMGPf35+OQE0qKIcDSGdDqNK63NUigS6WzvG9vTPxSoa2nybLlx7fYLr21bt5mF4krn8Ln8bEuFWZc2GM2ZUkFujv7K9Rut/6o/v+vdf3zzg07vROeRd84dP/XxN79s+3x4HrWkLQQqGzd44k8+eqWfsr2CJEnIdkbzdv/sztoT+/idkOXk2doi0wKVRMDbM/ZdFooPd/M/fKKSqeb1cFlNN42RKIXDet5S5oouisax6Mgp5sCxv33Q+KMfv/FkWXn2V1vfWFvNQNH3Gd/mysOSqSBgtwJjAYA3rYdVfxrjAaChFbs2bY/vIZTTMcD30imhlkJmy9CtsplRAllSwH9lz3oJpHAPxFunIQGYW1T2/OHffWfBwtLCNQPDY3Wbfrq3lkA2PZVoud5T3dHrqwrH4vCDew6kcC9ArQAc8I24RZPpJ4sWlLheZBkmZ9A/PhcyClkwFN/UPL12xeWRWLiidDkKpUsQ/UdAnE8DpAgp0dweiSWyvL4Rb5unv3nfR5/sh4zWvLn1maYzZ37VeDUNmXm23e6rTNXlIlQHMX4dEK8iKwMjZU+cfQAahNdR/fD49MjLD/TgwVn9iMDWgnuEf+IuPQcH7oPuePvD4/NLv/C/8FjFKmeGNVXMHM6BBschC/dBIevq6W/4bU9/A2S7qyuPZtjsWFh8E0ZexOikA2culVmBBmhRaHT6C4oH6i1ICYvhNMcRiBohiqLdbLn2cDg0cxEqBBosS12QsZTCNy5CSAngOI489NC3N0CDQMVitVVSSmdBxjAMOE4HXs/jLpvVthgaBCqrV69+keM4FjJRFCGkhCAUHKcrggaBitlkeRgKQUjGCEM6oCCEyYUGgcrExNg5h4EgmUwikUj0xhNxvyRJkCQJiURyiFBODxUKlWcq5oc3rFmJPp//5pot25cQylkP764umO+e/WDvwNC/a2uFBFQIVL61oGQdZBajIQGZmBKCS+cWmgpynJgJR6agQaBi0OvyIJucDvZBIUESIJsJhePQIFAhhJgisXhy/18/+QCKaDRxB7Kh0ak4NAgULNUZGIYxB8PRm581Np+HYnB0vBcyj3cwAQ0CxXqbbbunrVs3ODLugUrDpxecHV19WD448TKhXClUWMgI1ZVtdmb+Sd835Oj29HsbB4ePQ/EaNb3Kt3TPMzHEtcRo3Pq0M3PZ2enA3yEjkL1VMOe9Up4viYZj+Krb2w6V5nC4tSMWbY2JYnSOTmflGfIUoZwVMgpZTBJzU5KEUDo9cjEUOgiVo2P+vQD2spQrfyUze72NZSUxJQRxj0NvKP9+bv52k06/FP+H/wAZ32hNBjcIJQAAAABJRU5ErkJggg==" +}, { + "width": 8, + "height": 20, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAUCAYAAACwG3xrAAAAAklEQVR4AewaftIAAAJQSURBVHXBW0hTYRwA8P/5vu+cnV3Szct0082hjGkpEivSFYQKFpoQ0UMRMexBerAeSiQJCh9SlAKNpAwrKyUoDSpQhxUaWPNBwUs5OXNkIZa7qLnL0bmtLziv/X64tenlnZPV5/cOf3jhBOpm2/v7VtvZ9s9jfX3Nzc3byP8rVPN90XcGYaJlMEmWy8lqLBb3Cx6fCShm2f0798ntS61qLnAKGIiKYnToWvf4aZDgzq6OpBpbbqc53yozGi1seDvGsRB2u5b9bqDIQUuGWZuWrigwmyG4S6CQJZmCZyEZJHjFu+U5sk9dy8k1aq1GBYuCKxrc9P6sq39qHnjTO4eBOlGB0pW83MTLU3dj8Xu3eOMD79vHs11rAS/BQPW3R7oMmd/yMA4pTDrPUY/Q16nJq/XbL1Z2YINBn2OvOXBFxquwtvghjqwNIgZfLVNxgZxCW3kbenS3+0LLcH3yplgaTviHgEHpK8GIzDE6Md0IFFkUPH8sio0pBREUEOxRcwRkFfbGOpDg4dGRLyPjYz1ZhqKGnahO82mmgP04udof3dneAAoDpdqTZNLorE3TbhVZWU/Cer1u1eVamAAKAXWs8ngdIYSPxeN+hBAolcr9IEFAGdV4qbxIHxZFsbfQoN7SqsgSSBBQ56oOl1gtRt/rwVcNVSX5kSwNOwsSBBTHstqwKDqBiicSvqn5pRBIMIPZtOLo7vUfvvXRocmZcRsvv6xwfi2tTkkNOjYC86gl23ADTQvZA8/eTQI153A+5xEKMQk4BP+kcHyWPUNXBv/xFyuP3+N03WZNAAAAAElFTkSuQmCC" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/divide_level_3_icon_png.js b/mipmaps/divide_level_3_icon_png.js new file mode 100644 index 00000000..865e5366 --- /dev/null +++ b/mipmaps/divide_level_3_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 142, + "height": 310, + "url": "data:image/png;base64,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" +}, { + "width": 71, + "height": 155, + "url": "data:image/png;base64,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" +}, { + "width": 36, + "height": 78, + "url": "data:image/png;base64,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" +}, { + "width": 18, + "height": 39, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAnCAYAAAACeRhJAAAAAklEQVR4AewaftIAAAaQSURBVIXBCVBU5wEH8P/73nv73l7sciyX7HIsSBTiiRWFRCDxrNrYxtTOGNO0tmkzaWyTdHQ6kZFq4zieyaSJZJh4TB3teKDxGDGGYOJ4RDAqCILIsSA3LrD37nvv6zqzmaE7S/L7MfgJu0pP1Q8POI2CyPXMK5l8dPHKvH2IgOAn9HWNpj64OpRy93Lfz0AZLSZA8CPGRtzLB2wuPYLiMtR00cpZNZgAix/xwfZtrowppk6diXQlWYzdefOzdiKk/n7vsrRnVpx5971N8pHDH9cyiIBwPPn9spzSlDj9LIZAdHkCXWeuPTr8oH3wCoJqrrauO13VsutBu9OUmaKxr3tl2hsspXTK7HmvbMibv2bjyf/u79z+wTbbb5fm7svNiNsYpRWyNSJvNerEmdMyTL+elhlvuVb/+NyS5a+vq20YKvb6FeJ0S+pYIw+W6J5vrPyyc2lblzNTzcsjnq7L6mnW+B0+mWM1AoEkK/AFJDBgeKNOmJWbYTK/s3nzW3/d8E7m4LDn2YUFkyrXr527mi0seXVNz6A3CUFakfgSlFvZoorLzcrOg9aQjDl5hbBm5kLhDLjX2HhzxOnrudv25N6Zk+WHDlbsGl6+eOp7CGLXrH2zQJHkrNRkbUvqJP3tQG/17KiYVFNxwXwoFIiLNsDh8iDRFAvC67gt5WeXKVJgGEHln+65hRD23OmKtqUvZG19cUHmri8qK84vzEv7m8DzMVnWyYjSazHmp+DUBghEAUuoLpobsVxveFyJMGxZWVl/WVmZGyHPzzC/pFXR9FGXgqjoOBgmzwMfFQd5tAcjdjt8zt6cqalx5uv3H5/FOBzCPOweOW7QCkX93Q3EJ1EUCBzcHh/UggqtrY3w+KThgTHXtwiqu/7wN2OjLn3xkhmfsQhzr3Wgds6UpCKfX063ZmQjMd4Ej9dHL3x1ubent6Nqx7Ha9Z9+9nV8VnJRedXx+rdG7I4pNTdOfswigqsNfXe1Aps4NNzakjdjbrbH6xurOLX3FwfOdu6RAtLAS8te/dWlo01rHf0BMvrEG7Pzo60+BhHUHRdP6TVYxRDQUdfbDCEiNKqdLkqpt+Ik/cPug77K0rePtNZX91uz8mOG5i6wfs4hTGICn5eazLwgqihYFgw7+BFkGUiIhdbrg/a1lcy63QdRmVeYcSgrJzFt7R9LtjAM00UQ5uIn7DajnkY53QDHApYkID3FDE3s3yErQFwMCliOV9+9un9Y9NaYXl6yIA9BHMJ09TENlqSExb5An8IwIEA0GPMxQB6D0rUTklxk+uKTwgeZluRJja22NlFUUQRxCNNML5R03LSjf2TMtnHVpTRNyp/AqJNB3RSEgafPvkhIiBVSOh73u/yBQN+x81dsCOIwzuQMS4Gtx53RYpMAaNJc3hioe/8CangDoAGwLPx3mmxbNaLAfd/0qH3PgRP/QQiHcfaUvrvvwh27QQcHBEM8qNTWD9qcgLEDgFIPwjDaP//z3/sVKWBHGIJxni1Z/bti66PGl2d3d8/Llq5RqdqBp5R6PKXVUO65WWQxImAwAcLxsR0XOVtyPNUgxB9gcPC0bvubWwf/gTAcJsBznLX00CpVyXQ7ss3D8Ph5XPjOjOYuXzxQiXAcJlBQULiCVem4K006XL6XCIZhwHEcRME5FREQTCAmOno6QgKBAGRZwlMcx6UjAoIJ8LzqGYRQUCoIIp5iWTZepzcUIQxBBFZr1iKe59MR4vF4WhDC8zzJz89fiDAEEZhTLXMYhsEPHA7HN5Ik4QcajcaCMAQR1FR/9a9f5qe3F+ckwusaudnysOWIw+m4Ha9jkRrD91368tJ2hCGIICEubo7VnJgyM9uMoycqN3TbOq9Y9HL5+hX5+Pm8HLvX7WpEGIIIdm9avzpKp1EzDCMDkBA0Oycrg+c4UEq9iIAggoRYYxKCnC5PkyIF6hB0vubWfUmWMRGCCASVykgpRdOjrosIOV717Qmn2+NWKJUQAUEEPr8/dsThdL/+/t4PESJLAY8kKU86bT1qwvEqhGERZqbe8Fzid82b6v1ed3Vd/fsIYTk+N18UNvWcromfrhKLO6SA6JACtQjhMA7heONSo3G/mhCV8PX3Ev4PIzlr7igWnic6USzcbU4taPZ6k7fY2jcjiMU4r5kSdpToDcsFQnDD5bxR53QcRghV5KEGv+82BYZkSrUKhdzt9z+85RyrQhCHcUTCfNPk9bwoA16/ouxFGJvbde5zt+scIvgf+AC9wMH+Le4AAAAASUVORK5CYII=" +}, { + "width": 9, + "height": 20, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAUCAYAAABf2RdVAAAAAklEQVR4AewaftIAAAJdSURBVF3BT0xScRwA8O/v/Z48KEOXoRAI+BAlxajl5p9ZB4rsUFp5bNPWwVpTq0u12UFPra3U6pBtlptzmjlny1bm0pbUKiWYw8zU6hlLxT+ZFODzCa93+B2cnw+GTS6VPpy355ccdLq6W4GgYYO/K6GMa+fbfDgG+0Fy+77zclqq6g3qHRg/wv1cTv7wuHzOmqK6jikkC/LrA5lFd1+390y26BIVHsxsdwzN+IN7Uhh3nirJZDMa0xJWeSF9qL/ZZcg6uszq49pprXprJxNDLW3xJZQX5BeAIGJIUGmY79PcTO2VQw0gQUDcqrB7WXO2NSuvEPyTbhgcfOY8XNZUGQgEGQxEdro6yguixaTeoXzR39doc9Q+arnz7skv3xJLA1Fe6smWy9ymxRWMSkv6zvhmX3qSDE2jsUrZOAWEgoktkDMAlnQVKFVV8vj44kpH7hyMeBu7KJCY2WRD3asHatePGh62HQCKVq4tBXLCfwJBrrPXydEgaai5WuQZ50RBEBZg8WIyFhZjquujZweH10ZAgkHS1v18aMDZe+OEHTnkDJj9v3VoIcB637u5YZDQsMHTYYO+x2UEhBDwPL8PCAoIlk01I4RSItFICGMMNE1bgKCA0BsNul3aeIhG1p0YIv/iFHQECAqIU3Zb7PH9mUx7R0fVhZO5Y6cL934BggLCpNfYRBGmxcj6RFQUA6IoCkDQQHBv3Rkr1lQvSKZHp0JTnz7v1sgVObOr4Y8USMoS1ceg3108drN1HiQT97omsWtCW63R1YEEgeSceqdVJ2MqvvHh+mb/3FfY5D8H6OpL7+hnsgAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/factor_level_1_icon_png.js b/mipmaps/factor_level_1_icon_png.js new file mode 100644 index 00000000..48e16658 --- /dev/null +++ b/mipmaps/factor_level_1_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 124, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 62, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 31, + "height": 49, + "url": "data:image/png;base64,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" +}, { + "width": 16, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAZCAYAAAA4/K6pAAAAAklEQVR4AewaftIAAAQzSURBVH3BW2xTZQAH8P/39Vx2Tm9n7dpCt3U3LiOT6YApUxdNuIRA0ASCib4oGtAEicbokxqMxmjMHnxQFBI0MVweTJxmZoISDJCJ25CNZWQI3a1pt8LWla6n6+Wc8x23Wc1Jg/5+BPex87FVu1rXrnjV0JnfaRfrc3ltaDB899POS7c6UYKgxKE9G9+sD7qPSCLvwCI1W4DIczAMlhmdSn7y+XfX3oeFDRZ1Qc8j2zbVHJfLBJdhMGgGgyzySGfycMiC4JTF1lzBGJiMp8IoorB4dsvaN+ySoGARMwEddhgGAyEECzkNksg5nnio+gAsOFi47OIG3WAocwRQV92AcsUDgecRn4lj/M/fsUQW+TpYUFjMphZuR+6oo5WhRjStXQO7LCFX0OAt94IQgiWEgMKCwqLjTN9OxvSzPMeBMQZR5GGXRFgVdJaABUWJzsvh3+ySgGRKRZkgoNztxGxiBv+4m8wMwIKiRCpT0Iau94GZDKl0Btlc3kyrOfiCTSw2N3v26A9Dx2BhQ4mtm2oeLJfhGp++Nxbw+yd7By+ca17X0ur3Rsia+vMVR16h+2qrbPd+umxcxyIOJbp6wme6esJnsOhcU+c7bc143e24AsYSaKyDQgkUl4NUo4jif7ideGlNLbxuRwI8B1ACxO4iv/9d4zSKKP7DueNlHSt9qBV4gFLAIWPZ9AzmmK6NoYjDItM0226NzuyYGImsD49M1/kDbtnl6gsRuwrQi0ipV1Dpx7L5DGZgwX11qi/+2Ykrvu6LUdpWBQx0RdGyPYjTP1M0P9cGp+tJlLEothfOwyFdRiwem4IFNxmdDxgMME38i1D8jQCzyTzETA7i+q0wzFtY1xCLwIILVblgmoCNAtVugOxgCIYULLTnEfDJyGkmmkI6MtkcKr3XMJqXVwYrK/ZPxaJfYxEXic7DYMDVG3Mwmjy4GqfYHOAxZrrgUA1kMllUhWxYyKZxvv9RhGNNu3890bJbXch99P0vPYepacJACV1nSKkaslkNE9EUBJ7H8FgC3QOr4FOcoJTC53EHGhuq93DVQacGQmw2G0HAJ4O7mcQSX7mAmioXoKfB2QoYjs1jSX1lBUSBB2MMslS2QCeiKUxG59E7lEBiLoeWRgUNtQoqFAHR6TS0uVmMT6nwVdZDK+RRFfAgX9DYjXDk272vfXiAOmTeRFG+YKD/RhKRWBoj4yokmsFTmw2kswSKS77Wttp7SdN0c3Ak/OWug28/w3SN0Zeff/jFto3B7vYNFUlCsIwZDEv8Hg7EJiLgMcMHDx7YN3d7zPvjoY/J9Y6TMooIikzTXNE/EHmr92p0h2SmVwux2zx3sweDdyZ6j/4xfFhV1f73QnXxFkkOqIyZH0xFX7iZSX9DcB+PK54t21zu7VNaYeLYdOwLFLUrnr0PSNLTio3TI/ncyVMzdy78BdKHyupvgrstAAAAAElFTkSuQmCC" +}, { + "width": 8, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAANCAYAAACUwi84AAAAAklEQVR4AewaftIAAAGYSURBVC3BT0hTcQAH8O/vz/u3356zbZrpMmQGEYGHdEItg/CgWIcKyRBBPHjTQ9CpS4eEqA5dOgUqBCVdPEsXs2wZiYozQwmcTVdPNJ86H7z53ut32OdDUDYy2PZSV5W7nu+HSiXv7aPXM0OQGKSH91v7qqNiJACrJPANXeOXmxqrf88u5xcpJGEoKVXUltqu30LrlS5wRlllWE9BopAej34eqks0ZM2wgKGpIITgyHE3IVGU/ch+37R293LFY8c6fyGy098zr0JiKPvwbe39wO2P8WQi0372zIrJOciLMW+cB0FQP/tp9c6v7NbFWNXkzbCYUlQlj7llbEDiz1/NrG2s/tXYro25hatIJNvR2zyFf/b4OiTOGdViNSZIVEfAGRqrHOwXQ+Dqg+4vEzUq9f3A8yjDHwdwAgoFLiamTxCP1jWZwuimB4euv7fv4nTcQOCdwHdthCKx7YqQZuW2rSf8Rvrc8PxS4d6hXWypd/NCJ/ZXZKbXM28Knc8KWz8JytKRU8m0WZF6ms+9uxaJXmoWosNy3cn/8piUS4z9Pl4AAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/factor_level_2_icon_png.js b/mipmaps/factor_level_2_icon_png.js new file mode 100644 index 00000000..3e89b258 --- /dev/null +++ b/mipmaps/factor_level_2_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 116, + "height": 275, + "url": "data:image/png;base64,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" +}, { + "width": 58, + "height": 138, + "url": "data:image/png;base64,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" +}, { + "width": 29, + "height": 69, + "url": "data:image/png;base64,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" +}, { + "width": 15, + "height": 35, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAjCAYAAABLuFAHAAAAAklEQVR4AewaftIAAAUMSURBVI3Be2wTdQAH8O/vd7+76+u6rns/6h7IxlAmm4EtaCLoUND4ICRMwAiSqDHRoP+oJCaCZpEEEh9gAuE/H4kYQCTiMDyWzQcZIo6A61grrKPb2LPr2l3vetc7r6TEZaHGz4fgP2x6fPG2unvyXxZ4WvdnYKy3osg9svfwpR0pPdkPC0EW72xu/rIkz9Uq8BwPi6xoUJI6KCU3L/hHXj/e1X+Cw128van5kK9I2sIzjoNFUXWAc8AumABITkme8+GOy8NHOMyT75Wa1iyv3CPwTDBNE0oyBZOTkJtbgNl4BJqegsdly1lY7mEM82x6rPYFPWXEFXhYfX2DWFFajMnIDEoKvejoMhGZCCFNcgglFPMc7uhv33Ho1xqeF6ddDgdEgcd4JApCCBJyHKLAkBaT1RGGeUYnZn6EJb+gWKeEIO2BRdWYTShQElMQeQ5qUtfbuwdOUGQxMhyy2W0ipqIxpIWHhiDyHNJm5OQffQPjZyjugjK+ZjY64vQHgvDmSIjFZUzHZBh8Sg6Px34/2tnfBgtBFpTxDgJS3LZ97fbaqqrWal9Bkch9BIHXEZcxVL9OKWfIwtA1mTJ+atWyn57R9PuLbCwIj6TDJgKSk7hhYcgwTXMDAAlAFMAogPG2tyrfqKkYrZScV5EWjQFOO6CoZhIWduac//xIYLj2wN6TuefbB+Bw81jSXIahwSlU1B7Evl8obEzDS490gOf2I01PYQIWFg5Hl94MjNvsLh6xsSRiY0mUVMbh75qATbLjtyETaesaU6jKxW1xGQOwMEoJ0uxOHncQDrcR/GtWqcVF/4uYnf3i7MlO82NYmMdjQ6rKC6ckYmlLKdJ8lXkwVwNllV40eU1wUMFSMURnro+vfS211dC1MCxsKpLgBoOTyC91oufMMNIoA3pOD8PgGbqHDTxaHYGNtyEQincYuhZGBisolHjUFiKlJ2HPYRAcDO5cOyobclBcJmGpBFQVxCAnBtG0pGcWc7DxiIJgxMDCqjz4niAgBFAkG6bzgGmI6BuYwCqfBpfYC2riPsxBOY6YsERnVFzun4H/RhyRqIqRCRUJRUMiocHjNHD852m0fbO+rqS0bAUyaFND+e5F93rHKCWYi6MEqaSMbc1DKM53Y3DSB4fDKTU2PrgRGdy+z/acPfrtwe8L8p20vtZzfs2q6s7VKxe2Q77IJ2LBCq+YwHRcxpXQFEwQaJoW8Pt7j8FCkMWG1o2nJZfUklASsIk2EEKQFo1Gjx05cng9LBRZEBA7LAIvIKklcQelREIGRRaqqkzomgpN01KqokwbpgFTT0KW5UvIoMhi+EbfD7u2tmD7c8uuH/3uWPnzDy0YeuWpRrSfav8EGRRZKKpmUkohikKRoWuzN8Kj3Q6biLY3t2xGBkUWV4MDJm4zdVhqq8sNj9uFZUtqliODIovK0iICSyye6IUlGBoKmqYJxnE8MiiyWNFQJxqGgR7/36dgeXXn/s+jcVlOGYaKDIa7oIwvreq/ufPKlX58te/ra7AYuha+/FdgbHx4zIEMDvO876t6t8Wdc6CacqXCxWtQjVTwQjx2jvL8gpWBWzvkvoFiDaQ7pCZCDHOIvPDsYrt9l0CIMKHr6JJnuic1/SwsT7o9rW6O432C4HV5ufe6olOdDHNs8HjFgKKEXBzNDanqpU/Hbj1t6FoSljJBqIBFNgxEU3ohLAT/E2U8+6DUt5snRPxwJHwwnlSv/gMobCIfXIVn0gAAAABJRU5ErkJggg==" +}, { + "width": 8, + "height": 18, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAASCAYAAABmQp92AAAAAklEQVR4AewaftIAAAHdSURBVHXBT2jTUAAH4F9ekjZt2jWdRbPNpo3KBKcXx9gQUUEQURBhniciDPXg3cNQZ+dJeh0TtKIgyA4Oth4ERRmdoDCmvYh0bhaKf9Y1dVlb0yzJ8x16yMXv4+Bzf/zkk5AkXKib1hbPc7nbjwqTPDqmxk9MKxHpquvxIVmOKoRzjx1KJ4oCOuwdd0dNHW3rWkpqbNdRXHkXDElCP0HH3dzSzYgsO7FoGIaxCcf1zJeLpTmCDo4XEuvrq4Va3ahEu/64g4Ol0tfy5qoAhlJ6GoCZnTj7cLeSfa6rNV4UvQEwwuOZt9Vb154mqAuI4TE8eC3jzugzELpggBEAKPFEGH+bDkA4OB6HtcoRu/p7IQOGgBCybVpomBbabQd94SZ4irXz19vTYIjp8Zyo9QBJFU0ljrhk4/uPZVXt7dXAkP0pJRuLBorxWHA5RKrmwR4Drz6ryvDQyCgYDj5jl6+UQaGJogjT3MrMzr6YIPA5NdBX71cjn4b2dbdbrdZ7MAJ8Rg6nG7bjbLiOJ+9RpHQ+Pw8CH0op92vD+BAQhZ9KV2QXGB4dk0l9yqrWLuVzczPUtg+UllaCb76V5wUwZ5Tu43sDgRuVj18KlkuLzmJRVwkZxv/cS+rnMpp+Ecw/Ib226kRlbQ0AAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/factor_level_3_icon_png.js b/mipmaps/factor_level_3_icon_png.js new file mode 100644 index 00000000..f0a0f5c3 --- /dev/null +++ b/mipmaps/factor_level_3_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 98, + "height": 308, + "url": "data:image/png;base64,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" +}, { + "width": 49, + "height": 154, + "url": "data:image/png;base64,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" +}, { + "width": 25, + "height": 77, + "url": "data:image/png;base64,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" +}, { + "width": 13, + "height": 39, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAnCAYAAADU3MIsAAAAAklEQVR4AewaftIAAAU8SURBVIXBaWgc1wHA8f+8ebM7e3hXWd2SdViKLQkrduz4SIld41RxHOOGtB8aSsFtoE0vSKHQfkm+uGmatlBSKCUOSaAfEmgJBJvGcVNEsIkbLB+Jo9qOqsuu5V1J1rW7kvaamfc6a3ZBCEN/P0Nr/cgbr314eS65rFxPldq7a7k9sUBZ26YE03eWXAx0Q0uM5392ZJ9hGMMSaLh2IUXyxrIAbNMUDA/OUCYPCz77xzRlPftL+AQ+ATTmsi5V2uP/koC5eUcdbr+HcqGtO0FVa0cCNcA9DRs3UCUB68pHd/BKmjIh4epginsMuDqYoqxnfy1V0nHcYN9j9VQ1tcbpP+hS1twexz3oUtbYFqNKzkxlwqNDC1QFbYuRS/9FWg6BoGB0aIEyrTVVMrdajJVyHhpNNDFNoHSZA1+Zpei4ZJYuo8XDOCsJXE9RJQqFghFvtmnu/JJHdw0TlXcRwiAUtIgEVunr+xfCziIw+PPvj/fiE+m5662PP22ydfNthGGwlqttQkHNgcOLPHWknq0tsW/gk+PXL51tiFnfulkIp7Z0dXWGw1Fqa2Kks1m6A0FGRv5NaekaVu5B98bN24P4xPj4mLG5ozUwOzv1aSIeIxKJ0tbSRDQaY0tnO0EJSuvlYNBa0ZpWfOLQYzuPuq5XqIvb4XA4QntzPZnlVbramknOzuIUFik53n+Axe29mw7jEzWxDTuU0iuWae4ZG7tBerVAVtZxa3qeoYvn0VqrWzOZv7mul4mGQ9uEZXVJS5rNmeWp/J49l88rb2rr8HUz29+zbed8NpOVwdH5tpZV+fDOua8ur+ZqG2prQmgOyHR2Zby98Xxfa796BqZJ3n2H9PIPSGyYjQ88OxmXkrKOq6NLXupu8KYBQwa+Ox/bcwGLukQclIa5RQhaUBODXAG0htQcH/QdLXwdn4nvj+8a1xazxvC+Hca+kI0VDYMd+x4E9jMzczF58mP92wtfcPrcJW8Mn8SnXOfMW+9x5vhP7OfA6CXxBqLxm+jUW0iT2R8dL77KGoI1HIc00RcxIn2g8mjtYRgYrCNZQ2kKrPwavXICHf425E8hBFHWkaxhCkLcMw+5P1FmCqOOdQRrCEGIdSypa4QMHGQNkzVyxpHvK9XUYhoCxy3yxfhDvP3hXkKxpvHJyYlPqJBUbO3vP5rXtQ99cKWJk0MdSCmpMOpqzWPAK1QIKnp7+n5oWVYAn9KKTDajPc+jLBQKb/nawBMvUSHwCWl12HZoP1Ua13Pdj0zTpEwIQX19w3eoEPgOPXHo58FgME6F53mp1PT0KaUUVbZt9xx8fOCX+AS+gBXY3d0QIRESeJ6H4zpjQxc+PVEsFReosE3DKBbylAl8584O/vWpvVvY9WB9aSm9tJhKJc/hy6TTJ1ay6aGBba38+OndbO+s9fBJfC+/cKym7oE4rqeSp06+3EXF6dN/f0lI61c/febR4YAle3b3b979OiDwmaYw8NkBq4Z1lOuUtNbXIyGb7b3d2/EJfL97872LhWIJ11NL3Met5OwkPq1VAZ/Adzs1c6ZQLK16npfmPp578bU3M8ur+XzRmcEnqVBKLSqt89yHcp3Ricmp+dmFtMIn8QlpbTr76tvhbDyyyZRWm+c6U6xz7Q/vxByt+/CZQlobX2lte7+u6HZHFlc25LUamcjnrrBGImjvfTJe83zUNOPaMD4XLzQ0/aItEHwkIkxcrdkorUbW+W5t/bEGywpEhWl1Bu1dct4r/fOu68RXlXogr7yRvyzNv8s6k6X8+5GcaZe0mnh9Ovmb/wG9LjKWKJBMbwAAAABJRU5ErkJggg==" +}, { + "width": 7, + "height": 20, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAUCAYAAABBECfmAAAAAklEQVR4AewaftIAAAIASURBVC3BTWiSYQAH8P/zob42m3O+bFMTrFnJRiJBjKAoWBQe6tB26NghunQrGkFREZ1GHqLoUt2CDuvjUgTCGF4WrcmC2ewLbbAlc7ncpq+++r7P0yPs9yMP7r6eLi5VTvgDXRIS2CjX7b1D/plrt8eSnIA4CSGMgIBQAIJwSOKAwi3LYrYtIKWEEIAtBIQU6KBbG6ajslwFbS5B1L/g7+8t1DZNdPBwBK4ezKLL3USzJRGLBxGLhnxQeCxYrhbN0OqBaDQkhER2PmOFfWs1KLR7l3sPhcXcHh9suw2rXfvl1lxBwnkvpaTUe+rYlG03Ptc0x1ztwvkFL4GpE4n91KNNPnRyQw4NPvckhoWHM6MJcWNC2NYnGk2adxom3rn0FByhCbQtfDg8bj6FwqHYgjSweQtyOwHOiQ87OJRcIaExVoXTUUT220gYyKCDQeG+0XuZxUggnY3I/Kq/z6/rH4uFQpGePpM8xxiPSykbUsocY8zd3z9wFQqFlAdPDgeo0TB+mC0z3bfbuT0aD+tQ+NmRaOnooX31i9fvJ6BkXqSor9szDoVOPpuaM1ttAzt+Lv+ZppRIKHSlXFn/nv1qUMa9UC7dTL2feZU2obDHkcE3crFwRCN0PmfU81cGQmPh0r/LutO5wI57e0jFtmafrK+9hRCNoOZqcdD8o9LKy/9z2NpdGvAq2AAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/multiply_level_1_icon_png.js b/mipmaps/multiply_level_1_icon_png.js new file mode 100644 index 00000000..c4fa67de --- /dev/null +++ b/mipmaps/multiply_level_1_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 259, + "height": 243, + "url": "data:image/png;base64,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" +}, { + "width": 130, + "height": 122, + "url": "data:image/png;base64,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" +}, { + "width": 65, + "height": 61, + "url": "data:image/png;base64,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" +}, { + "width": 33, + "height": 31, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAfCAYAAABplKSyAAAAAklEQVR4AewaftIAAAQ0SURBVM3BW2xTZQDA8f/5ztd76dZ1F8fW0pUNAwQYukRdlMUIJhBJiOiDLwZfkAeToS8Qn/RBFE1IfFJJDA+SiJgMw02ZhEuiMQ4EhkOBwgZrN7Z2Zd2F7vR2PpkZSSW2L1Kz30+LDsbUQHiEYhZUOLG4nYwl7lFKKOij/1aCUta0N5/UNG0dD5ED4RH2dJ6kmPaXA1Q0N9LVPUgpO7e18tHnlyhlTXsz/0YwDwjmAcE8IJgHBPOAYB4Q/E/MfJa+3gvVna8+/WHI73dRQBscjKsb4VGKqahwYnXaiI3do5SWUDXh/jEepswsv506gkicwWVXmKYinc3nJlPZn7/qHljfH43MyIFIko/3/UExHW01+KocdHUPUsrOba18svcShZQyWWnppsk3BHb+ljcVNqsuvULr2PRs4xd7DkReF5SROxclWBWlkN1dh9A0ZtVW2l8K+QO1kjKyqyTC2cSSkB+LxQLKRJdWYrEoN8OXcTss3qWL3G8IyihhXUnadGJ3uAn6GwkGAthsNpa0LMdplwihEah1+QVlJjRFpcdFLp9nltvpIDWTYpZSivi4EROUkWnmUNkxFricaGjkTROnw050KMKsVDpnXAgnuyRlpKdHMWdGiAyP4HK5sEiJkc4QvnYRt0Mnk81f6o9G+qSmadisgmJ0KdCFhs0qKEUTGjar4B8sjfyUfIUr3QmeWu5gdYuJ1SKpqK3puX7tVlQpvuM+GQxUsX3LCorxeOzYrJJQoJJSmgJVbN+ygmIUeaxTB3DKETY8d6zZyDg+6Nw1epj75MDtBLv39lJMR1sNvioHXd2DlLJzWyu79/ZSTNB1mx2bP8VpN/FVZqs2doh3OndxmPskZVZhMdjU2sfaJw/h9aR5wCKVgzmSMpCk2bBsnMf9dpoW2rGJQbyeCOmMTvyupK46y524vMwcSRlsbp3khTYfpqkYik+TTesIYcUwBP56g9SMnn//M+d+SDBLUAbf9EhiiSTJyWn6buvsO91GJqPhrzeYlTL06LGzkbPMkZTBygZwuxw47TaeWZpicmKAhro0DyjUBAUEZbCsMU8ul2fGSLP/x4ssXniFQkLTKikgeMSUUiyuh4E7in1HzzM6YXD810qG43XMUkojPu5xUkA2LfKxY+sqivF47Niskpagl1JCQR87tq7il+OnaKhzk8osxjUyjhHvxcDKu1+280QoSfKeg6tDNuBrHpD+Bm+9v8HLf7V9/fp19SOx1xqM9Nrzl+stk9HEkdM+77m6xxa+Z5p5YaLTc8OLy+VG06YkBTQegVBjYPWbdsepGqFX5lE4NI2kUkffuv7nxnVrXzxYXVO72SKlELqOpmncGR4688OJ759njs4j4PV4xhYJXcWUeeJQJnPQrdFz1cwf7R2/G+7vv/ltLm1MZbPZkanp6d+HhyLnIv033x6fnJxgzl+IMpbQmSwYGgAAAABJRU5ErkJggg==" +}, { + "width": 17, + "height": 16, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAAAklEQVR4AewaftIAAAIQSURBVK3BTUiTYQDA8f/zvK/OqWtTZ1lT322i9kFCBEKrQZ/4dYqCTkGXbh28de8W1CWMKOjjULeSCPykQ22nZoiXIiZqgjXNaOrc3Dvdnlb5wtulFPz9xPCrmJqJL2AxDviY+prBrslfxdTnJJbD+3fPngy3+Nmkz8QXGH0yieXUVQeDY0vY9SjFQCSBxbPLgZ1kB0h2gG601HH6isQSaKqlq8yJXcCooivMb8nvi/z49Np7+9qZyHI69/TG4+gDfWrBZGAijaXTtcpwNIFdj4ChaAJZyHLW+5ySErNCdzjD+YJqDtY3PNPZBo08jcE2WgI+Uuk047GRuhNt3ks625AT5bhdFbhclWzkNygqrKzm5nQpBJomsEgh0DSBnZACTROQzzExaeKszLCS/JbKmBvvX0Y+jOr+RjcdoQKWYKObDqWwCzR46Agp/jDIinGOHhwt8++L91+/B/r07BKD0QSWTmA4msCuR8BQ9AvH/Vnam+cJNd2iUMiULKdK91Ak2aIGV5YLoTyLSUkqbSIEa703Kx9RJNmi8lKB1CRKzVPjyaEUmcHI3AxFetDw0B1WWIKGh27+FjSq8Jp5ovEcb8bm8dW0Y65LJ7zlF7373KFq/uFuX59rsvd+f7Wz9MhSXt3JtbZefjgSqFGwxibBfwR99fK8w3lxRRXWTSE+vpOidq+v/lgmk56OjcVeUPQTN3S9XWmfLxIAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/multiply_level_2_icon_png.js b/mipmaps/multiply_level_2_icon_png.js new file mode 100644 index 00000000..0b46be8b --- /dev/null +++ b/mipmaps/multiply_level_2_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 255, + "height": 271, + "url": "data:image/png;base64,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" +}, { + "width": 128, + "height": 136, + "url": "data:image/png;base64,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" +}, { + "width": 64, + "height": 68, + "url": "data:image/png;base64,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" +}, { + "width": 32, + "height": 34, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAiCAYAAAA+stv/AAAAAklEQVR4AewaftIAAATlSURBVLXBfWic9QHA8e/v9/ye5+5yb3m7NEmTS5rUbuq0zPVtlb3YVdbJGNg5kDHqwLmNgR0Ft3/ckApzf6jbbGFQhzIYo4pzFKyOWadg/2i0KTNSUm3s5bXNyzV3yV3u/Xl+P++6BOsg+e/5fAQ+e+i+Lz96y+bYjwOOdVu1ppe0Ns5ivnzqTy+/9zB1whjzE3zyu8ce+Wq4OnEo4FiqWvNwbIt8sUpTQDExv/L6syfPfVd9cnnmLyPDKdbT3hEjGAowM5lmI3fuGOSD0QXWGF0mSgbbsbjBbgWWaQooaq6mtyN834P7tz+h5may/P33F1jP3oNJ2hIRXjsxykY6jrfy4qufsKbLG+HORA4dbKE53kpXdx/FlSXGJ8bwassElRJbe6L3K3wyX2nmfPrr/OZH3UTCIWquiyWTeNrj2tRFGoK22izxiW7qo+gGWCmVaZhLZzFG47oenzFC4aMvdFtEwyFqrktvV4KGTGaeNa5n0hIfVbKXcV2PqdlFKtUa6UyWSvE6a7IrlRGJT4wxFGohhi6MkOxqI+DYLGayuFrRUCjXiv8aXvizwidCCKatu5n8uMps4WP2fyXGYH8PkSYrf+bsxIezc5Ezl1Pj7yp8tq//AocfOMG19New9FUGeyajtx7Sdy/n1dZ/D/c+q/oHOzn8zD7WE28J4wQUW27pZCP9A5386qcBPs9gTz+PY2vaW2YIOSlcTxBwNE0hvemR77s/VBNX5jj22NusZ+/BJG2JCK+dGGUjR47fy9MvXOJmMTHHMw+dB7mH6BePYSZ3sZCx6UpUsaRh/57qdoWPYkHNSnkrou8EItiJoZlSpcyalpjXqvDRdKGDivgWJncexG5Qu1jOD3FlejeeXpr6aDx1RuEjz6sSU2OweAyz8iC4b9LZnsBYh5hNZ0YOHn70RYmvBFDihspLNHi6jQYhKFMn8ZGQkprL5zjqKlprciulMeokPpJS8cLpKKmZHpbyAa7MdDJ8aYBCqcKpt4aGqVPhaJC7DnSznu5kK9FYiLsOdLORcCTE7jtauVm1WmAuFeeJv+1GKRshBFJK9i6n+M/7o2PUqabmGMkdg6ynPREhFLJJasVGmmJhBvri3Cyfc1mYkChl02DbNg1nR68Rb45/D7io5tN5Tp4eZz3f2JGgrTXEP9+cYiN9PXFOnh7nZl55nmQcHMehVCoCDg22bROLN38TeEriI+Ets0ZrwxohBIFAoJ86hZ9CW/hSj+GOgRAfjOVxrRq2ruB57ujZd0Z/Tp3CR1LaJDvb2NYX52omxs5dfURq18kXiuLXTz13ljqJ34yhIRw0aM+jwVZqM6skvhM0XM8JkBYN2hjBKonPPM0NqXmJHY5r/sewSuI3IfA8zcVZiROOz1OntTasUtsGE8tHj+xkPZFwANu22H77JjbSu7mFo0d28v9Sb/8jsrBYsx7/5bfzsbb2jxZT1a5iqWJYJfDJL7ZsfSCprJ9tktY9dnebNT2T/sPzpeLJJ39w75D7xjnzx1LhOx9OTb6l8MFAT6/aYzvPtQjZnUXTdC2Dgg4EFfnGkKWA34Yir2e23XZc4gODOFTEdBYw5LQun/dqp8651b8KYyZTnptuRhJEOA4csPDBUm75v+VINO0aM/5KtfL0qxOpo5eWsuPZXK4Si8UJS3H7ijHVWeO9/ymP5vo5VesU+QAAAABJRU5ErkJggg==" +}, { + "width": 16, + "height": 17, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAARCAYAAADUryzEAAAAAklEQVR4AewaftIAAAIYSURBVJXBMUwTUQCA4f9eH/au9CgHpbTQFIpFBkWMCYuLQzGRGCZHWZycHTQxLrqYyO7ipjAYJzrhAIkDjUkTE0HAqA1iAcHSpoDttdyVnjiU1I1+n+I4zk3OaPbNq+D64vRDRSFqVY8L2YPKI5l4m5z7srxN3dDFHr6u/qLR0GiMtfQ+2mEGr96O7gvwe2c9FDTEY7mzWSCV2KZO1zVSiW0a6eEAi5/yuO02pu7ewnEcUpZJbm+rV9AEwyOpWDYul6D4J0cN8oIm7FsaqbUiJdNE81qF8pE9K/tjAeKTDnXRCwHik/wn2t/JuJBAiGs9T/H7cgyMfzPMimtQbqSzLMykqYtPwsJMmkZxn85cco9WUeTO/VHauy5xkLmHR61FJE34U1U5tk04SpM/uE3RFElBk4SdhNIzVHcPpnV5VbbqKuFhnTpvm0p4WKeR1+umL6RRq1WZfhchGvJTtizmF+ffS63bjzHCKTXYiTGi0MjjVenuVLEtk88/OljKtCPEAT/z5TG5u1citVKgrsNQSa0UaNTVoZJaKeBUTeIxP7nDMopSNbOaR0qaoEgP168MYipeIr5K9fzYi+eCJjlAyW5xADcnZCxqVCYEp/ojBi1SodFAn8GES+GfSnnZfS4Y2bXtJYMTCmc00BsWT1rbPgitZXSjVHkQ6eueEpu5l4IzclCulpya2CqVX3+sWoliJvvddpwbfwEF4s6oVbZIVgAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/multiply_level_3_icon_png.js b/mipmaps/multiply_level_3_icon_png.js new file mode 100644 index 00000000..64bbc518 --- /dev/null +++ b/mipmaps/multiply_level_3_icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 261, + "height": 270, + "url": "data:image/png;base64,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" +}, { + "width": 131, + "height": 135, + "url": "data:image/png;base64,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" +}, { + "width": 66, + "height": 68, + "url": "data:image/png;base64,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" +}, { + "width": 33, + "height": 34, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAiCAYAAADRcLDBAAAAAklEQVR4AewaftIAAAX1SURBVLXBfWyUdwHA8e/v9zx399z79eW6K3BXuILMiaHY0GWdm0sq2ZzbmI3R6R9DR8xMFLv+YeYSI5lBjQZXO40KBo0ZYZszWdMFgUhlY2wMAuNlUMF2LdBraUvb6/Xl7nrPm31Mm9wftvvn+vkIVsiOR7Z8d0M8tMulyprMrH494FUjIxP5s52nB3f0pwYKFFFYAc9u37rnM8nIT4M+d7XHpbhDfne1IkWZX1M3rarw1n9wNXWIImJibKp/7E6GpWheN4qiMDuTYzmV0TBjdzLMFXIc/dOumN+DxjzdsLBQ8agW01kdlyqsf56/3Xrk/e6XWaBevXRj7Ustx1lKY3OCimiAt/Z1s5zW9ibaWroIx27QsBkKuknBsNF85ZSHwszOjGOYk/g1VdbVlj115H1eZoFKiRWMHJlCFU0PNnBXRRmKIjFNE9uGC5c/5HaqG5+mbqCIpMSyY3eTTlvk53QUReIYGp1AN00CgRAORYqy5Jp4mAWSEhMIpDRIxmPMZHM44tVRvB43tm3z/0hKzMbCo44xPZtlcDTN+OQUV3tvUtANJtLjOEzLHu1LDWRYICkxS05RGVY4dfokoaAfX9U6KisqGZuYZHT4YxwzWf0cRSQlJoXKv3tr+egjL6+81sdQ72WEpXP5Wg8VG7eNTEzlL3VdHP01RSQlJswAQ/3rqdsywY93/YGQrweXy6Kx7hL31/45sv3Ry5MTmbmzFFFXJyp5Zvd9LKW8MojH6yIaC7OcNYkoz+y+D8f0QAePff4wPs3Ctl9FUQ6hShvDEp7VVeYXOn9H56Yn2cYCdXR4kmNvXGEpmxpWESn3c+poD8uJxkIce+MKNja7nn4T2xY4KiI6eFsg185ExoUQNndV+r740L1rH377zIVjzFP1gsFg9zRLqbk7h9ujMNg9zXIKBYPB7ml85Xky2a8Syv0Rv1cgovsRVY9jXW3HMATpqQCDd3bS9kL1z5q///MT/amBgqTEvvyYG4hzY2gbYu07iPBWwMQR9Fv5H/1m6/OqKz4S9PvqD730ww7mSUpIalm2fLaMf50ax9Rz2De/gTXWiTV0EIdl2/qBvx/51ZWeG38TQhD0eTcwT6WEjLyb8XSe+xsi6HOA3QOZ34Pdh0MKXMyrjVc/pCqS9NTM28yTlJBE5a8HM5RHNEIhL/9j97HIsqPasQO/6CgPB+8ZGZ/seuCbrd9hnqTExm5pvHn4DlKJYtuCRboh6U09wadrE9uns7nUU8/9cjsLVFbA+fckkaiXvxzeRnI1ZOdUeoZchH2zfPvR6UJqeKyjLzUwywJ13YYYre1NLCUU9uN2q6y/p5rlJNdX09rexKLTZ04ya09y8aaJECBdCjOG4CcHjn7Y2dnxHEXU/p5h2lq6WEpjc4KKaIC39nWznNb2Jtpaulikrr9GqELgyOfz+P0BHB6PtjG5Jq72pQYMFkhWgGWbqN4cDsuyMAyDRZqmlYXKy1spIlkBFjoeoaDrOqZpkJ1U0fMFQh7B55KVaUXKHoqorABVaOx4pJ5YpY93z4xz5LJKVdUMP/haLbO5vNr64t4OikhWgClnSKwK4/dpREIajo97TBya2x38x749z1NEsgICEXCpCo6paROHkXORy8+hKJLV1dEGikhWQKRMwVHQDd45UcCh4iMrgzh03fBSRLICgkGB4z9908yMu1gUiW+cYp6NrVJEDYZ9NDYnWEpNbZRASKOxOcFyQmE/jc0JHNa54/RetxhKx2hsjrEoUBHrmUpdqB++duNTT6xLPtjZ33eSeerm+tq2zfW1fJIvPdnAJ/EHzVj3iRNNmYEPqoZfDVD5+Ffe3fniznMsOHH4sFs/e75+4vXjNQ+7PLtvJWr2Xrx184igRB5IrP3Ws5pvvyaEqwBowHXTeOWF3utPsyAZT9Tt8QXO+ZFKGhsPGLct87eSEqmS8t45bFfOtrlmGulTht4xYJkHKdI3cOtiV2HuwIhtznoBH0IV0CAokeSaeKRRde8WQijv6XP7+1IDV1jC19cmv1fncu8SMHPTNPf+FwZFViNie78fAAAAAElFTkSuQmCC" +}, { + "width": 17, + "height": 17, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAklEQVR4AewaftIAAAJzSURBVI3BX0gTcQAH8O/dfjfdWtvpdDWdO26uQdSDZS9iRGDmg5kPQvngwyDQHoL+gEhQ0JtEDyIFYVAu8KEMCoWCVkaFJkkGIoi1taVtTjf/zpzubrtrxi7urft8KGjU3nzstMdh7qVpyi6I0mZsJXWz99lnH3LI21eTa3OhBBROvgTz4WWoca5SBCaH9cLyJ6NOvxegtixlJegE4EMOCcwssH5fAIq6NjdGBoJQq/cewMzXFVy8cA6Fegara6sYHX3pdpU7CkLRSJqGRhlBj11pQUSejDwaGumoDD6OB7Aj6RCOxgUxI42HopE0ckg5Z0VtiwCFg7eitkWEmoOzInnwEBpP3kNWjqG2aoKcOLqQ6bqPv0g8toHpsRgUZtaA6bEY1FirERXWnyhm52CwX0cq+pzeTtecGn/adLXm/OUeIgoZJBcFKIR0BslFAWqCIKCsaD/WxCswGnkwjCR8+dbQby81dQLoIdCEAmQaSL2DHOkDZAMpNpvckiRPIodAEwqDgztg2pyIb0hYSFTQvENX2dR+y4Mcwnv2od6Lf3i3DbSXgprLY8OuFxOL2NzSg2EYrPv9H0LRiIgcEv6+hDe+ABR1bTJGBoJQq/cCr/tnYTm6ip1tEYUMAWdjncijoRFFAV2tx3G4qBqNR6rQ0VwjI4+GRkZLFnsMBUjEZSRTOhCi45BHzKwRfLUFCkuRAXy1BWpm1gCOIwjNJ6FnWZgczvXt30HTWd7FD4dDYUqW5Q78x/u+Bw1Lfn+jnBF/tQ4N3QnOzpKpa5fuJn/Eptal7A0KGnRXep4wFGWPStLjnlDgEXJuuz0PbTQ5k5Cy3X8Ab2TwGJ5L2asAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file