├── README.md
├── icons
├── Icon-App-29x29@1x.png
├── Icon-App-29x29@2x.png
├── Icon-App-29x29@3x.png
├── Icon-App-40x40@1x.png
├── Icon-App-40x40@2x.png
├── Icon-App-60x60@2x.png
├── Icon-App-60x60@3x.png
├── Icon-App-76x76@1x.png
└── Icon-App-76x76@2x.png
├── images
├── clouds.png
├── frog.png
├── ground.png
└── pipe.png
├── index.html
├── js
├── clouds.js
├── game.js
├── global.js
├── main.js
├── pipes.js
├── require.js
├── scene.js
├── sounds.js
└── utils.js
├── lib
├── phaser.min.js
└── phaser.min.patched.js
└── sounds
├── bgm.mp3
├── crash.mp3
├── flap.mp3
├── ha.mp3
├── hurt
├── 1.mp3
├── 10.mp3
├── 11.mp3
├── 12.mp3
├── 13.mp3
├── 14.mp3
├── 15.mp3
├── 16.mp3
├── 17.mp3
├── 18.mp3
├── 19.mp3
├── 2.mp3
├── 20.mp3
├── 21.mp3
├── 3.mp3
├── 4.mp3
├── 5.mp3
├── 6.mp3
├── 7.mp3
├── 8.mp3
└── 9.mp3
└── score
├── 1.mp3
├── 10.mp3
├── 11.mp3
├── 12.mp3
├── 13.mp3
├── 14.mp3
├── 15.mp3
├── 16.mp3
├── 17.mp3
├── 18.mp3
├── 19.mp3
├── 2.mp3
├── 20.mp3
├── 21.mp3
├── 22.mp3
├── 23.mp3
├── 24.mp3
├── 25.mp3
├── 26.mp3
├── 27.mp3
├── 28.mp3
├── 29.mp3
├── 3.mp3
├── 30.mp3
├── 31.mp3
├── 32.mp3
├── 33.mp3
├── 34.mp3
├── 35.mp3
├── 36.mp3
├── 37.mp3
├── 38.mp3
├── 39.mp3
├── 4.mp3
├── 40.mp3
├── 41.mp3
├── 42.mp3
├── 43.mp3
├── 5.mp3
├── 6.mp3
├── 7.mp3
├── 8.mp3
└── 9.mp3
/README.md:
--------------------------------------------------------------------------------
1 | # Flappy Frog 重制版
2 | [Flappy Frog](https://github.com/tusenpo/FlappyFrog) 重制版
3 | 加入了更多的长者语音
--------------------------------------------------------------------------------
/icons/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/icons/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/icons/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/icons/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/icons/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/icons/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/icons/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/icons/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/icons/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/icons/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/images/clouds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/clouds.png
--------------------------------------------------------------------------------
/images/frog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/frog.png
--------------------------------------------------------------------------------
/images/ground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/ground.png
--------------------------------------------------------------------------------
/images/pipe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/images/pipe.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Flappy Frog
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
46 |
47 |
48 |
49 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/js/clouds.js:
--------------------------------------------------------------------------------
1 | require.register('clouds.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 | var utils = require('utils');
6 | var preloadSpritesheet = utils.preloadSpritesheet;
7 |
8 | var settings = global.settings;
9 |
10 | var cloudGroup;
11 |
12 | var spawnTime = Math.random(), timeElapsed = 0;
13 |
14 | function resetCloud(cloud) {
15 | cloud.x = global.phaserGame.width;
16 | cloud.y = Math.random() * global.phaserGame.height / 2;
17 | cloud.frame = Math.floor(4 * Math.random());
18 | var cloudScale = 2 + 2 * Math.random();
19 | cloud.alpha = 2 / cloudScale;
20 | if (cloud.alpha > 0.7)
21 | cloud.alpha = 0.7;
22 | cloud.scale.setTo(cloudScale, cloudScale);
23 | cloud.body.velocity.x = -settings.speed / cloudScale;
24 | }
25 |
26 | function spawn() {
27 | var cloud = cloudGroup.getFirstDead();
28 | if (cloud) {
29 | cloud.revive();
30 | } else {
31 | cloud = cloudGroup.create(global.phaserGame.width, global.phaserGame.height, 'clouds');
32 | }
33 | resetCloud(cloud);
34 | }
35 |
36 | exports.update = function() {
37 | cloudGroup.forEachAlive(function(cloud) {
38 | if (cloud.x + cloud.width < global.phaserGame.world.bounds.left) {
39 | cloud.kill();
40 | }
41 | });
42 |
43 | timeElapsed += global.phaserGame.time.physicsElapsed;
44 | if (timeElapsed >= spawnTime) {
45 | spawnTime = 4 * Math.random();
46 | timeElapsed = 0;
47 | spawn();
48 | }
49 |
50 | //console.log(cloudGroup.length);
51 | };
52 |
53 | exports.preload = function() {
54 | preloadSpritesheet('clouds', 128, 64);
55 | };
56 |
57 | exports.create = function() {
58 | cloudGroup = global.phaserGame.add.group();
59 | };
60 |
61 | });
62 |
--------------------------------------------------------------------------------
/js/game.js:
--------------------------------------------------------------------------------
1 | require.register('game.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 | var preloadImage = require('utils').preloadImage;
6 | var sounds = require('sounds');
7 | var pipes = require('pipes');
8 | var clouds = require('clouds');
9 |
10 | var settings = global.settings;
11 |
12 | var ground, bird;
13 | var gameStarted = false, crashed = false, crashedGround = false;
14 | var scoreText, score;
15 | var timeElapsedText, timeElapsed, startTime;
16 |
17 | function createBackground() {
18 | var graphics = global.phaserGame.add.graphics(0, 0);
19 | graphics.beginFill(0xDDEEFF, 1);
20 | graphics.drawRect(0, 0, global.phaserGame.width, global.phaserGame.height);
21 | graphics.endFill();
22 | }
23 |
24 | function createGround() {
25 | global.phaserGame.world.bounds.height = global.phaserGame.height + 16;
26 |
27 | var height = 32;
28 | ground = global.phaserGame.add.tileSprite(
29 | 0,
30 | global.phaserGame.height - height,
31 | global.phaserGame.width,
32 | height,
33 | 'ground'
34 | );
35 | ground.tileScale.setTo(2, 2);
36 | }
37 |
38 | function createBird() {
39 | bird = global.phaserGame.add.sprite(
40 | global.phaserGame.width / 2,
41 | global.phaserGame.height / 2,
42 | 'frog'
43 | );
44 | bird.anchor.setTo(0.5, 0.5);
45 | bird.body.collideWorldBounds = true;
46 | }
47 |
48 | function createTexts() {
49 | scoreText = global.phaserGame.add.text(
50 | global.phaserGame.width / 2,
51 | global.phaserGame.height / 4,
52 | '',
53 | {
54 | font: '14px ' + global.font,
55 | fill: '#fff',
56 | stroke: '#430',
57 | strokeThickness: 4,
58 | align: 'center'
59 | }
60 | );
61 | scoreText.anchor.setTo(0.5, 0.5);
62 |
63 | timeElapsedText = global.phaserGame.add.text(
64 | global.phaserGame.width / 2,
65 | scoreText.y + scoreText.height,
66 | '',
67 | {
68 | font: '14px ' + global.font,
69 | fill: '#f00',
70 | align: 'center'
71 | }
72 | );
73 | timeElapsedText.anchor.setTo(0.5, 0.5);
74 | }
75 |
76 | function updateGround() {
77 | if (crashed)
78 | return;
79 | var t = global.phaserGame.time.physicsElapsed;
80 | var v = settings.speed;
81 | ground.tilePosition.x -= t * v / 2;
82 | }
83 |
84 | function updateBird() {
85 | if (!gameStarted) {
86 | var y = global.phaserGame.height / 2;
87 | bird.y = y + 8 * Math.cos(global.phaserGame.time.now / 200);
88 | return;
89 | }
90 |
91 | if (crashed)
92 | return;
93 |
94 | var dvy = settings.flap + bird.body.velocity.y;
95 | bird.angle = (90 * dvy / settings.flap) - 180;
96 | if (bird.angle < 0) {
97 | bird.angle = 0;
98 | }
99 | }
100 |
101 | function resetBird() {
102 | bird.body.gravity.y = 0;
103 | bird.x = global.phaserGame.width / 4 + bird.width / 2;
104 | bird.angle = 0;
105 | bird.scale.setTo(1, 1);
106 | }
107 |
108 | function flap() {
109 | if (!gameStarted)
110 | return;
111 |
112 | if (!crashed) {
113 | bird.body.velocity.y = -settings.flap;
114 | sounds('flap').isPlaying() || sounds('flap').play();
115 | }
116 | }
117 |
118 | function crash() {
119 | bird.angle = -20;
120 | bird.scale.setTo(1, -1);
121 | sounds('score').stop();
122 | sounds('ha').play();
123 | sounds('crash').play();
124 | }
125 |
126 | function crashGround() {
127 | bird.angle = -20;
128 | bird.scale.setTo(1, -1);
129 | sounds('score').stop();
130 | !!crashed || sounds('crash').play();
131 | }
132 |
133 | function checkCollision() {
134 | if (!crashed) {
135 | if (
136 | (settings.ceiling && bird.body.bottom - bird.body.height <= global.phaserGame.world.bounds.top) ||
137 | pipes.checkCollision(
138 | bird.body.right - bird.body.width,
139 | bird.body.bottom - bird.body.height,
140 | bird.body.right,
141 | bird.body.bottom)
142 | ) {
143 | stop();
144 | crash();
145 | crashed = true;
146 |
147 | } else if (pipes.checkScore(bird.body.right)) {
148 | addScore();
149 | }
150 | }
151 |
152 | if (!crashedGround) {
153 | if (bird.body.bottom >= global.phaserGame.world.bounds.bottom) {
154 | stop();
155 | crashGround();
156 | crashed = true;
157 | crashedGround = true;
158 | endGame();
159 | }
160 | }
161 | }
162 |
163 | function addScore() {
164 | score += 1;
165 | updateScoreText();
166 | sounds('score').play();
167 | }
168 |
169 | function updateScoreText() {
170 | scoreText.setText(
171 | '+ %s s'.replace('%s', score)
172 | );
173 | }
174 |
175 | function updateTimeElapsed() {
176 | if (crashed)
177 | return;
178 | var a = Math.floor(global.phaserGame.time.elapsedSecondsSince(startTime)) + 1;
179 | if (timeElapsed == a)
180 | return;
181 | timeElapsed = a;
182 | timeElapsedText.setText(
183 | '- %s s'.replace('%s', timeElapsed)
184 | );
185 | }
186 |
187 | var onGameOver;
188 | function endGame() {
189 | global.timeElapsed = timeElapsed;
190 | global.score = score;
191 | if (!global.bestScore || global.bestScore < score) {
192 | global.bestScore = score;
193 | }
194 |
195 | setTimeout(function() {
196 | sounds('hurt').play();
197 | onGameOver();
198 | }, 500);
199 | }
200 |
201 | function stop() {
202 | if (crashed)
203 | return;
204 |
205 | pipes.stop();
206 | }
207 |
208 | exports.start = function(cb) {
209 | startTime = global.phaserGame.time.now;
210 |
211 | sounds('hurt').stop();
212 | onGameOver = cb;
213 |
214 | bird.body.gravity.y = settings.gravity;
215 | updateScoreText();
216 | scoreText.visible = true;
217 | pipes.start();
218 | gameStarted = true;
219 |
220 | flap();
221 | };
222 |
223 | exports.reset = function() {
224 | timeElapsedText.setText('');
225 |
226 | score = 0;
227 | gameStarted = false;
228 | crashed = false;
229 | crashedGround = false;
230 |
231 | scoreText.visible = false;
232 |
233 | pipes.reset();
234 | resetBird();
235 | };
236 |
237 | exports.preload = function() {
238 | pipes.preload();
239 | clouds.preload();
240 | preloadImage('frog');
241 | preloadImage('ground');
242 | };
243 |
244 | exports.create = function() {
245 | createBackground();
246 | pipes.create();
247 | createBird();
248 | createGround();
249 | createTexts();
250 | clouds.create();
251 |
252 | global.phaserGame.input.onDown.add(flap);
253 |
254 | exports.reset();
255 | };
256 |
257 | exports.update = function() {
258 | clouds.update();
259 | updateBird();
260 | updateGround();
261 | if (gameStarted) {
262 | updateTimeElapsed();
263 | checkCollision();
264 | pipes.update();
265 | }
266 | };
267 |
268 | exports.render = function() {
269 | if (settings.debug)
270 | global.phaserGame.debug.renderSpriteBody(bird);;
271 | pipes.render();
272 | };
273 |
274 | });
275 |
--------------------------------------------------------------------------------
/js/global.js:
--------------------------------------------------------------------------------
1 | require.register('global.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | exports.font = '"Segoe UI", "Microsoft YaHei", 宋体, sans-serif';
5 |
6 | exports.settings = {
7 | gravity: 40,
8 | flap: 620,
9 | speed: 390,
10 | spacing: 468,
11 | gap: 300,
12 | ceiling: false,
13 | canvas: true,
14 | antialias: false,
15 | debug: false,
16 | scoreSounds: 43,
17 | hurtSounds: 21
18 | };
19 |
20 | });
21 |
--------------------------------------------------------------------------------
/js/main.js:
--------------------------------------------------------------------------------
1 | require.register('main.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 | var sounds = require('sounds');
6 | var scene = require('scene');
7 | var utils = require('utils');
8 |
9 | var settings = global.settings;
10 |
11 | function preload() {
12 | global.phaserGame.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL;
13 | global.phaserGame.stage.scale.setScreenSize(true);
14 |
15 | sounds.preload();
16 | scene.preload();
17 | }
18 |
19 | function create() {
20 | sounds.create();
21 | scene.create();
22 | scene.shift('title');
23 | }
24 |
25 | function update() {
26 | scene.update();
27 | }
28 |
29 | function render() {
30 | scene.render();
31 | }
32 |
33 | exports.run = function() {
34 | utils.loadSettingsFromUrl();
35 |
36 | var width = 480;
37 | var height = 700;
38 |
39 | var availWidth = document.body.offsetWidth;
40 | var availHeight = document.body.offsetHeight;
41 | if (availWidth > availHeight) {
42 | var w = availWidth;
43 | availWidth = availHeight;
44 | availHeight = w;
45 | }
46 |
47 | var device = new Phaser.Device();
48 | if (availWidth >= 320 && availHeight >= 480 && availHeight <= 1280) {
49 | if (!device.desktop || settings.mobile) {
50 | width = availWidth;
51 | height = availHeight;
52 | }
53 | }
54 | console.log(device.desktop ? 'desktop' : 'mobile', width, 'x', height);
55 |
56 | global.phaserGame = new Phaser.Game(
57 | width,
58 | height,
59 | settings.canvas ? Phaser.CANVAS : Phaser.AUTO,
60 | document.getElementById('game'),
61 | {
62 | preload: preload,
63 | create: create,
64 | update: update,
65 | render: render
66 | },
67 | false,
68 | settings.antialias
69 | );
70 | };
71 |
72 | });
73 |
--------------------------------------------------------------------------------
/js/pipes.js:
--------------------------------------------------------------------------------
1 | require.register('pipes.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 | var utils = require('utils');
6 | var preloadImage = utils.preloadImage;
7 |
8 | var settings = global.settings;
9 |
10 | var pipeLayer;
11 |
12 | function PipePair() {
13 | this.scored = false;
14 | this.alive = true;
15 | this.topPipe = pipeLayer.create(0, 0, 'pipe');
16 | this.bottomPipe = pipeLayer.create(0, 0, 'pipe');
17 | this.topPipe.scale.setTo(2, 2);
18 | this.bottomPipe.scale.setTo(2, 2);
19 | }
20 |
21 | PipePair.prototype.reset = function() {
22 | var gap = settings.gap / 2;
23 |
24 | var x = global.phaserGame.width;
25 | var y = global.phaserGame.height / 2 + (Math.random() > 0.5 ? -1 : 1) * Math.random() * global.phaserGame.height / 6;
26 | y -= 50;
27 |
28 | this.topPipe.x = x;
29 | this.topPipe.y = y - gap - this.topPipe.height;
30 |
31 | this.bottomPipe.x = x;
32 | this.bottomPipe.y = y + gap;
33 |
34 | this.scored = false;
35 | };
36 |
37 | PipePair.prototype.kill = function() {
38 | this.topPipe.visible = false;
39 | this.bottomPipe.visible = false;
40 | this.alive = false;
41 | };
42 |
43 | PipePair.prototype.revive = function() {
44 | this.topPipe.visible = true;
45 | this.bottomPipe.visible = true;
46 | this.alive = true;
47 | };
48 |
49 | PipePair.prototype.checkScore = function(x) {
50 | if (!this.alive)
51 | return false;
52 |
53 | if (this.scored)
54 | return false;
55 |
56 | if (x > this.topPipe.x + this.topPipe.width) {
57 | this.scored = true;
58 | return true;
59 | }
60 |
61 | return false;
62 | };
63 |
64 | PipePair.prototype.checkCollision = function(left, top, right, bottom) {
65 | if (!this.alive)
66 | return false;
67 |
68 | if (utils.overlapAABB(left, top, right, bottom,
69 | this.topPipe.x, this.topPipe.y,
70 | this.topPipe.x + this.topPipe.width, this.topPipe.y + this.topPipe.height)) {
71 | return true;
72 | }
73 |
74 | if (utils.overlapAABB(left, top, right, bottom,
75 | this.bottomPipe.x, this.bottomPipe.y,
76 | this.bottomPipe.x + this.bottomPipe.width, this.bottomPipe.y + this.bottomPipe.height)) {
77 | return true;
78 | }
79 |
80 | return false;
81 | };
82 |
83 | PipePair.prototype.checkOutOfBound = function() {
84 | return this.topPipe.x + this.topPipe.width <= global.phaserGame.world.bounds.left;
85 | };
86 |
87 | PipePair.prototype.moveX = function(n) {
88 | if (!this.alive)
89 | return;
90 |
91 | this.topPipe.x -= n;
92 | this.bottomPipe.x -= n;
93 |
94 | if (this.checkOutOfBound())
95 | this.kill();
96 | };
97 |
98 | PipePair.prototype.render = function() {
99 | global.phaserGame.debug.renderSpriteBody(this.topPipe);
100 | global.phaserGame.debug.renderSpriteBody(this.bottomPipe);
101 | };
102 |
103 |
104 | var pipeList = [], paused = true, distance = 0;
105 |
106 | exports.checkScore = function(x) {
107 | for (var i = 0; i < pipeList.length; i++) {
108 | if (pipeList[i].checkScore(x))
109 | return true;
110 | }
111 | return false;
112 | };
113 |
114 | exports.checkCollision = function(left, top, right, bottom) {
115 | for (var i = 0; i < pipeList.length; i++) {
116 | if (pipeList[i].checkCollision(left, top, right, bottom))
117 | return true;
118 | }
119 | return false;
120 | };
121 |
122 | function reusePipe() {
123 | var pipe;
124 | for (var i = 0; i < pipeList.length; i++) {
125 | pipe = pipeList[i];
126 | if (!pipe.alive)
127 | return pipe;
128 | }
129 | return null;
130 | }
131 |
132 | function spawn() {
133 | var pipe = reusePipe();
134 | if (!pipe) {
135 | pipe = new PipePair();
136 | pipeList.push(pipe);
137 | } else {
138 | pipe.revive();
139 | }
140 | pipe.reset();
141 | }
142 |
143 | exports.update = function() {
144 | if (paused)
145 | return;
146 |
147 | var t = global.phaserGame.time.physicsElapsed;
148 | var s = settings.speed * t;
149 |
150 | pipeList.forEach(function(pipe) {
151 | pipe.moveX(s);
152 | });
153 |
154 | distance += s;
155 | if (distance >= settings.spacing) {
156 | distance = 0;
157 | spawn();
158 | }
159 |
160 | //console.log(pipeList.length);
161 | };
162 |
163 | exports.start = function() {
164 | paused = false;
165 | };
166 |
167 | exports.stop = function() {
168 | paused = true;
169 | };
170 |
171 | exports.reset = function() {
172 | pipeList.forEach(function(pipe) {
173 | if (pipe.alive)
174 | pipe.kill();
175 | });
176 | distance = 0;
177 | };
178 |
179 | exports.preload = function() {
180 | preloadImage('pipe');
181 | };
182 |
183 | exports.create = function() {
184 | pipeLayer = global.phaserGame.add.group();
185 | };
186 |
187 | function render(flags) {
188 | if (!flags)
189 | return;
190 | pipeList.forEach(function(pipe) {
191 | if (flags & 1)
192 | pipe.alive && pipe.render();
193 | if (flags & 2)
194 | !pipe.alive && pipe.render();
195 | });
196 | }
197 |
198 | exports.render = function() {
199 | if (settings.debug)
200 | render(3);
201 | };
202 |
203 | });
204 |
--------------------------------------------------------------------------------
/js/require.js:
--------------------------------------------------------------------------------
1 | (function(global) {
2 | 'use strict';
3 |
4 | var modules = {};
5 |
6 | var require = function(id) {
7 | if (!/\.js$/.test(id))
8 | id += '.js';
9 | var module = modules[id];
10 | if (!module.exports) {
11 | module.exports = {};
12 | module.call(this, module.exports, require, module);
13 | }
14 | return module.exports;
15 | };
16 |
17 | require.register = function(id, func) {
18 | modules[id] = func;
19 | };
20 |
21 | global.require = require;
22 | })(this);
23 |
--------------------------------------------------------------------------------
/js/scene.js:
--------------------------------------------------------------------------------
1 | require.register('scene.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 | var utils = require('utils')
6 | var preloadImage = utils.preloadImage;
7 | var game = require('game');
8 | var sounds = require('sounds');
9 |
10 | var settings = global.settings;
11 |
12 | function TextButton(opts) {
13 | this.label = global.phaserGame.add.text(
14 | opts.x || 0,
15 | opts.y || 0,
16 | opts.text || '',
17 | {
18 | font: (opts.size || '22px') + ' ' + global.font,
19 | fill: '#fff',
20 | stroke: '#430',
21 | strokeThickness: 4,
22 | align: 'center'
23 | }
24 | );
25 | this.label.anchor.setTo(
26 | opts.anchorX || 0,
27 | opts.anchorY || 0
28 | );
29 |
30 | this.sprite = global.phaserGame.add.sprite(this.label.x, this.label.y);
31 | this.sprite.width = this.label.width;
32 | this.sprite.height = this.label.height;
33 | this.sprite.anchor.setTo(this.label.anchor.x, this.label.anchor.y);
34 | this.sprite.inputEnabled = true;
35 |
36 | this.events = this.sprite.events;
37 | }
38 |
39 | TextButton.prototype.show = function() {
40 | this.label.visible = true;
41 | this.sprite.visible = true;
42 | };
43 |
44 | TextButton.prototype.hide = function() {
45 | this.label.visible = false;
46 | this.sprite.visible = false;
47 | };
48 |
49 |
50 | var tipsText, loadingText, scoreText;
51 | var playButton, restartButton, feedbackButton, playBgmButton;
52 |
53 | function setLoadingText(percent) {
54 | loadingText.setText(
55 | 'Loading...\n\n历史的行程: %s %'.replace('%s', percent)
56 | );
57 | }
58 |
59 | function createLoadingScreen() {
60 | tipsText = global.phaserGame.add.text(
61 | global.phaserGame.width / 2,
62 | global.phaserGame.height / 4,
63 | '请打开声音',
64 | {
65 | font: '16px ' + global.font,
66 | fill: '#fff',
67 | align: 'center'
68 | }
69 | );
70 | tipsText.anchor.setTo(0.5, 0.5);
71 |
72 | loadingText = global.phaserGame.add.text(
73 | global.phaserGame.width / 2,
74 | global.phaserGame.height / 2,
75 | '',
76 | {
77 | font: '24px ' + global.font,
78 | fill: '#f00',
79 | align: 'center'
80 | }
81 | );
82 | loadingText.anchor.setTo(0.5, 0.5);
83 | setLoadingText(0);
84 | global.phaserGame.load.onFileComplete.add(setLoadingText);
85 | }
86 |
87 | function unlockAudio() {
88 | utils.unlockAudioContext();
89 | }
90 |
91 | function createButtons() {
92 | playButton = new TextButton({
93 | x: global.phaserGame.width / 2,
94 | y: global.phaserGame.height - global.phaserGame.height / 3,
95 | anchorX: 0.5,
96 | anchorY: 0.5,
97 | text: '开始'
98 | });
99 | playButton.hide();
100 |
101 | playButton.events.onInputUp.add(function() {
102 | unlockAudio();
103 | exports.shift('play');
104 | });
105 |
106 |
107 | restartButton = new TextButton({
108 | x: global.phaserGame.width / 2,
109 | y: global.phaserGame.height - global.phaserGame.height / 5,
110 | anchorX: 0.5,
111 | anchorY: 0.5,
112 | text: '重新续'
113 | });
114 | restartButton.hide();
115 |
116 | restartButton.events.onInputUp.add(function() {
117 | exports.shift('title');
118 | });
119 |
120 |
121 | feedbackButton = new TextButton({
122 | x: 0,
123 | y: 0,
124 | size: '14px',
125 | text: '"5"可奉告'
126 | });
127 |
128 | feedbackButton.events.onInputUp.add(function() {
129 | unlockAudio();
130 | if (settings.scoreSounds >= 15)
131 | sounds('score').playCustom(15);
132 | if (!settings.feedback)
133 | return;
134 | window.open(settings.feedback);
135 | });
136 |
137 |
138 | playBgmButton = new TextButton({
139 | x: global.phaserGame.width,
140 | y: 0,
141 | anchorX: 1,
142 | size: '14px',
143 | text: '请州长夫人演唱'
144 | });
145 |
146 | playBgmButton.events.onInputUp.add(function() {
147 | unlockAudio();
148 | sounds('bgm').toggle();
149 | });
150 | }
151 |
152 | function createScoreText() {
153 | scoreText = global.phaserGame.add.text(
154 | global.phaserGame.width / 2,
155 | global.phaserGame.height / 2,
156 | '',
157 | {
158 | font: '18px ' + global.font,
159 | fill: '#fff',
160 | stroke: '#430',
161 | strokeThickness: 4,
162 | align: 'center'
163 | }
164 | );
165 | scoreText.anchor.setTo(0.5, 0.5);
166 | scoreText.visible = false;
167 | }
168 |
169 | function showScore() {
170 | var text = '我为长者续命 %s 秒\n志己的生命减少 %s 秒\n而且这个效率efficiency: %s%\n\n最吼的一次续了 %s 秒';
171 |
172 | var score = global.score;
173 | var timeElapsed = global.timeElapsed;
174 | var a = Math.floor(score / timeElapsed * 100);
175 | a = text.replace('%s', score).replace('%s', timeElapsed).replace('%s', a).replace('%s', global.bestScore);
176 |
177 | scoreText.setText(a);
178 | scoreText.visible = true;
179 | }
180 |
181 | function hideScore() {
182 | scoreText.visible = false;
183 | }
184 |
185 | var sceneName = 'loading';
186 | var scenes = {
187 | 'loading': {
188 | enter: function() {
189 | },
190 |
191 | exit: function() {
192 | tipsText.visible = false;
193 | loadingText.visible = false;
194 | }
195 | },
196 |
197 | 'title': {
198 | enter: function() {
199 | playButton.show();
200 | },
201 |
202 | exit: function() {
203 | playButton.hide();
204 | }
205 | },
206 |
207 | 'play': {
208 | enter: function() {
209 | game.start(function() {
210 | exports.shift('end');
211 | });
212 | },
213 |
214 | exit: function() {
215 | }
216 | },
217 |
218 | 'end': {
219 | enter: function() {
220 | restartButton.show();
221 | showScore();
222 | },
223 |
224 | exit: function() {
225 | restartButton.hide();
226 | hideScore();
227 |
228 | game.reset();
229 | }
230 | }
231 | };
232 |
233 | exports.shift = function(name) {
234 | if (sceneName === name)
235 | return;
236 | if (sceneName)
237 | scenes[sceneName].exit();
238 | sceneName = name;
239 | scenes[sceneName].enter();
240 | };
241 |
242 |
243 | exports.preload = function() {
244 | createLoadingScreen();
245 | game.preload();
246 |
247 | };
248 |
249 | exports.create = function() {
250 | game.create();
251 |
252 | createButtons();
253 | createScoreText();
254 | };
255 |
256 | exports.update = function() {
257 | game.update();
258 | };
259 |
260 | exports.render = function() {
261 | game.render();
262 | };
263 |
264 | });
265 |
--------------------------------------------------------------------------------
/js/sounds.js:
--------------------------------------------------------------------------------
1 | require.register('sounds.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 | var utils = require('utils');
6 | var preloadAudio = utils.preloadAudio;
7 | var settings = global.settings;
8 |
9 | function SoundArray(name, opts) {
10 | this.sounds = [];
11 | this.name = name;
12 | this.count = opts.count || 0;
13 | this.currentIndex = 0;
14 | this.recentIndex = 0;
15 | this.loop = !!opts.loop;
16 | this.playing = false;
17 | this.manuallyStopped = false;
18 | }
19 |
20 | SoundArray.prototype.preload = function() {
21 | if (!this.count) {
22 | preloadAudio(this.name);
23 | return;
24 | }
25 |
26 | var key, name = this.name;
27 | for (var i = 0, l = this.count; i < l; i++) {
28 | key = name + '/' + (i + 1);
29 | preloadAudio(key);
30 | }
31 | };
32 |
33 | SoundArray.prototype.createSound = function(key) {
34 | var sound = global.phaserGame.add.audio(key);
35 | sound.onStop.add(this.onStop, this);
36 | return sound;
37 | };
38 |
39 | SoundArray.prototype.create = function() {
40 | if (!this.count) {
41 | this.sounds[0] = this.createSound(this.name);
42 | this.count = 1;
43 | return;
44 | }
45 |
46 | var key, name = this.name;
47 | for (var i = 0, l = this.count; i < l; i++) {
48 | key = name + '/' + (i + 1);
49 | this.sounds[i] = this.createSound(key);
50 | }
51 | };
52 |
53 | SoundArray.prototype.random = function() {
54 | if (this.count === 1) {
55 | return;
56 | }
57 | var index = Math.floor(Math.random() * this.count);
58 | if (this.count < 5) {
59 | this.currentIndex = index;
60 | return;
61 | }
62 | if ( (index !== this.currentIndex && index !== this.recentIndex) ||
63 | (index === this.currentIndex && index === this.recentIndex) ) {
64 | this.recentIndex = this.currentIndex;
65 | this.currentIndex = index;
66 | return;
67 | }
68 | return this.random();
69 | }
70 |
71 | SoundArray.prototype.getSound = function() {
72 | return this.sounds[this.currentIndex];
73 | };
74 |
75 | SoundArray.prototype.isPlaying = function() {
76 | return this.playing;
77 | };
78 |
79 | SoundArray.prototype.onStop = function() {
80 | if (this.loop && !this.manuallyStopped) {
81 | this.play();
82 | return;
83 | }
84 | this.playing = false;
85 | };
86 |
87 | SoundArray.prototype.playSound = function() {
88 | this.playing = true;
89 | this.getSound().play();
90 | };
91 |
92 | SoundArray.prototype.play = function() {
93 | this.manuallyStopped = false;
94 | this.random();
95 | this.playSound();
96 | if (settings.debug)
97 | console.log('sound', this.name, this.currentIndex + 1);
98 | };
99 |
100 | SoundArray.prototype.playCustom = function(id) {
101 | this.manuallyStopped = true;
102 | this.currentIndex = id - 1;
103 | this.playSound();
104 | };
105 |
106 | SoundArray.prototype.stop = function() {
107 | this.manuallyStopped = true;
108 | this.getSound().stop();
109 | };
110 |
111 | SoundArray.prototype.toggle = function() {
112 | this.playing ? this.stop() : this.play();
113 | };
114 |
115 | var sounds;
116 |
117 | exports = function(name) {
118 | return sounds[name];
119 | };
120 |
121 | exports.preload = function() {
122 | sounds = {
123 | 'bgm': {loop: true},
124 | 'crash': {},
125 | 'flap': {},
126 | 'ha': {},
127 | 'hurt': {count: settings.hurtSounds},
128 | 'score': {count: settings.scoreSounds}
129 | };
130 |
131 | var opts;
132 | for (var name in sounds) {
133 | opts = sounds[name];
134 | sounds[name] = new SoundArray(name, opts);
135 | sounds[name].preload();
136 | }
137 | };
138 |
139 | exports.create = function() {
140 | for (var name in sounds) {
141 | sounds[name].create();
142 | }
143 | };
144 |
145 | module.exports = exports;
146 |
147 | });
148 |
--------------------------------------------------------------------------------
/js/utils.js:
--------------------------------------------------------------------------------
1 | require.register('utils.js', function(exports, require, module) {
2 | 'use strict';
3 |
4 | var global = require('global');
5 |
6 | exports.preloadImage = function(key) {
7 | var path = 'images/' + key + '.png';
8 | global.phaserGame.load.image(key, path);
9 | };
10 |
11 | exports.preloadSpritesheet = function(key, w, h) {
12 | var path = 'images/' + key + '.png';
13 | global.phaserGame.load.spritesheet(key, path, w, h);
14 | };
15 |
16 | exports.preloadAudio = function(key) {
17 | var path = 'sounds/' + key + '.mp3';
18 | global.phaserGame.load.audio(key, path);
19 | };
20 |
21 | exports.overlapAABB = function(left1, top1, right1, bottom1, left2, top2, right2, bottom2) {
22 | return left1 < right2 &&
23 | right1 > left2 &&
24 | top1 < bottom2 &&
25 | bottom1 > top2;
26 | };
27 |
28 | // https://goo.gl/7K7WLu
29 | exports.unlockAudioContext = function() {
30 | var context = global.phaserGame.sound.context;
31 | if (context && context.state === 'suspended') {
32 | context.resume();
33 | }
34 | };
35 |
36 |
37 | exports.parseQueryString = function(qs){
38 | var result = {}, pairs = qs.split('&'), keyValue;
39 | for(var i = 0, l = pairs.length; i < l; i++) {
40 | keyValue = pairs[i].split('=');
41 | result[keyValue[0]] = decodeURIComponent(keyValue[1]);
42 | }
43 | return result;
44 | };
45 |
46 | exports.loadSettingsFromUrl = function() {
47 | var qs = window.location.search.substr(1);
48 | if (!qs)
49 | return;
50 |
51 | qs = exports.parseQueryString(qs);
52 | var settings = global.settings, k, v;
53 |
54 | for (k in qs) {
55 | v = qs[k];
56 | if (!v.length)
57 | continue;
58 | else if (v === 'undefined')
59 | v = undefined;
60 | else if (v === 'null')
61 | v = null;
62 | else if (v === 'true')
63 | v = true;
64 | else if (v === 'false')
65 | v = false;
66 | else if (v[0] === "'" && v[v.length - 1] === "'")
67 | v = v.substring(1, v.length - 1);
68 | else
69 | v = Number(v);
70 |
71 | settings[k] = v;
72 | }
73 | };
74 |
75 | });
76 |
--------------------------------------------------------------------------------
/sounds/bgm.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/bgm.mp3
--------------------------------------------------------------------------------
/sounds/crash.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/crash.mp3
--------------------------------------------------------------------------------
/sounds/flap.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/flap.mp3
--------------------------------------------------------------------------------
/sounds/ha.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/ha.mp3
--------------------------------------------------------------------------------
/sounds/hurt/1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/1.mp3
--------------------------------------------------------------------------------
/sounds/hurt/10.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/10.mp3
--------------------------------------------------------------------------------
/sounds/hurt/11.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/11.mp3
--------------------------------------------------------------------------------
/sounds/hurt/12.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/12.mp3
--------------------------------------------------------------------------------
/sounds/hurt/13.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/13.mp3
--------------------------------------------------------------------------------
/sounds/hurt/14.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/14.mp3
--------------------------------------------------------------------------------
/sounds/hurt/15.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/15.mp3
--------------------------------------------------------------------------------
/sounds/hurt/16.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/16.mp3
--------------------------------------------------------------------------------
/sounds/hurt/17.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/17.mp3
--------------------------------------------------------------------------------
/sounds/hurt/18.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/18.mp3
--------------------------------------------------------------------------------
/sounds/hurt/19.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/19.mp3
--------------------------------------------------------------------------------
/sounds/hurt/2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/2.mp3
--------------------------------------------------------------------------------
/sounds/hurt/20.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/20.mp3
--------------------------------------------------------------------------------
/sounds/hurt/21.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/21.mp3
--------------------------------------------------------------------------------
/sounds/hurt/3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/3.mp3
--------------------------------------------------------------------------------
/sounds/hurt/4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/4.mp3
--------------------------------------------------------------------------------
/sounds/hurt/5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/5.mp3
--------------------------------------------------------------------------------
/sounds/hurt/6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/6.mp3
--------------------------------------------------------------------------------
/sounds/hurt/7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/7.mp3
--------------------------------------------------------------------------------
/sounds/hurt/8.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/8.mp3
--------------------------------------------------------------------------------
/sounds/hurt/9.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/hurt/9.mp3
--------------------------------------------------------------------------------
/sounds/score/1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/1.mp3
--------------------------------------------------------------------------------
/sounds/score/10.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/10.mp3
--------------------------------------------------------------------------------
/sounds/score/11.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/11.mp3
--------------------------------------------------------------------------------
/sounds/score/12.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/12.mp3
--------------------------------------------------------------------------------
/sounds/score/13.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/13.mp3
--------------------------------------------------------------------------------
/sounds/score/14.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/14.mp3
--------------------------------------------------------------------------------
/sounds/score/15.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/15.mp3
--------------------------------------------------------------------------------
/sounds/score/16.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/16.mp3
--------------------------------------------------------------------------------
/sounds/score/17.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/17.mp3
--------------------------------------------------------------------------------
/sounds/score/18.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/18.mp3
--------------------------------------------------------------------------------
/sounds/score/19.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/19.mp3
--------------------------------------------------------------------------------
/sounds/score/2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/2.mp3
--------------------------------------------------------------------------------
/sounds/score/20.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/20.mp3
--------------------------------------------------------------------------------
/sounds/score/21.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/21.mp3
--------------------------------------------------------------------------------
/sounds/score/22.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/22.mp3
--------------------------------------------------------------------------------
/sounds/score/23.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/23.mp3
--------------------------------------------------------------------------------
/sounds/score/24.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/24.mp3
--------------------------------------------------------------------------------
/sounds/score/25.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/25.mp3
--------------------------------------------------------------------------------
/sounds/score/26.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/26.mp3
--------------------------------------------------------------------------------
/sounds/score/27.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/27.mp3
--------------------------------------------------------------------------------
/sounds/score/28.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/28.mp3
--------------------------------------------------------------------------------
/sounds/score/29.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/29.mp3
--------------------------------------------------------------------------------
/sounds/score/3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/3.mp3
--------------------------------------------------------------------------------
/sounds/score/30.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/30.mp3
--------------------------------------------------------------------------------
/sounds/score/31.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/31.mp3
--------------------------------------------------------------------------------
/sounds/score/32.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/32.mp3
--------------------------------------------------------------------------------
/sounds/score/33.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/33.mp3
--------------------------------------------------------------------------------
/sounds/score/34.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/34.mp3
--------------------------------------------------------------------------------
/sounds/score/35.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/35.mp3
--------------------------------------------------------------------------------
/sounds/score/36.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/36.mp3
--------------------------------------------------------------------------------
/sounds/score/37.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/37.mp3
--------------------------------------------------------------------------------
/sounds/score/38.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/38.mp3
--------------------------------------------------------------------------------
/sounds/score/39.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/39.mp3
--------------------------------------------------------------------------------
/sounds/score/4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/4.mp3
--------------------------------------------------------------------------------
/sounds/score/40.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/40.mp3
--------------------------------------------------------------------------------
/sounds/score/41.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/41.mp3
--------------------------------------------------------------------------------
/sounds/score/42.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/42.mp3
--------------------------------------------------------------------------------
/sounds/score/43.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/43.mp3
--------------------------------------------------------------------------------
/sounds/score/5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/5.mp3
--------------------------------------------------------------------------------
/sounds/score/6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/6.mp3
--------------------------------------------------------------------------------
/sounds/score/7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/7.mp3
--------------------------------------------------------------------------------
/sounds/score/8.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/8.mp3
--------------------------------------------------------------------------------
/sounds/score/9.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hahaxixi/FlappyFrog/9c8878659324ecb5bf6b513afe534c1d8e5c2879/sounds/score/9.mp3
--------------------------------------------------------------------------------