From 30c3817485276b8d80556e6bf87ecefcbe00dee9 Mon Sep 17 00:00:00 2001 From: Febbweiss Date: Thu, 14 Mar 2013 13:13:10 +0100 Subject: [PATCH] Feature: adding project files --- MIT-LICENCE.txt | 7 + README | 11 +- css/hack/csshover3.htc | 12 + css/pacman.css | 267 +++ img/banner.png | Bin 0 -> 4598 bytes img/font-red.png | Bin 0 -> 5257 bytes img/font-yellow.png | Bin 0 -> 4292 bytes img/font.png | Bin 0 -> 4032 bytes img/sprite.png | Bin 0 -> 10872 bytes index.html | 82 + js/pacman-core.js | 1009 ++++++++++++ js/pacman-core.js~ | 999 +++++++++++ js/pacman-data.js | 2 + js/pacman-ui.js | 255 +++ js/pacman-ui.js~ | 246 +++ js/scoreboard.js | 54 + js/utils.js | 55 + lib/gamequery-0.7.0.js | 1738 ++++++++++++++++++++ lib/gamequery-soundwrapper-soundmanager.js | 80 + lib/jquery-1.8.3.min.js | 2 + lib/jquery-ui-1.8.23.custom.min.js | 125 ++ lib/soundmanager2.min.js | 106 ++ sound/dies.mp3 | Bin 0 -> 27611 bytes sound/eatingfruit.mp3 | Bin 0 -> 10057 bytes sound/eatingghost.mp3 | Bin 0 -> 11728 bytes sound/opening.mp3 | Bin 0 -> 70217 bytes sound/siren.mp3 | Bin 0 -> 29283 bytes sound/wakawaka.mp3 | Bin 0 -> 12538 bytes swf/soundmanager2.swf | Bin 0 -> 2934 bytes swf/soundmanager2_debug.swf | Bin 0 -> 3310 bytes swf/soundmanager2_flash9.swf | Bin 0 -> 8696 bytes swf/soundmanager2_flash9_debug.swf | Bin 0 -> 17093 bytes 32 files changed, 5049 insertions(+), 1 deletion(-) create mode 100644 MIT-LICENCE.txt create mode 100644 css/hack/csshover3.htc create mode 100644 css/pacman.css create mode 100644 img/banner.png create mode 100644 img/font-red.png create mode 100644 img/font-yellow.png create mode 100644 img/font.png create mode 100644 img/sprite.png create mode 100644 index.html create mode 100644 js/pacman-core.js create mode 100644 js/pacman-core.js~ create mode 100644 js/pacman-data.js create mode 100644 js/pacman-ui.js create mode 100644 js/pacman-ui.js~ create mode 100644 js/scoreboard.js create mode 100644 js/utils.js create mode 100644 lib/gamequery-0.7.0.js create mode 100644 lib/gamequery-soundwrapper-soundmanager.js create mode 100644 lib/jquery-1.8.3.min.js create mode 100644 lib/jquery-ui-1.8.23.custom.min.js create mode 100644 lib/soundmanager2.min.js create mode 100644 sound/dies.mp3 create mode 100644 sound/eatingfruit.mp3 create mode 100644 sound/eatingghost.mp3 create mode 100644 sound/opening.mp3 create mode 100644 sound/siren.mp3 create mode 100644 sound/wakawaka.mp3 create mode 100644 swf/soundmanager2.swf create mode 100644 swf/soundmanager2_debug.swf create mode 100644 swf/soundmanager2_flash9.swf create mode 100644 swf/soundmanager2_flash9_debug.swf diff --git a/MIT-LICENCE.txt b/MIT-LICENCE.txt new file mode 100644 index 0000000..8668d02 --- /dev/null +++ b/MIT-LICENCE.txt @@ -0,0 +1,7 @@ +Copyright (c) 2013 Fabrice ECAILLE aka Febbweiss + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README b/README index 762b2f4..d8708c7 100644 --- a/README +++ b/README @@ -1 +1,10 @@ -gq-pacman is a jQuery implementation of the famous Namco's Pacman +gq-pacman is a jQuery implementation of the famous Namco's Pacman. + +Credits : + +Graphics : Fabrice Ecaille aka Febbweiss +Code : Fabrice Ecaille aka Febbweiss +Algorithm : Based on the "Pacman Dossier" (http://home.comcast.net/~jpittman2/pacman/pacmandossier.html) +Tools : gameQuery (http://gamequeryjs.com/) +Sounds : Sound FX Center (http://soundfxcenter.com/sound_effect/search.php?sfx=Pacman) + diff --git a/css/hack/csshover3.htc b/css/hack/csshover3.htc new file mode 100644 index 0000000..4fa021f --- /dev/null +++ b/css/hack/csshover3.htc @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/css/pacman.css b/css/pacman.css new file mode 100644 index 0000000..f4c0b9e --- /dev/null +++ b/css/pacman.css @@ -0,0 +1,267 @@ +#playgroundContainer { + width: 448px; + height: 512px; + background-color: black; + margin-left: auto; + margin-right: auto; +} + +.actor { + width: 32px; + height: 32px; + position: relative; + margin-top: -16px; + margin-left: -16px; +} + +/** TILES **/ + +.tile { + width: 16px; + height: 16px; + float: left; + margin: 0px; + padding: 0px; +} + +.corner1 { + background-image: url('../img/sprite.png'); + background-position: -0px -0px; +} + +.corner2 { + background-image: url('../img/sprite.png'); + background-position: -16px -0px; +} + +.corner3 { + background-image: url('../img/sprite.png'); + background-position: -32px 0px; +} + +.corner4 { + background-image: url('../img/sprite.png'); + background-position: -48px 0px; +} + +.horizontalMidUp { + background-image: url('../img/sprite.png'); + background-position: -96px -0px; +} + +.horizontalMidDown { + background-image: url('../img/sprite.png'); + background-position: -112px -0px; +} + +.verticalMidLeft { + background-image: url('../img/sprite.png'); + background-position: -64px -0px; +} + +.verticalMidRight { + background-image: url('../img/sprite.png'); + background-position: -80px -0px; +} + +.squareCornerTopLeft { + background-image: url('../img/sprite.png'); + background-position: -128px -0px; +} + +.squareCornerTopRight { + background-image: url('../img/sprite.png'); + background-position: -144px -0px; +} + +.squareCornerBottomLeft { + background-image: url('../img/sprite.png'); + background-position: -160px -0px; +} + +.squareCornerBottomRight { + background-image: url('../img/sprite.png'); + background-position: -176px -0px; +} + +.gate { + background-image: url('../img/sprite.png'); + background-position: -192px -0px; +} + +.dot { + background-image: url('../img/sprite.png'); + background-position: -208px -0px; +} + +.bigDot { + background-image: url('../img/sprite.png'); + background-position: -208px -16px; +} + +.ghost { + width: 32px; + height: 32px; + float: left; +} + +.blinky { + background-image: url('../img/sprite.png'); + background-position: -160px -48px; +} +.pinky { + background-image: url('../img/sprite.png'); + background-position: -160px -80px; +} +.inky { + background-image: url('../img/sprite.png'); + background-position: -160px -112px; +} +.clyde { + background-image: url('../img/sprite.png'); + background-position: -160px -144px; +} + +.cherries { + background-image: url('../img/sprite.png'); + background-position: -208px -32px; +} + +.strawberry { + background-image: url('../img/sprite.png'); + background-position: -208px -48px; +} + +.peach { + background-image: url('../img/sprite.png'); + background-position: -208px -64px; +} + +.apple { + background-image: url('../img/sprite.png'); + background-position: -208px -80px; +} + +.grapes { + background-image: url('../img/sprite.png'); + background-position: -208px -96px; +} + +.galaxian { + background-image: url('../img/sprite.png'); + background-position: -208px -112px; +} + +.bell { + background-image: url('../img/sprite.png'); + background-position: -208px -128px; +} + +.key { + background-image: url('../img/sprite.png'); + background-position: -208px -144px; +} + +.description { + padding-left: 40px; + line-height: 3em; + vertical-align: middle; +} +/** HUD **/ + +#message { + position : absolute; + left : 50%; + top : 50%; +} + +#level { + position : relative; + top: -10px; + left: 5px; +} + +#levelNumber { + position : relative; + top: -14px; + float: left; + margin-left: 100px; +} + +#lives { + position: absolute; + top: -1px; + right: 10px; +} + +#scoreMessage { + position: absolute; + right: 0px; +} + +.life { + width: 32px; + height: 32px; + float: left; + background-image: url('../img/sprite.png'); + background-position: 0px -16px; +} + +/** SCOREBOARD**/ + +.clock { + background : transparent url("../img/font.png") no-repeat top left; + height:32px; + width:32px; + float:left; +} + +.clock.red { + background : transparent url("../img/font-red.png") no-repeat top left; +} + +.clock.yellow { + background : transparent url("../img/font-yellow.png") no-repeat top left; +} + +.clock.small { + position: relative; + top: 45%; + height: 16px; + width: 16px; +} + +.n0 { + background-position : 0px 0px; +} +.n1 { + background-position : -32px 0px; +} +.n2 { + background-position : -64px 0px; +} +.n3 { + background-position : -96px 0px; +} +.n4 { + background-position : -128px 0px; +} +.n5 { + background-position : -160px 0px; +} +.n6 { + background-position : -192px 0px; +} +.n7 { + background-position : -224px 0px; +} +.n8 { + background-position : -256px 0px; +} +.n9 { + background-position : -288px 0px; +} + +.hiddenDot { + visibility: hidden; +} diff --git a/img/banner.png b/img/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..2cabdb72545c40a7c8f8cc60d710e05fd5550422 GIT binary patch literal 4598 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 literal 0 HcmV?d00001 diff --git a/img/font-red.png b/img/font-red.png new file mode 100644 index 0000000000000000000000000000000000000000..65d6f9c1fe017667a6a89ee78c02202fc66f59d1 GIT binary patch literal 5257 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 ViAjvr|FCnzIU5J-sx#jA{tL36j6DDV literal 0 HcmV?d00001 diff --git a/img/sprite.png b/img/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..fe94a65a9fe96818161d89d4cb6a6e47a6301c66 GIT binary patch literal 10872 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..0c974b6 --- /dev/null +++ b/index.html @@ -0,0 +1,82 @@ + + + + + Pacman + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+

+ Famous Namco©'s Pacman© is now available !!! +

+

+ Use your keyboard arrows to move Pacman to eat all energizer to complete the level.
+ Ghosts become frightened when Pacman eats a big energizer. Eat them !!!
+

+

+ Beware of ghost who haunt the maze !!! Each one has his own personality : +

+
Blinky tracks Pacman as his shadow.
+
+
Pinky perfoms ambushes to Pacman.
+
+
Inky is the least predictable.
+
+
Clyde pretends ignorance and is one who lags behind.
+ +

+

+

+
+
+
+
+ + + + + diff --git a/js/pacman-core.js b/js/pacman-core.js new file mode 100644 index 0000000..355866f --- /dev/null +++ b/js/pacman-core.js @@ -0,0 +1,1009 @@ +/* +Copyright (c) 2013 Fabrice ECAILLE aka Febbweiss + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +var Game = { + id : null, + type : "offline", + player : 1, + + PACMAN_START_X : 14 * TILE_SIZE, + PACMAN_START_Y : 24 * TILE_SIZE, + + GHOST_STATE_CHASE : 1, + GHOST_STATE_SCATTER : 2, + GHOST_STATE_FRIGHTENED : 3, + GHOST_STATE_IN_JAIL : 4, + GHOST_STATE_EATEN : 5, + GHOST_STATE_FRIGHTENED_BLINK : 6, + + + GHOST_EVENT_CHASE : "ghost_event_chase", + GHOST_EVENT_SCATTER : "ghost_event_scatter", + GHOST_EVENT_DOT_EATEN : "ghost_event_dot_eaten", + + DOT_POINTS : 10, + BIG_DOT_POINTS : 50, + totalDots : 0, + + dots : {}, + timer : null, + frightTimer : null, + bonusTimer : null, + level : -1, + levelData : null, + step : 0, + score : 0, + eatenDots : 0, + lives : 3, + running : false, + mode : 2, // Game.GHOST_STATE_SCATTER + frightMode : false, + eaten: 0, + + pacman : null, + miss : null, + hero : null, + blinky : null, + pinky : null, + inky : null, + clyde : null, + ghosts : new Array(), + actors : {}, + heroes : new Array(), + maze : MAZE, + + init : function() { + + GUI.updateMessage("READY"); + + $(".dot.hiddenDot").each( function(incr, elt) { + Game.dots[elt.id] = "dot"; + }); + $(".dot.hiddenDot").removeClass("hiddenDot"); + + $(".bigDot.hiddenDot").each( function(incr, elt) { + Game.dots[elt.id] = "bigDot"; + }); + $(".bigDot.hiddenDot").removeClass("hiddenDot") + + Game.totalDots = $(".dot").length + $(".bigDot").length; + + SCOREBOARD.init(); + SCOREBOARD.set_score( Game.score ); + + Game.level++; + Game.step = 0; + Game.eatenDots = 0; + + GUI.updateLevelNumber( Game.level + 1 ); + + Game.build(LEVELS[Math.min(Game.level, LEVELS.length)]); + }, + + build : function(data) { + Game.levelData = data; + Game.addPacman(); + Game.addGhosts(); + Sound.play("opening"); + setTimeout("Game.start();", 4500); + }, + + start : function() { + //if( $.browser.webkit ) + $(document).keydown( function( event ) { + if( event.which > 36 && event.which < 41 ) + return false; + } ); + // $(document).keypress(scrollPreventFct ); + + GUI.updateMessage(""); + Game.timer = new PausableTimer(Game.timerManager, Game.levelData.mode[Game.step] * 1000); + Game.running = true; + }, + + levelComplete : function() { + Game.running = false; + Game.timer.stop(); + Game.timer = null; + + setTimeout("Game.init();", 3000); + }, + + eat : function(type) { + Game.eatenDots++; + if( type === "bigDot" ) { + Game.score += Game.BIG_DOT_POINTS; +// console.log( "Eating big dot " + Game.score ); + SCOREBOARD.add( Game.BIG_DOT_POINTS ); + } else { + Game.score += Game.DOT_POINTS; +// console.log( "Eating dot " + Game.score ); + SCOREBOARD.add( Game.DOT_POINTS ); + } + + if( Game.eatenDots == 70 || Game.eatenDots == 170 ) { + Game.bonusTimer = setTimeout("Game.hideBonus();", ( 9 + Math.random() ) * 1000 ); + $("#" + Game.maze.bonus_target).addClass( Game.levelData.bonus.type); + } + + if( Game.eatenDots === Game.totalDots ) + Game.levelComplete(); + }, + + eatGhost : function(ghost) { + Sound.play("ghost"); + Game.eaten++; + var points = Game.eaten * 200; + Game.score += points; +// console.log(new Date() + " Eating " + ghost.id + " " + (Game.eaten * 200) + " "+ Game.score ); + SCOREBOARD.add( points ); + }, + + hideBonus : function() { + $("#" + Game.maze.bonus_target).removeClass( Game.levelData.bonus.type); + Game.bonusTimer = null; + }, + + die : function() { + Game.running = false; + $.each( Game.actors, function(index, actor) { + actor.speed = 0; + }) + Game.pacman.die(); + Game.timer.stop(); + Game.step = 0; + Game.timer = null; + $("#life" + Game.lives).effect( "pulsate", {times:3, mode:"hide"}, 500 ); + Game.lives--; + if( Game.lives > 0 ) + setTimeout( "Game.startAfterDie();", 3000); + else { + GUI.drawText( $("#message"), "GAME OVER", true ); + Game.show_game_over(); + } + }, + + show_game_over: function() { + }, + + startAfterDie : function() { + var dotsCounters = new Array(); + $.each(Game.ghosts, function(index, ghost ) { + dotsCounters[index] = ghost.dotsCounter; + }); + + Game.addGhosts(); + Game.addPacman(); + //Game.addMissPacman(); + + $.each(Game.ghosts, function(index, ghost ) { + ghost.dotsCounter = dotsCounters[index]; + if( ghost.dotsCounter >= ghost.dotsLimits[Math.min(Game.level, ghost.dotsLimits.length - 1)] ) { + ghost.speed = ghost.initialSpeed; + ghost.state_to(Game.GHOST_STATE_SCATTER); + } + }); + + Game.running = true; + Game.step = 0; + Game.timer = new PausableTimer(Game.timerManager, Game.levelData.mode[Game.step] * 1000); + }, + + timerManager : function() { + Game.step++; + if( Game.step % 2 == 1 ) { + $(".actor").trigger(Game.GHOST_EVENT_CHASE); + Game.mode = Game.GHOST_STATE_CHASE; + } else { + $(".actor").trigger(Game.GHOST_EVENT_SCATTER); + Game.mode = Game.GHOST_STATE_SCATTER; + } + if( Game.step < Game.levelData.mode.length - 1 && Game.levelData.mode[Game.step] != INFINITY ) + Game.timer = new PausableTimer(Game.timerManager, Game.levelData.mode[Game.step] * 1000); + }, + + addPacman : function() { + if( $("#pacman").length == 0) { + Game.pacman = new Pacman(); + $("#actors").addSprite("pacman", {animation: Game.pacman.animations["right"], posx:Game.pacman.x, posy: Game.pacman.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.pacman.node = $("#pacman"); + Game.pacman.node.addClass( "actor" ); + Game.actors[ "pacman" ] = Game.pacman; + Game.heroes[ "pacman" ] = Game.pacman; + + Game.hero = Game.pacman; + } + Game.pacman.init(); + Game.pacman.speed = Game.levelData.pacman.speed; + Game.pacman.left(); + }, + + addMissPacman : function() { + if( $("#miss_pacman").length == 0) { + Game.miss = new Pacman(); + Game.miss.animations["right"] = new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsety: 272, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }); + Game.miss.animations["up"] = new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsetx: 96, offsety: 272, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }); + + $("#actors").addSprite("miss_pacman", {animation: Game.miss.animations["right"], posx:Game.miss.x, posy: Game.miss.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.miss.node = $("#miss_pacman"); + Game.miss.node.addClass( "actor" ); + Game.actors[ "miss_pacman" ] = Game.miss; + Game.heroes[ "miss_pacman" ] = Game.miss; + } + Game.miss.init(); + Game.miss.x = Game.MISS_PACMAN_START_X; + Game.miss.y = Game.MISS_PACMAN_START_Y; + Game.miss.speed = Game.levelData.pacman.speed; + Game.miss.right(true); + Game.miss.left(true); + Game.miss.node.x(Game.miss.x); + Game.miss.node.y(Game.miss.y); + Game.miss.right(); + }, + + addGhosts : function() { + Game.addBlinky(); + Game.addPinky(); + Game.addInky(); + Game.addClyde(); + }, + + addBlinky : function() { + if( $("#blinky").length == 0 ) { + Game.blinky = new Ghost("blinky", 0, {x: 14 * TILE_SIZE, y: 14 * TILE_SIZE}, {x: 25, y: 0 }, function() { + var prey = Game.actors[ "blinky" ].prey; + return {x: prey.getTileX(), y: prey.getTileY()}; + }, [0,0,0], Game.GHOST_STATE_SCATTER); + Game.blinky.center(); + $("#actors").addSprite("blinky", {animation: Game.blinky.animations["right"], posx:Game.blinky.x, posy: Game.blinky.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.blinky.node = $("#blinky"); + Game.blinky.node.addClass( "actor" ); + Game.actors[ "blinky" ] = Game.blinky; + Game.blinky.loadBindings(); + + Game.blinky.originalTarget = Game.blinky.target; + Game.blinky.target = function() { + var remainingDots = Game.totalDots - Game.eatenDots; + var elroySpecs = Game.levelData.ghost; + if( ( Game.blinky.state == Game.GHOST_STATE_SCATTER || Game.blinky.state == Game.GHOST_STATE_CHASE ) && remainingDots <= elroySpecs.elroy1Dots ) { + if( remainingDots <= elroySpecs.elroy2Dots ) { + Game.blinky.speed = elroySpecs.elroy2Speed; + } + else { + Game.blinky.speed = elroySpecs.elroy1Speed; + } + + return Game.blinky.personnalTarget(); + } + return Game.blinky.originalTarget(); + }; + + Game.ghosts.push( Game.blinky ); + } else { + Game.blinky.init(); + } + Game.blinky.state = Game.GHOST_STATE_SCATTER; + Game.blinky.left(); + Game.blinky.initialSpeed = Game.levelData.ghost.speed; + Game.blinky.speed = Game.blinky.initialSpeed; + }, + + addPinky : function() { + if( $("#pinky").length == 0 ) { + Game.pinky = new Ghost("pinky", 1, {x: 14 * TILE_SIZE, y: 16 * TILE_SIZE}, {x: 2, y: 0 }, function() { + var prey = Game.actors[ "pinky" ].prey; + var direction = this.prey.direction; + if( direction % 2 == 0 ) + return {x: prey.getTileX() + (direction == LEFT ? -4 : 4), y: prey.getTileY()}; + else + return {x: prey.getTileX(), y: prey.getTileY() + (direction == UP ? -4 : 4) }; + }, [0,0,0], Game.GHOST_STATE_IN_JAIL); + Game.pinky.center(); + $("#actors").addSprite("pinky", {animation: Game.pinky.animations["right"], posx: Game.pinky.x, posy: Game.pinky.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.pinky.node = $("#pinky"); + Game.pinky.node.addClass( "actor" ); + Game.actors[ "pinky" ] = Game.pinky; + Game.pinky.loadBindings(); + + Game.ghosts.push( Game.pinky ); + } else { + Game.pinky.init(); + } + Game.pinky.initialSpeed = Game.levelData.ghost.speed; + Game.pinky.left(); + }, + + addInky : function() { + if( $("#inky").length == 0 ) { + Game.inky = new Ghost("inky", 2, {x: 12 * TILE_SIZE, y: 16 * TILE_SIZE}, {x: 27, y: 34 }, function() { + var prey = Game.actors[ "inky" ].prey; + var direction = prey.direction; + if( direction % 2 == 0 ) + direction = {x: prey.getTileX() + (direction == LEFT ? -2 : 2) - Game.blinky.getTileX(), y: prey.getTileY() - Game.blinky.getTileY()}; + else + direction = {x: prey.getTileX() - Game.blinky.getTileX(), y: prey.getTileY() + (direction == UP ? -2 : 2) - Game.blinky.getTileY()}; + return {x: direction.x * 2, y: direction.y * 2}; + }, [30,0,0], Game.GHOST_STATE_IN_JAIL); + Game.inky.center(); + $("#actors").addSprite("inky", {animation: Game.inky.animations["right"], posx:Game.inky.x, posy: Game.inky.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.inky.node = $("#inky"); + Game.inky.node.addClass( "actor" ); + Game.actors[ "inky" ] = Game.inky; + Game.inky.loadBindings(); + + Game.ghosts.push( Game.inky ); + } else { + Game.inky.init(); + } + Game.inky.initialSpeed = Game.levelData.ghost.speed; + Game.inky.right(); + }, + + addClyde : function() { + if( $("#clyde").length == 0 ) { + Game.clyde = new Ghost("clyde", 3, {x: 16 * TILE_SIZE, y: 16 * TILE_SIZE}, {x: 0, y: 34 }, function() { + var prey = Game.actors[ "clyde" ].prey; + return distance( {x: this.getTileX(), y: this.getTileY()} , {x: prey.getTileX(), y: prey.getTileY()}) < 8 ? + this.scatterTarget : {x: prey.getTileX(), y: prey.getTileY()}; + }, [60,50,0], Game.GHOST_STATE_IN_JAIL); + Game.clyde.center(); + $("#actors").addSprite("clyde", {animation: Game.clyde.animations["right"], posx:Game.clyde.x, posy: Game.clyde.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.clyde.node = $("#clyde"); + Game.clyde.node.addClass( "actor" ); + Game.actors[ "clyde" ] = Game.clyde; + Game.clyde.loadBindings(); + + Game.ghosts.push( Game.clyde ); + } else { + Game.clyde.init(); + } + Game.clyde.initialSpeed = Game.levelData.ghost.speed; + Game.clyde.left(); + }, + + moveGhosts : function() { + $.each(Game.ghosts, function(index, ghost ) { + ghost.move(); + }); + }, + + nearEndFright : function() { + $.each(Game.ghosts, function(index, ghost ) { + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_FRIGHTENED_BLINK); + }); + + setTimeout( 'Game.endFright();', 160 * 4 * Game.levelData.frightFlashesCount); + }, + + endFright : function() { + if( Game.timer ) + Game.timer.resume(); + Game.frightTimer = null; + Game.eaten = 0; + $('.actor').trigger( Game.mode == Game.GHOST_STATE_CHASE ? Game.GHOST_EVENT_CHASE : Game.GHOST_EVENT_SCATTER ); + } +} + +function distance(currentTile, target) { + return Math.sqrt( (target.x - currentTile.x) * (target.x - currentTile.x) + (target.y - currentTile.y)*(target.y - currentTile.y)); +}; + +//Game objects: +function Actor(){} +Actor.prototype = { + node : null, + animations : null, + x : null, + y : null, + speed : null, + direction : null, // 1: up, 2: left, 3:down, 4: right + directionX : 0, + directionY : 0, + + getX : function() { + return x; + }, + + getY : function() { + return y; + }, + + getTileX : function() { + return Math.floor(this.x / TILE_SIZE); + }, + + getTileY : function() { + return Math.floor(this.y / TILE_SIZE); + }, + + getTile : function() { + return this.getTileX() + this.getTileY() * WIDTH_TILE_COUNT; + }, + + getInsideTileX : function() { + return this.x % TILE_SIZE; + }, + + getInsideTileY : function() { + return this.y % TILE_SIZE; + }, + + move : function() { + if( !Game.running ) + return; + this.x += this.directionX * this.speed * ACTOR_SPEED; + this.y += this.directionY * this.speed * ACTOR_SPEED; + this.node.x(this.x ); + this.node.y(this.y ); + }, + + up : function( force ) { + if( force || this.direction != UP ) { + this.directionX = 0; + this.directionY = -1; + this.direction = UP; + this.node.setAnimation(this.animations["up"]); + this.node.flipv(false); + this.node.fliph(false); + this.center(); + } + }, + + down : function( force ) { + if( force || this.direction != DOWN ) { + this.directionX = 0; + this.directionY = 1; + this.direction = DOWN; + if( this.animations["down"] ) { + this.node.setAnimation(this.animations["down"]); + this.node.fliph( false ); + } else { + this.node.setAnimation(this.animations["up"]); + this.node.flipv( true ); + this.node.fliph( false ); + } + this.center(); + } + }, + + left : function( force ) { + if( force || this.direction != LEFT ) { + this.directionX = -1; + this.directionY = 0; + this.direction = LEFT; + this.node.flipv( false ); + if( this.animations["left"] ) { + this.node.setAnimation(this.animations["left"]); + } else { + this.node.setAnimation(this.animations["right"]); + this.node.fliph( true ); + } + this.center(); + } + }, + + right : function( force ) { + if( force || this.direction != RIGHT ) { + this.directionX = 1; + this.directionY = 0; + this.direction = RIGHT; + this.node.setAnimation(this.animations["right"]); + this.node.fliph( false ); + this.node.flipv( false ); + this.center(); + } + }, + + canLeft : function() { + return Game.maze.structure[this.getTileX() + this.getTileY() * WIDTH_TILE_COUNT - 1] <= 0; + }, + + canRight : function() { + return Game.maze.structure[this.getTileX() + this.getTileY() * WIDTH_TILE_COUNT + 1] <= 0; + }, + + canUp : function() { + return Game.maze.structure[this.getTileX() + (this.getTileY() - 1 ) * WIDTH_TILE_COUNT ] <= 0; + }, + + canDown : function() { + return Game.maze.structure[this.getTileX() + (this.getTileY() + 1 ) * WIDTH_TILE_COUNT ] <= 0; + }, + + isNearMiddleTile : function() { + return Math.abs( HALF_TILE_SIZE - this.getInsideTileX() ) < 4 && Math.abs( HALF_TILE_SIZE - this.getInsideTileY() ) < 4; + }, + + center : function() { + this.x = this.getTileX() * TILE_SIZE + HALF_TILE_SIZE; + this.y = this.getTileY() * TILE_SIZE + HALF_TILE_SIZE; + }, + + isInTunnel : function() { + var tile = this.getTile(); + return $.inArray(tile, Game.maze.tunnel) > -1; + } +}; + +/*********************************************/ +/****************** PACMAN *******************/ +/*********************************************/ +function Pacman() { + this.animations = { + "right": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsety: 16, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "up": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsetx: 64, offsety: 16, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "die": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 7, offsety: 208, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL | $.gameQuery.ANIMATION_ONCE | $.gameQuery.ANIMATION_CALLBACK }), + "die2": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 4, offsety: 240, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL | $.gameQuery.ANIMATION_ONCE }) + } +}; +Pacman.prototype = { + x : Game.PACMAN_START_X, + y : Game.PACMAN_START_Y, + speed : null, + directionX : 0, + directionY : 0, + lastEatenGhost : null, + + stop : false, + previousTile : null, + + init : function() { + this.x = Game.PACMAN_START_X; + this.y = Game.PACMAN_START_Y; + this.speed = Game.levelData.pacman.speed; + this.right(true); + this.left(true); + this.node.x(this.x); + this.node.y(this.y); + }, + + left : function() { + if( this.direction != LEFT && this.canLeft() ) { + this.stop = false; + this._super("left", arguments); + } + }, + + right : function() { + if( this.direction != RIGHT && this.canRight() ) { + this.stop = false; + this._super("right", arguments); + } + }, + + up : function() { + if( this.direction != UP && this.canUp() ) { + this.stop = false; + this._super("up", arguments); + } + }, + + down : function() { + if( this.direction != DOWN && this.canDown() ) { + this.stop = false; + this._super("down", arguments); + } + }, + + move : function() { + if( !this.stop ) { + this.previousTile = {x: this.getTileX(), y: this.getTileY()}; + this._super("move", arguments); + var currentTile = {x: this.getTileX(), y: this.getTileY()}; + if( this.previousTile.x !== currentTile.x || this.previousTile.y !== currentTile.y ) { + var id = this.getTile(); + if( Game.dots[ id ] ) + this.eatDot( id ); + if( id == Game.maze.bonus_target ) + this.eatBonus(); + this.eatGhosts(); + } + + var inTunnel = this.isInTunnel(); + if( this.x < 0 ) + this.x += PLAYGROUND_WIDTH; + if( this.x > PLAYGROUND_WIDTH ) + this.x -= PLAYGROUND_WIDTH; + switch( this.direction ) { + case LEFT : + if( !inTunnel && !this.canLeft() ) + this.stop = true; + break; + case RIGHT : + if( !inTunnel && !this.canRight() ) + this.stop = true; + break; + case UP : + if( !this.canUp() ) + this.stop = true; + break; + case DOWN : + if( !this.canDown() ) + this.stop = true; + break; + } + } + }, + + eatDot : function(id) { + Game.eat(Game.dots[id]); + $('.actor').trigger(Game.GHOST_EVENT_DOT_EATEN); + if( Game.dots[id] === "bigDot" ) { + $.each(Game.ghosts, function(index, ghost ) { + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_FRIGHTENED) + }); + + Game.timer.pause(); + if( Game.frightTimer ) + clearTimeout( Game.frightTimer ); + Game.frightTimer = setTimeout( 'Game.nearEndFright();', Game.levelData.frightTime * 1000 - 160 * 4 * Game.levelData.frightFlashesCount); + } + + Game.dots[id] = null; + $("#" + id ).addClass("hiddenDot"); + }, + + eatGhosts : function() { + var tile = this.getTile(); + $.each(Game.ghosts, function(index, ghost ) { + if( tile == ghost.getTile() ) { + Game.pacman.eatGhost( ghost ); + } + }); + }, + + eatGhost : function( ghost ) { + if( ghost.state == Game.GHOST_STATE_EATEN ) { +// console.log( ghost.id + " already eaten" ); + return; + } + if( ghost.state != Game.GHOST_STATE_FRIGHTENED && ghost.state != Game.GHOST_STATE_FRIGHTENED_BLINK ) { + Game.die(); + } else if( Game.pacman.lastEatenGhost !== ghost.id ){ + ghost.state_to(Game.GHOST_STATE_EATEN); +// console.log( "Eating " + ghost.id + " " + ghost.state ); + Game.eatGhost(ghost); + } + }, + + eatBonus : function() { + if( !$("#" + Game.maze.bonus_target).hasClass( Game.levelData.bonus.type) && Game.bonusTimer == null ) + return; + + Sound.play("fruit"); + + eatenBonus.push(Game.levelData.bonus.type); + Game.score += Game.levelData.bonus.points; +// console.log( "Eating bonus " + Game.levelData.bonus.points + " " + Game.score ); + SCOREBOARD.add( Game.levelData.bonus.points ); + Game.hideBonus(); + }, + + die : function() { + Sound.play("dies"); + this.node.setAnimation(this.animations["die"], function(node) { + Game.pacman.node.setAnimation(Game.pacman.animations["die2"]); + }); + } +}; + +// Overriding Actor.methods() method +heriter(Pacman.prototype, Actor.prototype); + +function Ghost(id, ghostIndex, start, scatterTarget, personnalTarget, dotsLimits, state ) { + this.animations = { + "normal_up": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsety: 48 + ghostIndex * 32, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "normal_right": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsetx: 128, offsety: 48 + ghostIndex * 32, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "normal_down": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsetx: 64, offsety: 48 + ghostIndex * 32, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "frightened": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsetx: 0, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "frightened_blink": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 4, offsetx: 0, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "eaten_up": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 1, offsetx: 128, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "eaten_down": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 1, offsetx: 160, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "eaten_right": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 1, offsetx: 192, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }) + } + this.animations["up"] = this.animations["normal_up"]; + this.animations["down"] = this.animations["normal_down"]; + this.animations["right"] = this.animations["normal_right"]; + + this.id = id; + this.scatterTarget = scatterTarget; + this.personnalTarget = personnalTarget; + this.x = start.x; + this.y = start.y; + this.startingTileX = start.x; + this.startingTileY = start.y; + + this.state = state; + + this.dotsLimits = dotsLimits; + + this.prey = Game.pacman; +}; + +Ghost.prototype = { + id : null, + startingTileX : 0, + startingTileY : 0, + initialSpeed : 0, + speed : 0, + directionX : 0, + directionY : 0, + + state: null, + scatterTarget : null, + lastDirectionTile : null, + + prey : null, + + dotsCounter : 0, + dotsLimits : [], + + init : function() { + this.dotsCounter = 0; + this.speed = 0; + this.x = this.startingTileX; + this.y = this.startingTileY; + this.right(true); + this.left(true); + this.state = Game.GHOST_STATE_IN_JAIL; + this.node.x(this.x); + this.node.y(this.y); + }, + + target : function() { + switch( this.state ) { + case Game.GHOST_STATE_CHASE : + return this.personnalTarget(); + case Game.GHOST_STATE_SCATTER : + return this.scatterTarget; + case Game.GHOST_STATE_FRIGHTENED : + var currentTile = {x: this.getTileX(), y: this.getTileY()}; + var targets = new Array(); + if( this.canUp() && this.direction != DOWN ) + targets.push( {x:currentTile.x, y:currentTile.y - 1} ); + if( this.canDown() && this.direction != UP ) + targets.push( {x:currentTile.x, y:currentTile.y + 1} ); + if( this.canLeft() && this.direction != RIGHT ) + targets.push( {x:currentTile.x - 1, y:currentTile.y} ); + if( this.canRight() && this.direction != LEFT ) + targets.push( {x:currentTile.x + 1, y:currentTile.y} ); + return targets[ parseInt(Math.random() * targets.length ) ]; + case Game.GHOST_STATE_IN_JAIL : + case Game.GHOST_STATE_EATEN : + return {x: 13, y: 14}; + } + }, + + loadBindings : function() { + this.node.bind(Game.GHOST_EVENT_CHASE, {ghost: this}, function(evt) { + var ghost = evt.data.ghost; + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_CHASE); + }); + this.node.bind(Game.GHOST_EVENT_SCATTER, {ghost: this}, function(evt) { + var ghost = evt.data.ghost; + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_SCATTER); + }); + this.node.bind(Game.GHOST_EVENT_DOT_EATEN, {ghost: this}, function(evt) { + var ghost = evt.data.ghost; + if( ghost.state == Game.GHOST_STATE_IN_JAIL && ghost.dotsCounter++ >= ghost.dotsLimits[Math.min(Game.level, ghost.dotsLimits.length - 1)] ) { + ghost.speed = ghost.initialSpeed; + ghost.state_to(Game.mode); + } + }); + }, + + personnalTarget : function() { + }, + + state_to : function( state ) { + var up; + var down; + var right; + var reverse = this.state != Game.GHOST_STATE_FRIGHTENED && this.state != Game.GHOST_STATE_IN_JAIL; // previous state + this.state = state; + switch( state ) { + case Game.GHOST_STATE_CHASE : + this.speed = Game.levelData.ghost.speed; + case Game.GHOST_STATE_SCATTER : + this.speed = Game.levelData.ghost.speed; + case Game.GHOST_STATE_IN_JAIL : + up = this.animations["normal_up"]; + down = this.animations["normal_down"]; + right = this.animations["normal_right"]; + break; + case Game.GHOST_STATE_FRIGHTENED : + up = down = right = this.animations["frightened"]; + this.speed = Game.levelData.ghost.frightSpeed; + break; + case Game.GHOST_STATE_FRIGHTENED_BLINK : + up = down = right = this.animations["frightened_blink"]; + this.state = Game.GHOST_STATE_FRIGHTENED; + break; + case Game.GHOST_STATE_EATEN : + up = this.animations["eaten_up"]; + down = this.animations["eaten_down"]; + right = this.animations["eaten_right"]; + this.speed = 1; + break; + } + + + this.animations["up"] = up; + this.animations["down"] = down; + this.animations["right"] = right; + + if( reverse ) + switch( this.direction ) { + case UP: + this.direction = DOWN; + break; + case LEFT: + this.direction = RIGHT; + break; + case DOWN: + this.direction = UP; + break; + case RIGHT: + this.direction = LEFT; + break; + } + + var inTunnel = this.isInTunnel(); + var distances = [ + {direction: UP, distance: this.canUp() && this.direction != DOWN ? 1 : INFINITY}, + {direction: LEFT, distance: (inTunnel && this.direction == LEFT ) || (this.canLeft() && this.direction != RIGHT) ? 1 : INFINITY}, + {direction: DOWN, distance: this.canDown() && this.direction != UP ? 1 : INFINITY}, + {direction: RIGHT, distance: (inTunnel && this.direction == RIGHT ) || (this.canRight() && this.direction != LEFT) ? 1 : INFINITY}, + ]; + distances.sort( function(a, b) { + if( a.distance == b.distance ) + return a.direction - b.direction; + return a.distance - b.distance; + }) + var selected = distances[0]; + + switch( selected.direction ) { + case UP: + this.up(true); + break; + case LEFT: + this.left(true); + break; + case DOWN: + this.down(true); + break; + case RIGHT: + this.right(true); + break; + } + + }, + + canUp : function() { + switch( this.getTile() ) { + case 404: + case 407: + case 684: + case 687: + return false; + case 461: + case 462: + return true; + default: + return Game.maze.structure[ this.getTileX() + (this.getTileY() - 1 ) * WIDTH_TILE_COUNT ] <= 0; + } + }, + + canDown : function() { + switch( this.getTile() ) { + case 405: + case 406: + return false; + default: + return Game.maze.structure[ this.getTileX() + (this.getTileY() + 1 ) * WIDTH_TILE_COUNT ] <= 0; + } + }, + + move : function() { + this._super("move", arguments); + var currentTile = {x: this.getTileX(), y: this.getTileY()}; + var id = this.getTile();; + if( this.lastDirectionTile != id && this.isNearMiddleTile()) { + this.lastDirectionTile = id; + this.eaten(); + + var distances = null; + var target = this.target(); + if( this.state == Game.GHOST_STATE_EATEN && id == Game.maze.ghost_frightened_target ) { + this.state_to(Game.mode); + } + + var inTunnel = this.isInTunnel(); + if( inTunnel ) + this.speed = Game.levelData.ghost.tunnelSpeed; + else if( this.state != Game.GHOST_STATE_IN_JAIL ) + this.speed = this.state == Game.GHOST_STATE_FRIGHTENED ? Game.levelData.ghost.frightSpeed : Game.levelData.ghost.speed; + + if( this.x < 0 ) + this.x += PLAYGROUND_WIDTH; + if( this.x > PLAYGROUND_WIDTH ) + this.x -= PLAYGROUND_WIDTH; + + if( Game.maze.choice_tiles.indexOf( id ) != -1 ) { + distances = [ + {direction: UP, distance: this.canUp() && this.direction != DOWN ? distance({x:currentTile.x, y:currentTile.y - 1}, target ) : INFINITY}, + {direction: LEFT, distance: this.canLeft() && this.direction != RIGHT ? distance( {x:currentTile.x - 1, y:currentTile.y }, target ) : INFINITY}, + {direction: DOWN, distance: this.canDown() && this.direction != UP ? distance({x:currentTile.x, y:currentTile.y + 1}, target ) : INFINITY}, + {direction: RIGHT, distance: this.canRight() && this.direction != LEFT ? distance({x:currentTile.x + 1, y:currentTile.y}, target ) : INFINITY}, + ]; + } else { + distances = [ + {direction: UP, distance: this.canUp() && this.direction != DOWN ? 1 : INFINITY}, + {direction: LEFT, distance: (inTunnel && this.direction == LEFT ) || (this.canLeft() && this.direction != RIGHT) ? 1 : INFINITY}, + {direction: DOWN, distance: this.canDown() && this.direction != UP ? 1 : INFINITY}, + {direction: RIGHT, distance: (inTunnel && this.direction == RIGHT ) || (this.canRight() && this.direction != LEFT) ? 1 : INFINITY}, + ]; + } + distances.sort( function(a, b) { + if( a.distance == b.distance ) + return a.direction - b.direction; + return a.distance - b.distance; + }) + var selected = distances[0]; + + switch( selected.direction ) { + case LEFT : + if( this.direction != LEFT ) + this.left(); + break; + case RIGHT : + if( this.direction != RIGHT ) + this.right(); + break; + case UP : + if( this.direction != UP ) + this.up(); + break; + case DOWN : + if( this.direction != DOWN ) + this.down(); + break; + } + } + + var inTunnel = this.isInTunnel(); + if( this.x < 0 ) + this.x += PLAYGROUND_WIDTH; + if( this.x > PLAYGROUND_WIDTH ) + this.x -= PLAYGROUND_WIDTH; + + }, + + eaten : function(target) { + if( typeof target === "undefined" ) + target = this; + if( target.getTile() == Game.pacman.getTile() ) { +// console.log(" Eaten from ghost" ); + Game.pacman.eatGhost(target); +// if( target.state != Game.GHOST_STATE_FRIGHTENED && target.state != Game.GHOST_STATE_EATEN ) { +// Game.die(); +// } else { +// target.state_to(Game.GHOST_STATE_EATEN); +// Game.eatGhost(this); +// } + } + } +}; + +heriter(Ghost.prototype, Actor.prototype); diff --git a/js/pacman-core.js~ b/js/pacman-core.js~ new file mode 100644 index 0000000..2439e15 --- /dev/null +++ b/js/pacman-core.js~ @@ -0,0 +1,999 @@ +var Game = { + id : null, + type : "offline", + player : 1, + + PACMAN_START_X : 14 * TILE_SIZE, + PACMAN_START_Y : 24 * TILE_SIZE, + + GHOST_STATE_CHASE : 1, + GHOST_STATE_SCATTER : 2, + GHOST_STATE_FRIGHTENED : 3, + GHOST_STATE_IN_JAIL : 4, + GHOST_STATE_EATEN : 5, + GHOST_STATE_FRIGHTENED_BLINK : 6, + + + GHOST_EVENT_CHASE : "ghost_event_chase", + GHOST_EVENT_SCATTER : "ghost_event_scatter", + GHOST_EVENT_DOT_EATEN : "ghost_event_dot_eaten", + + DOT_POINTS : 10, + BIG_DOT_POINTS : 50, + totalDots : 0, + + dots : {}, + timer : null, + frightTimer : null, + bonusTimer : null, + level : -1, + levelData : null, + step : 0, + score : 0, + eatenDots : 0, + lives : 3, + running : false, + mode : 2, // Game.GHOST_STATE_SCATTER + frightMode : false, + eaten: 0, + + pacman : null, + miss : null, + hero : null, + blinky : null, + pinky : null, + inky : null, + clyde : null, + ghosts : new Array(), + actors : {}, + heroes : new Array(), + maze : MAZE, + + init : function() { + + GUI.updateMessage("READY"); + + $(".dot.hiddenDot").each( function(incr, elt) { + Game.dots[elt.id] = "dot"; + }); + $(".dot.hiddenDot").removeClass("hiddenDot"); + + $(".bigDot.hiddenDot").each( function(incr, elt) { + Game.dots[elt.id] = "bigDot"; + }); + $(".bigDot.hiddenDot").removeClass("hiddenDot") + + Game.totalDots = $(".dot").length + $(".bigDot").length; + + SCOREBOARD.init(); + SCOREBOARD.set_score( Game.score ); + + Game.level++; + Game.step = 0; + Game.eatenDots = 0; + + GUI.updateLevelNumber( Game.level + 1 ); + + Game.build(LEVELS[Math.min(Game.level, LEVELS.length)]); + }, + + build : function(data) { + Game.levelData = data; + Game.addPacman(); + Game.addGhosts(); + Sound.play("opening"); + setTimeout("Game.start();", 4500); + }, + + start : function() { + //if( $.browser.webkit ) + $(document).keydown( function( event ) { + if( event.which > 36 && event.which < 41 ) + return false; + } ); + // $(document).keypress(scrollPreventFct ); + + GUI.updateMessage(""); + Game.timer = new PausableTimer(Game.timerManager, Game.levelData.mode[Game.step] * 1000); + Game.running = true; + }, + + levelComplete : function() { + Game.running = false; + Game.timer.stop(); + Game.timer = null; + + setTimeout("Game.init();", 3000); + }, + + eat : function(type) { + Game.eatenDots++; + if( type === "bigDot" ) { + Game.score += Game.BIG_DOT_POINTS; +// console.log( "Eating big dot " + Game.score ); + SCOREBOARD.add( Game.BIG_DOT_POINTS ); + } else { + Game.score += Game.DOT_POINTS; +// console.log( "Eating dot " + Game.score ); + SCOREBOARD.add( Game.DOT_POINTS ); + } + + if( Game.eatenDots == 70 || Game.eatenDots == 170 ) { + Game.bonusTimer = setTimeout("Game.hideBonus();", ( 9 + Math.random() ) * 1000 ); + $("#" + Game.maze.bonus_target).addClass( Game.levelData.bonus.type); + } + + if( Game.eatenDots === Game.totalDots ) + Game.levelComplete(); + }, + + eatGhost : function(ghost) { + Sound.play("ghost"); + Game.eaten++; + var points = Game.eaten * 200; + Game.score += points; +// console.log(new Date() + " Eating " + ghost.id + " " + (Game.eaten * 200) + " "+ Game.score ); + SCOREBOARD.add( points ); + }, + + hideBonus : function() { + $("#" + Game.maze.bonus_target).removeClass( Game.levelData.bonus.type); + Game.bonusTimer = null; + }, + + die : function() { + Game.running = false; + $.each( Game.actors, function(index, actor) { + actor.speed = 0; + }) + Game.pacman.die(); + Game.timer.stop(); + Game.step = 0; + Game.timer = null; + $("#life" + Game.lives).effect( "pulsate", {times:3, mode:"hide"}, 500 ); + Game.lives--; + if( Game.lives > 0 ) + setTimeout( "Game.startAfterDie();", 3000); + else { + GUI.drawText( $("#message"), "GAME OVER", true ); + Game.show_game_over(); + } + }, + + show_game_over: function() { + }, + + startAfterDie : function() { + var dotsCounters = new Array(); + $.each(Game.ghosts, function(index, ghost ) { + dotsCounters[index] = ghost.dotsCounter; + }); + + Game.addGhosts(); + Game.addPacman(); + //Game.addMissPacman(); + + $.each(Game.ghosts, function(index, ghost ) { + ghost.dotsCounter = dotsCounters[index]; + if( ghost.dotsCounter >= ghost.dotsLimits[Math.min(Game.level, ghost.dotsLimits.length - 1)] ) { + ghost.speed = ghost.initialSpeed; + ghost.state_to(Game.GHOST_STATE_SCATTER); + } + }); + + Game.running = true; + Game.step = 0; + Game.timer = new PausableTimer(Game.timerManager, Game.levelData.mode[Game.step] * 1000); + }, + + timerManager : function() { + Game.step++; + if( Game.step % 2 == 1 ) { + $(".actor").trigger(Game.GHOST_EVENT_CHASE); + Game.mode = Game.GHOST_STATE_CHASE; + } else { + $(".actor").trigger(Game.GHOST_EVENT_SCATTER); + Game.mode = Game.GHOST_STATE_SCATTER; + } + if( Game.step < Game.levelData.mode.length - 1 && Game.levelData.mode[Game.step] != INFINITY ) + Game.timer = new PausableTimer(Game.timerManager, Game.levelData.mode[Game.step] * 1000); + }, + + addPacman : function() { + if( $("#pacman").length == 0) { + Game.pacman = new Pacman(); + $("#actors").addSprite("pacman", {animation: Game.pacman.animations["right"], posx:Game.pacman.x, posy: Game.pacman.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.pacman.node = $("#pacman"); + Game.pacman.node.addClass( "actor" ); + Game.actors[ "pacman" ] = Game.pacman; + Game.heroes[ "pacman" ] = Game.pacman; + + Game.hero = Game.pacman; + } + Game.pacman.init(); + Game.pacman.speed = Game.levelData.pacman.speed; + Game.pacman.left(); + }, + + addMissPacman : function() { + if( $("#miss_pacman").length == 0) { + Game.miss = new Pacman(); + Game.miss.animations["right"] = new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsety: 272, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }); + Game.miss.animations["up"] = new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsetx: 96, offsety: 272, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }); + + $("#actors").addSprite("miss_pacman", {animation: Game.miss.animations["right"], posx:Game.miss.x, posy: Game.miss.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.miss.node = $("#miss_pacman"); + Game.miss.node.addClass( "actor" ); + Game.actors[ "miss_pacman" ] = Game.miss; + Game.heroes[ "miss_pacman" ] = Game.miss; + } + Game.miss.init(); + Game.miss.x = Game.MISS_PACMAN_START_X; + Game.miss.y = Game.MISS_PACMAN_START_Y; + Game.miss.speed = Game.levelData.pacman.speed; + Game.miss.right(true); + Game.miss.left(true); + Game.miss.node.x(Game.miss.x); + Game.miss.node.y(Game.miss.y); + Game.miss.right(); + }, + + addGhosts : function() { + Game.addBlinky(); + Game.addPinky(); + Game.addInky(); + Game.addClyde(); + }, + + addBlinky : function() { + if( $("#blinky").length == 0 ) { + Game.blinky = new Ghost("blinky", 0, {x: 14 * TILE_SIZE, y: 14 * TILE_SIZE}, {x: 25, y: 0 }, function() { + var prey = Game.actors[ "blinky" ].prey; + return {x: prey.getTileX(), y: prey.getTileY()}; + }, [0,0,0], Game.GHOST_STATE_SCATTER); + Game.blinky.center(); + $("#actors").addSprite("blinky", {animation: Game.blinky.animations["right"], posx:Game.blinky.x, posy: Game.blinky.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.blinky.node = $("#blinky"); + Game.blinky.node.addClass( "actor" ); + Game.actors[ "blinky" ] = Game.blinky; + Game.blinky.loadBindings(); + + Game.blinky.originalTarget = Game.blinky.target; + Game.blinky.target = function() { + var remainingDots = Game.totalDots - Game.eatenDots; + var elroySpecs = Game.levelData.ghost; + if( ( Game.blinky.state == Game.GHOST_STATE_SCATTER || Game.blinky.state == Game.GHOST_STATE_CHASE ) && remainingDots <= elroySpecs.elroy1Dots ) { + if( remainingDots <= elroySpecs.elroy2Dots ) { + Game.blinky.speed = elroySpecs.elroy2Speed; + } + else { + Game.blinky.speed = elroySpecs.elroy1Speed; + } + + return Game.blinky.personnalTarget(); + } + return Game.blinky.originalTarget(); + }; + + Game.ghosts.push( Game.blinky ); + } else { + Game.blinky.init(); + } + Game.blinky.state = Game.GHOST_STATE_SCATTER; + Game.blinky.left(); + Game.blinky.initialSpeed = Game.levelData.ghost.speed; + Game.blinky.speed = Game.blinky.initialSpeed; + }, + + addPinky : function() { + if( $("#pinky").length == 0 ) { + Game.pinky = new Ghost("pinky", 1, {x: 14 * TILE_SIZE, y: 16 * TILE_SIZE}, {x: 2, y: 0 }, function() { + var prey = Game.actors[ "pinky" ].prey; + var direction = this.prey.direction; + if( direction % 2 == 0 ) + return {x: prey.getTileX() + (direction == LEFT ? -4 : 4), y: prey.getTileY()}; + else + return {x: prey.getTileX(), y: prey.getTileY() + (direction == UP ? -4 : 4) }; + }, [0,0,0], Game.GHOST_STATE_IN_JAIL); + Game.pinky.center(); + $("#actors").addSprite("pinky", {animation: Game.pinky.animations["right"], posx: Game.pinky.x, posy: Game.pinky.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.pinky.node = $("#pinky"); + Game.pinky.node.addClass( "actor" ); + Game.actors[ "pinky" ] = Game.pinky; + Game.pinky.loadBindings(); + + Game.ghosts.push( Game.pinky ); + } else { + Game.pinky.init(); + } + Game.pinky.initialSpeed = Game.levelData.ghost.speed; + Game.pinky.left(); + }, + + addInky : function() { + if( $("#inky").length == 0 ) { + Game.inky = new Ghost("inky", 2, {x: 12 * TILE_SIZE, y: 16 * TILE_SIZE}, {x: 27, y: 34 }, function() { + var prey = Game.actors[ "inky" ].prey; + var direction = prey.direction; + if( direction % 2 == 0 ) + direction = {x: prey.getTileX() + (direction == LEFT ? -2 : 2) - Game.blinky.getTileX(), y: prey.getTileY() - Game.blinky.getTileY()}; + else + direction = {x: prey.getTileX() - Game.blinky.getTileX(), y: prey.getTileY() + (direction == UP ? -2 : 2) - Game.blinky.getTileY()}; + return {x: direction.x * 2, y: direction.y * 2}; + }, [30,0,0], Game.GHOST_STATE_IN_JAIL); + Game.inky.center(); + $("#actors").addSprite("inky", {animation: Game.inky.animations["right"], posx:Game.inky.x, posy: Game.inky.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.inky.node = $("#inky"); + Game.inky.node.addClass( "actor" ); + Game.actors[ "inky" ] = Game.inky; + Game.inky.loadBindings(); + + Game.ghosts.push( Game.inky ); + } else { + Game.inky.init(); + } + Game.inky.initialSpeed = Game.levelData.ghost.speed; + Game.inky.right(); + }, + + addClyde : function() { + if( $("#clyde").length == 0 ) { + Game.clyde = new Ghost("clyde", 3, {x: 16 * TILE_SIZE, y: 16 * TILE_SIZE}, {x: 0, y: 34 }, function() { + var prey = Game.actors[ "clyde" ].prey; + return distance( {x: this.getTileX(), y: this.getTileY()} , {x: prey.getTileX(), y: prey.getTileY()}) < 8 ? + this.scatterTarget : {x: prey.getTileX(), y: prey.getTileY()}; + }, [60,50,0], Game.GHOST_STATE_IN_JAIL); + Game.clyde.center(); + $("#actors").addSprite("clyde", {animation: Game.clyde.animations["right"], posx:Game.clyde.x, posy: Game.clyde.y, width: ACTOR_SIZE, height: ACTOR_SIZE}); + Game.clyde.node = $("#clyde"); + Game.clyde.node.addClass( "actor" ); + Game.actors[ "clyde" ] = Game.clyde; + Game.clyde.loadBindings(); + + Game.ghosts.push( Game.clyde ); + } else { + Game.clyde.init(); + } + Game.clyde.initialSpeed = Game.levelData.ghost.speed; + Game.clyde.left(); + }, + + moveGhosts : function() { + $.each(Game.ghosts, function(index, ghost ) { + ghost.move(); + }); + }, + + nearEndFright : function() { + $.each(Game.ghosts, function(index, ghost ) { + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_FRIGHTENED_BLINK); + }); + + setTimeout( 'Game.endFright();', 160 * 4 * Game.levelData.frightFlashesCount); + }, + + endFright : function() { + if( Game.timer ) + Game.timer.resume(); + Game.frightTimer = null; + Game.eaten = 0; + $('.actor').trigger( Game.mode == Game.GHOST_STATE_CHASE ? Game.GHOST_EVENT_CHASE : Game.GHOST_EVENT_SCATTER ); + } +} + +function distance(currentTile, target) { + return Math.sqrt( (target.x - currentTile.x) * (target.x - currentTile.x) + (target.y - currentTile.y)*(target.y - currentTile.y)); +}; + +//Game objects: +function Actor(){} +Actor.prototype = { + node : null, + animations : null, + x : null, + y : null, + speed : null, + direction : null, // 1: up, 2: left, 3:down, 4: right + directionX : 0, + directionY : 0, + + getX : function() { + return x; + }, + + getY : function() { + return y; + }, + + getTileX : function() { + return Math.floor(this.x / TILE_SIZE); + }, + + getTileY : function() { + return Math.floor(this.y / TILE_SIZE); + }, + + getTile : function() { + return this.getTileX() + this.getTileY() * WIDTH_TILE_COUNT; + }, + + getInsideTileX : function() { + return this.x % TILE_SIZE; + }, + + getInsideTileY : function() { + return this.y % TILE_SIZE; + }, + + move : function() { + if( !Game.running ) + return; + this.x += this.directionX * this.speed * ACTOR_SPEED; + this.y += this.directionY * this.speed * ACTOR_SPEED; + this.node.x(this.x ); + this.node.y(this.y ); + }, + + up : function( force ) { + if( force || this.direction != UP ) { + this.directionX = 0; + this.directionY = -1; + this.direction = UP; + this.node.setAnimation(this.animations["up"]); + this.node.flipv(false); + this.node.fliph(false); + this.center(); + } + }, + + down : function( force ) { + if( force || this.direction != DOWN ) { + this.directionX = 0; + this.directionY = 1; + this.direction = DOWN; + if( this.animations["down"] ) { + this.node.setAnimation(this.animations["down"]); + this.node.fliph( false ); + } else { + this.node.setAnimation(this.animations["up"]); + this.node.flipv( true ); + this.node.fliph( false ); + } + this.center(); + } + }, + + left : function( force ) { + if( force || this.direction != LEFT ) { + this.directionX = -1; + this.directionY = 0; + this.direction = LEFT; + this.node.flipv( false ); + if( this.animations["left"] ) { + this.node.setAnimation(this.animations["left"]); + } else { + this.node.setAnimation(this.animations["right"]); + this.node.fliph( true ); + } + this.center(); + } + }, + + right : function( force ) { + if( force || this.direction != RIGHT ) { + this.directionX = 1; + this.directionY = 0; + this.direction = RIGHT; + this.node.setAnimation(this.animations["right"]); + this.node.fliph( false ); + this.node.flipv( false ); + this.center(); + } + }, + + canLeft : function() { + return Game.maze.structure[this.getTileX() + this.getTileY() * WIDTH_TILE_COUNT - 1] <= 0; + }, + + canRight : function() { + return Game.maze.structure[this.getTileX() + this.getTileY() * WIDTH_TILE_COUNT + 1] <= 0; + }, + + canUp : function() { + return Game.maze.structure[this.getTileX() + (this.getTileY() - 1 ) * WIDTH_TILE_COUNT ] <= 0; + }, + + canDown : function() { + return Game.maze.structure[this.getTileX() + (this.getTileY() + 1 ) * WIDTH_TILE_COUNT ] <= 0; + }, + + isNearMiddleTile : function() { + return Math.abs( HALF_TILE_SIZE - this.getInsideTileX() ) < 4 && Math.abs( HALF_TILE_SIZE - this.getInsideTileY() ) < 4; + }, + + center : function() { + this.x = this.getTileX() * TILE_SIZE + HALF_TILE_SIZE; + this.y = this.getTileY() * TILE_SIZE + HALF_TILE_SIZE; + }, + + isInTunnel : function() { + var tile = this.getTile(); + return $.inArray(tile, Game.maze.tunnel) > -1; + } +}; + +/*********************************************/ +/****************** PACMAN *******************/ +/*********************************************/ +function Pacman() { + this.animations = { + "right": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsety: 16, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "up": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 3, offsetx: 64, offsety: 16, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "die": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 7, offsety: 208, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL | $.gameQuery.ANIMATION_ONCE | $.gameQuery.ANIMATION_CALLBACK }), + "die2": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 4, offsety: 240, delta: ACTOR_SIZE, rate: 120, type: $.gameQuery.ANIMATION_HORIZONTAL | $.gameQuery.ANIMATION_ONCE }) + } +}; +Pacman.prototype = { + x : Game.PACMAN_START_X, + y : Game.PACMAN_START_Y, + speed : null, + directionX : 0, + directionY : 0, + lastEatenGhost : null, + + stop : false, + previousTile : null, + + init : function() { + this.x = Game.PACMAN_START_X; + this.y = Game.PACMAN_START_Y; + this.speed = Game.levelData.pacman.speed; + this.right(true); + this.left(true); + this.node.x(this.x); + this.node.y(this.y); + }, + + left : function() { + if( this.direction != LEFT && this.canLeft() ) { + this.stop = false; + this._super("left", arguments); + } + }, + + right : function() { + if( this.direction != RIGHT && this.canRight() ) { + this.stop = false; + this._super("right", arguments); + } + }, + + up : function() { + if( this.direction != UP && this.canUp() ) { + this.stop = false; + this._super("up", arguments); + } + }, + + down : function() { + if( this.direction != DOWN && this.canDown() ) { + this.stop = false; + this._super("down", arguments); + } + }, + + move : function() { + if( !this.stop ) { + this.previousTile = {x: this.getTileX(), y: this.getTileY()}; + this._super("move", arguments); + var currentTile = {x: this.getTileX(), y: this.getTileY()}; + if( this.previousTile.x !== currentTile.x || this.previousTile.y !== currentTile.y ) { + var id = this.getTile(); + if( Game.dots[ id ] ) + this.eatDot( id ); + if( id == Game.maze.bonus_target ) + this.eatBonus(); + this.eatGhosts(); + } + + var inTunnel = this.isInTunnel(); + if( this.x < 0 ) + this.x += PLAYGROUND_WIDTH; + if( this.x > PLAYGROUND_WIDTH ) + this.x -= PLAYGROUND_WIDTH; + switch( this.direction ) { + case LEFT : + if( !inTunnel && !this.canLeft() ) + this.stop = true; + break; + case RIGHT : + if( !inTunnel && !this.canRight() ) + this.stop = true; + break; + case UP : + if( !this.canUp() ) + this.stop = true; + break; + case DOWN : + if( !this.canDown() ) + this.stop = true; + break; + } + } + }, + + eatDot : function(id) { + Game.eat(Game.dots[id]); + $('.actor').trigger(Game.GHOST_EVENT_DOT_EATEN); + if( Game.dots[id] === "bigDot" ) { + $.each(Game.ghosts, function(index, ghost ) { + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_FRIGHTENED) + }); + + Game.timer.pause(); + if( Game.frightTimer ) + clearTimeout( Game.frightTimer ); + Game.frightTimer = setTimeout( 'Game.nearEndFright();', Game.levelData.frightTime * 1000 - 160 * 4 * Game.levelData.frightFlashesCount); + } + + Game.dots[id] = null; + $("#" + id ).addClass("hiddenDot"); + }, + + eatGhosts : function() { + var tile = this.getTile(); + $.each(Game.ghosts, function(index, ghost ) { + if( tile == ghost.getTile() ) { + Game.pacman.eatGhost( ghost ); + } + }); + }, + + eatGhost : function( ghost ) { + if( ghost.state == Game.GHOST_STATE_EATEN ) { +// console.log( ghost.id + " already eaten" ); + return; + } + if( ghost.state != Game.GHOST_STATE_FRIGHTENED && ghost.state != Game.GHOST_STATE_FRIGHTENED_BLINK ) { + Game.die(); + } else if( Game.pacman.lastEatenGhost !== ghost.id ){ + ghost.state_to(Game.GHOST_STATE_EATEN); +// console.log( "Eating " + ghost.id + " " + ghost.state ); + Game.eatGhost(ghost); + } + }, + + eatBonus : function() { + if( !$("#" + Game.maze.bonus_target).hasClass( Game.levelData.bonus.type) && Game.bonusTimer == null ) + return; + + Sound.play("fruit); + + eatenBonus.push(Game.levelData.bonus.type); + Game.score += Game.levelData.bonus.points; +// console.log( "Eating bonus " + Game.levelData.bonus.points + " " + Game.score ); + SCOREBOARD.add( Game.levelData.bonus.points ); + Game.hideBonus(); + }, + + die : function() { + Sound.play("dies"); + this.node.setAnimation(this.animations["die"], function(node) { + Game.pacman.node.setAnimation(Game.pacman.animations["die2"]); + }); + } +}; + +// Overriding Actor.methods() method +heriter(Pacman.prototype, Actor.prototype); + +function Ghost(id, ghostIndex, start, scatterTarget, personnalTarget, dotsLimits, state ) { + this.animations = { + "normal_up": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsety: 48 + ghostIndex * 32, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "normal_right": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsetx: 128, offsety: 48 + ghostIndex * 32, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "normal_down": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsetx: 64, offsety: 48 + ghostIndex * 32, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "frightened": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 2, offsetx: 0, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "frightened_blink": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 4, offsetx: 0, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "eaten_up": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 1, offsetx: 128, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "eaten_down": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 1, offsetx: 160, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }), + "eaten_right": new $.gameQuery.Animation({imageURL: "img/sprite.png", numberOfFrame: 1, offsetx: 192, offsety: 176, delta: ACTOR_SIZE, rate: 160, type: $.gameQuery.ANIMATION_HORIZONTAL }) + } + this.animations["up"] = this.animations["normal_up"]; + this.animations["down"] = this.animations["normal_down"]; + this.animations["right"] = this.animations["normal_right"]; + + this.id = id; + this.scatterTarget = scatterTarget; + this.personnalTarget = personnalTarget; + this.x = start.x; + this.y = start.y; + this.startingTileX = start.x; + this.startingTileY = start.y; + + this.state = state; + + this.dotsLimits = dotsLimits; + + this.prey = Game.pacman; +}; + +Ghost.prototype = { + id : null, + startingTileX : 0, + startingTileY : 0, + initialSpeed : 0, + speed : 0, + directionX : 0, + directionY : 0, + + state: null, + scatterTarget : null, + lastDirectionTile : null, + + prey : null, + + dotsCounter : 0, + dotsLimits : [], + + init : function() { + this.dotsCounter = 0; + this.speed = 0; + this.x = this.startingTileX; + this.y = this.startingTileY; + this.right(true); + this.left(true); + this.state = Game.GHOST_STATE_IN_JAIL; + this.node.x(this.x); + this.node.y(this.y); + }, + + target : function() { + switch( this.state ) { + case Game.GHOST_STATE_CHASE : + return this.personnalTarget(); + case Game.GHOST_STATE_SCATTER : + return this.scatterTarget; + case Game.GHOST_STATE_FRIGHTENED : + var currentTile = {x: this.getTileX(), y: this.getTileY()}; + var targets = new Array(); + if( this.canUp() && this.direction != DOWN ) + targets.push( {x:currentTile.x, y:currentTile.y - 1} ); + if( this.canDown() && this.direction != UP ) + targets.push( {x:currentTile.x, y:currentTile.y + 1} ); + if( this.canLeft() && this.direction != RIGHT ) + targets.push( {x:currentTile.x - 1, y:currentTile.y} ); + if( this.canRight() && this.direction != LEFT ) + targets.push( {x:currentTile.x + 1, y:currentTile.y} ); + return targets[ parseInt(Math.random() * targets.length ) ]; + case Game.GHOST_STATE_IN_JAIL : + case Game.GHOST_STATE_EATEN : + return {x: 13, y: 14}; + } + }, + + loadBindings : function() { + this.node.bind(Game.GHOST_EVENT_CHASE, {ghost: this}, function(evt) { + var ghost = evt.data.ghost; + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_CHASE); + }); + this.node.bind(Game.GHOST_EVENT_SCATTER, {ghost: this}, function(evt) { + var ghost = evt.data.ghost; + if( ghost.state != Game.GHOST_STATE_IN_JAIL && ghost.state != Game.GHOST_STATE_EATEN ) + ghost.state_to(Game.GHOST_STATE_SCATTER); + }); + this.node.bind(Game.GHOST_EVENT_DOT_EATEN, {ghost: this}, function(evt) { + var ghost = evt.data.ghost; + if( ghost.state == Game.GHOST_STATE_IN_JAIL && ghost.dotsCounter++ >= ghost.dotsLimits[Math.min(Game.level, ghost.dotsLimits.length - 1)] ) { + ghost.speed = ghost.initialSpeed; + ghost.state_to(Game.mode); + } + }); + }, + + personnalTarget : function() { + }, + + state_to : function( state ) { + var up; + var down; + var right; + var reverse = this.state != Game.GHOST_STATE_FRIGHTENED && this.state != Game.GHOST_STATE_IN_JAIL; // previous state + this.state = state; + switch( state ) { + case Game.GHOST_STATE_CHASE : + this.speed = Game.levelData.ghost.speed; + case Game.GHOST_STATE_SCATTER : + this.speed = Game.levelData.ghost.speed; + case Game.GHOST_STATE_IN_JAIL : + up = this.animations["normal_up"]; + down = this.animations["normal_down"]; + right = this.animations["normal_right"]; + break; + case Game.GHOST_STATE_FRIGHTENED : + up = down = right = this.animations["frightened"]; + this.speed = Game.levelData.ghost.frightSpeed; + break; + case Game.GHOST_STATE_FRIGHTENED_BLINK : + up = down = right = this.animations["frightened_blink"]; + this.state = Game.GHOST_STATE_FRIGHTENED; + break; + case Game.GHOST_STATE_EATEN : + up = this.animations["eaten_up"]; + down = this.animations["eaten_down"]; + right = this.animations["eaten_right"]; + this.speed = 1; + break; + } + + + this.animations["up"] = up; + this.animations["down"] = down; + this.animations["right"] = right; + + if( reverse ) + switch( this.direction ) { + case UP: + this.direction = DOWN; + break; + case LEFT: + this.direction = RIGHT; + break; + case DOWN: + this.direction = UP; + break; + case RIGHT: + this.direction = LEFT; + break; + } + + var inTunnel = this.isInTunnel(); + var distances = [ + {direction: UP, distance: this.canUp() && this.direction != DOWN ? 1 : INFINITY}, + {direction: LEFT, distance: (inTunnel && this.direction == LEFT ) || (this.canLeft() && this.direction != RIGHT) ? 1 : INFINITY}, + {direction: DOWN, distance: this.canDown() && this.direction != UP ? 1 : INFINITY}, + {direction: RIGHT, distance: (inTunnel && this.direction == RIGHT ) || (this.canRight() && this.direction != LEFT) ? 1 : INFINITY}, + ]; + distances.sort( function(a, b) { + if( a.distance == b.distance ) + return a.direction - b.direction; + return a.distance - b.distance; + }) + var selected = distances[0]; + + switch( selected.direction ) { + case UP: + this.up(true); + break; + case LEFT: + this.left(true); + break; + case DOWN: + this.down(true); + break; + case RIGHT: + this.right(true); + break; + } + + }, + + canUp : function() { + switch( this.getTile() ) { + case 404: + case 407: + case 684: + case 687: + return false; + case 461: + case 462: + return true; + default: + return Game.maze.structure[ this.getTileX() + (this.getTileY() - 1 ) * WIDTH_TILE_COUNT ] <= 0; + } + }, + + canDown : function() { + switch( this.getTile() ) { + case 405: + case 406: + return false; + default: + return Game.maze.structure[ this.getTileX() + (this.getTileY() + 1 ) * WIDTH_TILE_COUNT ] <= 0; + } + }, + + move : function() { + this._super("move", arguments); + var currentTile = {x: this.getTileX(), y: this.getTileY()}; + var id = this.getTile();; + if( this.lastDirectionTile != id && this.isNearMiddleTile()) { + this.lastDirectionTile = id; + this.eaten(); + + var distances = null; + var target = this.target(); + if( this.state == Game.GHOST_STATE_EATEN && id == Game.maze.ghost_frightened_target ) { + this.state_to(Game.mode); + } + + var inTunnel = this.isInTunnel(); + if( inTunnel ) + this.speed = Game.levelData.ghost.tunnelSpeed; + else if( this.state != Game.GHOST_STATE_IN_JAIL ) + this.speed = this.state == Game.GHOST_STATE_FRIGHTENED ? Game.levelData.ghost.frightSpeed : Game.levelData.ghost.speed; + + if( this.x < 0 ) + this.x += PLAYGROUND_WIDTH; + if( this.x > PLAYGROUND_WIDTH ) + this.x -= PLAYGROUND_WIDTH; + + if( Game.maze.choice_tiles.indexOf( id ) != -1 ) { + distances = [ + {direction: UP, distance: this.canUp() && this.direction != DOWN ? distance({x:currentTile.x, y:currentTile.y - 1}, target ) : INFINITY}, + {direction: LEFT, distance: this.canLeft() && this.direction != RIGHT ? distance( {x:currentTile.x - 1, y:currentTile.y }, target ) : INFINITY}, + {direction: DOWN, distance: this.canDown() && this.direction != UP ? distance({x:currentTile.x, y:currentTile.y + 1}, target ) : INFINITY}, + {direction: RIGHT, distance: this.canRight() && this.direction != LEFT ? distance({x:currentTile.x + 1, y:currentTile.y}, target ) : INFINITY}, + ]; + } else { + distances = [ + {direction: UP, distance: this.canUp() && this.direction != DOWN ? 1 : INFINITY}, + {direction: LEFT, distance: (inTunnel && this.direction == LEFT ) || (this.canLeft() && this.direction != RIGHT) ? 1 : INFINITY}, + {direction: DOWN, distance: this.canDown() && this.direction != UP ? 1 : INFINITY}, + {direction: RIGHT, distance: (inTunnel && this.direction == RIGHT ) || (this.canRight() && this.direction != LEFT) ? 1 : INFINITY}, + ]; + } + distances.sort( function(a, b) { + if( a.distance == b.distance ) + return a.direction - b.direction; + return a.distance - b.distance; + }) + var selected = distances[0]; + + switch( selected.direction ) { + case LEFT : + if( this.direction != LEFT ) + this.left(); + break; + case RIGHT : + if( this.direction != RIGHT ) + this.right(); + break; + case UP : + if( this.direction != UP ) + this.up(); + break; + case DOWN : + if( this.direction != DOWN ) + this.down(); + break; + } + } + + var inTunnel = this.isInTunnel(); + if( this.x < 0 ) + this.x += PLAYGROUND_WIDTH; + if( this.x > PLAYGROUND_WIDTH ) + this.x -= PLAYGROUND_WIDTH; + + }, + + eaten : function(target) { + if( typeof target === "undefined" ) + target = this; + if( target.getTile() == Game.pacman.getTile() ) { +// console.log(" Eaten from ghost" ); + Game.pacman.eatGhost(target); +// if( target.state != Game.GHOST_STATE_FRIGHTENED && target.state != Game.GHOST_STATE_EATEN ) { +// Game.die(); +// } else { +// target.state_to(Game.GHOST_STATE_EATEN); +// Game.eatGhost(this); +// } + } + } +}; + +heriter(Ghost.prototype, Actor.prototype); diff --git a/js/pacman-data.js b/js/pacman-data.js new file mode 100644 index 0000000..5e1b030 --- /dev/null +++ b/js/pacman-data.js @@ -0,0 +1,2 @@ +MAZE = {"structure":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,9,9,9,9,9,9,9,9,9,9,9,9,2,1,9,9,9,9,9,9,9,9,9,9,9,9,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,11,-1,1,9,9,2,-1,1,9,9,9,2,-1,11,10,-1,1,9,9,9,2,-1,1,9,9,2,-1,10,11,-2,10,0,0,11,-1,11,0,0,0,10,-1,11,10,-1,11,0,0,0,10,-1,11,0,0,10,-2,10,11,-1,3,9,9,4,-1,3,9,9,9,4,-1,3,4,-1,3,9,9,9,4,-1,3,9,9,4,-1,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,11,-1,1,9,9,2,-1,1,2,-1,1,9,9,9,9,9,9,2,-1,1,2,-1,1,9,9,2,-1,10,11,-1,3,9,9,4,-1,10,11,-1,3,9,9,2,1,9,9,4,-1,10,11,-1,3,9,9,4,-1,10,11,-1,-1,-1,-1,-1,-1,10,11,-1,-1,-1,-1,11,10,-1,-1,-1,-1,10,11,-1,-1,-1,-1,-1,-1,10,3,9,9,9,9,2,-1,10,3,9,9,2,0,11,10,0,1,9,9,4,11,-1,1,9,9,9,9,4,0,0,0,0,0,10,-1,10,1,9,9,4,0,3,4,0,3,9,9,2,11,-1,11,0,0,0,0,0,0,0,0,0,0,10,-1,10,11,0,0,0,0,0,0,0,0,0,0,10,11,-1,11,0,0,0,0,0,9,9,9,9,9,4,-1,3,4,0,5,9,9,12,12,9,9,6,0,3,4,-1,3,9,9,9,9,9,0,0,0,0,0,0,-1,0,0,0,11,0,0,0,0,0,0,10,0,0,0,-1,0,0,0,0,0,0,9,9,9,9,9,2,-1,1,2,0,7,9,9,9,9,9,9,8,0,1,2,-1,1,9,9,9,9,9,0,0,0,0,0,10,-1,11,10,0,0,0,0,0,0,0,0,0,0,11,10,-1,11,0,0,0,0,0,0,0,0,0,0,10,-1,11,10,0,1,9,9,9,9,9,9,2,0,11,10,-1,11,0,0,0,0,0,1,9,9,9,9,4,-1,3,4,0,3,9,9,2,1,9,9,4,0,3,4,-1,3,9,9,9,9,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,11,-1,1,9,9,2,-1,1,9,9,9,2,-1,11,10,-1,1,9,9,9,2,-1,1,9,9,2,-1,10,11,-1,3,9,2,10,-1,3,9,9,9,4,-1,3,4,-1,3,9,9,9,4,-1,11,1,9,4,-1,10,11,-2,-1,-1,10,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,10,-1,-1,-2,10,3,9,2,-1,10,10,-1,1,2,-1,1,9,9,9,9,9,9,2,-1,1,2,-1,11,10,-1,1,9,4,1,9,4,-1,3,4,-1,11,10,-1,3,9,9,2,1,9,9,4,-1,11,10,-1,3,4,-1,3,9,2,11,-1,-1,-1,-1,-1,-1,11,10,-1,-1,-1,-1,11,10,-1,-1,-1,-1,11,10,-1,-1,-1,-1,-1,-1,10,11,-1,1,9,9,9,9,4,3,9,9,2,-1,11,10,-1,1,9,9,4,3,9,9,9,9,2,-1,10,11,-1,3,9,9,9,9,9,9,9,9,4,-1,3,4,-1,3,9,9,9,9,9,9,9,9,4,-1,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,3,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,4],"bonus_target":518,"tunnel":[448,449,450,451,452,471,472,473,474,475],"ghost_frightened_target":405,"choice_tiles":[118,133,225,230,233,236,239,242,245,250,314,329,404,407,454,457,466,469,513,522,594,597,606,609,678,681,684,687,690,693,759,780,852,855]}; + var LEVELS = [{"pacman":{"speed":0.8,"eating":0.71,"frightSpeed":0.9,"frightSpeedEating":0.79},"ghost":{"speed":0.75,"tunnelSpeed":0.4,"elroy1Speed":0.8,"elroy1Dots":20,"elroy2Speed":0.85,"elroy2Dots":10,"frightSpeed":0.5},"frightTime":6,"frightFlashesCount":5,"mode":[7,20,7,20,5,20,5,1410065407],"bonus":{"type":"cherries","points":100}},{"pacman":{"speed":0.9,"eating":0.79,"frightSpeed":0.95,"frightSpeedEating":0.83},"ghost":{"speed":0.85,"tunnelSpeed":0.45,"elroy1Speed":0.9,"elroy1Dots":30,"elroy2Speed":0.95,"elroy2Dots":15,"frightSpeed":0.55},"frightTime":5,"frightFlashesCount":5,"mode":[7,20,7,20,5,1033,0.0166666667,1410065407],"bonus":{"type":"strawberry","points":300}},{"pacman":{"speed":0.9,"eating":0.79,"frightSpeed":0.95,"frightSpeedEating":0.83},"ghost":{"speed":0.85,"tunnelSpeed":0.45,"elroy1Speed":0.9,"elroy1Dots":40,"elroy2Speed":0.95,"elroy2Dots":20,"frightSpeed":0.55},"frightTime":4,"frightFlashesCount":5,"mode":[7,20,7,20,5,1033,0.0166666667,1410065407],"bonus":{"type":"peach","points":500}},{"pacman":{"speed":0.9,"eating":0.79,"frightSpeed":0.95,"frightSpeedEating":0.83},"ghost":{"speed":0.85,"tunnelSpeed":0.45,"elroy1Speed":0.9,"elroy1Dots":40,"elroy2Speed":0.95,"elroy2Dots":20,"frightSpeed":0.55},"frightTime":3,"frightFlashesCount":5,"mode":[7,20,7,20,5,1033,0.0166666667,1410065407],"bonus":{"type":"peach","points":500}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":40,"elroy2Speed":1.05,"elroy2Dots":20,"frightSpeed":0.6},"frightTime":2,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"apple","points":700}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":50,"elroy2Speed":1.05,"elroy2Dots":25,"frightSpeed":0.6},"frightTime":5,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"apple","points":700}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":50,"elroy2Speed":1.05,"elroy2Dots":25,"frightSpeed":0.6},"frightTime":2,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"grapes","points":1000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":50,"elroy2Speed":1.05,"elroy2Dots":25,"frightSpeed":0.6},"frightTime":2,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"grapes","points":1000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":60,"elroy2Speed":1.05,"elroy2Dots":30,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"galaxian","points":2000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":60,"elroy2Speed":1.05,"elroy2Dots":30,"frightSpeed":0.6},"frightTime":5,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"galaxian","points":2000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":60,"elroy2Speed":1.05,"elroy2Dots":30,"frightSpeed":0.6},"frightTime":2,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"bell","points":3000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":80,"elroy2Speed":1.05,"elroy2Dots":40,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"bell","points":3000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":80,"elroy2Speed":1.05,"elroy2Dots":40,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":80,"elroy2Speed":1.05,"elroy2Dots":40,"frightSpeed":0.6},"frightTime":3,"frightFlashesCount":5,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":100,"elroy2Speed":1.05,"elroy2Dots":50,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":100,"elroy2Speed":1.05,"elroy2Dots":50,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":100,"elroy2Speed":1.05,"elroy2Dots":50,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":100,"elroy2Speed":1.05,"elroy2Dots":50,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":120,"elroy2Speed":1.05,"elroy2Dots":60,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":1,"eating":0.87,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":120,"elroy2Speed":1.05,"elroy2Dots":60,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}},{"pacman":{"speed":0.9,"eating":0.79,"frightSpeed":1,"frightSpeedEating":0.87},"ghost":{"speed":0.95,"tunnelSpeed":0.5,"elroy1Speed":1,"elroy1Dots":120,"elroy2Speed":1.05,"elroy2Dots":60,"frightSpeed":0.6},"frightTime":1,"frightFlashesCount":3,"mode":[7,20,7,20,5,1037,0.0166666667,1410065407],"bonus":{"type":"key","points":5000}}]; diff --git a/js/pacman-ui.js b/js/pacman-ui.js new file mode 100644 index 0000000..06c6d46 --- /dev/null +++ b/js/pacman-ui.js @@ -0,0 +1,255 @@ +/* +Copyright (c) 2013 Fabrice ECAILLE aka Febbweiss + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +var SOUND_ACTIVATED = false; + +var WIDTH_TILE_COUNT = 28; +var HEIGHT_TILE_COUNT = 34; +var TILE_SIZE = 16; +var HALF_TILE_SIZE = 8; +var ACTOR_SIZE = 32; +var PLAYGROUND_WIDTH = WIDTH_TILE_COUNT * TILE_SIZE; +var PLAYGROUND_HEIGHT = HEIGHT_TILE_COUNT * TILE_SIZE; +var ACTOR_SPEED = 4; +var LOOP_COUNT_REFRESH = 66; +var loopCount = 0; +var REFRESH_RATE = 15; +//1: up, 2: left, 3:down, 4: right +var UP = 1; +var LEFT = 2; +var DOWN = 3; +var RIGHT = 4; + +var BONUS_TILE = 77; + +var eatenBonus = new Array(); + +var INFINITY = 9999999999; + +$(function(){ + + //Playground Sprites + $("#playground").playground({height: PLAYGROUND_HEIGHT, width: PLAYGROUND_WIDTH, keyTracker: true}); + + $.playground({refreshRate: 60}).addGroup("background", {posx: 0, posy: 0, width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end() + .addGroup("dots", {width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end() + .addGroup("actors", {width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end() + .addGroup( "hud", {width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end(); + + var hud = $("#hud"); + hud.append("
"); + hud.append("
"); + hud.append("
"); + hud.append("
'"); + hud.append("
'"); + hud.append("
'"); + + GUI.updateLevel( "Level" ); + + var background = $("#background"); + var dotsGroup = $("#dots"); + var maze = Game.maze.structure; + + for( var i = 0; i < maze.length; i++ ) { + var clazz = ""; + switch( maze[i]) { + case -2: + clazz = "bigDot"; + Game.dots[i] = "bigDot"; + break; + case -1: + clazz = "dot"; + Game.dots[i] = "dot"; + break; + case 1: + clazz = "corner1"; + break; + case 2: + clazz = "corner2"; + break; + case 3: + clazz = "corner3"; + break; + case 4: + clazz = "corner4"; + break; + case 5: + clazz = "squareCornerTopLeft"; + break; + case 6: + clazz = "squareCornerTopRight"; + break; + case 7: + clazz = "squareCornerBottomLeft"; + break; + case 8: + clazz = "squareCornerBottomRight"; + break; + case 9: + clazz = "horizontalMidDown"; + break; + case 10: + clazz = "verticalMidLeft"; + break; + case 11: + clazz = "verticalMidRight"; + break; + case 12: + clazz = "gate"; + break; + } + background.append('
'); + + if(i % 28 == 27 ) { + background.append('
'); + } + } + + // this is the function that control most of the game logic + $.playground().registerCallback(function(){ + if(jQuery.gameQuery.keyTracker[37]){ //this is left! (a) + Game.hero.left(); + } + if(jQuery.gameQuery.keyTracker[38]){ //this is up! (w) + Game.hero.up(); + } + if(jQuery.gameQuery.keyTracker[39]){ //this is right! (d) + Game.hero.right(); + } + if(jQuery.gameQuery.keyTracker[40]){ //this is down! (s) + Game.hero.down(); + } + + $.each(Game.actors, function(index, actor ) { + actor.move(); + }); + + for( var i = Math.max(0, eatenBonus.length - 6), j = 0; i < eatenBonus.length; i++, j++) { + $("#" +( BONUS_TILE + j)).removeClass().addClass("tile").addClass( eatenBonus[i] ); + } + + }, REFRESH_RATE); + + Sound.init(function(){ + $.playground().startGame( function() { + Game.init(); + }); + }); + +}); + +var Sound = { + soundList : [], + + init : function(callback) { + if( SOUND_ACTIVATED ) { + soundManager.setup({ + url: 'swf/' + }); + + Sound.soundList = { + opening : new $.gameQuery.SoundWrapper('sound/opening.mp3', false), + waka : new $.gameQuery.SoundWrapper('sound/wakawaka.mp3', false), + fruit : new $.gameQuery.SoundWrapper('sound/eatingfruit.mp3', false), + ghost : new $.gameQuery.SoundWrapper('sound/eatingghost.mp3', false), + dies : new $.gameQuery.SoundWrapper('sound/dies.mp3', false) + }; + soundManager.onready( callback ); + } else + callback(); + }, + + play: function( sound ) { + if( SOUND_ACTIVATED ) + Sound.soundList[sound].play(); + }, + + stop: function( sound ) { + if( SOUND_ACTIVATED ) + Sound.soundList[sound].stop(); + }, +} + +var GUI = { + updateMessage : function( message ) { + GUI.drawText( $("#message"), message, true ); + }, + + updateScoreMessage : function( message ) { + GUI.drawText( $("#scoreMessage"), message, false, "red" ); + }, + + updateLevel : function( message ) { + GUI.drawText( $("#level"), message, false ); + }, + + updateLevelNumber: function( message ) { + GUI.drawText( $("#levelNumber"), message + "", false, "", true ); + }, + + drawText : function( divHTML, message, center, customClazz, forceSmall) { + var html = ""; + var clazz = "clock"; + var letterSize = 32; + if( typeof customClazz !== "undefined" ) { + clazz = " clock " + customClazz; + } + + + var count = 0; + var width = 0; + var height = 0; + for( var i = 0; i < message.length; i++ ) { + var letter = message[i]; + var iLetter = (message.charCodeAt(i) - 97); + if( letter == " " ) { + html += "
"; + width += 16; + count++; + } else if( letter.charCodeAt(0) > 47 && letter.charCodeAt(0) < 58 ) { + var letterSize = 32; + if( forceSmall ) { + letterSize = 16; + } + html += "
"; + count++; + } else if( ( letter.charCodeAt(0) >= 'a'.charCodeAt(0) && letter.charCodeAt(0) <= 'z'.charCodeAt(0)) ) { + if( height < 16 ) + height = 16; + width += 16; + var lineSize = 20; + var x = (iLetter % lineSize) * 16; + var y = Math.floor(iLetter / lineSize) * 16 + 144; + html += "
"; + count++; + } else if( letter.charCodeAt(0) >= 'A'.charCodeAt(0) && letter.charCodeAt(0) <= 'Z'.charCodeAt(0)) { + iLetter = letter.charCodeAt(0) - 'A'.charCodeAt(0); + if( height < 32 ) + height = 32; + width += 32; + var lineSize = 10; + var x = (iLetter % lineSize) * 32; + var y = Math.floor(iLetter / lineSize) * 32 + 32; + html += "
"; + count++; + } + } + + divHTML.empty(); + divHTML.css( "width", width + "px"); + divHTML.css( "height", height + "px"); + if( center ) + divHTML.css( "margin-left", "-" + (message.length * letterSize / 2) + "px"); + divHTML.append( html ); + } +} diff --git a/js/pacman-ui.js~ b/js/pacman-ui.js~ new file mode 100644 index 0000000..f94cc88 --- /dev/null +++ b/js/pacman-ui.js~ @@ -0,0 +1,246 @@ +var SOUND_ACTIVATED = false; + +var WIDTH_TILE_COUNT = 28; +var HEIGHT_TILE_COUNT = 34; +var TILE_SIZE = 16; +var HALF_TILE_SIZE = 8; +var ACTOR_SIZE = 32; +var PLAYGROUND_WIDTH = WIDTH_TILE_COUNT * TILE_SIZE; +var PLAYGROUND_HEIGHT = HEIGHT_TILE_COUNT * TILE_SIZE; +var ACTOR_SPEED = 4; +var LOOP_COUNT_REFRESH = 66; +var loopCount = 0; +var REFRESH_RATE = 15; +//1: up, 2: left, 3:down, 4: right +var UP = 1; +var LEFT = 2; +var DOWN = 3; +var RIGHT = 4; + +var BONUS_TILE = 77; + +var eatenBonus = new Array(); + +var INFINITY = 9999999999; + +$(function(){ + + //Playground Sprites + $("#playground").playground({height: PLAYGROUND_HEIGHT, width: PLAYGROUND_WIDTH, keyTracker: true}); + + Sound.init(function(){ + $.playground().startGame( function() { + Game.init(); + }); + }); + + $.playground({refreshRate: 60}).addGroup("background", {posx: 0, posy: 0, width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end() + .addGroup("dots", {width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end() + .addGroup("actors", {width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end() + .addGroup( "hud", {width: PLAYGROUND_WIDTH, height: PLAYGROUND_HEIGHT}) + .end(); + + var hud = $("#hud"); + hud.append("
"); + hud.append("
"); + hud.append("
"); + hud.append("
'"); + hud.append("
'"); + hud.append("
'"); + + GUI.updateLevel( "Level" ); + + var background = $("#background"); + var dotsGroup = $("#dots"); + var maze = Game.maze.structure; + + for( var i = 0; i < maze.length; i++ ) { + var clazz = ""; + switch( maze[i]) { + case -2: + clazz = "bigDot"; + Game.dots[i] = "bigDot"; + break; + case -1: + clazz = "dot"; + Game.dots[i] = "dot"; + break; + case 1: + clazz = "corner1"; + break; + case 2: + clazz = "corner2"; + break; + case 3: + clazz = "corner3"; + break; + case 4: + clazz = "corner4"; + break; + case 5: + clazz = "squareCornerTopLeft"; + break; + case 6: + clazz = "squareCornerTopRight"; + break; + case 7: + clazz = "squareCornerBottomLeft"; + break; + case 8: + clazz = "squareCornerBottomRight"; + break; + case 9: + clazz = "horizontalMidDown"; + break; + case 10: + clazz = "verticalMidLeft"; + break; + case 11: + clazz = "verticalMidRight"; + break; + case 12: + clazz = "gate"; + break; + } + background.append('
'); + + if(i % 28 == 27 ) { + background.append('
'); + } + } + + // this is the function that control most of the game logic + $.playground().registerCallback(function(){ + if(jQuery.gameQuery.keyTracker[37]){ //this is left! (a) + Game.hero.left(); + } + if(jQuery.gameQuery.keyTracker[38]){ //this is up! (w) + Game.hero.up(); + } + if(jQuery.gameQuery.keyTracker[39]){ //this is right! (d) + Game.hero.right(); + } + if(jQuery.gameQuery.keyTracker[40]){ //this is down! (s) + Game.hero.down(); + } + + $.each(Game.actors, function(index, actor ) { + actor.move(); + }); + + for( var i = Math.max(0, eatenBonus.length - 6), j = 0; i < eatenBonus.length; i++, j++) { + $("#" +( BONUS_TILE + j)).removeClass().addClass("tile").addClass( eatenBonus[i] ); + } + + }, REFRESH_RATE); + +}); + +var Sound = { + soundList : [], + + init : function(callback) { + if( SOUND_ACTIVATED ) { + soundManager.setup({ + url: 'swf/' + }); + + Sound.soundList = { + opening : new $.gameQuery.SoundWrapper('sound/opening.mp3', false), + waka : new $.gameQuery.SoundWrapper('sound/wakawaka.mp3', false), + fruit : new $.gameQuery.SoundWrapper('sound/eatingfruit.mp3', false), + ghost : new $.gameQuery.SoundWrapper('sound/eatingghost.mp3', false), + dies : new $.gameQuery.SoundWrapper('sound/dies.mp3', false) + }; + soundManager.onready( callback ); + } else + callback(); + }, + + play: function( sound ) { + if( SOUND_ACTIVATED ) + Sound.soundList[sound].play(); + }, + + stop: function( sound ) { + if( SOUND_ACTIVATED ) + Sound.soundList[sound].stop(); + }, +} + +var GUI = { + updateMessage : function( message ) { + GUI.drawText( $("#message"), message, true ); + }, + + updateScoreMessage : function( message ) { + GUI.drawText( $("#scoreMessage"), message, false, "red" ); + }, + + updateLevel : function( message ) { + GUI.drawText( $("#level"), message, false ); + }, + + updateLevelNumber: function( message ) { + GUI.drawText( $("#levelNumber"), message + "", false, "", true ); + }, + + drawText : function( divHTML, message, center, customClazz, forceSmall) { + var html = ""; + var clazz = "clock"; + var letterSize = 32; + if( typeof customClazz !== "undefined" ) { + clazz = " clock " + customClazz; + } + + + var count = 0; + var width = 0; + var height = 0; + for( var i = 0; i < message.length; i++ ) { + var letter = message[i]; + var iLetter = (message.charCodeAt(i) - 97); + if( letter == " " ) { + html += "
"; + width += 16; + count++; + } else if( letter.charCodeAt(0) > 47 && letter.charCodeAt(0) < 58 ) { + var letterSize = 32; + if( forceSmall ) { + letterSize = 16; + } + html += "
"; + count++; + } else if( ( letter.charCodeAt(0) >= 'a'.charCodeAt(0) && letter.charCodeAt(0) <= 'z'.charCodeAt(0)) ) { + if( height < 16 ) + height = 16; + width += 16; + var lineSize = 20; + var x = (iLetter % lineSize) * 16; + var y = Math.floor(iLetter / lineSize) * 16 + 144; + html += "
"; + count++; + } else if( letter.charCodeAt(0) >= 'A'.charCodeAt(0) && letter.charCodeAt(0) <= 'Z'.charCodeAt(0)) { + iLetter = letter.charCodeAt(0) - 'A'.charCodeAt(0); + if( height < 32 ) + height = 32; + width += 32; + var lineSize = 10; + var x = (iLetter % lineSize) * 32; + var y = Math.floor(iLetter / lineSize) * 32 + 32; + html += "
"; + count++; + } + } + + divHTML.empty(); + divHTML.css( "width", width + "px"); + divHTML.css( "height", height + "px"); + if( center ) + divHTML.css( "margin-left", "-" + (message.length * letterSize / 2) + "px"); + divHTML.append( html ); + } +} diff --git a/js/scoreboard.js b/js/scoreboard.js new file mode 100644 index 0000000..d67e174 --- /dev/null +++ b/js/scoreboard.js @@ -0,0 +1,54 @@ +/* +Copyright (c) 2013 Fabrice ECAILLE aka Febbweiss + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +var SCOREBOARD = { + score: 0, + scoreLength: 6, + + init: function(size) { + if( typeof size !== "undefined" ) + SCOREBOARD.scoreLength = size; + SCOREBOARD.score = 0; + SCOREBOARD.set_score( 0 ); + }, + + add: function(addToScore, div) { + SCOREBOARD.set_score( SCOREBOARD.score + addToScore, div); + }, + + set_score: function( score, div ) { + var currentScore = ""; + var imageScore = ""; + + SCOREBOARD.score = score; + currentScore = SCOREBOARD.pad(); + + for(i = 0; i < String(currentScore).length; i++) { + imageScore += "
"; + } + + if( typeof div === "undefined" ) + div = $(".subScoreboard"); + div.empty(); + div.append( imageScore ); + }, + + pad: function() { + var str = '' + SCOREBOARD.score; + while (str.length < SCOREBOARD.scoreLength) { + str = '0' + str; + } + return str; + }, + + callback: function() { + console.log( "SCOREBOARD.callback" ); + } +}; diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 0000000..e4a903b --- /dev/null +++ b/js/utils.js @@ -0,0 +1,55 @@ +function heriter(destination, source) { + function initClassIfNecessary(obj) { + if( typeof obj["_super"] == "undefined" ) { + obj["_super"] = function() { + var methodName = arguments[0]; + var parameters = arguments[1]; + this["__parent_methods"][methodName].apply(this, parameters); + } + } + + if( typeof obj["__parent_methods"] == "undefined" ) { + obj["__parent_methods"] = {} + } + } + + for (var element in source) { + if( typeof destination[element] != "undefined" ) { + initClassIfNecessary(destination); + destination["__parent_methods"][element] = source[element]; + } else { + destination[element] = source[element]; + } + } +} + + +/** PausableTimer **/ + +function PausableTimer(func, millisec) { + this.func = func; + this.stTime = new Date().valueOf(); + this.timeout = setTimeout(func, millisec); + this.timeLeft = millisec; +} + +PausableTimer.prototype.stop = function() { + clearTimeout(this.timeout); +}; + +PausableTimer.prototype.pause = function() { + clearTimeout(this.timeout); + var timeRan = new Date().valueOf()-this.stTime; + this.timeLeft -= timeRan; +}; + +PausableTimer.prototype.resume = function() { + this.timeout = setTimeout(this.func, this.timeLeft); + this.stTime = new Date().valueOf(); +}; + +//Usage: +//var myTimer = new PausableTimer(function(){alert("It works!");}, 2000); +//myTimer.pause(); +//myTimer.unpause(); + diff --git a/lib/gamequery-0.7.0.js b/lib/gamequery-0.7.0.js new file mode 100644 index 0000000..b3e3037 --- /dev/null +++ b/lib/gamequery-0.7.0.js @@ -0,0 +1,1738 @@ +/* + * gameQuery rev. 0.7.0 + * + * Copyright (c) 2012 Selim Arsever (http://gamequeryjs.com) + * licensed under the MIT-License + */ + +// This allows use of the convenient $ notation in a plugin +(function($) { + + // This prefix can be use whenever needed to namespace CSS classes, .data() inputs aso. + var gQprefix = "gQ_"; + + // Those are the possible states of the engine + var STATE_NEW = 0; // Not yet started for the first time + var STATE_RUNNING = 1; // Started and running + var STATE_PAUSED = 2; // Paused + + /** + * Utility function that returns the radius for a geometry. + * + * @param {object} elem DOM element + * @param {float} angle the angle in degrees + * @return {object} .x, .y radius of geometry + */ + var proj = function (elem, angle) { + switch (elem.geometry){ + case $.gameQuery.GEOMETRY_RECTANGLE : + var b = angle*Math.PI*2/360; + var Rx = Math.abs(Math.cos(b)*elem.width/2*elem.factor)+Math.abs(Math.sin(b)*elem.height/2*elem.factor); + var Ry = Math.abs(Math.cos(b)*elem.height/2*elem.factor)+Math.abs(Math.sin(b)*elem.width/2*elem.factor); + + return {x: Rx, y: Ry}; + } + }; + + /** + * Utility function that checks for collision between two elements. + * + * @param {object} elem1 DOM for the first element + * @param {float} offset1 offset of the first element + * @param {object} elem2 DOM for the second element + * @param {float} offset2 offset of the second element + * @return {boolean} if the two elements collide or not + */ + var collide = function(elem1, offset1, elem2, offset2) { + // test real collision (only for two rectangles...) + if((elem1.geometry == $.gameQuery.GEOMETRY_RECTANGLE && elem2.geometry == $.gameQuery.GEOMETRY_RECTANGLE)){ + + var dx = offset2.x + elem2.boundingCircle.x - elem1.boundingCircle.x - offset1.x; + var dy = offset2.y + elem2.boundingCircle.y - elem1.boundingCircle.y - offset1.y; + var a = Math.atan(dy/dx); + + var Dx = Math.abs(Math.cos(a-elem1.angle*Math.PI*2/360)/Math.cos(a)*dx); + var Dy = Math.abs(Math.sin(a-elem1.angle*Math.PI*2/360)/Math.sin(a)*dy); + + var R = proj(elem2, elem2.angle-elem1.angle); + + if((elem1.width/2*elem1.factor+R.x <= Dx) || (elem1.height/2*elem1.factor+R.y <= Dy)) { + return false; + } else { + var Dx = Math.abs(Math.cos(a-elem2.angle*Math.PI*2/360)/Math.cos(a)*-dx); + var Dy = Math.abs(Math.sin(a-elem2.angle*Math.PI*2/360)/Math.sin(a)*-dy); + + var R = proj(elem1, elem1.angle-elem2.angle); + + if((elem2.width/2*elem2.factor+R.x <= Dx) || (elem2.height/2*elem2.factor+R.y <= Dy)) { + return false; + } else { + return true; + } + } + } else { + return false; + } + }; + + /** + * Utility function computes the offset relative to the playground of a gameQuery element without using DOM's position. + * This should be faster than the standand .offset() function. + * + * Warning: No non-gameQuery elements should be present between this element and the playground div! + * + * @param {jQuery} element the jQuery wrapped DOM element representing the gameQuery object. + * @return {object} an object {x:, y: } containing the x and y offset. (Not top and left like jQuery's .offset()) + */ + var offset = function(element) { + // Get the tileSet offset (relative to the playground) + var offset = {x: 0, y: 0}; + var parent = element[0]; + + while(parent !== $.gameQuery.playground[0] && parent.gameQuery !== undefined) { + offset.x += parent.gameQuery.posx; + offset.y += parent.gameQuery.posy; + parent = parent.parentNode; + } + + return offset + } + + /** + * Utility function computes the index range of the tiles for a tilemap. + * + * @param {jQuery} element the jQuery wrapped DOM element representing the tilemap. + * @param {object} offset an object holding the x and y offset of the tilemap, this is optional and will be computed if not provided. + * @return {object} an object {firstColumn: , lastColumn: , fristRow: , lastRow: } + */ + var visibleTilemapIndexes = function (element, elementOffset) { + if (elementOffset === undefined) { + elementOffset = offset(element); + } + + var gameQuery = element[0].gameQuery; + // Activate the visible tiles + return { + firstRow: Math.max(Math.min(Math.floor(-elementOffset.y/gameQuery.height), gameQuery.sizey), 0), + lastRow: Math.max(Math.min(Math.ceil(($.gameQuery.playground[0].height-elementOffset.y)/gameQuery.height), gameQuery.sizey), 0), + firstColumn: Math.max(Math.min(Math.floor(-elementOffset.x/gameQuery.width), gameQuery.sizex), 0), + lastColumn: Math.max(Math.min(Math.ceil(($.gameQuery.playground[0].width-elementOffset.x)/gameQuery.width), gameQuery.sizex), 0) + } + } + + /** + * Utility function thast computes the buffered zone of a tilemap + * + * @param {jQuery} element the jQuery wrapped DOM element representing the tilemap. + * @param {object} visible an object describing the visible zone + * @return {object} an object {firstColumn: , lastColumn: , fristRow: , lastRow: } + */ + var bufferedTilemapIndexes = function (element, visible) { + var gameQuery = element[0].gameQuery; + + return { + firstRow: Math.max(Math.min(visible.firstRow - gameQuery.buffer, gameQuery.sizey), 0), + lastRow: Math.max(Math.min(visible.lastRow + gameQuery.buffer, gameQuery.sizey), 0), + firstColumn: Math.max(Math.min(visible.firstColumn - gameQuery.buffer, gameQuery.sizex), 0), + lastColumn: Math.max(Math.min(visible.lastColumn + gameQuery.buffer, gameQuery.sizex), 0) + } + } + + /** + * Utility function that creates a tile in the given tilemap + * + * @param {jQuery} tileSet the jQuery element representing the tile map + * @param {integer} row the row index of the tile in the tile map + * @param {integer} column the column index of the tile in the tile map + */ + var addTile = function(tileSet, row, column) { + var gameQuery = tileSet[0].gameQuery; + var name = tileSet.attr("id"); + + var tileDescription; + if(gameQuery.func) { + tileDescription = gameQuery.tiles(row,column)-1; + } else { + tileDescription = gameQuery.tiles[row][column]-1; + } + + var animation; + if(gameQuery.multi) { + animation = gameQuery.animations; + } else { + animation = gameQuery.animations[tileDescription]; + } + + if(tileDescription >= 0){ + tileSet.addSprite($.gameQuery.tileIdPrefix+name+"_"+row+"_"+column, + {width: gameQuery.width, + height: gameQuery.height, + posx: column*gameQuery.width, + posy: row*gameQuery.height, + animation: animation}); + + var newTile = tileSet.find("#"+$.gameQuery.tileIdPrefix+name+"_"+row+"_"+column); + if (gameQuery.multi) { + newTile.setAnimation(tileDescription); + } else { + newTile[0].gameQuery.animationNumber = tileDescription; + } + newTile.removeClass($.gameQuery.spriteCssClass); + newTile.addClass($.gameQuery.tileCssClass); + newTile.addClass($.gameQuery.tileTypePrefix+tileDescription); + } + } + + // Define the list of object/function accessible through $. + $.extend({ gameQuery: { + /** + * This is the Animation Object + */ + Animation: function (options, imediateCallback) { + // private default values + var defaults = { + imageURL: "", + numberOfFrame: 1, + delta: 0, + rate: 30, + type: 0, + distance: 0, + offsetx: 0, + offsety: 0 + }; + + // options extends defaults + options = $.extend(defaults, options); + + // "public" attributes: + this.imageURL = options.imageURL; // The url of the image to be used as an animation or sprite + this.numberOfFrame = options.numberOfFrame; // The number of frames to be displayed when playing the animation + this.delta = options.delta; // The distance in pixels between two frames + this.rate = options.rate; // The rate at which the frames change in miliseconds + this.type = options.type; // The type of the animation.This is a bitwise OR of the properties. + this.distance = options.distance; // The distance in pixels between two animations + this.offsetx = options.offsetx; // The x coordinate where the first sprite begins + this.offsety = options.offsety; // The y coordinate where the first sprite begins + + // Whenever a new animation is created we add it to the ResourceManager animation list + $.gameQuery.resourceManager.addAnimation(this, imediateCallback); + + return true; + }, + + /** + * "constants" for the different types of an animation + */ + ANIMATION_VERTICAL: 1, // Generated by a vertical offset of the background + ANIMATION_HORIZONTAL: 2, // Generated by a horizontal offset of the background + ANIMATION_ONCE: 4, // Played only once (else looping indefinitely) + ANIMATION_CALLBACK: 8, // A callback is exectued at the end of a cycle + ANIMATION_MULTI: 16, // The image file contains many animations + ANIMATION_PINGPONG: 32, // At the last frame of the animation it reverses (if used in conjunction with ONCE it will have no effect) + + // "constants" for the different type of geometry for a sprite + GEOMETRY_RECTANGLE: 1, + GEOMETRY_DISC: 2, + + // basic values + refreshRate: 30, + + /** + * An object to manage resource loading + */ + resourceManager: { + animations: [], // List of animations / images used in the game + sounds: [], // List of sounds used in the game + callbacks: [], // List of the functions called at each refresh + loadedAnimationsPointer: 0, // Keep track of the last loaded animation + loadedSoundsPointer: 0, // Keep track of the last loaded sound + + /** + * Load resources before starting the game. + */ + preload: function() { + // Start loading the images + for (var i = this.animations.length-1 ; i >= this.loadedAnimationsPointer; i --){ + this.animations[i].domO = new Image(); + this.animations[i].domO.src = this.animations[i].imageURL; + } + + // Start loading the sounds + for (var i = this.sounds.length-1 ; i >= this.loadedSoundsPointer; i --){ + this.sounds[i].load(); + } + + $.gameQuery.resourceManager.waitForResources(); + }, + + /** + * Wait for all the resources called for in preload() to finish loading. + */ + waitForResources: function() { + // Check the images + var imageCount = 0; + for(var i=this.loadedAnimationsPointer; i < this.animations.length; i++){ + if(this.animations[i].domO.complete){ + imageCount++; + } + } + // Check the sounds + var soundCount = 0; + for(var i=this.loadedSoundsPointer; i < this.sounds.length; i++){ + var temp = this.sounds[i].ready(); + if(temp){ + soundCount++; + } + } + // Call the load callback with the current progress + if($.gameQuery.resourceManager.loadCallback){ + var percent = (imageCount + soundCount)/(this.animations.length + this.sounds.length - this.loadedAnimationsPointer - this.loadedSoundsPointer)*100; + $.gameQuery.resourceManager.loadCallback(percent); + } + if(imageCount + soundCount < (this.animations.length + this.sounds.length - this.loadedAnimationsPointer - this.loadedSoundsPointer)){ + imgWait=setTimeout(function () { + $.gameQuery.resourceManager.waitForResources(); + }, 100); + } else { + this.loadedAnimationsPointer = this.animations.length; + this.loadedSoundsPointer = this.sounds.length; + + // All the resources are loaded! We can now associate the animation's images to their corresponding sprites + $.gameQuery.scenegraph.children().each(function(){ + // recursive call on the children: + $(this).children().each(arguments.callee); + // add the image as a background + if(this.gameQuery && this.gameQuery.animation){ + $(this).css("background-image", "url("+this.gameQuery.animation.imageURL+")"); + // we set the correct kind of repeat + if(this.gameQuery.animation.type & $.gameQuery.ANIMATION_VERTICAL) { + $(this).css("background-repeat", "repeat-x"); + } else if(this.gameQuery.animation.type & $.gameQuery.ANIMATION_HORIZONTAL) { + $(this).css("background-repeat", "repeat-y"); + } else { + $(this).css("background-repeat", "no-repeat"); + } + } + }); + + // Launch the refresh loop + if($.gameQuery.state === STATE_NEW){ + setInterval(function () { + $.gameQuery.resourceManager.refresh(); + },($.gameQuery.refreshRate)); + } + $.gameQuery.state = STATE_RUNNING; + if($.gameQuery.startCallback){ + $.gameQuery.startCallback(); + } + // Make the scenegraph visible + $.gameQuery.scenegraph.css("visibility","visible"); + } + }, + + /** + * This function refresh a unique sprite here 'this' represent a dom object + */ + refreshSprite: function() { + // Check if 'this' is a gameQuery element + if(this.gameQuery != undefined){ + var gameQuery = this.gameQuery; + // Does 'this' has an animation ? + if(gameQuery.animation){ + // Do we have anything to do? + if ( (gameQuery.idleCounter == gameQuery.animation.rate-1) && gameQuery.playing){ + + // Does 'this' loops? + if(gameQuery.animation.type & $.gameQuery.ANIMATION_ONCE){ + if(gameQuery.currentFrame < gameQuery.animation.numberOfFrame-1){ + gameQuery.currentFrame += gameQuery.frameIncrement; + } else if(gameQuery.currentFrame == gameQuery.animation.numberOfFrame-1) { + // Does 'this' has a callback ? + if(gameQuery.animation.type & $.gameQuery.ANIMATION_CALLBACK){ + if($.isFunction(gameQuery.callback)){ + gameQuery.callback(this); + } + } + } + } else { + if(gameQuery.animation.type & $.gameQuery.ANIMATION_PINGPONG){ + if(gameQuery.currentFrame == gameQuery.animation.numberOfFrame-1 && gameQuery.frameIncrement == 1) { + gameQuery.frameIncrement = -1; + } else if (gameQuery.currentFrame == 0 && gameQuery.frameIncrement == -1) { + gameQuery.frameIncrement = 1; + } + } + + gameQuery.currentFrame = (gameQuery.currentFrame+gameQuery.frameIncrement)%gameQuery.animation.numberOfFrame; + if(gameQuery.currentFrame == 0){ + // Does 'this' has a callback ? + if(gameQuery.animation.type & $.gameQuery.ANIMATION_CALLBACK){ + if($.isFunction(gameQuery.callback)){ + gameQuery.callback(this); + } + } + } + } + // Update the background + if((gameQuery.animation.type & $.gameQuery.ANIMATION_VERTICAL) && (gameQuery.animation.numberOfFrame > 1)){ + if(gameQuery.multi){ + $(this).css("background-position",""+(-gameQuery.animation.offsetx-gameQuery.multi)+"px "+(-gameQuery.animation.offsety-gameQuery.animation.delta*gameQuery.currentFrame)+"px"); + } else { + $(this).css("background-position",""+(-gameQuery.animation.offsetx)+"px "+(-gameQuery.animation.offsety-gameQuery.animation.delta*gameQuery.currentFrame)+"px"); + } + } else if((gameQuery.animation.type & $.gameQuery.ANIMATION_HORIZONTAL) && (gameQuery.animation.numberOfFrame > 1)) { + if(gameQuery.multi){ + $(this).css("background-position",""+(-gameQuery.animation.offsetx-gameQuery.animation.delta*gameQuery.currentFrame)+"px "+(-gameQuery.animation.offsety-gameQuery.multi)+"px"); + } else { + $(this).css("background-position",""+(-gameQuery.animation.offsetx-gameQuery.animation.delta*gameQuery.currentFrame)+"px "+(-gameQuery.animation.offsety)+"px"); + } + } + } + gameQuery.idleCounter = (gameQuery.idleCounter+1)%gameQuery.animation.rate; + } + } + return true; + }, + + /** + * This function refresh a unique tile-map, here 'this' represent a dom object + */ + refreshTilemap: function() { + // Check if 'this' is a gameQuery element + if(this.gameQuery != undefined){ + var gameQuery = this.gameQuery; + if($.isArray(gameQuery.frameTracker)){ + for(var i=0; i 1)){ + $(this).css("background-position",""+(-gameQuery.animations[animationNumber].offsetx)+"px "+(-gameQuery.animations[animationNumber].offsety-gameQuery.animations[animationNumber].delta*gameQuery.frameTracker[animationNumber])+"px"); + } else if((gameQuery.animations[animationNumber].type & $.gameQuery.ANIMATION_HORIZONTAL) && (gameQuery.animations[animationNumber].numberOfFrame > 1)) { + $(this).css("background-position",""+(-gameQuery.animations[animationNumber].offsetx-gameQuery.animations[animationNumber].delta*gameQuery.frameTracker[animationNumber])+"px "+(-gameQuery.animations[animationNumber].offsety)+"px"); + } + } else { + if((gameQuery.animations.type & $.gameQuery.ANIMATION_VERTICAL) && (gameQuery.animations.numberOfFrame > 1)){ + $(this).css("background-position",""+(-gameQuery.animations.offsetx-this.gameQuery.multi)+"px "+(-gameQuery.animations.offsety-gameQuery.animations.delta*gameQuery.frameTracker)+"px"); + } else if((gameQuery.animations.type & $.gameQuery.ANIMATION_HORIZONTAL) && (gameQuery.animations.numberOfFrame > 1)) { + $(this).css("background-position",""+(-gameQuery.animations.offsetx-gameQuery.animations.delta*gameQuery.frameTracker)+"px "+(-gameQuery.animations.offsety-this.gameQuery.multi)+"px"); + } + } + }); + } + return true; + }, + + /** + * Called periodically to refresh the state of the game. + */ + refresh: function() { + if($.gameQuery.state === STATE_RUNNING) { + $.gameQuery.playground.find("."+$.gameQuery.spriteCssClass).each(this.refreshSprite); + $.gameQuery.playground.find("."+$.gameQuery.tilemapCssClass).each(this.refreshTilemap); + var deadCallback= new Array(); + for (var i = this.callbacks.length-1; i >= 0; i--){ + if(this.callbacks[i].idleCounter == this.callbacks[i].rate-1){ + var returnedValue = this.callbacks[i].fn(); + if(typeof returnedValue == 'boolean'){ + // If we have a boolean: 'true' means 'no more execution', 'false' means 'keep on executing' + if(returnedValue){ + deadCallback.push(i); + } + } else if(typeof returnedValue == 'number') { + // If we have a number it re-defines the time to the next call + this.callbacks[i].rate = Math.round(returnedValue/$.gameQuery.refreshRate); + this.callbacks[i].idleCounter = 0; + } + } + this.callbacks[i].idleCounter = (this.callbacks[i].idleCounter+1)%this.callbacks[i].rate; + } + for(var i = deadCallback.length-1; i >= 0; i--){ + this.callbacks.splice(deadCallback[i],1); + } + } + }, + + /** + * Add an animation to the resource Manager + */ + addAnimation: function(animation, callback) { + if($.inArray(animation,this.animations)<0){ + //normalize the animation rate: + animation.rate = Math.round(animation.rate/$.gameQuery.refreshRate); + if(animation.rate==0){ + animation.rate = 1; + } + this.animations.push(animation); + switch ($.gameQuery.state){ + case STATE_NEW: + case STATE_PAUSED: + // Nothing to do for now + break; + case STATE_RUNNING: + // immediatly load the animation and call the callback if any + this.animations[this.loadedAnimationsPointer].domO = new Image(); + this.animations[this.loadedAnimationsPointer].domO.src = animation.imageURL; + if (callback !== undefined){ + this.animations[this.loadedAnimationsPointer].domO.onload = callback; + } + this.loadedAnimationsPointer++; + break; + } + } + }, + + /** + * Add a sound to the resource Manager + */ + addSound: function(sound, callback){ + if($.inArray(sound,this.sounds)<0){ + this.sounds.push(sound); + switch ($.gameQuery.state){ + case STATE_NEW: + case STATE_PAUSED: + // Nothing to do for now + break; + case STATE_RUNNING: + // immediatly load the sound and call the callback if any + sound.load(); + // TODO callback.... + this.loadedSoundsPointer++; + break; + } + } + }, + + /** + * Register a callback + * + * @param {function} fn the callback + * @param {integer} rate the rate in ms at which the callback should be called (should be a multiple of the playground rate or will be rounded) + */ + registerCallback: function(fn, rate){ + rate = Math.round(rate/$.gameQuery.refreshRate); + if(rate==0){ + rate = 1; + } + this.callbacks.push({fn: fn, rate: rate, idleCounter: 0}); + }, + + /** + * Clear the animations and sounds + */ + clear: function(callbacksToo){ + this.animations = []; + this.loadedAnimationsPointer = 0; + this.sounds = []; + this.loadedSoundsPointer = 0; + if(callbacksToo) { + this.callbacks = []; + } + } + }, + + /** + * This is a single place to update the underlying data of sprites/groups/tiles after a position or dimesion modification. + */ + update: function(descriptor, transformation) { + // Did we really receive a descriptor or a jQuery object instead? + if(!$.isPlainObject(descriptor)){ + // Then we must get real descriptor + if(descriptor.length > 0){ + var gameQuery = descriptor[0].gameQuery; + } else { + var gameQuery = descriptor.gameQuery; + } + } else { + var gameQuery = descriptor; + } + // If we couldn't find one we return + if(!gameQuery) return; + if(gameQuery.tileSet === true){ + // We have a tilemap + + var visible = visibleTilemapIndexes(descriptor); + var buffered = gameQuery.buffered; + + // Test what kind of transformation we have and react accordingly + for(property in transformation){ + switch(property){ + case "x": + + if(visible.lastColumn > buffered.lastColumn) { + + // Detach the tilemap + var parent = descriptor[0].parentNode; + var tilemap = descriptor.detach(); + + var newBuffered = bufferedTilemapIndexes(descriptor, visible); + for(var i = gameQuery.buffered.firstRow; i < gameQuery.buffered.lastRow; i++){ + // Remove the newly invisible tiles + for(var j = gameQuery.buffered.firstColumn; j < Math.min(newBuffered.firstColumn, gameQuery.buffered.lastColumn); j++) { + tilemap.find("#"+$.gameQuery.tileIdPrefix+descriptor.attr("id")+"_"+i+"_"+j).remove(); + } + // And add the newly visible tiles + for(var j = Math.max(gameQuery.buffered.lastColumn,newBuffered.firstColumn); j < newBuffered.lastColumn ; j++) { + addTile(tilemap,i,j); + } + } + + gameQuery.buffered.firstColumn = newBuffered.firstColumn; + gameQuery.buffered.lastColumn = newBuffered.lastColumn; + + // Attach the tilemap back + tilemap.appendTo(parent); + + } + + if(visible.firstColumn < buffered.firstColumn) { + + // Detach the tilemap + var parent = descriptor[0].parentNode; + var tilemap = descriptor.detach(); + + var newBuffered = bufferedTilemapIndexes(descriptor, visible); + for(var i = gameQuery.buffered.firstRow; i < gameQuery.buffered.lastRow; i++){ + // Remove the newly invisible tiles + for(var j = Math.max(newBuffered.lastColumn,gameQuery.buffered.firstColumn); j < gameQuery.buffered.lastColumn ; j++) { + tilemap.find("#"+$.gameQuery.tileIdPrefix+descriptor.attr("id")+"_"+i+"_"+j).remove(); + } + // And add the newly visible tiles + for(var j = newBuffered.firstColumn; j < Math.min(gameQuery.buffered.firstColumn,newBuffered.lastColumn); j++) { + addTile(tilemap,i,j); + } + } + + gameQuery.buffered.firstColumn = newBuffered.firstColumn; + gameQuery.buffered.lastColumn = newBuffered.lastColumn; + + // Attach the tilemap back + tilemap.appendTo(parent); + } + break; + + case "y": + + if(visible.lastRow > buffered.lastRow) { + + // Detach the tilemap + var parent = descriptor[0].parentNode; + var tilemap = descriptor.detach(); + + var newBuffered = bufferedTilemapIndexes(descriptor, visible); + for(var j = gameQuery.buffered.firstColumn; j < gameQuery.buffered.lastColumn ; j++) { + // Remove the newly invisible tiles + for(var i = gameQuery.buffered.firstRow; i < Math.min(newBuffered.firstRow, gameQuery.buffered.lastRow); i++){ + tilemap.find("#"+$.gameQuery.tileIdPrefix+descriptor.attr("id")+"_"+i+"_"+j).remove(); + } + // And add the newly visible tiles + for(var i = Math.max(gameQuery.buffered.lastRow, newBuffered.firstRow); i < newBuffered.lastRow; i++){ + addTile(tilemap,i,j); + } + } + + gameQuery.buffered.firstRow = newBuffered.firstRow; + gameQuery.buffered.lastRow = newBuffered.lastRow; + + // Attach the tilemap back + tilemap.appendTo(parent); + + } + + if(visible.firstRow < buffered.firstRow) { + + // Detach the tilemap + var parent = descriptor[0].parentNode; + var tilemap = descriptor.detach(); + + var newBuffered = bufferedTilemapIndexes(descriptor, visible); + for(var j = gameQuery.buffered.firstColumn; j < gameQuery.buffered.lastColumn ; j++) { + // Remove the newly invisible tiles + for(var i = Math.max(newBuffered.lastRow, gameQuery.buffered.firstRow); i < gameQuery.buffered.lastRow; i++){ + tilemap.find("#"+$.gameQuery.tileIdPrefix+descriptor.attr("id")+"_"+i+"_"+j).remove(); + } + // And add the newly visible tiles + for(var i = newBuffered.firstRow; i < Math.min(gameQuery.buffered.firstRow, newBuffered.lastRow); i++){ + addTile(tilemap,i,j); + } + } + + gameQuery.buffered.firstRow = newBuffered.firstRow; + gameQuery.buffered.lastRow = newBuffered.lastRow; + + // Attach the tilemap back + tilemap.appendTo(parent); + } + break; + + case "angle": + //TODO + break; + + case "factor": + //TODO + break; + } + } + + } else { + var refreshBoundingCircle = $.gameQuery.playground && !$.gameQuery.playground.disableCollision; + + // Update the descriptor + for(property in transformation){ + switch(property){ + case "x": + if(refreshBoundingCircle){ + gameQuery.boundingCircle.x = gameQuery.posx+gameQuery.width/2; + } + break; + case "y": + if(refreshBoundingCircle){ + gameQuery.boundingCircle.y = gameQuery.posy+gameQuery.height/2; + } + break; + case "w": + case "h": + gameQuery.boundingCircle.originalRadius = Math.sqrt(Math.pow(gameQuery.width,2) + Math.pow(gameQuery.height,2))/2 + gameQuery.boundingCircle.radius = gameQuery.factor*gameQuery.boundingCircle.originalRadius; + break; + case "angle": //(in degrees) + gameQuery.angle = parseFloat(transformation.angle); + break; + case "factor": + gameQuery.factor = parseFloat(transformation.factor); + if(refreshBoundingCircle){ + gameQuery.boundingCircle.radius = gameQuery.factor*gameQuery.boundingCircle.originalRadius; + } + break; + } + } + } + }, + // State of the engine + state: STATE_NEW, + + // CSS classes used to mark game element + spriteCssClass: gQprefix + "sprite", + groupCssClass: gQprefix + "group", + tilemapCssClass: gQprefix + "tilemap", + tileCssClass: gQprefix + "tile", + // Prefix for CSS Ids or Classes + tileTypePrefix: gQprefix + "tileType_", + tileIdPrefix: gQprefix + "tile_" + }, + + /** + * Mute (or unmute) all the sounds. + */ + muteSound: function(muted){ + for (var i = $.gameQuery.resourceManager.sounds.length-1 ; i >= 0; i --) { + $.gameQuery.resourceManager.sounds[i].muted(muted); + } + }, + + /** + * Accessor for the currently defined playground as a jQuery object + */ + playground: function() { + return $.gameQuery.playground + }, + + /** + * Define a callback called during the loading of the game's resources. + * + * The function will recieve as unique parameter + * a number representing the progess percentage. + */ + loadCallback: function(callback){ + $.gameQuery.resourceManager.loadCallback = callback; + } + }); // end of the extensio of $ + + + // fragments used to create DOM element + var spriteFragment = $("
"); + var groupFragment = $("
"); + var tilemapFragment = $("
"); + + + // Define the list of object/function accessible through $("selector"). + $.fn.extend({ + /** + * Defines the currently selected div to which contains the game and initialize it. + * + * This is a non-destructive call + */ + playground: function(options) { + if(this.length == 1){ + if(this[0] == document){ + // Old usage detected, this is not supported anymore + throw "Old playground usage, use $.playground() to retreive the playground and $('mydiv').playground(options) to set the div!"; + } + options = $.extend({ + height: 320, + width: 480, + refreshRate: 30, + position: "absolute", + keyTracker: false, + mouseTracker: false, + disableCollision: false + }, options); + // We save the playground node and set some variable for this node: + $.gameQuery.playground = this; + $.gameQuery.refreshRate = options.refreshRate; + $.gameQuery.playground[0].height = options.height; + $.gameQuery.playground[0].width = options.width; + + // We initialize the display of the div + $.gameQuery.playground.css({ + position: options.position, + display: "block", + overflow: "hidden", + height: options.height+"px", + width: options.width+"px" + }) + .append(""+(g[0]>0&&N==g[1]-1?'
':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.23",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.progressbar.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=(a.curCSS||a.css)(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.23",save:function(a,b){for(var c=0;c
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}});var m={};a.each(["Quad","Cubic","Quart","Quint","Expo"],function(a,b){m[b]=function(b){return Math.pow(b,a+2)}}),a.extend(m,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return a===0||a===1?a:-Math.pow(2,8*(a-1))*Math.sin(((a-1)*80-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){var b,c=4;while(a<((b=Math.pow(2,--c))-1)/11);return 1/Math.pow(4,3-c)-7.5625*Math.pow((b*3-2)/22-a,2)}}),a.each(m,function(b,c){a.easing["easeIn"+b]=c,a.easing["easeOut"+b]=function(a){return 1-c(1-a)},a.easing["easeInOut"+b]=function(a){return a<.5?c(a*2)/2:c(a*-2+2)/-2+1}})}(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.blind.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.bounce.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight(!0)/3:c.outerWidth(!0)/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m
").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fade.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fold.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.highlight.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.pulsate.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i
').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/lib/soundmanager2.min.js b/lib/soundmanager2.min.js new file mode 100644 index 0000000..c7987c1 --- /dev/null +++ b/lib/soundmanager2.min.js @@ -0,0 +1,106 @@ +/** @license + + + SoundManager 2: JavaScript Sound for the Web + ---------------------------------------------- + http://schillmania.com/projects/soundmanager2/ + + Copyright (c) 2007, Scott Schiller. All rights reserved. + Code provided under the BSD License: + http://schillmania.com/projects/soundmanager2/license.txt + + V2.97a.20130101 +*/ +(function(j,g){function aa(aa,pa){function ba(a){return c.preferFlash&&z&&!c.ignoreFlash&&c.flash[a]!==g&&c.flash[a]}function q(a){return function(d){var e=this._s;!e||!e._a?(e&&e.id?c._wD(e.id+": Ignoring "+d.type):c._wD(pb+"Ignoring "+d.type),d=null):d=a.call(this,d);return d}}this.setupOptions={url:aa||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3, +wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0,html5Test:/^(probably|maybe)$/i,preferFlash:!0,noSWFCache:!1};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1, +useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"', +"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=pa||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20130101";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1, +eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var Pa,c=this,Qa=null,i=null,pb="HTML5::",A,s=navigator.userAgent,R=j.location.href.toString(), +h=document,qa,Ra,ra,l,C=[],sa=!0,x,S=!1,T=!1,n=!1,r=!1,ca=!1,k,qb=0,U,v,ta,K,ua,I,L,M,Sa,va,da,F,ea,wa,N,xa,V,fa,ga,O,Ta,ya,Ua=["log","info","warn","error"],Va,za,Wa,W=null,Aa=null,p,Ba,P,Xa,ha,ia,Q,t,X=!1,Ca=!1,Ya,Za,$a,ja=0,Y=null,ka,J=[],B=null,ab,la,Z,G,Da,Ea,bb,u,cb=Array.prototype.slice,D=!1,Fa,z,Ga,db,E,eb,Ha,ma=s.match(/(ipad|iphone|ipod)/i),fb=s.match(/android/i),H=s.match(/msie/i),rb=s.match(/webkit/i),Ia=s.match(/safari/i)&&!s.match(/chrome/i),Ja=s.match(/opera/i),Ka=s.match(/(mobile|pre\/|xoom)/i)|| +ma||fb,La=!R.match(/usehtml5audio/i)&&!R.match(/sm2\-ignorebadua/i)&&Ia&&!s.match(/silk/i)&&s.match(/OS X 10_6_([3-7])/i),gb=j.console!==g&&console.log!==g,Ma=h.hasFocus!==g?h.hasFocus():null,na=Ia&&(h.hasFocus===g||!h.hasFocus()),hb=!na,ib=/(mp3|mp4|mpa|m4a|m4b)/i,$=h.location?h.location.protocol.match(/http/i):null,jb=!$?"http://":"",kb=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,lb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),sb=RegExp("\\.("+ +lb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!$;var Na;try{Na=Audio!==g&&(Ja&&opera!==g&&10>opera.version()?new Audio(null):new Audio).canPlayType!==g}catch(ub){Na=!1}this.hasHTML5=Na;this.setup=function(a){var d=!c.url;a!==g&&(n&&B&&c.ok()&&(a.flashVersion!==g||a.url!==g||a.html5Test!==g))&&Q(p("setupLate"));ta(a);d&&(V&&a.url!==g)&&c.beginDelayedInit();!V&&(a.url!==g&&"complete"===h.readyState)&&setTimeout(N,1);return c};this.supported= +this.ok=function(){return B?n&&!r:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return A(c)||h[c]||j[c]};this.createSound=function(a,d){function e(){f=ha(f);c.sounds[f.id]=new Pa(f);c.soundIDs.push(f.id);return c.sounds[f.id]}var b,f;b=null;b="soundManager.createSound(): "+p(!n?"notReady":"notOK");if(!n||!c.ok())return Q(b),!1;d!==g&&(a={id:a,url:d});f=v(a);f.url=ka(f.url);f.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+p("badID",f.id),2);c._wD("soundManager.createSound(): "+ +f.id+" ("+f.url+")",1);if(t(f.id,!0))return c._wD("soundManager.createSound(): "+f.id+" exists",1),c.sounds[f.id];la(f)?(b=e(),c._wD(f.id+": Using HTML5"),b._setup_html5(f)):(8=a)return!1;for(a-=1;0<=a;a--)c=y[a],!c.fired&&b.position>=c.position&&(c.fired=!0,s++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(b){var a,c;a=y.length;if(!a)return!1;for(a-=1;0<=a;a--)c=y[a],c.fired&&b<=c.position&&(c.fired=!1,s--);return!0};u=function(){var a=b._iO,d=a.from,e=a.to,f,g;g=function(){c._wD(b.id+': "To" time of '+e+" reached.");b.clearOnPosition(e,g);b.stop()};f=function(){c._wD(b.id+': Playing "from" '+d);if(null!== +e&&!isNaN(e))b.onPosition(e,g)};null!==d&&!isNaN(d)&&(a.position=d,a.multiShot=!1,f());return a};n=function(){var a,c=b._iO.onposition;if(c)for(a in c)if(c.hasOwnProperty(a))b.onPosition(parseInt(a,10),c[a])};Oa=function(){var a,c=b._iO.onposition;if(c)for(a in c)c.hasOwnProperty(a)&&b.clearOnPosition(parseInt(a,10))};h=function(){b.isHTML5&&Ya(b)};m=function(){b.isHTML5&&Za(b)};f=function(a){a||(y=[],s=0);q=!1;b._hasTimer=null;b._a=null;b._html5_canplay=!1;b.bytesLoaded=null;b.bytesTotal=null;b.duration= +b._iO&&b._iO.duration?b._iO.duration:null;b.durationEstimate=null;b.buffered=[];b.eqData=[];b.eqData.left=[];b.eqData.right=[];b.failures=0;b.isBuffering=!1;b.instanceOptions={};b.instanceCount=0;b.loaded=!1;b.metadata={};b.readyState=0;b.muted=!1;b.paused=!1;b.peakData={left:0,right:0};b.waveformData={left:[],right:[]};b.playState=0;b.position=null;b.id3={}};f();this._onTimer=function(a){var c,f=!1,g={};if(b._hasTimer||a){if(b._a&&(a||(0opera.version()?new Audio(null):new Audio,d=b._a,d._called_load=!1,D&&(Qa=d);b.isHTML5=!0;b._a=d;d._s=b;j();b._apply_loop(d,a.loops);a.autoLoad||a.autoPlay?b.load():(d.autobuffer=!1,d.preload="auto");return d};j=function(){if(b._a._added_events)return!1; +var a;b._a._added_events=!0;for(a in E)E.hasOwnProperty(a)&&b._a&&b._a.addEventListener(a,E[a],!1);return!0};mb=function(){var a;c._wD(b.id+": Removing event listeners");b._a._added_events=!1;for(a in E)E.hasOwnProperty(a)&&b._a&&b._a.removeEventListener(a,E[a],!1)};this._onload=function(a){var d=!!a||!b.isHTML5&&8===l&&b.duration,a=b.id+": ";c._wD(a+(d?"onload()":"Failed to load? - "+b.url),d?1:2);!d&&!b.isHTML5&&(!0===c.sandbox.noRemote&&c._wD(a+p("noNet"),1),!0===c.sandbox.noLocal&&c._wD(a+p("noLocal"), +1));b.loaded=d;b.readyState=d?3:2;b._onbufferchange(0);b._iO.onload&&b._iO.onload.apply(b,[d]);return!0};this._onbufferchange=function(a){if(0===b.playState||a&&b.isBuffering||!a&&!b.isBuffering)return!1;b.isBuffering=1===a;b._iO.onbufferchange&&(c._wD(b.id+": Buffer state change: "+a),b._iO.onbufferchange.apply(b));return!0};this._onsuspend=function(){b._iO.onsuspend&&(c._wD(b.id+": Playback suspended"),b._iO.onsuspend.apply(b));return!0};this._onfailure=function(a,d,e){b.failures++;c._wD(b.id+": Failures = "+ +b.failures);if(b._iO.onfailure&&1===b.failures)b._iO.onfailure(b,a,d,e);else c._wD(b.id+": Ignoring failure")};this._onfinish=function(){var a=b._iO.onfinish;b._onbufferchange(0);b._resetOnPosition(0);if(b.instanceCount&&(b.instanceCount--,b.instanceCount||(Oa(),b.playState=0,b.paused=!1,b.instanceCount=0,b.instanceOptions={},b._iO={},m(),b.isHTML5&&(b.position=0)),(!b.instanceCount||b._iO.multiShotEvents)&&a))c._wD(b.id+": onfinish()"),a.apply(b)};this._whileloading=function(a,c,d,e){var f=b._iO; +b.bytesLoaded=a;b.bytesTotal=c;b.duration=Math.floor(d);b.bufferLength=e;b.durationEstimate=!b.isHTML5&&!f.isMovieStar?f.duration?b.duration>f.duration?b.duration:f.duration:parseInt(b.bytesTotal/b.bytesLoaded*b.duration,10):b.duration;b.isHTML5||(b.buffered=[{start:0,end:b.duration}]);(3!==b.readyState||b.isHTML5)&&f.whileloading&&f.whileloading.apply(b)};this._whileplaying=function(a,c,d,e,f){var m=b._iO;if(isNaN(a)||null===a)return!1;b.position=Math.max(0,a);b._processOnPosition();!b.isHTML5&& +8opera.version()?new Audio(null):new Audio:null,e,b,f={},h;h=c.audioFormats;for(e in h)if(h.hasOwnProperty(e)&&(b="audio/"+e,f[e]=a(h[e].type),f[b]=f[e],e.match(ib)?(c.flash[e]=!0,c.flash[b]=!0):(c.flash[e]=!1,c.flash[b]=!1),h[e]&&h[e].related))for(b=h[e].related.length-1;0<=b;b--)f["audio/"+h[e].related[b]]=f[e],c.html5[h[e].related[b]]=f[e],c.flash[h[e].related[b]]=f[e];f.canPlayType=d?a:null;c.html5= +v(c.html5,f);return!0};F={notReady:"Unavailable - wait until onready() has fired.",notOK:"Audio support is not available.",domError:"soundManagerexception caught while appending SWF to DOM.",spcWmode:"Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash = true for more security details (output goes to SWF.)",checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+h.location.protocol+ +" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/",waitFocus:"soundManager: Special case: Waiting for SWF to load with window focus...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",waitSWF:"soundManager: Waiting for 100% SWF load...",needFunction:"soundManager: Function object expected for %s", +badID:'Warning: Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"soundManager: _debug(): Current sound objects",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded",onload:"soundManager: initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",didInit:"soundManager: init(): Already called?",secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html", +badRemove:"soundManager: Failed to remove Flash node.",shutdown:"soundManager.disable(): Shutting down",queue:"soundManager: Queueing %s handler",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS...",fbLoaded:"Flash loaded",flRemoved:"soundManager: Flash movie removed.",fbHandler:"soundManager: flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",onURL:"soundManager.load(): current URL already assigned.", +badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)",noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case",needFlash:"soundManager: Fatal error: Flash is needed to play some required formats, but is not available.",gotFocus:"soundManager: Got window focus.", +policy:"Enabling usePolicyFile for data access",setup:"soundManager.setup(): allowed parameters: %s",setupError:'soundManager.setup(): "%s" cannot be assigned with this method.',setupUndef:'soundManager.setup(): Could not find option "%s"',setupLate:"soundManager.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().",noURL:"soundManager: Flash URL required. Call soundManager.setup({url:...}) to get started.",sm2Loaded:"SoundManager 2: Ready.",reset:"soundManager.reset(): Removing event callbacks", +mobileUA:"Mobile UA detected, preferring HTML5 by default.",globalHTML5:"Using singleton HTML5 Audio() pattern for this device."};p=function(){var a=cb.call(arguments),c=a.shift(),c=F&&F[c]?F[c]:"",e,b;if(c&&a&&a.length){e=0;for(b=a.length;el)&&(c._wD(p("needfl9")),c.flashVersion=l=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===l?" (AS3/Flash 9)":" (AS2/Flash 8)");8'}if(S&&T)return!1;if(c.html5Only)return va(),e(),c.oMC=A(c.movieID),ra(),T=S=!0,!1;var f=d||c.url,j=c.altURL||f,i=fa(),m=P(),l=null,l=h.getElementsByTagName("html")[0],k,q,n,l=l&&l.dir&&l.dir.match(/rtl/i),a=a===g?c.id:a;va();c.url=Wa($?f:j);d=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;if(null!==c.wmode&&(s.match(/msie 8/i)||!H&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))J.push(F.spcWmode),c.wmode=null;i= +{name:a,id:a,src:d,quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:jb+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};c.debugFlash&&(i.FlashVars="debug=1");c.wmode||delete i.wmode;if(H)f=h.createElement("div"),q=['', +b("movie",d),b("AllowScriptAccess",c.allowScriptAccess),b("quality",i.quality),c.wmode?b("wmode",c.wmode):"",b("bgcolor",c.bgColor),b("hasPriority","true"),c.debugFlash?b("FlashVars",i.FlashVars):"",""].join("");else for(k in f=h.createElement("embed"),i)i.hasOwnProperty(k)&&f.setAttribute(k,i[k]);ya();m=P();if(i=fa())if(c.oMC=A(c.movieID)||h.createElement("div"),c.oMC.id)n=c.oMC.className,c.oMC.className=(n?n+" ":"movieContainer")+(m?" "+m:""),c.oMC.appendChild(f),H&&(k=c.oMC.appendChild(h.createElement("div")), +k.className="sm2-object-box",k.innerHTML=q),T=!0;else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+m;k=m=null;c.useFlashBlock||(c.useHighPerformance?m={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"}:(m={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},l&&(m.left=Math.abs(parseInt(m.left,10))+"px")));rb&&(c.oMC.style.zIndex=1E4);if(!c.debugFlash)for(n in m)m.hasOwnProperty(n)&&(c.oMC.style[n]=m[n]);try{H||c.oMC.appendChild(f), +i.appendChild(c.oMC),H&&(k=c.oMC.appendChild(h.createElement("div")),k.className="sm2-object-box",k.innerHTML=q),T=!0}catch(r){throw Error(p("domError")+" \n"+r.toString());}}S=!0;e();return!0};ea=function(){if(c.html5Only)return ga(),!1;if(i)return!1;if(!c.url)return k("noURL"),!1;i=c.getMovie(c.id);i||(W?(H?c.oMC.innerHTML=Aa:c.oMC.appendChild(W),W=null,S=!0):ga(c.id,c.url),i=c.getMovie(c.id));"function"===typeof c.oninitmovie&&setTimeout(c.oninitmovie,1);Ha();return!0};M=function(){setTimeout(Sa, +1E3)};Sa=function(){var a,d=!1;if(!c.url||X)return!1;X=!0;u.remove(j,"load",M);if(na&&!Ma)return k("waitFocus"),!1;n||(a=c.getMoviePercent(),0a&&(d=!0));setTimeout(function(){a=c.getMoviePercent();if(d)return X=!1,c._wD(p("waitSWF")),j.setTimeout(M,1),!1;n||(c._wD("soundManager: No Flash response within expected time. Likely causes: "+(0===a?"SWF load failed, ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash?" "+p("checkSWF"):""),2),!$&&a&&(k("localFail",2),c.debugFlash||k("tryDebug", +2)),0===a&&c._wD(p("swf404",c.url),1),x("flashtojs",!1,": Timed out"+$?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"));!n&&hb&&(null===a?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&Ba(),k("waitForever")):(k("waitForever"),I({type:"ontimeout",ignoreInit:!0})):0===c.flashLoadTimeout?k("waitForever"):za(!0))},c.flashLoadTimeout)};da=function(){if(Ma||!na)return u.remove(j,"focus",da),!0;Ma=hb=!0;k("gotFocus");X=!1;M();u.remove(j,"focus",da);return!0};Ha=function(){J.length&& +(c._wD("SoundManager 2: "+J.join(" "),1),J=[])};eb=function(){Ha();var a,d=[];if(c.useHTML5Audio&&c.hasHTML5){for(a in c.audioFormats)c.audioFormats.hasOwnProperty(a)&&d.push(a+" = "+c.html5[a]+(!c.html5[a]&&z&&c.flash[a]?" (using flash)":c.preferFlash&&c.flash[a]&&z?" (preferring flash)":!c.html5[a]?" ("+(c.audioFormats[a].required?"required, ":"")+"and no flash support)":""));c._wD("SoundManager 2 HTML5 support: "+d.join(", "),1)}};U=function(a){if(n)return!1;if(c.html5Only)return k("sm2Loaded"), +n=!0,L(),x("onload",!0),!0;var d=!0,e;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())n=!0,r&&(e={type:!z&&B?"NO_FLASH":"INIT_TIMEOUT"});c._wD("SoundManager 2 "+(r?"failed to load":"loaded")+" ("+(r?"Flash security/load error":"OK")+")",r?2:1);r||a?(c.useFlashBlock&&c.oMC&&(c.oMC.className=P()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),I({type:"ontimeout",error:e,ignoreInit:!0}),x("onload",!1),O(e),d=!1):x("onload",!0);r||(c.waitForWindowLoad&&!ca?(k("waitOnload"), +u.add(j,"load",L)):(c.waitForWindowLoad&&ca&&k("docLoaded"),L()));return d};Ra=function(){var a,d=c.setupOptions;for(a in d)d.hasOwnProperty(a)&&(c[a]===g?c[a]=d[a]:c[a]!==d[a]&&(c.setupOptions[a]=c[a]))};ra=function(){if(n)return k("didInit"),!1;if(c.html5Only)return n||(u.remove(j,"load",c.beginDelayedInit),c.enabled=!0,U()),!0;ea();try{i._externalInterfaceTest(!1),Ta(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||i._disableDebug(),c.enabled=!0,x("jstoflash",!0),c.html5Only|| +u.add(j,"unload",qa)}catch(a){return c._wD("js/flash exception: "+a.toString()),x("jstoflash",!1),O({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),za(!0),U(),!1}U();u.remove(j,"load",c.beginDelayedInit);return!0};N=function(){if(V)return!1;V=!0;Ra();ya();var a=null,a=null,d=j.console!==g&&"function"===typeof console.log,e=R.toLowerCase();-1!==e.indexOf("sm2-usehtml5audio=")&&(a="1"===e.charAt(e.indexOf("sm2-usehtml5audio=")+18),d&&console.log((a?"Enabling ":"Disabling ")+"useHTML5Audio via URL parameter"), +c.setup({useHTML5Audio:a}));-1!==e.indexOf("sm2-preferflash=")&&(a="1"===e.charAt(e.indexOf("sm2-preferflash=")+16),d&&console.log((a?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),c.setup({preferFlash:a}));!z&&c.hasHTML5&&(c._wD("SoundManager: No Flash detected"+(!c.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode."),1),c.setup({useHTML5Audio:!0,preferFlash:!1}));bb();c.html5.usingFlash=ab();B=c.html5.usingFlash;!z&&B&&(J.push(F.needFlash),c.setup({flashLoadTimeout:1}));h.removeEventListener&& +h.removeEventListener("DOMContentLoaded",N,!1);ea();return!0};Ea=function(){"complete"===h.readyState&&(N(),h.detachEvent("onreadystatechange",Ea));return!0};xa=function(){ca=!0;u.remove(j,"load",xa)};wa=function(){if(Ka&&((!c.setupOptions.useHTML5Audio||c.setupOptions.preferFlash)&&J.push(F.mobileUA),c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ma||fb&&!s.match(/android\s2\.3/i)))J.push(F.globalHTML5),ma&&(c.ignoreFlash=!0),D=!0};wa();Ga();u.add(j,"focus",da);u.add(j,"load",M);u.add(j, +"load",xa);h.addEventListener?h.addEventListener("DOMContentLoaded",N,!1):h.attachEvent?h.attachEvent("onreadystatechange",Ea):(x("onload",!1),O({type:"NO_DOM2_EVENTS",fatal:!0}))}var pa=null;if(void 0===j.SM2_DEFER||!SM2_DEFER)pa=new aa;j.SoundManager=aa;j.soundManager=pa})(window); \ No newline at end of file diff --git a/sound/dies.mp3 b/sound/dies.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..14c76bc9a0bcce40e38dc526e95ed22493ac59a2 GIT binary patch literal 27611 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 literal 0 HcmV?d00001 diff --git a/sound/opening.mp3 b/sound/opening.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7aac980622a764cabf212ac300734f7e066e2d22 GIT binary patch literal 70217 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 z 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 F{vRdqf!zQA literal 0 HcmV?d00001 diff --git a/sound/siren.mp3 b/sound/siren.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cbe9c4a8ffcc910d1e60dabd20d8cf8ac8703437 GIT binary patch literal 29283 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 EAMR(gWB>pF literal 0 HcmV?d00001 diff --git a/sound/wakawaka.mp3 b/sound/wakawaka.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..69791d39a0a0af79820f315de3ec4d1daa95215f GIT binary patch literal 12538 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 A3jhEB literal 0 HcmV?d00001