Subsystem Upgrades are a combination of Tech Tree information, Upgrade stats information, an Picnums (mesh) information to represent upgrades in elements of a unit. Generally intended for space units in GR
Modules (SubSystems)[ | ]
0 : Armour / Shielding
1 : Command (ie front section)
2 : Cargo (optional)
3 : Engines
4 : Weapons
Levels[ | ]
0 (Base) / 1 / 2 / 3
Levels are optional, not all will have all levels
TechTree[ | ]
Upgrades effect a Unit Class - every unit in class gets upgrade (in resv / new prod)
Using Tech Effect 500 - 755
Upgrade Levels per active unit are stored in CUnitList systemupgrade[] variable
Current maximum upgrade Levels stored in ruupgrades[player][Class/Subsystem]
- Offset = classnum * 8 + subsystemnum
- Supports up to 8 subsystems/modules, only 5 used at present
Upgrades triggered by research achievement
- Each Unit Class in game supports 8 Upgrade systems (only 5 used)
- Tech Effect increases are additive
- We can upgrade through techs partially, ie 0.3 + 0.3 + 0.6 or through the final tech ie 0.0 + 0.0 + 1.0
- Visual change only happens on whole numbers
- Effect / spec improvements happen on partial upgrades, ie Interceptor Armour improvement by 0.5 will gain 50% of the spec benefit, even though a full level is not visible.
- Improvements above 3.0 (maximum visual) are allowed but have no different effect than the 3.0 level
- Examples:
- Effect 500 would be for Infantry - Armour
- Effect for Space Fighter, Engines would be 22*8 + 3 = 179 + 500
- (Class 22, skip 8 elements each class, Engines is entry 3)
Affected Stats[ | ]
Stored in CUpgradeComponents
class CUpgradeComponent { unsigned short spottype[2]; // Spot type replacements if non-zero union { struct { float groundattackrange; float airattackrange; float surfaceattackrange; // Also Ballistic Range float subattackrange; // Also Beam Range float groundattack; float airattack; float navalattack; // Also Ballistic Attack float subattack; // Also Beam Attack float grounddefense; // Also Hull defense float tacairdefense; // Also Shield defense float indirectdefense; float closedefense; float stealth; float speed; float cargocap; float crew; float fuelcap; float fueluse; float ammocap; float ammouse; float buildspeed; float weight; float carriercap; float initiative; float ugreserved[2]; }; float upgradecomp[NUMUGCOMPS]; }; // Modifier values (or replacement if bitmask bit set) DWORD ugcompreplacevaluemask; // BITMASK of columns that are REPLACEMENT values and not modifier values DWORD ugreserveddw[2]; };
&& UPGRADECOMPONENT classnum
1-24 : UpgradeComponent class for each upgrade level (0 not used)
- 5 Modules (0 to 4), 3 upgrades levels each (supporting 1/2/3)
- 3 more modules not used (5/6/7), reserved
Each value is a modifier of the original value, similar to tech effects.
- 0.0 would be unchanged; 0.5 would be "increase by 50%"; -0.5 would be "reduce by 50%"
- If an original Air Attack Range value was 24, and the UpgradeComponent column was 0.5, then the new Air Attack Range would be 36 (ie x 1.5)
There is a BITMASK final column that indicates if the value should replace the original instead of being a modifier.
- If the BITMASK value is 10 (8 + 2), then columns Air Attack range and Sub attack range would replace any existing spec.
- If the original Air Attack value was 24, and the UpgradeComponent column was 30 with a BITMASK set, then the new Air Attack would be 30.
- The Replace Bit is not supported for ground/air/naval (ballistic/beam) attack values. Only modifiers allowed for those values.
Implementation:[ | ]
- See Default Picnums
- Base Hull is always single object (submesh) - submesh # 0
- Upgrades can ADD (cumulative) or REPLACE (previous upgrades) on Base Hull object mesh - using OptionOb flag (if set T, then replace)
- Upgrade Level Calculation Example:
- Faction has researched three techs with Tech Effect 679 - effect values are 0.4, 0.5, 0.7
- Effect number 679 minus 500 (base for subsystem upgrades) = 179
- This is in section for class number 22, Space Fighter (22*8 = 176, start of upgrade effects for class 22, eight modules per class supported)
- This is upgrade module 3 (179-176). Per Module chart above, this is the entry for Engines.
- Total effect value is 1.6 (0.4+0.5+0.7). This means the Upgrade Level to be used is level 1 (zero is base unit). Partial levels are ignored.
- Unit Stat Upgrades Example:
- Values to upgrade stats are UPGRADECOMPONENT line 3 * 3 + 1 = 10 (upgrade module 3 for engines, times 3 levels per module, plus level 1 for current Upgrade Level)
- This will be a stats/specs upgrade using the value in the UPGRADECOMPONENT array
- If value "speed" in the array of specs is 0.2 (20% boost), and the unit's base speed is 50, then the upgraded speed is 50 * (1.0 + 0.2) = 60
- If value "ammouse" in the array of specs is -0.15 (15% reduction), and the unit's base ammo use is 20, then the upgraded ammo use is 20 * (1.0 - 0.15) = 17
- Upgrade values are not cumulative - at Level 1 the unit will receive Level 1 stat adjustments, at Level 2 the unit will only receive Level 2 adjustments.
- No Partial stat upgrades are done - if the the total upgrade tech effect is 1.6, then Level 1 stats are used. Total upgrade tech effect of 0.9 results in no stat changes (base only)
- If the BITMASK value includes the set bit for the column, then a REPLACEMENT value is used instead of a multiplier.
- Again, replacement values are not cumulative. If both level 2 and level 3 are intended to have a replacement value of '30' for a column, then they both must include the '30' value and the set bitmask value.
- This will be a visual upgrade to Level 1 on the unit mesh
- Unit Mesh Picnum will be drawn with Base Hull mesh, and with SubMesh of Meshtype 43 (first engine level upgrade - module 3 for engines, times 3 levels per module, plus 34 for base submodules Meshtype)
UpgradeComponent.csv Definitions[ | ]
- Column A is the ID for the upgrade type
- 1 - Armor Level 1
- 2 - Armor Level 2
- 3 - Armor Level 3
- 4 - Command Level 1
- 5 - Command Level 2
- (etc. through Armor, Command, Cargo, Engines, Weapons
- Rows begging at B are values for upgrades
- B - Spotting Type 1 - Replaces Spotting Type 1 if not zero
- C - Spotting Type 2 - Replaces Spotting Type 2 if not zero
- D - Ground Attack Range (bitmask 1)
- E - Air Attack Range (bitmask 2)
- F - Surface Attack Range (also Ballistic Attack Range) (bitmask 4)
- G - Submarine Attack Range (also Beam Attack Range) (bitmask 8)
- H - Ground Attack (bitmask 16)
- I - Air Attack (bitmask 32)
- J - Surface Attack (also Ballistic Attack) (bitmask 64)
- K - Submarine Attack (also Beam Attack) (bitmask 128)
- L - Ground Defense (also Hull Defense) (bitmask 256)
- M - Tactical Air Defense (also Shield Defense) (bitmask 512)
- N - Indirect Air Defense (bitmask 1024)
- O - Close Combat Defense (bitmask 2048)
- P - Stealth (bitmask 4096)
- Q - Speed ((bitmask 8192)
- R - Cargo Capacity (bitmask 16384)
- S - Crew (bitmask 32768)
- T - Fuel Capacity (bitmask 65536)
- U - Fuel Usage (bitmask 131,072)
- V - Ammo Capacity (bitmask 262144)
- W - Ammo Usage (bitmask 524288)
- X - Build Speed (bitmask 1048576)
- Y - Weight (bitmask 2097152)
- Z - Carrier Capacity (bitmask 4194304)
- AA - Initiative (bitmask 8388608)
- AB - Future Spec 1
- AC - Future Spec 2
- AD - BITMASK to indicate if values D to AA are REPLACEMENT values instead of multipliers