vtm/quelldatein/manifestation/web/partie.ts

463 lines
11 KiB
TypeScript
Raw Normal View History

2017-11-09 18:42:09 +01:00
/*
* Verrückte Turing-Maschinen A turing complete game
* Copyright (C) 2016 Christian Fraß <vidofnir@folksprak.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
module mod_vtm_manifestation
{
2017-11-09 21:57:35 +01:00
/**
* @author kcf <vidofnir@folksprak.org>
*/
function text_nachbearbeiten(text : string) : string
{
let regexp : RegExp = (new RegExp("\\$\{s(\\d*)\}", "g"));
2017-11-10 00:05:15 +01:00
return text.replace(regexp, "<span class=\"symbol_$1\">&nbsp;&nbsp;</span>");
2017-11-09 21:57:35 +01:00
}
2017-11-09 18:42:09 +01:00
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_web_partie
extends klasse_manifestation<mod_vtm_aufbau.typ_partie, void>
2017-11-09 18:42:09 +01:00
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private bereich : Element;
/**
* @author kcf <vidofnir@folksprak.org>
*/
private intervall : schnittstelle_fehlermonade<any>;
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor(aufbau : mod_vtm_aufbau.typ_partie, bereich : Element)
2017-11-09 18:42:09 +01:00
{
super(aufbau);
this.bereich = bereich;
this.intervall = (new klasse_nichts<any>());
/*
mod_vtm_aufbau.partie_lauschen
2017-11-09 21:57:35 +01:00
(
this.aufbau,
2017-11-09 21:57:35 +01:00
"aenderung_welt",
(angaben) =>
{
this.erneuern_welt();
}
)
;
*/
2017-11-09 18:42:09 +01:00
}
/**
* @author kcf <vidofnir@folksprak.org>
2017-11-09 21:57:35 +01:00
* @override
2017-11-09 18:42:09 +01:00
*/
2017-11-09 21:57:35 +01:00
public einrichten() : void
{
mod_vtm_aufbau.partie_lauschen
2017-11-09 21:57:35 +01:00
(
this.aufbau,
2017-11-09 21:57:35 +01:00
"aenderung_aufgabe",
(angaben) =>
{
this.erneuern_aufgabe();
}
)
;
mod_vtm_aufbau.partie_lauschen
2017-11-09 21:57:35 +01:00
(
this.aufbau,
2017-11-09 21:57:35 +01:00
"aenderung_welt",
(angaben) =>
{
this.erneuern_welt();
}
)
;
mod_vtm_aufbau.partie_lauschen
2017-11-09 21:57:35 +01:00
(
this.aufbau,
2017-11-09 21:57:35 +01:00
"aenderung_figur",
(angaben) =>
{
this.erneuern_figur();
}
)
;
mod_vtm_aufbau.partie_lauschen
2017-11-09 21:57:35 +01:00
(
this.aufbau,
2017-11-09 21:57:35 +01:00
"aenderung_modus",
(angaben) =>
{
this.erneuern_modus();
2018-03-20 13:30:00 +01:00
this.erneuern_knoepfe();
2017-11-09 21:57:35 +01:00
}
)
;
this.darstellen();
this.binden();
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private erneuern_aufgabe() : void
{
document.querySelector("#aufgabe_text").innerHTML = text_nachbearbeiten(mod_vtm_aufbau.partie_aufgabe_lesen(this.aufbau).text());
2017-11-09 21:57:35 +01:00
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private erneuern_welt() : void
{
let knoten_svg : mod_vtm_helfer.schnittstelle_xmlknoten = mod_vtm_manifestation.svg_wurzel
(
-4, -4,
+4, +4,
800, 800,
[new klasse_svg_partie(this.aufbau).darstellen()]
)
;
this.bereich.innerHTML = knoten_svg.darstellen();
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private erneuern_figur() : void
{
2017-11-10 00:05:15 +01:00
/*
*/
2017-11-09 21:57:35 +01:00
let knoten_svg : mod_vtm_helfer.schnittstelle_xmlknoten = mod_vtm_manifestation.svg_wurzel
(
-4, -4,
+4, +4,
800, 800,
[new klasse_svg_partie(this.aufbau).darstellen()]
)
;
this.bereich.innerHTML = knoten_svg.darstellen();
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private erneuern_modus() : void
{
let status : string;
switch (mod_vtm_aufbau.partie_modus_lesen(this.aufbau))
2017-11-09 21:57:35 +01:00
{
case mod_vtm_aufbau.modus_initial:
{
status = "Maschine aufbauen";
break;
}
case mod_vtm_aufbau.modus_ungewiss:
{
status = "wird geprüft …";
break;
}
case mod_vtm_aufbau.modus_fehlerhaft:
{
status = "fehlerhaft :/";
break;
}
case mod_vtm_aufbau.modus_korrekt:
{
2017-11-10 00:05:15 +01:00
status = "anscheinend korrekt :)";
2017-11-09 21:57:35 +01:00
break;
}
default:
{
let meldung : string = "unbehandelter Modus";
throw (new Error(meldung));
break;
}
}
document.querySelector("#aufgabe_status").textContent = status;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public erneuern_knoepfe() : void
2017-11-09 18:42:09 +01:00
{
let modus : mod_vtm_aufbau.typ_modus = mod_vtm_aufbau.partie_modus_lesen(this.aufbau);
2017-11-10 19:00:25 +01:00
let klasse : string;
switch (modus)
{
case mod_vtm_aufbau.modus_initial:
{
klasse = "initial";
break;
}
case mod_vtm_aufbau.modus_ungewiss:
{
klasse = (
2017-11-09 18:42:09 +01:00
this.intervall.ist_schlicht()
2017-11-10 19:00:25 +01:00
? "ungewiss_laufend"
: "ungewiss_stehend"
);
break;
}
case mod_vtm_aufbau.modus_fehlerhaft:
case mod_vtm_aufbau.modus_korrekt:
{
klasse = "fertig";
break;
}
}
document.querySelector("#knoepfe").setAttribute("class", klasse);
2017-11-09 18:42:09 +01:00
}
2017-11-09 21:57:35 +01:00
/**
* @author kcf <vidofnir@folksprak.org>
* @implementation
*/
public darstellen() : void
{
this.erneuern_aufgabe();
this.erneuern_welt();
this.erneuern_figur();
this.erneuern_modus();
this.erneuern_knoepfe();
}
2017-11-10 19:00:25 +01:00
/**
* @author kcf <vidofnir@folksprak.org>
*/
private anhalten() : void
{
if (this.intervall.ist_schlicht())
{
clearInterval(this.intervall.lesen());
this.intervall = (new klasse_nichts<any>());
}
else
{
let meldung : string = "kein Intervall gesetzt";
console.warn(meldung);
}
this.erneuern_knoepfe();
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private fortfahren() : void
{
mod_vtm_aufbau.partie_fortfahren(this.aufbau);
let modus : mod_vtm_aufbau.typ_modus = mod_vtm_aufbau.partie_modus_lesen(this.aufbau);
2017-11-10 19:00:25 +01:00
if (modus <= 1)
{
// nichts tun
}
else
{
this.anhalten();
}
this.erneuern_knoepfe();
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private testen() : void
{
let handle : any = setInterval(() => this.fortfahren(), 500);
this.intervall = (new klasse_schlicht<any>(handle));
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private bearbeiten() : void
{
this.anhalten();
mod_vtm_aufbau.partie_zuruecksetzen(this.aufbau);
2018-03-20 13:30:00 +01:00
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
private leeren() : void
{
mod_vtm_aufbau.partie_welt_leeren(this.aufbau);
mod_vtm_aufbau.partie_zuruecksetzen(this.aufbau);
2017-11-10 19:00:25 +01:00
}
2017-11-09 18:42:09 +01:00
/**
* @author kcf <vidofnir@folksprak.org>
* @implementation
*/
public binden() : void
{
2017-11-09 21:57:35 +01:00
let stelle_ermitteln = (target : EventTarget) =>
{
let stelle : schnittstelle_fehlermonade<mod_vtm_aufbau.typ_stelle>;
let dom_feld : Element = target["closest"](".feld");
if (dom_feld == null)
{
stelle = (new klasse_nichts<mod_vtm_aufbau.typ_stelle>());
}
else
{
let rel : string = dom_feld.getAttribute("rel")
stelle = (new klasse_schlicht<mod_vtm_aufbau.typ_stelle>(mod_vtm_aufbau.stelle_von_hash(rel)));
}
return stelle;
}
;
2017-11-09 18:42:09 +01:00
// Links-Klick
this.bereich.addEventListener
(
"click",
event =>
{
event.preventDefault();
2017-11-09 21:57:35 +01:00
let stelle_ : schnittstelle_fehlermonade<mod_vtm_aufbau.typ_stelle> = stelle_ermitteln(event.target);
if (stelle_.ist_schlicht())
2017-11-09 18:42:09 +01:00
{
mod_vtm_aufbau.partie_welt_feld_wechseln(this.aufbau, stelle_.lesen(), false);
2017-11-09 18:42:09 +01:00
}
else
{
2017-11-09 21:57:35 +01:00
console.info("-- kein Feld");
2017-11-09 18:42:09 +01:00
}
}
)
;
// Rechts-Klick
this.bereich.addEventListener
(
"contextmenu",
event =>
{
event.preventDefault();
2017-11-09 21:57:35 +01:00
let stelle_ : schnittstelle_fehlermonade<mod_vtm_aufbau.typ_stelle> = stelle_ermitteln(event.target);
if (stelle_.ist_schlicht())
{
mod_vtm_aufbau.partie_welt_feld_wechseln(this.aufbau, stelle_.lesen(), true);
2017-11-09 21:57:35 +01:00
}
else
{
console.info("-- kein Feld");
}
}
)
;
// Mausrad
this.bereich.addEventListener
(
"wheel",
event =>
{
event.preventDefault();
let stelle_ : schnittstelle_fehlermonade<mod_vtm_aufbau.typ_stelle> = stelle_ermitteln(event.target);
if (stelle_.ist_schlicht())
2017-11-09 18:42:09 +01:00
{
2017-11-09 21:57:35 +01:00
let inkrement : int = ((event["deltaY"] < 0) ? -1 : +1);
mod_vtm_aufbau.partie_welt_feld_drehen(this.aufbau, stelle_.lesen(), inkrement);
2017-11-09 18:42:09 +01:00
}
else
{
2017-11-09 21:57:35 +01:00
console.info("-- kein Feld");
2017-11-09 18:42:09 +01:00
}
}
)
;
2017-11-10 19:00:25 +01:00
// Schritt
document.querySelector("#knopf_schritt").addEventListener
(
"click",
event =>
{
this.anhalten();
this.fortfahren();
}
)
;
2017-11-09 18:42:09 +01:00
// Testen
document.querySelector("#knopf_testen").addEventListener
(
"click",
event =>
{
2017-11-10 19:00:25 +01:00
this.testen();
2017-11-09 18:42:09 +01:00
}
)
;
// Anhalten
document.querySelector("#knopf_anhalten").addEventListener
(
"click",
event =>
{
2017-11-10 19:00:25 +01:00
this.anhalten();
2017-11-09 18:42:09 +01:00
}
)
;
// Bearbeiten
document.querySelector("#knopf_bearbeiten").addEventListener
(
"click",
event =>
{
2017-11-10 19:00:25 +01:00
this.bearbeiten();
2017-11-09 18:42:09 +01:00
}
)
;
2018-03-20 13:30:00 +01:00
// Leeren
document.querySelector("#knopf_leeren").addEventListener
(
"click",
event =>
{
this.leeren();
}
)
;
2017-11-09 18:42:09 +01:00
}
}
}