277 changes: 140 additions & 137 deletions data/base/script/campaign/transitionTech.js
Original file line number Diff line number Diff line change
@@ -1,137 +1,140 @@
//Contains the camapign transition technology definitions.

//These lists should give a player all the research from the previous campaigns.
const ALPHA_RESEARCH = [
"R-Wpn-MG1Mk1", "R-Vehicle-Body01",
"R-Sys-Spade1Mk1", "R-Vehicle-Prop-Wheels", "R-Wpn-Flamer-Damage03",
"R-Sys-Engineering01", "R-Sys-MobileRepairTurret01",
"R-Struc-PowerModuleMk1", "R-Wpn-MG2Mk1",
"R-Wpn-MG3Mk1", "R-Wpn-Cannon1Mk1", "R-Defense-WallUpgrade03",
"R-Struc-Factory-Upgrade03","R-Vehicle-Metals03", "R-Cyborg-Wpn-MG",
"R-Cyborg-Metals03", "R-Struc-Factory-Cyborg-Upgrade03",
"R-Struc-Materials03", "R-Struc-Research-Upgrade03",
"R-Struc-RprFac-Upgrade03", "R-Wpn-MG-ROF01",
"R-Wpn-Cannon-Damage03", "R-Wpn-Rocket05-MiniPod", "R-Wpn-Rocket-Damage03",
"R-Wpn-Flamer-ROF01", "R-Wpn-MG-Damage04",
"R-Wpn-Mortar-Damage03", "R-Wpn-Rocket-Accuracy02",
"R-Wpn-Rocket-ROF03", "R-Wpn-RocketSlow-Damage03",
"R-Wpn-RocketSlow-Accuracy01", "R-Vehicle-Engine03",
"R-Defense-MRL", "R-Comp-CommandTurret01",
"R-Cyborg-Wpn-Cannon", "R-Cyborg-Wpn-Flamer",
"R-Cyborg-Wpn-Rocket", "R-Defense-MortarPit", "R-Defense-Pillbox01",
"R-Defense-Pillbox04", "R-Defense-Pillbox05", "R-Defense-Pillbox06",
"R-Defense-TankTrap01", "R-Defense-Tower01", "R-Defense-Tower06",
"R-Defense-WallTower01", "R-Defense-WallTower02", "R-Defense-WallTower03",
"R-Defense-WallTower04", "R-Defense-WallTower06",
"R-Vehicle-Body11", "R-Vehicle-Body12", "R-Vehicle-Engine03",
"R-Vehicle-Prop-Tracks", "R-Vehicle-Prop-Hover", "R-Vehicle-Prop-Wheels",
"R-Wpn-Cannon-Accuracy01", "R-Wpn-Cannon3Mk1", "R-Wpn-Mortar-Acc01",
"R-Wpn-Mortar-ROF01", "R-Defense-HvyMor", "R-Wpn-Rocket03-HvAT",
];


//BETA 2-A
const ALPHA_TECH = [
"MG1Mk1", "Cannon1Mk1", "Cannon2A-TMk1", "Cannon375mmMk1", "Flame1Mk1",
"MG2Mk1", "MG3Mk1", "Mortar1Mk1", "Mortar2Mk1", "Rocket-BB", "Rocket-LtA-T",
"Rocket-MRL", "Rocket-Pod", "Cannon1-VTOL", "MG1-VTOL", "MG2-VTOL",
"MG3-VTOL", "Rocket-VTOL-LtA-T", "Rocket-VTOL-Pod", "Rocket-VTOL-BB",
"CyborgFlamer01", "CyborgCannon", "CyborgChaingun", "Cyb-Wpn-Atmiss",
"Cyb-Wpn-Laser", "Cyb-Wpn-Rail1", "CyborgRocket", "CyborgRotMG",
"CommandTurret1", "Body1REC", "Body5REC", "Body11ABT", "Body4ABT",
"Body8MBT", "Body12SUP", "CyborgCannonGrd", "CyborgFlamerGrd",
"CyborgChain1Ground", "CyborgRkt1Ground", "HalfTrack", "hover01",
"tracked01", "wheeled01", "Spade1Mk1", "SensorTurret1Mk1",
"CommandBrain01",
];

const STRUCTS_ALPHA = [
"A0CommandCentre", "A0PowerGenerator", "A0ResourceExtractor",
"A0ResearchFacility", "A0LightFactory", "A0ComDroidControl",
"A0CyborgFactory", "A0FacMod1", "A0HardcreteMk1CWall",
"A0HardcreteMk1Wall", "A0PowMod1", "A0RepairCentre3",
"A0ResearchModule1", "A0TankTrap", "PillBox1", "PillBox4",
"PillBox5", "PillBox6", "TankTrapC", "WallTower01",
"WallTower03", "WallTower04", "WallTower06", "AASite-QuadMg1",
"Emplacement-MortarPit01", "Emplacement-MRL-pit",
];

const PLAYER_RES_BETA = [
"R-Wpn-MG1Mk1", "R-Sys-Engineering01", "R-Cyborg-Legs01",
"R-Vehicle-Metals03", "R-Cyborg-Metals03", "R-Defense-WallUpgrade03",
"R-Struc-Factory-Upgrade03", "R-Struc-Factory-Cyborg-Upgrade03",
"R-Struc-Materials03", "R-Struc-Research-Upgrade03",
"R-Struc-RprFac-Upgrade03", "R-Wpn-MG-ROF01",
"R-Sys-MobileRepairTurret01", "R-Wpn-Cannon-Damage03",
"R-Wpn-Flamer-Damage03", "R-Wpn-Flamer-ROF01", "R-Wpn-MG-Damage04",
"R-Wpn-Mortar-Damage03", "R-Wpn-Rocket-Accuracy02",
"R-Wpn-Rocket-ROF03", "R-Wpn-RocketSlow-Accuracy01",
"R-Wpn-RocketSlow-Damage03", "R-Vehicle-Engine03",
"R-Wpn-AAGun03", "R-Defense-AASite-QuadMg1",
"R-Sys-Sensor-Tower02", "R-Defense-MRL",
];




//GAMMA 3-A
const BETA_TECH = [
"MG1Mk1", "Cannon1Mk1", "Cannon2A-TMk1", "Cannon375mmMk1", "Flame1Mk1",
"MG2Mk1", "MG3Mk1", "Mortar1Mk1", "Mortar2Mk1", "Rocket-BB", "Rocket-LtA-T",
"Rocket-MRL", "Rocket-Pod", "Cannon1-VTOL", "MG1-VTOL", "MG2-VTOL",
"MG3-VTOL", "Rocket-VTOL-LtA-T", "Rocket-VTOL-Pod", "Rocket-VTOL-BB",
"CyborgFlamer01", "CyborgCannon", "CyborgChaingun", "Cyb-Wpn-Atmiss",
"Cyb-Wpn-Laser", "Cyb-Wpn-Rail1", "CyborgRocket", "CyborgRotMG",
"CommandTurret1", "Body1REC", "Body5REC", "Body11ABT", "Body4ABT",
"Body8MBT", "Body12SUP", "CyborgCannonGrd", "CyborgFlamerGrd",
"CyborgChain1Ground", "CyborgRkt1Ground", "HalfTrack", "hover01",
"tracked01", "wheeled01", "Spade1Mk1", "SensorTurret1Mk1",
"CommandBrain01", "V-Tol", "Sys-CBTurret01", "Sys-VstrikeTurret01",
"Sys-VTOLCBTurret01", "Body2SUP", "Body6SUPP", "Body9REC", "AAGun2Mk1",
"Bomb1-VTOL-LtHE", "Bomb2-VTOL-HvHE", "Bomb3-VTOL-LtINC", "Bomb4-VTOL-HvyINC",
"Cannon4AUTO-VTOL", "Cannon4AUTOMk1", "Cannon5Vulcan-VTOL", "Cannon5VulcanMk1",
"Flame2", "Howitzer105Mk1", "Howitzer150Mk1", "MG4ROTARY-VTOL", "MG4ROTARYMk1",
"Mortar3ROTARYMk1", "Rocket-HvyA-T", "Rocket-IDF", "Rocket-VTOL-HvyA-T",
"QuadRotAAGun",
];

const STRUCTS_GAMMA = [
"A0CommandCentre", "A0PowerGenerator", "A0ResourceExtractor",
"A0ResearchFacility", "A0LightFactory", "A0ComDroidControl",
"A0CyborgFactory", "A0FacMod1", "A0HardcreteMk1CWall",
"A0HardcreteMk1Wall", "A0PowMod1", "A0RepairCentre3",
"A0ResearchModule1", "A0TankTrap", "PillBox1", "PillBox4",
"PillBox5", "PillBox6", "TankTrapC", "WallTower01",
"WallTower03", "WallTower04", "WallTower06", "AASite-QuadMg1",
"Emplacement-MortarPit02", "Emplacement-MRL-pit", "A0VTolFactory1",
"A0VtolPad", "Sys-CB-Tower01", "Sys-SensoTower02", "Sys-VTOL-CB-Tower01",
"Sys-VTOL-RadarTower01", "AASite-QuadBof", "AASite-QuadRotMg",
"Emplacement-HPVcannon", "Emplacement-Howitzer105", "Emplacement-Howitzer150",
"Emplacement-Rocket06-IDF", "Emplacement-RotMor", "Emplacement-Rocket06-IDF",
"Emplacement-HvyATrocket", "Wall-RotMg", "Wall-VulcanCan", "WallTower-HvATrocket",
"WallTower-HPVcannon", "Tower-Projector", "Pillbox-RotMG",
];

const PLAYER_RES_GAMMA = [
"R-Wpn-MG1Mk1", "R-Sys-Engineering02", "R-Cyborg-Legs01",
"R-Vehicle-Metals06", "R-Cyborg-Metals06", "R-Defense-WallUpgrade06",
"R-Struc-Factory-Upgrade06", "R-Struc-Factory-Cyborg-Upgrade06",
"R-Struc-Materials06", "R-Struc-Research-Upgrade06",
"R-Struc-RprFac-Upgrade06", "R-Wpn-MG-ROF03",
"R-Sys-MobileRepairTurret01", "R-Wpn-Cannon-Damage06",
"R-Wpn-Flamer-Damage06", "R-Wpn-Flamer-ROF03", "R-Wpn-MG-Damage07",
"R-Wpn-Mortar-Damage06", "R-Wpn-Rocket-Accuracy02",
"R-Wpn-Rocket-ROF03", "R-Wpn-RocketSlow-Accuracy03",
"R-Wpn-RocketSlow-Damage06", "R-Vehicle-Engine06",
"R-Wpn-AAGun03", "R-Defense-AASite-QuadMg1",
"R-Sys-Sensor-Tower02", "R-Defense-MRL", "R-Wpn-Cannon-Accuracy02",
"R-Wpn-Cannon-ROF03", "R-Wpn-Howitzer-Accuracy02", "R-Wpn-Howitzer-Damage03",
"R-Wpn-Mortar-Acc02", "R-Wpn-Mortar-ROF03", "R-Wpn-Rocket-Damage06",
"R-Wpn-RocketSlow-ROF03", "R-Vehicle-Armor-Heat02", "R-Cyborg-Armor-Heat02",
"R-Struc-VTOLFactory-Upgrade03", "R-Struc-VTOLPad-Upgrade03",
"R-Struc-Power-Upgrade01", "R-Sys-Sensor-Upgrade01", "R-Wpn-AAGun-Accuracy02",
"R-Wpn-AAGun-Damage03", "R-Wpn-AAGun-ROF03", "R-Wpn-Bomb-Accuracy02",
];

//...

//Contains the camapign transition technology definitions.

//This array should give a player all the research from Alpha.
const ALPHA_RESEARCH = [
"R-Wpn-MG1Mk1", "R-Vehicle-Body01",
"R-Sys-Spade1Mk1", "R-Vehicle-Prop-Wheels", "R-Wpn-Flamer-Damage03",
"R-Sys-Engineering01", "R-Sys-MobileRepairTurret01",
"R-Struc-PowerModuleMk1", "R-Wpn-MG2Mk1",
"R-Wpn-MG3Mk1", "R-Wpn-Cannon1Mk1", "R-Defense-WallUpgrade03",
"R-Struc-Factory-Upgrade03","R-Vehicle-Metals03", "R-Cyborg-Wpn-MG",
"R-Cyborg-Metals03", "R-Struc-Factory-Cyborg-Upgrade03",
"R-Struc-Materials03", "R-Struc-Research-Upgrade03",
"R-Struc-RprFac-Upgrade03", "R-Wpn-MG-ROF01",
"R-Wpn-Cannon-Damage03", "R-Wpn-Rocket05-MiniPod", "R-Wpn-Rocket-Damage03",
"R-Wpn-Flamer-ROF01", "R-Wpn-MG-Damage04",
"R-Wpn-Mortar-Damage03", "R-Wpn-Rocket-Accuracy02",
"R-Wpn-Rocket-ROF03", "R-Wpn-RocketSlow-Damage03",
"R-Wpn-RocketSlow-Accuracy01", "R-Vehicle-Engine03",
"R-Defense-MRL", "R-Comp-CommandTurret01",
"R-Cyborg-Wpn-Cannon", "R-Cyborg-Wpn-Flamer",
"R-Cyborg-Wpn-Rocket", "R-Defense-MortarPit", "R-Defense-Pillbox01",
"R-Defense-Pillbox04", "R-Defense-Pillbox05", "R-Defense-Pillbox06",
"R-Defense-TankTrap01", "R-Defense-Tower01", "R-Defense-Tower06",
"R-Defense-WallTower01", "R-Defense-WallTower02", "R-Defense-WallTower03",
"R-Defense-WallTower04", "R-Defense-WallTower06",
"R-Vehicle-Body11", "R-Vehicle-Body12", "R-Vehicle-Engine03",
"R-Vehicle-Prop-Tracks", "R-Vehicle-Prop-Hover", "R-Vehicle-Prop-Wheels",
"R-Wpn-Cannon-Accuracy01", "R-Wpn-Cannon3Mk1", "R-Wpn-Mortar-Acc01",
"R-Wpn-Mortar-ROF01", "R-Defense-HvyMor", "R-Wpn-Rocket03-HvAT",
];


//BETA 2-A
const ALPHA_TECH = [
"MG1Mk1", "Cannon1Mk1", "Cannon2A-TMk1", "Cannon375mmMk1", "Flame1Mk1",
"MG2Mk1", "MG3Mk1", "Mortar1Mk1", "Mortar2Mk1", "Rocket-BB", "Rocket-LtA-T",
"Rocket-MRL", "Rocket-Pod", "Cannon1-VTOL", "MG1-VTOL", "MG2-VTOL",
"MG3-VTOL", "Rocket-VTOL-LtA-T", "Rocket-VTOL-Pod", "Rocket-VTOL-BB",
"CyborgFlamer01", "CyborgCannon", "CyborgChaingun", "Cyb-Wpn-Atmiss",
"Cyb-Wpn-Laser", "Cyb-Wpn-Rail1", "CyborgRocket", "CyborgRotMG",
"CommandTurret1", "Body1REC", "Body5REC", "Body11ABT", "Body4ABT",
"Body8MBT", "Body12SUP", "CyborgCannonGrd", "CyborgFlamerGrd",
"CyborgChain1Ground", "CyborgRkt1Ground", "HalfTrack", "hover01",
"tracked01", "wheeled01", "Spade1Mk1", "SensorTurret1Mk1",
"CommandBrain01",
];

const STRUCTS_ALPHA = [
"A0CommandCentre", "A0PowerGenerator", "A0ResourceExtractor",
"A0ResearchFacility", "A0LightFactory", "A0ComDroidControl",
"A0CyborgFactory", "A0FacMod1", "A0HardcreteMk1CWall",
"A0HardcreteMk1Wall", "A0PowMod1", "A0RepairCentre3",
"A0ResearchModule1", "A0TankTrap", "PillBox1", "PillBox4",
"PillBox5", "PillBox6", "TankTrapC", "WallTower01",
"WallTower03", "WallTower04", "WallTower06", "AASite-QuadMg1",
"Emplacement-MortarPit01", "Emplacement-MRL-pit",
];

const PLAYER_RES_BETA = [
"R-Wpn-MG1Mk1", "R-Sys-Engineering01", "R-Cyborg-Legs01",
"R-Vehicle-Metals03", "R-Cyborg-Metals03", "R-Defense-WallUpgrade03",
"R-Struc-Factory-Upgrade03", "R-Struc-Factory-Cyborg-Upgrade03",
"R-Struc-Materials03", "R-Struc-Research-Upgrade03",
"R-Struc-RprFac-Upgrade03", "R-Wpn-MG-ROF01",
"R-Sys-MobileRepairTurret01", "R-Wpn-Cannon-Damage03",
"R-Wpn-Flamer-Damage03", "R-Wpn-Flamer-ROF01", "R-Wpn-MG-Damage04",
"R-Wpn-Mortar-Damage03", "R-Wpn-Rocket-Accuracy02",
"R-Wpn-Rocket-ROF03", "R-Wpn-RocketSlow-Accuracy01",
"R-Wpn-RocketSlow-Damage03", "R-Vehicle-Engine03",
"R-Wpn-AAGun03", "R-Defense-AASite-QuadMg1",
"R-Sys-Sensor-Tower02", "R-Defense-MRL",
];




//GAMMA 3-A
const BETA_TECH = [
"MG1Mk1", "Cannon1Mk1", "Cannon2A-TMk1", "Cannon375mmMk1", "Flame1Mk1",
"MG2Mk1", "MG3Mk1", "Mortar1Mk1", "Mortar2Mk1", "Rocket-BB", "Rocket-LtA-T",
"Rocket-MRL", "Rocket-Pod", "Cannon1-VTOL", "MG1-VTOL", "MG2-VTOL",
"MG3-VTOL", "Rocket-VTOL-LtA-T", "Rocket-VTOL-Pod", "Rocket-VTOL-BB",
"CyborgFlamer01", "CyborgCannon", "CyborgChaingun", "Cyb-Wpn-Atmiss",
"Cyb-Wpn-Laser", "Cyb-Wpn-Rail1", "CyborgRocket", "CyborgRotMG",
"CommandTurret1", "Body1REC", "Body5REC", "Body11ABT", "Body4ABT",
"Body8MBT", "Body12SUP", "CyborgCannonGrd", "CyborgFlamerGrd",
"CyborgChain1Ground", "CyborgRkt1Ground", "HalfTrack", "hover01",
"tracked01", "wheeled01", "Spade1Mk1", "SensorTurret1Mk1",
"CommandBrain01", "V-Tol", "Sys-CBTurret01", "Sys-VstrikeTurret01",
"Sys-VTOLCBTurret01", "Body2SUP", "Body6SUPP", "Body9REC", "AAGun2Mk1",
"Bomb1-VTOL-LtHE", "Bomb2-VTOL-HvHE", "Bomb3-VTOL-LtINC", "Bomb4-VTOL-HvyINC",
"Cannon4AUTO-VTOL", "Cannon4AUTOMk1", "Cannon5Vulcan-VTOL", "Cannon5VulcanMk1",
"Flame2", "Howitzer105Mk1", "Howitzer150Mk1", "MG4ROTARY-VTOL", "MG4ROTARYMk1",
"Mortar3ROTARYMk1", "Rocket-HvyA-T", "Rocket-IDF", "Rocket-VTOL-HvyA-T",
"QuadRotAAGun",
];

const STRUCTS_GAMMA = [
"A0CommandCentre", "A0PowerGenerator", "A0ResourceExtractor",
"A0ResearchFacility", "A0LightFactory", "A0ComDroidControl",
"A0CyborgFactory", "A0FacMod1", "A0HardcreteMk1CWall",
"A0HardcreteMk1Wall", "A0PowMod1", "A0RepairCentre3",
"A0ResearchModule1", "A0TankTrap", "PillBox1", "PillBox4",
"PillBox5", "PillBox6", "TankTrapC", "WallTower01",
"WallTower03", "WallTower04", "WallTower06", "AASite-QuadMg1",
"Emplacement-MortarPit02", "Emplacement-MRL-pit", "A0VTolFactory1",
"A0VtolPad", "Sys-CB-Tower01", "Sys-SensoTower02", "Sys-VTOL-CB-Tower01",
"Sys-VTOL-RadarTower01", "AASite-QuadBof", "AASite-QuadRotMg",
"Emplacement-HPVcannon", "Emplacement-Howitzer105", "Emplacement-Howitzer150",
"Emplacement-Rocket06-IDF", "Emplacement-RotMor", "Emplacement-Rocket06-IDF",
"Emplacement-HvyATrocket", "Wall-RotMg", "Wall-VulcanCan", "WallTower-HvATrocket",
"WallTower-HPVcannon", "Tower-Projector", "Pillbox-RotMG",
];

const PLAYER_RES_GAMMA = [
"R-Wpn-MG1Mk1", "R-Sys-Engineering02", "R-Cyborg-Legs01",
"R-Vehicle-Metals06", "R-Cyborg-Metals06", "R-Defense-WallUpgrade06",
"R-Struc-Factory-Upgrade06", "R-Struc-Factory-Cyborg-Upgrade06",
"R-Struc-Materials06", "R-Struc-Research-Upgrade06",
"R-Struc-RprFac-Upgrade06", "R-Wpn-MG-ROF03",
"R-Sys-MobileRepairTurret01", "R-Wpn-Cannon-Damage06",
"R-Wpn-Flamer-Damage06", "R-Wpn-Flamer-ROF03", "R-Wpn-MG-Damage07",
"R-Wpn-Mortar-Damage06", "R-Wpn-Rocket-Accuracy02",
"R-Wpn-Rocket-ROF03", "R-Wpn-RocketSlow-Accuracy03",
"R-Wpn-RocketSlow-Damage06", "R-Vehicle-Engine06",
"R-Wpn-AAGun03", "R-Defense-AASite-QuadMg1",
"R-Sys-Sensor-Tower02", "R-Defense-MRL", "R-Wpn-Cannon-Accuracy02",
"R-Wpn-Cannon-ROF03", "R-Wpn-Howitzer-Accuracy02", "R-Wpn-Howitzer-Damage03",
"R-Wpn-Mortar-Acc02", "R-Wpn-Mortar-ROF03", "R-Wpn-Rocket-Damage06",
"R-Wpn-RocketSlow-ROF03", "R-Vehicle-Armor-Heat03", "R-Cyborg-Armor-Heat03",
"R-Struc-VTOLFactory-Upgrade03", "R-Struc-VTOLPad-Upgrade03",
"R-Struc-Power-Upgrade01", "R-Sys-Sensor-Upgrade01", "R-Wpn-AAGun-Accuracy02",
"R-Wpn-AAGun-Damage03", "R-Wpn-AAGun-ROF03", "R-Wpn-Bomb-Accuracy02", "R-Wpn-Bomb03",
"R-Wpn-Howitzer-ROF03", "R-Sys-CBSensor-Turret01", "R-Sys-VTOLStrike-Turret01",
"R-Cyborg-Wpn-RotMG-Grd", "R-Defense-AASite-QuadRotMg", "R-Defense-Emplacement-HPVcannon",
"R-Defense-Howitzer", "R-Defense-HvyFlamer", "R-Defense-RotMG", "R-Defense-Wall-VulcanCan",
"R-Defense-WallTower-HPVcannon", "R-Defense-HvyHowitzer", "R-Defense-Wall-RotMg",
];

//...
37 changes: 22 additions & 15 deletions data/base/script/rules.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// General rules for the campaign
//
// * Enable unit design and minimap only when an HQ exists
receiveAllEvents(true); //Needed to allow enemy research to apply to them

function setupGame()
{
Expand Down Expand Up @@ -44,39 +45,45 @@ function eventStartLevel()
// Disable by default
setMiniMap(false);
setDesign(false);
setDroidLimit(0, 100, DROID_ANY);
setDroidLimit(0, 10, DROID_COMMAND);
setDroidLimit(0, 15, DROID_CONSTRUCT);
setDroidLimit(selectedPlayer, 100, DROID_ANY);
setDroidLimit(selectedPlayer, 10, DROID_COMMAND);
setDroidLimit(selectedPlayer, 15, DROID_CONSTRUCT);

setStructureLimits("A0PowerGenerator", 5, 0);
setStructureLimits("A0ResourceExtractor", 200, 0);
setStructureLimits("A0ResearchFacility", 5, 0);
setStructureLimits("A0LightFactory", 5, 0);
setStructureLimits("A0CommandCentre", 1, 0);
setStructureLimits("A0ComDroidControl", 1, 0);
setStructureLimits("A0CyborgFactory", 5, 0);
setStructureLimits("A0VTolFactory1", 5, 0);
setStructureLimits("A0PowerGenerator", 5, selectedPlayer);
setStructureLimits("A0ResourceExtractor", 200, selectedPlayer);
setStructureLimits("A0ResearchFacility", 5, selectedPlayer);
setStructureLimits("A0LightFactory", 5, selectedPlayer);
setStructureLimits("A0CommandCentre", 1, selectedPlayer);
setStructureLimits("A0ComDroidControl", 1, selectedPlayer);
setStructureLimits("A0CyborgFactory", 5, selectedPlayer);
setStructureLimits("A0VTolFactory1", 5, selectedPlayer);

var structlist = enumStruct(me, HQ);
var structlist = enumStruct(selectedPlayer, HQ);
for (var i = 0; i < structlist.length; i++)
{
// Simulate build events to enable minimap/unit design when an HQ exists
eventStructureBuilt(structlist[i]);
}
structlist = enumStructOffWorld(me, HQ);
structlist = enumStructOffWorld(selectedPlayer, HQ);
for (var i = 0; i < structlist.length; i++)
{
eventStructureBuilt(structlist[i]);
}

// set income modifier for player 0 (human)
// set income modifier/power storage for player 0 (human)
if (difficulty == EASY)
{
setPowerModifier(110);
}
else if (difficulty == HARD)
{
setPowerModifier(90);
setPowerStorageMaximum(50000);
}
else if (difficulty == INSANE)
{
setPowerModifier(70);
setPowerStorageMaximum(20000);
}
}

Expand Down Expand Up @@ -128,7 +135,7 @@ function eventResearched(research, structure, player)

var lastHitTime = 0;
function eventAttacked(victim, attacker) {
if (gameTime > lastHitTime + 5000)
if ((victim.player == selectedPlayer) && gameTime > lastHitTime + 5000)
{
lastHitTime = gameTime;
if (victim.type === STRUCTURE)
Expand Down
62 changes: 40 additions & 22 deletions data/base/stats/research.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
"msgName": "RES_V_P_W2",
"name": "Wheeled Propulsion II",
"replacedComponents": [
"wheeled02:wheeled02"
"wheeled01:wheeled02"
],
"requiredResearch": [
"R-Struc-Factory-Upgrade04"
Expand All @@ -117,6 +117,24 @@
"wheeled02"
],
"statID": "wheeled02"
},
"R-Cyborg-Legs02": {
"iconID": "IMAGE_RES_CYBORGTECH",
"id": "R-Cyborg-Legs02",
"keyTopic": 1,
"name": "Cyborg Propulsion II",
"replacedComponents": [
"CyborgLegs:CyborgLegs02"
],
"requiredResearch": [
"R-Struc-Factory-Upgrade04"
],
"researchPoints": 7800,
"researchPower": 300,
"resultComponents": [
"CyborgLegs02"
],
"statID": "CyborgLegs02"
},
"R-Comp-CommandTurret01": {
"iconID": "IMAGE_RES_COMPUTERTECH",
Expand Down Expand Up @@ -187,7 +205,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -218,7 +236,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -251,7 +269,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -282,7 +300,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -311,7 +329,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -341,7 +359,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -372,7 +390,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -401,7 +419,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -431,7 +449,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Cyborgs",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -602,7 +620,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -633,7 +651,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -666,7 +684,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -697,7 +715,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -726,7 +744,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -756,7 +774,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -787,7 +805,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -816,7 +834,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -846,7 +864,7 @@
"class": "Body",
"filterParameter": "BodyClass",
"filterValue": "Droids",
"parameter": "HitPoints",
"parameter": "HitPointPct",
"value": 30
}
],
Expand Down Expand Up @@ -6989,6 +7007,7 @@
"R-Vehicle-Body07": {
"iconID": "IMAGE_RES_DROIDTECH",
"id": "R-Vehicle-Body07",
"keyTopic": 1,
"msgName": "RES_V_B07",
"name": "Medium Body - Retribution",
"requiredResearch": [
Expand All @@ -7004,6 +7023,7 @@
"R-Vehicle-Body10": {
"iconID": "IMAGE_RES_DROIDTECH",
"id": "R-Vehicle-Body10",
"keyTopic": 1,
"msgName": "RES_V_B10",
"name": "Heavy Body - Vengeance",
"requiredResearch": [
Expand Down Expand Up @@ -8240,9 +8260,7 @@
"id": "R-Wpn-Missile2A-T",
"name": "Scourge Missile",
"requiredResearch": [
"R-Wpn-Missile-Accuracy01",
"R-Wpn-Missile-Damage01",
"R-Wpn-Rocket07-Tank-Killer"
"R-Wpn-Missile-Accuracy01"
],
"researchPoints": 14400,
"researchPower": 450,
Expand Down
24 changes: 12 additions & 12 deletions data/base/wrf/cam3/cam3a/labels.json
Original file line number Diff line number Diff line change
@@ -1,43 +1,43 @@
{
"position_0": { "label": "startPosition", "pos": [ 7360, 15296 ] },
"position_1": { "label": "transporterEntry", "pos": [ 7296, 16256 ] },
"position_1": { "label": "transporterEntry", "pos": [ 7296, 16256 ] },
"position_2": { "label": "transporterExit", "pos": [ 7296, 16256 ] },
"position_3": { "label": "vtolAppearPos", "pos": [ 832, 6464 ] },
"position_4": { "label": "vtolRemovePos", "pos": [ 1920, 8320 ] },
"position_5": { "label": "healthRetreatPos", "pos": [ 1344, 15296 ] },
"position_4": { "label": "vtolRemovePos", "pos": [ 128, 8320 ] },
"position_5": { "label": "healthRetreatPos", "pos": [ 1344, 15296 ] },
"position_6": { "label": "genericasAssembly", "pos": [ 4544, 10816 ] },
"position_7": { "label": "northFacAssembly", "pos": [ 7104, 9280 ] },
"position_7": { "label": "northFacAssembly", "pos": [ 7104, 9280 ] },
"position_8": { "label": "ambushPlayerPos", "pos": [ 7360, 14656 ] },
"position_10": { "label": "hoverGrpPos1", "pos": [ 4928, 14400 ] },
"position_11": { "label": "hoverGrpPos2", "pos": [ 5312, 12352 ] },
"position_12": { "label": "hoverGrpPos3", "pos": [ 3776, 12864 ] },
"position_13": { "label": "southWestBasePatrol","pos": [ 1344, 15296 ] },
"position_13": { "label": "southWestBasePatrol", "pos": [ 1344, 15296 ] },
"position_14": { "label": "westEntrancePatrol", "pos": [ 5952, 14144 ] },
"position_15": { "label": "playerLZPatrol", "pos": [ 7232, 14656 ] },
"position_16": { "label": "NEBaseRetreat", "pos": [ 5568, 9792 ] },
"position_17": { "label": "NWBaseRetreat", "pos": [ 1472, 8512 ] },
"position_18": { "label": "SWBaseRetreat", "pos": [ 2496, 15168 ] },

"area_0": { "label": "landingZone", "pos1": [ 7040, 15232 ], "pos2": [ 7296, 15488 ] },
"area_0": { "label": "landingZone", "pos1": [ 7040, 15232 ], "pos2": [ 7296, 15488 ] },
"area_1": { "label": "cybAttackers", "pos1": [ 6976, 12480 ], "pos2": [ 7360, 12864 ] },
"area_2": { "label": "hoverPatrolGrp", "pos1": [ 3648, 13504 ], "pos2": [ 4160, 13888 ] },
"area_3": { "label": "cybValleyPatrol", "pos1": [ 4288, 15040 ], "pos2": [ 4672, 15424 ] },
"area_4": { "label": "NEDefenderGroup", "pos1": [ 4032, 9536 ], "pos2": [ 5440, 9920 ] },
"area_5": { "label": "NEAttackerGroup", "pos1": [ 4928, 9664 ], "pos2": [ 5440, 9920 ] },
"area_6": { "label": "NAmbushCyborgs", "pos1": [ 6080, 11456 ], "pos2": [ 7232, 12224 ] },
"area_7": { "label": "westBaseCleanup", "pos1": [ 704, 11840 ], "pos2": [ 3136, 13248 ] },
"area_8": { "label": "southWestBaseCleanup","pos1": [ 64, 13376 ], "pos2": [ 3520, 16192 ] },
"area_9": { "label": "northEastBaseCleanup","pos1": [ 5056, 7744 ], "pos2": [ 8000, 10432 ] },
"area_8": { "label": "southWestBaseCleanup", "pos1": [ 64, 13376 ], "pos2": [ 3520, 16192 ] },
"area_9": { "label": "northEastBaseCleanup", "pos1": [ 5056, 7744 ], "pos2": [ 8000, 10432 ] },
"area_10": { "label": "northWestBaseCleanup","pos1": [ 192, 8256 ], "pos2": [ 3264, 10176 ] },

"object_0": { "label": "NXPowerGenArti", "id": 901, "player": 3, "type": 1 },
"object_1": { "label": "NXResearchLabArti", "id": 1011, "player": 3, "type": 1 },
"object_2": { "label": "NXcybFac-b2", "id": 187, "player": 3, "type": 1 },
"object_0": { "label": "NXPowerGenArti", "id": 901, "player": 3, "type": 1 },
"object_1": { "label": "NXResearchLabArti", "id": 1011, "player": 3, "type": 1 },
"object_2": { "label": "NXcybFac-b2", "id": 187, "player": 3, "type": 1 },
"object_3": { "label": "NXcybFac-b3-1", "id": 88, "player": 3, "type": 1 },
"object_4": { "label": "NXcybFac-b3-2", "id": 1059, "player": 3, "type": 1 },
"object_5": { "label": "NXHvyFac-b3", "id": 1065, "player": 3, "type": 1 },
"object_6": { "label": "NXcybFac-b4", "id": 240, "player": 3, "type": 1 },
"object_7": { "label": "NXCommandCenter", "id": 170, "player": 3, "type": 1 },

"radius_0": { "label": "vtolRemoveZone", "subscriber": 3, "pos" : [ 1920, 8320 ], "radius": 250 }
"radius_0": { "label": "vtolRemoveZone", "subscriber": 3, "pos" : [ 128, 8320 ], "radius": 250 }
}
2 changes: 1 addition & 1 deletion src/frontend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1319,7 +1319,7 @@ bool runGameOptionsMenu()

case FRONTEND_DIFFICULTY:
case FRONTEND_DIFFICULTY_R:
setDifficultyLevel(stepCycle(getDifficultyLevel(), DL_EASY, DL_HARD));
setDifficultyLevel(stepCycle(getDifficultyLevel(), DL_EASY, DL_INSANE));
widgSetString(psWScreen, FRONTEND_DIFFICULTY_R, gameOptionsDifficultyString());
break;

Expand Down
5 changes: 5 additions & 0 deletions src/qtscriptfuncs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2860,6 +2860,11 @@ static QScriptValue js_completeResearch(QScriptContext *context, QScriptEngine *
player = engine->globalObject().property("me").toInt32();
}
RESEARCH *psResearch = getResearch(researchName.toUtf8().constData());
PLAYER_RESEARCH *plrRes = &asPlayerResList[player][psResearch->index];
if (IsResearchCompleted(plrRes))
{
return QScriptValue(false);
}
SCRIPT_ASSERT(context, psResearch, "No such research %s for player %d", researchName.toUtf8().constData(), player);
SCRIPT_ASSERT(context, psResearch->index < asResearch.size(), "Research index out of bounds");
if (bMultiMessages && (gameTime > 2))
Expand Down