Vererbung von VectorElements

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Vererbung von VectorElements

      Also, wer hat sich schonmal gefragt, was der Schrott hier sein soll?

      Source Code

      1. <Item>
      2. <VectorElement>
      3. <InheritedIndex>0</InheritedIndex>
      4. </VectorElement>
      5. </Item>
      Sieht nach Schrott aus, ist es auch, aber hat seinen Sinn. Zuerst eine Erinnerung, wie Vererbung normalerweise für Anno funktioniert, anhand ChildAsset und BaseAsset:

      Source Code

      1. <Asset>
      2. <Template>SimpleAsset</Template>
      3. <GUID>42</GUID>
      4. <Values>
      5. <ValueA>99</ValueA>
      6. <ValueB>25</ValueB>
      7. <ValueC>30</ValueC>
      8. <Container>
      9. <ContainerValue>A</ContainerValue>
      10. </Container>
      11. </Values>
      12. </Asset>
      Display All

      Source Code

      1. <Asset>
      2. <BaseAssetGUID>42</BaseAssetGUID>
      3. <Values>
      4. <ValueA>24</ValueA>
      5. <ValueB />
      6. <Container />
      7. </Values>
      8. <Asset>

      Dann interpretiert das Spiel das ChildAsset folgendermaßen:

      Source Code

      1. <Asset>
      2. <Template>SimpleAsset</Template>
      3. <Values>
      4. <ValueA>24</ValueA>
      5. <ValueB>DefaultValueOfValueB</ValueB>
      6. <ValueC>30</ValueC>
      7. <Container>
      8. <ContainerValue>A</ContainerValue>
      9. </Container>
      10. </Values>
      11. </Asset>
      Display All
      Das Spiel übernimmt alle Werte vom BaseAsset, behält auf dem ersten Level alle "leeren" <Container /> bei und ersetzt ab dem zweiten Level alle Werte exakt nach xml-Struktur. Das funktioniert dann, wenn alle XML-Tags auf einem Level einzigartig sind, das Spiel also genau weiß, in welchem Container es ersetzen muss.

      Was ist jetzt aber, wenn der Container keine klaren Werte, sondern einen Vector (eine Liste aus "<Item> ... </Item>", ein <Item> nenne ich im folgenden ein VectorElement) enthält? Zur Verdeutlichung:


      Source Code

      1. <Asset>
      2. <Template>SimpleAssetWithVector</Template>
      3. <GUID>1337</GUID>
      4. <Values>
      5. <Container>
      6. <ContainerVector>
      7. <Item>
      8. <ValueA>1</Value>
      9. </Item>
      10. <Item>
      11. <ValueA>3</Value>
      12. </Item>
      13. <Item>
      14. <ValueA>5</Value>
      15. </Item>
      16. <Item>
      17. <ValueA>2</Value>
      18. </Item>
      19. </ContainerVector>
      20. </Container>
      21. </Values>
      22. </Asset>
      Display All
      Angenommen, ich möchte im zweiten Item gerne ValueA auf 33 abändern. Meiner Intuition von oben folgend sähe das so aus:

      Source Code

      1. <Asset>
      2. <BaseAssetGUID>1337</BaseAssetGUID>
      3. <GUID>45</GUID>
      4. <Values>
      5. <Container>
      6. <ContainerVector>
      7. <Item>
      8. <ValueA>33</ValueA>
      9. <Item>
      10. <ContainerVector>
      11. </Container>
      12. </Values>
      13. </Asset>
      Display All

      Woher soll das Spiel aber wissen, dass ich das zweite Item meine? Richtig, das kann es auf diesem Wege nicht herausfinden. Aber Anno bietet dafür eine Lösung: InheritedIndices.

      Also, wir machen zwei Schritte.

      1) Zuerst vererben wir alle VectorElements, die wir im ChildAsset haben wollen. Das seien in unserem Fall mal alle vier, man kann aber auch weniger vererben, ganz wie man das möchte oder muss, das ergibt sich dann aus der Logik, welche man erreichen möchte.
      Die VectorElements sind eine reine Interpretationsanweisung für das Spiel! Sie ändern nichts an dem bearbeiteten Level.

      2) Dann tragen wir dort unsere Änderungen ein, wie oben.

      Source Code

      1. <Asset>
      2. <BaseAssetGUID>1337</BaseAssetGUID>
      3. <GUID>45</GUID>
      4. <Values>
      5. <Container>
      6. <ContainerVector>
      7. <Item>
      8. <VectorElement>
      9. <InheritedIndex>0</InheritedIndex>
      10. </VectorElement>
      11. <Item>
      12. <Item>
      13. <VectorElement>
      14. <InheritedIndex>1</InheritedIndex>
      15. </VectorElement>
      16. <ValueA>33</ValueA>
      17. <Item>
      18. <Item>
      19. <VectorElement>
      20. <InheritedIndex>2</InheritedIndex>
      21. </VectorElement>
      22. <Item>
      23. <Item>
      24. <VectorElement>
      25. <InheritedIndex>3</InheritedIndex>
      26. </VectorElement>
      27. <Item>
      28. <ContainerVector>
      29. </Container>
      30. </Values>
      31. </Asset>
      Display All
      Das Spiel interpretiert das dann folgendermaßen:

      Source Code

      1. <Asset>
      2. <Template>SimpleAssetWithVector</Template>
      3. <GUID>45</GUID>
      4. <Values>
      5. <Container>
      6. <ContainerVector>
      7. <Item>
      8. <ValueA>1</Value>
      9. </Item>
      10. <Item>
      11. <ValueA>33</Value>
      12. </Item>
      13. <Item>
      14. <ValueA>5</Value>
      15. </Item>
      16. <Item>
      17. <ValueA>2</Value>
      18. </Item>
      19. </ContainerVector>
      20. </Container>
      21. </Values>
      22. </Asset>
      Display All
      So kann ich auch einfach VectorElements vererben.

      Wieso das ganze, sieht doch alles einfach gestrickt aus? - Wieso kopiert man nicht einfach das BaseAsset und ändert es ab, dann kann man sich doch alles sparen?

      Sagen wir genau, wie man normale Vererbung benutzen will, um Redundanzen zu vermeiden, da sie fehleranfällig sind. Die VectorElements können auch sehr komplex werden, beispielsweise bei Quests oder Triggern. Daher sollte man möglichst die Redundanzen und Gemeinsamkeiten in Templates und BaseAssets auslagern!

      The post was edited 2 times, last by Nale aka Taubenangriff ().