roybaer / mdcii-engine

Plattformunabhängiger Nachbau der Grafikengine von Anno 1602 – Platform independent remake of the graphics engine of Anno 1602/1602 AD
GNU General Public License v2.0
25 stars 5 forks source link

Cod Parser - Teil 1: reines Parsen von COD Files #11

Closed siredmar closed 5 years ago

siredmar commented 5 years ago

DO NOT MERGE! WIP

Das ist der erste Teil des COD Parsers. Der Parser legt die Daten noch in einer internen Struktur ab. Der Zugriff auf die Inhalte wird in einem zweiten Pull Request behandelt.

Was funktioniert so weit:

Funktion Beispiel
Zuweisung von Konstanten CONST = 1
Anlegen von Objekten Objekt: Name mit EndObj oder z.b. Nummer = 0 oder @Nummer: +1
Anlegen von verschachtelten Objekten Objekt: Nested mit EndObj
Variablen mit Wert von Konstanten var: CONST
Variablen mit Wert von Konstanten mit +/- Offset var: CONST+10
Variablen als array (gueltige Werte ebenfalls int, float, string) var: 1, 2, 3 oder var: ZERO, ONE, TWO oder var: 3.14, 4,56 oder var: 1, 2.0, ASDF
Variablen mit Wert int, float, string var: 1 oder var: VALUE oder var: 3.14
Inkrementieren von Variablen aus Vorgaengerobjekt @var: +1
ObjFill - Objekt aktiv holen und einfuegen ObjFill: OBJ
ObjFill Prefill - Beim Anlegen Objekte initial befuellen ObjFill: 0, MAX
Zugriff von Array auf Elemente eines zuvor definierten Arrays (+,-) Arr: 0, 1 mit ArrMath: 1+Arr[0], 2-Arr[1]

Unten ist eine Test.cod Datei zu sehen, die moeglichst viele verschiedene Faelle enthaelt. Weiter unten die geparsten Daten.

test.cod

VARIABLEA = 5000

  Objekt: TEST

    Nummer: 0
    Vara: VARIABLEA
    Varb: 999
    Objekt: ASDF
        var: 1, 2
    EndObj;
    ObjFill: 0, 3

    Nummer: 0
    Vara: VARIABLEA
    Varb: 1000

    @Nummer: +1
    Vara: VARIABLEA+10
    @Varb: +1

    @Nummer: +1
    Vara: VARIABLEA+20
    @Varb: +1

  EndObj;

  Objekt: A

    Nummer: 0
    OBJ = Nummer
    a: 10
    b: 20
    Arr: 1, 2, 3
    Objekt: QWERT
        c: 30, 40
    EndObj;

    @Nummer: +1
    ObjFill: OBJ
    @a: +1
    @b: +1
    ArrMath: 10-Arr[0], 11-Arr[1], 12-Arr[2]

    @Nummer: +1
    a: 1
    b: 0
    Arr: 10, 20, 30
    ArrMath: 9+Arr[0], 8+Arr[1], 7+Arr[2]

  EndObj;

Parsed

object {
  name: "TEST"
  objects {
    name: "0"
    variables {
      variable {
        name: "Vara"
        value_int: 5000
      }
      variable {
        name: "Varb"
        value_int: 1000
      }
    }
    objects {
      name: "ASDF"
      variables {
        variable {
          name: "var"
          value_array {
            value {
              value_int: 1
            }
            value {
              value_int: 2
            }
          }
        }
      }
    }
  }
  objects {
    name: "1"
    variables {
      variable {
        name: "Vara"
        value_int: 5010
      }
      variable {
        name: "Varb"
        value_int: 1001
      }
    }
    objects {
      name: "ASDF"
      variables {
        variable {
          name: "var"
          value_array {
            value {
              value_int: 1
            }
            value {
              value_int: 2
            }
          }
        }
      }
    }
  }
  objects {
    name: "2"
    variables {
      variable {
        name: "Vara"
        value_int: 5020
      }
      variable {
        name: "Varb"
        value_int: 1002
      }
    }
    objects {
      name: "ASDF"
      variables {
        variable {
          name: "var"
          value_array {
            value {
              value_int: 1
            }
            value {
              value_int: 2
            }
          }
        }
      }
    }
  }
  objects {
    name: "A"
    objects {
      name: "0"
      variables {
        variable {
          name: "a"
          value_int: 10
        }
        variable {
          name: "b"
          value_int: 20
        }
        variable {
          name: "Arr"
          value_array {
            value {
              value_int: 1
            }
            value {
              value_int: 2
            }
            value {
              value_int: 3
            }
          }
        }
      }
      objects {
        name: "QWERT"
        variables {
          variable {
            name: "c"
            value_array {
              value {
                value_int: 30
              }
              value {
                value_int: 40
              }
            }
          }
        }
      }
    }
    objects {
      name: "1"
      variables {
        variable {
          name: "a"
          value_int: 11
        }
        variable {
          name: "b"
          value_int: 21
        }
        variable {
          name: "Arr"
          value_array {
            value {
              value_int: 1
            }
            value {
              value_int: 2
            }
            value {
              value_int: 3
            }
          }
        }
        variable {
          name: "ArrMath"
          value_array {
            value {
              value_int: 9
            }
            value {
              value_int: 9
            }
            value {
              value_int: 9
            }
          }
        }
      }
      objects {
        name: "QWERT"
        variables {
          variable {
            name: "c"
            value_array {
              value {
                value_int: 30
              }
              value {
                value_int: 40
              }
            }
          }
        }
      }
    }
    objects {
      name: "2"
      variables {
        variable {
          name: "a"
          value_int: 1
        }
        variable {
          name: "b"
          value_int: 0
        }
        variable {
          name: "Arr"
          value_array {
            value {
              value_int: 10
            }
            value {
              value_int: 20
            }
            value {
              value_int: 30
            }
          }
        }
        variable {
          name: "ArrMath"
          value_array {
            value {
              value_int: 19
            }
            value {
              value_int: 28
            }
            value {
              value_int: 37
            }
          }
        }
      }
    }
  }
}
Green-Sky commented 5 years ago

Erstmal gute Arbeit :smile: . Mir ist noch aufgefallen, dass du Array Zugriff noch nicht hast. eg Posoffs: 30-Pos[0], 200-Pos[1] siehe hier

siredmar commented 5 years ago

Erstmal gute Arbeit . Mir ist noch aufgefallen, dass du Array Zugriff noch nicht hast. eg Posoffs: 30-Pos[0], 200-Pos[1] siehe hier

Ist drin. Allerdings ist es nur moeglich innerhalb eines Arrays auf Elemente eines anderen im selben Objekt definierten Arrays zuzugreifen. Sollte aber reichen, oder hast du mal noch einen anderen Fall gesehen?

Green-Sky commented 5 years ago

Bei den meisten neuen Dateien fehlt noch ein Newline am Ende.

siredmar commented 5 years ago

Bei den meisten neuen Dateien fehlt noch ein Newline am Ende.

Stimmt. Wird geaendert.

siredmar commented 5 years ago

Closed in favour of #15