QuestGraph.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #pragma once
  2. #include <Schrift.h>
  3. #include <UIMLView.h>
  4. #include "NetworkAPIProcessor.h"
  5. class QuestGraphElement : public Framework::UIMLElement
  6. {
  7. public:
  8. QuestGraphElement();
  9. //! prüft, ob dieses UIML Element für ein bestimmtes xml Element zuständig
  10. //! ist
  11. bool isApplicableFor(Framework::XML::Element& element) override;
  12. //! erstellt eine neue Zeichnung zu einem gegebenen xml Element
  13. Framework::Zeichnung* parseElement(Framework::XML::Element& element,
  14. Framework::UIMLContainer& generalFactory) override;
  15. bool updateElement(Framework::XML::Element& element,
  16. Framework::Zeichnung& z,
  17. Framework::UIMLContainer& generalFactory) override;
  18. //! wendet die layout parameter zu einer Zeichnung an
  19. void layout(Framework::XML::Element& element,
  20. Framework::Zeichnung& z,
  21. int pWidth,
  22. int pHeight,
  23. Framework::UIMLContainer& generalLayouter) override;
  24. };
  25. class QuestGraphItemElement : public Framework::UIMLElement
  26. {
  27. public:
  28. QuestGraphItemElement();
  29. //! prüft, ob dieses UIML Element für ein bestimmtes xml Element zuständig
  30. //! ist
  31. bool isApplicableFor(Framework::XML::Element& element) override;
  32. //! erstellt eine neue Zeichnung zu einem gegebenen xml Element
  33. Framework::Zeichnung* parseElement(Framework::XML::Element& element,
  34. Framework::UIMLContainer& generalFactory) override;
  35. bool updateElement(Framework::XML::Element& element,
  36. Framework::Zeichnung& z,
  37. Framework::UIMLContainer& generalFactory) override;
  38. //! wendet die layout parameter zu einer Zeichnung an
  39. void layout(Framework::XML::Element& element,
  40. Framework::Zeichnung& z,
  41. int pWidth,
  42. int pHeight,
  43. Framework::UIMLContainer& generalLayouter) override;
  44. };
  45. class QuestGraphItem;
  46. struct ConnectionInfo
  47. {
  48. QuestGraphItem* target;
  49. int id;
  50. };
  51. class AndNode;
  52. struct ConnectionTarget
  53. {
  54. int targetIndex;
  55. AndNode* zTarget;
  56. };
  57. class Connection : public Framework::ReferenceCounter
  58. {
  59. private:
  60. QuestGraphItem* zSource;
  61. Framework::Array<ConnectionTarget> targets;
  62. int vx;
  63. int minY;
  64. int maxY;
  65. public:
  66. Connection(QuestGraphItem* zSource);
  67. void renderVertical(Framework::Bild& rObj);
  68. void renderHorizontal(Framework::Bild& rObj);
  69. void setVx(int vx);
  70. void addConnectionTarget(ConnectionTarget target);
  71. void setTargetIndex(AndNode* zTarget, int index);
  72. void layout();
  73. bool isActive() const;
  74. int getOrderNum() const;
  75. int getTargetCount() const;
  76. int getVerticalLength() const;
  77. int getVx() const;
  78. bool hasTarget(AndNode* zAndNode, int index) const;
  79. };
  80. class AndNode : public Framework::ZeichnungHintergrund
  81. {
  82. private:
  83. Framework::Array<Connection*> connections;
  84. Framework::TextRenderer tr;
  85. public:
  86. AndNode();
  87. void addConnection(Connection* zConnection);
  88. void render(Framework::Bild& rObj);
  89. Framework::Punkt getTargetPosition(int index);
  90. void layout();
  91. bool isActive() const;
  92. int getConnectionCount() const;
  93. };
  94. class OrConnection : public Framework::ReferenceCounter
  95. {
  96. private:
  97. Framework::RCArray<AndNode> andNodes;
  98. QuestGraphItem* zTarget;
  99. int minY;
  100. int maxY;
  101. public:
  102. OrConnection(QuestGraphItem* zTarget,
  103. const Framework::Array<ConnectionInfo>& connections);
  104. void render(Framework::Bild& rObj);
  105. void layout();
  106. int getNeededHeight() const;
  107. bool isActive() const;
  108. bool isHorizontalLineConflict(
  109. int y, Connection* zIgnoredIncommingConnection) const;
  110. };
  111. class QuestGraphItem : public Framework::ZeichnungHintergrund
  112. {
  113. private:
  114. int layerIndex;
  115. int nodeIndex;
  116. Framework::Array<ConnectionInfo> previousLayersConnections;
  117. Framework::Array<ConnectionInfo> nextLayersConnections;
  118. Framework::Text id;
  119. Framework::Text requirements;
  120. Framework::Text onClick;
  121. Connection* outgoingConnection;
  122. OrConnection* incommingConnection;
  123. bool finished;
  124. bool rewarded;
  125. bool mainQuest;
  126. bool virtualNode;
  127. double animationProgress;
  128. public:
  129. QuestGraphItem();
  130. ~QuestGraphItem();
  131. bool tick(double tickVal);
  132. void render(Framework::Bild& rObj);
  133. void renderVerticalConnections(Framework::Bild& rObj);
  134. void renderHorizontalConnections(Framework::Bild& rObj);
  135. void replacePreviousConnections(
  136. QuestGraphItem* zBefore, QuestGraphItem* zAfter);
  137. const Framework::Text& getId() const;
  138. const Framework::Text& getRequirements() const;
  139. bool calculateLaxerIndex();
  140. int getLayerIndex() const;
  141. void setVirtual(bool virtualNode);
  142. void setNodeIndex(int index);
  143. void addNextLayerRef(ConnectionInfo zItem);
  144. void addPreviousLayerRef(ConnectionInfo zItem);
  145. void initializeConnections();
  146. const Framework::Array<ConnectionInfo>& getNextLayersConnections() const;
  147. int getNodeIndex() const;
  148. bool isMainQuest() const;
  149. bool isVirtual() const;
  150. bool isFinished() const;
  151. Connection* zOutgoingConnection() const;
  152. OrConnection* zIncommingConnection() const;
  153. friend QuestGraphItemElement;
  154. };
  155. class QuestGraphItemLayer : public Framework::ReferenceCounter
  156. {
  157. private:
  158. Framework::RCArray<QuestGraphItem> items;
  159. public:
  160. QuestGraphItemLayer();
  161. bool tick(double tickVal);
  162. void render(Framework::Bild& rObj);
  163. void doMausEreignis(Framework::MausEreignis& me);
  164. void addItem(QuestGraphItem* item);
  165. bool sortItems();
  166. int fixItemPositions(int x);
  167. void sortConnections();
  168. const Framework::RCArray<QuestGraphItem>& getItems() const;
  169. int getLeyerHeight(int& minY) const;
  170. int getLeyerHeight() const;
  171. void centerVertically(int pos);
  172. void resolveHorizontalConflicts(const QuestGraphItemLayer* zNextLayer);
  173. bool isHorizontalLineConflict(
  174. int y, Connection* zIgnoredIncommingConnection) const;
  175. };
  176. class QuestGraph : public Framework::ZeichnungHintergrund
  177. {
  178. private:
  179. Framework::Text id;
  180. Framework::RCArray<QuestGraphItemLayer> layers;
  181. QuestGraphItemLayer invalidNodes;
  182. Framework::Text collectionName;
  183. public:
  184. QuestGraph();
  185. bool tick(double tickVal);
  186. void render(Framework::Bild& rObj) override;
  187. void doMausEreignis(Framework::MausEreignis& me, bool userRet) override;
  188. void addVirtualConnectionNodes();
  189. void sortItems();
  190. void fixItemPositions();
  191. void centerVertically();
  192. void addItem(QuestGraphItem* item);
  193. friend QuestGraphElement;
  194. };