From 95ff0c95b30797c4cfd34143b9272dbd1b729cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Thu, 29 Mar 2018 01:13:39 +0200 Subject: [PATCH] restructuring --- .gitignore | 3 +- documents/screenshot.png | Bin 0 -> 34522 bytes dokumente/bildschirmfoto.png | Bin 60267 -> 0 bytes hilfe.md | 55 ----- makefile | 147 ++++++------- quelldatein/daten/zeichenketten/de.dat.js | 55 ----- quelldatein/daten/zeichenketten/en.dat.js | 55 ----- quelldatein/manifestation/svg/_svg.ts | 163 -------------- readme.md | 13 +- quelldatein/daten.ts => source/data/_data.ts | 2 +- source/data/strings/de.dat.js | 78 +++++++ source/data/strings/en.dat.js | 59 +++++ .../data/tasks.dat.js | 35 +-- .../aufruf.ts => source/helpers/call.ts | 2 +- .../helpers/errormonade.ts | 2 +- .../helfer => source/helpers}/hashmap.ts | 2 +- .../mathematik.ts => source/helpers/math.ts | 2 +- .../helpers/misc.ts | 2 +- source/helpers/string.ts | 54 +++++ source/helpers/svg.ts | 153 +++++++++++++ .../brauch.ts => source/helpers/trait.ts | 2 +- .../helpers/translate.ts | 2 +- .../typen.ts => source/helpers/types.ts | 2 +- .../vektor.ts => source/helpers/vector.ts | 2 +- {quelldatein/helfer => source/helpers}/xml.ts | 24 +-- .../web/vtm.html => source/main.html | 44 ++-- .../web/vtm.scss => source/main.scss | 79 +++++-- quelldatein/haupt.ts => source/main.ts | 84 ++++---- .../manifestation/manifestation.ts | 2 +- .../manifestation/position.ts | 4 +- .../manifestation/store/game.ts | 68 +++--- .../manifestation/svg/actuators/_actuator.ts | 10 +- .../manifestation/svg/actuators/acceptor.ts | 10 +- .../manifestation/svg/actuators/conveyer.ts | 12 +- .../manifestation/svg/actuators/generator.ts | 14 +- .../manifestation/svg/actuators/reader.ts | 12 +- .../manifestation/svg/actuators/rejector.ts | 10 +- .../manifestation/svg/actuators/writer.ts | 12 +- .../manifestation/svg/game.ts | 44 ++-- .../manifestation/svg/token.ts | 28 +-- .../manifestation/web/game.scss | 4 +- .../manifestation/web/game.ts | 203 +++++++++--------- .../model/actuators/_actuator.ts | 2 +- .../model/actuators/acceptor.ts | 22 +- .../model/actuators/conveyer.ts | 36 ++-- .../model/actuators/generator.ts | 32 +-- .../model/actuators/reader.ts | 48 ++--- .../model/actuators/rejector.ts | 22 +- .../model/actuators/writer.ts | 40 ++-- .../richtung.ts => source/model/direction.ts | 2 +- .../aufbau/partie.ts => source/model/game.ts | 152 ++++++------- .../aufbau/modus.ts => source/model/mode.ts | 2 +- .../aufbau/stelle.ts => source/model/spot.ts | 8 +- .../zustand.ts => source/model/state.ts | 2 +- .../aufbau => source/model}/symbol.ts | 2 +- .../model/tasks/acceptortask.ts | 12 +- .../model/tasks/acceptortest.ts | 2 +- .../aufgabe.ts => source/model/tasks/task.ts | 34 +-- .../aufgaben => source/model/tasks}/test.ts | 12 +- .../model/tasks/transducertask.ts | 38 ++-- .../model/tasks/transducertest.ts | 20 +- .../aufbau/figur.ts => source/model/token.ts | 4 +- .../aufbau/welt.ts => source/model/world.ts | 40 ++-- werkzeuge/bauen.sh => tools/build.sh | 0 werkzeuge/zuruecksetzen.sh => tools/reset.sh | 0 werkzeuge/ausrollen.sh => tools/rollout.sh | 0 66 files changed, 1055 insertions(+), 1031 deletions(-) create mode 100644 documents/screenshot.png delete mode 100644 dokumente/bildschirmfoto.png delete mode 100644 hilfe.md delete mode 100644 quelldatein/daten/zeichenketten/de.dat.js delete mode 100644 quelldatein/daten/zeichenketten/en.dat.js delete mode 100644 quelldatein/manifestation/svg/_svg.ts rename quelldatein/daten.ts => source/data/_data.ts (95%) create mode 100644 source/data/strings/de.dat.js create mode 100644 source/data/strings/en.dat.js rename quelldatein/daten/aufgaben.dat.js => source/data/tasks.dat.js (62%) rename quelldatein/helfer/aufruf.ts => source/helpers/call.ts (96%) rename quelldatein/helfer/fehlermonade.ts => source/helpers/errormonade.ts (97%) rename {quelldatein/helfer => source/helpers}/hashmap.ts (97%) rename quelldatein/helfer/mathematik.ts => source/helpers/math.ts (93%) rename quelldatein/helfer/verschiedenes.ts => source/helpers/misc.ts (95%) create mode 100644 source/helpers/string.ts create mode 100644 source/helpers/svg.ts rename quelldatein/helfer/brauch.ts => source/helpers/trait.ts (96%) rename quelldatein/helfer/uebersetzung.ts => source/helpers/translate.ts (98%) rename quelldatein/helfer/typen.ts => source/helpers/types.ts (92%) rename quelldatein/helfer/vektor.ts => source/helpers/vector.ts (95%) rename {quelldatein/helfer => source/helpers}/xml.ts (86%) rename quelldatein/manifestation/web/vtm.html => source/main.html (84%) rename quelldatein/manifestation/web/vtm.scss => source/main.scss (66%) rename quelldatein/haupt.ts => source/main.ts (64%) rename {quelldatein => source}/manifestation/manifestation.ts (97%) rename {quelldatein => source}/manifestation/position.ts (90%) rename quelldatein/manifestation/speicher/partie.ts => source/manifestation/store/game.ts (69%) rename quelldatein/manifestation/svg/aktor/_aktor.ts => source/manifestation/svg/actuators/_actuator.ts (94%) rename quelldatein/manifestation/svg/aktor/annehmer.ts => source/manifestation/svg/actuators/acceptor.ts (85%) rename quelldatein/manifestation/svg/aktor/befoerderer.ts => source/manifestation/svg/actuators/conveyer.ts (86%) rename quelldatein/manifestation/svg/aktor/erzeuger.ts => source/manifestation/svg/actuators/generator.ts (85%) rename quelldatein/manifestation/svg/aktor/leser.ts => source/manifestation/svg/actuators/reader.ts (91%) rename quelldatein/manifestation/svg/aktor/verwerfer.ts => source/manifestation/svg/actuators/rejector.ts (85%) rename quelldatein/manifestation/svg/aktor/schreiber.ts => source/manifestation/svg/actuators/writer.ts (86%) rename quelldatein/manifestation/svg/partie.ts => source/manifestation/svg/game.ts (76%) rename quelldatein/manifestation/svg/figur.ts => source/manifestation/svg/token.ts (84%) rename quelldatein/manifestation/web/partie.scss => source/manifestation/web/game.scss (96%) rename quelldatein/manifestation/web/partie.ts => source/manifestation/web/game.ts (66%) rename quelldatein/aufbau/aktoren/_aktor.ts => source/model/actuators/_actuator.ts (97%) rename quelldatein/aufbau/aktoren/annehmer.ts => source/model/actuators/acceptor.ts (88%) rename quelldatein/aufbau/aktoren/befoerderer.ts => source/model/actuators/conveyer.ts (81%) rename quelldatein/aufbau/aktoren/erzeuger.ts => source/model/actuators/generator.ts (84%) rename quelldatein/aufbau/aktoren/leser.ts => source/model/actuators/reader.ts (84%) rename quelldatein/aufbau/aktoren/verwerfer.ts => source/model/actuators/rejector.ts (88%) rename quelldatein/aufbau/aktoren/schreiber.ts => source/model/actuators/writer.ts (82%) rename quelldatein/aufbau/richtung.ts => source/model/direction.ts (95%) rename quelldatein/aufbau/partie.ts => source/model/game.ts (71%) rename quelldatein/aufbau/modus.ts => source/model/mode.ts (94%) rename quelldatein/aufbau/stelle.ts => source/model/spot.ts (91%) rename quelldatein/aufbau/zustand.ts => source/model/state.ts (94%) rename {quelldatein/aufbau => source/model}/symbol.ts (95%) rename quelldatein/aufbau/aufgaben/akzeptoraufgabe.ts => source/model/tasks/acceptortask.ts (92%) rename quelldatein/aufbau/aufgaben/akzeptortest.ts => source/model/tasks/acceptortest.ts (96%) rename quelldatein/aufbau/aufgaben/aufgabe.ts => source/model/tasks/task.ts (81%) rename {quelldatein/aufbau/aufgaben => source/model/tasks}/test.ts (89%) rename quelldatein/aufbau/aufgaben/transduktoraufgabe.ts => source/model/tasks/transducertask.ts (69%) rename quelldatein/aufbau/aufgaben/transduktortest.ts => source/model/tasks/transducertest.ts (81%) rename quelldatein/aufbau/figur.ts => source/model/token.ts (96%) rename quelldatein/aufbau/welt.ts => source/model/world.ts (87%) rename werkzeuge/bauen.sh => tools/build.sh (100%) rename werkzeuge/zuruecksetzen.sh => tools/reset.sh (100%) rename werkzeuge/ausrollen.sh => tools/rollout.sh (100%) diff --git a/.gitignore b/.gitignore index 1418c59..dc84959 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -erzeugnis +build/ + diff --git a/documents/screenshot.png b/documents/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6fffa54956d5e9e1c22b258956eba19cc109d2 GIT binary patch literal 34522 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 $@ -${dir_erzeugnis}/vtm.dat.js: \ - ${dir_quelldatein}/daten/aufgaben.dat.js \ - ${dir_quelldatein}/daten/zeichenketten/de.dat.js \ - ${dir_quelldatein}/daten/zeichenketten/en.dat.js - @ ${cmd_echo} "-- Daten …" - @ ${cmd_md} ${dir_erzeugnis} +${dir_build}/vtm.dat.js: \ + ${dir_source}/data/strings/de.dat.js \ + ${dir_source}/data/strings/en.dat.js \ + ${dir_source}/data/tasks.dat.js + @ ${cmd_echo} "-- data …" + @ ${cmd_md} ${dir_build} @ ${cmd_cat} $^ > $@ -${dir_erzeugnis}/vtm.js: \ - ${dir_quelldatein}/helfer/typen.ts \ - ${dir_quelldatein}/helfer/aufruf.ts \ - ${dir_quelldatein}/helfer/brauch.ts \ - ${dir_quelldatein}/helfer/fehlermonade.ts \ - ${dir_quelldatein}/helfer/xml.ts \ - ${dir_quelldatein}/helfer/verschiedenes.ts \ - ${dir_quelldatein}/helfer/mathematik.ts \ - ${dir_quelldatein}/helfer/vektor.ts \ - ${dir_quelldatein}/helfer/hashmap.ts \ - ${dir_quelldatein}/helfer/uebersetzung.ts \ - ${dir_quelldatein}/daten.ts \ - ${dir_quelldatein}/aufbau/richtung.ts \ - ${dir_quelldatein}/aufbau/symbol.ts \ - ${dir_quelldatein}/aufbau/stelle.ts \ - ${dir_quelldatein}/aufbau/zustand.ts \ - ${dir_quelldatein}/aufbau/figur.ts \ - ${dir_quelldatein}/aufbau/aktoren/_aktor.ts \ - ${dir_quelldatein}/aufbau/aktoren/verwerfer.ts \ - ${dir_quelldatein}/aufbau/aktoren/annehmer.ts \ - ${dir_quelldatein}/aufbau/aktoren/erzeuger.ts \ - ${dir_quelldatein}/aufbau/aktoren/befoerderer.ts \ - ${dir_quelldatein}/aufbau/aktoren/schreiber.ts \ - ${dir_quelldatein}/aufbau/aktoren/leser.ts \ - ${dir_quelldatein}/aufbau/welt.ts \ - ${dir_quelldatein}/aufbau/aufgaben/test.ts \ - ${dir_quelldatein}/aufbau/aufgaben/akzeptortest.ts \ - ${dir_quelldatein}/aufbau/aufgaben/transduktortest.ts \ - ${dir_quelldatein}/aufbau/aufgaben/akzeptoraufgabe.ts \ - ${dir_quelldatein}/aufbau/aufgaben/transduktoraufgabe.ts \ - ${dir_quelldatein}/aufbau/aufgaben/aufgabe.ts \ - ${dir_quelldatein}/aufbau/modus.ts \ - ${dir_quelldatein}/aufbau/partie.ts \ - ${dir_quelldatein}/manifestation/manifestation.ts \ - ${dir_quelldatein}/manifestation/position.ts \ - ${dir_quelldatein}/manifestation/svg/_svg.ts \ - ${dir_quelldatein}/manifestation/svg/figur.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/_aktor.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/verwerfer.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/annehmer.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/erzeuger.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/befoerderer.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/schreiber.ts \ - ${dir_quelldatein}/manifestation/svg/aktor/leser.ts \ - ${dir_quelldatein}/manifestation/svg/partie.ts \ - ${dir_quelldatein}/manifestation/web/partie.ts \ - ${dir_quelldatein}/manifestation/speicher/partie.ts \ - ${dir_quelldatein}/haupt.ts - @ ${cmd_echo} "-- Logik …" - @ ${cmd_md} ${dir_erzeugnis} +${dir_build}/vtm.js: \ + ${dir_source}/helpers/types.ts \ + ${dir_source}/helpers/call.ts \ + ${dir_source}/helpers/trait.ts \ + ${dir_source}/helpers/errormonade.ts \ + ${dir_source}/helpers/string.ts \ + ${dir_source}/helpers/xml.ts \ + ${dir_source}/helpers/misc.ts \ + ${dir_source}/helpers/math.ts \ + ${dir_source}/helpers/vector.ts \ + ${dir_source}/helpers/hashmap.ts \ + ${dir_source}/helpers/translate.ts \ + ${dir_source}/helpers/svg.ts \ + ${dir_source}/data/_data.ts \ + ${dir_source}/model/direction.ts \ + ${dir_source}/model/symbol.ts \ + ${dir_source}/model/spot.ts \ + ${dir_source}/model/state.ts \ + ${dir_source}/model/token.ts \ + ${dir_source}/model/actuators/_actuator.ts \ + ${dir_source}/model/actuators/rejector.ts \ + ${dir_source}/model/actuators/acceptor.ts \ + ${dir_source}/model/actuators/generator.ts \ + ${dir_source}/model/actuators/conveyer.ts \ + ${dir_source}/model/actuators/writer.ts \ + ${dir_source}/model/actuators/reader.ts \ + ${dir_source}/model/world.ts \ + ${dir_source}/model/tasks/acceptortest.ts \ + ${dir_source}/model/tasks/transducertest.ts \ + ${dir_source}/model/tasks/test.ts \ + ${dir_source}/model/tasks/acceptortask.ts \ + ${dir_source}/model/tasks/transducertask.ts \ + ${dir_source}/model/tasks/task.ts \ + ${dir_source}/model/mode.ts \ + ${dir_source}/model/game.ts \ + ${dir_source}/manifestation/manifestation.ts \ + ${dir_source}/manifestation/position.ts \ + ${dir_source}/manifestation/svg/token.ts \ + ${dir_source}/manifestation/svg/actuators/_actuator.ts \ + ${dir_source}/manifestation/svg/actuators/rejector.ts \ + ${dir_source}/manifestation/svg/actuators/acceptor.ts \ + ${dir_source}/manifestation/svg/actuators/generator.ts \ + ${dir_source}/manifestation/svg/actuators/conveyer.ts \ + ${dir_source}/manifestation/svg/actuators/writer.ts \ + ${dir_source}/manifestation/svg/actuators/reader.ts \ + ${dir_source}/manifestation/svg/game.ts \ + ${dir_source}/manifestation/web/game.ts \ + ${dir_source}/manifestation/store/game.ts \ + ${dir_source}/main.ts + @ ${cmd_echo} "-- logic …" + @ ${cmd_md} ${dir_build} @ ${cmd_tsc} $^ --outFile $@ diff --git a/quelldatein/daten/zeichenketten/de.dat.js b/quelldatein/daten/zeichenketten/de.dat.js deleted file mode 100644 index 28c1c5a..0000000 --- a/quelldatein/daten/zeichenketten/de.dat.js +++ /dev/null @@ -1,55 +0,0 @@ -jsonp_handle( - { - "key": "strings-de", - "value": { - "common.title": "Verrückte Turing-Maschinen", - "common.help": "Hilfe", - "common.game": "Spiel", - "model.token.terms.singular": "Figur", - "model.token.terms.plural": "Figuren", - "model.modes.initial": "Maschine bearbeiten", - "model.modes.uncertain": "wird geprüft …", - "model.modes.wrong": "fehlerhaft :/", - "model.modes.correct": "anscheinend korrekt :)", - "model.actuators.terms.singular": "Aktor", - "model.actuators.terms.plural": "Aktoren", - "model.actuators.kinds.erzeuger.name": "Eingang", - "model.actuators.kinds.annehmer.name": "Ausgang", - "model.actuators.kinds.verwerfer.name": "Abweiser", - "model.actuators.kinds.befoerderer.name": "Schieber", - "model.actuators.kinds.schreiber.name": "Schreiber", - "model.actuators.kinds.leser.name": "Weiche", - "model.tasks.terms.singular": "Aufgabe", - "model.tasks.terms.plural": "tasks", - "model.tasks.kinds.acceptor.name": "Akzeptor", - "model.tasks.kinds.acceptor.shortcut": "AKZ", - "model.tasks.kinds.transductor.name": "Transduktor", - "model.tasks.kinds.transductor.shortcut": "TRA", - "controls.choose": "Aufgabe auswählen", - "controls.step": "Nächster Schritt", - "controls.run": "Ablaufen", - "controls.stop": "Anhalten", - "controls.edit": "Bearbeiten", - "controls.clear": "Leeren", - "help.introduction": "Dieses Spiel ist inspiriert von !var:manufacturia, !var:crazy_machines, !var:world_of_goo … und auch von unvergessenen Stunden Hardware-Praktikum im Informatik-Studium :P", - "help.controls.title": "Steuerung", - "help.controls.eintrag1": "Links-Klick/Rechts-Klick: Feldtyp wechseln", - "help.controls.eintrag2": "Mausrad-Drehen: Feld drehen", - "help.token.satz1": "Die Figur kann durch Aktoren auf dem Spielplan umher bewegt werden und wird als schwarzer Kreis dargestellt.", - "help.token.satz2": "Zudem verfügt die Figur über ein Liste von gesetzen Symbolen (Band), dargestellt durch farbige Punkte neben der Figur. Gelesen wird das Band immer an der vordersten Stelle und geschrieben wird an die hinterste Stelle (FIFO-Prinzip).", - "help.actuators.introduction": "Jedes Feld des Spielplans kann mit einem Aktor bestückt werden, der je nach Typ unterschiedliche Einflüsse auf die Figur ausübt. Folgende Typen stehen zur Verfügung:", - "help.actuators.erzeuger": "Der Eingang ist fest platziert auf dem ganz linken Feld des Spielplans und wird durch ein weißes Dreieck dargestellt. An ihm wird die Spieltoken auf den Plan gesetzt und bewegt sich anschließend in die angezeigte Richtung.", - "help.actuators.annehmer": "Auf dem ganz rechten Feld des Spielplans fest platziert befindet sich der Ausgang, der durch einen weißen Kreis dargestellt wird. Steuert man die Figur zu diesem Feld, so wird der aktuelle Band-Inhalt ausgelesen und akzeptiert.", - "help.actuators.verwerfer": "Jedes leere Feld beendet den Lauf der Figur mit einer Abweisung des aktuellen Band-Inhalts.", - "help.actuators.befoerderer": "Dieser Aktor dient dazu die Figur von einem Feld zu einem benachbkinds zu befördern ohne dabei den Band-Inhalt zu ändern.", - "help.actuators.schreiber": "Um ein Symbol auf das Band zu schreiben, wird dieser Aktor benötigt. Die jeweilige Farbe gibt an, welches Symbol geschrieben wird und die Richtung zeigt, wohin die Figur anschließend befördert wird.", - "help.actuators.leser": "An einer Weiche wird das erste Symbol auf dem Band der Figur gelesen und die übereinstimmende Richtung gewählt, zu welcher die Figur im Anschluss bewegt wird. Gibt es einen passenden Ausgang, so wird das gelesene Symbol vom Band entfernt. Falls kein Ausgang gefunden wird oder das Band leer ist, wird der Ersatz-Ausgang (grau) gewählt.", - "help.tasks.introduction": "Ziel ist das Lösen von bestimmten Aufgaben. Dabei wird zwischen zwei Arten von tasks unterschieden:", - "help.tasks.acceptor.description": "Hierbei geht es darum den Band-Inhalt der Figur zu untersuchen und zu entscheiden, ob er eine bestimmte Bedingung erfüllt oder nicht. Fall ja, so steuert man die Figur in den Ausgang; andernfalls auf ein beliebiges leeres Feld.", - "help.tasks.acceptor.example": "Beispiel: Genau dann akzeptieren, wenn das Band mindestens zwei mal rot enthält.", - "help.tasks.transductor.description": "Bei einer Transduktor-Aufgabe soll eine Ausgabe erzeugt werden, die in einer bestimmten Beziehung zur vorgefundenen Eingabe steht, also sozusagen eine Funktion angewendet werden.", - "help.tasks.transductor.example": "Beispiel: Die Eingabe zwei mal wiederholt." - } - } -); - diff --git a/quelldatein/daten/zeichenketten/en.dat.js b/quelldatein/daten/zeichenketten/en.dat.js deleted file mode 100644 index 91b384d..0000000 --- a/quelldatein/daten/zeichenketten/en.dat.js +++ /dev/null @@ -1,55 +0,0 @@ -jsonp_handle( - { - "key": "strings-en", - "value": { - "common.title": "Crazy Turing Machines", - "common.help": "Help", - "common.game": "Game", - "model.token.terms.singular": "token", - "model.token.terms.plural": "tokens", - "model.modes.initial": "edit machine", - "model.modes.uncertain": "testing …", - "model.modes.wrong": "flawed :/", - "model.modes.correct": "seemingly correct :)", - "model.actuators.terms.singular": "actor", - "model.actuators.terms.plural": "actors", - "model.actuators.kinds.erzeuger.name": "entrance", - "model.actuators.kinds.annehmer.name": "exit", - "model.actuators.kinds.verwerfer.name": "dropper", - "model.actuators.kinds.befoerderer.name": "conveyer", - "model.actuators.kinds.schreiber.name": "writer", - "model.actuators.kinds.leser.name": "switch", - "model.tasks.terms.singular": "task", - "model.tasks.terms.plural": "tasks", - "model.tasks.kinds.acceptor.name": "acceptor", - "model.tasks.kinds.acceptor.shortcut": "ACC", - "model.tasks.kinds.transductor.name": "transductor", - "model.tasks.kinds.transductor.shortcut": "TRA", - "controls.choose": "choose task", - "controls.step": "next step", - "controls.run": "run", - "controls.stop": "stop", - "controls.edit": "edit", - "controls.clear": "clear", - "help.introduction": "This game is inspired by !var:manufacturia, !var:crazy_machines, !var:world_of_goo … and also by memorable hours of the practical hardware course during computer science study :P", - "help.controls.title": "controls", - "help.controls.eintrag1": "left click/right click: change tile type", - "help.controls.eintrag2": "rotate mousewheel: rotate tile", - "help.token.satz1": "The token can be moved around the board by actors and it is displayed as a black circle.", - "help.token.satz2": "Additionally the token has a list of set symbols (its tape), which is shown as coloured points next to the token. The tape is always read at the front and written at its back (FIFO principle).", - "help.actuators.introduction": "Every tile on the board can be equipped with an actor, which will cause a certain effect on the token depending on the type. The following types are available:", - "help.actuators.erzeuger": "The entrance is statically placed on the most left tile of the board and is displayed as a white triangle. It is the spot at which the token is inserted into the board and moved to the indicated direction afterwards.", - "help.actuators.annehmer": "On the most right tile of the board the exit is statically placed; it is displayed as a white circle. If the token is moved to this tile, its tape content will be read and accepted.", - "help.actuators.verwerfer": "Every empty tile will cancel the tokens run with a rejection of the current tape content.", - "help.actuators.befoerderer": "This actor is used for moving the token to neighbour tile without changing the tape content.", - "help.actuators.schreiber": "In order to write a symbol to the tape, this actor is utilized. The colour indicates which symbol will be written and the direction shows to which tile the token will be moved afterwards.", - "help.actuators.leser": "At a switch the first symbol of the tape will be read and the the token will be moved the the corresponding direction. If a matching way out exists, the symbol will be removed from the tape. If no way out matches or if the tape is empty the fallback exit (grey) will be chosen.", - "help.tasks.introduction": "The goal is to solve certain tasks. Two kind of tasks are distinguished:", - "help.tasks.acceptor.description": "Here the goal is to investigate the content of the tokens tape and to decide whether it fulfils a certain condition or not. IF so, the token shall be moved to the exit; otherwise to an arbitrary empty tile.", - "help.tasks.acceptor.example": "Example: Accept then and only then, if the tape contains at least two red symbols.", - "help.tasks.transductor.description": "In a transductor task an output shall be generated, which has a certain relationship to to the input; in other words: to apply a function.", - "help.tasks.transductor.example": "Example: The input repeated two times." - } - } -); - diff --git a/quelldatein/manifestation/svg/_svg.ts b/quelldatein/manifestation/svg/_svg.ts deleted file mode 100644 index 34ec697..0000000 --- a/quelldatein/manifestation/svg/_svg.ts +++ /dev/null @@ -1,163 +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 - { - - export module mod_manifestation - { - - export module mod_svg - { - - /** - * @author kcf - */ - export const float_precision : int = 4; - - - /** - * @author kcf - */ - export const shape_arrow : string = "M +4 0 L 0 +1 L 0 -1 Z"; - - - /** - * @author kcf - */ - export function rotation - ( - staerke : float - ) - : string - { - return ( - "rotate" - + "(" - + (staerke * 360).toFixed(float_precision) - + ")" - ); - } - - - /** - * @author kcf - */ - export function translation - ( - x : float, - y : float - ) - : string - { - return ( - "translate" - + "(" - + x.toFixed(float_precision) - + ", " - + y.toFixed(float_precision) - + ")" - ); - } - - - /** - * @author kcf - */ - export function skalierung - ( - staerke : float - ) - : string - { - return ( - "scale" - + "(" - + staerke.toFixed(float_precision) - + ")" - ); - } - - - /** - * @author kcf - */ - export function path - ( - vertices : Array, - close : boolean = true, - attributes : {[schlussel : string] : string} = {}, - ) - : lib_xml.type_node - { - let d : string = ""; - vertices.forEach - ( - (vertex, index) => - { - let c : string = ((index <= 0) ? "M" : "L"); - let x : string = vertex.x.toFixed(float_precision); - let y : string = vertex.y.toFixed(float_precision); - d += [c, x, y].join(" "); - } - ) - ; - if (close) - d += "Z"; - attributes["d"] = d; - return (lib_xml.create_normal("path", attributes)); - } - - - /** - * @author kcf - */ - export function root - ( - von_x : float, - von_y : float, - bis_x : float, - bis_y : float, - hoehe : int = 500, - breite : int = 500, - children : Array = [] - ) - : lib_xml.type_node - { - return ( - lib_xml.create_normal - ( - "svg", - { - "xmlns": "http://www.w3.org/2000/svg", - "xmlns:xlink": "http://www.w3.org/1999/xlink", - "width": breite.toFixed(0), - "height": hoehe.toFixed(0), - "viewBox": [von_x.toFixed(4), von_y.toFixed(4), (bis_x-von_x).toFixed(4), (bis_y-von_y).toFixed(4)].join(" "), - }, - children, - ) - ); - } - - } - - } - - } - diff --git a/readme.md b/readme.md index 2b4ba02..03b7b3d 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,19 @@ # Verrückte Turing-Maschinen +Dieses Spiel ist inspiriert von [http://www.kongregate.com/games/PleasingFungus/manufactoria"](Manufacturia), [http://www.crazy-machines.com/](Crazy Machines), [http://worldofgoo.com/](World of Goo) … und auch von unvergessenen Stunden Hardware-Praktikum im Informatik-Studium :P + + ## Bauen -Zum Bauen wird ein Typscript-Compiler benötigt, den man beispielweise über **npm** beziehen kann: `npm install typescript`. Dadurch sollte das Kommando `tsc` verfügbar sein. Hat man das, kann man anschließend `make` ausführen, wodurch der Ordner `erzeugnis` erstellt wird. +Zum Bauen wird ein Typscript- und ein SASS-Compiler benötigt, die man beispielweise über **npm** beziehen kann: `npm install typescript && npm install sass`. Dadurch sollten die Kommandos `tsc` und `sass` verfügbar sein. Hat man das, kann man anschließend `make` ausführen, wodurch der Ordner `build` erstellt wird. + ## Starten -Zum Starten/Testen einfach einen Webserver im Verzeichnis `erzeugnis` starten (zum Beispiel per `cd erzeugnis && python3 -m http.server 8888 ; cd -`) und im Browser aufrufen. +Zum Starten/Testen einfach einen Webserver im Verzeichnis `build` starten (zum Beispiel per `cd build && python3 -m http.server 8888 ; cd -`) und im Browser `http://localhost:8888/vtm.html` aufrufen. + + +## Anmerkungen + +Das Programm folgt konsequent den Paradigmen der prozeduralen und funktionalen Programmierung und ist nach der Grundidee des Architektur-Musters [https://de.wikipedia.org/wiki/Model_View_Controller](MVC) aufgebaut. diff --git a/quelldatein/daten.ts b/source/data/_data.ts similarity index 95% rename from quelldatein/daten.ts rename to source/data/_data.ts index 80421b5..eb26275 100644 --- a/quelldatein/daten.ts +++ b/source/data/_data.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/source/data/strings/de.dat.js b/source/data/strings/de.dat.js new file mode 100644 index 0000000..3ee8955 --- /dev/null +++ b/source/data/strings/de.dat.js @@ -0,0 +1,78 @@ +jsonp_handle( + { + "key": "strings-de", + "value": { + "common.title": "Verrückte Turing-Maschinen", + "common.help": "Hilfe", + "common.game": "Spiel", + "model.token.terms.singular": "Figur", + "model.token.terms.plural": "Figuren", + "model.modes.initial": "Maschine bearbeiten", + "model.modes.uncertain": "wird geprüft …", + "model.modes.wrong": "fehlerhaft :/", + "model.modes.correct": "anscheinend korrekt :)", + "model.actuators.terms.singular": "Aktor", + "model.actuators.terms.plural": "Aktoren", + "model.actuators.kinds.generator.name": "Eingang", + "model.actuators.kinds.acceptor.name": "Ausgang", + "model.actuators.kinds.rejector.name": "Abweiser", + "model.actuators.kinds.conveyer.name": "Schieber", + "model.actuators.kinds.writer.name": "Schreiber", + "model.actuators.kinds.reader.name": "Weiche", + "model.tasks.terms.singular": "Aufgabe", + "model.tasks.terms.plural": "Aufgaben", + "model.tasks.kinds.acceptor.name": "Akzeptor", + "model.tasks.kinds.acceptor.shortcut": "AKZ", + "model.tasks.kinds.transducer.name": "Transduktor", + "model.tasks.kinds.transducer.shortcut": "TRA", + "controls.choose": "Aufgabe auswählen", + "controls.step": "Nächster Schritt", + "controls.run": "Ablaufen", + "controls.stop": "Anhalten", + "controls.edit": "Bearbeiten", + "controls.clear": "Leeren", + "help.introduction": "Dieses Spiel ist inspiriert von !var:manufacturia, !var:crazy_machines, !var:world_of_goo … und auch von unvergessenen Stunden Hardware-Praktikum im Informatik-Studium :P", + "help.controls.title": "Steuerung", + "help.controls.eintrag1": "Links-Klick/Rechts-Klick: Feldtyp wechseln", + "help.controls.eintrag2": "Mausrad-Drehen: Feld drehen", + "help.token.satz1": "Die Figur kann durch Aktoren auf dem Spielplan umher bewegt werden und wird als schwarzer Kreis dargestellt.", + "help.token.satz2": "Zudem verfügt die Figur über ein Liste von gesetzen Symbolen (Band), dargestellt durch farbige Punkte neben der Figur. Gelesen wird das Band immer an der vordersten Stelle und geschrieben wird an die hinterste Stelle (FIFO-Prinzip).", + "help.actuators.introduction": "Jedes Feld des Spielplans kann mit einem Aktor bestückt werden, der je nach Typ unterschiedliche Einflüsse auf die Figur ausübt. Folgende Typen stehen zur Verfügung:", + "help.actuators.generator": "Der Eingang ist fest platziert auf dem ganz linken Feld des Spielplans und wird durch ein weißes Dreieck dargestellt. An ihm wird die Spieltoken auf den Plan gesetzt und bewegt sich anschließend in die angezeigte Richtung.", + "help.actuators.acceptor": "Auf dem ganz rechten Feld des Spielplans fest platziert befindet sich der Ausgang, der durch einen weißen Kreis dargestellt wird. Steuert man die Figur zu diesem Feld, so wird der aktuelle Band-Inhalt ausgelesen und akzeptiert.", + "help.actuators.rejector": "Jedes leere Feld beendet den Lauf der Figur mit einer Abweisung des aktuellen Band-Inhalts.", + "help.actuators.conveyer": "Dieser Aktor dient dazu die Figur von einem Feld zu einem benachbkinds zu befördern ohne dabei den Band-Inhalt zu ändern.", + "help.actuators.writer": "Um ein Symbol auf das Band zu schreiben, wird dieser Aktor benötigt. Die jeweilige Farbe gibt an, welches Symbol geschrieben wird und die Richtung zeigt, wohin die Figur anschließend befördert wird.", + "help.actuators.reader": "An einer Weiche wird das erste Symbol auf dem Band der Figur gelesen und die übereinstimmende Richtung gewählt, zu welcher die Figur im Anschluss bewegt wird. Gibt es einen passenden Ausgang, so wird das gelesene Symbol vom Band entfernt. Falls kein Ausgang gefunden wird oder das Band leer ist, wird der Ersatz-Ausgang (grau) gewählt.", + "help.tasks.introduction": "Ziel ist das Lösen von bestimmten Aufgaben. Dabei wird zwischen zwei Arten von Aufgaben unterschieden:", + "help.tasks.acceptor.description": "Hierbei geht es darum den Band-Inhalt der Figur zu untersuchen und zu entscheiden, ob er eine bestimmte Bedingung erfüllt oder nicht. Fall ja, so steuert man die Figur in den Ausgang; andernfalls auf ein beliebiges leeres Feld.", + "help.tasks.acceptor.example": "Beispiel: Genau dann akzeptieren, wenn das Band mindestens zwei mal rot enthält.", + "help.tasks.transducer.description": "Bei einer Transduktor-Aufgabe soll eine Ausgabe erzeugt werden, die in einer bestimmten Beziehung zur vorgefundenen Eingabe steht, also sozusagen eine Funktion angewendet werden.", + "help.tasks.transducer.example": "Beispiel: Die Eingabe zwei mal wiederholt.", + "tasks.einfuehrung.title": "Einf\u00fchrung", + "tasks.einfuehrung.text": "Bewege die Figur vom Eingang (links) zum Ausgang (rechts)!", + "tasks.start_symbol.title": "Start-Symbol", + "tasks.start_symbol.text": "Annehmen, wenn die Eingabe mit ${s1} beginnt; andernfalls ablehnen", + "tasks.dreifaltigkeit.title": "Dreifaltigkeit", + "tasks.dreifaltigkeit.text": "Annehmen genau dann, wenn die Eingabe mindestens drei ${s1} enth\u00e4lt", + "tasks.abwechslung_erfreuet.title": "Abwechslung erfreuet", + "tasks.abwechslung_erfreuet.text": "annehmen genau dann wenn: Die Farben der Eingabe (${s0} / ${s1}) sich immer abwechseln", + "tasks.ans_ende.title": "Ans Ende", + "tasks.ans_ende.text": "die Eingabe (${s0} / ${s1}), aber mit dem ersten Symbol am Ende", + "tasks.tauschen.title": "Tauschen", + "tasks.tauschen.text": "aus der Eingabe (${s0} / ${s1}) alle ${s0} durch ${s2} ersetzen und alle ${s1} durch ${s3}", + "tasks.waehlerisch.title": "W\u00e4hlerisch", + "tasks.waehlerisch.text": "aus der Eingabe alle ${s0} entfernen und alle ${s1} beibehalten", + "tasks.dekorator.title": "Dekorator", + "tasks.dekorator.text": "Alles wird h\u00fcbscher mit Schn\u00f6rkeln, Schleifchen und Kinkerlitzchen aller Art! Zumindest glauben das die Leute \u2026 Shopping-Sender im Fernsehen sind der Beweis! Ob das auch f\u00fcr das Band der Figur gilt, wenn es nur ${s0} und ${s1} enth\u00e4lt? Finden wir's raus: Setz ein ${s2} an den Anfang und ein ${s3} an das Ende!", + "tasks.alpha_und_omega.title": "Alpha und Omega", + "tasks.alpha_und_omega.text": "Eingaben (${s0} / ${s1}), die mit den gleichen Symbolen anfangen und enden", + "tasks.an_den_anfang.title": "An den Anfang", + "tasks.an_den_anfang.text": "die Eingabe (${s0} / ${s1}), aber mit dem letzten Symbol am Anfang", + "tasks.a_n_b_n.title": "a^n b^n", + "tasks.a_n_b_n.text": "Jaja, die ber\u00fchmt ber\u00fcchtige Sprache, die sich mit einem endlichen Automaten nicht erkennen l\u00e4sst \u2026 Das ist deine Chance zu zeigen, dass dieses Ding hier mehr ist als so ein k\u00fcmmerlicher DEA \u2026 und das ganz ohne Kellerspeicher! Also: Eine beliebige Anzahl an ${s0}, dann die gleiche Anzahl an ${s1}!", + "tasks.a_n_b_n.hinweise.hinweis1": "Ein Wort ist genau dann Element der Sprache ${s0}^n ${s1}^n, wenn sie entweder 1) leer ist (also n = 0 gilt) oder 2) sie mit ${s0} beginnt, mit ${s1} endet und dazwischen ein Wort der Form ${s0}^(n-1) ${s1}^(n-1) steht \u2026 Stichwort: Rekursion" + } + } +); + diff --git a/source/data/strings/en.dat.js b/source/data/strings/en.dat.js new file mode 100644 index 0000000..c27e4f3 --- /dev/null +++ b/source/data/strings/en.dat.js @@ -0,0 +1,59 @@ +jsonp_handle( + { + "key": "strings-en", + "value": { + "common.title": "Crazy Turing Machines", + "common.help": "Help", + "common.game": "Game", + "model.token.terms.singular": "token", + "model.token.terms.plural": "tokens", + "model.modes.initial": "edit machine", + "model.modes.uncertain": "testing …", + "model.modes.wrong": "flawed :/", + "model.modes.correct": "seemingly correct :)", + "model.actuators.terms.singular": "actor", + "model.actuators.terms.plural": "actors", + "model.actuators.kinds.generator.name": "entrance", + "model.actuators.kinds.acceptor.name": "exit", + "model.actuators.kinds.rejector.name": "dropper", + "model.actuators.kinds.conveyer.name": "conveyer", + "model.actuators.kinds.writer.name": "writer", + "model.actuators.kinds.reader.name": "switch", + "model.tasks.terms.singular": "task", + "model.tasks.terms.plural": "tasks", + "model.tasks.kinds.acceptor.name": "acceptor", + "model.tasks.kinds.acceptor.shortcut": "ACC", + "model.tasks.kinds.transducer.name": "transducer", + "model.tasks.kinds.transducer.shortcut": "TRA", + "controls.choose": "choose task", + "controls.step": "next step", + "controls.run": "run", + "controls.stop": "stop", + "controls.edit": "edit", + "controls.clear": "clear", + "help.introduction": "This game is inspired by !var:manufacturia, !var:crazy_machines, !var:world_of_goo … and also by memorable hours of the practical hardware course during computer science study :P", + "help.controls.title": "controls", + "help.controls.eintrag1": "left click/right click: change tile type", + "help.controls.eintrag2": "rotate mousewheel: rotate tile", + "help.token.satz1": "The token can be moved agame the board by actors and it is displayed as a black circle.", + "help.token.satz2": "Additionally the token has a list of set symbols (its tape), which is shown as coloured points next to the token. The tape is always read at the front and written at its back (FIFO principle).", + "help.actuators.introduction": "Every tile on the board can be equipped with an actor, which will cause a certain effect on the token depending on the type. The following types are available:", + "help.actuators.generator": "The entrance is statically placed on the most left tile of the board and is displayed as a white triangle. It is the spot at which the token is inserted into the board and moved to the indicated direction afterwards.", + "help.actuators.acceptor": "On the most right tile of the board the exit is statically placed; it is displayed as a white circle. If the token is moved to this tile, its tape content will be read and accepted.", + "help.actuators.rejector": "Every empty tile will cancel the tokens run with a rejection of the current tape content.", + "help.actuators.conveyer": "This actor is used for moving the token to neighbour tile without changing the tape content.", + "help.actuators.writer": "In order to write a symbol to the tape, this actor is utilized. The colour indicates which symbol will be written and the direction shows to which tile the token will be moved afterwards.", + "help.actuators.reader": "At a switch the first symbol of the tape will be read and the the token will be moved the the corresponding direction. If a matching way out exists, the symbol will be removed from the tape. If no way out matches or if the tape is empty the fallback exit (grey) will be chosen.", + "help.tasks.introduction": "The goal is to solve certain tasks. Two kind of tasks are distinguished:", + "help.tasks.acceptor.description": "Here the goal is to investigate the content of the tokens tape and to decide whether it fulfils a certain condition or not. IF so, the token shall be moved to the exit; otherwise to an arbitrary empty tile.", + "help.tasks.acceptor.example": "Example: Accept then and only then, if the tape contains at least two red symbols.", + "help.tasks.transducer.description": "In a transducer task an output shall be generated, which has a certain relationship to to the input; in other words: to apply a function.", + "help.tasks.transducer.example": "Example: The input repeated two times.", + "tasks.einfuehrung.title": "Introduction", + "tasks.einfuehrung.text": "Move the token from the entrance (left) to the exit (rights)!", + "tasks.a_n_b_n.title": "a^n b^n", + "tasks.a_n_b_n.text": "Yeah, yeah, yeah … The far famed language, which can't be recognized by a finite automaton … This is your chance to prove that this gizmo here is mightier than any wimpy DFA; even without any stack! So: An arbitrary number of ${s0}, then the same number of ${s1}!" + } + } +); + diff --git a/quelldatein/daten/aufgaben.dat.js b/source/data/tasks.dat.js similarity index 62% rename from quelldatein/daten/aufgaben.dat.js rename to source/data/tasks.dat.js index cb22498..e9a0439 100644 --- a/quelldatein/daten/aufgaben.dat.js +++ b/source/data/tasks.dat.js @@ -6,8 +6,6 @@ jsonp_handle( "id": "einfuehrung", "kind": "acceptor", "parameter": { - "titel": "Einführung", - "text": "Bewege die Figur vom Eingang (links) zum Ausgang (rechts)!", "tests": [ { "input": [], @@ -20,8 +18,6 @@ jsonp_handle( "id": "start_symbol", "kind": "acceptor", "parameter": { - "titel": "Start-Symbol", - "text": "Annehmen, wenn die input mit ${s1} beginnt; andernfalls ablehnen", "tests": [ { "input": [], @@ -50,8 +46,6 @@ jsonp_handle( "id": "dreifaltigkeit", "kind": "acceptor", "parameter": { - "titel": "Dreifaltigkeit", - "text": "Annehmen genau dann, wenn die input mindestens drei ${s1} enthält", "tests": [ { "input": [1], @@ -72,8 +66,6 @@ jsonp_handle( "id": "abwechslung_erfreuet", "kind": "acceptor", "parameter": { - "titel": "Abwechslung erfreuet", - "text": "annehmen genau dann wenn: Die Farben der input (${s0} / ${s1}) sich immer abwechseln", "tests": [ { "input": [], @@ -100,10 +92,8 @@ jsonp_handle( }, { "id": "ans_ende", - "kind": "transductor", + "kind": "transducer", "parameter": { - "titel": "Ans Ende", - "text": "die input (${s0} / ${s1}), aber mit dem ersten Symbol am Ende", "tests": [ { "input": [0,0,1,1,1,0,1,0,1,1,1,0,1], @@ -114,10 +104,8 @@ jsonp_handle( }, { "id": "tauschen", - "kind": "transductor", + "kind": "transducer", "parameter": { - "titel": "Tauschen", - "text": "aus der input (${s0} / ${s1}) alle ${s0} durch ${s2} ersetzen und alle ${s1} durch ${s3}", "tests": [ { "input": [0,1,1,0], @@ -132,10 +120,8 @@ jsonp_handle( }, { "id": "waehlerisch", - "kind": "transductor", + "kind": "transducer", "parameter": { - "titel": "Wählerisch", - "text": "aus der input alle ${s0} entfernen und alle ${s1} beibehalten", "tests": [ { "input": [0,0,0,1,0], @@ -158,10 +144,8 @@ jsonp_handle( }, { "id": "dekorator", - "kind": "transductor", + "kind": "transducer", "parameter": { - "titel": "Dekorator", - "text": "Alles wird hübscher mit Schnörkeln, Schleifchen und Kinkerlitzchen aller Art! Zumindest glauben das die Leute … Shopping-Sender im Fernsehen sind der Beweis! Ob das auch für das Band der Figur gilt, wenn es nur ${s0} und ${s1} enthält? Finden wir's raus: Setz ein ${s2} an den Anfang und ein ${s3} an das Ende!", "tests": [ { "input": [1,1,0], @@ -178,8 +162,6 @@ jsonp_handle( "id": "alpha_und_omega", "kind": "acceptor", "parameter": { - "titel": "Alpha und Omega", - "text": "inputn (${s0} / ${s1}), die mit den gleichen Symbolen anfangen und enden", "tests": [ { "input": [], @@ -210,10 +192,8 @@ jsonp_handle( }, { "id": "an_den_anfang", - "kind": "transductor", + "kind": "transducer", "parameter": { - "titel": "An den Anfang", - "text": "die input (${s0} / ${s1}), aber mit dem letzten Symbol am Anfang", "tests": [ { "input": [0,0,1,1,1,0,1,0,1,1,1,0,1], @@ -226,8 +206,6 @@ jsonp_handle( "id": "a_n_b_n", "kind": "acceptor", "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": [ { "input": [], @@ -249,9 +227,6 @@ jsonp_handle( "input": [0,0,0,0,0,0,0,1,1,1,1,1,1,1], "accept": true } - ], - "hinweise": [ - "Ein Wort ist genau dann Element der Sprache ${s0}^n ${s1}^n, wenn sie entweder 1) leer ist (also n = 0 gilt) oder 2) sie mit ${s0} beginnt, mit ${s1} endet und dazwischen ein Wort der Form ${s0}^(n-1) ${s1}^(n-1) steht … Stichwort: Rekursion" ] } } diff --git a/quelldatein/helfer/aufruf.ts b/source/helpers/call.ts similarity index 96% rename from quelldatein/helfer/aufruf.ts rename to source/helpers/call.ts index 1ae5e4c..192f93e 100644 --- a/quelldatein/helfer/aufruf.ts +++ b/source/helpers/call.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/fehlermonade.ts b/source/helpers/errormonade.ts similarity index 97% rename from quelldatein/helfer/fehlermonade.ts rename to source/helpers/errormonade.ts index adda840..101103c 100644 --- a/quelldatein/helfer/fehlermonade.ts +++ b/source/helpers/errormonade.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/hashmap.ts b/source/helpers/hashmap.ts similarity index 97% rename from quelldatein/helfer/hashmap.ts rename to source/helpers/hashmap.ts index c2fe862..9d44ca5 100644 --- a/quelldatein/helfer/hashmap.ts +++ b/source/helpers/hashmap.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/mathematik.ts b/source/helpers/math.ts similarity index 93% rename from quelldatein/helfer/mathematik.ts rename to source/helpers/math.ts index d413b4a..b8f7010 100644 --- a/quelldatein/helfer/mathematik.ts +++ b/source/helpers/math.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/verschiedenes.ts b/source/helpers/misc.ts similarity index 95% rename from quelldatein/helfer/verschiedenes.ts rename to source/helpers/misc.ts index 1c32b53..221098f 100644 --- a/quelldatein/helfer/verschiedenes.ts +++ b/source/helpers/misc.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/source/helpers/string.ts b/source/helpers/string.ts new file mode 100644 index 0000000..0ef9393 --- /dev/null +++ b/source/helpers/string.ts @@ -0,0 +1,54 @@ +/* + * Verrückte Turing-Maschinen — A turing complete game + * Copyright (C) 2016-2018 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 lib_string + { + + /** + * @author kcf + */ + export function indent + ( + depth : int, + symbol : string = "\t" + ) + : string + { + return ( + (depth === 0) + ? "" + : (symbol + indent(depth-1)) + ); + } + + + /** + * @author kcf + */ + export function stance(str : string, vars : {[name : string] : string}) : string + { + for (let name in vars) + { + let regexp : RegExp = (new RegExp("\\$\{" + name + "\}", "g")); + str = str.replace(regexp, vars[name]); + } + return str; + } + + } + diff --git a/source/helpers/svg.ts b/source/helpers/svg.ts new file mode 100644 index 0000000..9e9c1b3 --- /dev/null +++ b/source/helpers/svg.ts @@ -0,0 +1,153 @@ +/* + * Verrückte Turing-Maschinen — A turing complete game + * Copyright (C) 2016-2018 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 lib_svg + { + + /** + * @author kcf + */ + export const float_precision : int = 4; + + + /** + * @author kcf + */ + export const shape_arrow : string = "M +4 0 L 0 +1 L 0 -1 Z"; + + + /** + * @author kcf + */ + export function rotation + ( + staerke : float + ) + : string + { + return ( + "rotate" + + "(" + + (staerke * 360).toFixed(float_precision) + + ")" + ); + } + + + /** + * @author kcf + */ + export function translation + ( + x : float, + y : float + ) + : string + { + return ( + "translate" + + "(" + + x.toFixed(float_precision) + + ", " + + y.toFixed(float_precision) + + ")" + ); + } + + + /** + * @author kcf + */ + export function skalierung + ( + staerke : float + ) + : string + { + return ( + "scale" + + "(" + + staerke.toFixed(float_precision) + + ")" + ); + } + + + /** + * @author kcf + */ + export function path + ( + vertices : Array, + close : boolean = true, + attributes : {[name : string] : string} = {}, + ) + : lib_xml.type_node + { + let d : string = ""; + vertices.forEach + ( + (vertex, index) => + { + let c : string = ((index <= 0) ? "M" : "L"); + let x : string = vertex.x.toFixed(float_precision); + let y : string = vertex.y.toFixed(float_precision); + d += [c, x, y].join(" "); + } + ) + ; + if (close) + d += "Z"; + attributes["d"] = d; + return (lib_xml.create_normal("path", attributes)); + } + + + /** + * @author kcf + */ + export function root + ( + from_x : float, + from_y : float, + to_x : float, + to_y : float, + height : int = 500, + width : int = 500, + children : Array = [] + ) + : lib_xml.type_node + { + return ( + lib_xml.create_normal + ( + "svg", + { + "xmlns": "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink", + "width": width.toFixed(0), + "height": height.toFixed(0), + "viewBox": [from_x.toFixed(4), from_y.toFixed(4), (to_x-from_x).toFixed(4), (to_y-from_y).toFixed(4)].join(" "), + }, + children, + ) + ); + } + + } + diff --git a/quelldatein/helfer/brauch.ts b/source/helpers/trait.ts similarity index 96% rename from quelldatein/helfer/brauch.ts rename to source/helpers/trait.ts index 1788db8..b858991 100644 --- a/quelldatein/helfer/brauch.ts +++ b/source/helpers/trait.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/uebersetzung.ts b/source/helpers/translate.ts similarity index 98% rename from quelldatein/helfer/uebersetzung.ts rename to source/helpers/translate.ts index 2b6c18d..d18c9da 100644 --- a/quelldatein/helfer/uebersetzung.ts +++ b/source/helpers/translate.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/typen.ts b/source/helpers/types.ts similarity index 92% rename from quelldatein/helfer/typen.ts rename to source/helpers/types.ts index 9f570c4..cda08e2 100644 --- a/quelldatein/helfer/typen.ts +++ b/source/helpers/types.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/vektor.ts b/source/helpers/vector.ts similarity index 95% rename from quelldatein/helfer/vektor.ts rename to source/helpers/vector.ts index 0ef6519..eae2ccc 100644 --- a/quelldatein/helfer/vektor.ts +++ b/source/helpers/vector.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/helfer/xml.ts b/source/helpers/xml.ts similarity index 86% rename from quelldatein/helfer/xml.ts rename to source/helpers/xml.ts index 3fb617d..4973d55 100644 --- a/quelldatein/helfer/xml.ts +++ b/source/helpers/xml.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -19,24 +19,6 @@ module lib_xml { - /** - * @author kcf - */ - function indent - ( - depth : int, - zeichen : string = "\t" - ) - : string - { - return ( - (depth === 0) - ? "" - : (zeichen + indent(depth-1)) - ); - } - - /** * @author kcf */ @@ -130,7 +112,7 @@ module lib_xml ; str_begin += str_attributes; } - str_begin = (indent(depth) + "<" + str_begin + ">" + "\n"); + str_begin = (lib_string.indent(depth) + "<" + str_begin + ">" + "\n"); str += str_begin; } // children @@ -141,7 +123,7 @@ module lib_xml { let str_end : string = ""; str_end += name; - str_end = (indent(depth) + "<" + "/" + str_end + ">" + "\n"); + str_end = (lib_string.indent(depth) + "<" + "/" + str_end + ">" + "\n"); str += str_end; } return str; diff --git a/quelldatein/manifestation/web/vtm.html b/source/main.html similarity index 84% rename from quelldatein/manifestation/web/vtm.html rename to source/main.html index 7dcfba5..cf76f4a 100644 --- a/quelldatein/manifestation/web/vtm.html +++ b/source/main.html @@ -52,35 +52,35 @@
!translate:model.actuators.terms.plural

!translate:help.actuators.introduction

    -
  • -
    !translate:model.actuators.kinds.erzeuger.name
    +
  • +
    !translate:model.actuators.kinds.generator.name
    -
    !translate:help.actuators.erzeuger
    +
    !translate:help.actuators.generator
  • -
  • -
    !translate:model.actuators.kinds.annehmer.name
    +
  • +
    !translate:model.actuators.kinds.acceptor.name
    -
    !translate:help.actuators.annehmer
    +
    !translate:help.actuators.acceptor
  • -
  • -
    !translate:model.actuators.kinds.verwerfer.name
    +
  • +
    !translate:model.actuators.kinds.rejector.name
    -
    !translate:help.actuators.verwerfer
    +
    !translate:help.actuators.rejector
  • -
  • -
    !translate:model.actuators.kinds.befoerderer.name
    +
  • +
    !translate:model.actuators.kinds.conveyer.name
    -
    !translate:help.actuators.befoerderer
    +
    !translate:help.actuators.conveyer
  • -
  • -
    !translate:model.actuators.kinds.schreiber.name
    +
  • +
    !translate:model.actuators.kinds.writer.name
    -
    !translate:help.actuators.schreiber
    +
    !translate:help.actuators.writer
  • -
  • -
    !translate:model.actuators.kinds.leser.name
    +
  • +
    !translate:model.actuators.kinds.reader.name
    -
    !translate:help.actuators.leser
    +
    !translate:help.actuators.reader
@@ -93,10 +93,10 @@

!translate:help.tasks.acceptor.description

!translate:help.tasks.acceptor.example

-
  • -
    !translate:model.tasks.kinds.transductor.name
    -

    !translate:help.tasks.transductor.description

    -

    !translate:help.tasks.transductor.example

    +
  • +
    !translate:model.tasks.kinds.transducer.name
    +

    !translate:help.tasks.transducer.description

    +

    !translate:help.tasks.transducer.example

  • diff --git a/quelldatein/manifestation/web/vtm.scss b/source/main.scss similarity index 66% rename from quelldatein/manifestation/web/vtm.scss rename to source/main.scss index 91a42d3..d9d718f 100644 --- a/quelldatein/manifestation/web/vtm.scss +++ b/source/main.scss @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -42,14 +42,18 @@ body a { - color: hsl(120, 50%, 50%); text-decoration: none; cursor: pointer; - } - -a:hover - { - color: hsl(120, 50%, 75%); + + &:not(:hover) + { + color: hsl(120, 50%, 50%); + } + + &:hover + { + color: hsl(120, 50%, 75%); + } } li @@ -57,6 +61,35 @@ li list-style-type: "» "; } +input,select,textarea,button + { + margin: 4px; + border: none; + padding: 8px; + + // border-radius: 2px; + // box-shadow: 1px 1px 1px black; + + cursor: pointer; + + font-family: monospace; + // font-weight: bold; + + &:not(:hover) + { + background-color: hsl(120, 0%, 25%); + color: hsl(120, 0%, 100%); + } + + &:hover + { + background-color: hsl(120, 50%, 25%); + color: hsl(120, 0%, 100%); + + transition: 0.25s ease; + } + } + body > header { font-size: 200%; @@ -72,12 +105,12 @@ body > header #radio_help:checked { & ~ #help {} - & ~ #game {display: none;} + & ~ #game {display: none !important;} } #radio_game:checked { - & ~ #help {display: none;} + & ~ #help {display: none !important;} & ~ #game {} } @@ -131,43 +164,45 @@ body > header { & > * { - margin: 2px; + margin: 4px; + display: block; + text-transform: capitalize; } &.initial { & > #button_step {} & > #button_run {} - & > #button_stop {display: none;} - & > #button_edit {display: none;} + & > #button_stop {display: none !important;} + & > #button_edit {display: none !important;} & > #button_clear {} } &.uncertain_running { - & > #button_step {display: none;} - & > #button_run {display: none;} + & > #button_step {display: none !important;} + & > #button_run {display: none !important;} & > #button_stop {} - & > #button_edit {display: none;} - & > #button_clear {display: none;} + & > #button_edit {display: none !important;} + & > #button_clear {display: none !important;} } &.uncertain_standing { & > #button_step {} & > #button_run {} - & > #button_stop {display: none;} + & > #button_stop {display: none !important;} & > #button_edit {} - & > #button_clear {display: none;} + & > #button_clear {display: none !important;} } &.done { - & > #button_step {display: none;} - & > #button_run {display: none;} - & > #button_stop {display: none;} + & > #button_step {display: none !important;} + & > #button_run {display: none !important;} + & > #button_stop {display: none !important;} & > #button_edit {} - & > #button_clear {display: none;} + & > #button_clear {display: none !important;} } } diff --git a/quelldatein/haupt.ts b/source/main.ts similarity index 64% rename from quelldatein/haupt.ts rename to source/main.ts index 0f3a807..6e6511d 100644 --- a/quelldatein/haupt.ts +++ b/source/main.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -22,7 +22,7 @@ module mod_vtm /** * @author kcf */ - function tasks_insert(behandler : (task : mod_model.mod_task.type_task)=>void) : void + function tasks_insert(handler : (task : mod_model.mod_task.type_task)=>void) : void { let tasks_raw_ : lib_errormonade.type_errormonade> = mod_vtm.mod_data.read("tasks"); if (lib_errormonade.filled(tasks_raw_)) @@ -33,24 +33,24 @@ module mod_vtm ( (task_raw, index) => { + let task : mod_model.mod_task.type_task = mod_model.mod_task.import_(task_raw); // Aufgabe registrieren { - let task : mod_model.mod_task.type_task = mod_model.mod_task.import_(task_raw); mod_model.mod_task.registrieren(task); } - // Option insert + // Option eintragen { - let praefix : string = ( + let prefix : string = ( { "acceptor": lib_translate.get("model.tasks.kinds.acceptor.shortcut"), - "transductor": lib_translate.get("model.tasks.kinds.transductor.shortcut"), + "transducer": lib_translate.get("model.tasks.kinds.transducer.shortcut"), }[task_raw["kind"]] ); - let titel : string = ("[" + praefix + "]" + " " + task_raw["parameter"]["titel"]); + let title : string = ("[" + prefix + "]" + " " + mod_model.mod_task.title(task)); let value : string = index.toFixed(0); let dom_option : Element = document.createElement("option"); dom_option.setAttribute("value", value); - dom_option.textContent = titel; + dom_option.textContent = title; dom_selection.appendChild(dom_option); } } @@ -64,7 +64,7 @@ module mod_vtm let value : string = dom_selection["value"]; let index : int = parseInt(value); let task : mod_model.mod_task.type_task = mod_model.mod_task.get(index); - behandler(task); + handler(task); } ) ; @@ -110,59 +110,59 @@ module mod_vtm { // Arten { - let von_x : float = -0.5; - let von_y : float = -0.5; - let bis_x : float = +0.5; - let bis_y : float = +0.5; - let breite : float = 80; - let hoehe : float = 80; + let from_x : float = -0.5; + let from_y : float = -0.5; + let to_x : float = +0.5; + let to_y : float = +0.5; + let width : float = 80; + let height : float = 80; [ { - "model": mod_model.mod_actuator.example("erzeuger"), - "bereich": document.querySelector("#help_actuators_actuator_erzeuger"), + "model": mod_model.mod_actuator.example("generator"), + "area": document.querySelector("#help_actuators_actuator_generator"), }, { - "model": mod_model.mod_actuator.example("annehmer"), - "bereich": document.querySelector("#help_actuators_actuator_annehmer"), + "model": mod_model.mod_actuator.example("acceptor"), + "area": document.querySelector("#help_actuators_actuator_acceptor"), }, { - "model": mod_model.mod_actuator.example("verwerfer"), - "bereich": document.querySelector("#help_actuators_actuator_verwerfer"), + "model": mod_model.mod_actuator.example("rejector"), + "area": document.querySelector("#help_actuators_actuator_rejector"), }, { - "model": mod_model.mod_actuator.example("befoerderer"), - "bereich": document.querySelector("#help_actuators_actuator_befoerderer"), + "model": mod_model.mod_actuator.example("conveyer"), + "area": document.querySelector("#help_actuators_actuator_conveyer"), }, { - "model": mod_model.mod_actuator.example("schreiber"), - "bereich": document.querySelector("#help_actuators_actuator_schreiber"), + "model": mod_model.mod_actuator.example("writer"), + "area": document.querySelector("#help_actuators_actuator_writer"), }, { - "model": mod_model.mod_actuator.example("leser"), - "bereich": document.querySelector("#help_actuators_actuator_leser"), + "model": mod_model.mod_actuator.example("reader"), + "area": document.querySelector("#help_actuators_actuator_reader"), }, ] .forEach ( - eintrag => + entry => { let manifestation = ( - mod_manifestation.mod_svg.mod_actuator.create_manifestation + mod_manifestation.mod_svg.mod_actuator.create_extended ( - eintrag.model, + entry.model, mod_model.mod_spot.null_() ) ); let xmlnode : lib_xml.type_node = ( - mod_manifestation.mod_svg.root + lib_svg.root ( - von_x, von_y, - bis_x, bis_y, - breite, hoehe, + from_x, from_y, + to_x, to_y, + width, height, [mod_manifestation.view(manifestation)] ) ); - eintrag.bereich.querySelector(".help_actuators_actuator_image").innerHTML = lib_xml.view(xmlnode); + entry.area.querySelector(".help_actuators_actuator_image").innerHTML = lib_xml.view(xmlnode); } ) ; @@ -171,31 +171,31 @@ module mod_vtm } // Spiel { - let round : mod_model.mod_round.type_round; + let game : mod_model.mod_game.type_game; // Aufgaben { tasks_insert ( - function (task : mod_model.mod_task.type_task) : void {mod_model.mod_round.task_set(round, task);} + function (task : mod_model.mod_task.type_task) : void {mod_model.mod_game.task_set(game, task);} ) ; } // Aufbau { - round = mod_model.mod_round.create(mod_model.mod_task.get(0)); + game = mod_model.mod_game.create(mod_model.mod_task.get(0)); } // Manifestationen { [ - mod_manifestation.mod_web.mod_round.create_erweitert + mod_manifestation.mod_web.mod_game.create_extended ( - round, + game, document.querySelector("#section_mid") ) , - mod_manifestation.mod_store.mod_round.create_erweitert + mod_manifestation.mod_store.mod_game.create_extended ( - round + game ) , ] diff --git a/quelldatein/manifestation/manifestation.ts b/source/manifestation/manifestation.ts similarity index 97% rename from quelldatein/manifestation/manifestation.ts rename to source/manifestation/manifestation.ts index d94e903..f0762c0 100644 --- a/quelldatein/manifestation/manifestation.ts +++ b/source/manifestation/manifestation.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/manifestation/position.ts b/source/manifestation/position.ts similarity index 90% rename from quelldatein/manifestation/position.ts rename to source/manifestation/position.ts index 32aad93..459b549 100644 --- a/quelldatein/manifestation/position.ts +++ b/source/manifestation/position.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -41,7 +41,7 @@ module mod_vtm /** * @author kcf */ - export function von_spot(spot : mod_vtm.mod_model.mod_spot.type_spot) : type_position + export function from_spot(spot : mod_vtm.mod_model.mod_spot.type_spot) : type_position { return ( lib_vector.add diff --git a/quelldatein/manifestation/speicher/partie.ts b/source/manifestation/store/game.ts similarity index 69% rename from quelldatein/manifestation/speicher/partie.ts rename to source/manifestation/store/game.ts index 1273ff0..51bc53c 100644 --- a/quelldatein/manifestation/speicher/partie.ts +++ b/source/manifestation/store/game.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,15 +25,15 @@ module mod_vtm export module mod_store { - export module mod_round + export module mod_game { /** * @author kcf */ - export type type_round = + export type type_game = { - model : mod_vtm.mod_model.mod_round.type_round; + model : mod_vtm.mod_model.mod_game.type_game; } ; @@ -43,9 +43,9 @@ module mod_vtm */ export function create ( - model : mod_vtm.mod_model.mod_round.type_round + model : mod_vtm.mod_model.mod_game.type_game ) - : type_round + : type_game { return { "model": model @@ -56,14 +56,14 @@ module mod_vtm /** * @author kcf */ - export function create_erweitert + export function create_extended ( - model : mod_vtm.mod_model.mod_round.type_round + model : mod_vtm.mod_model.mod_game.type_game ) - : type_manifestation + : type_manifestation { return { - "kind": "store_round", + "kind": "store_game", "data": create(model) }; } @@ -72,7 +72,7 @@ module mod_vtm /** * @author kcf */ - function view(round : type_round) : void + function view(game : type_game) : void { } @@ -80,16 +80,16 @@ module mod_vtm /** * @author kcf */ - function bind(round : type_round) : void + function bind(game : type_game) : void { - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_task", + game.model, + "change_task", (data) => { - // console.info("aendrung_task", data); - let task : mod_vtm.mod_model.mod_task.type_task = mod_vtm.mod_model.mod_round.task_read(round.model); + // console.info("change_task", data); + let task : mod_vtm.mod_model.mod_task.type_task = mod_vtm.mod_model.mod_game.task_read(game.model); let id : string = mod_vtm.mod_model.mod_task.id(task); let key : string = ("vtm_" + id); // @@ -98,50 +98,50 @@ module mod_vtm let item : string = localStorage.getItem(key); let world_ : any = JSON.parse(item); let world : mod_vtm.mod_model.mod_world.type_world = mod_vtm.mod_model.mod_world.import_(world_); - mod_vtm.mod_model.mod_round.world_set(round.model, world, false); + mod_vtm.mod_model.mod_game.world_set(game.model, world, false); } else { - mod_vtm.mod_model.mod_round.world_clear(round.model); + mod_vtm.mod_model.mod_game.world_clear(game.model); // nothing tun } } ) ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_world", + game.model, + "change_world", (data) => { - let task : mod_vtm.mod_model.mod_task.type_task = mod_vtm.mod_model.mod_round.task_read(round.model); + let task : mod_vtm.mod_model.mod_task.type_task = mod_vtm.mod_model.mod_game.task_read(game.model); let id : string = mod_vtm.mod_model.mod_task.id(task); let key : string = ("vtm_" + id); // - let world : mod_vtm.mod_model.mod_world.type_world = mod_vtm.mod_model.mod_round.world_read(round.model); + let world : mod_vtm.mod_model.mod_world.type_world = mod_vtm.mod_model.mod_game.world_read(game.model); let world_ : any = mod_vtm.mod_model.mod_world.export_(world); let item : string = JSON.stringify(world_); localStorage.setItem(key, item); } ) ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_token", + game.model, + "change_token", (data) => { - // console.info("aendrung_token", data); + // console.info("change_token", data); } ) ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_mode", + game.model, + "change_mode", (data) => { - // console.info("aendrung_mode", data); + // console.info("change_mode", data); } ) ; @@ -151,10 +151,10 @@ module mod_vtm /** * @author kcf */ - lib_trait.attend> + lib_trait.attend> ( trait_manifestation, - "store_round", + "store_game", { "view": (manifestation) => view(manifestation.data), "bind": (manifestation) => bind(manifestation.data), diff --git a/quelldatein/manifestation/svg/aktor/_aktor.ts b/source/manifestation/svg/actuators/_actuator.ts similarity index 94% rename from quelldatein/manifestation/svg/aktor/_aktor.ts rename to source/manifestation/svg/actuators/_actuator.ts index 704d023..e90b210 100644 --- a/quelldatein/manifestation/svg/aktor/_aktor.ts +++ b/source/manifestation/svg/actuators/_actuator.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -75,7 +75,7 @@ module mod_vtm /** * @author kcf */ - export function create_manifestation + export function create_extended ( model : mod_vtm.mod_model.mod_actuator.type_actuator, spot : mod_vtm.mod_model.mod_spot.type_spot @@ -98,7 +98,7 @@ module mod_vtm let node_rahmen = function () : lib_xml.type_node { return ( - path + lib_svg.path ( mod_vtm.mod_helfer.sequence(6).map(i => lib_vector.polar(((i+0.5)/6) * (2*Math.PI), 0.5)), true, @@ -109,7 +109,7 @@ module mod_vtm ); } ; - let position : mod_position.type_position = mod_position.von_spot(actuator_.spot); + let position : mod_position.type_position = mod_position.from_spot(actuator_.spot); let node_tile : lib_xml.type_node = ( lib_xml.create_normal ( @@ -117,7 +117,7 @@ module mod_vtm { "class": "tile", "rel": mod_vtm.mod_model.mod_spot.hash(actuator_.spot), - "transform": translation(position.x, position.y), + "transform": lib_svg.translation(position.x, position.y), }, ( [node_rahmen()] diff --git a/quelldatein/manifestation/svg/aktor/annehmer.ts b/source/manifestation/svg/actuators/acceptor.ts similarity index 85% rename from quelldatein/manifestation/svg/aktor/annehmer.ts rename to source/manifestation/svg/actuators/acceptor.ts index 3b3f09d..6627e74 100644 --- a/quelldatein/manifestation/svg/aktor/annehmer.ts +++ b/source/manifestation/svg/actuators/acceptor.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -34,7 +34,7 @@ module mod_vtm lib_trait.attend ( trait_actuator, - "annehmer", + "acceptor", { "view": (actuator) => { @@ -44,9 +44,9 @@ module mod_vtm ( "circle", { - "cx": (0.0).toFixed(float_precision), - "cy": (0.0).toFixed(float_precision), - "r": (0.25).toFixed(float_precision), + "cx": (0.0).toFixed(lib_svg.float_precision), + "cy": (0.0).toFixed(lib_svg.float_precision), + "r": (0.25).toFixed(lib_svg.float_precision), "class": ( [ "kreis", diff --git a/quelldatein/manifestation/svg/aktor/befoerderer.ts b/source/manifestation/svg/actuators/conveyer.ts similarity index 86% rename from quelldatein/manifestation/svg/aktor/befoerderer.ts rename to source/manifestation/svg/actuators/conveyer.ts index df013a8..3e49af3 100644 --- a/quelldatein/manifestation/svg/aktor/befoerderer.ts +++ b/source/manifestation/svg/actuators/conveyer.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -34,7 +34,7 @@ module mod_vtm lib_trait.attend ( trait_actuator, - "befoerderer", + "conveyer", { "view": ({"data": {"direction": direction}}) => { @@ -44,7 +44,7 @@ module mod_vtm ( "path", { - "d": shape_arrow, + "d": lib_svg.shape_arrow, "class": ( [ "pfeil", @@ -53,9 +53,9 @@ module mod_vtm ), "transform": ( [ - rotation(direction/6), - translation(-0.2, 0), - skalierung(0.12), + lib_svg.rotation(direction/6), + lib_svg.translation(-0.2, 0), + lib_svg.skalierung(0.12), ].join(" ") ), } diff --git a/quelldatein/manifestation/svg/aktor/erzeuger.ts b/source/manifestation/svg/actuators/generator.ts similarity index 85% rename from quelldatein/manifestation/svg/aktor/erzeuger.ts rename to source/manifestation/svg/actuators/generator.ts index 5575c07..e749632 100644 --- a/quelldatein/manifestation/svg/aktor/erzeuger.ts +++ b/source/manifestation/svg/actuators/generator.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -34,7 +34,7 @@ module mod_vtm lib_trait.attend ( trait_actuator, - "erzeuger", + "generator", { "view": ({"data": {"direction": direction}}) => { @@ -44,18 +44,18 @@ module mod_vtm ( "path", { - "d": shape_arrow, + "d": lib_svg.shape_arrow, "class": ( [ "pfeil", - "erzeuger", + "generator", ].join(" ") ), "transform": ( [ - rotation(direction/6), - translation(-0.2, 0), - skalierung(0.12), + lib_svg.rotation(direction/6), + lib_svg.translation(-0.2, 0), + lib_svg.skalierung(0.12), ].join(" ") ), } diff --git a/quelldatein/manifestation/svg/aktor/leser.ts b/source/manifestation/svg/actuators/reader.ts similarity index 91% rename from quelldatein/manifestation/svg/aktor/leser.ts rename to source/manifestation/svg/actuators/reader.ts index a614112..ba4f32e 100644 --- a/quelldatein/manifestation/svg/aktor/leser.ts +++ b/source/manifestation/svg/actuators/reader.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -34,7 +34,7 @@ module mod_vtm lib_trait.attend ( trait_actuator, - "leser", + "reader", { "view": ({"data": {"direction": direction, "symbol_links": symbol_links, "symbol_rechts": symbol_rechts}}) => { @@ -71,7 +71,7 @@ module mod_vtm ( "path", { - "d": shape_arrow, + "d": lib_svg.shape_arrow, "class": ( [ "pfeil", @@ -84,9 +84,9 @@ module mod_vtm ), "transform": ( [ - rotation(anglestaerke), - translation(+0.1, 0), - skalierung(0.075), + lib_svg.rotation(anglestaerke), + lib_svg.translation(+0.1, 0), + lib_svg.skalierung(0.075), ].join(" ") ), } diff --git a/quelldatein/manifestation/svg/aktor/verwerfer.ts b/source/manifestation/svg/actuators/rejector.ts similarity index 85% rename from quelldatein/manifestation/svg/aktor/verwerfer.ts rename to source/manifestation/svg/actuators/rejector.ts index d74edd7..5f72eb5 100644 --- a/quelldatein/manifestation/svg/aktor/verwerfer.ts +++ b/source/manifestation/svg/actuators/rejector.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -34,7 +34,7 @@ module mod_vtm lib_trait.attend ( trait_actuator, - "verwerfer", + "rejector", { "view": (actuator) => { @@ -44,9 +44,9 @@ module mod_vtm ( "circle", { - "cx": (0.0).toFixed(float_precision), - "cy": (0.0).toFixed(float_precision), - "r": (0.25).toFixed(float_precision), + "cx": (0.0).toFixed(lib_svg.float_precision), + "cy": (0.0).toFixed(lib_svg.float_precision), + "r": (0.25).toFixed(lib_svg.float_precision), "class": ( [ "kreis", diff --git a/quelldatein/manifestation/svg/aktor/schreiber.ts b/source/manifestation/svg/actuators/writer.ts similarity index 86% rename from quelldatein/manifestation/svg/aktor/schreiber.ts rename to source/manifestation/svg/actuators/writer.ts index 5c283a9..ab7a5ef 100644 --- a/quelldatein/manifestation/svg/aktor/schreiber.ts +++ b/source/manifestation/svg/actuators/writer.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -34,7 +34,7 @@ module mod_vtm lib_trait.attend ( trait_actuator, - "schreiber", + "writer", { "view": ({"data": {"direction": direction, "symbol": symbol}}) => { @@ -44,7 +44,7 @@ module mod_vtm ( "path", { - "d": shape_arrow, + "d": lib_svg.shape_arrow, "class": ( [ "pfeil", @@ -53,9 +53,9 @@ module mod_vtm ), "transform": ( [ - rotation(direction/6), - translation(-0.2, 0), - skalierung(0.12), + lib_svg.rotation(direction/6), + lib_svg.translation(-0.2, 0), + lib_svg.skalierung(0.12), ].join(" ") ), } diff --git a/quelldatein/manifestation/svg/partie.ts b/source/manifestation/svg/game.ts similarity index 76% rename from quelldatein/manifestation/svg/partie.ts rename to source/manifestation/svg/game.ts index 18076ce..0ac42f1 100644 --- a/quelldatein/manifestation/svg/partie.ts +++ b/source/manifestation/svg/game.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,15 +25,15 @@ module mod_vtm export module mod_svg { - export module mod_round + export module mod_game { /** * @author kcf */ - export type type_round = + export type type_game = { - model : mod_vtm.mod_model.mod_round.type_round; + model : mod_vtm.mod_model.mod_game.type_game; } ; @@ -41,7 +41,7 @@ module mod_vtm /** * @author kcf */ - function create(model : mod_vtm.mod_model.mod_round.type_round) : type_round + function create(model : mod_vtm.mod_model.mod_game.type_game) : type_game { return { "model": model @@ -52,10 +52,10 @@ module mod_vtm /** * @author kcf */ - export function create_manifestation(model : mod_vtm.mod_model.mod_round.type_round) : type_manifestation + export function create_extended(model : mod_vtm.mod_model.mod_game.type_game) : type_manifestation { return { - "kind": "svg_round", + "kind": "svg_game", "data": create(model) }; } @@ -64,20 +64,20 @@ module mod_vtm /** * @author kcf */ - function view(round : type_round) : lib_xml.type_node + function view(game : type_game) : lib_xml.type_node { - let children_round : Array = []; + let children_game : Array = []; // Welt { let children_world : Array = []; // Felder { let children_tiles : Array = []; - mod_vtm.mod_model.mod_world.tiles_read(mod_vtm.mod_model.mod_round.world_read(round.model)).forEach + mod_vtm.mod_model.mod_world.tiles_read(mod_vtm.mod_model.mod_game.world_read(game.model)).forEach ( ({"spot": spot, "actuator": actuator}) => { - let manifestation_tile : type_manifestation = mod_actuator.create_manifestation(actuator, spot); + let manifestation_tile : type_manifestation = mod_actuator.create_extended(actuator, spot); let node_tile : lib_xml.type_node = mod_manifestation.view(manifestation_tile); children_tiles.push(node_tile); } @@ -106,41 +106,41 @@ module mod_vtm children_world ) ); - children_round.push(node_world); + children_game.push(node_world); } // Figur { - let token_ : lib_errormonade.type_errormonade = mod_vtm.mod_model.mod_round.token_read(round.model); + let token_ : lib_errormonade.type_errormonade = mod_vtm.mod_model.mod_game.token_read(game.model); if (lib_errormonade.filled(token_)) { let token : mod_vtm.mod_model.mod_token.type_token = lib_errormonade.read(token_); - let manifestation_token : type_manifestation = mod_token.create_manifestation(token); + let manifestation_token : type_manifestation = mod_token.create_extended(token); let node_token : lib_xml.type_node = mod_manifestation.view(manifestation_token); - children_round.push(node_token); + children_game.push(node_token); } else { // nothing tun } } - let node_round : lib_xml.type_node = ( + let node_game : lib_xml.type_node = ( lib_xml.create_normal ( "g", { - "class": "round", + "class": "game", }, - children_round + children_game ) ); - return node_round; + return node_game; } /** * @author kcf */ - function bind(round : type_round) : void + function bind(game : type_game) : void { } @@ -148,10 +148,10 @@ module mod_vtm /** * @author kcf */ - lib_trait.attend> + lib_trait.attend> ( trait_manifestation, - "svg_round", + "svg_game", { "view": (manifestation) => view(manifestation.data), "bind": (manifestation) => bind(manifestation.data), diff --git a/quelldatein/manifestation/svg/figur.ts b/source/manifestation/svg/token.ts similarity index 84% rename from quelldatein/manifestation/svg/figur.ts rename to source/manifestation/svg/token.ts index c5bc8b6..6959881 100644 --- a/quelldatein/manifestation/svg/figur.ts +++ b/source/manifestation/svg/token.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -56,7 +56,7 @@ module mod_vtm /** * @author kcf */ - export function create_manifestation + export function create_extended ( model : mod_vtm.mod_model.mod_token.type_token ) @@ -87,9 +87,9 @@ module mod_vtm ( "circle", { - "cx": (0.0).toFixed(float_precision), - "cy": (0.0).toFixed(float_precision), - "r": (0.125).toFixed(float_precision), + "cx": (0.0).toFixed(lib_svg.float_precision), + "cy": (0.0).toFixed(lib_svg.float_precision), + "r": (0.125).toFixed(lib_svg.float_precision), "class": "stein", } ) @@ -112,14 +112,14 @@ module mod_vtm ( "circle", { - "cx": x.toFixed(float_precision), - "cy": y.toFixed(float_precision), - "r": r.toFixed(float_precision), + "cx": x.toFixed(lib_svg.float_precision), + "cy": y.toFixed(lib_svg.float_precision), + "r": r.toFixed(lib_svg.float_precision), /* - "x": (x-r).toFixed(float_precision), - "y": (y-r).toFixed(float_precision), - "width": (2*r).toFixed(float_precision), - "height": (2*r).toFixed(float_precision), + "x": (x-r).toFixed(lib_svg.float_precision), + "y": (y-r).toFixed(lib_svg.float_precision), + "width": (2*r).toFixed(lib_svg.float_precision), + "height": (2*r).toFixed(lib_svg.float_precision), */ "class": ( [ @@ -146,14 +146,14 @@ module mod_vtm ); children_token.push(node_tape); } - let position : mod_position.type_position = mod_position.von_spot(mod_vtm.mod_model.mod_token.spot_read(token)); + let position : mod_position.type_position = mod_position.from_spot(mod_vtm.mod_model.mod_token.spot_read(token)); let node_token = ( lib_xml.create_normal ( "g", { "class": "token", - "transform": translation(position.x, position.y), + "transform": lib_svg.translation(position.x, position.y), }, children_token ) diff --git a/quelldatein/manifestation/web/partie.scss b/source/manifestation/web/game.scss similarity index 96% rename from quelldatein/manifestation/web/partie.scss rename to source/manifestation/web/game.scss index c0a4edd..19a76f3 100644 --- a/quelldatein/manifestation/web/partie.scss +++ b/source/manifestation/web/game.scss @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -59,7 +59,7 @@ $helligkeit_symbol: 50%; stroke: none; } -.erzeuger +.generator { fill: hsl( 0, 0%, 100%); } diff --git a/quelldatein/manifestation/web/partie.ts b/source/manifestation/web/game.ts similarity index 66% rename from quelldatein/manifestation/web/partie.ts rename to source/manifestation/web/game.ts index 7a3f6b7..b937efe 100644 --- a/quelldatein/manifestation/web/partie.ts +++ b/source/manifestation/web/game.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,25 +25,27 @@ module mod_vtm export module mod_web { - export module mod_round + export module mod_game { /** * @author kcf */ - function text_nachedit(text : string) : string + function text_postprocess(text : string) : string { - let regexp : RegExp = (new RegExp("\\$\{s(\\d*)\}", "g")); - return text.replace(regexp, "  "); + let vars : {[name : string] : string} = {}; + for (let i : int = 0; i <= 3; i += 1) + vars["s" + i.toFixed(0)] = ("  "); + return lib_string.stance(text, vars); } /** * @author kcf */ - export type type_round = + export type type_game = { - model : mod_model.mod_round.type_round; + model : mod_model.mod_game.type_game; area : Element; intervall : lib_errormonade.type_errormonade; } @@ -55,10 +57,10 @@ module mod_vtm */ function create ( - model : mod_model.mod_round.type_round, + model : mod_model.mod_game.type_game, area : Element ) - : type_round + : type_game { return { "model": model, @@ -71,31 +73,34 @@ module mod_vtm /** * @author kcf */ - export function create_erweitert + export function create_extended ( - model : mod_model.mod_round.type_round, + model : mod_model.mod_game.type_game, area : Element ) - : type_manifestation + : type_manifestation { - return { - "kind": "web_round", - "data": create(model, area) - }; + return ( + lib_call.wrap + ( + "web_game", + create(model, area) + ) + ); } /** * @author kcf */ - function update_task(round : type_round) : void + function update_task(game : type_game) : void { document.querySelector("#task_text").innerHTML = ( - text_nachedit + text_postprocess ( mod_vtm.mod_model.mod_task.text ( - mod_vtm.mod_model.mod_round.task_read(round.model) + mod_vtm.mod_model.mod_game.task_read(game.model) ) ) ); @@ -105,44 +110,44 @@ module mod_vtm /** * @author kcf */ - function update_world(round : type_round) : void + function update_world(game : type_game) : void { - let node_svg : lib_xml.type_node = mod_svg.root + let node_svg : lib_xml.type_node = lib_svg.root ( -4, -4, +4, +4, 800, 800, - [mod_manifestation.view(mod_svg.mod_round.create_manifestation(round.model))] + [mod_manifestation.view(mod_svg.mod_game.create_extended(game.model))] ) ; - round.area.innerHTML = lib_xml.view(node_svg); + game.area.innerHTML = lib_xml.view(node_svg); } /** * @author kcf */ - function update_token(round : type_round) : void + function update_token(game : type_game) : void { - let node_svg : lib_xml.type_node = mod_svg.root + let node_svg : lib_xml.type_node = lib_svg.root ( -4, -4, +4, +4, 800, 800, - [mod_manifestation.view(mod_svg.mod_round.create_manifestation(round.model))] + [mod_manifestation.view(mod_svg.mod_game.create_extended(game.model))] ) ; - round.area.innerHTML = lib_xml.view(node_svg); + game.area.innerHTML = lib_xml.view(node_svg); } /** * @author kcf */ - function update_mode(round : type_round) : void + function update_mode(game : type_game) : void { let status : string; - switch (mod_vtm.mod_model.mod_round.mode_read(round.model)) + switch (mod_vtm.mod_model.mod_game.mode_read(game.model)) { case mod_vtm.mod_model.mod_mode.initial: { @@ -178,21 +183,21 @@ module mod_vtm /** * @author kcf */ - function update_buttons(round : type_round) : void + function update_buttons(game : type_game) : void { - let mode : mod_vtm.mod_model.mod_mode.type_mode = mod_vtm.mod_model.mod_round.mode_read(round.model); - let klasse : string; + let mode : mod_vtm.mod_model.mod_mode.type_mode = mod_vtm.mod_model.mod_game.mode_read(game.model); + let class_ : string; switch (mode) { case mod_vtm.mod_model.mod_mode.initial: { - klasse = "initial"; + class_ = "initial"; break; } case mod_vtm.mod_model.mod_mode.uncertain: { - klasse = ( - lib_errormonade.filled(round.intervall) + class_ = ( + lib_errormonade.filled(game.intervall) ? "uncertain_running" : "uncertain_standing" ); @@ -201,7 +206,7 @@ module mod_vtm case mod_vtm.mod_model.mod_mode.wrong: case mod_vtm.mod_model.mod_mode.correct: { - klasse = "done"; + class_ = "done"; break; } default: @@ -210,97 +215,97 @@ module mod_vtm break; } } - document.querySelector("#buttons").setAttribute("class", klasse); + document.querySelector("#buttons").setAttribute("class", class_); } /** * @author kcf */ - function view(round : type_round) : void + function view(game : type_game) : void { - update_task(round); - update_world(round); - update_token(round); - update_mode(round); - update_buttons(round); + update_task(game); + update_world(game); + update_token(game); + update_mode(game); + update_buttons(game); } /** * @author kcf */ - function stop(round : type_round) : void + function stop(game : type_game) : void { - if (lib_errormonade.filled(round.intervall)) + if (lib_errormonade.filled(game.intervall)) { - clearInterval(lib_errormonade.read(round.intervall)); - round.intervall = (lib_errormonade.create_nothing()); + clearInterval(lib_errormonade.read(game.intervall)); + game.intervall = (lib_errormonade.create_nothing()); } else { let message : string = "kein Intervall gesetzt"; console.warn(message); } - update_buttons(round); + update_buttons(game); } /** * @author kcf */ - function resume(round : type_round) : void + function resume(game : type_game) : void { - mod_vtm.mod_model.mod_round.resume(round.model); - let mode : mod_vtm.mod_model.mod_mode.type_mode = mod_vtm.mod_model.mod_round.mode_read(round.model); + mod_vtm.mod_model.mod_game.resume(game.model); + let mode : mod_vtm.mod_model.mod_mode.type_mode = mod_vtm.mod_model.mod_game.mode_read(game.model); if (mode <= 1) { // nothing tun } else { - stop(round); + stop(game); } - update_buttons(round); + update_buttons(game); } /** * @author kcf */ - function testen(round : type_round) : void + function testen(game : type_game) : void { - let handle : any = setInterval(() => resume(round), 500); - round.intervall = (lib_errormonade.create_just(handle)); + let handle : any = setInterval(() => resume(game), 500); + game.intervall = (lib_errormonade.create_just(handle)); } /** * @author kcf */ - function edit(round : type_round) : void + function edit(game : type_game) : void { - stop(round); - mod_vtm.mod_model.mod_round.reset(round.model); + stop(game); + mod_vtm.mod_model.mod_game.reset(game.model); } /** * @author kcf */ - function clear(round : type_round) : void + function clear(game : type_game) : void { - mod_vtm.mod_model.mod_round.world_clear(round.model); - mod_vtm.mod_model.mod_round.reset(round.model); + mod_vtm.mod_model.mod_game.world_clear(game.model); + mod_vtm.mod_model.mod_game.reset(game.model); } /** * @author kcf */ - function bind(round : type_round) : void + function bind(game : type_game) : void { - let spot_ermitteln = (target : EventTarget) => + let spot_determine = (target : EventTarget) => { let spot : lib_errormonade.type_errormonade; let dom_tile : Element = target["closest"](".tile"); @@ -311,63 +316,63 @@ module mod_vtm else { let rel : string = dom_tile.getAttribute("rel") - spot = (lib_errormonade.create_just(mod_vtm.mod_model.mod_spot.von_hash(rel))); + spot = (lib_errormonade.create_just(mod_vtm.mod_model.mod_spot.from_hash(rel))); } return spot; } ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_task", + game.model, + "change_task", (data) => { - update_task(round); + update_task(game); } ) ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_world", + game.model, + "change_world", (data) => { - update_world(round); + update_world(game); } ) ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_token", + game.model, + "change_token", (data) => { - update_token(round); + update_token(game); } ) ; - mod_vtm.mod_model.mod_round.lauschen + mod_vtm.mod_model.mod_game.lauschen ( - round.model, - "aendrung_mode", + game.model, + "change_mode", (data) => { - update_mode(round); - update_buttons(round); + update_mode(game); + update_buttons(game); } ) ; // Links-Klick - round.area.addEventListener + game.area.addEventListener ( "click", event => { event.preventDefault(); - let spot_ : lib_errormonade.type_errormonade = spot_ermitteln(event.target); + let spot_ : lib_errormonade.type_errormonade = spot_determine(event.target); if (lib_errormonade.filled(spot_)) { - mod_vtm.mod_model.mod_round.world_tile_wechseln(round.model, lib_errormonade.read(spot_), false); + mod_vtm.mod_model.mod_game.world_tile_wechseln(game.model, lib_errormonade.read(spot_), false); } else { @@ -377,16 +382,16 @@ module mod_vtm ) ; // Rechts-Klick - round.area.addEventListener + game.area.addEventListener ( "contextmenu", event => { event.preventDefault(); - let spot_ : lib_errormonade.type_errormonade = spot_ermitteln(event.target); + let spot_ : lib_errormonade.type_errormonade = spot_determine(event.target); if (lib_errormonade.filled(spot_)) { - mod_vtm.mod_model.mod_round.world_tile_wechseln(round.model, lib_errormonade.read(spot_), true); + mod_vtm.mod_model.mod_game.world_tile_wechseln(game.model, lib_errormonade.read(spot_), true); } else { @@ -396,17 +401,17 @@ module mod_vtm ) ; // Mausrad - round.area.addEventListener + game.area.addEventListener ( "wheel", event => { event.preventDefault(); - let spot_ : lib_errormonade.type_errormonade = spot_ermitteln(event.target); + let spot_ : lib_errormonade.type_errormonade = spot_determine(event.target); if (lib_errormonade.filled(spot_)) { let inkrement : int = ((event["deltaY"] < 0) ? -1 : +1); - mod_vtm.mod_model.mod_round.world_tile_rotate(round.model, lib_errormonade.read(spot_), inkrement); + mod_vtm.mod_model.mod_game.world_tile_rotate(game.model, lib_errormonade.read(spot_), inkrement); } else { @@ -421,8 +426,8 @@ module mod_vtm "click", event => { - stop(round); - resume(round); + stop(game); + resume(game); } ) ; @@ -432,7 +437,7 @@ module mod_vtm "click", event => { - testen(round); + testen(game); } ) ; @@ -442,7 +447,7 @@ module mod_vtm "click", event => { - stop(round); + stop(game); } ) ; @@ -452,7 +457,7 @@ module mod_vtm "click", event => { - edit(round); + edit(game); } ) ; @@ -462,7 +467,7 @@ module mod_vtm "click", event => { - clear(round); + clear(game); } ) ; @@ -472,10 +477,10 @@ module mod_vtm /** * @author kcf */ - lib_trait.attend> + lib_trait.attend> ( trait_manifestation, - "web_round", + "web_game", { "view": (manifestation) => view(manifestation.data), "bind": (manifestation) => bind(manifestation.data), diff --git a/quelldatein/aufbau/aktoren/_aktor.ts b/source/model/actuators/_actuator.ts similarity index 97% rename from quelldatein/aufbau/aktoren/_aktor.ts rename to source/model/actuators/_actuator.ts index ae82d95..aa531b0 100644 --- a/quelldatein/aufbau/aktoren/_aktor.ts +++ b/source/model/actuators/_actuator.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/aufbau/aktoren/annehmer.ts b/source/model/actuators/acceptor.ts similarity index 88% rename from quelldatein/aufbau/aktoren/annehmer.ts rename to source/model/actuators/acceptor.ts index 577fec3..95e0890 100644 --- a/quelldatein/aufbau/aktoren/annehmer.ts +++ b/source/model/actuators/acceptor.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,19 +25,19 @@ module mod_vtm export module mod_actuator { - export module mod_annehmer + export module mod_acceptor { /** * @author kcf */ - let kind : string = "annehmer"; + let kind : string = "acceptor"; /** * @author kcf */ - export type type_annehmer = + export type type_acceptor = { } ; @@ -49,7 +49,7 @@ module mod_vtm function create ( ) - : type_annehmer + : type_acceptor { return { }; @@ -59,7 +59,7 @@ module mod_vtm /** * @author kcf */ - export function create_actuator + export function create_extended ( ) : mod_actuator.type_actuator @@ -74,7 +74,7 @@ module mod_vtm function example ( ) - : type_annehmer + : type_acceptor { return create(); } @@ -85,7 +85,7 @@ module mod_vtm */ function rotate ( - annehmer : type_annehmer, + acceptor : type_acceptor, inkrement ?: int ) : void @@ -98,7 +98,7 @@ module mod_vtm */ function use ( - annehmer : type_annehmer, + acceptor : type_acceptor, token : mod_token.type_token ) : void @@ -112,7 +112,7 @@ module mod_vtm */ function export_ ( - annehmer : type_annehmer + acceptor : type_acceptor ) : any { @@ -128,7 +128,7 @@ module mod_vtm ( raw : any ) - : type_annehmer + : type_acceptor { return ( create diff --git a/quelldatein/aufbau/aktoren/befoerderer.ts b/source/model/actuators/conveyer.ts similarity index 81% rename from quelldatein/aufbau/aktoren/befoerderer.ts rename to source/model/actuators/conveyer.ts index 5b3c20e..1426298 100644 --- a/quelldatein/aufbau/aktoren/befoerderer.ts +++ b/source/model/actuators/conveyer.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,19 +25,19 @@ module mod_vtm export module mod_actuator { - export module mod_befoerderer + export module mod_conveyer { /** * @author kcf */ - let kind : string = "befoerderer"; + let kind : string = "conveyer"; /** * @author kcf */ - export type type_befoerderer = + export type type_conveyer = { direction : mod_direction.type_direction; } @@ -51,7 +51,7 @@ module mod_vtm ( direction : mod_direction.type_direction ) - : type_befoerderer + : type_conveyer { return { "direction": direction, @@ -62,7 +62,7 @@ module mod_vtm /** * @author kcf */ - export function create_actuator + export function create_extended ( direction : mod_direction.type_direction ) @@ -78,7 +78,7 @@ module mod_vtm function example ( ) - : type_befoerderer + : type_conveyer { return create(0); } @@ -89,11 +89,11 @@ module mod_vtm */ export function direction_read ( - befoerderer : type_befoerderer + conveyer : type_conveyer ) : mod_direction.type_direction { - return befoerderer.direction; + return conveyer.direction; } @@ -102,12 +102,12 @@ module mod_vtm */ function rotate ( - befoerderer : type_befoerderer, + conveyer : type_conveyer, inkrement : int = +1 ) : void { - befoerderer.direction = mod_direction.add(befoerderer.direction, inkrement); + conveyer.direction = mod_direction.add(conveyer.direction, inkrement); } @@ -116,12 +116,12 @@ module mod_vtm */ function use ( - befoerderer : type_befoerderer, + conveyer : type_conveyer, token : mod_token.type_token ) : void { - mod_token.move(token, befoerderer.direction); + mod_token.move(token, conveyer.direction); } @@ -130,12 +130,12 @@ module mod_vtm */ function export_ ( - befoerderer : type_befoerderer + conveyer : type_conveyer ) : any { return { - "direction": mod_direction.export_(befoerderer.direction), + "direction": mod_direction.export_(conveyer.direction), }; } @@ -145,14 +145,14 @@ module mod_vtm */ function import_ ( - befoerderer_ : any + conveyer_ : any ) - : type_befoerderer + : type_conveyer { return ( create ( - mod_direction.import_(befoerderer_["direction"]) + mod_direction.import_(conveyer_["direction"]) ) ); } diff --git a/quelldatein/aufbau/aktoren/erzeuger.ts b/source/model/actuators/generator.ts similarity index 84% rename from quelldatein/aufbau/aktoren/erzeuger.ts rename to source/model/actuators/generator.ts index 19ee196..0536f40 100644 --- a/quelldatein/aufbau/aktoren/erzeuger.ts +++ b/source/model/actuators/generator.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,19 +25,19 @@ module mod_vtm export module mod_actuator { - export module mod_erzeuger + export module mod_generator { /** * @author kcf */ - let kind : string = "erzeuger"; + let kind : string = "generator"; /** * @author kcf */ - export type type_erzeuger = + export type type_generator = { direction : mod_direction.type_direction; } @@ -51,7 +51,7 @@ module mod_vtm ( direction : mod_direction.type_direction ) - : type_erzeuger + : type_generator { return { "direction": direction, @@ -62,7 +62,7 @@ module mod_vtm /** * @author kcf */ - export function create_actuator + export function create_extended ( direction : mod_direction.type_direction ) @@ -78,7 +78,7 @@ module mod_vtm function example ( ) - : type_erzeuger + : type_generator { return create(0); } @@ -89,11 +89,11 @@ module mod_vtm */ export function direction_read ( - erzeuger : type_erzeuger + generator : type_generator ) : mod_direction.type_direction { - return erzeuger.direction; + return generator.direction; } @@ -102,12 +102,12 @@ module mod_vtm */ function rotate ( - erzeuger : type_erzeuger, + generator : type_generator, inkrement : int = +1 ) : void { - erzeuger.direction = mod_direction.add(erzeuger.direction, inkrement); + generator.direction = mod_direction.add(generator.direction, inkrement); } @@ -116,12 +116,12 @@ module mod_vtm */ function use ( - erzeuger : type_erzeuger, + generator : type_generator, token : mod_token.type_token ) : void { - mod_token.move(token, erzeuger.direction); + mod_token.move(token, generator.direction); } @@ -130,12 +130,12 @@ module mod_vtm */ function export_ ( - erzeuger : type_erzeuger + generator : type_generator ) : any { return { - "direction": mod_direction.export_(erzeuger.direction), + "direction": mod_direction.export_(generator.direction), }; } @@ -147,7 +147,7 @@ module mod_vtm ( raw : any ) - : type_erzeuger + : type_generator { return ( create diff --git a/quelldatein/aufbau/aktoren/leser.ts b/source/model/actuators/reader.ts similarity index 84% rename from quelldatein/aufbau/aktoren/leser.ts rename to source/model/actuators/reader.ts index 60a9f71..7fb0c55 100644 --- a/quelldatein/aufbau/aktoren/leser.ts +++ b/source/model/actuators/reader.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,19 +25,19 @@ module mod_vtm export module mod_actuator { - export module mod_leser + export module mod_reader { /** * @author kcf */ - let kind : string = "leser"; + let kind : string = "reader"; /** * @author kcf */ - export type type_leser = + export type type_reader = { "direction": mod_direction.type_direction, "symbol_links": mod_symbol.type_symbol, @@ -55,7 +55,7 @@ module mod_vtm symbol_links : mod_symbol.type_symbol, symbol_rechts : mod_symbol.type_symbol ) - : type_leser + : type_reader { return { "direction": direction, @@ -68,7 +68,7 @@ module mod_vtm /** * @author kcf */ - export function create_actuator + export function create_extended ( direction : mod_direction.type_direction, symbol_links : mod_symbol.type_symbol, @@ -86,7 +86,7 @@ module mod_vtm function example ( ) - : type_leser + : type_reader { return create(0, 0, 1); } @@ -97,11 +97,11 @@ module mod_vtm */ export function direction_read ( - leser : type_leser + reader : type_reader ) : mod_direction.type_direction { - return leser.direction; + return reader.direction; } @@ -110,11 +110,11 @@ module mod_vtm */ export function symbol_links_read ( - leser : type_leser + reader : type_reader ) : mod_symbol.type_symbol { - return leser.symbol_links; + return reader.symbol_links; } @@ -123,11 +123,11 @@ module mod_vtm */ export function symbol_rechts_read ( - leser : type_leser + reader : type_reader ) : mod_symbol.type_symbol { - return leser.symbol_rechts; + return reader.symbol_rechts; } @@ -136,12 +136,12 @@ module mod_vtm */ function rotate ( - leser : type_leser, + reader : type_reader, inkrement : int = +1 ) : void { - leser.direction = mod_direction.add(leser.direction, inkrement); + reader.direction = mod_direction.add(reader.direction, inkrement); } @@ -150,7 +150,7 @@ module mod_vtm */ function use ( - leser : type_leser, + reader : type_reader, token : mod_token.type_token ) : void @@ -160,12 +160,12 @@ module mod_vtm if (lib_errormonade.filled(symbol_)) { let symbol : mod_symbol.type_symbol = lib_errormonade.read(symbol_); - if (symbol === leser.symbol_links) + if (symbol === reader.symbol_links) { mod_token.shift(token); summand = +2; } - else if (symbol === leser.symbol_rechts) + else if (symbol === reader.symbol_rechts) { mod_token.shift(token); summand = -2; @@ -179,7 +179,7 @@ module mod_vtm { summand = 0; } - let direction : mod_direction.type_direction = mod_direction.add(leser.direction, summand); + let direction : mod_direction.type_direction = mod_direction.add(reader.direction, summand); mod_token.move(token, direction); } @@ -189,14 +189,14 @@ module mod_vtm */ function export_ ( - leser : type_leser + reader : type_reader ) : any { return { - "direction": mod_direction.export_(leser.direction), - "symbol_links": mod_symbol.export_(leser.symbol_links), - "symbol_rechts": mod_symbol.export_(leser.symbol_rechts), + "direction": mod_direction.export_(reader.direction), + "symbol_links": mod_symbol.export_(reader.symbol_links), + "symbol_rechts": mod_symbol.export_(reader.symbol_rechts), }; } @@ -208,7 +208,7 @@ module mod_vtm ( raw : any ) - : type_leser + : type_reader { return ( create diff --git a/quelldatein/aufbau/aktoren/verwerfer.ts b/source/model/actuators/rejector.ts similarity index 88% rename from quelldatein/aufbau/aktoren/verwerfer.ts rename to source/model/actuators/rejector.ts index 1abdf0e..67ad8e0 100644 --- a/quelldatein/aufbau/aktoren/verwerfer.ts +++ b/source/model/actuators/rejector.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,19 +25,19 @@ module mod_vtm export module mod_actuator { - export module mod_verwerfer + export module mod_rejector { /** * @author kcf */ - let kind : string = "verwerfer"; + let kind : string = "rejector"; /** * @author kcf */ - export type type_verwerfer = + export type type_rejector = { } ; @@ -49,7 +49,7 @@ module mod_vtm function create ( ) - : type_verwerfer + : type_rejector { return { }; @@ -59,7 +59,7 @@ module mod_vtm /** * @author kcf */ - export function create_actuator + export function create_extended ( ) : mod_actuator.type_actuator @@ -74,7 +74,7 @@ module mod_vtm function example ( ) - : type_verwerfer + : type_rejector { return create(); } @@ -85,7 +85,7 @@ module mod_vtm */ function rotate ( - verwerfer : type_verwerfer, + rejector : type_rejector, inkrement ?: int ) : void @@ -98,7 +98,7 @@ module mod_vtm */ function use ( - verwerfer : type_verwerfer, + rejector : type_rejector, token : mod_token.type_token ) : void @@ -112,7 +112,7 @@ module mod_vtm */ function export_ ( - verwerfer : type_verwerfer + rejector : type_rejector ) : any { @@ -128,7 +128,7 @@ module mod_vtm ( raw : any ) - : type_verwerfer + : type_rejector { return ( create diff --git a/quelldatein/aufbau/aktoren/schreiber.ts b/source/model/actuators/writer.ts similarity index 82% rename from quelldatein/aufbau/aktoren/schreiber.ts rename to source/model/actuators/writer.ts index 661b746..0285275 100644 --- a/quelldatein/aufbau/aktoren/schreiber.ts +++ b/source/model/actuators/writer.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -25,19 +25,19 @@ module mod_vtm export module mod_actuator { - export module mod_schreiber + export module mod_writer { /** * @author kcf */ - let kind : string = "schreiber"; + let kind : string = "writer"; /** * @author kcf */ - export type type_schreiber = + export type type_writer = { direction : mod_direction.type_direction; symbol : mod_symbol.type_symbol; @@ -53,7 +53,7 @@ module mod_vtm direction : mod_direction.type_direction, symbol : mod_symbol.type_symbol ) - : type_schreiber + : type_writer { return { "direction": direction, @@ -65,7 +65,7 @@ module mod_vtm /** * @author kcf */ - export function create_actuator + export function create_extended ( direction : mod_direction.type_direction, symbol : mod_symbol.type_symbol @@ -82,7 +82,7 @@ module mod_vtm function example ( ) - : type_schreiber + : type_writer { return create(0, 0); } @@ -93,11 +93,11 @@ module mod_vtm */ export function direction_read ( - schreiber : type_schreiber + writer : type_writer ) : mod_direction.type_direction { - return schreiber.direction; + return writer.direction; } @@ -106,11 +106,11 @@ module mod_vtm */ export function symbol_read ( - schreiber : type_schreiber + writer : type_writer ) : mod_symbol.type_symbol { - return schreiber.symbol; + return writer.symbol; } @@ -119,12 +119,12 @@ module mod_vtm */ function rotate ( - schreiber : type_schreiber, + writer : type_writer, inkrement : int = +1 ) : void { - schreiber.direction = mod_direction.add(schreiber.direction, inkrement); + writer.direction = mod_direction.add(writer.direction, inkrement); } @@ -133,13 +133,13 @@ module mod_vtm */ function use ( - schreiber : type_schreiber, + writer : type_writer, token : mod_token.type_token ) : void { - mod_token.write(token, schreiber.symbol); - mod_token.move(token, schreiber.direction); + mod_token.write(token, writer.symbol); + mod_token.move(token, writer.direction); } @@ -148,13 +148,13 @@ module mod_vtm */ function export_ ( - schreiber : type_schreiber + writer : type_writer ) : any { return { - "direction": mod_direction.export_(schreiber.direction), - "symbol": mod_symbol.export_(schreiber.symbol), + "direction": mod_direction.export_(writer.direction), + "symbol": mod_symbol.export_(writer.symbol), }; } @@ -166,7 +166,7 @@ module mod_vtm ( raw : any ) - : type_schreiber + : type_writer { return ( create diff --git a/quelldatein/aufbau/richtung.ts b/source/model/direction.ts similarity index 95% rename from quelldatein/aufbau/richtung.ts rename to source/model/direction.ts index 6e482ec..09b479d 100644 --- a/quelldatein/aufbau/richtung.ts +++ b/source/model/direction.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/aufbau/partie.ts b/source/model/game.ts similarity index 71% rename from quelldatein/aufbau/partie.ts rename to source/model/game.ts index 48723ec..52fed4f 100644 --- a/quelldatein/aufbau/partie.ts +++ b/source/model/game.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -22,13 +22,13 @@ module mod_vtm export module mod_model { - export module mod_round + export module mod_game { /** * @author kcf */ - export type type_round = + export type type_game = { world : mod_world.type_world; token : lib_errormonade.type_errormonade; @@ -47,9 +47,9 @@ module mod_vtm ( task : mod_task.type_task ) - : type_round + : type_game { - let round : type_round = + let game : type_game = { "world": undefined, "token": undefined, @@ -59,17 +59,17 @@ module mod_vtm "listeners": undefined, } ; - round.listeners = + game.listeners = { - "aendrung_task": [], - "aendrung_world": [], - "aendrung_token": [], - "aendrung_mode": [], + "change_task": [], + "change_world": [], + "change_token": [], + "change_mode": [], } ; - world_clear(round, false); - reset(round, false); - return round; + world_clear(game, false); + reset(game, false); + return game; } @@ -78,15 +78,15 @@ module mod_vtm */ export function lauschen ( - round : type_round, + game : type_game, event : string, procedure : (data ?: any)=>void ) : void { - if (event in round.listeners) + if (event in game.listeners) { - round.listeners[event].push(procedure); + game.listeners[event].push(procedure); } else { @@ -101,14 +101,14 @@ module mod_vtm */ function notify ( - round : type_round, + game : type_game, event : string, data : any = {} ) : void { - if (event in round.listeners) + if (event in game.listeners) { - round.listeners[event].forEach + game.listeners[event].forEach ( procedure => { @@ -130,18 +130,18 @@ module mod_vtm */ export function reset ( - round : type_round, + game : type_game, inform : boolean = true ) : void { - round.token = (lib_errormonade.create_nothing()); - round.testindex = (lib_errormonade.create_nothing()); - round.mode = mod_mode.initial; + game.token = (lib_errormonade.create_nothing()); + game.testindex = (lib_errormonade.create_nothing()); + game.mode = mod_mode.initial; if (inform) { - notify(round, "aendrung_token", {}); - notify(round, "aendrung_mode", {}); + notify(game, "change_token", {}); + notify(game, "change_mode", {}); } else { @@ -155,11 +155,11 @@ module mod_vtm */ export function task_read ( - round : type_round + game : type_game ) : mod_task.type_task { - return round.task; + return game.task; } @@ -168,14 +168,14 @@ module mod_vtm */ export function task_set ( - round : type_round, + game : type_game, task : mod_task.type_task ) : void { - round.task = task; - // round.world_clear(); - notify(round, "aendrung_task", {}); - reset(round); + game.task = task; + // game.world_clear(); + notify(game, "change_task", {}); + reset(game); } @@ -184,11 +184,11 @@ module mod_vtm */ export function world_read ( - round : type_round + game : type_game ) : mod_world.type_world { - return round.world; + return game.world; } @@ -197,16 +197,16 @@ module mod_vtm */ export function world_set ( - round : type_round, + game : type_game, world : mod_world.type_world, inform : boolean = true ) : void { - round.world = world; + game.world = world; if (inform) { - notify(round, "aendrung_world", {}); + notify(game, "change_world", {}); } else { @@ -220,15 +220,15 @@ module mod_vtm */ export function world_clear ( - round : type_round, + game : type_game, inform : boolean = true ) : void { - round.world = mod_world.blanko(); + game.world = mod_world.blanko(); if (inform) { - notify(round, "aendrung_world", {}); + notify(game, "change_world", {}); } else { @@ -242,11 +242,11 @@ module mod_vtm */ export function token_read ( - round : type_round + game : type_game ) : lib_errormonade.type_errormonade { - return round.token; + return game.token; } @@ -255,11 +255,11 @@ module mod_vtm */ export function mode_read ( - round : type_round + game : type_game ) : mod_mode.type_mode { - return round.mode; + return game.mode; } @@ -268,30 +268,30 @@ module mod_vtm */ export function world_tile_wechseln ( - round : type_round, + game : type_game, spot : mod_spot.type_spot, umgekehrt : boolean = false ) : void { - if (! (round.mode === mod_mode.initial)) + if (! (game.mode === mod_mode.initial)) { let message : string = "gesperrt"; } else { - mod_world.tile_wechseln(round.world, spot, umgekehrt); + mod_world.tile_wechseln(game.world, spot, umgekehrt); notify ( - round, - "aendrung_world", + game, + "change_world", { "kind": "tile_wechseln", "data": { "spot": spot, "umgekehrt": umgekehrt, - "tile": mod_world.tile_get(round.world, spot), + "tile": mod_world.tile_get(game.world, spot), } } ) @@ -305,20 +305,20 @@ module mod_vtm */ export function world_tile_rotate ( - round : type_round, + game : type_game, spot : mod_spot.type_spot, inkrement : int = +1 ) : void { - if (! (round.mode === mod_mode.initial)) + if (! (game.mode === mod_mode.initial)) { let message : string = "gesperrt"; } else { - mod_world.tile_rotate(round.world, spot, inkrement); - notify(round, "aendrung_world", {}); + mod_world.tile_rotate(game.world, spot, inkrement); + notify(game, "change_world", {}); } } @@ -328,27 +328,27 @@ module mod_vtm */ export function resume ( - round : type_round + game : type_game ) : void { - switch (round.mode) + switch (game.mode) { case mod_mode.initial: { - round.mode = mod_mode.uncertain; - round.testindex = (lib_errormonade.create_just(0)); - notify(round, "aendrung_mode", {}); + game.mode = mod_mode.uncertain; + game.testindex = (lib_errormonade.create_just(0)); + notify(game, "change_mode", {}); break; } case mod_mode.uncertain: { - if (! lib_errormonade.filled(round.token)) + if (! lib_errormonade.filled(game.token)) { - let test : mod_test.type_test = mod_task.tests(round.task)[lib_errormonade.read(round.testindex)]; + let test : mod_test.type_test = mod_task.tests(game.task)[lib_errormonade.read(game.testindex)]; let tape : Array = mod_vtm.mod_helfer.list_copy(mod_test.input(test)); - let spot : mod_spot.type_spot = mod_world.erzeuger_finden(round.world); - round.token = ( + let spot : mod_spot.type_spot = mod_world.generator_finden(game.world); + game.token = ( lib_errormonade.create_just ( mod_token.create @@ -361,13 +361,13 @@ module mod_vtm } else { - let token : mod_token.type_token = lib_errormonade.read(round.token); + let token : mod_token.type_token = lib_errormonade.read(game.token); let spot : mod_spot.type_spot = mod_token.spot_read(token); - let actuator_ : lib_errormonade.type_errormonade = mod_world.tile_get(round.world, spot); + let actuator_ : lib_errormonade.type_errormonade = mod_world.tile_get(game.world, spot); let actuator : mod_actuator.type_actuator = ( lib_errormonade.filled(actuator_) ? lib_errormonade.read(actuator_) - : mod_actuator.mod_verwerfer.create_actuator() + : mod_actuator.mod_rejector.create_extended() ); mod_actuator.use(actuator, token); let state : mod_state.type_state = mod_token.state_read(token); @@ -379,14 +379,14 @@ module mod_vtm { let accepted : boolean = (state === mod_state.accepted); let ausgabe : Array = mod_token.tape_read(token); - round.token = (lib_errormonade.create_nothing()); - let testindex : int = lib_errormonade.read(round.testindex); - let tests : Array = mod_task.tests(round.task); + game.token = (lib_errormonade.create_nothing()); + let testindex : int = lib_errormonade.read(game.testindex); + let tests : Array = mod_task.tests(game.task); let test : mod_test.type_test = tests[testindex]; if (! mod_test.pruefen(test, accepted, ausgabe)) { - round.mode = mod_mode.wrong; - notify(round, "aendrung_mode", {}); + game.mode = mod_mode.wrong; + notify(game, "change_mode", {}); } else { @@ -394,14 +394,14 @@ module mod_vtm if (testindex < tests.length) { // nächsten Test auswählen - round.testindex = (lib_errormonade.create_just(testindex)); + game.testindex = (lib_errormonade.create_just(testindex)); } else { // auf Modus "correct" wechseln - round.testindex = (lib_errormonade.create_nothing()); - round.mode = mod_mode.correct; - notify(round, "aendrung_mode", {}); + game.testindex = (lib_errormonade.create_nothing()); + game.mode = mod_mode.correct; + notify(game, "change_mode", {}); } } } @@ -411,7 +411,7 @@ module mod_vtm throw (new Error(message)); } } - notify(round, "aendrung_token", {}); + notify(game, "change_token", {}); break; } case mod_mode.wrong: diff --git a/quelldatein/aufbau/modus.ts b/source/model/mode.ts similarity index 94% rename from quelldatein/aufbau/modus.ts rename to source/model/mode.ts index c669363..b4bfb69 100644 --- a/quelldatein/aufbau/modus.ts +++ b/source/model/mode.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/aufbau/stelle.ts b/source/model/spot.ts similarity index 91% rename from quelldatein/aufbau/stelle.ts rename to source/model/spot.ts index 6fc7bf0..5f4f9f1 100644 --- a/quelldatein/aufbau/stelle.ts +++ b/source/model/spot.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -43,7 +43,7 @@ module mod_vtm /** * @author kcf */ - export function von_hash(hash : string) : type_spot + export function from_hash(hash : string) : type_spot { let teile : Array = hash.split("_"); return {"u": parseInt(teile[0]), "v": parseInt(teile[1])}; @@ -62,7 +62,7 @@ module mod_vtm /** * @author kcf */ - export function von_direction(direction : mod_direction.type_direction) : type_spot + export function from_direction(direction : mod_direction.type_direction) : type_spot { switch (direction) { @@ -100,7 +100,7 @@ module mod_vtm */ export function import_(spot_ : string) : type_spot { - return von_hash(spot_); + return from_hash(spot_); } } diff --git a/quelldatein/aufbau/zustand.ts b/source/model/state.ts similarity index 94% rename from quelldatein/aufbau/zustand.ts rename to source/model/state.ts index ab1bef9..fa96a87 100644 --- a/quelldatein/aufbau/zustand.ts +++ b/source/model/state.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/aufbau/symbol.ts b/source/model/symbol.ts similarity index 95% rename from quelldatein/aufbau/symbol.ts rename to source/model/symbol.ts index 7464e8d..2327832 100644 --- a/quelldatein/aufbau/symbol.ts +++ b/source/model/symbol.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/aufbau/aufgaben/akzeptoraufgabe.ts b/source/model/tasks/acceptortask.ts similarity index 92% rename from quelldatein/aufbau/aufgaben/akzeptoraufgabe.ts rename to source/model/tasks/acceptortask.ts index 4703beb..3b8fb15 100644 --- a/quelldatein/aufbau/aufgaben/akzeptoraufgabe.ts +++ b/source/model/tasks/acceptortask.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -31,7 +31,7 @@ module mod_vtm export type type_acceptortask = { id : string; - titel : string; + title : string; text : string; tests : Array; } @@ -44,7 +44,7 @@ module mod_vtm export function create ( id : string, - titel : string, + title : string, text : string, tests : Array ) @@ -52,7 +52,7 @@ module mod_vtm { return { "id": id, - "titel": titel, + "title": title, "text": text, "tests": tests, }; @@ -75,13 +75,13 @@ module mod_vtm /** * @author kcf */ - export function titel + export function title ( acceptortask : type_acceptortask ) : string { - return acceptortask.titel; + return acceptortask.title; } diff --git a/quelldatein/aufbau/aufgaben/akzeptortest.ts b/source/model/tasks/acceptortest.ts similarity index 96% rename from quelldatein/aufbau/aufgaben/akzeptortest.ts rename to source/model/tasks/acceptortest.ts index dea9cfa..44f846f 100644 --- a/quelldatein/aufbau/aufgaben/akzeptortest.ts +++ b/source/model/tasks/acceptortest.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 diff --git a/quelldatein/aufbau/aufgaben/aufgabe.ts b/source/model/tasks/task.ts similarity index 81% rename from quelldatein/aufbau/aufgaben/aufgabe.ts rename to source/model/tasks/task.ts index a1cd1d0..af409e9 100644 --- a/quelldatein/aufbau/aufgaben/aufgabe.ts +++ b/source/model/tasks/task.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -52,7 +52,7 @@ module mod_vtm task, { "acceptortask": (data) => mod_acceptortask.id(data), - "transductortask": (data) => mod_transductortask.id(data), + "transducertask": (data) => mod_transducertask.id(data), } ) ); @@ -62,7 +62,7 @@ module mod_vtm /** * @author kcf */ - export function titel + export function title ( task : type_task ) @@ -73,8 +73,8 @@ module mod_vtm ( task, { - "acceptortask": (data) => mod_acceptortask.titel(data), - "transductortask": (data) => mod_transductortask.titel(data), + "acceptortask": (data) => mod_acceptortask.title(data), + "transducertask": (data) => mod_transducertask.title(data), } ) ); @@ -96,7 +96,7 @@ module mod_vtm task, { "acceptortask": (data) => mod_acceptortask.text(data), - "transductortask": (data) => mod_transductortask.text(data), + "transducertask": (data) => mod_transducertask.text(data), } ) ); @@ -121,9 +121,9 @@ module mod_vtm mod_acceptortask.tests(data) .map(data_ => ({"kind": "acceptortest", "data": data_})) ), - "transductortask": (data) => ( - mod_transductortask.tests(data) - .map(data_ => ({"kind": "transductortest", "data": data_})) + "transducertask": (data) => ( + mod_transducertask.tests(data) + .map(data_ => ({"kind": "transducertest", "data": data_})) ), } ) @@ -146,8 +146,8 @@ module mod_vtm mod_acceptortask.create ( task_raw["id"], - task_raw["parameter"]["titel"], - task_raw["parameter"]["text"], + lib_translate.get(["tasks", task_raw["id"], "title"].join(".")), + lib_translate.get(["tasks", task_raw["id"], "text"].join(".")), task_raw["parameter"]["tests"].map ( test_raw => ( @@ -163,20 +163,20 @@ module mod_vtm }; break; } - case "transductor": + case "transducer": { return { - "kind": "transductortask", + "kind": "transducertask", "data": ( - mod_transductortask.create + mod_transducertask.create ( task_raw["id"], - task_raw["parameter"]["titel"], - task_raw["parameter"]["text"], + lib_translate.get(["tasks", task_raw["id"], "title"].join(".")), + lib_translate.get(["tasks", task_raw["id"], "text"].join(".")), task_raw["parameter"]["tests"].map ( test_raw => ( - mod_transductortest.create + mod_transducertest.create ( test_raw["input"], test_raw["output"] diff --git a/quelldatein/aufbau/aufgaben/test.ts b/source/model/tasks/test.ts similarity index 89% rename from quelldatein/aufbau/aufgaben/test.ts rename to source/model/tasks/test.ts index d46af5c..b0640f1 100644 --- a/quelldatein/aufbau/aufgaben/test.ts +++ b/source/model/tasks/test.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -46,7 +46,7 @@ module mod_vtm test, { "acceptortest": (data) => mod_acceptortest.input(data), - "transductortest": (data) => mod_transductortest.input(data), + "transducertest": (data) => mod_transducertest.input(data), } ) ); @@ -70,7 +70,7 @@ module mod_vtm test, { "acceptortest": (data) => mod_acceptortest.pruefen(data, accepted, ausgabe), - "transductortest": (data) => mod_transductortest.pruefen(data, accepted, ausgabe), + "transducertest": (data) => mod_transducertest.pruefen(data, accepted, ausgabe), } ) ); @@ -102,12 +102,12 @@ module mod_vtm }; break; } - case "transductortest": + case "transducertest": { return { - "kind": "transductortest", + "kind": "transducertest", "data": ( - mod_transductortest.create + mod_transducertest.create ( test_raw["data"]["input"], test_raw["data"]["output"] diff --git a/quelldatein/aufbau/aufgaben/transduktoraufgabe.ts b/source/model/tasks/transducertask.ts similarity index 69% rename from quelldatein/aufbau/aufgaben/transduktoraufgabe.ts rename to source/model/tasks/transducertask.ts index 2a4d5b0..a89e40e 100644 --- a/quelldatein/aufbau/aufgaben/transduktoraufgabe.ts +++ b/source/model/tasks/transducertask.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -22,18 +22,18 @@ module mod_vtm export module mod_model { - export module mod_transductortask + export module mod_transducertask { /** * @author kcf */ - export type type_transductortask = + export type type_transducertask = { id : string; - titel : string; + title : string; text : string; - tests : Array; + tests : Array; } ; @@ -44,15 +44,15 @@ module mod_vtm export function create ( id : string, - titel : string, + title : string, text : string, - tests : Array + tests : Array ) - : type_transductortask + : type_transducertask { return { "id": id, - "titel": titel, + "title": title, "text": text, "tests": tests, }; @@ -64,24 +64,24 @@ module mod_vtm */ export function id ( - transductortask : type_transductortask + transducertask : type_transducertask ) : string { - return transductortask.id; + return transducertask.id; } /** * @author kcf */ - export function titel + export function title ( - transductortask : type_transductortask + transducertask : type_transducertask ) : string { - return transductortask.titel; + return transducertask.title; } @@ -90,11 +90,11 @@ module mod_vtm */ export function text ( - transductortask : type_transductortask + transducertask : type_transducertask ) : string { - return transductortask.text; + return transducertask.text; } @@ -103,11 +103,11 @@ module mod_vtm */ export function tests ( - transductortask : type_transductortask + transducertask : type_transducertask ) - : Array + : Array { - return transductortask.tests; + return transducertask.tests; } } diff --git a/quelldatein/aufbau/aufgaben/transduktortest.ts b/source/model/tasks/transducertest.ts similarity index 81% rename from quelldatein/aufbau/aufgaben/transduktortest.ts rename to source/model/tasks/transducertest.ts index 5c5ae3e..108ee98 100644 --- a/quelldatein/aufbau/aufgaben/transduktortest.ts +++ b/source/model/tasks/transducertest.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -22,13 +22,13 @@ module mod_vtm export module mod_model { - export module mod_transductortest + export module mod_transducertest { /** * @author kcf */ - export type type_transductortest = + export type type_transducertest = { input : Array; output : Array; @@ -44,7 +44,7 @@ module mod_vtm input : Array, output : Array ) - : type_transductortest + : type_transducertest { return { "input": input, @@ -58,11 +58,11 @@ module mod_vtm */ export function input ( - transductortest : type_transductortest + transducertest : type_transducertest ) : Array { - return transductortest.input; + return transducertest.input; } @@ -71,22 +71,22 @@ module mod_vtm */ export function pruefen ( - transductortest : type_transductortest, + transducertest : type_transducertest, accepted : boolean, output : Array ) : boolean { - if (transductortest.output.length !== output.length) + if (transducertest.output.length !== output.length) { return false; } else { let gleich : boolean = true; - for (let index : int = 0; index < transductortest.output.length; index += 1) + for (let index : int = 0; index < transducertest.output.length; index += 1) { - if (! mod_vtm.mod_model.mod_symbol.vergleichen(transductortest.output[index], output[index])) + if (! mod_vtm.mod_model.mod_symbol.vergleichen(transducertest.output[index], output[index])) { gleich = false; break; diff --git a/quelldatein/aufbau/figur.ts b/source/model/token.ts similarity index 96% rename from quelldatein/aufbau/figur.ts rename to source/model/token.ts index efd35c7..ae3f835 100644 --- a/quelldatein/aufbau/figur.ts +++ b/source/model/token.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -104,7 +104,7 @@ module mod_vtm ) : void { - let summand : mod_spot.type_spot = mod_spot.von_direction(direction); + let summand : mod_spot.type_spot = mod_spot.from_direction(direction); token.spot = mod_spot.add(token.spot, summand); } diff --git a/quelldatein/aufbau/welt.ts b/source/model/world.ts similarity index 87% rename from quelldatein/aufbau/welt.ts rename to source/model/world.ts index df16feb..a00b308 100644 --- a/quelldatein/aufbau/welt.ts +++ b/source/model/world.ts @@ -1,6 +1,6 @@ /* * Verrückte Turing-Maschinen — A turing complete game - * Copyright (C) 2016 Christian Fraß + * Copyright (C) 2016-2018 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 @@ -110,29 +110,29 @@ module mod_vtm ) : void { - let erweitert : boolean = true; + let extended : boolean = true; let liste : Array<{pruefer : (actuator : mod_actuator.type_actuator)=>boolean; erspotr : ()=>mod_actuator.type_actuator;}> = ( [] .concat ( [ { - "pruefer": (actuator) => (actuator.kind === "befoerderer"), - "erspotr": () => mod_actuator.mod_befoerderer.create_actuator(0), + "pruefer": (actuator) => (actuator.kind === "conveyer"), + "erspotr": () => mod_actuator.mod_conveyer.create_extended(0), }, ] ) .concat ( - mod_vtm.mod_helfer.sequence(erweitert ? 4 : 2).map + mod_vtm.mod_helfer.sequence(extended ? 4 : 2).map ( symbol => ( { "pruefer": (actuator) => { - if (actuator.kind === "schreiber") + if (actuator.kind === "writer") { - return (mod_actuator.mod_schreiber.symbol_read(actuator.data) === symbol); + return (mod_actuator.mod_writer.symbol_read(actuator.data) === symbol); } else { @@ -140,14 +140,14 @@ module mod_vtm } } , - "erspotr": () => mod_actuator.mod_schreiber.create_actuator(0, symbol) + "erspotr": () => mod_actuator.mod_writer.create_extended(0, symbol) } ) ) ) .concat ( - mod_vtm.mod_helfer.sequence(erweitert ? 2 : 1).map + mod_vtm.mod_helfer.sequence(extended ? 2 : 1).map ( index => { @@ -157,12 +157,12 @@ module mod_vtm { "pruefer": (actuator) => { - if (actuator.kind === "leser") + if (actuator.kind === "reader") { return ( - (mod_actuator.mod_leser.symbol_links_read(actuator.data) === symbol_links) + (mod_actuator.mod_reader.symbol_links_read(actuator.data) === symbol_links) && - (mod_actuator.mod_leser.symbol_rechts_read(actuator.data) === symbol_rechts) + (mod_actuator.mod_reader.symbol_rechts_read(actuator.data) === symbol_rechts) ); } else @@ -171,7 +171,7 @@ module mod_vtm } } , - "erspotr": () => mod_actuator.mod_leser.create_actuator(0, symbol_links, symbol_rechts) + "erspotr": () => mod_actuator.mod_reader.create_extended(0, symbol_links, symbol_rechts) } ); } @@ -181,8 +181,8 @@ module mod_vtm ( [ { - "pruefer": (actuator) => (actuator.kind === "verwerfer"), - "erspotr": () => mod_actuator.mod_verwerfer.create_actuator(), + "pruefer": (actuator) => (actuator.kind === "rejector"), + "erspotr": () => mod_actuator.mod_rejector.create_extended(), }, ] ) @@ -266,7 +266,7 @@ module mod_vtm * @author kcf * @throws {Error} */ - export function erzeuger_finden + export function generator_finden ( world : type_world ) @@ -278,7 +278,7 @@ module mod_vtm world.tiles, (spot_, actuator) => { - if (actuator.kind === "erzeuger") + if (actuator.kind === "generator") { if (lib_errormonade.filled(spot)) { @@ -325,15 +325,15 @@ module mod_vtm let actuator : mod_actuator.type_actuator; if ((u === -groesse) && (v === 0)) { - actuator = mod_actuator.mod_erzeuger.create_actuator(0); + actuator = mod_actuator.mod_generator.create_extended(0); } else if ((u === +groesse) && (v === 0)) { - actuator = mod_actuator.mod_annehmer.create_actuator(); + actuator = mod_actuator.mod_acceptor.create_extended(); } else { - actuator = mod_actuator.mod_verwerfer.create_actuator(); + actuator = mod_actuator.mod_rejector.create_extended(); } lib_hashmap.set(world.tiles, spot, actuator); } diff --git a/werkzeuge/bauen.sh b/tools/build.sh similarity index 100% rename from werkzeuge/bauen.sh rename to tools/build.sh diff --git a/werkzeuge/zuruecksetzen.sh b/tools/reset.sh similarity index 100% rename from werkzeuge/zuruecksetzen.sh rename to tools/reset.sh diff --git a/werkzeuge/ausrollen.sh b/tools/rollout.sh similarity index 100% rename from werkzeuge/ausrollen.sh rename to tools/rollout.sh