Skip to content

Veins and veinhole monsters

Veinhole monsters grow vein fields that damage objects standing in them; weeders harvest the veins to charge the chemical missile.

Features & systemsUnits, buildings & economyBuildings & economy

Changed in 0.2.0

A veinhole monster sits in one cell and grows a field of veins around itself. It belongs to no house and is neither a building nor a vehicle. Every monster uses the TerrainType named by VeinholeTypeClass in [General], so that type’s Strength, Armor and Immune settings apply to all of them. The monster is drawn from the current theater’s VEINHOLE shape file, such as VEINHOLE.TEM, not from the type’s Image.

rules.ini
[General]
VeinholeTypeClass=VEINTREE
[VEINTREE]
Name=Veinhole Tree
Image=None
Armor=None
Strength=1000
IsVeinhole=true

Set IsVeinhole=yes on that TerrainType so that players can click the monster. The flag also makes the type a legal target, even if its section sets LegalTarget=no.

A map places a monster with the VEINHOLE overlay on its center cell. When the map loads, the engine fills the eight surrounding cells with the VEINHOLEDUMMY overlay itself. It neither checks nor reshapes the ground under a monster placed this way, so draw the pit in the map if the monster should sit in one.

The random map generator plants the number of monsters set by VeinholeMonsters. It makes at most 200 placement attempts in total, so a crowded map gets fewer. Each attempt picks a site as that page describes, and a monster is then placed only where all of the following hold, tested in this order:

  1. no other monster stands inside the five-by-five block centered on the site;
  2. the center cell is at height 1 or higher;
  3. every cell of the three-by-three block around the center is flat, of the Clear land type, and at the center’s height.

The generator then digs the monster’s pit: all nine cells drop one height level, the center stays flat, and the eight cells around it slope back up to the surrounding ground. It also puts mature veins on the outer ring of the monster’s five-by-five block, wherever that ground accepts them.

A monster is alert while any cell of the five-by-five block centered on it holds a building, vehicle, infantry, landed aircraft or terrain object, and idle when the block is empty. A single tree in the block keeps the monster alert for as long as the tree stands. Being alert changes only the monster’s animation.

A monster attacks only after it is damaged. A hit that damages it without destroying it makes it attack for 120 frames (8 seconds); a hit that deals no damage does not. While attacking, the monster releases one particle of the GasCloudM1 type, whose name is fixed, each time its mouth opens fully. The particle appears 400 leptons above the monster’s cell, drifts away in a random direction, and joins the scenario’s shared gas cloud system. The particle type decides what the cloud does; in the shipped rules it becomes a GasCloud1 cloud, which damages objects beneath it.

A change of state waits until the monster’s current animation reaches a point where it can switch, so the monster can react a moment late.

Players can attack the monster by clicking it. Vehicles, infantry and aircraft ordered to attack its cell also attack the monster itself. A building given that order fires at the ground in the cell instead.

A destroyed monster plays its dying animation and then turns its pit into part of the field. Its own cell and the four cells beside it take vein overlay, and the four diagonal cells lose their overlay. Veins are then placed across the five-by-five block wherever the ground accepts them, which leaves the pit’s corner slopes bare.

The field then withers. Every VeinholeShrinkRate frames, plus a random extra of up to half as many, 1 to 4 of the monster’s mature cells turn thin or lose their vein, starting with those farthest from the veinhole. Each mature cell withers once, and thin veins disappear once no mature cell remains next to them. Withering continues even while VeinGrowthEnabled is off. When every mature cell has withered, the monster is removed, together with any vein left in its five-by-five block, even vein another monster owns. Veins outside that block stay on the map.

A vein cell is either thin or mature. Only mature veins spread the field, attack objects, and can be harvested. Thin veins are the connecting pieces drawn beside mature cells. Veins have no numbered growth stages like a Tiberium cell.

Harvesting or withering a mature cell makes it thin, or removes its vein if none of its four cardinal neighbors is mature. A thin neighbor left with no mature cardinal neighbor loses its vein as well.

A mature vein on a slope spreads the field and can be harvested, but it never attacks, and harvesting removes it instead of making it thin.

The shipped VEINS overlay sets Land=Weeds, which gives its cell the Weeds land type whatever the ground tile beneath it. Weeders look for that land type when they search for veins and when they load, so they cannot harvest a vein overlay without it.

Each monster grows its own field in steps. The first step comes VeinholeGrowthRate frames after the monster is created. Each later step comes that many frames after the previous one, plus a random extra of up to half as many.

A step takes the next 1 to 5 cells from the monster’s growth queue. Each cell taken becomes mature if it still accepts veins.

A cell that matures on flat ground also puts vein on each cardinal neighbor that does not already hold mature vein or a VEINHOLE or VEINHOLEDUMMY overlay. A flat neighbor gets thin vein, and a sloped neighbor gets mature vein at once.

Each cell taken that is mature after the step, whether it has just matured or already was, then adds its cardinal neighbors to the queue. A neighbor is added when all of the following hold:

  1. it lies inside the playable area;
  2. its height differs from the mature cell’s by less than two levels;
  3. it accepts veins;
  4. no monster owns it yet.

Veins spread only to cardinal neighbors, never diagonally. Cells leave the queue roughly in the order they joined it, but a random offset lets two cells queued up to 2,450 frames apart, nearly three minutes, grow in either order. A field therefore spreads unevenly instead of as an expanding ring.

The monster that queues a cell owns it. That monster regrows the cell when harvesting leaves thin vein in it, and withers it after the monster is destroyed.

A growth step runs only while all of the following hold:

  1. the monster has queued no more than MaxVeinholeGrowth minus 40 cells in total;
  2. it covers no more than MaxVeinholeGrowth minus 100 mature cells, its coverage limit; and
  3. the scenario’s VeinGrowthEnabled switch is on. The Vein growth trigger action turns it on and off during play.

The queued total is a budget for the whole scenario. It never goes down, a saved game keeps it, and a harvested cell queued to grow back also adds to it. Once the total passes MaxVeinholeGrowth minus 40, the monster stops growing for the rest of the scenario, and cells harvested after that stay thin. No cell is ever queued past MaxVeinholeGrowth itself.

A cell accepts veins when all of the following hold:

  1. it is flat, or on one of the four simple slopes, which raise two adjacent corners of the cell. Every other slope shape refuses veins;

  2. its land type is not Water, Rock, Ice or Beach;

  3. it has no overlay, or an overlay with IsVeins=yes. The shipped VEINS, VEINHOLE and VEINHOLEDUMMY overlays all set it; and

  4. each of its four cardinal neighbors meets all of the following, in this order:

    • if this cell is flat, the neighbor is flat, on a simple slope, or has an IsVeins=yes overlay;
    • its land type is not Water, Rock, Ice or Beach;
    • it has no overlay, or an IsVeins=yes overlay.

The neighbor test is why a field stops one cell short of a wall, a bridge, a crate or Tiberium, even where the cell it would grow into is clear. Tiberium is kept out in return, because it spreads only onto cells with no overlay.

Store vein fields in a map as mature cells. While a scenario loads, right after its overlays are read, the engine removes every vein overlay and places veins again on each stored mature cell that still accepts them. The thin pieces around those cells are redrawn to fit the ground, and thin veins stored in the map are discarded. A cell’s ripeness is stored in the map’s overlay packs.

Each monster then takes ownership of the vein field connected to its five-by-five block, counting diagonal connections, and queues the thin cells in that field to grow first. Vein cells that no monster owns are removed, so a map without monsters loses all its veins. A monster with no vein in its five-by-five block never grows, so a map that places a monster needs mature veins in that block.

The mature cells a monster takes over count toward its coverage limit, and the cells it queues count toward its queued total. A monster that takes over more than MaxVeinholeGrowth minus 100 mature cells, 1,900 with the shipped rules, therefore never grows.

Flat, mature veins attack buildings, vehicles, infantry and aircraft standing in them. An object is not attacked while it is more than 5 leptons above the ground, when its type sets ImmuneToVeins=yes, or when it has the VEIN_PROOF veteran ability. Thin veins and veins on a slope never attack.

A cell checks for vulnerable objects, and starts an attack if it finds any, whenever an object finishes moving into it, however it travels, or is placed on the map there. It checks again when its vein matures under objects already standing in it. A cell that already has an attack running starts no new one.

The attack is the VeinAttack animation. On every other frame, it deals VeinDamage with VeinholeWarhead to every vulnerable object in its cell. It ends when the cell is empty, when the cell no longer holds flat mature vein, or when the object that entered the cell last is off the ground. The cell can then start another attack.

A cell starts one animation for each vulnerable object standing in it, and each animation damages every vulnerable object there. Three vulnerable infantry in one cell therefore each take three hits every other frame.

If the vein warhead sets Veinhole=yes, a damaged object fights back against the monster that owns the veins where it stands, or, if it is moving, where it steps next. A computer-owned object always does. A player-owned object does so only while it has no target and no movement order, and only when the monster is within its weapon range or sight.

A UnitType with Weeder=yes harvests veins through the same harvest mission as a Tiberium harvester. It starts harvesting when it is placed on the map, including when it leaves a factory or a repair bay. When it later goes idle, it resumes harvesting if its house is computer-controlled or it is standing on veins. A player-owned weeder that goes idle anywhere else takes a guard mission instead, so a player can park it. A weeder whose house owns none of the buildings in its Dock list switches to guard. Do not also set Harvester=yes: such a vehicle waits for Tiberium ground instead, as Tiberium harvesting explains.

A weeder first checks its own cell, then searches outward one ring at a time and takes a qualifying cell from the nearest ring that has one. The search covers every ring closer than TiberiumFarScan cells when the weeder sets out, and closer than TiberiumNearScan cells while it works a field. A cell qualifies when all of the following hold, tested in this order:

  1. it lies inside the playable area;
  2. in a campaign, if the local player owns the weeder, the cell is not shrouded;
  3. it is in the same movement zone as the cell the weeder is heading to, or its own cell when it is not moving;
  4. the weeder can enter it now, so a cell with a vehicle parked in it does not qualify;
  5. it has the Weeds land type;
  6. it holds mature vein.
rules.ini
[WEED] ; the stock weed eater
Weeder=yes
Dock=NAWAST
Storage=7
PipScale=Tiberium
ImmuneToVeins=yes ; otherwise the veins it harvests damage it
[NAWAST] ; the stock weed refinery
Weeder=yes
Bib=yes
PipScale=Tiberium

A weeder harvests a mature cell in one go. Each cell gives two units of weed, or one if the first unit fills the weeder; Storage sets how many units it can carry. The cell then turns thin or loses its vein, as described under Ripeness. After each cell, the weeder waits 27 times HarvesterLoadRate frames before it moves on, and it harvests the next cell no sooner than 9 times HarvesterLoadRate frames after it leaves the previous one.

A harvested cell that is left with thin vein and belongs to a live monster rejoins that monster’s growth queue and can mature again, within the limits under Growth. A harvested cell that loses its vein, or that no monster owns, is not queued to grow back. A monster’s field can still spread into it again from a neighboring cell that matures.

A weeder unloads only at a BuildingType with Weeder=yes, which needs no DockUnload=yes. A weeder returning on its own looks only among its own house’s buildings whose types are in its Dock list, so that list must name at least one weed refinery. A player can also send a weeder into another house’s weed refinery, but only when each house is allied with the other. A weeder whose weed refinery is lost before it docks goes back to harvesting, as a Tiberium harvester does.

The weeder docks on a fixed cell of the building’s Foundation=WxH: the third cell along W and the second along H, counting from the foundation’s top corner. Give the building Bib=yes so that vehicles can drive onto that cell:

  • With a foundation three cells wide, such as the 3x3 of the shipped NAWAST, the dock cell is on the building’s last column, and any vehicle can drive onto it.
  • With a wider foundation, only a weeder whose house and the building’s house are allied with each other can enter it.
  • With a foundation narrower than three cells, or only one row deep, the dock cell lies outside the building.

Without Bib=yes, a dock cell inside the foundation is blocked like the rest of the building, so no weeder can drive onto it.

A docked weeder faces east and hands its house one unit every HarvesterDumpRate minutes of game time. Unlike a Tiberium refinery, the building plays no pre-production animation, and the weeder does not wait for a production animation to finish. To change the weeder’s artwork while it unloads, set UnloadingClass on its type; the rules-wide UnloadingHarvester applies only to Tiberium harvesters. A weeder also never shows the harvesting artwork a Tiberium harvester shows. Once it is empty, the weeder returns to harvesting.

Each house stores weed separately from Tiberium, up to WeedCapacity units. Weed unloaded while the pool is full is lost.

When a house’s pool holds exactly WeedCapacity units and the house owns a Type=ChemMissile superweapon that is not ready, the pool is emptied and the weapon’s countdown restarts at its full RechargeTime. A pool below WeedCapacity does nothing.

A full pool restarts a countdown that is already running, so the progress made so far is lost. While the weapon is ready, a full pool waits and further weed is lost.

The shipped chemical missile sets ManualControl=yes, so it does not charge at all until its house’s pool fills. Manual control explains the setting.

A Weeder=yes building with PipScale=Tiberium shows how full its house’s weed pool is, not its own contents. It shows at most WeedCapacity pips, and fewer if its MaxPips or foundation leaves room for fewer.

Settings the engine parses but never reads

Section titled “Settings the engine parses but never reads”

VeinholeMonsterStrength and VeinGrowthRate have no effect. Set a monster’s strength with Strength on the type VeinholeTypeClass names, and the time between growth steps with VeinholeGrowthRate.

25 of 25

KeyDescriptionValueWhen omitted
DockAircraftType, BuildingType, InfantryType, UnitTypeBuildingTypes an object returns to for docking.list of BuildingTypesnone
DockUnloadBuildingTypeLets a Tiberium harvester dock at a building and unload there.booleanno
HarvesterDumpRateglobal rulesMinutes a docked harvester spends handing over each stored unit.floating point.016
HarvesterLoadRateglobal rulesGame frames per step of a harvester's loading cycle, which lifts one unit every nine steps.integer2
ImmuneToVeinsAircraftType, BuildingType, InfantryType, UnitTypeExempts the object type from vein damage.booleanno
IsVeinholeTerrainTypeLets a click pick a veinhole monster built from the TerrainType, and makes the monster a legal target.booleanno
IsVeinholeMonsterOverlayTypeLets explosions centered on the veinhole monster's cell damage it.booleanno
IsVeinsAnimType, OverlayTypeTreats an overlay as part of a vein field, or an animation as the attack veins make.booleanno
MaxVeinholeGrowthglobal rulesCeiling on the veins one veinhole monster may cover.integer1000
StorageAircraftType, BuildingType, InfantryType, UnitTypeUnits of Tiberium an object can hold.integer0
TiberiumFarScanglobal rulesDistance a harvester searches for Tiberium when it sets out with no recorded patch to return to.distance (cells)32
TiberiumNearScanglobal rulesDistance a harvester searches for the next Tiberium cell once the cell it is working runs out.distance (cells)6
VeinAttackglobal rulesAnimType a vein cell attaches to itself to hurt what stands in it.classnone
VeinDamageglobal rulesRaw damage a vein cell deals on every second frame.integer2
VeinGrowthEnabledscenariosAllows veinhole monsters to spread their fields during a scenario.booleanyes
VeinGrowthRateNo effectglobal rulesParsed rate that the engine never uses.floating point1
VeinholeWarheadTypeLets an object damaged with no credited attacker fire back at the veinhole monster that owns the veins under it or just ahead of it.booleanno
VeinholeGrowthRateglobal rulesGame frames between one veinhole monster's growth steps.integer100
VeinholeMonstersrandom map generationVeinhole monsters the random map generator plants.integer0
VeinholeMonsterStrengthNo effectglobal rulesParsed strength figure that the engine never uses.integer10000
VeinholeShrinkRateglobal rulesGame frames between the withering steps of a destroyed monster's field.integer100
VeinholeTypeClassglobal rulesTerrainType every veinhole monster in the scenario reports as its own.classnone
VeinholeWarheadglobal rulesWarheadType vein damage is applied with.classnone
WeedCapacityglobal rulesUnits of weed a house can hold.integer0
WeederBuildingType, UnitTypeMakes a BuildingType the structure vein harvesters dock at, or a UnitType a vein harvester.booleanno

History

  1. Changed0.1.0

    Require mutual alliances for refinery docking

  2. Changed0.2.0In development

    Send a harvester to work when it leaves a factory

  3. Changed0.2.0In development

    Keep harvesting when a refinery is lost on the way in

  4. Changed0.2.0In development

    Count each mature vein cell once toward a veinhole's limit