Mechanic · progression · strategy
Tech tree
The prerequisites that decide which structures, units, or upgrades a player may build next.
On this page
A tech tree sets what a player may build next. In Dune II each structure’s row lists the structures a house must own and a first mission1, and the construction yard checks both, with two exceptions by house2.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Dune II | 1992 | Owned structures | each structure lists the structures a house must own and a first mission, which code moves for some houses |
| Factorio | 2016 | Research | labs use up science packs to research one technology at a time, from technologies unlocked by crafting up to the rocket silo and research without end |
Every claim about this mechanic, by game (12)
References
- ^ abThe executable's structure table sets, among others, a concrete slab at 5 credits, 16 build-time units, and 20 hit points; a windtrap at 300, 48, and 200; a refinery at 400, 80, and 450; a spice silo at 150, 48, and 150; an outpost at 400, 80, and 500; a light factory at 400, 96, and 350; a heavy factory at 600, 144, and 200; and a palace at 999, 130, and 1,000. Each row also names the structures a house must own first and the first mission it can be built in; code moves the light factory's first mission from 3 to 2 for every house but the Harkonnen. PROFILE.INI, read from the game data at start, can replace a row's cost, time, hit points, and first mission, along with its fog radius and its build, target, and sort priorities.CodeOpenDUNErevised
How we know
16 /* name */ "Concrete", ⋮ 35 /* hitpoints */ 20, ⋮ 38 /* buildCredits */ 5, 39 /* buildTime */ 16, 40 /* availableCampaign */ 1, 41 /* structuresRequired */ FLAG_STRUCTURE_NONE,
src/table/structureinfo.c lines 16–41 at ebea79a · upstream ↗ 601 /* name */ "Windtrap", ⋮ 620 /* hitpoints */ 200, ⋮ 623 /* buildCredits */ 300, 624 /* buildTime */ 48, 625 /* availableCampaign */ 1, 626 /* structuresRequired */ FLAG_STRUCTURE_NONE,
src/table/structureinfo.c lines 601–626 at ebea79a · upstream ↗ 796 /* name */ "Refinery", ⋮ 815 /* hitpoints */ 450, ⋮ 818 /* buildCredits */ 400, 819 /* buildTime */ 80, 820 /* availableCampaign */ 1, 821 /* structuresRequired */ FLAG_STRUCTURE_WINDTRAP,
src/table/structureinfo.c lines 796–821 at ebea79a · upstream ↗ 1121 /* name */ "Spice Silo", ⋮ 1140 /* hitpoints */ 150, ⋮ 1143 /* buildCredits */ 150, 1144 /* buildTime */ 48, 1145 /* availableCampaign */ 2, 1146 /* structuresRequired */ FLAG_STRUCTURE_REFINERY | FLAG_STRUCTURE_WINDTRAP,
src/table/structureinfo.c lines 1121–1146 at ebea79a · upstream ↗ 1186 /* name */ "Outpost", ⋮ 1205 /* hitpoints */ 500, ⋮ 1208 /* buildCredits */ 400, 1209 /* buildTime */ 80, 1210 /* availableCampaign */ 2, 1211 /* structuresRequired */ FLAG_STRUCTURE_WINDTRAP,
src/table/structureinfo.c lines 1186–1211 at ebea79a · upstream ↗ 211 /* name */ "Light Fctry", ⋮ 230 /* hitpoints */ 350, ⋮ 233 /* buildCredits */ 400, 234 /* buildTime */ 96, 235 /* availableCampaign */ 3, 236 /* structuresRequired */ FLAG_STRUCTURE_REFINERY | FLAG_STRUCTURE_WINDTRAP,
src/table/structureinfo.c lines 211–236 at ebea79a · upstream ↗ 276 /* name */ "Heavy Fctry", ⋮ 295 /* hitpoints */ 200, ⋮ 298 /* buildCredits */ 600, 299 /* buildTime */ 144, 300 /* availableCampaign */ 4, 301 /* structuresRequired */ FLAG_STRUCTURE_OUTPOST | FLAG_STRUCTURE_WINDTRAP | FLAG_STRUCTURE_LIGHT_VEHICLE,
src/table/structureinfo.c lines 276–301 at ebea79a · upstream ↗ 146 /* name */ "Palace", ⋮ 165 /* hitpoints */ 1000, ⋮ 168 /* buildCredits */ 999, 169 /* buildTime */ 130, 170 /* availableCampaign */ 8, 171 /* structuresRequired */ FLAG_STRUCTURE_STARPORT,
src/table/structureinfo.c lines 146–171 at ebea79a · upstream ↗ 569 Ini_GetString("construct", NULL, keys, keys, 2000, source); ⋮ 596 oi->buildCredits = buildCredits; 597 oi->buildTime = buildTime; 598 oi->hitpoints = hitpoints; 599 oi->fogUncoverRadius = fogUncoverRadius; 600 oi->availableCampaign = availableCampaign; 601 oi->priorityBuild = priorityBuild; 602 oi->priorityTarget = priorityTarget; ⋮ 604 oi->sortPriority = (uint8)sortPriority;
src/opendune.c lines 568–604 at ebea79a · upstream ↗ 1904 if (s->o.houseID != HOUSE_HARKONNEN && i == STRUCTURE_LIGHT_VEHICLE) { 1905 availableCampaign = 2;
src/structure.c lines 1904–1906 at ebea79a · upstream ↗ 945 ReadProfileIni("PROFILE.INI");src/opendune.c line 945 at ebea79a · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^ abThe player's construction yard offers a structure once the house owns every structure in its row's requirement set, the mission number has reached the row's first mission, the house may build it, and the yard's upgrade level is high enough. Two exceptions are coded: for the Harkonnen, the WOR, which trains troopers, needs no barracks and opens from the second mission; for other houses, the light factory opens from the second mission. A computer house's yard skips the requirement set and the upgrade level.CodeOpenDUNE
How we know
1898 if (i == STRUCTURE_WOR_TROOPER && s->o.houseID == HOUSE_HARKONNEN && g_campaignID >= 1) { 1899 structuresRequired &= ~(1 << STRUCTURE_BARRACKS); 1900 availableCampaign = 2; ⋮ 1903 if ((structuresBuilt & structuresRequired) == structuresRequired || s->o.houseID != g_playerHouseID) { 1904 if (s->o.houseID != HOUSE_HARKONNEN && i == STRUCTURE_LIGHT_VEHICLE) { 1905 availableCampaign = 2; ⋮ 1908 if (g_campaignID >= availableCampaign - 1 && (localsi->o.availableHouse & (1 << s->o.houseID)) != 0) { 1909 if (s->upgradeLevel >= localsi->o.upgradeLevelRequired || s->o.houseID != g_playerHouseID) {
src/structure.c lines 1895–1912 at ebea79a · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
Sources
Code
- OpenDUNE contributors. 2026. “OpenDUNE: a C re-creation of Dune II from its DOS executable (OpenDUNE/OpenDUNE).” Commit ebea79a. OpenDUNE/OpenDUNE @ ebea79a · licence, all uses