sicherung
This commit is contained in:
parent
13e34a6f42
commit
880d5dc708
20
makefile
20
makefile
|
|
@ -1,20 +1,20 @@
|
|||
alles: erzeugnis/vtm.html erzeugnis/vtm.css erzeugnis/aufgaben.dat.js erzeugnis/vtm.js
|
||||
.PHONY: alles
|
||||
|
||||
erzeugnis/vtm.html: quelldatein/manifestation/vtm.html
|
||||
erzeugnis/vtm.html: quelldatein/manifestation/web/vtm.html
|
||||
@ echo "-- Struktur …"
|
||||
@ mkdir -p erzeugnis
|
||||
@ cp quelldatein/manifestation/vtm.html erzeugnis/vtm.html
|
||||
@ cp quelldatein/manifestation/web/vtm.html erzeugnis/vtm.html
|
||||
|
||||
erzeugnis/vtm.css: quelldatein/manifestation/vtm.css quelldatein/manifestation/partie.css
|
||||
erzeugnis/vtm.css: quelldatein/manifestation/web/vtm.css quelldatein/manifestation/web/partie.css
|
||||
@ echo "-- Gestaltung …"
|
||||
@ mkdir -p erzeugnis
|
||||
@ cat quelldatein/manifestation/vtm.css quelldatein/manifestation/partie.css > erzeugnis/vtm.css
|
||||
@ cat quelldatein/manifestation/web/vtm.css quelldatein/manifestation/web/partie.css > erzeugnis/vtm.css
|
||||
|
||||
erzeugnis/aufgaben.dat.js: quelldatein/daten/aufgaben.dat.js
|
||||
@ echo "-- Daten …"
|
||||
@ mkdir -p erzeugnis
|
||||
@ cat quelldatein/daten/aufgaben.dat.js erzeugnis/daten.js
|
||||
@ cat quelldatein/daten/aufgaben.dat.js > erzeugnis/daten.js
|
||||
|
||||
erzeugnis/vtm.js: \
|
||||
quelldatein/basis/typen.ts \
|
||||
|
|
@ -49,7 +49,10 @@ erzeugnis/vtm.js: \
|
|||
quelldatein/manifestation/manifestation.ts \
|
||||
quelldatein/manifestation/position.ts \
|
||||
quelldatein/manifestation/svg.ts \
|
||||
quelldatein/manifestation/partie.ts \
|
||||
quelldatein/manifestation/svg/figur.ts \
|
||||
quelldatein/manifestation/svg/aktor.ts \
|
||||
quelldatein/manifestation/svg/partie.ts \
|
||||
quelldatein/manifestation/web/partie.ts \
|
||||
quelldatein/haupt.ts
|
||||
@ echo "-- Logik …"
|
||||
@ mkdir -p erzeugnis
|
||||
|
|
@ -87,7 +90,10 @@ erzeugnis/vtm.js: \
|
|||
quelldatein/manifestation/manifestation.ts \
|
||||
quelldatein/manifestation/position.ts \
|
||||
quelldatein/manifestation/svg.ts \
|
||||
quelldatein/manifestation/partie.ts \
|
||||
quelldatein/manifestation/svg/figur.ts \
|
||||
quelldatein/manifestation/svg/aktor.ts \
|
||||
quelldatein/manifestation/svg/partie.ts \
|
||||
quelldatein/manifestation/web/partie.ts \
|
||||
quelldatein/haupt.ts \
|
||||
--outFile erzeugnis/vtm.js
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,12 @@
|
|||
module mod_vtm_aufbau
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
var _liste : Array<schnittstelle_aufgabe> = [];
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
|
|
@ -65,5 +71,23 @@ module mod_vtm_aufbau
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export function aufgabe_registrieren(aufgabe : schnittstelle_aufgabe) : void
|
||||
{
|
||||
_liste.push(aufgabe);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export function aufgabe_holen(index : int) : schnittstelle_aufgabe
|
||||
{
|
||||
return _liste[index];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -103,13 +103,14 @@ module mod_vtm_aufbau
|
|||
if (symbol_.ist_schlicht())
|
||||
{
|
||||
let symbol : typ_symbol = symbol_.lesen();
|
||||
figur.schieben();
|
||||
if (symbol === this.symbol_links)
|
||||
{
|
||||
figur.schieben();
|
||||
summand = +2;
|
||||
}
|
||||
else if (symbol === this.symbol_rechts)
|
||||
{
|
||||
figur.schieben();
|
||||
summand = -2;
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -76,13 +76,12 @@ module mod_vtm_aufbau
|
|||
public constructor
|
||||
(
|
||||
aufgabe : schnittstelle_aufgabe,
|
||||
welt : klasse_welt = klasse_welt.blanko(),
|
||||
figur : schnittstelle_fehlermonade<klasse_figur> = new klasse_nichts<klasse_figur>()
|
||||
welt : klasse_welt = klasse_welt.blanko()
|
||||
)
|
||||
{
|
||||
this.aufgabe = aufgabe;
|
||||
this.welt = welt;
|
||||
this.figur = figur;
|
||||
this.figur = (new klasse_nichts<klasse_figur>());
|
||||
this.testindex = (new klasse_nichts<int>());
|
||||
this.modus = modus_initial;
|
||||
}
|
||||
|
|
@ -115,6 +114,17 @@ module mod_vtm_aufbau
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
public zuruecksetzen() : void
|
||||
{
|
||||
this.figur = (new klasse_nichts<klasse_figur>());
|
||||
this.testindex = (new klasse_nichts<int>());
|
||||
this.modus = modus_initial;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -24,5 +24,14 @@ module mod_vtm_aufbau
|
|||
*/
|
||||
export type typ_symbol = int;
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export function symbol_vergleichen(symbol1 : typ_symbol, symbol2 : typ_symbol) : boolean
|
||||
{
|
||||
return (symbol1 === symbol2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,9 +64,31 @@ module mod_vtm_aufbau
|
|||
*/
|
||||
public pruefen(angenommen : boolean, ausgabe : Array<typ_symbol>) : boolean
|
||||
{
|
||||
console.warn("not implemented");
|
||||
console.info(this.ausgabe);
|
||||
console.info(ausgabe);
|
||||
if (this.ausgabe.length !== ausgabe.length)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
let gleich : boolean = true;
|
||||
for (let index : int = 0; index < this.ausgabe.length; index += 1)
|
||||
{
|
||||
if (! symbol_vergleichen(this.ausgabe[index], ausgabe[index]))
|
||||
{
|
||||
console.info("ungleichheit bei Index " + index.toFixed(0));
|
||||
gleich = false;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// nichts tun
|
||||
}
|
||||
}
|
||||
return gleich;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,35 @@ jsonp_behandlung(
|
|||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"art": "akzeptor",
|
||||
"parameter": {
|
||||
"titel": "Abwechslung erfreuet",
|
||||
"text": "Annehmen genau dann wenn: Die Farben der Eingabe sich immer abwechseln",
|
||||
"tests": [
|
||||
{
|
||||
"eingabe": [],
|
||||
"annehmen": true
|
||||
},
|
||||
{
|
||||
"eingabe": [0],
|
||||
"annehmen": true
|
||||
},
|
||||
{
|
||||
"eingabe": [0,0],
|
||||
"annehmen": false
|
||||
},
|
||||
{
|
||||
"eingabe": [1,0,1],
|
||||
"annehmen": true
|
||||
},
|
||||
{
|
||||
"eingabe": [0,1,0,1,0,1],
|
||||
"annehmen": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"art": "transduktor",
|
||||
"parameter": {
|
||||
|
|
@ -73,7 +102,7 @@ jsonp_behandlung(
|
|||
"tests": [
|
||||
{
|
||||
"eingabe": [0,0,1,1,1,0,1,0,1,1,1,0,1],
|
||||
"ausgabe": [0,1,1,1,0,1,0,1,1,1,0,1,0],
|
||||
"ausgabe": [0,1,1,1,0,1,0,1,1,1,0,1,0]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -86,19 +115,36 @@ jsonp_behandlung(
|
|||
"tests": [
|
||||
{
|
||||
"eingabe": [0,0,0,1,0],
|
||||
"ausgabe": [0,0,0,0],
|
||||
"ausgabe": [0,0,0,0]
|
||||
},
|
||||
{
|
||||
"eingabe": [1,0,1,0,1],
|
||||
"ausgabe": [0,0,0],
|
||||
"ausgabe": [0,0,0]
|
||||
},
|
||||
{
|
||||
"eingabe": [1,1,1,1,0],
|
||||
"ausgabe": [0],
|
||||
"ausgabe": [0]
|
||||
},
|
||||
{
|
||||
"eingabe": [0,1,1,0,0,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,0,1,0,1],
|
||||
"ausgabe": [0,0,0,0,0,0,0,0,0],
|
||||
"ausgabe": [0,0,0,0,0,0,0,0,0]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"art": "transduktor",
|
||||
"parameter": {
|
||||
"titel": "Tauschen",
|
||||
"text": "alle ${s0} durch ${s2} ersetzen und alle ${s1} durch ${s3}",
|
||||
"tests": [
|
||||
{
|
||||
"eingabe": [0,1,1,0],
|
||||
"ausgabe": [2,3,3,2]
|
||||
},
|
||||
{
|
||||
"eingabe": [0,1,0,1,0,1,1,0,0,0,0,1,0,1,1,0],
|
||||
"ausgabe": [2,3,2,3,2,3,3,2,2,2,2,3,2,3,3,2]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
function aufgaben_laden(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe)=>void) : void
|
||||
function aufgaben_eintragen(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe)=>void) : void
|
||||
{
|
||||
let aufgaben_roh_ : schnittstelle_fehlermonade<Array<any>> = mod_vtm_daten.lesen("aufgaben");
|
||||
if (aufgaben_roh_.ist_schlicht())
|
||||
|
|
@ -29,13 +29,22 @@ function aufgaben_laden(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_aufg
|
|||
aufgaben_roh.forEach
|
||||
(
|
||||
(aufgabe_roh, index) =>
|
||||
{
|
||||
// Aufgabe registrieren
|
||||
{
|
||||
let aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe = mod_vtm_aufbau.aufgabe_erstellen(aufgabe_roh);
|
||||
mod_vtm_aufbau.aufgabe_registrieren(aufgabe);
|
||||
}
|
||||
// Option eintragen
|
||||
{
|
||||
let titel : string = aufgabe_roh["parameter"]["titel"];
|
||||
let value : string = index.toFixed(0);
|
||||
let dom_option : Element = document.createElement("option");
|
||||
dom_option.setAttribute("value", index.toFixed(0));
|
||||
dom_option.setAttribute("value", value);
|
||||
dom_option.textContent = titel;
|
||||
dom_auswahl.appendChild(dom_option);
|
||||
}
|
||||
}
|
||||
)
|
||||
;
|
||||
dom_auswahl.addEventListener
|
||||
|
|
@ -43,9 +52,9 @@ function aufgaben_laden(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_aufg
|
|||
"change",
|
||||
event =>
|
||||
{
|
||||
let index : int = dom_auswahl["value"];
|
||||
let aufgabe_roh : any = aufgaben_roh[index];
|
||||
let aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe = mod_vtm_aufbau.aufgabe_erstellen(aufgabe_roh);
|
||||
let value : string = dom_auswahl["value"];
|
||||
let index : int = parseInt(value);
|
||||
let aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe = mod_vtm_aufbau.aufgabe_holen(index);
|
||||
behandler(aufgabe);
|
||||
}
|
||||
)
|
||||
|
|
@ -64,79 +73,18 @@ function aufgaben_laden(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_aufg
|
|||
function haupt() : void
|
||||
{
|
||||
let aufbau : mod_vtm_aufbau.klasse_partie;
|
||||
let manifestationen : Array<any>;
|
||||
let aktualisieren = function () : void
|
||||
{
|
||||
manifestationen.forEach
|
||||
(
|
||||
manifestation =>
|
||||
{
|
||||
manifestation.darstellen();
|
||||
}
|
||||
);
|
||||
}
|
||||
;
|
||||
let intervall : any = null;
|
||||
aufgaben_laden
|
||||
(
|
||||
aufgabe =>
|
||||
let aufgabe_laden = function (aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe) : void
|
||||
{
|
||||
document.querySelector("#aufgabe_text").textContent = aufgabe.text();
|
||||
aufbau = (new mod_vtm_aufbau.klasse_partie(aufgabe));
|
||||
manifestationen = (
|
||||
[
|
||||
new mod_vtm_manifestation.klasse_web_partie(aufbau, document.querySelector("#bereich_mitte")),
|
||||
]
|
||||
let manifestation : mod_vtm_manifestation.klasse_manifestation<mod_vtm_aufbau.klasse_partie, void> = (
|
||||
new mod_vtm_manifestation.klasse_web_partie(aufbau, document.querySelector("#bereich_mitte"))
|
||||
);
|
||||
manifestationen.forEach
|
||||
(
|
||||
manifestation =>
|
||||
{
|
||||
manifestation.einrichten();
|
||||
}
|
||||
);
|
||||
aktualisieren();
|
||||
}
|
||||
)
|
||||
;
|
||||
document.querySelector("#knopf_testen").addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
intervall = setInterval
|
||||
(
|
||||
() =>
|
||||
{
|
||||
// console.log("-- tick");
|
||||
aufbau.fortfahren();
|
||||
let modus : mod_vtm_aufbau.typ_modus = aufbau.modus_lesen();
|
||||
if (modus <= 1)
|
||||
{
|
||||
// nichts tun
|
||||
}
|
||||
else
|
||||
{
|
||||
clearInterval(intervall); intervall = null;
|
||||
}
|
||||
aktualisieren();
|
||||
}
|
||||
,
|
||||
500
|
||||
)
|
||||
;
|
||||
}
|
||||
)
|
||||
;
|
||||
document.querySelector("#knopf_anhalten").addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
clearInterval(intervall); intervall = null;
|
||||
}
|
||||
)
|
||||
;
|
||||
aufgaben_eintragen(aufgabe_laden);
|
||||
aufgabe_laden(mod_vtm_aufbau.aufgabe_holen(0));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ module mod_vtm_manifestation
|
|||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export abstract class klasse_manifestation<typ_aufbau>
|
||||
export abstract class klasse_manifestation<typ_aufbau, typ_ausgabe>
|
||||
{
|
||||
|
||||
/**
|
||||
|
|
@ -43,7 +43,7 @@ module mod_vtm_manifestation
|
|||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
public abstract darstellen() : void;
|
||||
public abstract darstellen() : typ_ausgabe;
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,473 +0,0 @@
|
|||
/*
|
||||
* 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
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export class klasse_web_partie
|
||||
extends klasse_manifestation<mod_vtm_aufbau.klasse_partie>
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
private bereich : Element;
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
public constructor(aufbau : mod_vtm_aufbau.klasse_partie, bereich : Element)
|
||||
{
|
||||
super(aufbau);
|
||||
this.bereich = bereich;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public darstellen() : void
|
||||
{
|
||||
let knoten_rahmen = function () : mod_vtm_helfer.schnittstelle_xmlknoten
|
||||
{
|
||||
return (
|
||||
svg_pfad
|
||||
(
|
||||
mod_vtm_helfer.sequenz(6).map(i => mod_vtm_helfer.vektor_polar(((i+0.5)/6.0) * (2*Math.PI), 0.5)),
|
||||
true,
|
||||
{
|
||||
"class": "rahmen"
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
;
|
||||
let kinder_welt : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
// felder
|
||||
{
|
||||
let kinder_felder : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
this.aufbau.welt_lesen().felder_lesen().forEach
|
||||
(
|
||||
({"stelle": stelle, "aktor": aktor}) =>
|
||||
{
|
||||
let kinder_feld : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
if (aktor instanceof mod_vtm_aufbau.klasse_erzeuger)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let erzeuger : mod_vtm_aufbau.klasse_erzeuger = <mod_vtm_aufbau.klasse_erzeuger>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = erzeuger.richtung_lesen();
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
"erzeuger",
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
"rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")",
|
||||
"translate(-0.2, 0)",
|
||||
"scale(0.12)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_befoerderer)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let befoerderer : mod_vtm_aufbau.klasse_befoerderer = <mod_vtm_aufbau.klasse_befoerderer>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = befoerderer.richtung_lesen();
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
"neutral",
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
"rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")",
|
||||
"translate(-0.2, 0)",
|
||||
"scale(0.12)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_schreiber)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let schreiber : mod_vtm_aufbau.klasse_schreiber = <mod_vtm_aufbau.klasse_schreiber>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = schreiber.richtung_lesen();
|
||||
let symbol : mod_vtm_aufbau.typ_symbol = schreiber.symbol_lesen();
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
"symbol_" + symbol.toFixed(0),
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
"rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")",
|
||||
"translate(-0.2, 0)",
|
||||
"scale(0.12)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_leser)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let leser : mod_vtm_aufbau.klasse_leser = <mod_vtm_aufbau.klasse_leser>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = leser.richtung_lesen();
|
||||
let ausgaenge : Array<{summand : mod_vtm_aufbau.typ_richtung, symbol : schnittstelle_fehlermonade<mod_vtm_aufbau.typ_symbol>;}> =
|
||||
[
|
||||
{
|
||||
"summand": 0,
|
||||
"symbol": new klasse_nichts<mod_vtm_aufbau.typ_symbol>(),
|
||||
},
|
||||
{
|
||||
"summand": +2,
|
||||
"symbol": new klasse_schlicht<mod_vtm_aufbau.typ_symbol>(leser.symbol_links_lesen()),
|
||||
},
|
||||
{
|
||||
"summand": -2,
|
||||
"symbol": new klasse_schlicht<mod_vtm_aufbau.typ_symbol>(leser.symbol_rechts_lesen()),
|
||||
},
|
||||
]
|
||||
;
|
||||
ausgaenge.forEach
|
||||
(
|
||||
eintrag =>
|
||||
{
|
||||
let winkel : float = ((mod_vtm_aufbau.richtung_addieren(richtung, eintrag.summand) / 6.0) * 360);
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
(
|
||||
eintrag.symbol.ist_schlicht()
|
||||
? "symbol_" + eintrag.symbol.lesen().toFixed(0)
|
||||
: "neutral"
|
||||
),
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
|
||||
"rotate(" + winkel.toFixed(svg_float_praezission) + ")",
|
||||
"translate(0, 0)",
|
||||
"scale(0.1)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
)
|
||||
;
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_verwerfer)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let verwerfer : mod_vtm_aufbau.klasse_annehmer = <mod_vtm_aufbau.klasse_verwerfer>(aktor);
|
||||
let knoten_kreis : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": (0.0).toFixed(svg_float_praezission),
|
||||
"cy": (0.0).toFixed(svg_float_praezission),
|
||||
"r": (0.25).toFixed(svg_float_praezission),
|
||||
"class": (
|
||||
[
|
||||
"kreis",
|
||||
"negativ",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_kreis);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_annehmer)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let annehmer : mod_vtm_aufbau.klasse_annehmer = <mod_vtm_aufbau.klasse_annehmer>(aktor);
|
||||
let knoten_kreis : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": (0.0).toFixed(svg_float_praezission),
|
||||
"cy": (0.0).toFixed(svg_float_praezission),
|
||||
"r": (0.25).toFixed(svg_float_praezission),
|
||||
"class": (
|
||||
[
|
||||
"kreis",
|
||||
"positiv",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_kreis);
|
||||
}
|
||||
else
|
||||
{
|
||||
let meldung : string = ("unbehandelter Aktor-Typ");
|
||||
throw (new Error(meldung));
|
||||
}
|
||||
let position : typ_position = position_von_stelle(stelle);
|
||||
let knoten_feld : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "feld",
|
||||
"rel": mod_vtm_aufbau.stelle_hash(stelle),
|
||||
"transform": ("translate(" + position.x.toFixed(svg_float_praezission) + ", " + position.y.toFixed(svg_float_praezission) + ")"),
|
||||
},
|
||||
kinder_feld
|
||||
)
|
||||
);
|
||||
kinder_felder.push(knoten_feld);
|
||||
}
|
||||
)
|
||||
;
|
||||
let knoten_felder : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "felder",
|
||||
},
|
||||
kinder_felder
|
||||
)
|
||||
|
||||
);
|
||||
kinder_welt.push(knoten_felder);
|
||||
}
|
||||
// Figur
|
||||
{
|
||||
let figur_ : schnittstelle_fehlermonade<mod_vtm_aufbau.klasse_figur> = this.aufbau.figur_lesen();
|
||||
if (figur_.ist_schlicht())
|
||||
{
|
||||
let figur : mod_vtm_aufbau.klasse_figur = figur_.lesen();
|
||||
let kinder_figur : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
// Stein
|
||||
{
|
||||
let knoten_stein : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": (0.0).toFixed(svg_float_praezission),
|
||||
"cy": (0.0).toFixed(svg_float_praezission),
|
||||
"r": (0.125).toFixed(svg_float_praezission),
|
||||
"class": "stein",
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_figur.push(knoten_stein);
|
||||
}
|
||||
// Band
|
||||
{
|
||||
let band : Array<mod_vtm_aufbau.typ_symbol> = figur.band_lesen();
|
||||
let kinder_band : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
band.reduceRight
|
||||
(
|
||||
(dummy, symbol, index) =>
|
||||
{
|
||||
let r : float = 0.06125;
|
||||
let x : float = (+0.1+(2*r*1.25)*index);
|
||||
let y : float = (-0.1);
|
||||
let knoten_eintrag : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": x.toFixed(svg_float_praezission),
|
||||
"cy": y.toFixed(svg_float_praezission),
|
||||
"r": r.toFixed(svg_float_praezission),
|
||||
/*
|
||||
"x": (x-r).toFixed(svg_float_praezission),
|
||||
"y": (y-r).toFixed(svg_float_praezission),
|
||||
"width": (2*r).toFixed(svg_float_praezission),
|
||||
"height": (2*r).toFixed(svg_float_praezission),
|
||||
*/
|
||||
"class": (
|
||||
[
|
||||
"eintrag",
|
||||
"symbol_" + symbol.toFixed(0),
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_band.push(knoten_eintrag);
|
||||
return null;
|
||||
}
|
||||
,
|
||||
null
|
||||
)
|
||||
;
|
||||
let knoten_band = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "band",
|
||||
},
|
||||
kinder_band
|
||||
)
|
||||
);
|
||||
kinder_figur.push(knoten_band);
|
||||
}
|
||||
let position : typ_position = position_von_stelle(figur.stelle_lesen());
|
||||
let knoten_figur = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "figur",
|
||||
"transform": ("translate(" + position.x.toFixed(svg_float_praezission) + "," + position.y.toFixed(svg_float_praezission) + ")"),
|
||||
},
|
||||
kinder_figur
|
||||
)
|
||||
);
|
||||
kinder_welt.push(knoten_figur);
|
||||
}
|
||||
else
|
||||
{
|
||||
// nichts tun
|
||||
}
|
||||
}
|
||||
let knoten_welt : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "welt",
|
||||
},
|
||||
kinder_welt
|
||||
)
|
||||
);
|
||||
let knoten_svg : mod_vtm_helfer.schnittstelle_xmlknoten = mod_vtm_manifestation.svg_wurzel
|
||||
(
|
||||
-4, -4,
|
||||
+4, +4,
|
||||
800, 800,
|
||||
[knoten_welt]
|
||||
)
|
||||
;
|
||||
this.bereich.innerHTML = knoten_svg.darstellen();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public binden() : void
|
||||
{
|
||||
// Links-Klick
|
||||
this.bereich.addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
event.preventDefault();
|
||||
let dom_feld : Element = event.target["closest"](".feld");
|
||||
if (dom_feld == null)
|
||||
{
|
||||
console.info("-- kein Feld");
|
||||
}
|
||||
else
|
||||
{
|
||||
let rel : string = dom_feld.getAttribute("rel")
|
||||
let stelle : mod_vtm_aufbau.typ_stelle = mod_vtm_aufbau.stelle_von_hash(rel);
|
||||
this.aufbau.welt_lesen().feld_wechseln(stelle);
|
||||
this.darstellen();
|
||||
}
|
||||
}
|
||||
)
|
||||
;
|
||||
// Rechts-Klick
|
||||
this.bereich.addEventListener
|
||||
(
|
||||
"contextmenu",
|
||||
event =>
|
||||
{
|
||||
event.preventDefault();
|
||||
let dom_feld : Element = event.target["closest"](".feld");
|
||||
if (dom_feld == null)
|
||||
{
|
||||
console.info("-- kein Feld");
|
||||
}
|
||||
else
|
||||
{
|
||||
let rel : string = dom_feld.getAttribute("rel")
|
||||
let stelle : mod_vtm_aufbau.typ_stelle = mod_vtm_aufbau.stelle_von_hash(rel);
|
||||
this.aufbau.welt_lesen().feld_drehen(stelle);
|
||||
this.darstellen();
|
||||
}
|
||||
}
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
292
quelldatein/manifestation/svg/aktor.ts
Normal file
292
quelldatein/manifestation/svg/aktor.ts
Normal file
|
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
* 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
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export class klasse_svg_aktor
|
||||
extends klasse_manifestation<mod_vtm_aufbau.schnittstelle_aktor, mod_vtm_helfer.schnittstelle_xmlknoten>
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
private stelle : mod_vtm_aufbau.typ_stelle;
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
public constructor(aufbau : mod_vtm_aufbau.schnittstelle_aktor, stelle : mod_vtm_aufbau.typ_stelle)
|
||||
{
|
||||
super(aufbau);
|
||||
this.stelle = stelle;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public darstellen() : mod_vtm_helfer.schnittstelle_xmlknoten
|
||||
{
|
||||
let aktor : mod_vtm_aufbau.schnittstelle_aktor = this.aufbau;
|
||||
let knoten_rahmen = function () : mod_vtm_helfer.schnittstelle_xmlknoten
|
||||
{
|
||||
return (
|
||||
svg_pfad
|
||||
(
|
||||
mod_vtm_helfer.sequenz(6).map(i => mod_vtm_helfer.vektor_polar(((i+0.5)/6.0) * (2*Math.PI), 0.5)),
|
||||
true,
|
||||
{
|
||||
"class": "rahmen"
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
;
|
||||
let kinder_feld : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
if (aktor instanceof mod_vtm_aufbau.klasse_erzeuger)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let erzeuger : mod_vtm_aufbau.klasse_erzeuger = <mod_vtm_aufbau.klasse_erzeuger>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = erzeuger.richtung_lesen();
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
"erzeuger",
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
"rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")",
|
||||
"translate(-0.2, 0)",
|
||||
"scale(0.12)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_befoerderer)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let befoerderer : mod_vtm_aufbau.klasse_befoerderer = <mod_vtm_aufbau.klasse_befoerderer>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = befoerderer.richtung_lesen();
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
"neutral",
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
"rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")",
|
||||
"translate(-0.2, 0)",
|
||||
"scale(0.12)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_schreiber)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let schreiber : mod_vtm_aufbau.klasse_schreiber = <mod_vtm_aufbau.klasse_schreiber>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = schreiber.richtung_lesen();
|
||||
let symbol : mod_vtm_aufbau.typ_symbol = schreiber.symbol_lesen();
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
"symbol_" + symbol.toFixed(0),
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
"rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")",
|
||||
"translate(-0.2, 0)",
|
||||
"scale(0.12)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_leser)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let leser : mod_vtm_aufbau.klasse_leser = <mod_vtm_aufbau.klasse_leser>(aktor);
|
||||
let richtung : mod_vtm_aufbau.typ_richtung = leser.richtung_lesen();
|
||||
let ausgaenge : Array<{summand : mod_vtm_aufbau.typ_richtung, symbol : schnittstelle_fehlermonade<mod_vtm_aufbau.typ_symbol>;}> =
|
||||
[
|
||||
{
|
||||
"summand": 0,
|
||||
"symbol": new klasse_nichts<mod_vtm_aufbau.typ_symbol>(),
|
||||
},
|
||||
{
|
||||
"summand": +2,
|
||||
"symbol": new klasse_schlicht<mod_vtm_aufbau.typ_symbol>(leser.symbol_links_lesen()),
|
||||
},
|
||||
{
|
||||
"summand": -2,
|
||||
"symbol": new klasse_schlicht<mod_vtm_aufbau.typ_symbol>(leser.symbol_rechts_lesen()),
|
||||
},
|
||||
]
|
||||
;
|
||||
ausgaenge.forEach
|
||||
(
|
||||
eintrag =>
|
||||
{
|
||||
let winkel : float = ((mod_vtm_aufbau.richtung_addieren(richtung, eintrag.summand) / 6.0) * 360);
|
||||
let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"path",
|
||||
{
|
||||
"d": svg_form_pfeil,
|
||||
"class": (
|
||||
[
|
||||
"pfeil",
|
||||
(
|
||||
eintrag.symbol.ist_schlicht()
|
||||
? "symbol_" + eintrag.symbol.lesen().toFixed(0)
|
||||
: "neutral"
|
||||
),
|
||||
].join(" ")
|
||||
),
|
||||
"transform": (
|
||||
[
|
||||
|
||||
"rotate(" + winkel.toFixed(svg_float_praezission) + ")",
|
||||
"translate(0, 0)",
|
||||
"scale(0.1)",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_pfeil);
|
||||
}
|
||||
)
|
||||
;
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_verwerfer)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let verwerfer : mod_vtm_aufbau.klasse_annehmer = <mod_vtm_aufbau.klasse_verwerfer>(aktor);
|
||||
let knoten_kreis : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": (0.0).toFixed(svg_float_praezission),
|
||||
"cy": (0.0).toFixed(svg_float_praezission),
|
||||
"r": (0.25).toFixed(svg_float_praezission),
|
||||
"class": (
|
||||
[
|
||||
"kreis",
|
||||
"negativ",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_kreis);
|
||||
}
|
||||
else if (aktor instanceof mod_vtm_aufbau.klasse_annehmer)
|
||||
{
|
||||
kinder_feld.push(knoten_rahmen());
|
||||
let annehmer : mod_vtm_aufbau.klasse_annehmer = <mod_vtm_aufbau.klasse_annehmer>(aktor);
|
||||
let knoten_kreis : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": (0.0).toFixed(svg_float_praezission),
|
||||
"cy": (0.0).toFixed(svg_float_praezission),
|
||||
"r": (0.25).toFixed(svg_float_praezission),
|
||||
"class": (
|
||||
[
|
||||
"kreis",
|
||||
"positiv",
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_feld.push(knoten_kreis);
|
||||
}
|
||||
else
|
||||
{
|
||||
let meldung : string = ("unbehandelter Aktor-Typ");
|
||||
throw (new Error(meldung));
|
||||
}
|
||||
let position : typ_position = position_von_stelle(this.stelle);
|
||||
let knoten_feld : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "feld",
|
||||
"rel": mod_vtm_aufbau.stelle_hash(this.stelle),
|
||||
"transform": ("translate(" + position.x.toFixed(svg_float_praezission) + ", " + position.y.toFixed(svg_float_praezission) + ")"),
|
||||
},
|
||||
kinder_feld
|
||||
)
|
||||
);
|
||||
return knoten_feld;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public binden() : void
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
142
quelldatein/manifestation/svg/figur.ts
Normal file
142
quelldatein/manifestation/svg/figur.ts
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* 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
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export class klasse_svg_figur
|
||||
extends klasse_manifestation<mod_vtm_aufbau.klasse_figur, mod_vtm_helfer.schnittstelle_xmlknoten>
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
public constructor(aufbau : mod_vtm_aufbau.klasse_figur)
|
||||
{
|
||||
super(aufbau);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public darstellen() : mod_vtm_helfer.schnittstelle_xmlknoten
|
||||
{
|
||||
let figur : mod_vtm_aufbau.klasse_figur = this.aufbau;
|
||||
let kinder_figur : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
// Stein
|
||||
{
|
||||
let knoten_stein : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": (0.0).toFixed(svg_float_praezission),
|
||||
"cy": (0.0).toFixed(svg_float_praezission),
|
||||
"r": (0.125).toFixed(svg_float_praezission),
|
||||
"class": "stein",
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_figur.push(knoten_stein);
|
||||
}
|
||||
// Band
|
||||
{
|
||||
let band : Array<mod_vtm_aufbau.typ_symbol> = figur.band_lesen();
|
||||
let kinder_band : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
band.reduceRight
|
||||
(
|
||||
(dummy, symbol, index) =>
|
||||
{
|
||||
let r : float = 0.06125;
|
||||
let x : float = (+0.1+(2*r*1.25)*index);
|
||||
let y : float = (-0.1);
|
||||
let knoten_eintrag : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"circle",
|
||||
{
|
||||
"cx": x.toFixed(svg_float_praezission),
|
||||
"cy": y.toFixed(svg_float_praezission),
|
||||
"r": r.toFixed(svg_float_praezission),
|
||||
/*
|
||||
"x": (x-r).toFixed(svg_float_praezission),
|
||||
"y": (y-r).toFixed(svg_float_praezission),
|
||||
"width": (2*r).toFixed(svg_float_praezission),
|
||||
"height": (2*r).toFixed(svg_float_praezission),
|
||||
*/
|
||||
"class": (
|
||||
[
|
||||
"eintrag",
|
||||
"symbol_" + symbol.toFixed(0),
|
||||
].join(" ")
|
||||
),
|
||||
}
|
||||
)
|
||||
);
|
||||
kinder_band.push(knoten_eintrag);
|
||||
return null;
|
||||
}
|
||||
,
|
||||
null
|
||||
)
|
||||
;
|
||||
let knoten_band = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "band",
|
||||
},
|
||||
kinder_band
|
||||
)
|
||||
);
|
||||
kinder_figur.push(knoten_band);
|
||||
}
|
||||
let position : typ_position = position_von_stelle(figur.stelle_lesen());
|
||||
let knoten_figur = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "figur",
|
||||
"transform": ("translate(" + position.x.toFixed(svg_float_praezission) + "," + position.y.toFixed(svg_float_praezission) + ")"),
|
||||
},
|
||||
kinder_figur
|
||||
)
|
||||
);
|
||||
return knoten_figur;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public binden() : void
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
126
quelldatein/manifestation/svg/partie.ts
Normal file
126
quelldatein/manifestation/svg/partie.ts
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* 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
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export class klasse_svg_partie
|
||||
extends klasse_manifestation<mod_vtm_aufbau.klasse_partie, mod_vtm_helfer.schnittstelle_xmlknoten>
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
public constructor(aufbau : mod_vtm_aufbau.klasse_partie)
|
||||
{
|
||||
super(aufbau);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public darstellen() : mod_vtm_helfer.schnittstelle_xmlknoten
|
||||
{
|
||||
let kinder_partie : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
// Welt
|
||||
{
|
||||
let kinder_welt : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
// Felder
|
||||
{
|
||||
let kinder_felder : Array<mod_vtm_helfer.schnittstelle_xmlknoten> = [];
|
||||
this.aufbau.welt_lesen().felder_lesen().forEach
|
||||
(
|
||||
({"stelle": stelle, "aktor": aktor}) =>
|
||||
{
|
||||
let manifestation_feld : klasse_manifestation<mod_vtm_aufbau.schnittstelle_aktor, mod_vtm_helfer.schnittstelle_xmlknoten> = new klasse_svg_aktor(aktor, stelle);
|
||||
let knoten_feld : mod_vtm_helfer.schnittstelle_xmlknoten = manifestation_feld.darstellen();
|
||||
kinder_felder.push(knoten_feld);
|
||||
}
|
||||
)
|
||||
;
|
||||
let knoten_felder : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "felder",
|
||||
},
|
||||
kinder_felder
|
||||
)
|
||||
|
||||
);
|
||||
kinder_welt.push(knoten_felder);
|
||||
}
|
||||
// Figur
|
||||
{
|
||||
let figur_ : schnittstelle_fehlermonade<mod_vtm_aufbau.klasse_figur> = this.aufbau.figur_lesen();
|
||||
if (figur_.ist_schlicht())
|
||||
{
|
||||
let figur : mod_vtm_aufbau.klasse_figur = figur_.lesen();
|
||||
let manifestation_figur : klasse_manifestation<mod_vtm_aufbau.klasse_figur, mod_vtm_helfer.schnittstelle_xmlknoten> = (new klasse_svg_figur(figur));
|
||||
let knoten_figur : mod_vtm_helfer.schnittstelle_xmlknoten = manifestation_figur.darstellen();
|
||||
kinder_welt.push(knoten_figur);
|
||||
}
|
||||
else
|
||||
{
|
||||
// nichts tun
|
||||
}
|
||||
}
|
||||
let knoten_welt : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "welt",
|
||||
},
|
||||
kinder_welt
|
||||
)
|
||||
);
|
||||
kinder_partie.push(knoten_welt);
|
||||
}
|
||||
let knoten_partie : mod_vtm_helfer.schnittstelle_xmlknoten = (
|
||||
new mod_vtm_helfer.klasse_xmlknoten_normal
|
||||
(
|
||||
"g",
|
||||
{
|
||||
"class": "partie",
|
||||
},
|
||||
kinder_partie
|
||||
)
|
||||
);
|
||||
return knoten_partie;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public binden() : void
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
276
quelldatein/manifestation/web/partie.ts
Normal file
276
quelldatein/manifestation/web/partie.ts
Normal file
|
|
@ -0,0 +1,276 @@
|
|||
/*
|
||||
* 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
|
||||
{
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
*/
|
||||
export class klasse_web_partie
|
||||
extends klasse_manifestation<mod_vtm_aufbau.klasse_partie, void>
|
||||
{
|
||||
|
||||
/**
|
||||
* @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.klasse_partie, bereich : Element)
|
||||
{
|
||||
super(aufbau);
|
||||
this.bereich = bereich;
|
||||
this.intervall = (new klasse_nichts<any>());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public darstellen() : void
|
||||
{
|
||||
// Zeichnung aktualisieren
|
||||
{
|
||||
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();
|
||||
}
|
||||
// Status
|
||||
{
|
||||
let status : string;
|
||||
switch (this.aufbau.modus_lesen())
|
||||
{
|
||||
case mod_vtm_aufbau.modus_initial:
|
||||
{
|
||||
status = "Rechts 'Testen' drücken zum Prüfen der Maschine";
|
||||
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:
|
||||
{
|
||||
status = "scheinbar korrekt :)";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
let meldung : string = "unbehandelter Modus";
|
||||
throw (new Error(meldung));
|
||||
break;
|
||||
}
|
||||
}
|
||||
document.querySelector("#aufgabe_status").textContent = status;
|
||||
}
|
||||
// Knöpfe anzeigen/ausblenden
|
||||
{
|
||||
document.querySelector("#knoepfe").setAttribute
|
||||
(
|
||||
"class",
|
||||
(
|
||||
(this.aufbau.modus_lesen() === mod_vtm_aufbau.modus_initial)
|
||||
? "initial"
|
||||
: (
|
||||
this.intervall.ist_schlicht()
|
||||
? "testen_laufend"
|
||||
: "testen_stehend"
|
||||
)
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @author kcf <vidofnir@folksprak.org>
|
||||
* @implementation
|
||||
*/
|
||||
public binden() : void
|
||||
{
|
||||
// Links-Klick
|
||||
this.bereich.addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
event.preventDefault();
|
||||
if (this.aufbau.modus_lesen() === mod_vtm_aufbau.modus_initial)
|
||||
{
|
||||
let dom_feld : Element = event.target["closest"](".feld");
|
||||
if (dom_feld == null)
|
||||
{
|
||||
console.info("-- kein Feld");
|
||||
}
|
||||
else
|
||||
{
|
||||
let rel : string = dom_feld.getAttribute("rel")
|
||||
let stelle : mod_vtm_aufbau.typ_stelle = mod_vtm_aufbau.stelle_von_hash(rel);
|
||||
this.aufbau.welt_lesen().feld_wechseln(stelle);
|
||||
this.darstellen();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
console.info("-- nicht zur Bearbeitung freigegeben");
|
||||
}
|
||||
}
|
||||
)
|
||||
;
|
||||
// Rechts-Klick
|
||||
this.bereich.addEventListener
|
||||
(
|
||||
"contextmenu",
|
||||
event =>
|
||||
{
|
||||
event.preventDefault();
|
||||
if (this.aufbau.modus_lesen() === mod_vtm_aufbau.modus_initial)
|
||||
{
|
||||
let dom_feld : Element = event.target["closest"](".feld");
|
||||
if (dom_feld == null)
|
||||
{
|
||||
console.info("-- kein Feld");
|
||||
}
|
||||
else
|
||||
{
|
||||
let rel : string = dom_feld.getAttribute("rel")
|
||||
let stelle : mod_vtm_aufbau.typ_stelle = mod_vtm_aufbau.stelle_von_hash(rel);
|
||||
this.aufbau.welt_lesen().feld_drehen(stelle);
|
||||
this.darstellen();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
console.info("-- nicht zur Bearbeitung freigegeben");
|
||||
}
|
||||
}
|
||||
)
|
||||
;
|
||||
// Testen
|
||||
document.querySelector("#knopf_testen").addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
this.intervall = (
|
||||
new klasse_schlicht<any>
|
||||
(
|
||||
setInterval
|
||||
(
|
||||
() =>
|
||||
{
|
||||
this.aufbau.fortfahren();
|
||||
let modus : mod_vtm_aufbau.typ_modus = this.aufbau.modus_lesen();
|
||||
if (modus <= 1)
|
||||
{
|
||||
// nichts tun
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.intervall.ist_schlicht())
|
||||
{
|
||||
clearInterval(this.intervall.lesen());
|
||||
this.intervall = (new klasse_nichts<int>());
|
||||
this.darstellen();
|
||||
}
|
||||
else
|
||||
{
|
||||
let meldung : string = "kein Intervall gesetzt";
|
||||
console.warn(meldung);
|
||||
}
|
||||
}
|
||||
this.darstellen();
|
||||
}
|
||||
,
|
||||
500
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
)
|
||||
;
|
||||
// Anhalten
|
||||
document.querySelector("#knopf_anhalten").addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
if (this.intervall.ist_schlicht())
|
||||
{
|
||||
clearInterval(this.intervall.lesen());
|
||||
this.intervall = (new klasse_nichts<int>());
|
||||
this.darstellen();
|
||||
}
|
||||
else
|
||||
{
|
||||
let meldung : string = "kein Intervall gesetzt";
|
||||
console.warn(meldung);
|
||||
}
|
||||
}
|
||||
)
|
||||
;
|
||||
// Bearbeiten
|
||||
document.querySelector("#knopf_bearbeiten").addEventListener
|
||||
(
|
||||
"click",
|
||||
event =>
|
||||
{
|
||||
if (this.intervall.ist_schlicht())
|
||||
{
|
||||
clearInterval(this.intervall.lesen());
|
||||
this.intervall = (new klasse_nichts<int>());
|
||||
}
|
||||
else
|
||||
{
|
||||
// nichts tun
|
||||
}
|
||||
this.aufbau.zuruecksetzen();
|
||||
this.darstellen();
|
||||
}
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -12,7 +12,7 @@ html
|
|||
body
|
||||
{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
padding: 8px;
|
||||
height: 100%;
|
||||
|
||||
background-color: hsl(120, 0%, 6.125%);
|
||||
|
|
@ -23,6 +23,12 @@ a
|
|||
{
|
||||
color: hsl(120, 50%, 50%);
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a:hover
|
||||
{
|
||||
color: hsl(120, 50%, 75%);
|
||||
}
|
||||
|
||||
body > header
|
||||
|
|
@ -31,7 +37,19 @@ body > header
|
|||
margin: 8px;
|
||||
}
|
||||
|
||||
#inhalt
|
||||
#radio_hilfe,
|
||||
#radio_spiel
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
#radio_hilfe:checked ~ #hilfe {}
|
||||
#radio_hilfe:checked ~ #spiel {display: none;}
|
||||
|
||||
#radio_spiel:checked ~ #hilfe {display: none;}
|
||||
#radio_spiel:checked ~ #spiel {}
|
||||
|
||||
#spiel
|
||||
{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
|
@ -77,3 +95,15 @@ body > header
|
|||
font-size: 150%;
|
||||
}
|
||||
|
||||
#knoepfe.initial > #knopf_testen {}
|
||||
#knoepfe.initial > #knopf_anhalten {display: none;}
|
||||
#knoepfe.initial > #knopf_bearbeiten {display: none;}
|
||||
|
||||
#knoepfe.testen_laufend > #knopf_testen {display: none;}
|
||||
#knoepfe.testen_laufend > #knopf_anhalten {}
|
||||
#knoepfe.testen_laufend > #knopf_bearbeiten {}
|
||||
|
||||
#knoepfe.testen_stehend > #knopf_testen {}
|
||||
#knoepfe.testen_stehend > #knopf_anhalten {display: none;}
|
||||
#knoepfe.testen_stehend > #knopf_bearbeiten {}
|
||||
|
||||
|
|
@ -3,30 +3,33 @@
|
|||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<script type="text/javascript" src="vtm.js"></script>
|
||||
<script type="text/javascript" src="aufgaben.dat.js"></script>
|
||||
<script type="text/javascript" src="daten.js"></script>
|
||||
<script type="text/javascript">eingang_web();</script>
|
||||
<link rel="stylesheet" type="text/css" href="vtm.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<header>Verrückte Turing-Maschinen</header>
|
||||
<div id="inhalt">
|
||||
<label for="radio_hilfe"><a>Hilfe</a></label><input type="radio" name="tab" id="radio_hilfe"/>
|
||||
<label for="radio_spiel"><a>Spiel</a></label><input type="radio" name="tab" id="radio_spiel" checked="checked"/>
|
||||
<hr/>
|
||||
<div id="spiel">
|
||||
<div class="bereich" id="bereich_links">
|
||||
<label for="aufgabe_auswahl">Aufgabe auswählen</label>
|
||||
<select id="aufgabe_auswahl"></select>
|
||||
<p id="aufgabe_text"></p>
|
||||
<span id="aufgabe_status"></span>
|
||||
</div>
|
||||
<div class="bereich" id="bereich_mitte">
|
||||
</div>
|
||||
<div class="bereich" id="bereich_rechts">
|
||||
<div id="knoepfe">
|
||||
<button id="knopf_bearbeiten">Bearbeiten</button>
|
||||
<button id="knopf_testen">Testen</button>
|
||||
<button id="knopf_anhalten">Anhalten</button>
|
||||
<button id="knopf_bearbeiten">Bearbeiten</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="hilfe">
|
||||
<header>Erklärung</header>
|
||||
<p>Dieses Spiel ist inspiriert von <a href="http://www.kongregate.com/games/PleasingFungus/manufactoria">Manufacturia</a> und <a href="http://www.crazy-machines.com/">Crazy Machines</a>.</p>
|
||||
<section>
|
||||
<header>Steuerung</header>
|
||||
Loading…
Reference in a new issue