Vererbung von VectorElements

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Vererbung von VectorElements

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

      Quellcode

      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:

      Quellcode

      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>
      Alles anzeigen

      Quellcode

      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:

      Quellcode

      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>
      Alles anzeigen
      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:


      Quellcode

      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>
      Alles anzeigen
      Angenommen, ich möchte im zweiten Item gerne ValueA auf 33 abändern. Meiner Intuition von oben folgend sähe das so aus:

      Quellcode

      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>
      Alles anzeigen

      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.

      Quellcode

      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>
      Alles anzeigen
      Das Spiel interpretiert das dann folgendermaßen:

      Quellcode

      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>
      Alles anzeigen
      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!

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Nale aka Taubenangriff ()