diff --git a/makefile b/makefile index 0abc22f..55177b9 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,20 @@ +alles: erzeugnis/vtm.html erzeugnis/vtm.css erzeugnis/vtm.js +.PHONY: alles + +erzeugnis/vtm.html: quelldatein/darstellung_steuerung/vtm.html + @ echo "-- Struktur …" + @ mkdir -p erzeugnis + @ cp quelldatein/darstellung_steuerung/vtm.html erzeugnis/vtm.html + +erzeugnis/vtm.css: quelldatein/darstellung_steuerung/vtm.css quelldatein/darstellung_steuerung/welt.css + @ echo "-- Gestaltung …" + @ mkdir -p erzeugnis + @ cat quelldatein/darstellung_steuerung/vtm.css quelldatein/darstellung_steuerung/welt.css > erzeugnis/vtm.css + erzeugnis/vtm.js: \ quelldatein/basis/typen.ts \ quelldatein/basis/fehlermonade.ts \ + quelldatein/helfer/verschiedenes.ts \ quelldatein/helfer/mathematik.ts \ quelldatein/helfer/vektor.ts \ quelldatein/helfer/hashmap.ts \ @@ -20,13 +34,14 @@ erzeugnis/vtm.js: \ quelldatein/darstellung_steuerung/position.ts \ quelldatein/darstellung_steuerung/svg.ts \ quelldatein/darstellung_steuerung/welt.ts \ - quelldatein/test.ts - @ echo "-- kompilieren …" + quelldatein/haupt.ts + @ echo "-- Logik …" @ mkdir -p erzeugnis @ tsc \ --allowUnreachableCode \ quelldatein/basis/typen.ts \ quelldatein/basis/fehlermonade.ts \ + quelldatein/helfer/verschiedenes.ts \ quelldatein/helfer/mathematik.ts \ quelldatein/helfer/vektor.ts \ quelldatein/helfer/hashmap.ts \ @@ -46,6 +61,6 @@ erzeugnis/vtm.js: \ quelldatein/darstellung_steuerung/position.ts \ quelldatein/darstellung_steuerung/svg.ts \ quelldatein/darstellung_steuerung/welt.ts \ - quelldatein/test.ts \ + quelldatein/haupt.ts \ --outFile erzeugnis/vtm.js diff --git a/quelldatein/aufbau/aktor.ts b/quelldatein/aufbau/aktor.ts index 289541a..cc01c4d 100644 --- a/quelldatein/aufbau/aktor.ts +++ b/quelldatein/aufbau/aktor.ts @@ -8,6 +8,12 @@ module mod_vtm_aufbau export interface schnittstelle_aktor { + /** + * @author kcf + */ + drehen() : void; + + /** * @author kcf */ diff --git a/quelldatein/aufbau/annehmer.ts b/quelldatein/aufbau/annehmer.ts index 85a7fab..13e50f1 100644 --- a/quelldatein/aufbau/annehmer.ts +++ b/quelldatein/aufbau/annehmer.ts @@ -17,6 +17,15 @@ module mod_vtm_aufbau } + /** + * @author kcf + * @implementation + */ + public drehen() : void + { + } + + /** * @author kcf * @implementation diff --git a/quelldatein/aufbau/befoerderer.ts b/quelldatein/aufbau/befoerderer.ts index d60765b..7cee02d 100644 --- a/quelldatein/aufbau/befoerderer.ts +++ b/quelldatein/aufbau/befoerderer.ts @@ -33,6 +33,16 @@ module mod_vtm_aufbau } + /** + * @author kcf + * @implementation + */ + public drehen() : void + { + this.richtung = richtung_addieren(this.richtung, +1); + } + + /** * @author kcf * @implementation diff --git a/quelldatein/aufbau/figur.ts b/quelldatein/aufbau/figur.ts index e204c69..4fc3cdc 100644 --- a/quelldatein/aufbau/figur.ts +++ b/quelldatein/aufbau/figur.ts @@ -46,6 +46,15 @@ module mod_vtm_aufbau } + /** + * @author kcf + */ + public band_lesen() : Array + { + return this.band; + } + + /** * @author kcf */ @@ -68,7 +77,7 @@ module mod_vtm_aufbau /** * @author kcf */ - public band_schreiben(symbol : typ_symbol) : void + public schreiben(symbol : typ_symbol) : void { this.band.push(symbol); } @@ -77,7 +86,7 @@ module mod_vtm_aufbau /** * @author kcf */ - public band_lesen() : schnittstelle_fehlermonade + public lesen() : schnittstelle_fehlermonade { if (this.band.length <= 0) { @@ -93,7 +102,7 @@ module mod_vtm_aufbau /** * @author kcf */ - public band_schieben() : void + public schieben() : void { if (this.band.length <= 0) { @@ -124,15 +133,6 @@ module mod_vtm_aufbau this.zustand = zustand_tot; } - - /** - * @author kcf - */ - public zu_string() : string - { - return ("{" + zustand_zu_string(this.zustand) + " / " + stelle_zu_string(this.stelle) + " : " + "[" + this.band.map(symbol => symbol_zu_string(symbol)) + "]" + "}"); - } - } } diff --git a/quelldatein/aufbau/leser.ts b/quelldatein/aufbau/leser.ts index 0f5c126..702ed07 100644 --- a/quelldatein/aufbau/leser.ts +++ b/quelldatein/aufbau/leser.ts @@ -33,26 +33,36 @@ module mod_vtm_aufbau } + /** + * @author kcf + * @implementation + */ + public drehen() : void + { + this.richtung = richtung_addieren(this.richtung, +1); + } + + /** * @author kcf * @implementation */ public verwenden(figur : klasse_figur) : void { - let symbol_ : schnittstelle_fehlermonade = figur.band_lesen(); + let symbol_ : schnittstelle_fehlermonade = figur.lesen(); let summand : typ_richtung; if (symbol_.ist_schlicht()) { let symbol : typ_symbol = symbol_.lesen(); - figur.band_schieben(); + figur.schieben(); switch (symbol) { - case symbol_rot: + case 0: { summand = +1; break; } - case symbol_gruen: + case 1: { summand = -1; break; diff --git a/quelldatein/aufbau/schreiber.ts b/quelldatein/aufbau/schreiber.ts index cba36b9..4f51a7d 100644 --- a/quelldatein/aufbau/schreiber.ts +++ b/quelldatein/aufbau/schreiber.ts @@ -49,13 +49,23 @@ module mod_vtm_aufbau } + /** + * @author kcf + * @implementation + */ + public drehen() : void + { + this.richtung = richtung_addieren(this.richtung, +1); + } + + /** * @author kcf * @implementation */ public verwenden(figur : klasse_figur) : void { - figur.band_schreiben(this.symbol); + figur.schreiben(this.symbol); figur.bewegen(this.richtung); } diff --git a/quelldatein/aufbau/stelle.ts b/quelldatein/aufbau/stelle.ts index 9e11bfd..5924247 100644 --- a/quelldatein/aufbau/stelle.ts +++ b/quelldatein/aufbau/stelle.ts @@ -20,9 +20,10 @@ module mod_vtm_aufbau /** * @author kcf */ - export function stelle_zu_string(stelle : typ_stelle) : string + export function stelle_von_hash(hash : string) : typ_stelle { - return ("<" + stelle.u.toFixed(0) + "," + stelle.v.toFixed(0) + ">"); + let teile : Array = hash.split("_"); + return {"u": parseInt(teile[0]), "v": parseInt(teile[1])}; } diff --git a/quelldatein/aufbau/symbol.ts b/quelldatein/aufbau/symbol.ts index 20d6d31..badcc53 100644 --- a/quelldatein/aufbau/symbol.ts +++ b/quelldatein/aufbau/symbol.ts @@ -7,21 +7,5 @@ module mod_vtm_aufbau */ export type typ_symbol = int; - - /** - * @author kcf - */ - export var symbol_rot = 0; - export var symbol_gruen = 1; - - - /** - * @author kcf - */ - export function symbol_zu_string(symbol : typ_symbol) : string - { - return symbol.toFixed(0); - } - } diff --git a/quelldatein/aufbau/verwerfer.ts b/quelldatein/aufbau/verwerfer.ts index d4c6361..5d212e2 100644 --- a/quelldatein/aufbau/verwerfer.ts +++ b/quelldatein/aufbau/verwerfer.ts @@ -17,6 +17,15 @@ module mod_vtm_aufbau } + /** + * @author kcf + * @implementation + */ + public drehen() : void + { + } + + /** * @author kcf * @implementation diff --git a/quelldatein/aufbau/welt.ts b/quelldatein/aufbau/welt.ts index 68007c0..11c01ea 100644 --- a/quelldatein/aufbau/welt.ts +++ b/quelldatein/aufbau/welt.ts @@ -67,6 +67,98 @@ module mod_vtm_aufbau } + /** + * @author kcf + */ + public feld_wechseln(stelle : typ_stelle) : void + { + let liste : Array<{pruefer : (aktor : schnittstelle_aktor)=>boolean; ersteller : ()=>schnittstelle_aktor;}> = + [ + { + "pruefer": (aktor) => (aktor instanceof klasse_befoerderer), + "ersteller": () => new klasse_befoerderer(), + }, + { + "pruefer": (aktor) => ((aktor instanceof klasse_schreiber) && (((aktor)).symbol_lesen() === 0)), + "ersteller": () => new klasse_schreiber(0, 0), + }, + { + "pruefer": (aktor) => ((aktor instanceof klasse_schreiber) && (((aktor)).symbol_lesen() === 1)), + "ersteller": () => new klasse_schreiber(0, 1), + }, + { + "pruefer": (aktor) => (aktor instanceof klasse_leser), + "ersteller": () => new klasse_leser(), + }, + { + "pruefer": (aktor) => (aktor instanceof klasse_annehmer), + "ersteller": () => new klasse_annehmer(), + }, + { + "pruefer": (aktor) => (aktor instanceof klasse_verwerfer), + "ersteller": () => new klasse_verwerfer(), + }, + ] + ; + let index : int; + let aktor_alt_ : schnittstelle_fehlermonade = this.felder.holen(stelle); + if (aktor_alt_.ist_schlicht) + { + let aktor_alt : schnittstelle_aktor = aktor_alt_.lesen(); + let gefunden : boolean = liste.some + ( + (eintrag, index_) => + { + if (eintrag.pruefer(aktor_alt)) + { + index = index_; + return true; + } + else + { + return false; + } + } + ) + ; + if (! gefunden) + { + let meldung : string = ("Aktor nicht gefunden"); + throw (new Error(meldung)); + } + else + { + // alles prima + } + } + else + { + let meldung : string = "kein Aktor gesetzt"; + // console.warn(meldung); + index = 0; + } + let aktor_neu : schnittstelle_aktor = liste[mod_vtm_helfer.mod(index+1, liste.length)].ersteller(); + this.feld_setzen(stelle, aktor_neu); + } + + + /** + * @author kcf + */ + public feld_drehen(stelle : typ_stelle) : void + { + let aktor_ : schnittstelle_fehlermonade = this.felder.holen(stelle); + if (aktor_.ist_schlicht) + { + aktor_.lesen().drehen(); + } + else + { + console.warn("kein Aktor gesetzt"); + } + } + + /** * @author kcf */ @@ -105,11 +197,29 @@ module mod_vtm_aufbau break; } } - if (ergebnis) - console.info(this.figur.zu_string()); return ergebnis; } + + /** + * @author kcf + */ + public static blanko(groesse : int = 3) : klasse_welt + { + let welt : klasse_welt = new klasse_welt(); + for (let u : int = -groesse; u <= +groesse; u += 1) + { + for (let v : int = -groesse; v <= +groesse; v += 1) + { + if (Math.abs(u-v) <= groesse) + { + let stelle : typ_stelle = {"u": u, "v": v}; + welt.felder.setzen(stelle, new klasse_verwerfer()); + } + } + } + return welt; + } } } diff --git a/quelldatein/aufbau/zustand.ts b/quelldatein/aufbau/zustand.ts index 2f7dea5..d82c1ef 100644 --- a/quelldatein/aufbau/zustand.ts +++ b/quelldatein/aufbau/zustand.ts @@ -15,14 +15,5 @@ module mod_vtm_aufbau export var zustand_normal = 0; export var zustand_fertig = +1; - - /** - * @author kcf - */ - export function zustand_zu_string(zustand : typ_zustand) : string - { - return zustand.toFixed(0); - } - } diff --git a/quelldatein/darstellung_steuerung/svg.ts b/quelldatein/darstellung_steuerung/svg.ts index f1ae661..b33dea9 100644 --- a/quelldatein/darstellung_steuerung/svg.ts +++ b/quelldatein/darstellung_steuerung/svg.ts @@ -2,6 +2,48 @@ module mod_vtm_darstellung_steuerung { + /** + * @author kcf + */ + export const svg_float_praezission : int = 4; + + + /** + * @author kcf + */ + export const svg_form_pfeil : string = "M +4 0 L 0 +1 L 0 -1 Z"; + + + /** + * @author kcf + */ + export function svg_pfad + ( + vertices : Array, + schliessen : boolean = true, + attribute : {[schlussel : string] : string} = {}, + ) + : mod_vtm_helfer.schnittstelle_xmlknoten + { + let d : string = ""; + vertices.forEach + ( + (vertex, index) => + { + let c : string = ((index <= 0) ? "M" : "L"); + let x : string = vertex.x.toFixed(svg_float_praezission); + let y : string = vertex.y.toFixed(svg_float_praezission); + d += [c, x, y].join(" "); + } + ) + ; + if (schliessen) + d += "Z"; + attribute["d"] = d; + return (new mod_vtm_helfer.klasse_xmlknoten_normal("path", attribute)); + } + + /** * @author kcf */ @@ -14,7 +56,8 @@ module mod_vtm_darstellung_steuerung hoehe : int = 500, breite : int = 500, kinder : Array = [] - ) : mod_vtm_helfer.schnittstelle_xmlknoten + ) + : mod_vtm_helfer.schnittstelle_xmlknoten { return ( new mod_vtm_helfer.klasse_xmlknoten_normal diff --git a/quelldatein/darstellung_steuerung/vtm.css b/quelldatein/darstellung_steuerung/vtm.css new file mode 100644 index 0000000..c4d5385 --- /dev/null +++ b/quelldatein/darstellung_steuerung/vtm.css @@ -0,0 +1,17 @@ +html + { + margin: 0; + + background-color: hsl(0, 0%, 0%); + color: hsl(0, 0%, 100%); + } + +body + { + margin: 0; + padding: 0; + + background-color: hsl(0, 0%, 25%); + color: hsl(0, 0%, 75%); + } + diff --git a/quelldatein/darstellung_steuerung/vtm.html b/quelldatein/darstellung_steuerung/vtm.html new file mode 100644 index 0000000..e5cbb66 --- /dev/null +++ b/quelldatein/darstellung_steuerung/vtm.html @@ -0,0 +1,17 @@ + + + + + + + + + +
+
+
+ +
+ + + diff --git a/quelldatein/darstellung_steuerung/welt.css b/quelldatein/darstellung_steuerung/welt.css index 9ddfbe7..01c6886 100644 --- a/quelldatein/darstellung_steuerung/welt.css +++ b/quelldatein/darstellung_steuerung/welt.css @@ -1,12 +1,56 @@ -.feld +.rahmen { stroke: none; - fill: black; + fill: hsl( 0, 0%, 12.5%); } .figur { stroke: none; - fill: white; + fill: hsl( 0, 0%, 0%); + } + +.pfeil + { + stroke: none; + } + +.neutral + { + fill: hsl( 0, 0%, 50%); + } + +.symbol_0 + { + fill: hsl( 0, 50%, 50%); + } + +.symbol_1 + { + fill: hsl(120, 50%, 50%); + } + +.kreis + { + stroke: none; + } + +.positiv + { + fill: hsl( 0, 0%, 100%); + } + +.negativ + { + /* + fill: hsl( 0, 0%, 0%); + */ + display: none; + } + +.eintrag + { + stroke: black; + stroke-width: 0.01; } diff --git a/quelldatein/darstellung_steuerung/welt.ts b/quelldatein/darstellung_steuerung/welt.ts index c0b2c1d..5671ea9 100644 --- a/quelldatein/darstellung_steuerung/welt.ts +++ b/quelldatein/darstellung_steuerung/welt.ts @@ -2,26 +2,6 @@ module mod_vtm_darstellung_steuerung { - /** - * @author kcf - */ - const svg_float_praezission : int = 4; - - - /** - * @author kcf - */ - function symbol_zu_farbe(symbol : mod_vtm_aufbau.typ_symbol) : string - { - switch (symbol) - { - case 0: {return "hsl( 0, 50%, 50%)"; break;} - case 1: {return "hsl(120, 50%, 50%)"; break;} - default: {throw (new Error("unbehandeltes Symbol")); break;} - } - } - - /** * @author kcf */ @@ -48,6 +28,20 @@ module mod_vtm_darstellung_steuerung */ public darstellen() : mod_vtm_helfer.schnittstelle_xmlknoten { + let knoten_rahmen = function () : mod_vtm_helfer.schnittstelle_xmlknoten + { + return ( + svg_pfad + ( + mod_vtm_helfer.sequenz(6).map(i => mod_vtm_helfer.vektor_polar(((i+0.5)/6.0) * (2*Math.PI), 0.5)), + true, + { + "class": "rahmen" + } + ) + ); + } + ; let kinder_welt : Array = []; // felder { @@ -57,125 +51,174 @@ module mod_vtm_darstellung_steuerung ({"stelle": stelle, "aktor": aktor}) => { let kinder_feld : Array = []; - // rahmen - { - let knoten_rahmen : mod_vtm_helfer.schnittstelle_xmlknoten = ( - new mod_vtm_helfer.klasse_xmlknoten_normal - ( - "circle", + if (aktor instanceof mod_vtm_aufbau.klasse_befoerderer) + { + kinder_feld.push(knoten_rahmen()); + let befoerderer : mod_vtm_aufbau.klasse_befoerderer = (aktor); + let richtung : mod_vtm_aufbau.typ_richtung = befoerderer.richtung_lesen(); + let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "path", + { + "d": svg_form_pfeil, + "class": ( + [ + "pfeil", + "neutral", + ].join(" ") + ), + "transform": ( + [ + "rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")", + "translate(-0.2, 0)", + "scale(0.15)", + ].join(" ") + ), + } + ) + ); + kinder_feld.push(knoten_pfeil); + } + else if (aktor instanceof mod_vtm_aufbau.klasse_schreiber) + { + kinder_feld.push(knoten_rahmen()); + let schreiber : mod_vtm_aufbau.klasse_schreiber = (aktor); + let richtung : mod_vtm_aufbau.typ_richtung = schreiber.richtung_lesen(); + let symbol : mod_vtm_aufbau.typ_symbol = schreiber.symbol_lesen(); + let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "path", + { + "d": svg_form_pfeil, + "class": ( + [ + "pfeil", + "symbol_" + symbol.toFixed(0), + ].join(" ") + ), + "transform": ( + [ + "rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")", + "translate(-0.2, 0)", + "scale(0.15)", + ].join(" ") + ), + } + ) + ); + kinder_feld.push(knoten_pfeil); + } + else if (aktor instanceof mod_vtm_aufbau.klasse_leser) + { + kinder_feld.push(knoten_rahmen()); + let leser : mod_vtm_aufbau.klasse_leser = (aktor); + let richtung : mod_vtm_aufbau.typ_richtung = leser.richtung_lesen(); + let ausgaenge : Array<{summand : mod_vtm_aufbau.typ_richtung, symbol : schnittstelle_fehlermonade;}> = + [ { - "cx": (0.0).toFixed(svg_float_praezission), - "cy": (0.0).toFixed(svg_float_praezission), - "r": (0.5).toFixed(svg_float_praezission), - } + "summand": 0, + "symbol": new klasse_nichts(), + }, + { + "summand": +1, + "symbol": new klasse_schlicht(0), + }, + { + "summand": -1, + "symbol": new klasse_schlicht(1), + }, + ] + ; + ausgaenge.forEach + ( + eintrag => + { + let winkel : float = ((mod_vtm_aufbau.richtung_addieren(richtung, eintrag.summand) / 6.0) * 360); + let knoten_pfeil : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "path", + { + "d": svg_form_pfeil, + "class": ( + [ + "pfeil", + ( + eintrag.symbol.ist_schlicht() + ? "symbol_" + eintrag.symbol.lesen().toFixed(0) + : "neutral" + ), + ].join(" ") + ), + "transform": ( + [ + + "rotate(" + winkel.toFixed(svg_float_praezission) + ")", + "translate(0, 0)", + "scale(0.1)", + ].join(" ") + ), + } + ) + ); + kinder_feld.push(knoten_pfeil); + } ) - ); - kinder_feld.push(knoten_rahmen); - } - // inhalt - { - if (aktor instanceof mod_vtm_aufbau.klasse_befoerderer) - { - let befoerderer : mod_vtm_aufbau.klasse_befoerderer = (aktor); - let richtung : mod_vtm_aufbau.typ_richtung = befoerderer.richtung_lesen(); - let knoten_pfeil = ( - new mod_vtm_helfer.klasse_xmlknoten_normal - ( - "path", - { - "class": "pfeil", - "d": "M +0.4 0.0 L -0.2 +0.1 L -0.2 -0.1 Z", - "style": ("stroke: none; fill: " + "hsl(0, 0%, 50%)" + ";"), - "transform": ("rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")"), - } - ) - ); - kinder_feld.push(knoten_pfeil); - } - else if (aktor instanceof mod_vtm_aufbau.klasse_schreiber) - { - let schreiber : mod_vtm_aufbau.klasse_schreiber = (aktor); - let richtung : mod_vtm_aufbau.typ_richtung = schreiber.richtung_lesen(); - let symbol : mod_vtm_aufbau.typ_symbol = schreiber.symbol_lesen(); - let knoten_pfeil = ( - new mod_vtm_helfer.klasse_xmlknoten_normal - ( - "path", - { - "class": "pfeil", - "d": "M +0.4 0.0 L -0.2 +0.1 L -0.2 -0.1 Z", - "style": ("stroke: none; fill: " + symbol_zu_farbe(symbol) + ";"), - "transform": ("rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")"), - } - ) - ); - kinder_feld.push(knoten_pfeil); - } - else if (aktor instanceof mod_vtm_aufbau.klasse_leser) - { - let leser : mod_vtm_aufbau.klasse_leser = (aktor); - let richtung : mod_vtm_aufbau.typ_richtung = leser.richtung_lesen(); - // ausgang ersatz - { - let knoten_pfeil = ( - new mod_vtm_helfer.klasse_xmlknoten_normal - ( - "path", - { - "class": "pfeil", - "d": "M +0.4 0.0 L +0.1 +0.1 L +0.1 -0.1 Z", - "style": ("stroke: none; fill: " + "hsl(0, 0%, 50%)" + ";"), - "transform": ("rotate(" + ((richtung/6.0) * 360).toFixed(svg_float_praezission) + ")"), - } - ) - ); - kinder_feld.push(knoten_pfeil); - } - // ausgang rot - { - let knoten_pfeil = ( - new mod_vtm_helfer.klasse_xmlknoten_normal - ( - "path", - { - "class": "pfeil", - "d": "M +0.4 0.0 L +0.1 +0.1 L +0.1 -0.1 Z", - "style": ("stroke: none; fill: " + symbol_zu_farbe(0) + ";"), - "transform": ("rotate(" + (((richtung+1)/6.0) * 360).toFixed(svg_float_praezission) + ")"), - } - ) - ); - kinder_feld.push(knoten_pfeil); - } - // ausgang gruen - { - let knoten_pfeil = ( - new mod_vtm_helfer.klasse_xmlknoten_normal - ( - "path", - { - "class": "pfeil", - "d": "M +0.4 0.0 L +0.1 +0.1 L +0.1 -0.1 Z", - "style": ("stroke: none; fill: " + symbol_zu_farbe(1) + ";"), - "transform": ("rotate(" + (((richtung-1)/6.0) * 360).toFixed(svg_float_praezission) + ")"), - } - ) - ); - kinder_feld.push(knoten_pfeil); - } - } - else if (aktor instanceof mod_vtm_aufbau.klasse_annehmer) - { - let annehmer : mod_vtm_aufbau.klasse_annehmer = (aktor); - // TODO - console.warn("not implemented"); - } - else - { - let meldung : string = ("unbehandelter Aktor-Typ"); - throw (new Error(meldung)); - } - } + ; + } + else if (aktor instanceof mod_vtm_aufbau.klasse_verwerfer) + { + kinder_feld.push(knoten_rahmen()); + let verwerfer : mod_vtm_aufbau.klasse_annehmer = (aktor); + let knoten_kreis : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "circle", + { + "cx": (0.0).toFixed(svg_float_praezission), + "cy": (0.0).toFixed(svg_float_praezission), + "r": (0.25).toFixed(svg_float_praezission), + "class": ( + [ + "kreis", + "negativ", + ].join(" ") + ), + } + ) + ); + kinder_feld.push(knoten_kreis); + } + else if (aktor instanceof mod_vtm_aufbau.klasse_annehmer) + { + kinder_feld.push(knoten_rahmen()); + let annehmer : mod_vtm_aufbau.klasse_annehmer = (aktor); + let knoten_kreis : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "circle", + { + "cx": (0.0).toFixed(svg_float_praezission), + "cy": (0.0).toFixed(svg_float_praezission), + "r": (0.25).toFixed(svg_float_praezission), + "class": ( + [ + "kreis", + "positiv", + ].join(" ") + ), + } + ) + ); + kinder_feld.push(knoten_kreis); + } + else + { + let meldung : string = ("unbehandelter Aktor-Typ"); + throw (new Error(meldung)); + } let position : typ_position = position_von_stelle(stelle); let knoten_feld : mod_vtm_helfer.schnittstelle_xmlknoten = ( new mod_vtm_helfer.klasse_xmlknoten_normal @@ -183,6 +226,7 @@ module mod_vtm_darstellung_steuerung "g", { "class": "feld", + "rel": mod_vtm_aufbau.stelle_hash(stelle), "transform": ("translate(" + position.x.toFixed(svg_float_praezission) + ", " + position.y.toFixed(svg_float_praezission) + ")"), }, kinder_feld @@ -205,20 +249,89 @@ module mod_vtm_darstellung_steuerung ); kinder_welt.push(knoten_felder); } - // figur + // Figur { let figur : mod_vtm_aufbau.klasse_figur = this.aufbau.figur_lesen(); + let kinder_figur : Array = []; + // Stein + { + let knoten_stein : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "circle", + { + "cx": (0.0).toFixed(svg_float_praezission), + "cy": (0.0).toFixed(svg_float_praezission), + "r": (0.125).toFixed(svg_float_praezission), + "class": "stein", + } + ) + ); + kinder_figur.push(knoten_stein); + } + // Band + { + let band : Array = figur.band_lesen(); + let kinder_band : Array = []; + band.reduceRight + ( + (dummy, symbol, index) => + { + let r : float = 0.06125; + let x : float = (+0.1+(2*r)*index); + let y : float = (-0.1); + let knoten_eintrag : mod_vtm_helfer.schnittstelle_xmlknoten = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "rect", + { + /* + "cx": x.toFixed(svg_float_praezission), + "cy": y.toFixed(svg_float_praezission), + "r": r.toFixed(svg_float_praezission), + */ + "x": (x-r).toFixed(svg_float_praezission), + "y": (y-r).toFixed(svg_float_praezission), + "width": (2*r).toFixed(svg_float_praezission), + "height": (2*r).toFixed(svg_float_praezission), + "class": ( + [ + "eintrag", + "symbol_" + symbol.toFixed(0), + ].join(" ") + ), + } + ) + ); + kinder_band.push(knoten_eintrag); + return null; + } + , + null + ) + ; + let knoten_band = ( + new mod_vtm_helfer.klasse_xmlknoten_normal + ( + "g", + { + "class": "band", + }, + kinder_band + ) + ); + kinder_figur.push(knoten_band); + } let position : typ_position = position_von_stelle(figur.stelle_lesen()); - let knoten_figur : mod_vtm_helfer.schnittstelle_xmlknoten = ( + let knoten_figur = ( new mod_vtm_helfer.klasse_xmlknoten_normal ( - "circle", + "g", { "class": "figur", - "cx": position.x.toFixed(svg_float_praezission), - "cy": position.y.toFixed(svg_float_praezission), - "r": (0.2).toFixed(svg_float_praezission), - } + "transform": ("translate(" + position.x.toFixed(svg_float_praezission) + "," + position.y.toFixed(svg_float_praezission) + ")"), + }, + kinder_figur ) ); kinder_welt.push(knoten_figur); diff --git a/quelldatein/haupt.ts b/quelldatein/haupt.ts new file mode 100644 index 0000000..587cab8 --- /dev/null +++ b/quelldatein/haupt.ts @@ -0,0 +1,96 @@ + +/** + * @author kcf + */ +function haupt() : void + { + let darstellung_aktualisieren = function (aufbau : mod_vtm_aufbau.klasse_welt, dom_zeichenflaeche : Element) : void + { + let darstellung_steuerung : mod_vtm_darstellung_steuerung.klasse_web_welt = new mod_vtm_darstellung_steuerung.klasse_web_welt(aufbau); + let xmlknoten : mod_vtm_helfer.schnittstelle_xmlknoten = mod_vtm_darstellung_steuerung.svg_wurzel + ( + -4, -4, + +4, +4, + 800, 800, + [darstellung_steuerung.darstellen()] + ) + ; + dom_zeichenflaeche.innerHTML = xmlknoten.darstellen(); + } + ; + + let aufbau : mod_vtm_aufbau.klasse_welt = mod_vtm_aufbau.klasse_welt.blanko(); + let dom_zeichenflaeche : Element = document.querySelector("#zeichenflaeche") + // initiale Darstellung + darstellung_aktualisieren(aufbau, dom_zeichenflaeche); + // Steuerung + { + dom_zeichenflaeche.addEventListener + ( + "click", + event => + { + event.preventDefault(); + let dom_feld : Element = event.target["closest"](".feld"); + if (dom_feld == null) + { + console.info("-- kein Feld"); + } + else + { + let rel : string = dom_feld.getAttribute("rel") + let stelle : mod_vtm_aufbau.typ_stelle = mod_vtm_aufbau.stelle_von_hash(rel); + aufbau.feld_wechseln(stelle); + darstellung_aktualisieren(aufbau, dom_zeichenflaeche); + } + } + ) + ; + dom_zeichenflaeche.addEventListener + ( + "contextmenu", + event => + { + event.preventDefault(); + let dom_feld : Element = event.target["closest"](".feld"); + if (dom_feld == null) + { + console.info("-- kein Feld"); + } + else + { + let rel : string = dom_feld.getAttribute("rel") + let stelle : mod_vtm_aufbau.typ_stelle = mod_vtm_aufbau.stelle_von_hash(rel); + aufbau.feld_drehen(stelle); + darstellung_aktualisieren(aufbau, dom_zeichenflaeche); + } + } + ) + ; + document.querySelector("#knopf_fortfahren").addEventListener + ( + "click", + event => + { + aufbau.fortfahren(); + darstellung_aktualisieren(aufbau, dom_zeichenflaeche); + } + ) + ; + } + } + + +/** + * @author kcf + */ +function eingang_web() : void + { + document.addEventListener + ( + "DOMContentLoaded", + event => {haupt();} + ) + ; + } + diff --git a/quelldatein/helfer/verschiedenes.ts b/quelldatein/helfer/verschiedenes.ts new file mode 100644 index 0000000..26d7e16 --- /dev/null +++ b/quelldatein/helfer/verschiedenes.ts @@ -0,0 +1,14 @@ + +module mod_vtm_helfer + { + + /** + * @author kcf + */ + export function sequenz(laenge : int) : Array + { + return ((laenge <= 0) ? [] : sequenz(laenge-1).concat([laenge-1])); + } + + } + diff --git a/quelldatein/test.ts b/quelldatein/test.ts index f3c8ae1..9735a51 100644 --- a/quelldatein/test.ts +++ b/quelldatein/test.ts @@ -18,7 +18,7 @@ module mod_vtm_test ( -4, -4, +4, +4, - 500, 500, + 800, 800, [ new mod_vtm_helfer.klasse_xmlknoten_normal (