diff --git a/.gitignore b/.gitignore index 05e5d57..336a18b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,7 @@ *.o *.lo *.la -/docs/*.js -/docs/*.js.mem -/docs/*.wasm +/out /config.h /config.log /config.status @@ -15,4 +13,3 @@ Makefile .deps/ .libs/ -node_modules/ diff --git a/Makefile.emscripten b/Makefile.emscripten index 929a3d4..ad90e20 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -14,12 +14,15 @@ LFLAGS += -s EXPORTED_FUNCTIONS="['_main','_ags_setAntialiasedStringMode', '_ald WASMFLAGS := -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s "BINARYEN_TRAP_MODE='allow'" ASMJSFLAGS := -s TOTAL_MEMORY=100663296 -all: docs/xsystem35.js docs/xsystem35.asm.js +all: out/xsystem35.js out/xsystem35.asm.js -docs/xsystem35.js: emterpretify_whitelist src/xsystem35 +out: + mkdir out + +out/xsystem35.js: emterpretify_whitelist src/xsystem35 out $(CC) xsystem35.bc $(LFLAGS) $(WASMFLAGS) @emterpretify_whitelist -o $@ -docs/xsystem35.asm.js: emterpretify_whitelist src/xsystem35 +out/xsystem35.asm.js: emterpretify_whitelist src/xsystem35 out $(CC) xsystem35.bc $(LFLAGS) $(ASMJSFLAGS) @emterpretify_whitelist -o $@ emterpretify_whitelist: diff --git a/docs/fonts/MTLc3m.ttf b/docs/fonts/MTLc3m.ttf deleted file mode 100644 index 86bdcc7..0000000 Binary files a/docs/fonts/MTLc3m.ttf and /dev/null differ diff --git a/docs/fonts/NOTICE b/docs/fonts/NOTICE deleted file mode 100644 index c5b1efa..0000000 --- a/docs/fonts/NOTICE +++ /dev/null @@ -1,190 +0,0 @@ - - Copyright (c) 2005-2008, The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/docs/help.html b/docs/help.html deleted file mode 100644 index 7cccd47..0000000 --- a/docs/help.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - 鬼畜王 on Web ヘルプ - - - - -
- -
-
-
- このサイトについて -

アリスソフトのゲームエンジン System3.5 の有志によるフリー実装である xsystem35 を JavaScript / WebAssembly に移植して、配布フリー宣言 に基づいて配布されているゲームのいくつかをブラウザ上で遊べるようにしたものです。素晴らしいゲームがせっかくフリーで提供されているのに、遊ぶためのハードルが高い(仮想CDソフトが必要だったり)という状況を改善できれば、という試みです。

-

以下の環境で動きます。

- -
- -
- ゲームを起動する -

このサイト自体は実行環境のみ提供するもので、ゲームのCDイメージを読み込んで動作します。

-
    -
  1. 以下のどちらかのサイトで、鬼畜王ランスのCDイメージをダウンロードします。 - -
  2. -
  3. ダウンロードしたファイルはRAR形式の圧縮ファイルなので、展開してCD-ROMイメージを取り出します。Windowsなら LhaPlus、Macなら The Unarchiver で展開できます。ChromeOSは標準機能でRARを展開できます。
  4. -
  5. 展開したフォルダにある KICHIKUOU.img と KICHIKUOU.cue (または DISC.img と DISC.cue) を、鬼畜王 on Web のページにドラッグ&ドロップするか、ページにある「ファイルを選択」ボタンを押して選択します。
  6. -
  7. ゲームが始まります。セーブデータはブラウザ内に保存されるので、次回ページを開いたときは再度CDイメージを読み込ませればセーブしたところから再開できます。
  8. -
-
- -
- 操作方法 -

スマートフォン / タブレットでは2本指でタッチすると右クリック扱いになります。

-
- -
- 設定 -

画面上部の歯車アイコンをクリックすると設定ウィンドウが表示されます。

-
表示
-
-
拡大率
-
ゲーム画面の拡大率を設定します。「自動」にするとウィンドウの大きさに合わせます。
-
拡大時に補間しない
-
Google ChromeとFirefoxでのみ有効です。通常は色を補間してなめらかに画面を拡大しますが、これをオンにすると単純に拡大します。ドット絵の感じを楽しみたいとき有効にするといいでしょう。
-
文字をなめらかに表示する
-
アンチエイリアスをかけて文字表示を綺麗にします。設定を変えた場合、すでに表示されている文字はそのままで次回の文字描画から反映されます。
-
-
セーブデータ
-

ブラウザ内に保存されているセーブデータをZIPファイルに保存したり、ZIPファイルから復元できます。セーブデータをバックアップしたり、他のPCに移行する場合に使います。

-
- -
- バグ・制限 -
iOS
-

iOSではiCloud Driveに展開済みのCDイメージを入れておけばSafariから読み込んで遊べますが、以下のような制限があります。

- -
- -
- さいごに -

ソースコードは以下にあります。 - https://github.com/kichikuou/xsystem35-sdl2/

-

バグ報告、要望、質問、連絡、苦情などは以下のメールアドレスまでお願いします。 - KichikuouChrome@gmail.com

-
-
- diff --git a/docs/style.css b/docs/style.css deleted file mode 100644 index 5ccbf8b..0000000 --- a/docs/style.css +++ /dev/null @@ -1,208 +0,0 @@ -body { - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - display: flex; - flex-direction: column; -} - -header { - background-color: rgb(68,68,68); - color: #ccc; -} - -@media all and (max-height: 480px) { - #toolbar-handler { - position: absolute; - right: 0px; - top: 0px; - width: 40px; - height: 10px; - background-color: rgba(68,68,68,0.7); - } - - .toolbar-handler-icon { - width: 5px; - height: 5px; - margin: auto; - border: solid #ccc; - border-width: 2px 2px 0 0; - -webkit-transform: rotate(135deg); - transform: rotate(135deg); - } - - header.closeable { - position: absolute; - top: 0; - left: 0; - right: 0; - transition: top 0.4s ease; - background-color: rgba(68,68,68,0.85); - } - - header.closeable.closed { - top: -42px; - } -} - -@media not all and (max-height: 480px) { - #toolbar-handler { - display: none; - } - - #toolbar-close-button { - display: none; - } -} - -.navbar { - max-width: 640px; - margin: 0 auto; - padding: 0.5rem 0; - flex-wrap: nowrap; -} - -.navbar .navbar-primary { - flex: 1; - min-width: 0; -} - -.navbar-brand { - color: #ccc; -} - -.navbar .navbar-section { - flex: 0; -} - -.navbar .btn-link { - font-size: large; - color: #ccc; -} - -.navbar .btn.btn-link:focus, -.navbar .btn.btn-link:hover, -.navbar .btn.btn-link:active, -.navbar .btn.btn-link.active { - color: #eee; -} - -.before-game-start .hidden-until-game-start { - display: none; -} - -.contents { - flex: 1; - display: flex; -} - -#loader { - max-width: 640px; - margin: 2ex auto 0; -} - -#loader ul { - list-style-type: none; -} -#loader li { - color: #5764c6; -} -#loader li:before { - font-family: FontAwesome; - content: "\f15b"; - padding-right: 0.5em; -} -#loader li.notready { - color: #808080; -} -#loader li.notready:after { - content: " (未選択)"; -} - -#unsupported { - max-width: 640px; - margin: 2ex auto 0; - color: red; -} - -.bgblack-fade { - background-color: black; - transition-property: background-color; - transition-duration: 1s; - transition-timing-function: linear; -} - -#xsystem35 { - margin: auto; -} - -#xsystem35.fit { - margin: 0; - flex: 1; -} - -/* the canvas *must not* have any border or padding, or mouse coords will be wrong */ -canvas.emscripten { - border: 0px none; -} - -@media all and (min-aspect-ratio: 640/400) { - .fit canvas.emscripten { - height: 100%; - max-height: 100vh; - margin: auto; - display: block; - } -} -@media not all and (min-aspect-ratio: 640/400) { - #xsystem35.fit { - display: flex; - align-items: center; - } - .fit canvas.emscripten { - width: 100%; - } -} - -.pixelated { - image-rendering: pixelated; - image-rendering: -moz-crisp-edges; -} - -#volume-control { - float: right; - white-space: nowrap; -} - -#volume-control-icon { - font-size: 20px; - width: 26px; - padding: 5px; - vertical-align: middle; -} - -#volume-control-slider { - width: 60px; - height: 30px; - vertical-align: middle; -} - -.settings section > div { - padding-left: 2rem; -} - -.toast-container { - position: fixed; - bottom: 30px; - left: 30px; - width: 400px; - z-index: 500; -} - -.toast { - -webkit-animation: slide-down .2s ease 1; - animation: slide-down .2s ease 1; - margin: 5px; -} diff --git a/docs/xsystem35.html b/docs/xsystem35.html deleted file mode 100644 index 1aa396d..0000000 --- a/docs/xsystem35.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - 鬼畜王 on Web - - - - - - - -
- -
- -
- -
-

アリスソフトの 配布フリー宣言 に基づいて配布されている18禁ゲーム「鬼畜王ランス」をWebブラウザ上で遊べるようにしたものです。 - 遊び方はこちら。

-

(注意) 18歳未満の人は利用できません。

-

以下のファイルをドラッグ&ドロップするか、「ファイルを選択」ボタンを押して選択してください。

- - -
- - - - -
- - - - -
- - - - - - - - diff --git a/shell/audio.ts b/shell/audio.ts deleted file mode 100644 index 865525b..0000000 --- a/shell/audio.ts +++ /dev/null @@ -1,271 +0,0 @@ -/// -/// - -namespace xsystem35 { - declare var webkitAudioContext: any; - export class AudioManager { - private context: AudioContext; - private masterGain: GainNode; - private slots: PCMSound[]; - private bufCache: AudioBuffer[]; - private isSafari: boolean; - - constructor(volumeControl: VolumeControl) { - if (typeof (AudioContext) !== 'undefined') { - this.context = new AudioContext(); - } else if (typeof (webkitAudioContext) !== 'undefined') { - this.context = new webkitAudioContext(); - this.isSafari = true; - this.removeUserGestureRestriction(); - } - this.masterGain = this.context.createGain(); - this.masterGain.connect(this.context.destination); - this.slots = []; - this.bufCache = []; - volumeControl.addEventListener(this.onVolumeChanged.bind(this)); - this.masterGain.gain.value = volumeControl.volume(); - document.addEventListener('visibilitychange', this.onVisibilityChange.bind(this)); - } - - private removeUserGestureRestriction() { - let hanlder = () => { - let src = this.context.createBufferSource(); - src.buffer = this.context.createBuffer(1, 1, 22050); - src.connect(this.context.destination); - src.start(); - console.log('AudioContext unlocked'); - window.removeEventListener('touchend', hanlder); - }; - window.addEventListener('touchend', hanlder); - } - - private load(no: number): Promise { - let buf = this.getWave(no); - if (!buf) - return Promise.reject('Failed to open wave ' + no); - - let decoded: Promise; - if (this.isSafari) { - decoded = new Promise((resolve, reject) => { - this.context.decodeAudioData(buf, resolve, reject); - }); - } else { - decoded = this.context.decodeAudioData(buf); - } - return decoded.then((audioBuf) => { - this.bufCache[no] = audioBuf; - return audioBuf; - }); - } - - private getWave(no: number): ArrayBuffer { - let dfile = _ald_getdata(2 /* DRIFILE_WAVE */, no - 1); - if (!dfile) - return null; - let ptr = Module.getValue(dfile + 8, '*'); - let size = Module.getValue(dfile, 'i32'); - let buf = Module.HEAPU8.buffer.slice(ptr, ptr + size); - _ald_freedata(dfile); - return buf; - } - - pcm_load(slot: number, no: number) { - EmterpreterAsync.handle((resume) => { - this.pcm_stop(slot); - if (this.bufCache[no]) { - this.slots[slot] = new PCMSoundSimple(this.masterGain, this.bufCache[no]); - return resume(); - } - this.load(no).then((audioBuf) => { - this.slots[slot] = new PCMSoundSimple(this.masterGain, audioBuf); - resume(); - }); - }); - } - - pcm_load_mixlr(slot: number, noL: number, noR: number) { - EmterpreterAsync.handle((resume) => { - this.pcm_stop(slot); - if (this.bufCache[noL] && this.bufCache[noR]) { - this.slots[slot] = new PCMSoundMixLR(this.masterGain, this.bufCache[noL], this.bufCache[noR]); - return resume(); - } - let ps: [Promise, Promise] = [ - this.bufCache[noL] ? Promise.resolve(this.bufCache[noL]) : this.load(noL), - this.bufCache[noR] ? Promise.resolve(this.bufCache[noR]) : this.load(noR), - ]; - Promise.all(ps).then((bufs) => { - this.slots[slot] = new PCMSoundMixLR(this.masterGain, bufs[0], bufs[1]); - resume(); - }); - }); - } - - pcm_start(slot: number, loop: number): number { - if (this.slots[slot]) { - this.slots[slot].start(loop); - return 1; - } - return 0; - } - - pcm_stop(slot: number): number { - if (!this.slots[slot]) - return 0; - this.slots[slot].stop(); - this.slots[slot] = null; - return 1; - } - - pcm_fadeout(slot: number, msec: number): number { - if (!this.slots[slot]) - return 0; - this.slots[slot].fadeout(msec); - return 1; - } - - pcm_getpos(slot: number): number { - if (!this.slots[slot]) - return 0; - return this.slots[slot].getPosition() * 1000; - } - - pcm_setvol(slot: number, vol: number): number { - if (!this.slots[slot]) - return 0; - this.slots[slot].setGain(vol / 100); - return 1; - } - - pcm_getwavelen(slot: number): number { - if (!this.slots[slot]) - return 0; - return this.slots[slot].duration * 1000; - } - - pcm_isplaying(slot: number): number { - if (!this.slots[slot]) - return 0; - return this.slots[slot].isPlaying() ? 1 : 0; - } - - private onVisibilityChange() { - if (document.hidden) - this.bufCache = []; - } - - private onVolumeChanged(evt: CustomEvent) { - this.masterGain.gain.value = evt.detail; - } - } - - abstract class PCMSound { - protected context: AudioContext; - protected gain: GainNode; - protected startTime: number; - - constructor(protected dst: AudioNode) { - this.context = dst.context; - this.gain = this.context.createGain(); - this.gain.connect(dst); - } - abstract start(loop: number): void; - abstract stop(): void; - setGain(gain: number) { - this.gain.gain.value = gain; - } - fadeout(msec: number) { - this.gain.gain.linearRampToValueAtTime(0, this.context.currentTime + msec / 1000); - } - getPosition(): number { - if (!this.startTime) - return 0; - return this.context.currentTime - this.startTime; - } - isPlaying(): boolean { - return !!this.startTime; - } - abstract get duration(): number; - } - - class PCMSoundSimple extends PCMSound { - private node: AudioBufferSourceNode; - - constructor(dst: AudioNode, buf: AudioBuffer) { - super(dst); - this.node = this.context.createBufferSource(); - this.node.buffer = buf; - this.node.connect(this.gain); - this.node.onended = this.onended.bind(this); - } - - start(loop: number) { - if (loop === 0) - this.node.loop = true; - else if (loop !== 1) - console.warn('Unsupported PCM loop count ' + loop); - this.node.start(); - this.startTime = this.context.currentTime; - } - - stop() { - if (this.startTime) { - this.node.stop(); - this.startTime = null; - } - } - - get duration() { - return this.node.buffer.duration; - } - - private onended() { - this.startTime = null; - } - } - - class PCMSoundMixLR extends PCMSound { - private lsrc: AudioBufferSourceNode; - private rsrc: AudioBufferSourceNode; - private endCount = 0; - - constructor(dst: AudioNode, lbuf: AudioBuffer, rbuf: AudioBuffer) { - super(dst); - this.lsrc = this.context.createBufferSource(); - this.rsrc = this.context.createBufferSource(); - this.lsrc.buffer = lbuf; - this.rsrc.buffer = rbuf; - let merger = this.context.createChannelMerger(2); - merger.connect(this.gain); - this.lsrc.connect(merger, 0, 0); - this.rsrc.connect(merger, 0, 1); - this.lsrc.onended = this.rsrc.onended = this.onended.bind(this); - } - - start(loop: number) { - if (loop !== 1) - console.warn('PCMSoundMixLR: loop is not supported ' + loop); - this.lsrc.start(); - this.rsrc.start(); - this.startTime = this.context.currentTime; - } - - stop() { - if (this.startTime) { - this.lsrc.stop(); - this.rsrc.stop(); - this.startTime = null; - } - } - - get duration() { - return Math.max(this.lsrc.buffer.duration, this.rsrc.buffer.duration); - } - - private onended() { - this.endCount++; - if (this.endCount === 2) - this.startTime = null; - } - } -} diff --git a/shell/cdda.ts b/shell/cdda.ts deleted file mode 100644 index 6785c62..0000000 --- a/shell/cdda.ts +++ /dev/null @@ -1,115 +0,0 @@ -/// -/// - -namespace xsystem35 { - export class CDPlayer { - private audio = $('audio'); - private blobCache: Blob[]; - private currentTrack: number; - private isVolumeSupported: boolean; - private unmute: () => void; // Non-null if emulating mute by pause - - constructor(private imageLoader: ImageLoader, volumeControl: VolumeControl) { - // Volume control of