retrolib
Version:
Render low-res scenes to the canvas in a retro 8-bit era style. Aseprite exported animation wrapper, scene management, sound and image management, particle support.
123 lines • 7.42 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
import { font } from "../retrolib";
import Scene from "./scene";
import { TransitionEffect } from "./scenes";
var DialogScene = /** @class */ (function (_super) {
__extends(DialogScene, _super);
function DialogScene(id, active, nextSceneId, dialogs) {
var _this = this;
var animationFrame = function () {
if (_this.dialogs !== undefined && _this.dialogs[_this.dialogNumber] !== undefined) {
var line_1 = _this.dialogs[_this.dialogNumber].lines[_this.lineNumber];
if (!_this.pauseLetterIncrement && _this.dialogNumber < _this.dialogs.length && _this.dialogs[_this.dialogNumber]
&& _this.dialogs[_this.dialogNumber].lines && _this.dialogs[_this.dialogNumber].lines.length > 0 && line_1 !== undefined) {
if (_this.elapsed >= _this.lastLetterTimestamp + _this.letterSpeed) {
_this.characterNumber++;
if (_this.lineNumber < _this.dialogs[_this.dialogNumber].lines.length
&& line_1.text.slice(_this.characterNumber, _this.characterNumber + 1) === ' '
&& font.textWidth(line_1.text.slice(0, _this.characterNumber), _this.font) < _this.dialogs[_this.dialogNumber].rect.w) {
_this.lastSpaceNumber = _this.characterNumber;
}
_this.lastLetterTimestamp = _this.elapsed;
}
if (_this.characterNumber >= line_1.text.length) {
_this.pauseLetterIncrement = true;
_this.characterNumber = line_1.text.length;
setTimeout(function () {
if (line_1.onEnded) {
line_1.onEnded(line_1);
}
_this.lineNumber++;
_this.characterNumber = 0;
_this.lastSpaceNumber = 0;
if (_this.lineNumber < _this.dialogs[_this.dialogNumber].lines.length && _this.dialogs[_this.dialogNumber].lines[_this.lineNumber].delayAfter) {
setTimeout(function () {
_this.pauseLetterIncrement = false;
if (_this.lineNumber >= _this.dialogs[_this.dialogNumber].lines.length) {
_this.lineNumber = 0;
_this.dialogNumber++;
if (_this.dialogNumber >= _this.dialogs.length) {
setTimeout(function () { return _this.TransitionTo(_this.nextSceneId, TransitionEffect.Fade, 200, 16); }, _this.dialogPauseTime);
}
}
}, _this.dialogs[_this.dialogNumber].lines[_this.lineNumber].delayAfter);
}
else {
_this.pauseLetterIncrement = false;
if (_this.lineNumber >= _this.dialogs[_this.dialogNumber].lines.length) {
_this.lineNumber = 0;
_this.dialogNumber++;
if (_this.dialogNumber >= _this.dialogs.length) {
setTimeout(function () { return _this.TransitionTo(_this.nextSceneId, TransitionEffect.Fade, 200, 16); }, _this.dialogPauseTime);
}
}
}
}, _this.linePauseTime);
}
}
if (_this.dialogNumber < _this.dialogs.length && _this.lineNumber <= _this.dialogs[_this.dialogNumber].lines.length - 1) {
// If the current line would overflow the width, wrap from the last space character.
var linesUpTo = line_1.text.slice(0, _this.characterNumber);
if (font.textWidth(linesUpTo, _this.font) >= _this.dialogs[_this.dialogNumber].rect.w) {
line_1.text = line_1.text.slice(0, _this.lastSpaceNumber) + '\n' + line_1.text.slice(_this.lastSpaceNumber + 1);
}
var offsety = line_1.speaker.length > 0 ? font.textHeight(line_1.speaker, _this.font) : 0;
if (offsety > 0) {
font.drawText(_this.dialogs[_this.dialogNumber].rect.x, _this.dialogs[_this.dialogNumber].rect.y, line_1.speaker, line_1.color, _this.font);
}
font.drawText(_this.dialogs[_this.dialogNumber].rect.x, _this.dialogs[_this.dialogNumber].rect.y + offsety, line_1.text.slice(0, _this.characterNumber), line_1.color, _this.font);
}
}
};
_this = _super.call(this, id, animationFrame, active, function () { }, function () { }, function () { }) || this;
_this.dialogNumber = 0;
_this.lineNumber = 0;
_this.characterNumber = 0;
_this.lastSpaceNumber = 0;
_this.letterSpeed = 60;
_this.lastLetterTimestamp = 0;
_this.pauseLetterIncrement = false;
_this.linePauseTime = 1500;
_this.dialogPauseTime = 3000;
_this.font = undefined;
_this.handleInput = function (input) {
if (['action', 'cancel'].includes(input) && !_this.pauseLetterIncrement) {
_this.pauseLetterIncrement = true;
_this.characterNumber = _this.dialogs[_this.dialogNumber].lines[_this.lineNumber].text.length - 1;
setTimeout(function () {
_this.lineNumber++;
_this.lastSpaceNumber = 0;
if (_this.dialogs[_this.dialogNumber].lines[_this.lineNumber].delayAfter) {
setTimeout(function () { return _this.pauseLetterIncrement = false; }, _this.dialogs[_this.dialogNumber].lines[_this.lineNumber].delayAfter);
}
else {
_this.pauseLetterIncrement = false;
}
}, _this.linePauseTime);
}
};
_this.lineNumber = 0;
_this.characterNumber = 0;
_this.dialogs = dialogs;
_this.color = { r: 225, g: 225, b: 225, a: 255 };
_this.nextSceneId = nextSceneId;
return _this;
}
return DialogScene;
}(Scene));
export default DialogScene;
//# sourceMappingURL=dialogscene.js.map