/** * Disclaimer als HTML-Overlay. Der Text kommt aus dem Template * `_disclaimer_content.html` (einzige Quelle, auch für die Seite /disclaimer). * Die Bestätigung wird in localStorage gespeichert. * @module scenes/DisclaimerScene */ import { DISCLAIMER } from '../content/texts.js'; import { el, Overlay } from '../systems/Overlay.js'; export class DisclaimerScene extends Phaser.Scene { constructor() { super('Disclaimer'); } /** @param {{mandatory?: boolean}} data */ create(data) { const services = this.registry.get('services'); const context = this.registry.get('context'); const mandatory = Boolean(data?.mandatory); const content = []; const template = document.getElementById('disclaimer-content'); if (template instanceof HTMLTemplateElement) { content.push(template.content.cloneNode(true)); } else { content.push(el('p', '', DISCLAIMER.missingTemplate)); } const link = /** @type {HTMLAnchorElement} */ (el('a', '', DISCLAIMER.openPage)); link.href = context.disclaimerUrl; link.target = '_blank'; link.rel = 'noopener'; const linkLine = el('p'); linkLine.append(link); content.push(linkLine); const close = () => { // Der Klick ist eine Nutzeraktion – guter Moment, um den Ton freizuschalten. services.audio.unlock(); services.audio.play('ui-confirm'); services.settings.acceptDisclaimer(); this.overlay.close(); this.events.emit('disclaimer-closed'); this.scene.stop(); }; this.overlay = new Overlay({ id: 'disclaimer-overlay', content, buttons: [{ label: mandatory ? DISCLAIMER.accept : DISCLAIMER.close, onClick: close, testId: 'disclaimer-accept' }], // Beim ersten Start muss aktiv bestätigt werden; Esc schließt nur den erneuten Aufruf. onEscape: mandatory ? undefined : close, }); this.events.once('shutdown', () => this.overlay?.element.isConnected && this.overlay.close()); } }