diff options
Diffstat (limited to 'www/js/api.js')
-rw-r--r-- | www/js/api.js | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/www/js/api.js b/www/js/api.js new file mode 100644 index 0000000..1738ddf --- /dev/null +++ b/www/js/api.js @@ -0,0 +1,192 @@ +"use strict"; +window.html5ks.api = { + seen_scene: function (scene) { + return !!html5ks.persistent.seen_scenes[scene]; + }, + scene_register: function (scene) { + html5ks.persistent.seen_scenes.scene = true; + }, + fading: function (audio, dir, fade) { + var fadeSet = html5ks.persistent.settings.fade, + step = fadeSet / (fade * 1000), + over = audio.volume + step * dir; + if (over > 1) { + audio.volume = 1; + } else if (over < 0) { + audio.volume = 0; + } else { + audio.volume += step * dir; + setTimeout(function () { + this.fading(audio, dir, fade); + }, fadeSet); + } + }, + play: function (channel, name, fade) { + // TODO: fade + var deferred = when.defer(), + audio = html5ks.elements.audio[channel]; + audio.src = "/dump/" + (channel === "music" ? "bgm/" + html5ks.data.music[name] + ".ogg" : html5ks.data.sfx[name]); + audio.load(); + if (fade) { + audio.volume = 0; + } + audio.play(); + audio.addEventListener("playing", function playing() { + audio.removeEventListener("playing", playing, false); + deferred.resolve(); + html5ks.fading(audio, 1, fade); + }, false); + audio.addEventListener("error", function error() { + audio.removeEventListener("error", error, false); + deferred.reject(this.error); + }, false); + return deferred.promise; + }, + stop: function (channel, fade) { + var deferred = when.defer(), + audio = html5ks.elements.audio[channel], + fadeSet = html5ks.persistent.settings.fade; + if (fade) { + this.fading(audio, -1, fade); + } else { + audio.pause(); + } + deferred.resolve(); + return deferred.promise; + }, + play_video: function (vid_src) { + var deferred = when.defer(), + video = html5ks.elements.video; + video.src = "/dump/video/" + vid_src + ".webm"; + video.load(); + video.play(); + video.addEventListener("ended", function () { + deferred.resolve(); + }, false); + video.addEventListener("error", function () { + deferred.reject(this.error); + }, false); + return deferred.promise; + }, + act_op: function (this_video) { + // strip off extension + return this.play_video(this_video.slice(0,-4)); + }, + iscene: function (target, is_h, is_end) { + this.scene_register(target); + return window.script[target](); + }, + window: function (action, transition) { + var windw = html5ks.elements.window, + deferred = when.defer(); + switch (action) { + case "show": + windw.style.display = "block"; + break; + case "hide": + windw.style.display = "none"; + break; + default: + throw new Error("unknown window action " + action); + } + deferred.resolve(action); + return deferred.promise; + }, + // NOT iscene + scene: function (type, name) { + var deferred = when.defer(), + nom = type; + if (name) { + nom = type + "_" + name; + } + var bg = html5ks.elements.img.bg; + var image = html5ks.data.images[nom]; + if (!image) { + var typ = { + "bg": {dir:"bgs",ext:"jpg"} + }[type]; + image = typ.dir + "/" + name + "." + typ.ext; + } + html5ks.elements.img.solid.style.backgroundColor = ''; + if (typeof image == "string") { + if (image.substring(0,1) == "#") { + html5ks.elements.img.solid.style.backgroundColor = image; + deferred.resolve(); + return deferred.promise; + } else { + image = {image: image}; + } + } + bg.onload = function () { + deferred.resolve(); + }; + bg.onerror = function () { + throw new Error("bg could not load"); + }; + bg.src = "/dump/" + image.image; + return deferred.promise; + }, + show: function () { + var deferred = when.defer(); + deferred.resolve(); + return deferred.promise; + }, + hide: function () { + var deferred = when.defer(); + deferred.resolve(); + return deferred.promise; + }, + run: function (label) { + label.forEach(function (inst) { + var cmd = inst[0], + args = inst.slice(1); + switch (cmd) { + case "extend": + case "hide": + case "ksgallery_unlock": + case "nvl": + case "play": + case "scene": + case "set_volume": + case "show": + case "stop": + case "window": + html5ks.api[cmd].apply(html5ks, args); + break; + default: + if (html5ks.data.characters[cmd]) { + this.character(cmd, args); + } else { + console.error("instruction not implemented: %o", inst); + } + } + }); + }, + character: function (name, str) { + var deferred = when.defer(), + text = str, + char = html5ks.data.characters[name]; + if (char.what_prefix) { + text = char.what_prefix + text; + } + if (char.what_suffix) { + text = text + char.what_suffix; + } + var who = html5ks.elements.who; + who.textContent = char.name; + if (char.color) { + who.style.color = char.color; + } else { + who.style.color = "#ffffff"; + } + html5ks.elements.say.textContent = text; + html5ks.next = function () { + deferred.resolve(text); + html5ks.next = function () {}; + }; + if (html5ks.state.auto) { + setTimeout(html5ks.next, 1000 + html5ks.persistent.settings.autospeed * text.length); + } + return deferred.promise; + } +}; |