Development:Design

# Introduction

While modifying *GearHead* is in theory very simple, some
understanding of the source-code is necessary in order to know what the
values you are modifying mean. Hopefully, I have made things simpler by
translating much of the relavent source-code into pseudo-code.

## Understanding ghpmacro.txt

```
G,S,V: Integer; {General Descriptive,}
{Specific Descriptive,}
{and Value Descriptive}

```

These three values describe what kind of gear we're talking about.
The "G" describes general type- Plot, Scene, Mecha, Weapon, Module, etc.

The "S" describes a specific subcategory of the general type. For
 mecha, this determines the form type (Battroid, Zoanoid, etc). For
modules, this describes the module type (Body, Arm, etc).

The "V" field usually holds a size attribute related to the G,S
type. For weapons, it holds the DC. For modules, it holds the size.

```
Scale: Integer; {Scale of this Gear}

```

This field is only used by physical-type gears. Scale 0 is human
scale; PCs are this scale, and Scale:0 equipment can be picked up and
used by them. Most mecha are Scale:2.

```
Stat: Array [1..8] of Integer;
{Gear Stats. Needed info for Gear type.}

```

The stats, as explained before, have different meanings depending upon the gear type (usually the G,S description).

```
SA: SAttPtr; {String Attributes.}

```

String attributes are strings, stored as a linked list. They are in
the format "key <data>". All the event scripts are stored in
SAtts.

```
NA: NAttPtr; {Numerical Attributes.}

```

Numeric attributes are numbers, also stored as a linked list. The
NAtt record has G,S, and V fields just like the gear... Think of the G,S
 pair as the key and the V field as the value. Damage, map location,
script variables, and more are all stored as NAtts.

## Special note regarding calculations

The *GearHead* source-code mainly uses integers and integer division instead of real numbers and regular division. Basically, every time a calculation using the Pascal div operator is made, the value is rounded down to an integer. For instance, the expression:

```
20 div 5

```

is equivalent to the expression:

```
floor(20/5)

```

in other languages. That is, the fractional part of the result is discarded.

# Gears

Michael Deutschmann (with some editing done to it for flow) says:

## Inventory Rules

* Mounting Points may equip: sensors, weapons, move systems
* Hands may equip: sensors, weapons
* Arms and Tails may equip: armor, shields
* Other modules may equip: armor
* A module may only equip one item of any specific type.

## Subcomponent Dependancy Rules

* Mecha may have as subcomponents: Modules
* Body Modules may have: Cockpits, Weapons, Movement Systems, Holders (Mount), Sensors, Support Systems, Electronics
* Arm Modules may have: Cockpits, Weapons, Movement Systems, Holders (Mount + Hand), Sensors, Electronics
* Other Modules may have: Cockpits, Weapons, Movement Systems, Holders (Mount), Sensors, Electronics
* Characters may have: Modules
* Cockpits may have: Characters
* Physical Shields may have: Weapons
* External Armor may have: Weapons, Movement Systems, Electronics
* Weapon/Projectile may have: Ammo/Projectile
* Weapon/Missile may have: Ammo/Missile
* Props have no restrictions as to what subcomponents they may have.

## Additional Subcomponent Rules

* Illegal inventory for master gears must be explicitly excluded.
* Legal inventory for other types must be explicitly defined. ((Not sure what this means.))
* At most one Movement System of a specific type per location.
* At most one Support System of a specific type per location.
* At most one Body Module per location (i.e., a mecha may only have one Body).
* At most one Holder of a specific type per location, except that Body may have up to two holders installed.
* At most one Weapon mount per location.
* At most one Hand per location.
* At most one Ammunition item per location.
* Mecha must have exactly one Body Module.
* Mecha must have exactly one Cockpit.
* Hands may only be mounted in Arm Modules.
* Support Systems may only be mounted in Body.
* Level-one subcomponents must be Modules.
* Armor value of any component may not exceed Mecha Size.
* Cockpit armor may be no greater than 2.
* Size of Modules may not exceed Mecha Size + 1 (but never greater than 10).
* Size of Body module must be the same as Mecha Size.
* Size of Engine must be the same as Mecha Size.
* Sensors are always Scale Factor 0.
* Modules Size may be in the range from 1 to 10.
* Mecha Size may be in the range from 1 to 10.
* Weapon Size may be in the range from 1 to 25.
* Weapon Range may be in the range from 1 to 50 for Ballistic, Missile and BeamGun weapons. It is zero for all others.
* Weapon Accuracy may be in the range from -5 to 5.
* Weapon Speed may be no less than 1. ***[Ed. the upper limit is probably related to the granularity of the game and the length of a round.]***
* Weapon Burst Value may be in the range from 0 to 10 for Ballistic, Missile and BeamGun weapons. It is zero for all others.
* Weapon Magazine may be no less than 1 for Ballistic and Missile weapons. It is zero for all others.
* Ammunition Size must be the same as Weapon Size.
* Ammunition AmmoCount can't exceed the Magazine rating.
* Ammunition Burst Value may range from 0 to 10 if the ammo is a Grenade. For other types of ammo, this is always 0.
* Ammunition GrenadeSkill may range from 1 to 5 (one for each of

 the combat skills) if the ammo is a Grenade. For other types of ammo,
this is always 0.

* Electronics (PCS) Size determines its function. There are currently 5 types, but the values may range from 1 to 10. ***[Ed. Not sure what happens if you specify a value greater than 5.]***
* Shield Size may range from 1 to 10.
* Shield DefBonus may range from -5 to 5.
* ExArmor Size may range from 0 to 10.
* Prop Size may range from 1 to 100.
* Usables (Instruments) Size may range from 1 to 20.
* Usables UseBonus may be in the range from 0 to 5.
* Usables Range may be in the range from 1 to 10.
* Food Size may range from 0 to 60.
* Food MoraleBoost may be in the range from -5 to 10.
* Food Quantity may be in the range from 1 to 50.
* Modifier (Cyberware) Size may range from 0 to 80.
* Modifier Stat Modifiers may range from -5 to 10.
* Modifier Skill Modifiers may range from 1 to 10.
* Weapon Add-On Damage Modifier may range from 0 to 2.
* Weapon Add-On Range Modifier may range from 0 to 5.
* Weapon Add-On Accuracy Modifier may range from 0 to 3.
* Weapon Add-On Speed Modifier may range from 0 to 3.
* Battroids and Gerwalks do not benefit from Wings in any way.
* See the Movement Modes section for tables related to mecha form and movement modes.

## Stat Bonuses

* If cockpit is located in head, +1 bonus to MV and TR.
* If total wing points >= mecha size, 25% bonus to Flight.
* Storage modules get a +2 bonus to armor rating.
* Zoanids get a 50% bonus to Jump time and a 20dpr bonus to Walking Speed.
* GroundCars get a 50% bonus to Rolling Speed.
* HoverFighters and GerWalkers get a 25% bonus to Flying Thrust (calculated toward speed).
* AeroFighters get a 100% bonus to Flying Thrust if their total wing points is greater than than the mecha size.
* Ornithoids get a 50% bonus to Flying Thrust if their total wing points is greater than than the mecha size.
* Ornithoids get an additional bonus to Flying Thrust equal to the total number of wing points multiplied by 80.
* GroundHuggers get a +2 bonus to Armor.
* Arachnoids get a +1 bonus to Armor.
* See the table in the Movement (MV), Sensors (SE) & Targeting (TR) section for MV and TR bonuses related to mecha form.

## |	Body	Head	Arm	Leg	Wing	Tail	Turret	Storage
  Battroid	|	True	True	True	True	True	True	False	True
 Zoanoid	|	True	True	False	True	True	True	False	True
 GroundHugger	|	True	False	False	False	False	False	True	True
 Arachnoid	|	True	True	False	True	False	True	True	True
 AeroFighter	|	True	False	False	False	True	False	False	True
 Ornithoid	|	True	True	False	True	True	True	False	True
 Gerwalk	|	True	True	True	True	True	True	False	True
 HoverFighter	|	True	False	False	False	True	False	True	True
 GroundCar	|	True	False	False	False	False	False	True	True

```

## Module size table

```
Body		SizeTimesTwo
Head		HalfSize
Arm		EqualSize
Leg		SizePlusOne
Wing		HalfSize
Tail		EqualSize
Turret		HalfSize
Storage		NoHP

```

# Stats

## Nature/Material

### Material types

Currently there are three materials:

* Meat
* Metal
* Biotech

The default material is Metal.

## EFFECT			METAL	MEAT	BIOTECH
 Poison			False	True	False
 Burn			True	True	True
 Regen			False	True	True
 Stoned			False	True	False
 Haywire			True	False	False
 Inhuman Visage		False	False	False
 Twitchy Hands		False	False	False
 Depression		False	False	False
 Rejection		False	False	False
 Body Aches		False	False	False
 Anemia			False	False	False
 Irrational Anger	False	False	False
 Neural Lag		False	False	False
 Major Neural Failure	False	False	False
 Cerebrospinal Shock	False	False	False
 Toxic Leakage		False	False	False
 Shutdown		False	False	False
 Rust			True	False	False
 Stun			FALSE	TRUE	True
 Sickness		FALSE	TRUE	False
 Half-Blinded		False	False	False
 Spinal Injury		False	False	False
 Torn Ligaments		False	False	False
 Crushed Bones		False	False	False
 Heart Injury		False	False	False

```

## Mass (kg,t)

* At Scale Factor 0 one mass point is worth 0.5kg (1 kilogram = 0.001 tons).
* At Scale Factor 1 one mass point is worth 0.1t.
* At Scale Factor 2 one mass point is worth 0.5t.
* As far as movement systems are concerned, there is a low cap of 20 for a mecha's total mass.

### Mass calculations by gear type

Module Mass
* ModuleSize = the size of the module (see the table)
* If ModuleSize = NoHP → Mass = 0
* Else if ModuleSize = HalfSize → Mass = PartSize
* Else if ModuleSize = EqualSize → Mass = PartSize
* Else if ModuleSize = SizePlusOne → Mass = PartSize + 1
* Else if ModuleSize = SizeTimesTwo → Mass = PartSize \* 2
* Else → Mass = 0
* Mass = Mass + ArmorRating

Cockpit Mass
* Mass = ArmorValue

Weapon Mass
* Missile: Mass = 1
* EMelee: Mass = 1
* BeamGunn: Mass = DP
* Melee: Mass = DP
* Ballistic: Mass = DP + BV

Ammunition Mass
* Missile: Mass = DP
* Grenade: Mass = DP ***[Ed. This is always equal to 1. It may be a 'bug'.]***
* Others: Mass = (DC \* NumShots) div 100

Movement System Mass
* Mass = DP

Holder Mass
* Mass = 1

Sensor Mass
* Mass = DP

Support Mass
* Mass = ArmorValue

Shield Mass
* If PhysicalShield →
	+ Mass = ShieldSize + DefenseBonus
	+ If Mass < 1 → Mass = 1
* Else if EnergyShield → Mass = 1

ExArmor Mass
* Mass = ArmorSize \* 2

Swag Mass
* Mass = 1

Prop Mass
* Mass = PartSize

Metaterrain Mass
* Mass = PartSize

Electronics Mass
* Mass = PartSize

Usables Mass
* Mass = DP

Consumables Mass
* Mass = (PartSize \* FoodQuantity) div 5

Weapon Add-On Mass
* Mass = 1

Adjustments to Mass based on the Mass Adjustment Value (MAV)
The Mass Adjustment Value (found in the design file) is applied after doing the above calculations.

* Mass = Mass + MAV

### PV calculations by gear type

Module PV
* Value = 25 \* PartSize + 35 \* ArmorValue

Weapon PV
*See WeaponValue in ghweapon.pp.*

The base value of a weapon is 35x Damage Class, unless it's an
energy melee weapon in which case 125x Damage Class, or a beam weapon in
 which case 75x Damage Class. This value is adjusted based on various
factors:

* **Range**:
	+ Value = Value \* (2 + RNG) div 5
* **Accuracy**:
	+ If ACC > 0 → Value = Value \* (5 + ACC) div 5
	+ If ACC < 0 → Value = Value \* (10 + ACC) div 10
* **Speed**:
	+ Value = Value \* (1 + 2 \* SPD) div 5
* **Burst Value**:
	+ Value = Value \* (4 + 3 \* BV) div 4
	+ Additional BV cost for BeamGuns:
		- Value = (Value \* 3) div 2
* **Magazine**:
	+ Ballistic weapons:
		- If MAG < 7 → Value = Value \* (9 + MAG) div 20
		- Else if MAG < 10 → Value = (Value \* 4) div 5
		- Else if MAG < 20 → Value = (Value \* 9) div 10
	+ Missile weapons:
		- Value = Value \* MAG div 5
* **Damage Effects & Status Effects** *(see below for the cost tables)*
	+ Base value of N is 10.
		- Damage Effects (for each effect): N = ( N \* CostOfEffect ) div 10
		- Status Effects (for each effect): N = ( N \* CostOfEffect ) div 10
		- Special case (Blast): N = ( N \* CostOfEffectPerRadius ) div 10
	+ Final values for N that are less than 5 are rounded up to 5.
	+ Value = Value \* N div 10

Ammunition PV
*See AmmoValue in ghweapon.pp.*

* BaseValue = the clip magazine size for this ammo
* If the ammo is a missile → BaseValue = BaseValue \* 10
* Else, if the ammo is a grenade →
	+ BaseValue = BaseValue \* 2
	+ BaseValue = BaseValue \* (BV + 1)
* **Damage Effects & Status Effects** *(see below for the cost tables)*
	+ N = a new variable = 10
		- Damage Effects (for each effect): N = ( N \* CostOfEffect ) div 10
		- Status Effects (for each effect): N = ( N \* CostOfEffect ) div 10
		- Special case (Blast): N = ( N \* CostOfEffectPerRadius ) div 10
	+ Final values for N that are less than 5 are rounded up to 5.
	+ If the ammo has the BLAST effect → N = N \* 2
	+ If the ammo has the HYPER rating → N = N \* 3
* BaseValue = (BaseValue \* AmmoSize \* N) div 50

Movement System PV
* MoveSystemCost = the cost of the movement system (see table, below)
* Value = PartSize \* MoveSystemCost

Holder PV
* Value = 15

ExArmor PV
* Value = PartSize \* PartSize \* PartSize \* 5 + PartSize \* PartSize \* 10 + PartSize \* 35

Cockpit PV
* Value = 25 \* ArmorValue

Sensor PV
* MainSensor: Value = PartSize \* PartSize \* 50 + 50
* TarCom: Value = PartSize \* PartSize \* 125
* ECM: Value = PartSize \* PartSize \* 500 - PartSize \* PartSize \* 350
* Others (hypothetical): Value = PartSize \* PartSize \* PartSize \* 5 + PartSize \* 10 + 15

Electronics PV
* Value = PartSize \* PartSize \* PartSize \* 5 + PartSize \* 10 + 15

Support PV
* If the part is a Gyroscope → Value = PartSize \* PartSize \* 30
* Else, if the part is an Engine →
	+ If the part is a High-output engine → Value = PartSize \* 1000
	+ Else → Value = PartSize \* 45
* Else → Value = PartSize \* 45
* Value = Value + ArmorValue \* 25

Shield PV
* If EnergyShield → Value = PartSize \* 75
* Else → Value = PartSize \* 25
* If DefenseBonus > 0 → Value = Value \* (4 + DefenseBonus ) div 4
* Else if DefenseBonus < 0 → Value = Value \* (10 + DefenseBonus) div 10

Swag PV
* Value = PartSize
* For t = 1 to Part^.S → Value = Value \* 10 ***[Ed. Couldn't figure out what Part^.S is in this case. I think it is equal to 12.]***

Usables PV
* Value = (50 + UseBonus \* UseBonus \* UseBonus \* 10 + PartSize \* 5) \* (UseRange + 5) div 10

Repair Fuel PV
* Value = PartSize

Consumables PV
* Value = (PartSize \* FoodXValue) / div 5
* If MoraleBoost > 0: Value = Value + (MoraleBoost \* (150 - 2 \* PartSize))
* Else:
	+ TempVar = a temporary variable = Value \* (MoraleBoost + 10) div 10
	+ If TempVar < (Value div 2): TempVar = Value div 2
	+ Value = TempVar
* Value = Value \* FoodQuantity

Modifier (Cyberware) PV
* Plusses = 0
* Minuses = 0
* PriceFactor = 2000
* BasePrice = an array = [10,25,45,70,100]
* If the part is a stat modifier →
	+ For each stat →
		- StatMod = the amount this stat is being modified
		- If StatMod > 0 → Plusses = Plusses + StatMod
		- Else if StatMod < 0 → Minuses = Minuses + StatMod
* Else, if the part is a skill modifier →
	+ SkillMod = the amount this skill is being modified (this can only be a positive integer)
	+ Plusses = SkillMod
* If Plusses > 5 →
	+ Value = Value + (PriceFactor \* 50 \* (Plusses - 5))
	+ Plusses = 5
* If Plusses > 0 → Value = Value + BasePrice[Plusses] \* PriceFactor
* If Minuses > 0 → Value = Value - PriceFactor \* 5 \* Minuses
* Else, if there are no Minuses → Value = (Value \* 3) div 2
* If the part is a character modifier (as opposed to a mecha modifier) → Value = (Value \* (100 - PartSize)) div 100
* Else → Value = Value div 2
* If the part is a non-combat skill modifier → Value = Value div 2
* If Value < PriceFactor → Value = PriceFactor

Weapon Add-On PV
*See WeaponAddOnCost in ghweapon.pp.*

* The base value is 120.
* If the add-on is a general add-on (i.e., it can be added to any type of weapon), multiply this value by 3.
* Adjust the value for the part's size: Value = Value \* PartSize \* 2
* **Range**: Value = Value \* (RNGMod + 3) div 2
* **Accuracy**: Value = Value \* (ACCMod + 3) div 2
* **Speed**: Value = Value \* (SPDMod + 1)
* **Damage Effects & Status Effects** *(see below for the cost tables)*
	+ Base value of N is 10.
		- Damage Effects (for each effect): N = ( N \* CostOfEffect ) div 10
		- Status Effects (for each effect): N = ( N \* CostOfEffect ) div 10
		- Special case (Blast): N = ( N \* CostOfEffectPerRadius ) div 10
	+ Final values for N that are less than 5 are rounded up to 5.
	+ If N > 10, then: Value = Value \* N \* 2 div 10

### Additional PV calculations for all types of gears

*See ComponentValue in gearutil.pp*

* **Mass Adjustment Value (MAV)**
	+ MAV = the Mass Adjustment Value (MAV) found in the design file
	+ MassPerMV = 15
	+ If (PartScale = 0) and (MAV < 0) → MAV = MAV \* 5
	+ If (MAV > 0) and (Value > 0) →
		- Value = (Value \* (MassPerMV \* 4 - MAV)) div (MassPerMV \* 4)
		- If Value < 1 → Value = 1
	+ Else if MAV < 0 → Value = Value \* (MassPerMV + abs(MAV)) div MassPerMV
* **Material**
	+ If Material = Biotech →
		- If the part is a mecha → Value = PartSize \* 250
		- Else → Value = (Value \* 3) div 2
* **Overstuffed**
	+ N = the CMX of the part
	+ T = the CMX of the part's sub-components
	+ If N > T → Value = (Value \* (10 + N - T)) div 10
* **Scale**
	+ If (Value > 0) and (PartScale > 0) →
		- For t = 1 to PartScale → Value = Value \* 5
* **Fudge**
	+ Fudge = a numerical attribute defined in the design file that arbitrarily raises or lowers the value of the part
	+ Value = Value + Fudge

### Attack attribute cost table

```
SWARM        	 15
BLAST        	 15
LINE         	 20
SCATTER      	  9
EXTEND       	 11
HYPER        	250
ARMORPIERCING	 20
MYSTERY      	 10
THROWN       	 15
RETURN       	 30
ARMORIGNORE  	 85
INTERCEPT    	 25
OVERLOAD     	 15
BRUTAL       	 20
FLAIL        	 25
ANTIAIR      	 12
SMOKE        	  2
GAS          	 10
DRONE        	 20
NOMETAL      	 10
STRAIN       	  7
COMPLEX      	  7

```

### Blast effect cost table

```
10, 20, 30, 35,
40, 45, 50, 55,
60, 65, 70, 75,
80, 85, 90, 95

```

### Status effect cost table

```
Poison			15
Burn			19
Regen			 5
Stoned			20
Haywire			20
Inhuman Visage		10
Twitchy Hands		10
Depression		10
Rejection		10
Body Aches		10
Anemia			10
Irrational Anger	10
Neural Lag		10
Major Neural Failure	10
Cerebrospinal Shock	10
Toxic Leakage		10
Shutdown		10
Rust			95
Stun			12
Sickness		15
Half-Blinded		10
Spinal Injury		10
Torn Ligaments		10
Crushed Bones		10
Heart Injury		10

```

### Movement system cost table

```
Wheels		 10
Tracks		 10
Hover Jets	 45
Flight Jets	 65
Arc Thrusters	100
Overchargers	 30

```

## Damage Points (DP)

### DP calculations by gear type

Module DP
* ModuleSize = the size of the module (see the table)
* If ModuleSize = NoHP → DP = -1 (damage gets passed on to its contents)
* Else if ModuleSize = HalfSize → DP = (PartSize + 1) div 2
* Else if ModuleSize = EqualSize → DP = PartSize
* Else if ModuleSize = SizePlusOne → DP = PartSize + 1
* Else if ModuleSize = SizeTimesTwo → DP = PartSize \* 2
* Else → DP = 0

Mecha DP
Mecha don't have a DP value. Instead, damage is passed on to their individual parts.

Character DP
In this case, DP is called HP.

* HP = (BodyStat + 5) div 2
* HP = HP + VitalitySkill

Cockpit DP
Cockpits don't have DP. This may be because damage is passed on to their contents (i.e., characters). ***[Ed. Not 100% sure, though.]***

Weapon DP
* EMelee: DP = (DC + 1) div 2
* Missile: DP = -1 ***[Ed. Don't know exactly how this works.]***
* Others: DP = DC

For missile weapons, damage is passed on to the weapon payload.

Ammunition DP
* Missile: DP = (DC \* NumShots) div 25 (Values less than 1 get rounded up to 1)
* Other: DP = 1

Movement System DP
* MoveSystemDMG = the DMG value of the movement system (see table, below)
* If MoveSystemDMG = 0 → DP = 1
* Else → DP = PartSize \* MoveSystemDMG

Holder DP
* DP = 1

Sensor DP
* MainSensor: DP = 60 - (5 \* PartSize)
* TarCom, ECM: DP = 25

Suppot DP
* If the part is an Engine → DP = 3
* Else → DP = 1

Shield DP
Shields don't have DP. ***[Ed. Not sure why.]***

ExArmor DP
Shields don't have DP. ***[Ed. Not sure why.]***

Swag DP
* DP = 1

Prop DP
* DP = PartSize

Metaterrain DP
* DP = PartSize

Electronics DP
* DP = 1

Usables DP
* DP = PartSize + 1

Repair Fuel DP
* DP = 0 ***[Ed. Not sure why.]***

Consumables DP
* DP = 0 ***[Ed. Not sure why.]***

Modifier DP
* DP = 0 ***[Ed. Not sure why.]***

Weapon Add-On DP
* DP = 1

### Adjustments to DP based on scale and material

DP is further modified based on the scale of the item as well as its material.

* If Scale < 1 →
	+ If Material = Meat → DP = DP \* 2
	+ Else → DP = DP \* 3
* Else →
	+ If Material = Meat → DP = DP \* 4
	+ Else if Material = Biotech → DP = DP \* 6
	+ Else if Material = Metal → DP = DP \* 5
	+ If Scale > 1 →
		- For t = 2 to Scale → DP = DP \* 5

### Movement system DMG table

```
Wheels		1
Tracks		2
Hover Jets	0
Flight Jets	0
Arc Thrusters	0
Overchargers	0

```

## Points of Complexity (CMX)

Michael Deutschmann says:

For all other parts, CMX is equal to 1.

## Arc (ARC)

*See WeaponArc in ghweapon.pp*

Weapon arcs are determined by where they are equipped or installed.

* By default, an uninstalled weapon has an arc of F90.
* Weapons equipped in arms: ARC = F180
* Weapons equipped in tails: ARC = F360
* Weapons equipped in other places: ARC = F90
* Weapons installed in arms, heads or tails: ARC = F180
* Weapons installed in turrets: ARC = F360
* Weapons installed in other places: ARC = F90

## Movement (MV), Sensors (SE) & Targeting (TR)

* You get a -1 MV penalty for every 7.5 extra tons of installed

stuff. But, for equipped stuff, the figure depends on mecha size (e.g.,
8t for size 1, 8.5t for size 2, 9t for size 3, etc.). Note that Mounts
and Hands weigh 0.5t.

* A gyroscope gets you a +1 MV bonus per level; so a Gyroscope +3 will chage a MV -5 to -3 or -2.
* Biotech mecha get a +1 to MV and TR.
* If cockpit is located in head, +1 bonus to MV and TR.

### Base MV or TR score

* IMass = the intrinsic weight of your mecha (i.e., its weight

minus the weight of all equipped or carried items, but including
installed items)

* EMass = the weight of all your equipment, equipped or carried in the inventory
* MassPerMV = 15
* MaxWeight = the maximum weight your mech can carry = MassPerMV + MechSize
* If MaxWeight < 1 → MaxWeight = 1
* If EMass < 0 → EMass = 0
* MVTRScore = -1 \* (IMass div MassPerMV + EMass div MaxWeight)
* If the cockpit is located in the head → MVTR = MVTRScore + 1

### Additional calculations to MV

* FormBonus = the bonus to MV that is attributed to the mecha's form (see table, above)
* MV = MVTRScore + FormBonus
* MV = MV + GyroscopeSize - 1
* If MV > 0 → MV = 0

### Additional calculations to TR

* FormBonus = the bonus to TR that is attributed to the mecha's form (see table, above)
* TR = MVTRScore + FormBonus
* TR = TR + TargetingComputerSize
* If TR > 0 → TR = 0

## Scale Factor (SF) and Class (Size)

### List of mecha sizes/classes

* Size 1 = "Pico Class"
* Size 2 = "Demi Class"
* Size 3 = "Mini Class"
* Size 4 = "Light Class"
* Size 5 = "Standard Class"
* Size 6 = "Heavy Class"
* Size 7 = "Super Class"
* Size 8 = "Mega Class"
* Size 9 = "Giga Class"
* Size 10 = "Tera Class"

***[Ed: Shouldn't this list take Scale into account, too? I.e., Is***
 an SF:1 mecha of Size 1 a "Pico" class vehicle just like a SF:2 mecha
of Size 1?]

## Speed (dpr)

### Base Walking Speed

**Mecha**

* Mass = the mass of the mecha
* If Mass < 20 → Mass = 20
* Speed = (240 - Mass) div 3
* If the mech is a Zoanid → Speed = Speed + 20
* If Speed < 20 → Speed = 20
* MinLegs = MechSize \* 2 - 2
* If MinLegs < 2 → MinLegs = 2
* TotalLegs = total number of leg points (damaged & undamaged)
* If the mecha is a Zoanid → TotalLegs = TotalLegs + number of arm points (damaged & undamaged)
* Speed = (Speed \* TotalLegs) div MinLegs
* If Speed < 1 → Speed = 1
* ActiveLegs = the number of active (undamaged) legs
* If (ActiveLegs \* 2) < (TotalLegs + 2) → Speed = 0
* If the Gyroscope is inactive → Speed = 0

**Characters**

* Speed = CharSpeedStat \* 4
* TotalLegs = the number of leg points
* ActiveLegs = the number of active (undamaged) legs
* If (ActiveLegs \* 2) < (TotalLegs + 2) → Speed = Speed div 10
* If Speed < 20 → Speed = 20

### Base Rolling Speed

**Mecha**

* Mass = the mass of the mecha
* If Mass < 20 → Mass = 20
* Speed = (360 - Mass) div 3
* If Speed < 20 → Speed = 20
* If the mech is a GroundCar → Speed = (Speed \* 3) div 2
* MinWheels = MechSize \* 2 - 2
* If MinWheels < 2 → MinWheels = 2
* ActiveWheels = the active (undamaged) number of wheel points (including tracks)
* If ActiveWheels = 0 → exit ***[Ed. this is quite odd.]***
* If ActiveWheels < MinWheels →
	+ Speed = (Speed \* ActiveWheels) div MinWheels
	+ If Speed < 1 → Speed = 1

**Characters**

* Speed = CharSpeedStat \* 5
* MinWheels = 10
* ActiveWheels = the number of active (undamaged) wheel points (including tracks)
* If ActiveWheels = 0 → exit
* If ActiveWheels < MinWheels →
	+ Speed = (Speed \* ActiveWheels) div MinWheels
	+ If Speed < 1 → Speed = 1

### Base Skimming Speed

**Mecha**

* Mass = the mass of the mecha
* Thrust = the number of thrust points
* If Thrust > Mass →
	+ Speed = (Thrust \* 10) div Mass
	+ If the Gyroscope is inactive → Speed = Speed div 2
* Else → Speed = 0

**Characters**

* Mass = the mass of the character + 25
* Thrust = the number of thrust points
* ActiveWings = the number of undamaged wings
* Thrust = Thrust + ActiveWings \* 90
* If Thrust > Mass → Speed = (Thrust \* 10) div Mass
* Else → Speed = 0

### Base Flying Speed

**Mecha**

* Mass = the mass of the mecha
* Thrust = the number of thrust points
* TotalWings = the number of wing points
* If TotalWings < MechaSize → Thrust = Thrust div 2
* If the mecha is an AeroFighter →
	+ If TotalWings > MechaSize → Thrust = Thrust \* 2
* If the mecha is a HoverFighter or GerWalker → Thrust = (Thrust \* 5) div 4
* If the mecha is an Ornithoid →
	+ If TotalWings > MechaSize → Thrust = (Thrust \* 3) div 2
	+ Thrust = Thrust + TotalWings \* 80
* If Thrust > Mass →
	+ Speed = (Thrust \* 10) div Mass
	+ If Speed < 30 → Speed = 0
	+ TrueSpeed = a boolean value that is not true when determing Jump Time (see below)
	+ Else if (Speed < 150) and TrueSpeed → Speed = 150
	+ If the Gyroscope is inactive: Speed = 0
* Else → Speed = 0

**Characters**

* Mass = the mass of the character + 25
* Thrust = the number of thrust points
* TotalWings = the number of wing points
* If TotalWings < MechaSize → Thrust = Thrust div 2
* Thrust = Thrust + TotalWings \* 80
* If Thrust > Mass →
	+ Speed = (Thrust \* 10) div Mass
	+ If Speed < 30 → Speed = 0
	+ TrueSpeed = a boolean value that is not true when determing Jump Time (see below)
	+ Else if (Speed < 150) and TrueSpeed → Speed = 150
	+ If the Gyroscope is inactive → Speed = 0
* Else → Speed = 0

### Overcharger speed bonus

Overchargers add a bonus to a mek's FULLSPEED action.

* Mass = the mass of the mecha
* Overchargers = the number of overchargers
* SpeedBonus = (Overchargers \* 125 \* 10) div Mass

Some additional scaling is done to keep things within the speed limits. (Not sure about the logic behind this.)

* For t = 1 to 10 →
	+ SpeedFactor = t \* 20
	+ If SpeedBonus > SpeedFactor → SpeedBonus = SpeedFactor + ((SpeedBonus - SpeedFactor) div 2)

### Additional speed calculations

* Speed = the speed of your mecha depending on the movement mode, using the above calculations

Some additional scaling is done to keep things within the speed limits. ***[Ed. Not sure about the logic behind this.]*** ***[Ed2.***
 It appears to be logarithmic: the larger your speed, the more times you
 get hit by the speed penalty, so eventually you will need to go to
great pains to raise your speed by the smallest amount. Much harsher
than reality, where air friction is proportional to speed^2, but in
reality, extra jets weigh much more, anyway.]

* For t = 1 to 10 →
	+ SpeedFactor = t \* 50
	+ If Speed > SpeedFactor → Speed = SpeedFactor + ((Speed - SpeedFactor) div 2)

Mecha have additional speed limits based on the form of the mecha and the movement mode. Look up the correct value in the table and store the value as SpeedLimit. *[Ed2: this is fairly trivial compared to the speed scaling above.]*

* If Speed > SpeedLimit → Speed = SpeedLimit + ((Speed - SpeedLimit) div 2)
* If the macha is turning, then limit the speed to a maximum turn rate (not described in this article).
* If you're moving at Full Speed, then apply the overcharger speed bonus (described above).
* Additionally, if you're moving at Full Speed, then → Speed = (Speed \* 3) / div 2

Some additional bonuses are then given for when you are turning. I'm
not sure why the speed is first limited, then later multiplied.

### Jump Time

* Speed = the base flying speed for your mech using the above calculation ***[Ed. Make sure to set TrueSpeed to FALSE.]***
* If the mecha is a Zoanid → Speed = (Speed \* 3) div 2
* Else if Speed < 150 → Speed = 0
* JumpTime = (Speed + 1) div 2

## Range (RNG)

* If the weapon is Ballistic → Range = (DC + 1) div 2
* If the weapon is BeamGun → Range = DC div 2 + 2
* If the weapon is Missile → Range = DC div 3 + 3

## Speed (SPD)

The default speed for all weapons is 2.
***[Ed. need more info!]***

## Damage Class (DC)

Absolute values for Damage Class are scaled depending on the Scale Factor of the weapon.

* If SF = 0 → DC = DC
* Else if SF > 0 → DC = DC \* 2
* Else if SF > 1 → DC = DC \* 5 ^ (SF - 1)

The effects are cumulative, so a hypothetical SF:4 weapon (REALLY
HUGE!!) would have an absolute DC of (DC \* 2 \* 5 \* 5 \* 5). Assuming the
weapon's base DC is 3, the text description of the weapon would read
'DC3x250'.

Oddly, the *actual* damage for SF:1 and higher weapons
multiplies damage by 4 for SF 1, and by 5 for each scale above that. So
 a DC 4x10 weapon is closer to DC 4x20 for actual damage dealt.

## Ammo (a) & Magazine (MAG)

The default clip-size for ammo is 1, unless it is loaded in a weapon, in which case the clip size is determined by the weapon's Magazine rating.

The default GrenadeSkill is 2 ***[Ed. Mecha Artillery???]*** for all ammo.

The default Magazine rating for Ballistic and Missile weapons is 10.

## Armor

### Armor calculations

* If the part is a Module →
	+ Armor = ArmorStat
	+ If the part is a Storage Module → Armor = Armor + 2
* Else, if the part is a Cockpit or Support Module → Armor = ArmorStat
* Else, if the part is a Shield → Armor = PartSize \* 2
* Else, if the part is External Armor (ExArmor) → Armor = PartSize
* Else, if the part is MetaTerrain → Armor = PartSize
* Else → Armor = 0
* If Armor > 0 →
	+ If the part's parent is a mecha →
		- If the parent mecha is a GroundHugger → Armor = Armor + 2
		- If the parent mecha is an Arachnoid → Armor = Armor + 1

### Adjustments to Armor based on scale and material

If the Armor value is greater than zero, it is further modified based on the scale of the item as well as its material.

* If Scale < 1 →
	+ If Material = Meat → Armor = Armor \* 2
	+ Else → Armor = Armor \* 3
* Else →
	+ If Material = Meat → Armor = Armor \* 4
	+ Else if Material = Biotech → Armor = Armor \* 6
	+ Else if Material = Metal → Armor = Armor \* 5
	+ If Scale > 1 →
		- For t = 2 to Scale → Armor = Armor \* 5

## Encumberence

The following furmulae are used to determine the amount of weight you can carry:

* For mecha: MaxWeight = 15 + MechSize
* For characters: MaxWeight = BodyStat + 2 + WeightLiftingSkill

Your Encumberence level is then calculated as follows:

* If MaxWeight < 1 → MaxWeight = 1
* EquipmentWeight = the weight of all your equipment, whether carried, installed or equipped
* EMass = EquipmentWeight - MaxWeight
* For characters: EMass = EMass - WeightLiftingSkill
* If EMass > 0 → Encumberence = EMass div MaxWeight
* Else → Encumberence = 0

# Movement Modes

### Mecha movement modes table

```
		WALK	ROLL	SKIM	FLY
Battroid	True	True	True	True
Zoanoid		True	False	False	True
GroundHugger	False	True	True	False
Arachnoid	True	False	False	False
AeroFighter	False	False	False	True
Ornithoid	True	False	False	True
GerWalk		True	False	True	True
HoverFighter	False	False	True	True
GroundCar	False	True	False	False

```

### Mecha speed limits table

```
		WALK	ROLL	SKIM	FLY
Battroid	200	100	150	150
Zoanoid		200	0	0	200
GroundHugger	200	150	200	0
Arachnoid	200	0	0	0
AeroFighter	200	0	0	300
Ornithoid	200	0	0	300
GerWalk		60	0	300	250
HoverFighter	200	0	300	250
GroundCar	200	200	0	0

```

### Movement system thrust points table

```
		SKIM	FLY
Wheels		0	0
Tracks		0	0
Hover Jets	75	10
Flight Jets	0	90
Arc Jets	80	80
Overchargers	7	7

```

Multiply the above values by the size of the module to get the number of thrust points.