mygamesatavenue24 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/A Dark Room/A Dark Room.html +124 -0
- package/A Dark Room/A Dark Room_files/Button.js.download +131 -0
- package/A Dark Room/A Dark Room_files/audio.js.download +282 -0
- package/A Dark Room/A Dark Room_files/audioLibrary.js.download +91 -0
- package/A Dark Room/A Dark Room_files/base64.js.download +141 -0
- package/A Dark Room/A Dark Room_files/encounters.js.download +400 -0
- package/A Dark Room/A Dark Room_files/engine.js.download +942 -0
- package/A Dark Room/A Dark Room_files/events.js.download +1487 -0
- package/A Dark Room/A Dark Room_files/executioner.js.download +2344 -0
- package/A Dark Room/A Dark Room_files/fabricator.css +36 -0
- package/A Dark Room/A Dark Room_files/fabricator.js.download +244 -0
- package/A Dark Room/A Dark Room_files/global.js.download +67 -0
- package/A Dark Room/A Dark Room_files/header.js.download +34 -0
- package/A Dark Room/A Dark Room_files/jquery.color-2.1.2.min.js.download +2 -0
- package/A Dark Room/A Dark Room_files/jquery.event.move.js.download +580 -0
- package/A Dark Room/A Dark Room_files/jquery.event.swipe.js.download +130 -0
- package/A Dark Room/A Dark Room_files/jquery.min.js.download +6 -0
- package/A Dark Room/A Dark Room_files/js +977 -0
- package/A Dark Room/A Dark Room_files/langs.js.download +28 -0
- package/A Dark Room/A Dark Room_files/localization.js.download +69 -0
- package/A Dark Room/A Dark Room_files/main.css +665 -0
- package/A Dark Room/A Dark Room_files/marketing.js.download +35 -0
- package/A Dark Room/A Dark Room_files/notifications.js.download +78 -0
- package/A Dark Room/A Dark Room_files/outside(1).js.download +297 -0
- package/A Dark Room/A Dark Room_files/outside.css +60 -0
- package/A Dark Room/A Dark Room_files/outside.js.download +665 -0
- package/A Dark Room/A Dark Room_files/path.css +68 -0
- package/A Dark Room/A Dark Room_files/path.js.download +341 -0
- package/A Dark Room/A Dark Room_files/prestige.js.download +103 -0
- package/A Dark Room/A Dark Room_files/room(1).js.download +687 -0
- package/A Dark Room/A Dark Room_files/room.css +60 -0
- package/A Dark Room/A Dark Room_files/room.js.download +1259 -0
- package/A Dark Room/A Dark Room_files/scoring.js.download +34 -0
- package/A Dark Room/A Dark Room_files/setpieces.js.download +3587 -0
- package/A Dark Room/A Dark Room_files/ship.css +8 -0
- package/A Dark Room/A Dark Room_files/ship.js.download +177 -0
- package/A Dark Room/A Dark Room_files/space.css +174 -0
- package/A Dark Room/A Dark Room_files/space.js.download +631 -0
- package/A Dark Room/A Dark Room_files/state_manager.js.download +440 -0
- package/A Dark Room/A Dark Room_files/translate.js.download +86 -0
- package/A Dark Room/A Dark Room_files/vcd15cbe7772f49c399c6a5babf22c1241717689176015 +1 -0
- package/A Dark Room/A Dark Room_files/world.css +74 -0
- package/A Dark Room/A Dark Room_files/world.js.download +1109 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev.html +63 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/7B_tMO.png +0 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/LNVSQv.png +0 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/bundle.min.js.download +26 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/enlarge.svg +4 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/game.css +54 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/game.min.js.download +16 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/jquery.maskMoney.js.download +557 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/js +894 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/lYrRkq.png +0 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/lib.min.js.download +14 -0
- package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/nsRvSN.png +0 -0
- package/package.json +17 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<!-- saved from url=(0039)https://adarkroom.doublespeakgames.com/ -->
|
|
3
|
+
<html itemscope="" itemtype="https://schema.org/CreativeWork"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style>body {transition: opacity ease-in 0.2s; }
|
|
4
|
+
body[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; }
|
|
5
|
+
</style>
|
|
6
|
+
|
|
7
|
+
<!--
|
|
8
|
+
A Dark Room (v1.4)
|
|
9
|
+
==================
|
|
10
|
+
|
|
11
|
+
A minimalist text adventure by Michael Townsend and all his friends.
|
|
12
|
+
Inspired by Candy Box (http://candies.aniwey.net/)
|
|
13
|
+
Contribute on GitHub! (https://github.com/doublespeakgames/adarkroom/)
|
|
14
|
+
-->
|
|
15
|
+
<title>A Dark Room</title>
|
|
16
|
+
<meta itemprop="description" name="description" property="og:description" content="A minimalist text adventure">
|
|
17
|
+
<meta itemprop="image" property="og:image" content="img/adr.png">
|
|
18
|
+
<meta itemprop="name" property="og:title" content="A Dark Room">
|
|
19
|
+
<link rel="shortcut icon" href="https://adarkroom.doublespeakgames.com/favicon.ico">
|
|
20
|
+
<link rel="image_src" href="https://adarkroom.doublespeakgames.com/img/adr.png">
|
|
21
|
+
<script src="./A Dark Room_files/jquery.min.js.download"></script>
|
|
22
|
+
<script>
|
|
23
|
+
if(!window.jQuery) {
|
|
24
|
+
document.write('<script src="lib/jquery.min.js"><\/script>')
|
|
25
|
+
}
|
|
26
|
+
</script>
|
|
27
|
+
<script src="./A Dark Room_files/jquery.color-2.1.2.min.js.download"></script>
|
|
28
|
+
<script src="./A Dark Room_files/jquery.event.move.js.download"></script>
|
|
29
|
+
<script src="./A Dark Room_files/jquery.event.swipe.js.download"></script>
|
|
30
|
+
<script src="./A Dark Room_files/base64.js.download"></script>
|
|
31
|
+
<script src="./A Dark Room_files/translate.js.download"></script>
|
|
32
|
+
|
|
33
|
+
<script src="./A Dark Room_files/langs.js.download"></script>
|
|
34
|
+
|
|
35
|
+
<script>
|
|
36
|
+
// try to read "lang" param's from url
|
|
37
|
+
var lang = decodeURIComponent((new RegExp('[?|&]lang=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
|
|
38
|
+
// if no language requested, try to read it from local storage
|
|
39
|
+
if(!lang){
|
|
40
|
+
try {
|
|
41
|
+
lang = localStorage.lang;
|
|
42
|
+
} catch(e) {}
|
|
43
|
+
}
|
|
44
|
+
// if a language different than english requested, load all translations
|
|
45
|
+
if(lang && lang != 'en'){
|
|
46
|
+
document.write('<script src="lang/'+lang+'/strings.js"><\/script>');
|
|
47
|
+
document.write('<link rel="stylesheet" type="text/css" href="lang/'+lang+'/main.css" \/>');
|
|
48
|
+
}
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<script src="./A Dark Room_files/Button.js.download"></script>
|
|
52
|
+
<script src="./A Dark Room_files/audioLibrary.js.download"></script>
|
|
53
|
+
<script src="./A Dark Room_files/audio.js.download"></script>
|
|
54
|
+
<script src="./A Dark Room_files/engine.js.download"></script>
|
|
55
|
+
<script src="./A Dark Room_files/state_manager.js.download"></script>
|
|
56
|
+
<script src="./A Dark Room_files/header.js.download"></script>
|
|
57
|
+
<script src="./A Dark Room_files/notifications.js.download"></script>
|
|
58
|
+
<script src="./A Dark Room_files/events.js.download"></script>
|
|
59
|
+
<script src="./A Dark Room_files/room.js.download"></script>
|
|
60
|
+
<script src="./A Dark Room_files/outside.js.download"></script>
|
|
61
|
+
<script src="./A Dark Room_files/world.js.download"></script>
|
|
62
|
+
<script src="./A Dark Room_files/path.js.download"></script>
|
|
63
|
+
<script src="./A Dark Room_files/ship.js.download"></script>
|
|
64
|
+
<script src="./A Dark Room_files/space.js.download"></script>
|
|
65
|
+
<script src="./A Dark Room_files/fabricator.js.download"></script>
|
|
66
|
+
<script src="./A Dark Room_files/prestige.js.download"></script>
|
|
67
|
+
<script src="./A Dark Room_files/scoring.js.download"></script>
|
|
68
|
+
<!-- Event modules -->
|
|
69
|
+
<script src="./A Dark Room_files/global.js.download"></script>
|
|
70
|
+
<script src="./A Dark Room_files/room(1).js.download"></script>
|
|
71
|
+
<script src="./A Dark Room_files/outside(1).js.download"></script>
|
|
72
|
+
<script src="./A Dark Room_files/encounters.js.download"></script>
|
|
73
|
+
<script src="./A Dark Room_files/setpieces.js.download"></script>
|
|
74
|
+
<script src="./A Dark Room_files/marketing.js.download"></script>
|
|
75
|
+
<script src="./A Dark Room_files/executioner.js.download"></script>
|
|
76
|
+
|
|
77
|
+
<script type="text/javascript">
|
|
78
|
+
var oldIE = false;
|
|
79
|
+
</script>
|
|
80
|
+
<!--[if lt IE 9]>
|
|
81
|
+
<script type="text/javascript">oldIE = true;</script>
|
|
82
|
+
<![endif]-->
|
|
83
|
+
|
|
84
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/main.css">
|
|
85
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/room.css">
|
|
86
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/outside.css">
|
|
87
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/path.css">
|
|
88
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/world.css">
|
|
89
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/ship.css">
|
|
90
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/space.css">
|
|
91
|
+
<link rel="stylesheet" type="text/css" href="./A Dark Room_files/fabricator.css">
|
|
92
|
+
|
|
93
|
+
<script src="./A Dark Room_files/localization.js.download"></script>
|
|
94
|
+
<!-- Google tag (gtag.js) -->
|
|
95
|
+
<script async="" src="./A Dark Room_files/js"></script>
|
|
96
|
+
<script>
|
|
97
|
+
window.dataLayer = window.dataLayer || [];
|
|
98
|
+
function gtag(){dataLayer.push(arguments);}
|
|
99
|
+
gtag('js', new Date());
|
|
100
|
+
|
|
101
|
+
gtag('config', 'G-606P6J79WH');
|
|
102
|
+
</script>
|
|
103
|
+
|
|
104
|
+
</head>
|
|
105
|
+
<body style="">
|
|
106
|
+
<div id="wrapper">
|
|
107
|
+
<div id="saveNotify" style="opacity: 0;"><script>document.write(_("saved."));</script>saved.</div>
|
|
108
|
+
<div id="content">
|
|
109
|
+
<div id="outerSlider">
|
|
110
|
+
<div id="main">
|
|
111
|
+
<div id="header"><div id="location_room" class="headerButton selected">A Dark Room</div></div>
|
|
112
|
+
<div id="locationSlider" style="width: 700px; left: 0px;"><div id="roomPanel" class="location"><div id="storesContainer" style="top: 0px;"></div><div id="lightButton" class="button free" style="width: 80px;">light fire<div class="cooldown"></div><div class="tooltip bottom right"><div class="row_key">wood</div><div class="row_val">5</div></div></div><div id="stokeButton" class="button free" style="width: 80px; display: none;">stoke fire<div class="cooldown"></div><div class="tooltip bottom right"><div class="row_key">wood</div><div class="row_val">1</div></div></div></div></div></div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div id="notifications" classname="notifications"><div class="notification" style="opacity: 1;">the fire is dead.</div><div class="notification" style="opacity: 1;">the room is freezing.</div><div id="notifyGradient"></div></div></div>
|
|
116
|
+
<a class="logo" href="https://www.doublespeakgames.com/" alt="doublespeak games" target="_blank">
|
|
117
|
+
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 41.75 32.84375" class="logo-icon">
|
|
118
|
+
<path d="m 18.024533,28.5722 c 2.532365,-2.243 5.064679,-4.4861 7.596993,-6.7292 4.907813,0 9.815625,0 14.723438,0 0,-6.8136 0,-13.6272 0,-20.4408 -12.976656,0 -25.953312,0 -38.9299676,0 0,6.8136 0,13.6272 0,20.4408 3.2917905,0 6.5835811,0 9.8753716,0 -0.643311,2.2431 -1.286622,4.4861 -1.9299604,6.7292 2.5323644,-2.243 5.0646784,-4.4861 7.5969924,-6.7292 0.999066,0 1.998131,0 2.997197,0 -0.643345,2.2431 -1.286691,4.4861 -1.930064,6.7292 z" style="stroke-width:1.0;fill:none;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none"></path>
|
|
119
|
+
</svg>
|
|
120
|
+
</a>
|
|
121
|
+
<script defer="" src="./A Dark Room_files/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon="{"version":"2024.11.0","token":"d7feef7b9f4740db96403159abaa4c3b","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}" crossorigin="anonymous"></script>
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
<div class="menu"><span class="customSelect menuBtn"><span class="customSelectOptions"><ul><li>language.</li><li data-language="cs">czech</li><li data-language="de">deutsch</li><li data-language="el">ελληνικά</li><li data-language="en">english</li><li data-language="eo">esperanto</li><li data-language="es">español</li><li data-language="fr">français</li><li data-language="gl">galego</li><li data-language="id">bahasa indonesia</li><li data-language="it">italiano</li><li data-language="lv">latviešu valoda</li><li data-language="ja">日本語</li><li data-language="ko">한국어</li><li data-language="nb">norsk</li><li data-language="pl">polski</li><li data-language="lt_LT">lietuvių</li><li data-language="pt">português</li><li data-language="pt_br">português (brasil)</li><li data-language="ru">русский</li><li data-language="sv">svenska</li><li data-language="th">ไทย</li><li data-language="tr">türkçe</li><li data-language="uk">українська</li><li data-language="vi">tiếng việt</li><li data-language="zh_cn">简体中文</li><li data-language="zh_tw">繁體中文</li></ul></span></span><span class="volume menuBtn">sound off.</span><span class="appStore menuBtn">get the app.</span><span class="lightsOff menuBtn">lights off.</span><span class="hyper menuBtn">hyper.</span><span class="menuBtn">restart.</span><span class="menuBtn">share.</span><span class="menuBtn">save.</span><span class="menuBtn">github.</span></div></body></html>
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
var Button = {
|
|
2
|
+
Button: function(options) {
|
|
3
|
+
if(typeof options.cooldown == 'number') {
|
|
4
|
+
this.data_cooldown = options.cooldown;
|
|
5
|
+
}
|
|
6
|
+
this.data_remaining = 0;
|
|
7
|
+
if(typeof options.click == 'function') {
|
|
8
|
+
this.data_handler = options.click;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var el = $('<div>')
|
|
12
|
+
.attr('id', typeof(options.id) != 'undefined' ? options.id : "BTN_" + Engine.getGuid())
|
|
13
|
+
.addClass('button')
|
|
14
|
+
.text(typeof(options.text) != 'undefined' ? options.text : "button")
|
|
15
|
+
.click(function() {
|
|
16
|
+
if(!$(this).hasClass('disabled')) {
|
|
17
|
+
Button.cooldown($(this));
|
|
18
|
+
$(this).data("handler")($(this));
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
.data("handler", typeof options.click == 'function' ? options.click : function() { Engine.log("click"); })
|
|
22
|
+
.data("remaining", 0)
|
|
23
|
+
.data("cooldown", typeof options.cooldown == 'number' ? options.cooldown : 0)
|
|
24
|
+
.data('boosted', options.boosted ?? (() => false));
|
|
25
|
+
|
|
26
|
+
el.append($("<div>").addClass('cooldown'));
|
|
27
|
+
|
|
28
|
+
// waiting for expiry of residual cooldown detected in state
|
|
29
|
+
Button.cooldown(el, 'state');
|
|
30
|
+
|
|
31
|
+
if(options.cost) {
|
|
32
|
+
var ttPos = options.ttPos ? options.ttPos : "bottom right";
|
|
33
|
+
var costTooltip = $('<div>').addClass('tooltip ' + ttPos);
|
|
34
|
+
for(var k in options.cost) {
|
|
35
|
+
$("<div>").addClass('row_key').text(_(k)).appendTo(costTooltip);
|
|
36
|
+
$("<div>").addClass('row_val').text(options.cost[k]).appendTo(costTooltip);
|
|
37
|
+
}
|
|
38
|
+
if(costTooltip.children().length > 0) {
|
|
39
|
+
costTooltip.appendTo(el);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if(options.width) {
|
|
44
|
+
el.css('width', options.width);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return el;
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
saveCooldown: true,
|
|
51
|
+
|
|
52
|
+
setDisabled: function(btn, disabled) {
|
|
53
|
+
if(btn) {
|
|
54
|
+
if(!disabled && !btn.data('onCooldown')) {
|
|
55
|
+
btn.removeClass('disabled');
|
|
56
|
+
} else if(disabled) {
|
|
57
|
+
btn.addClass('disabled');
|
|
58
|
+
}
|
|
59
|
+
btn.data('disabled', disabled);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
isDisabled: function(btn) {
|
|
64
|
+
if(btn) {
|
|
65
|
+
return btn.data('disabled') === true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
cooldown: function(btn, option) {
|
|
71
|
+
var cd = btn.data("cooldown");
|
|
72
|
+
if (btn.data('boosted')()) {
|
|
73
|
+
cd /= 2;
|
|
74
|
+
}
|
|
75
|
+
var id = 'cooldown.'+ btn.attr('id');
|
|
76
|
+
if(cd > 0) {
|
|
77
|
+
if(typeof option == 'number') {
|
|
78
|
+
cd = option;
|
|
79
|
+
}
|
|
80
|
+
// param "start" takes value from cooldown time if not specified
|
|
81
|
+
var start, left;
|
|
82
|
+
switch(option){
|
|
83
|
+
// a switch will allow for several uses of cooldown function
|
|
84
|
+
case 'state':
|
|
85
|
+
if(!$SM.get(id)){
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
start = Math.min($SM.get(id), cd);
|
|
89
|
+
left = (start / cd).toFixed(4);
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
start = cd;
|
|
93
|
+
left = 1;
|
|
94
|
+
}
|
|
95
|
+
Button.clearCooldown(btn);
|
|
96
|
+
if(Button.saveCooldown){
|
|
97
|
+
$SM.set(id,start);
|
|
98
|
+
// residual value is measured in seconds
|
|
99
|
+
// saves program performance
|
|
100
|
+
btn.data('countdown', Engine.setInterval(function(){
|
|
101
|
+
$SM.set(id, $SM.get(id, true) - 0.5, true);
|
|
102
|
+
},500));
|
|
103
|
+
}
|
|
104
|
+
var time = start;
|
|
105
|
+
if (Engine.options.doubleTime){
|
|
106
|
+
time /= 2;
|
|
107
|
+
}
|
|
108
|
+
$('div.cooldown', btn).width(left * 100 +"%").animate({width: '0%'}, time * 1000, 'linear', function() {
|
|
109
|
+
Button.clearCooldown(btn, true);
|
|
110
|
+
});
|
|
111
|
+
btn.addClass('disabled');
|
|
112
|
+
btn.data('onCooldown', true);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
clearCooldown: function(btn, cooldownEnded) {
|
|
117
|
+
var ended = cooldownEnded || false;
|
|
118
|
+
if(!ended){
|
|
119
|
+
$('div.cooldown', btn).stop(true, true);
|
|
120
|
+
}
|
|
121
|
+
btn.data('onCooldown', false);
|
|
122
|
+
if(btn.data('countdown')){
|
|
123
|
+
window.clearInterval(btn.data('countdown'));
|
|
124
|
+
$SM.remove('cooldown.'+ btn.attr('id'));
|
|
125
|
+
btn.removeData('countdown');
|
|
126
|
+
}
|
|
127
|
+
if(!btn.data('disabled')) {
|
|
128
|
+
btn.removeClass('disabled');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module that takes care of audio playback
|
|
3
|
+
*/
|
|
4
|
+
var AudioEngine = {
|
|
5
|
+
FADE_TIME: 1,
|
|
6
|
+
AUDIO_BUFFER_CACHE: {},
|
|
7
|
+
_audioContext: null,
|
|
8
|
+
_master: null,
|
|
9
|
+
_currentBackgroundMusic: null,
|
|
10
|
+
_currentEventAudio: null,
|
|
11
|
+
_currentSoundEffectAudio: null,
|
|
12
|
+
_initialized: false,
|
|
13
|
+
init: function () {
|
|
14
|
+
AudioEngine._initAudioContext();
|
|
15
|
+
// AudioEngine._preloadAudio(); // removed to save bandwidth
|
|
16
|
+
AudioEngine._initialized = true;
|
|
17
|
+
},
|
|
18
|
+
_preloadAudio: function () {
|
|
19
|
+
// start loading music and events early
|
|
20
|
+
// ** could be used later if we specify a better set of
|
|
21
|
+
// audio files to preload -- i.e. we probably don't need to load
|
|
22
|
+
// the later villages or events audio, and esp. not the ending
|
|
23
|
+
for (var key in AudioLibrary) {
|
|
24
|
+
if (
|
|
25
|
+
key.toString().indexOf('MUSIC_') > -1 ||
|
|
26
|
+
key.toString().indexOf('EVENT_') > -1) {
|
|
27
|
+
AudioEngine.loadAudioFile(AudioLibrary[key]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
_initAudioContext: function () {
|
|
32
|
+
AudioEngine._audioContext = new (window.AudioContext || window.webkitAudioContext);
|
|
33
|
+
AudioEngine._createMasterChannel();
|
|
34
|
+
},
|
|
35
|
+
_createMasterChannel: function () {
|
|
36
|
+
// create master
|
|
37
|
+
AudioEngine._master = AudioEngine._audioContext.createGain();
|
|
38
|
+
AudioEngine._master.gain.setValueAtTime(1.0, AudioEngine._audioContext.currentTime);
|
|
39
|
+
AudioEngine._master.connect(AudioEngine._audioContext.destination);
|
|
40
|
+
},
|
|
41
|
+
_getMissingAudioBuffer: function () {
|
|
42
|
+
// plays beeping sound to indicate missing audio
|
|
43
|
+
var buffer = AudioEngine._audioContext.createBuffer(
|
|
44
|
+
1,
|
|
45
|
+
AudioEngine._audioContext.sampleRate,
|
|
46
|
+
AudioEngine._audioContext.sampleRate
|
|
47
|
+
);
|
|
48
|
+
// Fill the buffer
|
|
49
|
+
var bufferData = buffer.getChannelData(0);
|
|
50
|
+
for (var i = 0; i < buffer.length / 2; i++) {
|
|
51
|
+
bufferData[i] = Math.sin(i * 0.05) / 4; // max .25 gain value
|
|
52
|
+
}
|
|
53
|
+
return buffer;
|
|
54
|
+
},
|
|
55
|
+
_playSound: function (buffer) {
|
|
56
|
+
if (AudioEngine._currentSoundEffectAudio &&
|
|
57
|
+
AudioEngine._currentSoundEffectAudio.source.buffer == buffer) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var source = AudioEngine._audioContext.createBufferSource();
|
|
62
|
+
source.buffer = buffer;
|
|
63
|
+
source.onended = function(event) {
|
|
64
|
+
// dereference current sound effect when finished
|
|
65
|
+
if (AudioEngine._currentSoundEffectAudio &&
|
|
66
|
+
AudioEngine._currentSoundEffectAudio.source.buffer == buffer) {
|
|
67
|
+
AudioEngine._currentSoundEffectAudio = null;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
source.connect(AudioEngine._master);
|
|
72
|
+
source.start();
|
|
73
|
+
|
|
74
|
+
AudioEngine._currentSoundEffectAudio = {
|
|
75
|
+
source: source
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
_playBackgroundMusic: function (buffer) {
|
|
79
|
+
var source = AudioEngine._audioContext.createBufferSource();
|
|
80
|
+
source.buffer = buffer;
|
|
81
|
+
source.loop = true;
|
|
82
|
+
|
|
83
|
+
var envelope = AudioEngine._audioContext.createGain();
|
|
84
|
+
envelope.gain.setValueAtTime(0.0, AudioEngine._audioContext.currentTime);
|
|
85
|
+
|
|
86
|
+
var fadeTime = AudioEngine._audioContext.currentTime + AudioEngine.FADE_TIME;
|
|
87
|
+
|
|
88
|
+
// fade out current background music
|
|
89
|
+
if (AudioEngine._currentBackgroundMusic &&
|
|
90
|
+
AudioEngine._currentBackgroundMusic.source &&
|
|
91
|
+
AudioEngine._currentBackgroundMusic.source.playbackState !== 0) {
|
|
92
|
+
var currentBackgroundGainValue = AudioEngine._currentBackgroundMusic.envelope.gain.value;
|
|
93
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.cancelScheduledValues(AudioEngine._audioContext.currentTime);
|
|
94
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.setValueAtTime(currentBackgroundGainValue, AudioEngine._audioContext.currentTime);
|
|
95
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.linearRampToValueAtTime(0.0, fadeTime);
|
|
96
|
+
AudioEngine._currentBackgroundMusic.source.stop(fadeTime + 0.3); // make sure fade has completed
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// fade in new backgorund music
|
|
100
|
+
source.connect(envelope);
|
|
101
|
+
envelope.connect(AudioEngine._master);
|
|
102
|
+
source.start();
|
|
103
|
+
envelope.gain.linearRampToValueAtTime(1.0, fadeTime);
|
|
104
|
+
|
|
105
|
+
// update current background music
|
|
106
|
+
AudioEngine._currentBackgroundMusic = {
|
|
107
|
+
source: source,
|
|
108
|
+
envelope: envelope
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
_playEventMusic: function (buffer) {
|
|
112
|
+
var source = AudioEngine._audioContext.createBufferSource();
|
|
113
|
+
source.buffer = buffer;
|
|
114
|
+
source.loop = true;
|
|
115
|
+
|
|
116
|
+
var envelope = AudioEngine._audioContext.createGain();
|
|
117
|
+
envelope.gain.setValueAtTime(0.0, AudioEngine._audioContext.currentTime);
|
|
118
|
+
|
|
119
|
+
var fadeTime = AudioEngine._audioContext.currentTime + AudioEngine.FADE_TIME * 2;
|
|
120
|
+
|
|
121
|
+
// turn down current background music
|
|
122
|
+
if (AudioEngine._currentBackgroundMusic != null) {
|
|
123
|
+
var currentBackgroundGainValue = AudioEngine._currentBackgroundMusic.envelope.gain.value;
|
|
124
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.cancelScheduledValues(AudioEngine._audioContext.currentTime);
|
|
125
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.setValueAtTime(currentBackgroundGainValue, AudioEngine._audioContext.currentTime);
|
|
126
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.linearRampToValueAtTime(0.2, fadeTime);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// fade in event music
|
|
130
|
+
source.connect(envelope);
|
|
131
|
+
envelope.connect(AudioEngine._master);
|
|
132
|
+
source.start();
|
|
133
|
+
envelope.gain.linearRampToValueAtTime(1.0, fadeTime);
|
|
134
|
+
|
|
135
|
+
// update reference
|
|
136
|
+
AudioEngine._currentEventAudio = {
|
|
137
|
+
source: source,
|
|
138
|
+
envelope: envelope
|
|
139
|
+
};
|
|
140
|
+
},
|
|
141
|
+
_stopEventMusic: function () {
|
|
142
|
+
var fadeTime = AudioEngine._audioContext.currentTime + AudioEngine.FADE_TIME * 2;
|
|
143
|
+
|
|
144
|
+
// fade out event music and stop
|
|
145
|
+
if (AudioEngine._currentEventAudio &&
|
|
146
|
+
AudioEngine._currentEventAudio.source &&
|
|
147
|
+
AudioEngine._currentEventAudio.source.buffer) {
|
|
148
|
+
var currentEventGainValue = AudioEngine._currentEventAudio.envelope.gain.value;
|
|
149
|
+
AudioEngine._currentEventAudio.envelope.gain.cancelScheduledValues(AudioEngine._audioContext.currentTime);
|
|
150
|
+
AudioEngine._currentEventAudio.envelope.gain.setValueAtTime(currentEventGainValue, AudioEngine._audioContext.currentTime);
|
|
151
|
+
AudioEngine._currentEventAudio.envelope.gain.linearRampToValueAtTime(0.0, fadeTime);
|
|
152
|
+
AudioEngine._currentEventAudio.source.stop(fadeTime + 1); // make sure fade has completed
|
|
153
|
+
AudioEngine._currentEventAudio = null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// turn up background music
|
|
157
|
+
if (AudioEngine._currentBackgroundMusic) {
|
|
158
|
+
var currentBackgroundGainValue = AudioEngine._currentBackgroundMusic.envelope.gain.value;
|
|
159
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.cancelScheduledValues(AudioEngine._audioContext.currentTime);
|
|
160
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.setValueAtTime(currentBackgroundGainValue, AudioEngine._audioContext.currentTime);
|
|
161
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.linearRampToValueAtTime(1.0, fadeTime);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
isAudioContextRunning: function () {
|
|
165
|
+
return AudioEngine._audioContext.state !== 'suspended';
|
|
166
|
+
},
|
|
167
|
+
tryResumingAudioContext: function() {
|
|
168
|
+
if (AudioEngine._audioContext.state === 'suspended') {
|
|
169
|
+
AudioEngine._audioContext.resume();
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
playBackgroundMusic: function (src) {
|
|
173
|
+
if (!AudioEngine._initialized) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
AudioEngine.loadAudioFile(src)
|
|
177
|
+
.then(function (buffer) {
|
|
178
|
+
AudioEngine._playBackgroundMusic(buffer);
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
playEventMusic: function (src) {
|
|
182
|
+
if (!AudioEngine._initialized) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
AudioEngine.loadAudioFile(src)
|
|
186
|
+
.then(function (buffer) {
|
|
187
|
+
AudioEngine._playEventMusic(buffer);
|
|
188
|
+
});
|
|
189
|
+
},
|
|
190
|
+
stopEventMusic: function () {
|
|
191
|
+
if (!AudioEngine._initialized) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
AudioEngine._stopEventMusic();
|
|
195
|
+
},
|
|
196
|
+
playSound: function (src) {
|
|
197
|
+
if (!AudioEngine._initialized) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
AudioEngine.loadAudioFile(src)
|
|
201
|
+
.then(function (buffer) {
|
|
202
|
+
AudioEngine._playSound(buffer);
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
loadAudioFile: function (src) {
|
|
206
|
+
if (src.indexOf('http') === -1) {
|
|
207
|
+
src = window.location + src;
|
|
208
|
+
}
|
|
209
|
+
if (AudioEngine.AUDIO_BUFFER_CACHE[src]) {
|
|
210
|
+
return new Promise(function (resolve, reject) {
|
|
211
|
+
resolve(AudioEngine.AUDIO_BUFFER_CACHE[src]);
|
|
212
|
+
});
|
|
213
|
+
} else {
|
|
214
|
+
var request = new Request(src);
|
|
215
|
+
return fetch(request).then(function (response) {
|
|
216
|
+
return response.arrayBuffer();
|
|
217
|
+
}).then(function (buffer) {
|
|
218
|
+
if (buffer.byteLength === 0) {
|
|
219
|
+
console.error('cannot load audio from ' + src);
|
|
220
|
+
return AudioEngine._getMissingAudioBuffer();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
var decodeAudioDataPromise = AudioEngine._audioContext.decodeAudioData(buffer, function (decodedData) {
|
|
224
|
+
AudioEngine.AUDIO_BUFFER_CACHE[src] = decodedData;
|
|
225
|
+
return AudioEngine.AUDIO_BUFFER_CACHE[src];
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Safari WebAudio does not return a promise based API for
|
|
229
|
+
// decodeAudioData, so we need to fake it if we want to play
|
|
230
|
+
// audio immediately on first fetch
|
|
231
|
+
if (decodeAudioDataPromise) {
|
|
232
|
+
return decodeAudioDataPromise;
|
|
233
|
+
} else {
|
|
234
|
+
return new Promise(function (resolve, reject) {
|
|
235
|
+
var fakePromiseId = setInterval(function() {
|
|
236
|
+
if (AudioEngine.AUDIO_BUFFER_CACHE[src]) {
|
|
237
|
+
resolve(AudioEngine.AUDIO_BUFFER_CACHE[src]);
|
|
238
|
+
clearInterval(fakePromiseId);
|
|
239
|
+
}
|
|
240
|
+
}, 20);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
setBackgroundMusicVolume: function (volume, s) {
|
|
247
|
+
if (AudioEngine._master == null) return; // master may not be ready yet
|
|
248
|
+
if (volume === undefined) {
|
|
249
|
+
volume = 1.0;
|
|
250
|
+
}
|
|
251
|
+
if (s === undefined) {
|
|
252
|
+
s = 1.0;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// cancel any current schedules and then ramp
|
|
256
|
+
var currentBackgroundGainValue = AudioEngine._currentBackgroundMusic.envelope.gain.value;
|
|
257
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.cancelScheduledValues(AudioEngine._audioContext.currentTime);
|
|
258
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.setValueAtTime(currentBackgroundGainValue, AudioEngine._audioContext.currentTime);
|
|
259
|
+
AudioEngine._currentBackgroundMusic.envelope.gain.linearRampToValueAtTime(
|
|
260
|
+
volume,
|
|
261
|
+
AudioEngine._audioContext.currentTime + s
|
|
262
|
+
);
|
|
263
|
+
},
|
|
264
|
+
setMasterVolume: function (volume, s) {
|
|
265
|
+
if (AudioEngine._master == null) return; // master may not be ready yet
|
|
266
|
+
if (volume === undefined) {
|
|
267
|
+
volume = 1.0;
|
|
268
|
+
}
|
|
269
|
+
if (s === undefined) {
|
|
270
|
+
s = 1.0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// cancel any current schedules and then ramp
|
|
274
|
+
var currentGainValue = AudioEngine._master.gain.value;
|
|
275
|
+
AudioEngine._master.gain.cancelScheduledValues(AudioEngine._audioContext.currentTime);
|
|
276
|
+
AudioEngine._master.gain.setValueAtTime(currentGainValue, AudioEngine._audioContext.currentTime);
|
|
277
|
+
AudioEngine._master.gain.linearRampToValueAtTime(
|
|
278
|
+
volume,
|
|
279
|
+
AudioEngine._audioContext.currentTime + s
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module that defines all audio files
|
|
3
|
+
*/
|
|
4
|
+
var AudioLibrary = {
|
|
5
|
+
MUSIC_DUSTY_PATH: 'audio/dusty-path.flac',
|
|
6
|
+
MUSIC_SILENT_FOREST: 'audio/silent-forest.flac',
|
|
7
|
+
MUSIC_LONELY_HUT: 'audio/lonely-hut.flac',
|
|
8
|
+
MUSIC_TINY_VILLAGE: 'audio/tiny-village.flac',
|
|
9
|
+
MUSIC_MODEST_VILLAGE: 'audio/modest-village.flac',
|
|
10
|
+
MUSIC_LARGE_VILLAGE: 'audio/large-village.flac',
|
|
11
|
+
MUSIC_RAUCOUS_VILLAGE: 'audio/raucous-village.flac',
|
|
12
|
+
MUSIC_FIRE_DEAD: 'audio/fire-dead.flac',
|
|
13
|
+
MUSIC_FIRE_SMOLDERING: 'audio/fire-smoldering.flac',
|
|
14
|
+
MUSIC_FIRE_FLICKERING: 'audio/fire-flickering.flac',
|
|
15
|
+
MUSIC_FIRE_BURNING: 'audio/fire-burning.flac',
|
|
16
|
+
MUSIC_FIRE_ROARING: 'audio/fire-roaring.flac',
|
|
17
|
+
MUSIC_WORLD: 'audio/world.flac',
|
|
18
|
+
MUSIC_SPACE: 'audio/space.flac',
|
|
19
|
+
MUSIC_ENDING: 'audio/ending.flac',
|
|
20
|
+
MUSIC_SHIP: 'audio/ship.flac',
|
|
21
|
+
EVENT_NOMAD: 'audio/event-nomad.flac',
|
|
22
|
+
EVENT_NOISES_OUTSIDE: 'audio/event-noises-outside.flac',
|
|
23
|
+
EVENT_NOISES_INSIDE: 'audio/event-noises-inside.flac',
|
|
24
|
+
EVENT_BEGGAR: 'audio/event-beggar.flac',
|
|
25
|
+
EVENT_SHADY_BUILDER: 'audio/event-shady-builder.flac',
|
|
26
|
+
EVENT_MYSTERIOUS_WANDERER: 'audio/event-mysterious-wanderer.flac',
|
|
27
|
+
EVENT_SCOUT: 'audio/event-scout.flac',
|
|
28
|
+
EVENT_WANDERING_MASTER: 'audio/event-wandering-master.flac',
|
|
29
|
+
EVENT_SICK_MAN: 'audio/event-sick-man.flac',
|
|
30
|
+
EVENT_RUINED_TRAP: 'audio/event-ruined-trap.flac',
|
|
31
|
+
EVENT_HUT_FIRE: 'audio/event-hut-fire.flac',
|
|
32
|
+
EVENT_SICKNESS: 'audio/event-sickness.flac',
|
|
33
|
+
EVENT_PLAGUE: 'audio/event-plague.flac',
|
|
34
|
+
EVENT_BEAST_ATTACK: 'audio/event-beast-attack.flac',
|
|
35
|
+
EVENT_SOLDIER_ATTACK: 'audio/event-soldier-attack.flac',
|
|
36
|
+
EVENT_THIEF: 'audio/event-thief.flac',
|
|
37
|
+
LANDMARK_FRIENDLY_OUTPOST: 'audio/landmark-friendly-outpost.flac',
|
|
38
|
+
LANDMARK_SWAMP: 'audio/landmark-swamp.flac',
|
|
39
|
+
LANDMARK_CAVE: 'audio/landmark-cave.flac',
|
|
40
|
+
LANDMARK_TOWN: 'audio/landmark-town.flac',
|
|
41
|
+
LANDMARK_CITY: 'audio/landmark-city.flac',
|
|
42
|
+
LANDMARK_HOUSE: 'audio/landmark-house.flac',
|
|
43
|
+
LANDMARK_BATTLEFIELD: 'audio/landmark-battlefield.flac',
|
|
44
|
+
LANDMARK_BOREHOLE: 'audio/landmark-borehole.flac',
|
|
45
|
+
LANDMARK_CRASHED_SHIP: 'audio/landmark-crashed-ship.flac',
|
|
46
|
+
LANDMARK_SULPHUR_MINE: 'audio/landmark-sulphurmine.flac',
|
|
47
|
+
LANDMARK_COAL_MINE: 'audio/landmark-coalmine.flac',
|
|
48
|
+
LANDMARK_IRON_MINE: 'audio/landmark-ironmine.flac',
|
|
49
|
+
LANDMARK_DESTROYED_VILLAGE: 'audio/landmark-destroyed-village.flac',
|
|
50
|
+
ENCOUNTER_TIER_1: 'audio/encounter-tier-1.flac',
|
|
51
|
+
ENCOUNTER_TIER_2: 'audio/encounter-tier-2.flac',
|
|
52
|
+
ENCOUNTER_TIER_3: 'audio/encounter-tier-3.flac',
|
|
53
|
+
LIGHT_FIRE: 'audio/light-fire.flac',
|
|
54
|
+
STOKE_FIRE: 'audio/stoke-fire.flac',
|
|
55
|
+
BUILD: 'audio/build.flac',
|
|
56
|
+
CRAFT: 'audio/craft.flac',
|
|
57
|
+
BUY: 'audio/buy.flac',
|
|
58
|
+
GATHER_WOOD: 'audio/gather-wood.flac',
|
|
59
|
+
CHECK_TRAPS: 'audio/check-traps.flac',
|
|
60
|
+
EMBARK: 'audio/embark.flac',
|
|
61
|
+
FOOTSTEPS_1: 'audio/footsteps-1.flac',
|
|
62
|
+
FOOTSTEPS_2: 'audio/footsteps-2.flac',
|
|
63
|
+
FOOTSTEPS_3: 'audio/footsteps-3.flac',
|
|
64
|
+
FOOTSTEPS_4: 'audio/footsteps-4.flac',
|
|
65
|
+
FOOTSTEPS_5: 'audio/footsteps-5.flac',
|
|
66
|
+
FOOTSTEPS_6: 'audio/footsteps-6.flac',
|
|
67
|
+
EAT_MEAT: 'audio/eat-meat.flac',
|
|
68
|
+
USE_MEDS: 'audio/use-meds.flac',
|
|
69
|
+
WEAPON_UNARMED_1: 'audio/weapon-unarmed-1.flac',
|
|
70
|
+
WEAPON_UNARMED_2: 'audio/weapon-unarmed-2.flac',
|
|
71
|
+
WEAPON_UNARMED_3: 'audio/weapon-unarmed-3.flac',
|
|
72
|
+
WEAPON_MELEE_1: 'audio/weapon-melee-1.flac',
|
|
73
|
+
WEAPON_MELEE_2: 'audio/weapon-melee-2.flac',
|
|
74
|
+
WEAPON_MELEE_3: 'audio/weapon-melee-3.flac',
|
|
75
|
+
WEAPON_RANGED_1: 'audio/weapon-ranged-1.flac',
|
|
76
|
+
WEAPON_RANGED_2: 'audio/weapon-ranged-2.flac',
|
|
77
|
+
WEAPON_RANGED_3: 'audio/weapon-ranged-3.flac',
|
|
78
|
+
DEATH: 'audio/death.flac',
|
|
79
|
+
REINFORCE_HULL: 'audio/reinforce-hull.flac',
|
|
80
|
+
UPGRADE_ENGINE: 'audio/upgrade-engine.flac',
|
|
81
|
+
LIFT_OFF: 'audio/lift-off.flac',
|
|
82
|
+
ASTEROID_HIT_1: 'audio/asteroid-hit-1.flac',
|
|
83
|
+
ASTEROID_HIT_2: 'audio/asteroid-hit-2.flac',
|
|
84
|
+
ASTEROID_HIT_3: 'audio/asteroid-hit-3.flac',
|
|
85
|
+
ASTEROID_HIT_4: 'audio/asteroid-hit-4.flac',
|
|
86
|
+
ASTEROID_HIT_5: 'audio/asteroid-hit-5.flac',
|
|
87
|
+
ASTEROID_HIT_6: 'audio/asteroid-hit-6.flac',
|
|
88
|
+
ASTEROID_HIT_7: 'audio/asteroid-hit-7.flac',
|
|
89
|
+
ASTEROID_HIT_8: 'audio/asteroid-hit-8.flac',
|
|
90
|
+
CRASH: 'audio/crash.flac',
|
|
91
|
+
};
|