aboutsummaryrefslogtreecommitdiff
path: root/static/js/picoplayer.js
diff options
context:
space:
mode:
authorAlexander Neonxp Kiryukhin <i@neonxp.ru>2024-11-28 00:46:17 +0300
committerAlexander Neonxp Kiryukhin <i@neonxp.ru>2024-11-28 00:46:17 +0300
commit54375572e11d23dacb20c5742d171af3072d7b9c (patch)
treea190e43087c520846658f7d68cc3bb263427a254 /static/js/picoplayer.js
parent8b78390987476352a6459460e00d5c4cdc0717c2 (diff)
Серьезная реновация
Diffstat (limited to 'static/js/picoplayer.js')
-rw-r--r--static/js/picoplayer.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/static/js/picoplayer.js b/static/js/picoplayer.js
new file mode 100644
index 0000000..127009c
--- /dev/null
+++ b/static/js/picoplayer.js
@@ -0,0 +1,118 @@
+// Big thanks to https://github.com/AfBu/PicoLoader
+// pico-8 web player variables that must be present
+var Module;
+var playable_area_count = 0;
+var playarea_state = 0;
+var codo_command = 0;
+var codo_command_p = 0;
+var codo_volume = 256;
+var codo_running = true;
+var pa_pid = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+
+// Pico-8 buttons to Web Player key codes lookup table
+var pico8keys = [
+ [37, 39, 38, 40, 90, 88],
+ [83, 70, 69, 68, 9, 81]
+];
+
+// Loads pico8 web player library and setups everything to run
+function PicoPlayer(element, cart, lib) {
+ // fallback to bbs version of pico8 console
+ if (!lib) {
+ lib = '/js/pico8.js';
+ }
+
+ // load element by ID
+ if (typeof(element) == 'string') {
+ element = document.getElementById(element);
+ }
+
+ // create canvas and add it into element
+ var canvas = document.createElement('canvas');
+ element.appendChild(canvas);
+
+ // setup module to load card and point to our canvas
+ Module = {
+ arguments: [cart],
+ canvas: canvas
+ };
+
+ // load pico8 library
+ var head = document.getElementsByTagName('head')[0];
+ var js = document.createElement('script');
+ js.src = lib;
+ head.appendChild(js);
+}
+
+// press button
+function PicoPress(k, p) {
+ var kc = pico8keys[p][k];
+
+ gd({
+ type: 'keydown',
+ keyCode: kc
+ });
+}
+
+// release button
+function PicoRelease(k, p) {
+ var kc = pico8keys[p][k];
+
+ gd({
+ type: 'keyup',
+ keyCode: kc
+ });
+}
+
+// set volume (0 - 256)
+function PicoVolume(vol) {
+ codo_volume = vol;
+ codo_command = 2;
+ codo_command_p = codo_volume;
+}
+
+// toggle sound
+function PicoMute() {
+ codo_volume = (codo_volume == 0 ? 256 : 0);
+ codo_command = 2;
+ codo_command_p = codo_volume;
+}
+
+// toggle pause
+function PicoPause() {
+ codo_running = !codo_running;
+
+ if (codo_running) {
+ Module.resumeMainLoop();
+ } else {
+ Module.pauseMainLoop();
+ }
+}
+
+// reset cart
+function PicoReset() {
+ codo_command = 1;
+ codo_running = true;
+
+ Module.resumeMainLoop();
+}
+
+window.addEventListener('keydown', (e) => {
+ if (e.target.localName != 'input') {
+ switch (e.keyCode) {
+ case 37: // left
+ case 39: // right
+ e.preventDefault();
+ break;
+ case 38: // up
+ case 40: // down
+ e.preventDefault();
+ break;
+ default:
+ break;
+ }
+ }
+}, {
+ capture: true,
+ passive: false
+});