From da3cf639bdab0a9d5fb8e6a53f8b30750e3a4204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Thu, 9 Nov 2017 21:57:35 +0100 Subject: [PATCH] sicherung --- dokumente/bildschirmfoto.png | Bin 0 -> 60267 bytes makefile | 2 + quelldatein/aufbau/aktor.ts | 2 +- quelldatein/aufbau/annehmer.ts | 2 +- quelldatein/aufbau/befoerderer.ts | 4 +- quelldatein/aufbau/erzeuger.ts | 4 +- quelldatein/aufbau/leser.ts | 4 +- quelldatein/aufbau/modus.ts | 37 +++ quelldatein/aufbau/partie.ts | 129 ++++++++-- quelldatein/aufbau/schreiber.ts | 4 +- quelldatein/aufbau/transduktortest.ts | 3 - quelldatein/aufbau/verwerfer.ts | 2 +- quelldatein/aufbau/welt.ts | 8 +- quelldatein/daten/aufgaben.dat.js | 79 +++++- quelldatein/haupt.ts | 9 +- quelldatein/helfer/verschiedenes.ts | 19 ++ quelldatein/manifestation/svg/aktor.ts | 4 +- quelldatein/manifestation/web/partie.css | 4 + quelldatein/manifestation/web/partie.ts | 290 ++++++++++++++++------- quelldatein/manifestation/web/vtm.html | 8 +- 20 files changed, 486 insertions(+), 128 deletions(-) create mode 100644 dokumente/bildschirmfoto.png create mode 100644 quelldatein/aufbau/modus.ts diff --git a/dokumente/bildschirmfoto.png b/dokumente/bildschirmfoto.png new file mode 100644 index 0000000000000000000000000000000000000000..eee5af5e15bb0f271919e668de89a8d508639a75 GIT binary patch literal 60267 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 */ - drehen() : void; + drehen(inkrement ?: int) : void; /** diff --git a/quelldatein/aufbau/annehmer.ts b/quelldatein/aufbau/annehmer.ts index 94947de..d97046a 100644 --- a/quelldatein/aufbau/annehmer.ts +++ b/quelldatein/aufbau/annehmer.ts @@ -38,7 +38,7 @@ module mod_vtm_aufbau * @author kcf * @implementation */ - public drehen() : void + public drehen(inkrement ?: int) : void { } diff --git a/quelldatein/aufbau/befoerderer.ts b/quelldatein/aufbau/befoerderer.ts index 5781185..37882b1 100644 --- a/quelldatein/aufbau/befoerderer.ts +++ b/quelldatein/aufbau/befoerderer.ts @@ -54,9 +54,9 @@ module mod_vtm_aufbau * @author kcf * @implementation */ - public drehen() : void + public drehen(inkrement : int = +1) : void { - this.richtung = richtung_addieren(this.richtung, +1); + this.richtung = richtung_addieren(this.richtung, inkrement); } diff --git a/quelldatein/aufbau/erzeuger.ts b/quelldatein/aufbau/erzeuger.ts index da4f095..b849415 100644 --- a/quelldatein/aufbau/erzeuger.ts +++ b/quelldatein/aufbau/erzeuger.ts @@ -54,9 +54,9 @@ module mod_vtm_aufbau * @author kcf * @implementation */ - public drehen() : void + public drehen(inkrement : int = +1) : void { - this.richtung = richtung_addieren(this.richtung, +1); + this.richtung = richtung_addieren(this.richtung, inkrement); } diff --git a/quelldatein/aufbau/leser.ts b/quelldatein/aufbau/leser.ts index 00c0d84..39af600 100644 --- a/quelldatein/aufbau/leser.ts +++ b/quelldatein/aufbau/leser.ts @@ -86,9 +86,9 @@ module mod_vtm_aufbau * @author kcf * @implementation */ - public drehen() : void + public drehen(inkrement : int = +1) : void { - this.richtung = richtung_addieren(this.richtung, +1); + this.richtung = richtung_addieren(this.richtung, inkrement); } diff --git a/quelldatein/aufbau/modus.ts b/quelldatein/aufbau/modus.ts new file mode 100644 index 0000000..2d3612d --- /dev/null +++ b/quelldatein/aufbau/modus.ts @@ -0,0 +1,37 @@ +/* + * 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_aufbau + { + + /** + * @author kcf + */ + export type typ_modus = int; + + + /** + * @author kcf + */ + export const modus_initial = 0; + export const modus_ungewiss = 1; + export const modus_fehlerhaft = 2; + export const modus_korrekt = 3; + + } + diff --git a/quelldatein/aufbau/partie.ts b/quelldatein/aufbau/partie.ts index d18c39c..49c0da1 100644 --- a/quelldatein/aufbau/partie.ts +++ b/quelldatein/aufbau/partie.ts @@ -19,21 +19,6 @@ module mod_vtm_aufbau { - /** - * @author kcf - */ - export type typ_modus = int; - - - /** - * @author kcf - */ - export const modus_initial = 0; - export const modus_ungewiss = 1; - export const modus_fehlerhaft = 2; - export const modus_korrekt = 3; - - /** * @author kcf */ @@ -70,6 +55,12 @@ module mod_vtm_aufbau private modus : typ_modus; + /** + * @author kcf + */ + private lauscher : {[ereignis : string] : Array<(angaben ?: any)=>void>}; + + /** * @author kcf */ @@ -84,6 +75,62 @@ module mod_vtm_aufbau this.figur = (new klasse_nichts()); this.testindex = (new klasse_nichts()); this.modus = modus_initial; + this.lauscher = { + "aenderung_aufgabe": [], + "aenderung_welt": [], + "aenderung_figur": [], + "aenderung_modus": [], + }; + } + + + /** + * @author kcf + */ + public lauschen(ereignis : string, prozedur : (angaben ?: any)=>void) : void + { + if (ereignis in this.lauscher) + { + this.lauscher[ereignis].push(prozedur); + } + else + { + let meldung : string = "kein Ereignis mit diesem Name"; + throw (new Error(meldung)); + } + } + + + /** + * @author kcf + */ + private benachrichtigen(ereignis : string, angaben : any = {}) : void + { + if (ereignis in this.lauscher) + { + this.lauscher[ereignis].forEach + ( + prozedur => + { + prozedur(angaben); + } + ) + ; + } + else + { + let meldung : string = "kein Ereignis mit diesem Name"; + throw (new Error(meldung)); + } + } + + + /** + * @author kcf + */ + public aufgabe_lesen() : schnittstelle_aufgabe + { + return this.aufgabe; } @@ -122,6 +169,42 @@ module mod_vtm_aufbau this.figur = (new klasse_nichts()); this.testindex = (new klasse_nichts()); this.modus = modus_initial; + this.benachrichtigen("aenderung_figur", {}); + this.benachrichtigen("aenderung_modus", {}); + } + + + /** + * @author kcf + */ + public welt_feld_wechseln(stelle : typ_stelle, umgekehrt : boolean = false) : void + { + if (! (this.modus === mod_vtm_aufbau.modus_initial)) + { + let meldung : string = "gesperrt"; + } + else + { + this.welt.feld_wechseln(stelle, umgekehrt); + this.benachrichtigen("aenderung_welt", {}); + } + } + + + /** + * @author kcf + */ + public welt_feld_drehen(stelle : typ_stelle, inkrement : int = +1) : void + { + if (! (this.modus === mod_vtm_aufbau.modus_initial)) + { + let meldung : string = "gesperrt"; + } + else + { + this.welt.feld_drehen(stelle, inkrement); + this.benachrichtigen("aenderung_welt", {}); + } } @@ -136,6 +219,7 @@ module mod_vtm_aufbau { this.modus = modus_ungewiss; this.testindex = (new klasse_schlicht(0)); + this.benachrichtigen("aenderung_modus", {}); break; } case modus_ungewiss: @@ -146,7 +230,17 @@ module mod_vtm_aufbau let testindex : int = this.testindex.lesen(); let test : schnittstelle_test = tests[testindex]; let stelle : typ_stelle = this.welt.erzeuger_finden(); - this.figur = (new klasse_schlicht(new klasse_figur(test.eingabe(), stelle))); + this.figur = ( + new klasse_schlicht + ( + new klasse_figur + ( + mod_vtm_helfer.liste_kopieren(test.eingabe()), + stelle + ) + ) + ); + this.benachrichtigen("aenderung_figur", {}); } else { @@ -171,6 +265,7 @@ module mod_vtm_aufbau if (! test.pruefen(angenommen, ausgabe)) { this.modus = modus_fehlerhaft; + this.benachrichtigen("aenderung_modus", {}); } else { @@ -180,6 +275,7 @@ module mod_vtm_aufbau // auf Modus "korrekt" wechseln this.testindex = (new klasse_nichts()); this.modus = modus_korrekt; + this.benachrichtigen("aenderung_modus", {}); } else { @@ -193,6 +289,7 @@ module mod_vtm_aufbau let meldung : string = "unbehandelter Zustand"; throw (new Error(meldung)); } + this.benachrichtigen("aenderung_figur", {}); } break; } diff --git a/quelldatein/aufbau/schreiber.ts b/quelldatein/aufbau/schreiber.ts index 545ee8a..7205992 100644 --- a/quelldatein/aufbau/schreiber.ts +++ b/quelldatein/aufbau/schreiber.ts @@ -70,9 +70,9 @@ module mod_vtm_aufbau * @author kcf * @implementation */ - public drehen() : void + public drehen(inkrement : int = +1) : void { - this.richtung = richtung_addieren(this.richtung, +1); + this.richtung = richtung_addieren(this.richtung, inkrement); } diff --git a/quelldatein/aufbau/transduktortest.ts b/quelldatein/aufbau/transduktortest.ts index 4ea46ac..28c8ba3 100644 --- a/quelldatein/aufbau/transduktortest.ts +++ b/quelldatein/aufbau/transduktortest.ts @@ -64,8 +64,6 @@ module mod_vtm_aufbau */ public pruefen(angenommen : boolean, ausgabe : Array) : boolean { -console.info(this.ausgabe); -console.info(ausgabe); if (this.ausgabe.length !== ausgabe.length) { return false; @@ -77,7 +75,6 @@ console.info(ausgabe); { if (! symbol_vergleichen(this.ausgabe[index], ausgabe[index])) { -console.info("ungleichheit bei Index " + index.toFixed(0)); gleich = false; break; } diff --git a/quelldatein/aufbau/verwerfer.ts b/quelldatein/aufbau/verwerfer.ts index ae2cdde..9b1afde 100644 --- a/quelldatein/aufbau/verwerfer.ts +++ b/quelldatein/aufbau/verwerfer.ts @@ -38,7 +38,7 @@ module mod_vtm_aufbau * @author kcf * @implementation */ - public drehen() : void + public drehen(inkrement ?: int) : void { } diff --git a/quelldatein/aufbau/welt.ts b/quelldatein/aufbau/welt.ts index 8ac22c0..f3b3aab 100644 --- a/quelldatein/aufbau/welt.ts +++ b/quelldatein/aufbau/welt.ts @@ -79,7 +79,7 @@ module mod_vtm_aufbau /** * @author kcf */ - public feld_wechseln(stelle : typ_stelle) : void + public feld_wechseln(stelle : typ_stelle, umgekehrt : boolean = false) : void { let erweitert : boolean = true; let liste : Array<{pruefer : (aktor : schnittstelle_aktor)=>boolean; ersteller : ()=>schnittstelle_aktor;}> = ( @@ -198,7 +198,7 @@ module mod_vtm_aufbau // console.warn(meldung); index = 0; } - let aktor_neu : schnittstelle_aktor = liste[mod_vtm_helfer.mod(index+1, liste.length)].ersteller(); + let aktor_neu : schnittstelle_aktor = liste[mod_vtm_helfer.mod(index + (umgekehrt ? -1 : +1), liste.length)].ersteller(); this.feld_setzen(stelle, aktor_neu); } @@ -206,12 +206,12 @@ module mod_vtm_aufbau /** * @author kcf */ - public feld_drehen(stelle : typ_stelle) : void + public feld_drehen(stelle : typ_stelle, inkrement : int = +1) : void { let aktor_ : schnittstelle_fehlermonade = this.felder.holen(stelle); if (aktor_.ist_schlicht) { - aktor_.lesen().drehen(); + aktor_.lesen().drehen(inkrement); } else { diff --git a/quelldatein/daten/aufgaben.dat.js b/quelldatein/daten/aufgaben.dat.js index a3092c4..5187a9a 100644 --- a/quelldatein/daten/aufgaben.dat.js +++ b/quelldatein/daten/aufgaben.dat.js @@ -110,24 +110,37 @@ jsonp_behandlung( { "art": "transduktor", "parameter": { - "titel": "Filter", - "text": "aus der Eingabe alle ${s0} beibehalten und alle ${s1} entfernen", + "titel": "An den Anfang", + "text": "die Eingabe, aber mit dem letzten Symbol am Anfang", + "tests": [ + { + "eingabe": [0,0,1,1,1,0,1,0,1,1,1,0,1], + "ausgabe": [1,0,0,1,1,1,0,1,0,1,1,1,0] + } + ] + } + }, + { + "art": "transduktor", + "parameter": { + "titel": "Wählerisch", + "text": "aus der Eingabe alle ${s0} entfernen und alle ${s1} beibehalten", "tests": [ { "eingabe": [0,0,0,1,0], - "ausgabe": [0,0,0,0] + "ausgabe": [1] }, { "eingabe": [1,0,1,0,1], - "ausgabe": [0,0,0] + "ausgabe": [1,1,1] }, { "eingabe": [1,1,1,1,0], - "ausgabe": [0] + "ausgabe": [1,1,1,1] }, { "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": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } ] } @@ -148,6 +161,60 @@ jsonp_behandlung( } ] } + }, + { + "art": "akzeptor", + "parameter": { + "titel": "ungerade Zahlen", + "text": "Mit ${s0} als 0 und ${s1} als 1, nur ungerade Zahlen", + "tests": [ + { + "eingabe": [], + "annehmen": false + }, + { + "eingabe": [], + "annehmen": false + }, + { + "eingabe": [], + "annehmen": false + }, + { + "eingabe": [], + "annehmen": false + } + ] + } + }, + { + "art": "akzeptor", + "parameter": { + "titel": "a^n b^n", + "text": "Jaja, die berühmt berüchtige Sprache, die sich mit einem endlichen Automaten nicht erkennen lässt … Das ist deine Chance zu zeigen, dass dieses Ding hier mehr ist als so ein kümmerlicher DEA … und das ganz ohne Kellerspeicher! Also: Eine beliebige Anzahl an ${s0}, dann die gleiche Anzahl an ${s1}!", + "tests": [ + { + "eingabe": [], + "annehmen": true + }, + { + "eingabe": [0], + "annehmen": false + }, + { + "eingabe": [0,0,1,1], + "annehmen": true + }, + { + "eingabe": [0,0,0,1,1], + "annehmen": false + }, + { + "eingabe": [0,0,0,0,0,0,0,1,1,1,1,1,1,1], + "annehmen": true + } + ] + } } ] } diff --git a/quelldatein/haupt.ts b/quelldatein/haupt.ts index c80e731..4d5dc61 100644 --- a/quelldatein/haupt.ts +++ b/quelldatein/haupt.ts @@ -37,7 +37,13 @@ function aufgaben_eintragen(behandler : (aufgabe : mod_vtm_aufbau.schnittstelle_ } // Option eintragen { - let titel : string = aufgabe_roh["parameter"]["titel"]; + let praefix : string = ( + { + "akzeptor": "AKZ", + "transduktor": "TRA", + }[aufgabe_roh["art"]] + ); + let titel : string = ("[" + praefix + "]" + " " + aufgabe_roh["parameter"]["titel"]); let value : string = index.toFixed(0); let dom_option : Element = document.createElement("option"); dom_option.setAttribute("value", value); @@ -75,7 +81,6 @@ function haupt() : void let aufbau : mod_vtm_aufbau.klasse_partie; 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)); let manifestation : mod_vtm_manifestation.klasse_manifestation = ( new mod_vtm_manifestation.klasse_web_partie(aufbau, document.querySelector("#bereich_mitte")) diff --git a/quelldatein/helfer/verschiedenes.ts b/quelldatein/helfer/verschiedenes.ts index b617960..49f4cc1 100644 --- a/quelldatein/helfer/verschiedenes.ts +++ b/quelldatein/helfer/verschiedenes.ts @@ -27,5 +27,24 @@ module mod_vtm_helfer return ((laenge <= 0) ? [] : sequenz(laenge-1).concat([laenge-1])); } + + /** + * @author kcf + */ + export function liste_kopieren(liste : Array, element_kopieren : (element : type_element)=>type_element = (x => x)) : Array + { + let liste_ : Array = []; + liste.forEach + ( + element => + { + let element_ : type_element = element_kopieren(element); + liste_.push(element); + } + ) + ; + return liste_; + } + } diff --git a/quelldatein/manifestation/svg/aktor.ts b/quelldatein/manifestation/svg/aktor.ts index cdea020..bec12c5 100644 --- a/quelldatein/manifestation/svg/aktor.ts +++ b/quelldatein/manifestation/svg/aktor.ts @@ -198,8 +198,8 @@ module mod_vtm_manifestation [ "rotate(" + winkel.toFixed(svg_float_praezission) + ")", - "translate(0, 0)", - "scale(0.1)", + "translate(0.1, 0)", + "scale(0.075)", ].join(" ") ), } diff --git a/quelldatein/manifestation/web/partie.css b/quelldatein/manifestation/web/partie.css index 01faa51..6ad5845 100644 --- a/quelldatein/manifestation/web/partie.css +++ b/quelldatein/manifestation/web/partie.css @@ -28,21 +28,25 @@ .symbol_0 { fill: hsl(000.0000000000000, 50%, 50%); + background-color: hsl(000.0000000000000, 50%, 50%); } .symbol_1 { fill: hsl(222.4922359499621, 50%, 50%); + background-color: hsl(222.4922359499621, 50%, 50%); } .symbol_2 { fill: hsl(084.9844718999243, 50%, 50%); + background-color: hsl(084.9844718999243, 50%, 50%); } .symbol_3 { fill: hsl(307.4767078498864, 50%, 50%); + background-color: hsl(307.4767078498864, 50%, 50%); } .kreis diff --git a/quelldatein/manifestation/web/partie.ts b/quelldatein/manifestation/web/partie.ts index 30198ec..6fb2f5e 100644 --- a/quelldatein/manifestation/web/partie.ts +++ b/quelldatein/manifestation/web/partie.ts @@ -19,6 +19,16 @@ module mod_vtm_manifestation { + /** + * @author kcf + */ + function text_nachbearbeiten(text : string) : string + { + let regexp : RegExp = (new RegExp("\\$\{s(\\d*)\}", "g")); + return text.replace(regexp, " "); + } + + /** * @author kcf */ @@ -46,61 +56,152 @@ module mod_vtm_manifestation super(aufbau); this.bereich = bereich; this.intervall = (new klasse_nichts()); + this.aufbau.lauschen + ( + "aenderung_welt", + (angaben) => + { + this.erneuern_welt(); + } + ) + ; } /** * @author kcf - * @implementation + * @override */ - public darstellen() : void + public einrichten() : void + { + this.aufbau.lauschen + ( + "aenderung_aufgabe", + (angaben) => + { + this.erneuern_aufgabe(); + } + ) + ; + this.aufbau.lauschen + ( + "aenderung_welt", + (angaben) => + { + this.erneuern_welt(); + } + ) + ; + this.aufbau.lauschen + ( + "aenderung_figur", + (angaben) => + { + this.erneuern_figur(); + } + ) + ; + this.aufbau.lauschen + ( + "aenderung_modus", + (angaben) => + { + this.erneuern_modus(); + } + ) + ; + this.darstellen(); + this.binden(); + } + + + /** + * @author kcf + */ + private erneuern_aufgabe() : void + { + document.querySelector("#aufgabe_text").innerHTML = text_nachbearbeiten(this.aufbau.aufgabe_lesen().text()); + } + + + /** + * @author kcf + */ + private erneuern_welt() : void + { + let knoten_svg : mod_vtm_helfer.schnittstelle_xmlknoten = mod_vtm_manifestation.svg_wurzel + ( + -4, -4, + +4, +4, + 800, 800, + [new klasse_svg_partie(this.aufbau).darstellen()] + ) + ; + this.bereich.innerHTML = knoten_svg.darstellen(); + } + + + /** + * @author kcf + */ + private erneuern_figur() : void + { + let knoten_svg : mod_vtm_helfer.schnittstelle_xmlknoten = mod_vtm_manifestation.svg_wurzel + ( + -4, -4, + +4, +4, + 800, 800, + [new klasse_svg_partie(this.aufbau).darstellen()] + ) + ; + this.bereich.innerHTML = knoten_svg.darstellen(); + } + + + /** + * @author kcf + */ + private erneuern_modus() : void + { + let status : string; + switch (this.aufbau.modus_lesen()) + { + case mod_vtm_aufbau.modus_initial: + { + status = "Maschine aufbauen"; + break; + } + case mod_vtm_aufbau.modus_ungewiss: + { + status = "wird geprüft …"; + break; + } + case mod_vtm_aufbau.modus_fehlerhaft: + { + status = "fehlerhaft :/"; + break; + } + case mod_vtm_aufbau.modus_korrekt: + { + status = "scheinbar korrekt :)"; + break; + } + default: + { + let meldung : string = "unbehandelter Modus"; + throw (new Error(meldung)); + break; + } + } + document.querySelector("#aufgabe_status").textContent = status; + } + + + /** + * @author kcf + */ + public erneuern_knoepfe() : 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 @@ -121,12 +222,42 @@ module mod_vtm_manifestation } + /** + * @author kcf + * @implementation + */ + public darstellen() : void + { + this.erneuern_aufgabe(); + this.erneuern_welt(); + this.erneuern_figur(); + this.erneuern_modus(); + this.erneuern_knoepfe(); + } + + /** * @author kcf * @implementation */ public binden() : void { + let stelle_ermitteln = (target : EventTarget) => + { + let stelle : schnittstelle_fehlermonade; + let dom_feld : Element = target["closest"](".feld"); + if (dom_feld == null) + { + stelle = (new klasse_nichts()); + } + else + { + let rel : string = dom_feld.getAttribute("rel") + stelle = (new klasse_schlicht(mod_vtm_aufbau.stelle_von_hash(rel))); + } + return stelle; + } + ; // Links-Klick this.bereich.addEventListener ( @@ -134,24 +265,14 @@ module mod_vtm_manifestation event => { event.preventDefault(); - if (this.aufbau.modus_lesen() === mod_vtm_aufbau.modus_initial) + let stelle_ : schnittstelle_fehlermonade = stelle_ermitteln(event.target); + if (stelle_.ist_schlicht()) { - 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(); - } + this.aufbau.welt_feld_wechseln(stelle_.lesen(), true); } else { - console.info("-- nicht zur Bearbeitung freigegeben"); + console.info("-- kein Feld"); } } ) @@ -163,24 +284,34 @@ module mod_vtm_manifestation event => { event.preventDefault(); - if (this.aufbau.modus_lesen() === mod_vtm_aufbau.modus_initial) + let stelle_ : schnittstelle_fehlermonade = stelle_ermitteln(event.target); + if (stelle_.ist_schlicht()) { - 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(); - } + this.aufbau.welt_feld_wechseln(stelle_.lesen(), false); } else { - console.info("-- nicht zur Bearbeitung freigegeben"); + console.info("-- kein Feld"); + } + } + ) + ; + // Mausrad + this.bereich.addEventListener + ( + "wheel", + event => + { + event.preventDefault(); + let stelle_ : schnittstelle_fehlermonade = stelle_ermitteln(event.target); + if (stelle_.ist_schlicht()) + { + let inkrement : int = ((event["deltaY"] < 0) ? -1 : +1); + this.aufbau.welt_feld_drehen(stelle_.lesen(), inkrement); + } + else + { + console.info("-- kein Feld"); } } ) @@ -210,7 +341,6 @@ module mod_vtm_manifestation { clearInterval(this.intervall.lesen()); this.intervall = (new klasse_nichts()); - this.darstellen(); } else { @@ -218,7 +348,7 @@ module mod_vtm_manifestation console.warn(meldung); } } - this.darstellen(); + this.erneuern_knoepfe(); } , 500 @@ -238,13 +368,13 @@ module mod_vtm_manifestation { clearInterval(this.intervall.lesen()); this.intervall = (new klasse_nichts()); - this.darstellen(); } else { let meldung : string = "kein Intervall gesetzt"; console.warn(meldung); } + this.erneuern_knoepfe(); } ) ; @@ -264,7 +394,7 @@ module mod_vtm_manifestation // nichts tun } this.aufbau.zuruecksetzen(); - this.darstellen(); + this.erneuern_knoepfe(); } ) ; diff --git a/quelldatein/manifestation/web/vtm.html b/quelldatein/manifestation/web/vtm.html index c7fab4d..c21c6f4 100644 --- a/quelldatein/manifestation/web/vtm.html +++ b/quelldatein/manifestation/web/vtm.html @@ -17,11 +17,11 @@

-
+
@@ -30,12 +30,12 @@
-

Dieses Spiel ist inspiriert von Manufacturia und Crazy Machines.

+

Dieses Spiel ist inspiriert von Manufacturia, Crazy Machines, World of Goo … und auch von unvergessenen Stunden Hardware-Praktikum im Informatik-Studium :P

Steuerung
    -
  • Links-Klick: Feldtyp wechseln
  • -
  • Rechts-Klick: Feld drehen
  • +
  • Links-Klick/Rechts-Klick: Feldtyp wechseln
  • +
  • Mausrad-Drehen: Feld drehen