/* * 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 { export module mod_aktor { /** * @author kcf */ export type typ_aktor = { aufbau : mod_vtm.mod_aufbau.mod_aktor.typ_aktor; stelle : mod_vtm.mod_aufbau.mod_stelle.typ_stelle; } ; /** * @author kcf */ function erstellen ( aufbau : mod_vtm.mod_aufbau.mod_aktor.typ_aktor, stelle : mod_vtm.mod_aufbau.mod_stelle.typ_stelle ) : typ_aktor { return { "aufbau": aufbau, "stelle": stelle }; } /** * @author kcf */ export function erstellen_manifestation ( aufbau : mod_vtm.mod_aufbau.mod_aktor.typ_aktor, stelle : mod_vtm.mod_aufbau.mod_stelle.typ_stelle ) : typ_manifestation { return { "art": "aktor", "angaben": erstellen(aufbau, stelle), }; } /** * @author kcf */ function darstellen(aktor_ : typ_aktor) : mod_vtm.mod_helfer.mod_xml.typ_knoten { let aktor : mod_vtm.mod_aufbau.mod_aktor.typ_aktor = aktor_.aufbau; let knoten_rahmen = function () : mod_vtm.mod_helfer.mod_xml.typ_knoten { return ( pfad ( mod_vtm.mod_helfer.sequenz(6).map(i => mod_vtm.mod_helfer.mod_vektor.polar(((i+0.5)/6) * (2*Math.PI), 0.5)), true, { "class": "rahmen" } ) ); } ; let kinder_feld : Array = []; fallunterscheidung ( aktor, { "erzeuger": (angaben) => { kinder_feld.push(knoten_rahmen()); let richtung : mod_vtm.mod_aufbau.mod_richtung.typ_richtung = mod_vtm.mod_aufbau.mod_aktor_erzeuger.richtung_lesen(angaben); let knoten_pfeil : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "path", { "d": form_pfeil, "class": ( [ "pfeil", "erzeuger", ].join(" ") ), "transform": ( [ "rotate(" + ((richtung/6) * 360).toFixed(float_praezission) + ")", "translate(-0.2, 0)", "scale(0.12)", ].join(" ") ), } ) ); kinder_feld.push(knoten_pfeil); } , "befoerderer": (angaben) => { kinder_feld.push(knoten_rahmen()); let richtung : mod_vtm.mod_aufbau.mod_richtung.typ_richtung = mod_vtm.mod_aufbau.mod_aktor_befoerderer.richtung_lesen(angaben); let knoten_pfeil : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "path", { "d": form_pfeil, "class": ( [ "pfeil", "neutral", ].join(" ") ), "transform": ( [ "rotate(" + ((richtung/6) * 360).toFixed(float_praezission) + ")", "translate(-0.2, 0)", "scale(0.12)", ].join(" ") ), } ) ); kinder_feld.push(knoten_pfeil); } , "schreiber": (angaben) => { kinder_feld.push(knoten_rahmen()); let richtung : mod_vtm.mod_aufbau.mod_richtung.typ_richtung = mod_vtm.mod_aufbau.mod_aktor_schreiber.richtung_lesen(angaben); let symbol : mod_vtm.mod_aufbau.mod_symbol.typ_symbol = mod_vtm.mod_aufbau.mod_aktor_schreiber.symbol_lesen(angaben); let knoten_pfeil : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "path", { "d": form_pfeil, "class": ( [ "pfeil", "symbol_" + symbol.toFixed(0), ].join(" ") ), "transform": ( [ "rotate(" + ((richtung/6) * 360).toFixed(float_praezission) + ")", "translate(-0.2, 0)", "scale(0.12)", ].join(" ") ), } ) ); kinder_feld.push(knoten_pfeil); } , "leser": (angaben) => { kinder_feld.push(knoten_rahmen()); let richtung : mod_vtm.mod_aufbau.mod_richtung.typ_richtung = mod_vtm.mod_aufbau.mod_aktor_leser.richtung_lesen(angaben); let symbol_links : mod_vtm.mod_aufbau.mod_symbol.typ_symbol = mod_vtm.mod_aufbau.mod_aktor_leser.symbol_links_lesen(angaben); let symbol_rechts : mod_vtm.mod_aufbau.mod_symbol.typ_symbol = mod_vtm.mod_aufbau.mod_aktor_leser.symbol_rechts_lesen(angaben); let ausgaenge : Array<{summand : mod_vtm.mod_aufbau.mod_richtung.typ_richtung, symbol : lib_fehlermonade.typ_fehlermonade;}> = [ { "summand": 0, "symbol": lib_fehlermonade.mod_nichts.erstellen(), }, { "summand": +2, "symbol": lib_fehlermonade.mod_schlicht.erstellen(symbol_links), }, { "summand": -2, "symbol": lib_fehlermonade.mod_schlicht.erstellen(symbol_rechts), }, ] ; ausgaenge.forEach ( eintrag => { let winkel : float = ((mod_vtm.mod_aufbau.mod_richtung.addieren(richtung, eintrag.summand) / 6) * 360); let knoten_pfeil : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "path", { "d": form_pfeil, "class": ( [ "pfeil", ( lib_fehlermonade.voll(eintrag.symbol) ? "symbol_" + lib_fehlermonade.lesen(eintrag.symbol).toFixed(0) : "neutral" ), ].join(" ") ), "transform": ( [ "rotate(" + winkel.toFixed(float_praezission) + ")", "translate(0.1, 0)", "scale(0.075)", ].join(" ") ), } ) ); kinder_feld.push(knoten_pfeil); } ) ; } , "verwerfer": (angaben) => { kinder_feld.push(knoten_rahmen()); let knoten_kreis : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "circle", { "cx": (0.0).toFixed(float_praezission), "cy": (0.0).toFixed(float_praezission), "r": (0.25).toFixed(float_praezission), "class": ( [ "kreis", "negativ", ].join(" ") ), } ) ); kinder_feld.push(knoten_kreis); } , "annehmer": (angaben) => { kinder_feld.push(knoten_rahmen()); let knoten_kreis : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "circle", { "cx": (0.0).toFixed(float_praezission), "cy": (0.0).toFixed(float_praezission), "r": (0.25).toFixed(float_praezission), "class": ( [ "kreis", "positiv", ].join(" ") ), } ) ); kinder_feld.push(knoten_kreis); } , } ) ; let position : mod_position.typ_position = mod_position.von_stelle(aktor_.stelle); let knoten_feld : mod_vtm.mod_helfer.mod_xml.typ_knoten = ( mod_vtm.mod_helfer.mod_xml.mod_normal.erstellen_erweitert ( "g", { "class": "feld", "rel": mod_vtm.mod_aufbau.mod_stelle.hash(aktor_.stelle), "transform": ( "translate" + "(" + position.x.toFixed(float_praezission) + ", " + position.y.toFixed(float_praezission) + ")" ), }, kinder_feld ) ); return knoten_feld; } /** * @author kcf */ implementierung_manifestation["aktor"] = { "darstellen": (manifestation) => darstellen(manifestation.angaben), "binden": (manifestation) => {}, } ; } } } }