summaryrefslogtreecommitdiff
path: root/www/js/api.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/js/api.js')
-rw-r--r--www/js/api.js134
1 files changed, 74 insertions, 60 deletions
diff --git a/www/js/api.js b/www/js/api.js
index 799d917..4aa6f5f 100644
--- a/www/js/api.js
+++ b/www/js/api.js
@@ -1,6 +1,8 @@
"use strict";
window.html5ks.api = {
init: function () {
+
+ // tag character names
var chars = html5ks.data.characters;
for (var ch in chars) {
var chr = chars[ch];
@@ -8,26 +10,34 @@ window.html5ks.api = {
chr.name = this.tag(chr.name);
}
}
+
},
iscene: function (target, is_h, is_end) {
- html5ks.state.status = "scene";
- var deferred = when.defer(),
- label = html5ks.data.script[html5ks.persistent.language + "_" + target],
- i = 0;
+
+ // TODO: implement timeskip
if (target === "timeskip") {
deferred.resolve();
return deferred.promise;
}
- (function run(ret) {
+
+ html5ks.state.status = "scene";
+
+ var deferred = when.defer(),
+ label = html5ks.data.script[html5ks.persistent.language + "_" + target],
+ i = 0;
+
+ var run = function (ret) {
if (label[i]) {
- html5ks.api.runInst(label[i]).then(run, console.error);
- i++;
+ this.runInst(label[i++]).then(run, console.error);
} else {
deferred.resolve(ret);
}
- }());
+ }.bind(this);
+
+ run();
+
return deferred.promise;
},
@@ -46,32 +56,30 @@ window.html5ks.api = {
return this.character(cmd, args[0]);
} else {
console.error("no such cmd " + cmd);
- var deferred = when.defer();
- deferred.resolve();
- return deferred.promise;
+ return when.defer().resolve();
}
}
},
- _fading: {},
+ _fades: {},
set_volume: function (target, delay, channel) {
var deferred = when.defer(),
- audio = html5ks.elements.audio[channel],
- step = (target - audio.volume) / (delay * 20);
+ audioElement = html5ks.elements.audio[channel],
+ step = (target - audioElement.volume) / (delay * 20);
if (!delay) {
- audio.volume = target;
+ audioElement.volume = target;
} else {
- this._fading[channel] = setInterval(function () {
+ if (this._fades[channel]) clearInterval(this._fades[channel]);
+ this._fades[channel] = setInterval(function () {
// clamp new volume 0-1
- audio.volume = Math.min(Math.max(audio.volume + step, 0), 1);
- if (audio.volume === 0 || audio.volume === 1) {
- clearInterval(this._fading);
+ audioElement.volume = Math.min(Math.max(audioElement.volume + step, 0), 1);
+ if (audioElement.volume === 0 || audioElement.volume === 1) {
+ clearInterval(this._fades[channel]);
}
}.bind(this), 50);
}
- deferred.resolve();
- return deferred.promise;
+ return deferred.resolve();
},
play: function (channel, name, ignore, fade) {
@@ -94,17 +102,12 @@ window.html5ks.api = {
src += "sfx/" + html5ks.data.sfx[name];
}
- if (Modernizr.audio.opus) {
- audio.src = src + ".opus";
- } else if (Modernizr.audio.ogg) {
- audio.src = src + ".ogg";
- } else if (Modernizr.audio.m4a) {
- audio.src = src + ".m4a";
- } else if (Modernizr.audio.wav) {
- audio.src = src + ".wav";
- } else {
- console.error("wtf, no audio formats");
- }
+ ["opus", "ogg", "m4a", "wav"].some(function (type) {
+ if (Modernizr.audio[type]) {
+ audio.src = src + "." + type;
+ return true;
+ }
+ });
audio.load();
var volume = html5ks.persistent[channel + "Volume"];
@@ -125,15 +128,19 @@ window.html5ks.api = {
stop: function (channel, ignore, fade) {
if (channel === "all") {
- this.stop("music", ignore, fade);
- this.stop("sound", ignore, fade);
- return this.stop("ambient", ignore, fade);
+ return ["music", "sound", "ambient"].forEach(function (channel) {
+ this.stop(channel, ignore, fade);
+ }.bind(this));
}
+
var deferred = when.defer(),
audio = html5ks.elements.audio[channel];
- if (this._fading[channel]) {
- clearInterval(this._fading[channel]);
+
+ // clear fade
+ if (this._fades[channel]) {
+ clearInterval(this._fades[channel]);
}
+
if (fade) {
this.set_volume(0, fade, channel);
} else {
@@ -146,27 +153,31 @@ window.html5ks.api = {
movie_cutscene: function (vid_src, skippable) {
var deferred = when.defer(),
- video = html5ks.elements.video,
- src = "dump/video/" + vid_src + ".";
+ video = html5ks.elements.video;
this.stop("all");
this.speed("auto", false);
this.speed("skip", false);
- if (Modernizr.video.webm) {
- video.src = src + "webm";
- } else if (Modernizr.video.ogg) {
- video.src = src + "ogv";
- } else if (Modernizr.video.h264) {
- video.src = src + "mp4";
- } else {
- console.error("wtf is this, no video formats");
+ var types = {
+ webm: "webm",
+ ogg: "ogv",
+ h264: "mp4"
+ };
+ for (var type in types) {
+ if (Modernizr.video[type]) {
+ video.src = "dump/video/" + vid_src + "." + types[type];
+ break;
+ }
}
- video.load();
- video.style.display = "block";
- video.volume = html5ks.persistent.musicVolume;
- video.play();
+ video.oncanplaythrough = function () {
+ video.volume = html5ks.persistent.musicVolume;
+ video.style.display = "block";
+ video.play();
+ video.onended = done;
+ };
+
var done = function () {
video.style.display = "none";
video.pause();
@@ -184,10 +195,13 @@ window.html5ks.api = {
done();
}
};
- video.onended = done;
+
video.onerror = function () {
deferred.reject(this.error);
};
+
+ video.load();
+
return deferred.promise;
},
@@ -198,20 +212,18 @@ window.html5ks.api = {
window: function (action, transition) {
- var windw = html5ks.elements.window,
- deferred = when.defer();
+ var windowEl = html5ks.elements.window;
switch (action) {
case "show":
- windw.style.display = "block";
+ windowEl.style.display = "block";
break;
case "hide":
- windw.style.display = "none";
+ windowEl.style.display = "none";
break;
default:
- return windw.style.display !== "none";
+ return windowEl.style.display !== "none";
}
- deferred.resolve(action);
- return deferred.promise;
+ return when.defer().resolve(action);
},
@@ -310,6 +322,7 @@ window.html5ks.api = {
}
return deferred.promise;
},
+
hide: function (name) {
var deferred = when.defer();
var show = html5ks.elements.show.children;
@@ -322,6 +335,7 @@ window.html5ks.api = {
}
},
+
tag: function (str) {
var tags = [
/&/g, "&",
@@ -472,7 +486,7 @@ window.html5ks.api = {
return deferred.promise;
},
- menu: function () {
+ menu: function (choices) {
var args = Array.prototype.slice.call(arguments, 0);
var deferred = when.defer();
var menu = html5ks.elements.choices,