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.
Files changed (56) hide show
  1. package/A Dark Room/A Dark Room.html +124 -0
  2. package/A Dark Room/A Dark Room_files/Button.js.download +131 -0
  3. package/A Dark Room/A Dark Room_files/audio.js.download +282 -0
  4. package/A Dark Room/A Dark Room_files/audioLibrary.js.download +91 -0
  5. package/A Dark Room/A Dark Room_files/base64.js.download +141 -0
  6. package/A Dark Room/A Dark Room_files/encounters.js.download +400 -0
  7. package/A Dark Room/A Dark Room_files/engine.js.download +942 -0
  8. package/A Dark Room/A Dark Room_files/events.js.download +1487 -0
  9. package/A Dark Room/A Dark Room_files/executioner.js.download +2344 -0
  10. package/A Dark Room/A Dark Room_files/fabricator.css +36 -0
  11. package/A Dark Room/A Dark Room_files/fabricator.js.download +244 -0
  12. package/A Dark Room/A Dark Room_files/global.js.download +67 -0
  13. package/A Dark Room/A Dark Room_files/header.js.download +34 -0
  14. package/A Dark Room/A Dark Room_files/jquery.color-2.1.2.min.js.download +2 -0
  15. package/A Dark Room/A Dark Room_files/jquery.event.move.js.download +580 -0
  16. package/A Dark Room/A Dark Room_files/jquery.event.swipe.js.download +130 -0
  17. package/A Dark Room/A Dark Room_files/jquery.min.js.download +6 -0
  18. package/A Dark Room/A Dark Room_files/js +977 -0
  19. package/A Dark Room/A Dark Room_files/langs.js.download +28 -0
  20. package/A Dark Room/A Dark Room_files/localization.js.download +69 -0
  21. package/A Dark Room/A Dark Room_files/main.css +665 -0
  22. package/A Dark Room/A Dark Room_files/marketing.js.download +35 -0
  23. package/A Dark Room/A Dark Room_files/notifications.js.download +78 -0
  24. package/A Dark Room/A Dark Room_files/outside(1).js.download +297 -0
  25. package/A Dark Room/A Dark Room_files/outside.css +60 -0
  26. package/A Dark Room/A Dark Room_files/outside.js.download +665 -0
  27. package/A Dark Room/A Dark Room_files/path.css +68 -0
  28. package/A Dark Room/A Dark Room_files/path.js.download +341 -0
  29. package/A Dark Room/A Dark Room_files/prestige.js.download +103 -0
  30. package/A Dark Room/A Dark Room_files/room(1).js.download +687 -0
  31. package/A Dark Room/A Dark Room_files/room.css +60 -0
  32. package/A Dark Room/A Dark Room_files/room.js.download +1259 -0
  33. package/A Dark Room/A Dark Room_files/scoring.js.download +34 -0
  34. package/A Dark Room/A Dark Room_files/setpieces.js.download +3587 -0
  35. package/A Dark Room/A Dark Room_files/ship.css +8 -0
  36. package/A Dark Room/A Dark Room_files/ship.js.download +177 -0
  37. package/A Dark Room/A Dark Room_files/space.css +174 -0
  38. package/A Dark Room/A Dark Room_files/space.js.download +631 -0
  39. package/A Dark Room/A Dark Room_files/state_manager.js.download +440 -0
  40. package/A Dark Room/A Dark Room_files/translate.js.download +86 -0
  41. package/A Dark Room/A Dark Room_files/vcd15cbe7772f49c399c6a5babf22c1241717689176015 +1 -0
  42. package/A Dark Room/A Dark Room_files/world.css +74 -0
  43. package/A Dark Room/A Dark Room_files/world.js.download +1109 -0
  44. package/A Dungeon Miner/A Dungeon Miner by PxlDev.html +63 -0
  45. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/7B_tMO.png +0 -0
  46. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/LNVSQv.png +0 -0
  47. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/bundle.min.js.download +26 -0
  48. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/enlarge.svg +4 -0
  49. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/game.css +54 -0
  50. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/game.min.js.download +16 -0
  51. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/jquery.maskMoney.js.download +557 -0
  52. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/js +894 -0
  53. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/lYrRkq.png +0 -0
  54. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/lib.min.js.download +14 -0
  55. package/A Dungeon Miner/A Dungeon Miner by PxlDev_files/nsRvSN.png +0 -0
  56. 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="{&quot;version&quot;:&quot;2024.11.0&quot;,&quot;token&quot;:&quot;d7feef7b9f4740db96403159abaa4c3b&quot;,&quot;r&quot;:1,&quot;server_timing&quot;:{&quot;name&quot;:{&quot;cfCacheStatus&quot;:true,&quot;cfEdge&quot;:true,&quot;cfExtPri&quot;:true,&quot;cfL4&quot;:true,&quot;cfOrigin&quot;:true,&quot;cfSpeedBrain&quot;:true},&quot;location_startswith&quot;: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
+ };