js13kgames2017-muri/src/bubble.js
2017-09-13 22:59:35 +02:00

69 lines
2 KiB
JavaScript

(function() {
var bubble = {};
var dom = document.getElementById('bubble');
var resolveFn, fragmentTimer, delayTimer = null;
var show = function(text, position) {
return new Promise(function(resolve) {
resolveFn = resolve;
dom.innerHTML = '';
dom.style.left = position[0]*8;
dom.style.top = position[1]*8-18;
var parts = text.split(' ');
var showFragment = function() {
if (parts.length === 0) {
delayTimer = setTimeout(resolve, 1500);
return;
}
dom.innerHTML += parts.shift() + ' ';
fragmentTimer = setTimeout(showFragment, 140);
};
showFragment();
});
};
bubble.skip = function(what) {
clearTimeout(fragmentTimer);
clearTimeout(delayTimer);
dom.innerHTML = '';
if (resolveFn) resolveFn(what || 'line');
};
bubble.talk = function(texts, position) {
if (texts.length === 0) {
dom.innerHTML = '';
return;
}
bubble.skip('talk');
var text = texts.shift();
return show(text, position || [5, 46])
.then(function(what) {
if (what === 'talk') {
return Promise.resolve(what);
}
return bubble.talk(texts, position);
});
};
bubble.story = function(talkList) {
if (talkList.length === 0) {
dom.innerHTML = '';
return;
}
bubble.skip('story');
var params = talkList.shift();
return bubble.talk(params[0], params[1])
.then(function(what) {
if (what === 'story') {
return Promise.resolve(what);
}
return bubble.story(talkList);
});
};
bubble.name = 'bubble';
muri.modules.push(bubble);
}());