1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-10 22:31:40 +02:00

Add example of typical bonus system graph to docs

This commit is contained in:
Ivan Savenko
2025-05-10 19:13:47 +03:00
parent a188934e12
commit 519fbae43c
3 changed files with 721 additions and 0 deletions

View File

@@ -2,6 +2,16 @@
The bonus system of VCMI is a set of mechanisms that make handling of different bonuses for heroes, towns, players and units easier. The system consists of a set of nodes representing objects that can be a source or a subject of a bonus and two directed acyclic graphs (DAGs) representing inheritance and propagation of bonuses. Core of bonus system is defined in HeroBonus.h file.
## Bonus System Nodes
![Bonus System Nodes Diagram](../images/Bonus_System_Nodes.svg)
Legend:
- brown: actual nodes, and members of bonus system graph
- cyan: constant nodes that act only as source, and can not receive bonuses
- gray: virtual nodes to clarify graph layout. Actual node is located below. For example, there is no entity for "Visiting Hero", instead visiting hero is hero that is attached to player node only via Town node.
## Propagation and inheritance
Each bonus originates from some node in the bonus system, and may have propagator and limiter objects attached to it. Bonuses are shared around as follows:

View File

@@ -0,0 +1,237 @@
digraph mygraph {
fontname="monospace"
edge [fontname="Noto Serif"]
node [
fontname="Noto Serif"
style=filled
shape=plain
fillcolor="#60200080"
pencolor="#00000080" // frames color
]
subgraph rankedTop {
"Global" [
label =<<table>
<tr><td><b>Global</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>GLOBAL_EFFECT</b></font></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CGameState</b></font></td></tr>
<tr><td>Global node to which<br/>all map entities are connected</td></tr>
<tr><td>Note: Not recruited heroes (such as in tavern)<br/>are not attached to any node</td></tr>
</table>>
]
"Team" [
label =<<table>
<tr><td><b>Team</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>TEAM_PROPAGATOR</b></font></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>TeamState</b></font></td></tr>
<tr><td>Per-team node.<br/>Game will put players without team<br/>into a team with a single player</td></tr>
</table>>
]
"Player" [
label =<<table>
<tr><td><b>Player</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>PLAYER_PROPAGATOR</b></font></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CPlayerState</b></font></td></tr>
<tr><td>Per-player team.<br/>All objects owned by a player<br/>belong to such node</td></tr>
</table>>
]
};
subgraph rankedArmies {
rank="same"
"Hero" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Hero</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>HERO</b></font></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CGHeroInstance</b></font></td></tr>
<tr><td>Represents a hero, either owned by player or in prison.<br/>Bonuses from specialty and secondary skills<br/>are attached directly to this node</td></tr>
</table>>
]
"Combat" [
label =<<table>
<tr><td><b>Combat</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>BATTLE_WIDE</b></font></td></tr>
<tr><td>Node that contains both sides of a combat<br/>Anything propagated to this node will affect both sides in combat</td></tr>
</table>>
]
};
subgraph rankedHeroes {
rank="same"
"Visiting Hero" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Visiting Hero</b></td></tr>
<tr><td>Hero that is currently<br/>visiting owned or allied town</td></tr>
</table>>
]
"Garrisoned Hero" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Garrisoned Hero</b></td></tr>
<tr><td>Hero that is currently<br/>placed in a garrison of owned town</td></tr>
</table>>
]
"Wandering Hero" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Wandering Hero</b></td></tr>
<tr><td>Hero that is currently<br/>moving on map, outside of towns</td></tr>
</table>>
]
"Neutral Army" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Neutral Army</b></td></tr>
<tr><td>Any army that is not owned by a player<br/>Wandering monsters, Banks, Events, etc</td></tr>
</table>>
]
"Owned Army" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Owned Army</b></td></tr>
<tr><td>Army owned by a player.<br/>Mines, Garrisons, Dwellings</td></tr>
</table>>
]
};
subgraph rankedTopHero {
rank="same"
"Town" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Town</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CGTownInstance</b></font></td></tr>
<tr><td>Represents a town on map.<br/>Town buildings can provide bonuses to this node<br/>(or propagate them upward)</td></tr>
</table>>
]
"Artifact Instance" [
fillcolor="#00FFFF80"
label =<<table>
<tr><td><b>Artifact Instance</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CArtifact</b></font></td></tr>
<tr><td>Represents a particular instance of an artifact<br/> that hero can equip or trade</td></tr>
</table>>
]
"Boat" [
fillcolor="#00FFFF80"
label =<<table>
<tr><td><b>Boat</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CGBoat</b></font></td></tr>
<tr><td>Represents a boat or other type of transport.<br/>Can provide bonuses to boarded hero</td></tr>
</table>>
]
};
subgraph rankedMisc {
"Town and visiting hero" [
label =<<table>
<tr><td><b>Town and Visiting Hero</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>VISITED_TOWN_AND_VISITOR</b></font></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CTownAndVisitingHero</b></font></td></tr>
<tr><td>Helper node that exists solely<br/>to propagate bonuses to both town and visiting hero</td></tr>
<tr><td>Note: Neutral towns are attached to global node instead</td></tr>
</table>>
]
"Combat" [
label =<<table>
<tr><td><b>Combat</b></td></tr>
<tr><td>Propagator: <font face="monospace"><b>BATTLE_WIDE</b></font></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>BattleInfo</b></font></td></tr>
<tr><td>Node that contains both sides of a combat<br/>Anything propagated to this node will affect both sides in combat</td></tr>
</table>>
]
"Creature Type" [
fillcolor="#00FFFF80"
label =<<table>
<tr><td><b>Creature Type</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CCreature</b></font></td></tr>
<tr><td>Represents a creature type, such as Pikeman or Archer</td></tr>
</table>>
]
"Artifact Type" [
fillcolor="#00FFFF80"
label =<<table>
<tr><td><b>Artifact Type</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CArtifact</b></font></td></tr>
<tr><td>Represents an artifact type, for example Ring of Life</td></tr>
</table>>
]
"Artifact Component" [
fillcolor="#80808080"
label =<<table>
<tr><td><b>Artifact Component</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CArtifact</b></font></td></tr>
<tr><td>For combined, non-fused artifacts,<br/>instances of components are attached to instance of combined artifact</td></tr>
</table>>
]
"Army" [
label =<<table>
<tr><td><b>Army</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CArmedInstance</b></font></td></tr>
<tr><td>Represents any object that can hold army,<br/>such as town, hero, mines, garrisons, wandering monsters</td></tr>
</table>>
]
"Unit in Army" [
label =<<table>
<tr><td><b>Unit in Army</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CStackInstance</b></font></td></tr>
<tr><td>Represents a unit that is part of a army<br/>A unit always has a creature type,<br/>belongs to an army and has stack size</td></tr>
</table>>
]
"Unit in Combat" [
label =<<table>
<tr><td><b>Unit in Combat</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CStack</b></font></td></tr>
<tr><td>Represents current state of a unit during combat,<br/>can be affected by spells or receive damage</td></tr>
</table>>
]
"Summon in Combat" [
label =<<table>
<tr><td><b>Summon in Combat</b></td></tr>
<tr><td>C++ Class: <font face="monospace"><b>CStack</b></font></td></tr>
<tr><td>Represents any unit that was added in combat,<br/>and may not remain after combat</td></tr>
</table>>
]
};
"Global" -> "Team"
"Global" -> "Neutral Army"
"Team" -> "Player"
"Player" -> "Town and visiting hero"
"Player" -> "Wandering Hero"
"Player" -> "Owned Army"
"Town and visiting hero" -> "Town"
"Town and visiting hero" -> "Visiting Hero"
"Boat" -> "Hero"
"Combat" -> "Army"
"Army" -> "Unit in Army"
"Army" -> "Summon in Combat"
"Unit in Army" -> "Unit in Combat"
"Artifact Type" -> "Artifact Instance"
"Artifact Component" -> "Artifact Instance"
"Artifact Instance" -> "Hero"
"Creature Type" -> "Summon in Combat"
"Creature Type" -> "Unit in Army"
"Town" -> "Garrisoned Hero"
"Town" -> "Army"
"Neutral Army" -> "Army"
"Owned Army" -> "Army"
"Visiting Hero" -> "Hero"
"Garrisoned Hero" -> "Hero"
"Wandering Hero" -> "Hero"
"Hero" -> "Army"
}

View File

@@ -0,0 +1,474 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: mygraph Pages: 1 -->
<svg width="1625pt" height="1440pt"
viewBox="0.00 0.00 1624.50 1440.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1436)">
<title>mygraph</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1436 1620.5,-1436 1620.5,4 -4,4"/>
<!-- Global -->
<g id="node1" class="node">
<title>Global</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1365.5,-1432 1047.5,-1432 1047.5,-1283 1365.5,-1283 1365.5,-1432"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1050.5,-1407.5 1050.5,-1428.5 1362.5,-1428.5 1362.5,-1407.5 1050.5,-1407.5"/>
<text text-anchor="start" x="1183" y="-1415.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Global</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1050.5,-1384.5 1050.5,-1405.5 1362.5,-1405.5 1362.5,-1384.5 1050.5,-1384.5"/>
<text text-anchor="start" x="1110.5" y="-1392.3" font-family="Noto Serif" font-size="14.00">Propagator: </text>
<text text-anchor="start" x="1194.5" y="-1392.3" font-family="monospace" font-weight="bold" font-size="14.00">GLOBAL_EFFECT</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1050.5,-1361.5 1050.5,-1382.5 1362.5,-1382.5 1362.5,-1361.5 1050.5,-1361.5"/>
<text text-anchor="start" x="1131" y="-1369.3" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1199" y="-1369.3" font-family="monospace" font-weight="bold" font-size="14.00">CGameState</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1050.5,-1323.5 1050.5,-1359.5 1362.5,-1359.5 1362.5,-1323.5 1050.5,-1323.5"/>
<text text-anchor="start" x="1135" y="-1345.3" font-family="Noto Serif" font-size="14.00">Global node to which</text>
<text text-anchor="start" x="1105" y="-1330.3" font-family="Noto Serif" font-size="14.00">all map entities are connected</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1050.5,-1285.5 1050.5,-1321.5 1362.5,-1321.5 1362.5,-1285.5 1050.5,-1285.5"/>
<text text-anchor="start" x="1053.5" y="-1307.3" font-family="Noto Serif" font-size="14.00">Note: Not recruited heroes (such as in tavern)</text>
<text text-anchor="start" x="1109" y="-1292.3" font-family="Noto Serif" font-size="14.00">are not attached to any node</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1047.5,-1283 1047.5,-1432 1365.5,-1432 1365.5,-1283 1047.5,-1283"/>
</g>
<!-- Team -->
<g id="node2" class="node">
<title>Team</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1256,-1247 1001,-1247 1001,-1121 1256,-1121 1256,-1247"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1004.5,-1223 1004.5,-1244 1253.5,-1244 1253.5,-1223 1004.5,-1223"/>
<text text-anchor="start" x="1109" y="-1230.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Team</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1004.5,-1200 1004.5,-1221 1253.5,-1221 1253.5,-1200 1004.5,-1200"/>
<text text-anchor="start" x="1025" y="-1207.8" font-family="Noto Serif" font-size="14.00">Propagator: </text>
<text text-anchor="start" x="1109" y="-1207.8" font-family="monospace" font-weight="bold" font-size="14.00">TEAM_PROPAGATOR</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1004.5,-1177 1004.5,-1198 1253.5,-1198 1253.5,-1177 1004.5,-1177"/>
<text text-anchor="start" x="1057.5" y="-1184.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1125.5" y="-1184.8" font-family="monospace" font-weight="bold" font-size="14.00">TeamState</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1004.5,-1124 1004.5,-1175 1253.5,-1175 1253.5,-1124 1004.5,-1124"/>
<text text-anchor="start" x="1077.5" y="-1160.8" font-family="Noto Serif" font-size="14.00">Per&#45;team node.</text>
<text text-anchor="start" x="1007.5" y="-1145.8" font-family="Noto Serif" font-size="14.00">Game will put players without team</text>
<text text-anchor="start" x="1022" y="-1130.8" font-family="Noto Serif" font-size="14.00">into a team with a single player</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1001,-1121 1001,-1247 1256,-1247 1256,-1121 1001,-1121"/>
</g>
<!-- Global&#45;&gt;Team -->
<g id="edge1" class="edge">
<title>Global&#45;&gt;Team</title>
<path fill="none" stroke="black" d="M1172.97,-1282.77C1169,-1274.04 1164.95,-1265.14 1160.99,-1256.43"/>
<polygon fill="black" stroke="black" points="1164.07,-1254.74 1156.74,-1247.09 1157.69,-1257.64 1164.07,-1254.74"/>
</g>
<!-- Neutral Army -->
<g id="node9" class="node">
<title>Neutral Army</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="1616.5,-614 1336.5,-614 1336.5,-549 1616.5,-549 1616.5,-614"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1339.5,-589.5 1339.5,-610.5 1613.5,-610.5 1613.5,-589.5 1339.5,-589.5"/>
<text text-anchor="start" x="1427" y="-597.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Neutral Army</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1339.5,-551.5 1339.5,-587.5 1613.5,-587.5 1613.5,-551.5 1339.5,-551.5"/>
<text text-anchor="start" x="1343" y="-573.3" font-family="Noto Serif" font-size="14.00">Any army that is not owned by a player</text>
<text text-anchor="start" x="1342.5" y="-558.3" font-family="Noto Serif" font-size="14.00">Wandering monsters, Banks, Events, etc</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1336.5,-549 1336.5,-614 1616.5,-614 1616.5,-549 1336.5,-549"/>
</g>
<!-- Global&#45;&gt;Neutral Army -->
<g id="edge2" class="edge">
<title>Global&#45;&gt;Neutral Army</title>
<path fill="none" stroke="black" d="M1292.33,-1282.85C1354.8,-1220.68 1428.5,-1125.59 1428.5,-1023 1428.5,-1023 1428.5,-1023 1428.5,-855 1428.5,-771.96 1450.39,-676.82 1464.6,-623.78"/>
<polygon fill="black" stroke="black" points="1468,-624.63 1467.25,-614.07 1461.24,-622.8 1468,-624.63"/>
</g>
<!-- Player -->
<g id="node3" class="node">
<title>Player</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1173,-1085 936,-1085 936,-959 1173,-959 1173,-1085"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="939.5,-1061 939.5,-1082 1170.5,-1082 1170.5,-1061 939.5,-1061"/>
<text text-anchor="start" x="1031.5" y="-1068.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Player</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="939.5,-1038 939.5,-1059 1170.5,-1059 1170.5,-1038 939.5,-1038"/>
<text text-anchor="start" x="942.5" y="-1045.8" font-family="Noto Serif" font-size="14.00">Propagator: </text>
<text text-anchor="start" x="1026.5" y="-1045.8" font-family="monospace" font-weight="bold" font-size="14.00">PLAYER_PROPAGATOR</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="939.5,-1015 939.5,-1036 1170.5,-1036 1170.5,-1015 939.5,-1015"/>
<text text-anchor="start" x="971" y="-1022.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1039" y="-1022.8" font-family="monospace" font-weight="bold" font-size="14.00">CPlayerState</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="939.5,-962 939.5,-1013 1170.5,-1013 1170.5,-962 939.5,-962"/>
<text text-anchor="start" x="999" y="-998.8" font-family="Noto Serif" font-size="14.00">Per&#45;player team.</text>
<text text-anchor="start" x="956.5" y="-983.8" font-family="Noto Serif" font-size="14.00">All objects owned by a player</text>
<text text-anchor="start" x="988" y="-968.8" font-family="Noto Serif" font-size="14.00">belong to such node</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="936,-959 936,-1085 1173,-1085 1173,-959 936,-959"/>
</g>
<!-- Team&#45;&gt;Player -->
<g id="edge3" class="edge">
<title>Team&#45;&gt;Player</title>
<path fill="none" stroke="black" d="M1099.68,-1120.68C1095.67,-1112.02 1091.53,-1103.07 1087.46,-1094.26"/>
<polygon fill="black" stroke="black" points="1090.62,-1092.76 1083.24,-1085.15 1084.26,-1095.69 1090.62,-1092.76"/>
</g>
<!-- Wandering Hero -->
<g id="node8" class="node">
<title>Wandering Hero</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="784.5,-614 548.5,-614 548.5,-549 784.5,-549 784.5,-614"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="551.5,-589.5 551.5,-610.5 781.5,-610.5 781.5,-589.5 551.5,-589.5"/>
<text text-anchor="start" x="607.5" y="-597.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Wandering Hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="551.5,-551.5 551.5,-587.5 781.5,-587.5 781.5,-551.5 551.5,-551.5"/>
<text text-anchor="start" x="592.5" y="-573.3" font-family="Noto Serif" font-size="14.00">Hero that is currently</text>
<text text-anchor="start" x="554.5" y="-558.3" font-family="Noto Serif" font-size="14.00">moving on map, outside of towns</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="548.5,-549 548.5,-614 784.5,-614 784.5,-549 548.5,-549"/>
</g>
<!-- Player&#45;&gt;Wandering Hero -->
<g id="edge5" class="edge">
<title>Player&#45;&gt;Wandering Hero</title>
<path fill="none" stroke="black" d="M1019.12,-958.91C1013.14,-947.18 1007.32,-934.87 1002.5,-923 953.37,-801.94 993.71,-733.83 893.5,-650 884.76,-642.69 841.02,-629.05 794.23,-615.94"/>
<polygon fill="black" stroke="black" points="795.1,-612.55 784.53,-613.24 793.22,-619.29 795.1,-612.55"/>
</g>
<!-- Owned Army -->
<g id="node10" class="node">
<title>Owned Army</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="199,-614 0,-614 0,-549 199,-549 199,-614"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="3.5,-589.5 3.5,-610.5 196.5,-610.5 196.5,-589.5 3.5,-589.5"/>
<text text-anchor="start" x="53" y="-597.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Owned Army</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="3.5,-551.5 3.5,-587.5 196.5,-587.5 196.5,-551.5 3.5,-551.5"/>
<text text-anchor="start" x="16.5" y="-573.3" font-family="Noto Serif" font-size="14.00">Army owned by a player.</text>
<text text-anchor="start" x="6.5" y="-558.3" font-family="Noto Serif" font-size="14.00">Mines, Garrisons, Dwellings</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="0,-549 0,-614 199,-614 199,-549 0,-549"/>
</g>
<!-- Player&#45;&gt;Owned Army -->
<g id="edge6" class="edge">
<title>Player&#45;&gt;Owned Army</title>
<path fill="none" stroke="black" d="M935.73,-1017.81C688.35,-1009.92 135.99,-985.45 79.5,-923 4.57,-840.16 50.92,-694.54 80.5,-623.62"/>
<polygon fill="black" stroke="black" points="83.85,-624.7 84.55,-614.13 77.41,-621.95 83.85,-624.7"/>
</g>
<!-- Town and visiting hero -->
<g id="node14" class="node">
<title>Town and visiting hero</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1398,-923 1011,-923 1011,-789 1398,-789 1398,-923"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1014.5,-899 1014.5,-920 1395.5,-920 1395.5,-899 1014.5,-899"/>
<text text-anchor="start" x="1122" y="-906.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Town and Visiting Hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1014.5,-876 1014.5,-897 1395.5,-897 1395.5,-876 1014.5,-876"/>
<text text-anchor="start" x="1063.5" y="-883.8" font-family="Noto Serif" font-size="14.00">Propagator: </text>
<text text-anchor="start" x="1147.5" y="-883.8" font-family="monospace" font-weight="bold" font-size="14.00">VISITED_TOWN_AND_VISITOR</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1014.5,-853 1014.5,-874 1395.5,-874 1395.5,-853 1014.5,-853"/>
<text text-anchor="start" x="1088" y="-860.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1156" y="-860.8" font-family="monospace" font-weight="bold" font-size="14.00">CTownAndVisitingHero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1014.5,-815 1014.5,-851 1395.5,-851 1395.5,-815 1014.5,-815"/>
<text text-anchor="start" x="1105.5" y="-836.8" font-family="Noto Serif" font-size="14.00">Helper node that exists solely</text>
<text text-anchor="start" x="1029" y="-821.8" font-family="Noto Serif" font-size="14.00">to propagate bonuses to both town and visiting hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1014.5,-792 1014.5,-813 1395.5,-813 1395.5,-792 1014.5,-792"/>
<text text-anchor="start" x="1017.5" y="-798.8" font-family="Noto Serif" font-size="14.00">Note: Neutral towns are attached to global node instead</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1011,-789 1011,-923 1398,-923 1398,-789 1011,-789"/>
</g>
<!-- Player&#45;&gt;Town and visiting hero -->
<g id="edge4" class="edge">
<title>Player&#45;&gt;Town and visiting hero</title>
<path fill="none" stroke="black" d="M1111.21,-959C1119.65,-949.77 1128.43,-940.17 1137.07,-930.73"/>
<polygon fill="black" stroke="black" points="1139.79,-932.93 1143.96,-923.19 1134.63,-928.21 1139.79,-932.93"/>
</g>
<!-- Hero -->
<g id="node4" class="node">
<title>Hero</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="1060.5,-513 678.5,-513 678.5,-387 1060.5,-387 1060.5,-513"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="681.5,-489 681.5,-510 1057.5,-510 1057.5,-489 681.5,-489"/>
<text text-anchor="start" x="851.5" y="-496.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="681.5,-466 681.5,-487 1057.5,-487 1057.5,-466 681.5,-466"/>
<text text-anchor="start" x="810.5" y="-473.8" font-family="Noto Serif" font-size="14.00">Propagator: </text>
<text text-anchor="start" x="894.5" y="-473.8" font-family="monospace" font-weight="bold" font-size="14.00">HERO</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="681.5,-443 681.5,-464 1057.5,-464 1057.5,-443 681.5,-443"/>
<text text-anchor="start" x="777.5" y="-450.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="845.5" y="-450.8" font-family="monospace" font-weight="bold" font-size="14.00">CGHeroInstance</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="681.5,-390 681.5,-441 1057.5,-441 1057.5,-390 681.5,-390"/>
<text text-anchor="start" x="684.5" y="-426.8" font-family="Noto Serif" font-size="14.00">Represents a hero, either owned by player or in prison.</text>
<text text-anchor="start" x="722" y="-411.8" font-family="Noto Serif" font-size="14.00">Bonuses from specialty and secondary skills</text>
<text text-anchor="start" x="758" y="-396.8" font-family="Noto Serif" font-size="14.00">are attached directly to this node</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="678.5,-387 678.5,-513 1060.5,-513 1060.5,-387 678.5,-387"/>
</g>
<!-- Army -->
<g id="node18" class="node">
<title>Army</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1071,-351 668,-351 668,-263 1071,-263 1071,-351"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="671.5,-327 671.5,-348 1068.5,-348 1068.5,-327 671.5,-327"/>
<text text-anchor="start" x="850" y="-334.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Army</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="671.5,-304 671.5,-325 1068.5,-325 1068.5,-304 671.5,-304"/>
<text text-anchor="start" x="778" y="-311.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="846" y="-311.8" font-family="monospace" font-weight="bold" font-size="14.00">CArmedInstance</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="671.5,-266 671.5,-302 1068.5,-302 1068.5,-266 671.5,-266"/>
<text text-anchor="start" x="729" y="-287.8" font-family="Noto Serif" font-size="14.00">Represents any object that can hold army,</text>
<text text-anchor="start" x="674.5" y="-272.8" font-family="Noto Serif" font-size="14.00">such as town, hero, mines, garrisons, wandering monsters</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="668,-263 668,-351 1071,-351 1071,-263 668,-263"/>
</g>
<!-- Hero&#45;&gt;Army -->
<g id="edge26" class="edge">
<title>Hero&#45;&gt;Army</title>
<path fill="none" stroke="black" d="M869.5,-386.74C869.5,-378.34 869.5,-369.78 869.5,-361.55"/>
<polygon fill="black" stroke="black" points="873,-361.33 869.5,-351.33 866,-361.33 873,-361.33"/>
</g>
<!-- Combat -->
<g id="node5" class="node">
<title>Combat</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="660.5,-505.5 210.5,-505.5 210.5,-394.5 660.5,-394.5 660.5,-505.5"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="213.5,-481 213.5,-502 657.5,-502 657.5,-481 213.5,-481"/>
<text text-anchor="start" x="408" y="-488.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Combat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="213.5,-458 213.5,-479 657.5,-479 657.5,-458 213.5,-458"/>
<text text-anchor="start" x="348" y="-465.8" font-family="Noto Serif" font-size="14.00">Propagator: </text>
<text text-anchor="start" x="432" y="-465.8" font-family="monospace" font-weight="bold" font-size="14.00">BATTLE_WIDE</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="213.5,-435 213.5,-456 657.5,-456 657.5,-435 213.5,-435"/>
<text text-anchor="start" x="360" y="-442.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="428" y="-442.8" font-family="monospace" font-weight="bold" font-size="14.00">BattleInfo</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="213.5,-397 213.5,-433 657.5,-433 657.5,-397 213.5,-397"/>
<text text-anchor="start" x="295" y="-418.8" font-family="Noto Serif" font-size="14.00">Node that contains both sides of a combat</text>
<text text-anchor="start" x="216.5" y="-403.8" font-family="Noto Serif" font-size="14.00">Anything propagated to this node will affect both sides in combat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="210.5,-394.5 210.5,-505.5 660.5,-505.5 660.5,-394.5 210.5,-394.5"/>
</g>
<!-- Combat&#45;&gt;Army -->
<g id="edge10" class="edge">
<title>Combat&#45;&gt;Army</title>
<path fill="none" stroke="black" d="M603.3,-394.49C644.28,-381.17 687.74,-367.05 727.4,-354.17"/>
<polygon fill="black" stroke="black" points="728.7,-357.42 737.13,-351.01 726.53,-350.77 728.7,-357.42"/>
</g>
<!-- Visiting Hero -->
<g id="node6" class="node">
<title>Visiting Hero</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="1012,-614 803,-614 803,-549 1012,-549 1012,-614"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="806.5,-589.5 806.5,-610.5 1009.5,-610.5 1009.5,-589.5 806.5,-589.5"/>
<text text-anchor="start" x="861" y="-597.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Visiting Hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="806.5,-551.5 806.5,-587.5 1009.5,-587.5 1009.5,-551.5 806.5,-551.5"/>
<text text-anchor="start" x="834" y="-573.3" font-family="Noto Serif" font-size="14.00">Hero that is currently</text>
<text text-anchor="start" x="809.5" y="-558.3" font-family="Noto Serif" font-size="14.00">visiting owned or allied town</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="803,-549 803,-614 1012,-614 1012,-549 803,-549"/>
</g>
<!-- Visiting Hero&#45;&gt;Hero -->
<g id="edge23" class="edge">
<title>Visiting Hero&#45;&gt;Hero</title>
<path fill="none" stroke="black" d="M898.2,-548.82C895.88,-540.9 893.29,-532.08 890.65,-523.07"/>
<polygon fill="black" stroke="black" points="893.94,-521.86 887.77,-513.25 887.22,-523.83 893.94,-521.86"/>
</g>
<!-- Garrisoned Hero -->
<g id="node7" class="node">
<title>Garrisoned Hero</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="1280.5,-614 1030.5,-614 1030.5,-549 1280.5,-549 1280.5,-614"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1033.5,-589.5 1033.5,-610.5 1277.5,-610.5 1277.5,-589.5 1033.5,-589.5"/>
<text text-anchor="start" x="1095.5" y="-597.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Garrisoned Hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1033.5,-551.5 1033.5,-587.5 1277.5,-587.5 1277.5,-551.5 1033.5,-551.5"/>
<text text-anchor="start" x="1081.5" y="-573.3" font-family="Noto Serif" font-size="14.00">Hero that is currently</text>
<text text-anchor="start" x="1036.5" y="-558.3" font-family="Noto Serif" font-size="14.00">placed in a garrison of owned town</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1030.5,-549 1030.5,-614 1280.5,-614 1280.5,-549 1030.5,-549"/>
</g>
<!-- Garrisoned Hero&#45;&gt;Hero -->
<g id="edge24" class="edge">
<title>Garrisoned Hero&#45;&gt;Hero</title>
<path fill="none" stroke="black" d="M1085.9,-548.99C1064.64,-539.36 1040.41,-528.39 1016.05,-517.36"/>
<polygon fill="black" stroke="black" points="1017.26,-514.06 1006.71,-513.13 1014.37,-520.44 1017.26,-514.06"/>
</g>
<!-- Wandering Hero&#45;&gt;Hero -->
<g id="edge25" class="edge">
<title>Wandering Hero&#45;&gt;Hero</title>
<path fill="none" stroke="black" d="M715.9,-548.99C730.39,-539.74 746.83,-529.26 763.42,-518.67"/>
<polygon fill="black" stroke="black" points="765.56,-521.46 772.11,-513.13 761.8,-515.56 765.56,-521.46"/>
</g>
<!-- Neutral Army&#45;&gt;Army -->
<g id="edge21" class="edge">
<title>Neutral Army&#45;&gt;Army</title>
<path fill="none" stroke="black" d="M1461.15,-548.93C1437.84,-504.7 1389.07,-425.4 1322.5,-387 1231.06,-334.27 1190.02,-367.76 1081.09,-350.98"/>
<polygon fill="black" stroke="black" points="1081.48,-347.49 1071.04,-349.32 1080.34,-354.4 1081.48,-347.49"/>
</g>
<!-- Owned Army&#45;&gt;Army -->
<g id="edge22" class="edge">
<title>Owned Army&#45;&gt;Army</title>
<path fill="none" stroke="black" d="M106.42,-548.96C117.92,-504.75 145.46,-425.48 201.5,-387 273.67,-337.44 490.45,-318.84 657.69,-311.93"/>
<polygon fill="black" stroke="black" points="658.02,-315.42 667.87,-311.52 657.74,-308.42 658.02,-315.42"/>
</g>
<!-- Town -->
<g id="node11" class="node">
<title>Town</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="1388,-753 1049,-753 1049,-650 1388,-650 1388,-753"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1052.5,-728.5 1052.5,-749.5 1385.5,-749.5 1385.5,-728.5 1052.5,-728.5"/>
<text text-anchor="start" x="1199.5" y="-736.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Town</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1052.5,-705.5 1052.5,-726.5 1385.5,-726.5 1385.5,-705.5 1052.5,-705.5"/>
<text text-anchor="start" x="1127" y="-713.3" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1195" y="-713.3" font-family="monospace" font-weight="bold" font-size="14.00">CGTownInstance</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1052.5,-652.5 1052.5,-703.5 1385.5,-703.5 1385.5,-652.5 1052.5,-652.5"/>
<text text-anchor="start" x="1128" y="-689.3" font-family="Noto Serif" font-size="14.00">Represents a town on map.</text>
<text text-anchor="start" x="1055.5" y="-674.3" font-family="Noto Serif" font-size="14.00">Town buildings can provide bonuses to this node</text>
<text text-anchor="start" x="1123" y="-659.3" font-family="Noto Serif" font-size="14.00">(or propagate them upward)</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1049,-650 1049,-753 1388,-753 1388,-650 1049,-650"/>
</g>
<!-- Town&#45;&gt;Garrisoned Hero -->
<g id="edge19" class="edge">
<title>Town&#45;&gt;Garrisoned Hero</title>
<path fill="none" stroke="black" d="M1191.42,-649.77C1186.67,-640.87 1181.78,-631.72 1177.2,-623.14"/>
<polygon fill="black" stroke="black" points="1180.16,-621.27 1172.37,-614.09 1173.99,-624.56 1180.16,-621.27"/>
</g>
<!-- Town&#45;&gt;Army -->
<g id="edge20" class="edge">
<title>Town&#45;&gt;Army</title>
<path fill="none" stroke="black" d="M1269.58,-649.67C1277.74,-638.72 1284.98,-626.62 1289.5,-614 1299.23,-586.8 1302.53,-574.78 1289.5,-549 1240.14,-451.35 1132.4,-390.7 1038.41,-354.66"/>
<polygon fill="black" stroke="black" points="1039.37,-351.29 1028.78,-351.04 1036.9,-357.84 1039.37,-351.29"/>
</g>
<!-- Artifact Instance -->
<g id="node12" class="node">
<title>Artifact Instance</title>
<polygon fill="#00ffff" fill-opacity="0.501961" stroke="transparent" points="884.5,-745.5 562.5,-745.5 562.5,-657.5 884.5,-657.5 884.5,-745.5"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="565.5,-721.5 565.5,-742.5 881.5,-742.5 881.5,-721.5 565.5,-721.5"/>
<text text-anchor="start" x="663" y="-729.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Artifact Instance</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="565.5,-698.5 565.5,-719.5 881.5,-719.5 881.5,-698.5 565.5,-698.5"/>
<text text-anchor="start" x="652" y="-706.3" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="720" y="-706.3" font-family="monospace" font-weight="bold" font-size="14.00">CArtifact</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="565.5,-660.5 565.5,-696.5 881.5,-696.5 881.5,-660.5 565.5,-660.5"/>
<text text-anchor="start" x="568.5" y="-682.3" font-family="Noto Serif" font-size="14.00">Represents a particular instance of an artifact</text>
<text text-anchor="start" x="626.5" y="-667.3" font-family="Noto Serif" font-size="14.00"> that hero can equip or trade</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="562.5,-657.5 562.5,-745.5 884.5,-745.5 884.5,-657.5 562.5,-657.5"/>
</g>
<!-- Artifact Instance&#45;&gt;Hero -->
<g id="edge16" class="edge">
<title>Artifact Instance&#45;&gt;Hero</title>
<path fill="none" stroke="black" d="M585.05,-657.47C566.99,-646.13 550.85,-631.88 539.5,-614 524.02,-589.61 522.01,-571.99 539.5,-549 573.95,-503.71 608.3,-527.17 668.56,-512.98"/>
<polygon fill="black" stroke="black" points="669.69,-516.3 678.46,-510.36 667.9,-509.53 669.69,-516.3"/>
</g>
<!-- Boat -->
<g id="node13" class="node">
<title>Boat</title>
<polygon fill="#00ffff" fill-opacity="0.501961" stroke="transparent" points="544,-745.5 233,-745.5 233,-657.5 544,-657.5 544,-745.5"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="236.5,-721.5 236.5,-742.5 541.5,-742.5 541.5,-721.5 236.5,-721.5"/>
<text text-anchor="start" x="372.5" y="-729.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Boat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="236.5,-698.5 236.5,-719.5 541.5,-719.5 541.5,-698.5 236.5,-698.5"/>
<text text-anchor="start" x="330" y="-706.3" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="398" y="-706.3" font-family="monospace" font-weight="bold" font-size="14.00">CGBoat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="236.5,-660.5 236.5,-696.5 541.5,-696.5 541.5,-660.5 236.5,-660.5"/>
<text text-anchor="start" x="239.5" y="-682.3" font-family="Noto Serif" font-size="14.00">Represents a boat or other type of transport.</text>
<text text-anchor="start" x="263.5" y="-667.3" font-family="Noto Serif" font-size="14.00">Can provide bonuses to boarded hero</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="233,-657.5 233,-745.5 544,-745.5 544,-657.5 233,-657.5"/>
</g>
<!-- Boat&#45;&gt;Hero -->
<g id="edge9" class="edge">
<title>Boat&#45;&gt;Hero</title>
<path fill="none" stroke="black" d="M415.69,-657.4C439.67,-622.94 477.72,-576.05 522.5,-549 577.38,-515.85 602.3,-529.51 668.43,-513.13"/>
<polygon fill="black" stroke="black" points="669.71,-516.41 678.5,-510.49 667.94,-509.64 669.71,-516.41"/>
</g>
<!-- Town and visiting hero&#45;&gt;Visiting Hero -->
<g id="edge8" class="edge">
<title>Town and visiting hero&#45;&gt;Visiting Hero</title>
<path fill="none" stroke="black" d="M1079.27,-788.81C1065.1,-778.07 1051.74,-766.11 1040.5,-753 1008.09,-715.22 1027.13,-689.24 996.5,-650 988.05,-639.18 977.46,-629.17 966.57,-620.37"/>
<polygon fill="black" stroke="black" points="968.65,-617.55 958.61,-614.18 964.36,-623.08 968.65,-617.55"/>
</g>
<!-- Town and visiting hero&#45;&gt;Town -->
<g id="edge7" class="edge">
<title>Town and visiting hero&#45;&gt;Town</title>
<path fill="none" stroke="black" d="M1210.56,-789C1211.34,-780.53 1212.13,-771.89 1212.9,-763.5"/>
<polygon fill="black" stroke="black" points="1216.4,-763.71 1213.82,-753.43 1209.42,-763.07 1216.4,-763.71"/>
</g>
<!-- Creature Type -->
<g id="node15" class="node">
<title>Creature Type</title>
<polygon fill="#00ffff" fill-opacity="0.501961" stroke="transparent" points="1469.5,-343.5 1089.5,-343.5 1089.5,-270.5 1469.5,-270.5 1469.5,-343.5"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1092.5,-319 1092.5,-340 1466.5,-340 1466.5,-319 1092.5,-319"/>
<text text-anchor="start" x="1228" y="-326.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Creature Type</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1092.5,-296 1092.5,-317 1466.5,-317 1466.5,-296 1092.5,-296"/>
<text text-anchor="start" x="1208" y="-303.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1276" y="-303.8" font-family="monospace" font-weight="bold" font-size="14.00">CCreature</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1092.5,-273 1092.5,-294 1466.5,-294 1466.5,-273 1092.5,-273"/>
<text text-anchor="start" x="1095.5" y="-279.8" font-family="Noto Serif" font-size="14.00">Represents a creature type, such as Pikeman or Archer</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1089.5,-270.5 1089.5,-343.5 1469.5,-343.5 1469.5,-270.5 1089.5,-270.5"/>
</g>
<!-- Unit in Army -->
<g id="node19" class="node">
<title>Unit in Army</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1394.5,-227 1118.5,-227 1118.5,-124 1394.5,-124 1394.5,-227"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1121.5,-202.5 1121.5,-223.5 1391.5,-223.5 1391.5,-202.5 1121.5,-202.5"/>
<text text-anchor="start" x="1210" y="-210.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Unit in Army</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1121.5,-179.5 1121.5,-200.5 1391.5,-200.5 1391.5,-179.5 1121.5,-179.5"/>
<text text-anchor="start" x="1164.5" y="-187.3" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1232.5" y="-187.3" font-family="monospace" font-weight="bold" font-size="14.00">CStackInstance</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1121.5,-126.5 1121.5,-177.5 1391.5,-177.5 1391.5,-126.5 1121.5,-126.5"/>
<text text-anchor="start" x="1124.5" y="-163.3" font-family="Noto Serif" font-size="14.00">Represents a unit that is part of a army</text>
<text text-anchor="start" x="1142" y="-148.3" font-family="Noto Serif" font-size="14.00">A unit always has a creature type,</text>
<text text-anchor="start" x="1130" y="-133.3" font-family="Noto Serif" font-size="14.00">belongs to an army and has stack size</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1118.5,-124 1118.5,-227 1394.5,-227 1394.5,-124 1118.5,-124"/>
</g>
<!-- Creature Type&#45;&gt;Unit in Army -->
<g id="edge18" class="edge">
<title>Creature Type&#45;&gt;Unit in Army</title>
<path fill="none" stroke="black" d="M1273.15,-270.27C1271.32,-259.96 1269.27,-248.42 1267.25,-237.05"/>
<polygon fill="black" stroke="black" points="1270.69,-236.37 1265.49,-227.14 1263.8,-237.6 1270.69,-236.37"/>
</g>
<!-- Summon in Combat -->
<g id="node21" class="node">
<title>Summon in Combat</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1078,-219.5 751,-219.5 751,-131.5 1078,-131.5 1078,-219.5"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="754.5,-195.5 754.5,-216.5 1075.5,-216.5 1075.5,-195.5 754.5,-195.5"/>
<text text-anchor="start" x="846" y="-203.3" font-family="Noto Serif" font-weight="bold" font-size="14.00">Summon in Combat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="754.5,-172.5 754.5,-193.5 1075.5,-193.5 1075.5,-172.5 754.5,-172.5"/>
<text text-anchor="start" x="856" y="-180.3" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="924" y="-180.3" font-family="monospace" font-weight="bold" font-size="14.00">CStack</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="754.5,-134.5 754.5,-170.5 1075.5,-170.5 1075.5,-134.5 754.5,-134.5"/>
<text text-anchor="start" x="757.5" y="-156.3" font-family="Noto Serif" font-size="14.00">Represents any unit that was added in combat,</text>
<text text-anchor="start" x="800.5" y="-141.3" font-family="Noto Serif" font-size="14.00">and may not remain after combat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="751,-131.5 751,-219.5 1078,-219.5 1078,-131.5 751,-131.5"/>
</g>
<!-- Creature Type&#45;&gt;Summon in Combat -->
<g id="edge17" class="edge">
<title>Creature Type&#45;&gt;Summon in Combat</title>
<path fill="none" stroke="black" d="M1179.28,-270.44C1137.99,-255.79 1089.59,-238.62 1045.55,-223"/>
<polygon fill="black" stroke="black" points="1046.53,-219.63 1035.93,-219.58 1044.18,-226.23 1046.53,-219.63"/>
</g>
<!-- Artifact Type -->
<g id="node16" class="node">
<title>Artifact Type</title>
<polygon fill="#00ffff" fill-opacity="0.501961" stroke="transparent" points="954.5,-892.5 590.5,-892.5 590.5,-819.5 954.5,-819.5 954.5,-892.5"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="593.5,-868 593.5,-889 951.5,-889 951.5,-868 593.5,-868"/>
<text text-anchor="start" x="724.5" y="-875.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Artifact Type</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="593.5,-845 593.5,-866 951.5,-866 951.5,-845 593.5,-845"/>
<text text-anchor="start" x="701" y="-852.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="769" y="-852.8" font-family="monospace" font-weight="bold" font-size="14.00">CArtifact</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="593.5,-822 593.5,-843 951.5,-843 951.5,-822 593.5,-822"/>
<text text-anchor="start" x="596.5" y="-828.8" font-family="Noto Serif" font-size="14.00">Represents an artifact type, for example Ring of Life</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="590.5,-819.5 590.5,-892.5 954.5,-892.5 954.5,-819.5 590.5,-819.5"/>
</g>
<!-- Artifact Type&#45;&gt;Artifact Instance -->
<g id="edge14" class="edge">
<title>Artifact Type&#45;&gt;Artifact Instance</title>
<path fill="none" stroke="black" d="M761.01,-819.25C754.91,-800.25 747.28,-776.52 740.51,-755.43"/>
<polygon fill="black" stroke="black" points="743.75,-754.08 737.36,-745.63 737.09,-756.23 743.75,-754.08"/>
</g>
<!-- Artifact Component -->
<g id="node17" class="node">
<title>Artifact Component</title>
<polygon fill="#808080" fill-opacity="0.501961" stroke="transparent" points="572.5,-900 88.5,-900 88.5,-812 572.5,-812 572.5,-900"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="91.5,-876 91.5,-897 569.5,-897 569.5,-876 91.5,-876"/>
<text text-anchor="start" x="259.5" y="-883.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Artifact Component</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="91.5,-853 91.5,-874 569.5,-874 569.5,-853 91.5,-853"/>
<text text-anchor="start" x="259" y="-860.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="327" y="-860.8" font-family="monospace" font-weight="bold" font-size="14.00">CArtifact</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="91.5,-815 91.5,-851 569.5,-851 569.5,-815 91.5,-815"/>
<text text-anchor="start" x="215" y="-836.8" font-family="Noto Serif" font-size="14.00">For combined, non&#45;fused artifacts,</text>
<text text-anchor="start" x="94.5" y="-821.8" font-family="Noto Serif" font-size="14.00">instances of components are attached to instance of combined artifact</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="88.5,-812 88.5,-900 572.5,-900 572.5,-812 88.5,-812"/>
</g>
<!-- Artifact Component&#45;&gt;Artifact Instance -->
<g id="edge15" class="edge">
<title>Artifact Component&#45;&gt;Artifact Instance</title>
<path fill="none" stroke="black" d="M441.54,-811.91C491.86,-792.38 551.47,-769.25 602.89,-749.3"/>
<polygon fill="black" stroke="black" points="604.34,-752.5 612.39,-745.61 601.8,-745.97 604.34,-752.5"/>
</g>
<!-- Army&#45;&gt;Unit in Army -->
<g id="edge11" class="edge">
<title>Army&#45;&gt;Unit in Army</title>
<path fill="none" stroke="black" d="M998.1,-262.97C1033.53,-251.11 1072.25,-238.15 1108.68,-225.96"/>
<polygon fill="black" stroke="black" points="1110.01,-229.21 1118.39,-222.72 1107.79,-222.57 1110.01,-229.21"/>
</g>
<!-- Army&#45;&gt;Summon in Combat -->
<g id="edge12" class="edge">
<title>Army&#45;&gt;Summon in Combat</title>
<path fill="none" stroke="black" d="M884.48,-262.88C888.2,-252.18 892.23,-240.59 896.09,-229.48"/>
<polygon fill="black" stroke="black" points="899.45,-230.47 899.43,-219.87 892.84,-228.17 899.45,-230.47"/>
</g>
<!-- Unit in Combat -->
<g id="node20" class="node">
<title>Unit in Combat</title>
<polygon fill="#602000" fill-opacity="0.501961" stroke="transparent" points="1428,-88 1085,-88 1085,0 1428,0 1428,-88"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1088.5,-64 1088.5,-85 1425.5,-85 1425.5,-64 1088.5,-64"/>
<text text-anchor="start" x="1203.5" y="-71.8" font-family="Noto Serif" font-weight="bold" font-size="14.00">Unit in Combat</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1088.5,-41 1088.5,-62 1425.5,-62 1425.5,-41 1088.5,-41"/>
<text text-anchor="start" x="1198" y="-48.8" font-family="Noto Serif" font-size="14.00">C++ Class: </text>
<text text-anchor="start" x="1266" y="-48.8" font-family="monospace" font-weight="bold" font-size="14.00">CStack</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1088.5,-3 1088.5,-39 1425.5,-39 1425.5,-3 1088.5,-3"/>
<text text-anchor="start" x="1091.5" y="-24.8" font-family="Noto Serif" font-size="14.00">Represents current state of a unit during combat,</text>
<text text-anchor="start" x="1112" y="-9.8" font-family="Noto Serif" font-size="14.00">can be affected by spells or receive damage</text>
<polygon fill="none" stroke="#000000" stroke-opacity="0.501961" points="1085,0 1085,-88 1428,-88 1428,0 1085,0"/>
</g>
<!-- Unit in Army&#45;&gt;Unit in Combat -->
<g id="edge13" class="edge">
<title>Unit in Army&#45;&gt;Unit in Combat</title>
<path fill="none" stroke="black" d="M1256.5,-123.69C1256.5,-115.33 1256.5,-106.64 1256.5,-98.22"/>
<polygon fill="black" stroke="black" points="1260,-98.12 1256.5,-88.12 1253,-98.12 1260,-98.12"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB