diff --git a/makefile b/makefile index e5ba112..2d90e5a 100644 --- a/makefile +++ b/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 diff --git a/quelldatein/aufbau/aufgabe_.ts b/quelldatein/aufbau/aufgabe_.ts index 93ba475..efca4d4 100644 --- a/quelldatein/aufbau/aufgabe_.ts +++ b/quelldatein/aufbau/aufgabe_.ts @@ -19,6 +19,12 @@ module mod_vtm_aufbau { + /** + * @author kcf + */ + var _liste : Array = []; + + /** * @author kcf */ @@ -65,5 +71,23 @@ module mod_vtm_aufbau } } + + /** + * @author kcf + */ + export function aufgabe_registrieren(aufgabe : schnittstelle_aufgabe) : void + { + _liste.push(aufgabe); + } + + + /** + * @author kcf + */ + export function aufgabe_holen(index : int) : schnittstelle_aufgabe + { + return _liste[index]; + } + } diff --git a/quelldatein/aufbau/leser.ts b/quelldatein/aufbau/leser.ts index e380bf9..00c0d84 100644 --- a/quelldatein/aufbau/leser.ts +++ b/quelldatein/aufbau/leser.ts @@ -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 diff --git a/quelldatein/aufbau/partie.ts b/quelldatein/aufbau/partie.ts index 5ee64e2..d18c39c 100644 --- a/quelldatein/aufbau/partie.ts +++ b/quelldatein/aufbau/partie.ts @@ -76,13 +76,12 @@ module mod_vtm_aufbau public constructor ( aufgabe : schnittstelle_aufgabe, - welt : klasse_welt = klasse_welt.blanko(), - figur : schnittstelle_fehlermonade = new klasse_nichts() + welt : klasse_welt = klasse_welt.blanko() ) { this.aufgabe = aufgabe; this.welt = welt; - this.figur = figur; + this.figur = (new klasse_nichts()); this.testindex = (new klasse_nichts()); this.modus = modus_initial; } @@ -115,6 +114,17 @@ module mod_vtm_aufbau } + /** + * @author kcf + */ + public zuruecksetzen() : void + { + this.figur = (new klasse_nichts()); + this.testindex = (new klasse_nichts()); + this.modus = modus_initial; + } + + /** * @author kcf */ diff --git a/quelldatein/aufbau/symbol.ts b/quelldatein/aufbau/symbol.ts index 3e69243..e5b2cc7 100644 --- a/quelldatein/aufbau/symbol.ts +++ b/quelldatein/aufbau/symbol.ts @@ -24,5 +24,14 @@ module mod_vtm_aufbau */ export type typ_symbol = int; + + /** + * @author kcf + */ + export function symbol_vergleichen(symbol1 : typ_symbol, symbol2 : typ_symbol) : boolean + { + return (symbol1 === symbol2); + } + } diff --git a/quelldatein/aufbau/transduktortest.ts b/quelldatein/aufbau/transduktortest.ts index 10a1f4c..4ea46ac 100644 --- a/quelldatein/aufbau/transduktortest.ts +++ b/quelldatein/aufbau/transduktortest.ts @@ -64,8 +64,30 @@ module mod_vtm_aufbau */ public pruefen(angenommen : boolean, ausgabe : Array) : boolean { - console.warn("not implemented"); - return false; +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; + } } } diff --git a/quelldatein/daten/aufgaben.dat.js b/quelldatein/daten/aufgaben.dat.js index 89061bb..a3092c4 100644 --- a/quelldatein/daten/aufgaben.dat.js +++ b/quelldatein/daten/aufgaben.dat.js @@ -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] } ] } diff --git a/quelldatein/haupt.ts b/quelldatein/haupt.ts index bd5a25b..c80e731 100644 --- a/quelldatein/haupt.ts +++ b/quelldatein/haupt.ts @@ -19,7 +19,7 @@ /** * @author kcf */ -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> = mod_vtm_daten.lesen("aufgaben"); if (aufgaben_roh_.ist_schlicht()) @@ -30,11 +30,20 @@ function aufgaben_laden(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_aufg ( (aufgabe_roh, index) => { - let titel : string = aufgabe_roh["parameter"]["titel"]; - let dom_option : Element = document.createElement("option"); - dom_option.setAttribute("value", index.toFixed(0)); - dom_option.textContent = titel; - dom_auswahl.appendChild(dom_option); + // 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", value); + dom_option.textContent = titel; + dom_auswahl.appendChild(dom_option); + } } ) ; @@ -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; - let aktualisieren = function () : void + let aufgabe_laden = function (aufgabe : mod_vtm_aufbau.schnittstelle_aufgabe) : void { - manifestationen.forEach - ( - manifestation => - { - manifestation.darstellen(); - } - ); + document.querySelector("#aufgabe_text").textContent = aufgabe.text(); + aufbau = (new mod_vtm_aufbau.klasse_partie(aufgabe)); + let manifestation : mod_vtm_manifestation.klasse_manifestation = ( + new mod_vtm_manifestation.klasse_web_partie(aufbau, document.querySelector("#bereich_mitte")) + ); + manifestation.einrichten(); } ; - let intervall : any = null; - aufgaben_laden - ( - aufgabe => - { - 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")), - ] - ); - 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)); } diff --git a/quelldatein/manifestation/manifestation.ts b/quelldatein/manifestation/manifestation.ts index 6d88c01..72653ee 100644 --- a/quelldatein/manifestation/manifestation.ts +++ b/quelldatein/manifestation/manifestation.ts @@ -22,7 +22,7 @@ module mod_vtm_manifestation /** * @author kcf */ - export abstract class klasse_manifestation + export abstract class klasse_manifestation { /** @@ -43,7 +43,7 @@ module mod_vtm_manifestation /** * @author kcf */ - public abstract darstellen() : void; + public abstract darstellen() : typ_ausgabe; /** diff --git a/quelldatein/manifestation/partie.ts b/quelldatein/manifestation/partie.ts deleted file mode 100644 index 1c848dc..0000000 --- a/quelldatein/manifestation/partie.ts +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß - * - * 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 . - */ - -module mod_vtm_manifestation - { - - /** - * @author kcf - */ - export class klasse_web_partie - extends klasse_manifestation - { - - /** - * @author kcf - */ - private bereich : Element; - - - /** - * @author kcf - */ - public constructor(aufbau : mod_vtm_aufbau.klasse_partie, bereich : Element) - { - super(aufbau); - this.bereich = bereich; - } - - - /** - * @author kcf - * @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 = []; - // felder - { - let kinder_felder : Array = []; - this.aufbau.welt_lesen().felder_lesen().forEach - ( - ({"stelle": stelle, "aktor": aktor}) => - { - let kinder_feld : Array = []; - if (aktor instanceof mod_vtm_aufbau.klasse_erzeuger) - { - kinder_feld.push(knoten_rahmen()); - let 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 = (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 = (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 = (aktor); - let richtung : mod_vtm_aufbau.typ_richtung = leser.richtung_lesen(); - let ausgaenge : Array<{summand : mod_vtm_aufbau.typ_richtung, symbol : schnittstelle_fehlermonade;}> = - [ - { - "summand": 0, - "symbol": new klasse_nichts(), - }, - { - "summand": +2, - "symbol": new klasse_schlicht(leser.symbol_links_lesen()), - }, - { - "summand": -2, - "symbol": new klasse_schlicht(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 = (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 = (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 = this.aufbau.figur_lesen(); - if (figur_.ist_schlicht()) - { - let figur : mod_vtm_aufbau.klasse_figur = figur_.lesen(); - let kinder_figur : Array = []; - // 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 = figur.band_lesen(); - let kinder_band : Array = []; - 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 - * @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(); - } - } - ) - ; - } - - } - - } - diff --git a/quelldatein/manifestation/svg/aktor.ts b/quelldatein/manifestation/svg/aktor.ts new file mode 100644 index 0000000..cdea020 --- /dev/null +++ b/quelldatein/manifestation/svg/aktor.ts @@ -0,0 +1,292 @@ +/* + * Verrückte Turing-Maschinen — A turing complete game + * Copyright (C) 2016 Christian Fraß + * + * 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 . + */ + +module mod_vtm_manifestation + { + + /** + * @author kcf + */ + export class klasse_svg_aktor + extends klasse_manifestation + { + + /** + * @author kcf + */ + private stelle : mod_vtm_aufbau.typ_stelle; + + + /** + * @author kcf + */ + public constructor(aufbau : mod_vtm_aufbau.schnittstelle_aktor, stelle : mod_vtm_aufbau.typ_stelle) + { + super(aufbau); + this.stelle = stelle; + } + + + /** + * @author kcf + * @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 = []; + if (aktor instanceof mod_vtm_aufbau.klasse_erzeuger) + { + kinder_feld.push(knoten_rahmen()); + let 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 = (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 = (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 = (aktor); + let richtung : mod_vtm_aufbau.typ_richtung = leser.richtung_lesen(); + let ausgaenge : Array<{summand : mod_vtm_aufbau.typ_richtung, symbol : schnittstelle_fehlermonade;}> = + [ + { + "summand": 0, + "symbol": new klasse_nichts(), + }, + { + "summand": +2, + "symbol": new klasse_schlicht(leser.symbol_links_lesen()), + }, + { + "summand": -2, + "symbol": new klasse_schlicht(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 = (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 = (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 + * @implementation + */ + public binden() : void + { + } + + } + + } + diff --git a/quelldatein/manifestation/svg/figur.ts b/quelldatein/manifestation/svg/figur.ts new file mode 100644 index 0000000..d7f85f0 --- /dev/null +++ b/quelldatein/manifestation/svg/figur.ts @@ -0,0 +1,142 @@ +/* + * Verrückte Turing-Maschinen — A turing complete game + * Copyright (C) 2016 Christian Fraß + * + * 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 . + */ + +module mod_vtm_manifestation + { + + /** + * @author kcf + */ + export class klasse_svg_figur + extends klasse_manifestation + { + + /** + * @author kcf + */ + public constructor(aufbau : mod_vtm_aufbau.klasse_figur) + { + super(aufbau); + } + + + /** + * @author kcf + * @implementation + */ + public darstellen() : mod_vtm_helfer.schnittstelle_xmlknoten + { + let figur : mod_vtm_aufbau.klasse_figur = this.aufbau; + let kinder_figur : Array = []; + // 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 = figur.band_lesen(); + let kinder_band : Array = []; + 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 + * @implementation + */ + public binden() : void + { + } + + } + + } + diff --git a/quelldatein/manifestation/svg/partie.ts b/quelldatein/manifestation/svg/partie.ts new file mode 100644 index 0000000..2407e68 --- /dev/null +++ b/quelldatein/manifestation/svg/partie.ts @@ -0,0 +1,126 @@ +/* + * Verrückte Turing-Maschinen — A turing complete game + * Copyright (C) 2016 Christian Fraß + * + * 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 . + */ + +module mod_vtm_manifestation + { + + /** + * @author kcf + */ + export class klasse_svg_partie + extends klasse_manifestation + { + + /** + * @author kcf + */ + public constructor(aufbau : mod_vtm_aufbau.klasse_partie) + { + super(aufbau); + } + + + /** + * @author kcf + * @implementation + */ + public darstellen() : mod_vtm_helfer.schnittstelle_xmlknoten + { + let kinder_partie : Array = []; + // Welt + { + let kinder_welt : Array = []; + // Felder + { + let kinder_felder : Array = []; + this.aufbau.welt_lesen().felder_lesen().forEach + ( + ({"stelle": stelle, "aktor": aktor}) => + { + let manifestation_feld : klasse_manifestation = 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 = this.aufbau.figur_lesen(); + if (figur_.ist_schlicht()) + { + let figur : mod_vtm_aufbau.klasse_figur = figur_.lesen(); + let manifestation_figur : klasse_manifestation = (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 + * @implementation + */ + public binden() : void + { + } + + } + + } + diff --git a/quelldatein/manifestation/partie.css b/quelldatein/manifestation/web/partie.css similarity index 100% rename from quelldatein/manifestation/partie.css rename to quelldatein/manifestation/web/partie.css diff --git a/quelldatein/manifestation/web/partie.ts b/quelldatein/manifestation/web/partie.ts new file mode 100644 index 0000000..30198ec --- /dev/null +++ b/quelldatein/manifestation/web/partie.ts @@ -0,0 +1,276 @@ +/* + * Verrückte Turing-Maschinen — A turing complete game + * Copyright (C) 2016 Christian Fraß + * + * 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 . + */ + +module mod_vtm_manifestation + { + + /** + * @author kcf + */ + export class klasse_web_partie + extends klasse_manifestation + { + + /** + * @author kcf + */ + private bereich : Element; + + + /** + * @author kcf + */ + private intervall : schnittstelle_fehlermonade; + + + /** + * @author kcf + */ + public constructor(aufbau : mod_vtm_aufbau.klasse_partie, bereich : Element) + { + super(aufbau); + this.bereich = bereich; + this.intervall = (new klasse_nichts()); + } + + + /** + * @author kcf + * @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 + * @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 + ( + 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()); + 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()); + 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()); + } + else + { + // nichts tun + } + this.aufbau.zuruecksetzen(); + this.darstellen(); + } + ) + ; + } + + } + + } + diff --git a/quelldatein/manifestation/vtm.css b/quelldatein/manifestation/web/vtm.css similarity index 54% rename from quelldatein/manifestation/vtm.css rename to quelldatein/manifestation/web/vtm.css index f406dfb..322146a 100644 --- a/quelldatein/manifestation/vtm.css +++ b/quelldatein/manifestation/web/vtm.css @@ -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 {} + diff --git a/quelldatein/manifestation/vtm.html b/quelldatein/manifestation/web/vtm.html similarity index 92% rename from quelldatein/manifestation/vtm.html rename to quelldatein/manifestation/web/vtm.html index 4464112..c7fab4d 100644 --- a/quelldatein/manifestation/vtm.html +++ b/quelldatein/manifestation/web/vtm.html @@ -3,30 +3,33 @@ - +
Verrückte Turing-Maschinen
-
+ + +
+
- +
-
Erklärung

Dieses Spiel ist inspiriert von Manufacturia und Crazy Machines.

Steuerung