Newer
Older
const { images_url } = require("../../../../../admin-frontend/src/constants");
const { data_url } = require("../../../../constants");
const ImageCarousel = require("../../../generic-components/image-carousel");
const { getArticleBody } = require("../../../lib/article-utils");
const { fetch_json_or_error_text } = require("../../../lib/fetch");
const { MentaloEngine } = require("mentalo-engine");
class GameArticle {
constructor(props) {
this.props = props;
this.parse_body();
}
parse_body() {
let body = getArticleBody(this.props.body);
const play_btn_regex = /\[PLAY_BUTTON\s\{.+\}\]/g;
const found_play_buttons = body.match(play_btn_regex);
if (found_play_buttons) {
this.build_play_button(JSON.parse(found_play_buttons[0].replace(/[\[\]PLAY_BUTTON\s]/g, "")));
body = body.replace(play_btn_regex, "");
}
this.body = body;
}
build_play_button(button_data) {
this.render_play_button = {
tag: "button",
class: "play-button",
onclick: this.handle_click_play.bind(this, button_data.filename, button_data.engine)
};
}
load_and_run_mentalo_game(filename, button_element) {
const button_text = button_element.innerHTML;
button_element.innerHTML = "Loading ...";
button_element.style.pointerEvents = "none";
fetch_json_or_error_text(`${data_url}/${filename}`)
.then(game_data => {
const container = document.createElement("div");
container.style.position = "fixed";
container.style.top = 0;
container.style.left = 0;
container.style.right = 0;
container.style.bottom = 0;
container.style.zIndex = 10;
container.style.display = "flex";
container.style.justifyContent = "center";
container.style.alignItems = "center";
container.id = "kuadrado-tmp-game-player-container";
document.body.appendChild(container);
document.body.style.overflow = "hidden";
const engine = new MentaloEngine({
game_data,
fullscreen: true,
frame_rate: 30,
container,
on_quit_game: () => {
container.remove();
document.body.style.overflow = "visible";
}
});
engine.init();
engine.run_game();
})
.catch(err => console.log(err))
.finally(() => {
button_element.innerHTML = button_text;
button_element.style.pointerEvents = "unset";
});
this.load_and_run_mentalo_game(filename, e.target);
typeof: "VideoGame",
additionalType: "Article",
class: "game-article",
contents: [
{
tag: "h2",
{
tag: "div",
class: "game-banner",
contents: [
{ tag: "img", class: "pixelated", src: `${images_url}/${images[0]}` },
{
tag: "h3",
class: "game-subtitle",
contents: subtitle,
contents: [{ tag: "p", style_rules: { margin: 0 }, contents: this.body }]
.concat(this.render_play_button
? [this.render_play_button]
: []),
new ImageCarousel({ images: images.map(img => `${images_url}/${img}`) }).render(),
details.length > 0 && {
tag: "ul",
class: "details-list",
contents: details.map(detail => {
return {
tag: "li",
class: "detail",
contents: [
{ tag: "label", contents: detail.label },
{
tag: "div",