From 3a5bbad983b3e02ee5f54cd2a0d68f3b824a0815 Mon Sep 17 00:00:00 2001 From: KJeff01 Date: Fri, 12 Jan 2024 18:32:21 -0600 Subject: [PATCH] Campaign balance updates Main points of interest: Cyborgs do more damage than their tank variants. New Cannon, Rocket, and Flamer cyborgs added in Beta campaign. Heavy Gunner cyborg is based off Medium Cannon instead of Light Cannon to be of better use. All Nexus units spawned or manufactured use the internal sensor "NavGunSensor". Gamma 9 hack event tweaks and fixes. Mega VTOL anti-cheese abilities added to the HQ, VTOLs not initially blown up anymore upon seeing the final base. Various improvements to some VTOL weapons from previous balance update. Enemy VTOL wave spawn amounts tweaked to be more forgiving where necessary. New Depleted Uranium Mk3 upgrade unlocked during Gamma 4 artifact tech so Assault Gun can be not too shabby up to Pulse Laser (which obsoletes AG and Inferno at the same time). First Scavenger factory on Alpha 8 rotated to face North rather than South, preventing units sometimes getting trapped behind the Cannon Tower next to the factory. --- data/base/messages/resmessages2.json | 33 ++++ data/base/script/campaign/cam2-2.js | 7 +- data/base/script/campaign/cam2-5.js | 7 +- data/base/script/campaign/cam2-6.js | 10 +- data/base/script/campaign/cam2-7.js | 11 +- data/base/script/campaign/cam2-8.js | 5 +- data/base/script/campaign/cam2-a.js | 8 +- data/base/script/campaign/cam2-b.js | 5 +- data/base/script/campaign/cam2-c.js | 5 +- data/base/script/campaign/cam2-d.js | 14 +- data/base/script/campaign/cam2-end.js | 4 +- data/base/script/campaign/cam3-1.js | 7 +- data/base/script/campaign/cam3-2.js | 4 +- data/base/script/campaign/cam3-4.js | 75 ++++---- data/base/script/campaign/cam3-a.js | 7 +- data/base/script/campaign/cam3-ab.js | 4 +- data/base/script/campaign/cam3-ad1.js | 4 +- data/base/script/campaign/cam3-ad2.js | 4 +- data/base/script/campaign/cam3-b.js | 1 + data/base/script/campaign/cam3-c.js | 4 +- data/base/script/campaign/libcampaign.js | 2 +- .../campaign/libcampaign_includes/misc.js | 16 ++ .../campaign/libcampaign_includes/victory.js | 6 +- data/base/script/campaign/templates.js | 7 + data/base/script/campaign/transitionTech.js | 5 +- data/base/stats/research.json | 126 +++++++++++-- data/base/stats/templates.json | 33 ++++ data/base/stats/weapons.json | 176 +++++++++++++++--- data/base/wrf/cam1/sub1-4/dinit.bjo | Bin 4496 -> 4496 bytes data/base/wrf/cam1/sub1-4/struct.bjo | Bin 6732 -> 6732 bytes data/base/wrf/cam3/cam3-4/labels.json | 6 + 31 files changed, 469 insertions(+), 127 deletions(-) diff --git a/data/base/messages/resmessages2.json b/data/base/messages/resmessages2.json index f0c219e77a9..874d3d56c87 100644 --- a/data/base/messages/resmessages2.json +++ b/data/base/messages/resmessages2.json @@ -21,6 +21,28 @@ "Requires Cyborg factory to produce" ] }, + "RES_CYW_CN2": { + "id": "RES_CYW_CN2", + "imdName": "MICAPSUL.pie", + "sequenceName": "res_droid.ogg", + "text": [ + "New Cyborg Available", + "Armed with Cyborg Hyper Velocity Cannon", + "Body Points: Medium", + "Requires Cyborg factory to produce" + ] + }, + "RES_CYW_FL2": { + "id": "RES_CYW_FL2", + "imdName": "MICAPSUL.pie", + "sequenceName": "res_droid.ogg", + "text": [ + "New Cyborg Available", + "Armed with Cyborg Thermite flamer", + "Body Points: Medium", + "Requires Cyborg factory to produce" + ] + }, "RES_CYW_MG4": { "id": "RES_CYW_MG4", "imdName": "MICAPSUL.pie", @@ -32,6 +54,17 @@ "Requires Cyborg factory to produce" ] }, + "RES_CYW_RK2": { + "id": "RES_CYW_RK2", + "imdName": "MICAPSUL.pie", + "sequenceName": "res_droid.ogg", + "text": [ + "New Cyborg Available", + "Armed with Cyborg Tank Killer rocket", + "Body Points: Medium", + "Requires Cyborg factory to produce" + ] + }, "RES_CY_AH1": { "id": "RES_CY_AH1", "imdName": "MICAPSUL.pie", diff --git a/data/base/script/campaign/cam2-2.js b/data/base/script/campaign/cam2-2.js index 8acb0b39f16..e4e477911a1 100644 --- a/data/base/script/campaign/cam2-2.js +++ b/data/base/script/campaign/cam2-2.js @@ -98,7 +98,7 @@ function wave2() { const list = [cTempl.colatv, cTempl.colatv]; const ext = { - limit: [4, 4], //paired with list array + limit: [3, 3], //paired with list array alternate: true, altIdx: 0 }; @@ -109,7 +109,7 @@ function wave3() { const list = [cTempl.colcbv, cTempl.colcbv]; const ext = { - limit: [4, 4], //paired with list array + limit: [3, 3], //paired with list array alternate: true, altIdx: 0 }; @@ -120,7 +120,7 @@ function vtolAttack() { const list = [cTempl.colpbv, cTempl.colpbv]; const ext = { - limit: [4, 4], //paired with list array + limit: [3, 3], //paired with list array alternate: true, altIdx: 0 }; @@ -207,6 +207,7 @@ function eventStartLevel() { camUpgradeOnMapTemplates(cTempl.commc, cTempl.commrp, CAM_THE_COLLECTIVE); } + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); camSetEnemyBases({ "COEastBase": { diff --git a/data/base/script/campaign/cam2-5.js b/data/base/script/campaign/cam2-5.js index 3c4820bddef..da89f7fb5f5 100644 --- a/data/base/script/campaign/cam2-5.js +++ b/data/base/script/campaign/cam2-5.js @@ -121,6 +121,9 @@ function eventStartLevel() { camUpgradeOnMapTemplates(cTempl.commc, cTempl.commrp, CAM_THE_COLLECTIVE); } + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybc, cTempl.cocybsn, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybr, cTempl.cocybtk, CAM_THE_COLLECTIVE); camSetEnemyBases({ "COEastBase": { @@ -160,7 +163,7 @@ function eventStartLevel() repair: 30, count: -1, }, - templates: [cTempl.cocybag, cTempl.npcybf, cTempl.npcybr] + templates: [cTempl.cocybag, cTempl.cocybth, cTempl.cocybtk] }, "COCyborgFactoryR": { assembly: "COCyborgFactoryRAssembly", @@ -172,7 +175,7 @@ function eventStartLevel() repair: 30, count: -1, }, - templates: [cTempl.npcybr, cTempl.npcybc] + templates: [cTempl.cocybtk, cTempl.cocybsn] }, }); diff --git a/data/base/script/campaign/cam2-6.js b/data/base/script/campaign/cam2-6.js index 27f9ef383a2..2291544770a 100644 --- a/data/base/script/campaign/cam2-6.js +++ b/data/base/script/campaign/cam2-6.js @@ -139,6 +139,10 @@ function eventStartLevel() camCompleteRequiredResearch(mis_collectiveRes, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybc, cTempl.cocybsn, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybr, cTempl.cocybtk, CAM_THE_COLLECTIVE); + camSetEnemyBases({ "COUplinkBase": { cleanup: "uplinkBaseCleanup", @@ -171,7 +175,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybc, cTempl.npcybf, cTempl.cocybag, cTempl.npcybr] + templates: [cTempl.cocybsn, cTempl.cocybth, cTempl.cocybag, cTempl.cocybtk] }, "COCyborgFactory-b1": { assembly: "COCyborgFactory-b1Assembly", @@ -183,7 +187,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.cocybag, cTempl.npcybr] + templates: [cTempl.cocybag, cTempl.cocybtk] }, "COCyborgFactory-b2": { assembly: "COCyborgFactory-b2Assembly", @@ -195,7 +199,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybc, cTempl.npcybf] + templates: [cTempl.cocybsn, cTempl.cocybth] }, "COHeavyFactory-b2L": { assembly: "COHeavyFactory-b2LAssembly", diff --git a/data/base/script/campaign/cam2-7.js b/data/base/script/campaign/cam2-7.js index df034de9b48..b47cb67cdf3 100644 --- a/data/base/script/campaign/cam2-7.js +++ b/data/base/script/campaign/cam2-7.js @@ -127,6 +127,9 @@ function eventStartLevel() camCompleteRequiredResearch(mis_collectiveRes, CAM_THE_COLLECTIVE); camUpgradeOnMapTemplates(cTempl.commc, cTempl.cohact, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybc, cTempl.cocybsn, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybr, cTempl.cocybtk, CAM_THE_COLLECTIVE); camSetEnemyBases({ "COBase1": { @@ -178,7 +181,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybc, cTempl.cocybag] + templates: [cTempl.cocybsn, cTempl.cocybag] }, "COCyborgFac-b3": { assembly: "base3CybAssembly", @@ -190,7 +193,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybf, cTempl.npcybr] + templates: [cTempl.cocybth, cTempl.cocybtk] }, "COHeavyFac-b4": { assembly: "base4HeavyAssembly", @@ -214,7 +217,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.cocybag, cTempl.npcybc, cTempl.npcybr] + templates: [cTempl.cocybag, cTempl.cocybsn, cTempl.cocybtk] }, "COVtolFactory-b4": { assembly: "base4VTOLAssembly", @@ -225,7 +228,7 @@ function eventStartLevel() regroup: false, count: -1, }, - templates: [cTempl.colagv, cTempl.commorv, cTempl.commorvt] + templates: [cTempl.colagv, cTempl.commorv, cTempl.commorvt, cTempl.colhvat] }, }); diff --git a/data/base/script/campaign/cam2-8.js b/data/base/script/campaign/cam2-8.js index cb9033aefac..01b6ea993c2 100644 --- a/data/base/script/campaign/cam2-8.js +++ b/data/base/script/campaign/cam2-8.js @@ -116,6 +116,9 @@ function eventStartLevel() camUpgradeOnMapTemplates(cTempl.commc, cTempl.cohhpv, CAM_THE_COLLECTIVE); camUpgradeOnMapTemplates(cTempl.comtath, cTempl.comltath, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybc, cTempl.cocybsn, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybr, cTempl.cocybtk, CAM_THE_COLLECTIVE); //New AC Tiger tracked units for Hard and Insane difficulty if (difficulty >= HARD) @@ -158,7 +161,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.cocybag, cTempl.npcybr] + templates: [cTempl.cocybag, cTempl.cocybtk] }, "COHeavyFacL-b2": { assembly: "COHeavyFacL-b2Assembly", diff --git a/data/base/script/campaign/cam2-a.js b/data/base/script/campaign/cam2-a.js index bcb29853983..cf08a2291e0 100644 --- a/data/base/script/campaign/cam2-a.js +++ b/data/base/script/campaign/cam2-a.js @@ -154,7 +154,7 @@ function wave2() { const list = [cTempl.colatv, cTempl.colatv]; const ext = { - limit: [4, 4], //paired with list array + limit: [3, 3], //paired with list array alternate: true, altIdx: 0 }; @@ -165,7 +165,7 @@ function wave3() { const list = [cTempl.colcbv, cTempl.colcbv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -176,7 +176,7 @@ function vtolAttack() { const list = [cTempl.colpbv, cTempl.colpbv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -404,7 +404,7 @@ function eventStartLevel() queue("secondVideo", camSecondsToMilliseconds(12)); queue("groupPatrol", camChangeOnDiff(camMinutesToMilliseconds(1))); - queue("vtolAttack", camChangeOnDiff(camMinutesToMilliseconds(6))); + queue("vtolAttack", camChangeOnDiff(camMinutesToMilliseconds(3))); setTimer("truckDefense", camChangeOnDiff(camMinutesToMilliseconds(3))); setTimer("sendCOTransporter", camChangeOnDiff(camMinutesToMilliseconds(4))); setTimer("mapEdgeDroids", camChangeOnDiff(camMinutesToMilliseconds(7))); diff --git a/data/base/script/campaign/cam2-b.js b/data/base/script/campaign/cam2-b.js index 759f245f4c6..8f9128052bd 100644 --- a/data/base/script/campaign/cam2-b.js +++ b/data/base/script/campaign/cam2-b.js @@ -166,6 +166,7 @@ function eventStartLevel() { camUpgradeOnMapTemplates(cTempl.commc, cTempl.commrp, CAM_THE_COLLECTIVE); } + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); // New HMG Tiger Tracks units in first attack group if (difficulty >= HARD) @@ -243,7 +244,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybc, cTempl.npcybr, cTempl.npcybf, cTempl.npcybm] + templates: [cTempl.npcybc, cTempl.npcybr, cTempl.cocybth, cTempl.npcybm] }, "COHeavyFac-b4": { assembly: "COHeavyFac-b4Assembly", @@ -267,7 +268,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybc, cTempl.npcybr, cTempl.npcybf] + templates: [cTempl.npcybc, cTempl.npcybr, cTempl.cocybth] }, }); diff --git a/data/base/script/campaign/cam2-c.js b/data/base/script/campaign/cam2-c.js index e5601c76e28..72a3ecb8433 100644 --- a/data/base/script/campaign/cam2-c.js +++ b/data/base/script/campaign/cam2-c.js @@ -303,6 +303,7 @@ function eventStartLevel() { camUpgradeOnMapTemplates(cTempl.commc, cTempl.commrp, CAM_THE_COLLECTIVE); } + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); camSetEnemyBases({ "COAirBase": { @@ -360,7 +361,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybf, cTempl.npcybc, cTempl.npcybr] + templates: [cTempl.cocybth, cTempl.npcybc, cTempl.npcybr] }, "COCyborgFactoryR": { assembly: "COCyborgFactoryRAssembly", @@ -372,7 +373,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybf, cTempl.npcybc, cTempl.npcybr] + templates: [cTempl.cocybth, cTempl.npcybc, cTempl.npcybr] }, "COVtolFacLeft-Prop": { order: CAM_ORDER_ATTACK, diff --git a/data/base/script/campaign/cam2-d.js b/data/base/script/campaign/cam2-d.js index 696f391101f..0053658ed98 100644 --- a/data/base/script/campaign/cam2-d.js +++ b/data/base/script/campaign/cam2-d.js @@ -42,9 +42,9 @@ function truckDefense() //Attacks every 3 minutes until HQ is destroyed. function wave2() { - const list = [cTempl.colatv, cTempl.colatv]; + const list = [cTempl.colhvat, cTempl.colhvat]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -55,7 +55,7 @@ function wave3() { const list = [cTempl.commorv, cTempl.commorv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -66,7 +66,7 @@ function vtolAttack() { const list = [cTempl.commorvt, cTempl.commorvt]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -135,6 +135,10 @@ function eventStartLevel() camCompleteRequiredResearch(mis_collectiveRes, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybf, cTempl.cocybth, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybc, cTempl.cocybsn, CAM_THE_COLLECTIVE); + camUpgradeOnMapTemplates(cTempl.npcybr, cTempl.cocybtk, CAM_THE_COLLECTIVE); + camSetEnemyBases({ "COSouthEastBase": { cleanup: "baseCleanup", @@ -167,7 +171,7 @@ function eventStartLevel() repair: 40, count: -1, }, - templates: [cTempl.npcybc, cTempl.npcybf, cTempl.npcybr, cTempl.cocybag] + templates: [cTempl.cocybsn, cTempl.cocybth, cTempl.cocybtk, cTempl.cocybag] }, }); diff --git a/data/base/script/campaign/cam2-end.js b/data/base/script/campaign/cam2-end.js index 4fbda8f1c6a..3eba2480e45 100644 --- a/data/base/script/campaign/cam2-end.js +++ b/data/base/script/campaign/cam2-end.js @@ -135,7 +135,7 @@ function vtolAttack() //SouthEast attackers which are mostly cyborgs. function cyborgAttack() { - const list = [cTempl.npcybr, cTempl.cocybag, cTempl.npcybc, cTempl.comhltat, cTempl.cohhpv]; + const list = [cTempl.cocybtk, cTempl.cocybag, cTempl.cocybsn, cTempl.comhltat, cTempl.cohhpv]; camSendReinforcement(CAM_THE_COLLECTIVE, camMakePos(mis_Labels.southCyborgAssembly), randomTemplates(list, false, true), CAM_REINFORCE_GROUND, { data: { regroup: false, count: -1 } @@ -144,7 +144,7 @@ function cyborgAttack() function cyborgAttackRandom() { - const list = [cTempl.npcybr, cTempl.cocybag, cTempl.npcybc, cTempl.npcybc, cTempl.comrotm]; //favor cannon cyborg + const list = [cTempl.cocybtk, cTempl.cocybag, cTempl.cocybsn, cTempl.cocybsn, cTempl.comrotm]; //favor cannon cyborg camSendReinforcement(CAM_THE_COLLECTIVE, camMakePos(camGenerateRandomMapEdgeCoordinate(mis_Labels.startPos)), randomTemplates(list, false, true).concat(cTempl.comsens), CAM_REINFORCE_GROUND, { data: { regroup: false, count: -1 } diff --git a/data/base/script/campaign/cam3-1.js b/data/base/script/campaign/cam3-1.js index 4d1d5da090d..27e9f65316c 100644 --- a/data/base/script/campaign/cam3-1.js +++ b/data/base/script/campaign/cam3-1.js @@ -13,6 +13,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage01", "R-Wpn-Missile-ROF01", "R-Wpn-Missile-Accuracy01", "R-Wpn-Rail-Damage01", "R-Wpn-Rail-ROF01", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage02", "R-Wpn-Energy-ROF01", "R-Wpn-Energy-Accuracy01", + "R-Sys-NEXUSsensor", ]; var launchInfo; var detonateInfo; @@ -64,7 +65,7 @@ function wave2() { const list = [cTempl.nxlscouv, cTempl.nxlscouv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -75,7 +76,7 @@ function wave3() { const list = [cTempl.nxlneedv, cTempl.nxlneedv]; const ext = { - limit: [4, 4], //paired with list array + limit: [3, 3], //paired with list array alternate: true, altIdx: 0 }; @@ -87,7 +88,7 @@ function vtolAttack() { const list = [cTempl.nxmtherv, cTempl.nxmtherv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; diff --git a/data/base/script/campaign/cam3-2.js b/data/base/script/campaign/cam3-2.js index ac602f358aa..a225a3096f7 100644 --- a/data/base/script/campaign/cam3-2.js +++ b/data/base/script/campaign/cam3-2.js @@ -7,7 +7,7 @@ const mis_nexusRes = [ "R-Sys-Engineering03", "R-Defense-WallUpgrade09", "R-Struc-Materials09", "R-Struc-VTOLPad-Upgrade06", "R-Wpn-Bomb-Damage03", "R-Sys-NEXUSrepair", "R-Vehicle-Prop-Hover02", "R-Vehicle-Prop-VTOL02", "R-Cyborg-Legs02", - "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage09", "R-Wpn-Mortar-ROF04", + "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage10", "R-Wpn-Mortar-ROF04", "R-Vehicle-Engine08", "R-Vehicle-Metals08", "R-Vehicle-Armor-Heat05", "R-Cyborg-Metals08", "R-Cyborg-Armor-Heat05", "R-Wpn-RocketSlow-ROF06", "R-Wpn-AAGun-Damage06", "R-Wpn-AAGun-ROF06", "R-Wpn-Howitzer-Damage09", @@ -15,7 +15,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage01", "R-Wpn-Missile-ROF01", "R-Wpn-Missile-Accuracy01", "R-Wpn-Rail-Damage01", "R-Wpn-Rail-ROF01", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", - "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", + "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", "R-Sys-NEXUSsensor", ]; var alphaUnitIDs; var startExtraLoss; diff --git a/data/base/script/campaign/cam3-4.js b/data/base/script/campaign/cam3-4.js index 0ef8bb74994..5d56dc1f948 100644 --- a/data/base/script/campaign/cam3-4.js +++ b/data/base/script/campaign/cam3-4.js @@ -5,7 +5,7 @@ const mis_nexusRes = [ "R-Sys-Engineering03", "R-Defense-WallUpgrade12", "R-Struc-Materials11", "R-Struc-VTOLPad-Upgrade06", "R-Wpn-Bomb-Damage03", "R-Sys-NEXUSrepair", "R-Vehicle-Prop-Hover02", "R-Vehicle-Prop-VTOL02", "R-Cyborg-Legs02", - "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage09", "R-Wpn-Mortar-ROF04", + "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage10", "R-Wpn-Mortar-ROF04", "R-Vehicle-Engine09", "R-Vehicle-Metals11", "R-Vehicle-Armor-Heat08", "R-Cyborg-Metals11", "R-Cyborg-Armor-Heat08", "R-Wpn-RocketSlow-ROF06", "R-Wpn-AAGun-Damage06", "R-Wpn-AAGun-ROF06", "R-Wpn-Howitzer-Damage09", @@ -13,12 +13,12 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage03", "R-Wpn-Missile-ROF03", "R-Wpn-Missile-Accuracy02", "R-Wpn-Rail-Damage03", "R-Wpn-Rail-ROF03", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", - "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", + "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", "R-Sys-NEXUSsensor", ]; function eventDestroyed(obj) { - if (obj.player === CAM_NEXUS && obj.type === STRUCTURE && obj.stattype === HQ) + if (camGetNexusState() && obj.player === CAM_NEXUS && obj.type === STRUCTURE && obj.stattype === HQ) { camSetNexusState(false); removeTimer("nexusHackFeature"); @@ -47,11 +47,11 @@ function nexusHackFeature() switch (difficulty) { - case SUPEREASY: hackFailChance = 90; break; - case EASY: hackFailChance = 80; break; - case MEDIUM: hackFailChance = 70; break; + case SUPEREASY: hackFailChance = 95; break; + case EASY: hackFailChance = 85; break; + case MEDIUM: hackFailChance = 75; break; case HARD: hackFailChance = 65; break; - case INSANE: hackFailChance = 60; break; + case INSANE: hackFailChance = 55; break; default: hackFailChance = 70; } @@ -66,7 +66,17 @@ function nexusHackFeature() // A little suprise absorbption attack when discovering the SW base. function takeoverChanceAttack() { - const CHANCE = (difficulty === INSANE) ? 10 : 5; + let chance = 0; + switch (difficulty) + { + case SUPEREASY: chance = 1; break; + case EASY: chance = 3; break; + case MEDIUM: chance = 5; break; + case HARD: chance = 7; break; + case INSANE: chance = 9; break; + default: chance = 5; + } + const objects = enumArea(0, 0, mapWidth, mapHeight, CAM_HUMAN_PLAYER, false).filter((obj) => ( (obj.type !== DROID) || (obj.type === DROID && obj.droidType !== DROID_SUPERTRANSPORTER) )); @@ -74,7 +84,11 @@ function takeoverChanceAttack() for (let i = 0, len = objects.length; i < len; ++i) { const obj = objects[i]; - if (camRand(100) < CHANCE) + if (obj.type === DROID && obj.droidType === DROID_COMMAND) + { + continue; //A little too hectic to take a Commander immediately. + } + if (camRand(100) < chance) { if (obj.type === STRUCTURE && obj.stattype === WALL) { @@ -88,26 +102,23 @@ function takeoverChanceAttack() } } -//Destroy some VTOLs initially. function destroyPlayerVtols() { - let vtolBlowupAmount = 0; - const vtols = enumArea(0, 0, mapWidth, mapHeight, CAM_HUMAN_PLAYER, false).filter((obj) => ( - (obj.type === DROID) && (obj.droidType !== DROID_SUPERTRANSPORTER) && isVTOL(obj) - )); - - switch (difficulty) + const hq = getObject("NX-HQ"); + if (hq === null) { - case MEDIUM: vtolBlowupAmount = 0.5; break; - case HARD: vtolBlowupAmount = 0.65; break; - case INSANE: vtolBlowupAmount = 0.8; break; - default: vtolBlowupAmount = 0.5; + removeTimer("destroyPlayerVtols"); + return; } - - for (let i = 0, len = Math.floor(vtolBlowupAmount * vtols.length); i < len; ++i) + const __SCAN_RADIUS = 11; + const objects = enumRange(hq.x, hq.y, __SCAN_RADIUS, CAM_HUMAN_PLAYER, false); + for (let i = 0, len = objects.length; i < len; ++i) { - const vtol = vtols[i]; - camSafeRemoveObject(vtol, true); + const obj = objects[i]; + if (obj.type === DROID && isVTOL(obj)) + { + camSafeRemoveObject(obj, true); + } } } @@ -116,21 +127,19 @@ function activateNexus() camSetExtraObjectiveMessage(_("Destroy the Nexus HQ to disable the Nexus Intruder Program")); playSound(cam_sounds.nexus.synapticLinksActivated); camSetNexusState(true); - setTimer("nexusHackFeature", camSecondsToMilliseconds((difficulty <= MEDIUM) ? 20 : 10)); + setTimer("nexusHackFeature", camSecondsToMilliseconds((difficulty <= EASY) ? 20 : 10)); + setTimer("destroyPlayerVtols", camSecondsToMilliseconds(0.2)); } function camEnemyBaseDetected_NX_SWBase() { - camPlayVideos({video: "MB3_4_MSG4", type: MISS_MSG}); - //Do these before Nexus state activation to prevent sound spam. - if (difficulty >= MEDIUM) - { - queue("destroyPlayerVtols", camSecondsToMilliseconds(0.2)); - } - if (difficulty >= HARD) + if (getObject("NX-HQ") === null) { - queue("takeoverChanceAttack", camSecondsToMilliseconds(0.5)); + return; //Probably destroyed through cheats? } + camPlayVideos({video: "MB3_4_MSG4", type: MISS_MSG}); + //Do these before Nexus state activation to prevent sound spam. + queue("takeoverChanceAttack", camSecondsToMilliseconds(0.5)); queue("activateNexus", camSecondsToMilliseconds(1)); } diff --git a/data/base/script/campaign/cam3-a.js b/data/base/script/campaign/cam3-a.js index 09d0d30c10e..88b8c65cd0b 100644 --- a/data/base/script/campaign/cam3-a.js +++ b/data/base/script/campaign/cam3-a.js @@ -181,7 +181,7 @@ function wave2() { const list = [cTempl.nxlscouv, cTempl.nxlscouv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -192,7 +192,7 @@ function wave3() { const list = [cTempl.nxlneedv, cTempl.nxlneedv]; const ext = { - limit: [4, 4], //paired with list array + limit: [3, 3], //paired with list array alternate: true, altIdx: 0 }; @@ -204,7 +204,7 @@ function vtolAttack() { const list = [cTempl.nxmtherv, cTempl.nxmtherv]; const ext = { - limit: [4, 4], //paired with list array + limit: [2, 2], //paired with list array alternate: true, altIdx: 0 }; @@ -261,6 +261,7 @@ function cam3Setup() "R-Wpn-Missile-Damage01", "R-Wpn-Missile-ROF01", "R-Wpn-Missile-Accuracy01", "R-Wpn-Rail-Damage01", "R-Wpn-Rail-ROF01", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage02", "R-Wpn-Energy-ROF01", "R-Wpn-Energy-Accuracy01", + "R-Sys-NEXUSsensor", ]; for (let x = 0, l = mis_structsAlpha.length; x < l; ++x) diff --git a/data/base/script/campaign/cam3-ab.js b/data/base/script/campaign/cam3-ab.js index a58da01e99b..67b4d91dc88 100644 --- a/data/base/script/campaign/cam3-ab.js +++ b/data/base/script/campaign/cam3-ab.js @@ -5,7 +5,7 @@ const mis_nexusRes = [ "R-Sys-Engineering03", "R-Defense-WallUpgrade09", "R-Struc-Materials09", "R-Struc-VTOLPad-Upgrade06", "R-Wpn-Bomb-Damage03", "R-Sys-NEXUSrepair", "R-Vehicle-Prop-Hover02", "R-Vehicle-Prop-VTOL02", "R-Cyborg-Legs02", - "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage09", "R-Wpn-Mortar-ROF04", + "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage10", "R-Wpn-Mortar-ROF04", "R-Vehicle-Engine08", "R-Vehicle-Metals08", "R-Vehicle-Armor-Heat05", "R-Cyborg-Metals08", "R-Cyborg-Armor-Heat05", "R-Wpn-RocketSlow-ROF06", "R-Wpn-AAGun-Damage06", "R-Wpn-AAGun-ROF06", "R-Wpn-Howitzer-Damage09", @@ -13,7 +13,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage01", "R-Wpn-Missile-ROF01", "R-Wpn-Missile-Accuracy01", "R-Wpn-Rail-Damage01", "R-Wpn-Rail-ROF01", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", - "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", + "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", "R-Sys-NEXUSsensor", ]; var hackFailChance; //chance the Nexus Intruder Program will fail var winFlag; diff --git a/data/base/script/campaign/cam3-ad1.js b/data/base/script/campaign/cam3-ad1.js index 0e9bcf3d0df..46e4eae777f 100644 --- a/data/base/script/campaign/cam3-ad1.js +++ b/data/base/script/campaign/cam3-ad1.js @@ -6,7 +6,7 @@ const mis_nexusRes = [ "R-Sys-Engineering03", "R-Defense-WallUpgrade12", "R-Struc-Materials10", "R-Struc-VTOLPad-Upgrade06", "R-Wpn-Bomb-Damage03", "R-Sys-NEXUSrepair", "R-Vehicle-Prop-Hover02", "R-Vehicle-Prop-VTOL02", "R-Cyborg-Legs02", - "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage09", "R-Wpn-Mortar-ROF04", + "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage10", "R-Wpn-Mortar-ROF04", "R-Vehicle-Engine09", "R-Vehicle-Metals10", "R-Vehicle-Armor-Heat07", "R-Cyborg-Metals10", "R-Cyborg-Armor-Heat07", "R-Wpn-RocketSlow-ROF06", "R-Wpn-AAGun-Damage06", "R-Wpn-AAGun-ROF06", "R-Wpn-Howitzer-Damage09", @@ -14,7 +14,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage03", "R-Wpn-Missile-ROF03", "R-Wpn-Missile-Accuracy02", "R-Wpn-Rail-Damage03", "R-Wpn-Rail-ROF03", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", - "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", + "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", "R-Sys-NEXUSsensor", ]; var capturedSilos; // victory flag letting us know if we captured any silos. var mapLimit; //LasSat slowly creeps toward missile silos. diff --git a/data/base/script/campaign/cam3-ad2.js b/data/base/script/campaign/cam3-ad2.js index d7c81fe2aa7..78548c56604 100644 --- a/data/base/script/campaign/cam3-ad2.js +++ b/data/base/script/campaign/cam3-ad2.js @@ -6,7 +6,7 @@ const mis_nexusRes = [ "R-Sys-Engineering03", "R-Defense-WallUpgrade12", "R-Struc-Materials10", "R-Struc-VTOLPad-Upgrade06", "R-Wpn-Bomb-Damage03", "R-Sys-NEXUSrepair", "R-Vehicle-Prop-Hover02", "R-Vehicle-Prop-VTOL02", "R-Cyborg-Legs02", - "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage09", "R-Wpn-Mortar-ROF04", + "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage10", "R-Wpn-Mortar-ROF04", "R-Vehicle-Engine09", "R-Vehicle-Metals10", "R-Vehicle-Armor-Heat07", "R-Cyborg-Metals10", "R-Cyborg-Armor-Heat07", "R-Wpn-RocketSlow-ROF06", "R-Wpn-AAGun-Damage06", "R-Wpn-AAGun-ROF06", "R-Wpn-Howitzer-Damage09", @@ -14,7 +14,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage03", "R-Wpn-Missile-ROF03", "R-Wpn-Missile-Accuracy02", "R-Wpn-Rail-Damage03", "R-Wpn-Rail-ROF03", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", - "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", + "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", "R-Sys-NEXUSsensor", ]; const mis_vtolPositions = [ "vtolAppearPosW", "vtolAppearPosE", diff --git a/data/base/script/campaign/cam3-b.js b/data/base/script/campaign/cam3-b.js index 4562d006975..923fcd23671 100644 --- a/data/base/script/campaign/cam3-b.js +++ b/data/base/script/campaign/cam3-b.js @@ -18,6 +18,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage01", "R-Wpn-Missile-ROF01", "R-Wpn-Missile-Accuracy01", "R-Wpn-Rail-Damage01", "R-Wpn-Rail-ROF01", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", + "R-Sys-NEXUSsensor", ]; //Remove Nexus VTOL droids. diff --git a/data/base/script/campaign/cam3-c.js b/data/base/script/campaign/cam3-c.js index e6281ca57bb..74a7dae730e 100644 --- a/data/base/script/campaign/cam3-c.js +++ b/data/base/script/campaign/cam3-c.js @@ -7,7 +7,7 @@ const mis_nexusRes = [ "R-Sys-Engineering03", "R-Defense-WallUpgrade09", "R-Struc-Materials09", "R-Struc-VTOLPad-Upgrade06", "R-Wpn-Bomb-Damage03", "R-Sys-NEXUSrepair", "R-Vehicle-Prop-Hover02", "R-Vehicle-Prop-VTOL02", "R-Cyborg-Legs02", - "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage09", "R-Wpn-Mortar-ROF04", + "R-Wpn-Mortar-Acc03", "R-Wpn-MG-Damage10", "R-Wpn-Mortar-ROF04", "R-Vehicle-Engine08", "R-Vehicle-Metals09", "R-Vehicle-Armor-Heat06", "R-Cyborg-Metals09", "R-Cyborg-Armor-Heat06", "R-Wpn-RocketSlow-ROF06", "R-Wpn-AAGun-Damage06", "R-Wpn-AAGun-ROF06", "R-Wpn-Howitzer-Damage09", @@ -15,7 +15,7 @@ const mis_nexusRes = [ "R-Wpn-Missile-Damage02", "R-Wpn-Missile-ROF02", "R-Wpn-Missile-Accuracy02", "R-Wpn-Rail-Damage02", "R-Wpn-Rail-ROF02", "R-Wpn-Rail-Accuracy01", "R-Wpn-Energy-Damage03", "R-Wpn-Energy-ROF03", "R-Wpn-Energy-Accuracy01", - "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", + "R-Wpn-AAGun-Accuracy03", "R-Wpn-Howitzer-Accuracy03", "R-Sys-NEXUSsensor", ]; var reunited; var betaUnitIds; diff --git a/data/base/script/campaign/libcampaign.js b/data/base/script/campaign/libcampaign.js index cadaadf3a8c..539bf9744c1 100644 --- a/data/base/script/campaign/libcampaign.js +++ b/data/base/script/campaign/libcampaign.js @@ -279,7 +279,7 @@ var __camPropulsionTypeLimit; //research const __CAM_AI_INSTANT_PRODUCTION_RESEARCH = "R-Struc-Factory-Upgrade-AI"; const __cam_nexusTech = [ - "R-Sys-NEXUSrepair" + "R-Sys-NEXUSrepair", "R-Sys-NEXUSsensor" ]; //tactics diff --git a/data/base/script/campaign/libcampaign_includes/misc.js b/data/base/script/campaign/libcampaign_includes/misc.js index fda4a43cf8f..1b66fffc387 100644 --- a/data/base/script/campaign/libcampaign_includes/misc.js +++ b/data/base/script/campaign/libcampaign_includes/misc.js @@ -712,3 +712,19 @@ function camSetDroidExperience(droid) setDroidExperience(droid, exp); } + +// Only to prevent prebuilt units from team Gamma on Gamma 6 from having the NavGunSensor. +function __camRemoveNavGunSensorResearch() +{ + if (camDiscoverCampaign() !== __CAM_GAMMA_CAMPAIGN_NUMBER) + { + return; + } + for (let i = 0; i < __CAM_MAX_PLAYERS; ++i) + { + if (i !== CAM_NEXUS && getResearch("R-Sys-NEXUSsensor", i).done) + { + completeResearch("R-Sys-NEXUSsensorUndo", i, true); + } + } +} diff --git a/data/base/script/campaign/libcampaign_includes/victory.js b/data/base/script/campaign/libcampaign_includes/victory.js index 677ed0f6a8f..01365d7ee0c 100644 --- a/data/base/script/campaign/libcampaign_includes/victory.js +++ b/data/base/script/campaign/libcampaign_includes/victory.js @@ -32,6 +32,7 @@ function camNextLevel(nextLevel) setPowerModifier(100); } } + __camRemoveNavGunSensorResearch(); camBreakAlliances(); //Set these limits again for the home map before exiting this mission setStructureLimits(cam_base_structures.commandCenter, 1, CAM_HUMAN_PLAYER); @@ -60,7 +61,6 @@ function camNextLevel(nextLevel) //;; * `false` means instant defeat ("objective failed"), //;; * `true` means victory as long as other standard victory conditions are met, //;; * `undefined` means suppress other victory checks ("clearly not won yet"). -//;; * `victoryVideo` Pass in the name of a video string here and it will be played before attempting to load the next level. //;; For offworld victory, some more extra data parameters can be defined: //;; * `retlz` Force the player to return to the LZ area: //;; * `false` mission does not require a LZ return, @@ -186,10 +186,6 @@ function __camGameLost() function __camGameWon() { __camLevelEnded = true; - if (camDef(__camVictoryData) && camDef(__camVictoryData.victoryVideo)) - { - camPlayVideos(__camVictoryData.victoryVideo); - } if (camDef(__camNextLevel)) { diff --git a/data/base/script/campaign/templates.js b/data/base/script/campaign/templates.js index 9ee60ab04c1..d86dd308915 100644 --- a/data/base/script/campaign/templates.js +++ b/data/base/script/campaign/templates.js @@ -154,10 +154,13 @@ const tWeap = { assaultGun: "CyborgRotMG", //Flamer flamer: "CyborgFlamer01", + thermite: "CyborgFlamer02", //Cannon lightCannon: "CyborgCannon", + sniperCannon: "CyborgCannon02", //Rocket lancer: "CyborgRocket", + tankKiller: "CyborgRocket02", //Laser flashlight: "Cyb-Wpn-Laser", nexusFlashlight: "NX-CyborgPulseLas", @@ -303,6 +306,7 @@ prrept: { body: tBody.tank.cobra, prop: tProp.tank.tracks, weap: tRepair.lightRe // CAM_2_B comatt: { body: tBody.tank.panther, prop: tProp.tank.tracks, weap: tWeap.tank.lancer }, comit: { body: tBody.tank.panther, prop: tProp.tank.tracks, weap: tWeap.tank.inferno }, +cocybth: { body: tBody.cyborg.lightBody, prop: tProp.cyborg.legs, weap: tWeap.cyborg.thermite }, // SUB_2_2 comtath: { body: tBody.tank.panther, prop: tProp.tank.hover, weap: tWeap.tank.lancer }, @@ -323,6 +327,9 @@ comhltat: { body: tBody.tank.panther, prop: tProp.tank.tracks, weap: tWeap.tank. commorvt: { body: tBody.tank.panther, prop: tProp.air.vtol, weap: tWeap.air.thermiteBomb }, cohhpv: { body: tBody.tank.tiger, prop: tProp.tank.tracks, weap: tWeap.tank.hyperVelocityCannon }, comagt: { body: tBody.tank.panther, prop: tProp.tank.tracks, weap: tWeap.tank.assaultGun }, +cocybsn: { body: tBody.cyborg.lightBody, prop: tProp.cyborg.legs, weap: tWeap.cyborg.sniperCannon }, +cocybtk: { body: tBody.cyborg.lightBody, prop: tProp.cyborg.legs, weap: tWeap.cyborg.tankKiller }, +colhvat: { body: tBody.tank.leopard, prop: tProp.air.vtol, weap: tWeap.air.tankKiller }, // SUB_2_6 cohact: { body: tBody.tank.tiger, prop: tProp.tank.tracks, weap: tWeap.tank.assaultCannon }, diff --git a/data/base/script/campaign/transitionTech.js b/data/base/script/campaign/transitionTech.js index b2da90865f6..64cb4f0d2a4 100644 --- a/data/base/script/campaign/transitionTech.js +++ b/data/base/script/campaign/transitionTech.js @@ -94,7 +94,7 @@ const mis_betaResearchNew = [ "R-Wpn-RocketSlow-ROF01", "R-Defense-HvyFlamer", "R-Vehicle-Metals04", "R-Wpn-Cannon-Damage05", "R-Wpn-MG-Damage06", "R-Wpn-Rocket-Damage05", "R-Wpn-RocketSlow-Damage05", "R-Cyborg-Metals04", "R-Wpn-Flamer-Damage06", - "R-Wpn-Mortar-Damage04", "R-Defense-WallUpgrade05", + "R-Wpn-Mortar-Damage04", "R-Defense-WallUpgrade05", "R-Cyborg-Wpn-Flamer02", // 4 "R-Wpn-RocketSlow-Accuracy03", "R-Wpn-AAGun-Accuracy01", "R-Wpn-Mortar-Acc02", @@ -124,6 +124,7 @@ const mis_betaResearchNew = [ "R-Defense-Emplacement-HPVcannon", "R-Defense-HvyA-Trocket", "R-Defense-RotMor", "R-Defense-WallTower-HPVcannon", "R-Defense-WallTower-HvyA-Trocket", "R-Sys-VTOLCBS-Turret01", "R-Wpn-Mortar-ROF03", "R-Wpn-Mortar-Damage06", "R-Wpn-AAGun04", "R-Defense-AASite-QuadRotMg", + "R-Cyborg-Wpn-Cannon02", "R-Cyborg-Wpn-Rocket02", // 9 "R-Wpn-Cannon5", "R-Wpn-RocketSlow-Damage06", "R-Defense-Wall-VulcanCan", @@ -164,7 +165,7 @@ const mis_gammaResearchNew = [ // 4 "R-Wpn-Cannon-ROF05", "R-Wpn-Cannon-ROF06", "R-Wpn-Cannon-Damage09", "R-Wpn-AAGun-Damage06", "R-Wpn-Howitzer-Damage06", "R-Wpn-AAGun-ROF05", "R-Wpn-AAGun-ROF06", "R-Wpn-RocketSlow-ROF05", - "R-Wpn-RocketSlow-ROF06", + "R-Wpn-RocketSlow-ROF06", "R-Wpn-MG-Damage10", // 5 "R-Sys-Resistance-Upgrade01", "R-Sys-Resistance-Upgrade02", "R-Sys-Resistance-Upgrade03", diff --git a/data/base/stats/research.json b/data/base/stats/research.json index 2495649d0f5..eb8e5804b04 100644 --- a/data/base/stats/research.json +++ b/data/base/stats/research.json @@ -1146,6 +1146,24 @@ ], "statID": "Cannon1Mk1" }, + "R-Cyborg-Wpn-Cannon02": { + "iconID": "IMAGE_RES_CYBORGTECH", + "id": "R-Cyborg-Wpn-Cannon02", + "msgName": "RES_CYW_CN2", + "name": "Sniper Cyborg", + "replacedComponents": [ + "CyborgCannon:CyborgCannon02" + ], + "requiredResearch": [ + "R-Wpn-Cannon4AMk1" + ], + "researchPoints": 4000, + "researchPower": 125, + "resultComponents": [ + "CyborgCannon02" + ], + "statID": "Cannon4AUTOMk1" + }, "R-Cyborg-Wpn-Flamer": { "iconID": "IMAGE_RES_CYBORGTECH", "id": "R-Cyborg-Wpn-Flamer", @@ -1162,6 +1180,24 @@ ], "statID": "Flame1Mk1" }, + "R-Cyborg-Wpn-Flamer02": { + "iconID": "IMAGE_RES_CYBORGTECH", + "id": "R-Cyborg-Wpn-Flamer02", + "msgName": "RES_CYW_FL2", + "name": "Thermite Cyborg", + "replacedComponents": [ + "CyborgFlamer01:CyborgFlamer02" + ], + "requiredResearch": [ + "R-Wpn-Flame2" + ], + "researchPoints": 3600, + "researchPower": 112, + "resultComponents": [ + "CyborgFlamer02" + ], + "statID": "Flame2" + }, "R-Cyborg-Wpn-MG": { "iconID": "IMAGE_RES_CYBORGTECH", "id": "R-Cyborg-Wpn-MG", @@ -1195,6 +1231,24 @@ ], "statID": "Rocket-LtA-T" }, + "R-Cyborg-Wpn-Rocket02": { + "iconID": "IMAGE_RES_CYBORGTECH", + "id": "R-Cyborg-Wpn-Rocket02", + "msgName": "RES_CYW_RK2", + "name": "Tank Killer Cyborg", + "replacedComponents": [ + "CyborgRocket:CyborgRocket02" + ], + "requiredResearch": [ + "R-Wpn-Rocket07-Tank-Killer" + ], + "researchPoints": 5000, + "researchPower": 156, + "resultComponents": [ + "CyborgRocket02" + ], + "statID": "Rocket-HvyA-T" + }, "R-Cyborg-Wpn-RotMG": { "iconID": "IMAGE_RES_CYBORGTECH", "id": "R-Cyborg-Wpn-RotMG", @@ -1219,7 +1273,7 @@ "msgName": "RES_CYW_ATM", "name": "Scourge Cyborg", "replacedComponents": [ - "CyborgRocket:Cyb-Wpn-Atmiss" + "CyborgRocket02:Cyb-Wpn-Atmiss" ], "requiredResearch": [ "R-Wpn-Missile2A-T" @@ -1236,10 +1290,6 @@ "id": "R-Cyborg-Wpn-Laser1", "msgName": "RES_CYW_LS1", "name": "Flashlight Gunner Cyborg", - "replacedComponents": [ - "CyborgRotMG:Cyb-Wpn-Laser", - "CyborgFlamer01:Cyb-Wpn-Laser" - ], "requiredResearch": [ "R-Wpn-Laser01" ], @@ -1256,7 +1306,7 @@ "msgName": "RES_CYW_RL1", "name": "Needle Gunner Cyborg", "replacedComponents": [ - "CyborgCannon:Cyb-Wpn-Rail1" + "CyborgCannon02:Cyb-Wpn-Rail1" ], "requiredResearch": [ "R-Wpn-RailGun01" @@ -6639,7 +6689,9 @@ "msgName": "RES_EMP_PulseLas", "name": "Pulse Laser Emplacement", "redStructures": [ - "Emplacement-PrisLas" + "Emplacement-PrisLas", + "Tower-Projector", + "Wall-RotMg" ], "requiredResearch": [ "R-Wpn-Laser02", @@ -6784,9 +6836,6 @@ "id": "R-Defense-WallTower-PulseLas", "msgName": "RES_WT14_PLS", "name": "Flashlight Hardpoint", - "redStructures": [ - "Wall-RotMg" - ], "requiredResearch": [ "R-Wpn-Laser01" ], @@ -7351,6 +7400,27 @@ ], "techCode": 1 }, + "R-Sys-NEXUSsensor": { + "id": "R-Sys-NEXUSsensor", + "keyTopic": 1, + "name": "*R-Sys-NEXUSsensor*", + "replacedComponents": [ + "ZNULLSENSOR:NavGunSensor" + ], + "resultComponents": [ + "NavGunSensor" + ], + "techCode": 1 + }, + "R-Sys-NEXUSsensorUndo": { + "id": "R-Sys-NEXUSsensorUndo", + "keyTopic": 1, + "name": "*R-Sys-NEXUSsensorUndo*", + "replacedComponents": [ + "NavGunSensor:ZNULLSENSOR" + ], + "techCode": 1 + }, "R-Sys-Resistance": { "iconID": "IMAGE_RES_SYSTEMTECH", "id": "R-Sys-Resistance", @@ -8628,10 +8698,6 @@ "keyTopic": 1, "msgName": "RES_W_LAS1", "name": "Laser - Flashlight", - "redComponents": [ - "MG4ROTARY-VTOL", - "MG4ROTARYMk1" - ], "researchPoints": 14400, "researchPower": 450, "resultComponents": [ @@ -8648,7 +8714,14 @@ "name": "Pulse Laser", "redComponents": [ "Laser3BEAM-VTOL", - "Laser3BEAMMk1" + "Laser3BEAMMk1", + "MG4ROTARY-VTOL", + "MG4ROTARYMk1", + "Flame2" + ], + "replacedComponents": [ + "CyborgRotMG:Cyb-Wpn-Laser", + "CyborgFlamer02:Cyb-Wpn-Laser" ], "requiredResearch": [ "R-Wpn-Laser01" @@ -8707,6 +8780,29 @@ "subgroupIconID": "IMAGE_RES_GRPDAM", "techCode": 1 }, + "R-Wpn-MG-Damage10": { + "iconID": "IMAGE_RES_WEAPONTECH", + "id": "R-Wpn-MG-Damage10", + "name": "Depleted Uranium MG Bullets Mk3", + "requiredResearch": [ + "R-Wpn-MG-Damage09", + "R-Wpn-Cannon-Damage09" + ], + "researchPoints": 11600, + "researchPower": 362, + "results": [ + { + "class": "Weapon", + "filterParameter": "ImpactClass", + "filterValue": "MACHINE GUN", + "parameter": "Damage", + "value": 30 + } + ], + "statID": "MG1Mk1", + "subgroupIconID": "IMAGE_RES_GRPDAM", + "techCode": 1 + }, "R-Wpn-MdArtMissile": { "iconID": "IMAGE_RES_WEAPONTECH", "id": "R-Wpn-MdArtMissile", diff --git a/data/base/stats/templates.json b/data/base/stats/templates.json index cc71849541d..d11a6f54524 100644 --- a/data/base/stats/templates.json +++ b/data/base/stats/templates.json @@ -662,6 +662,17 @@ "CyborgCannon" ] }, + "CyborgCannon02Grd": { + "available": true, + "body": "CyborgLightBody", + "id": "Cyb-Cannon02-GROUND", + "name": "Sniper Cyborg", + "propulsion": "CyborgLegs", + "type": "CYBORG", + "weapons": [ + "CyborgCannon02" + ] + }, "CyborgChain01Ground": { "available": true, "body": "CyborgLightBody", @@ -684,6 +695,17 @@ "CyborgFlamer01" ] }, + "CyborgFlamer02Grd": { + "available": true, + "body": "CyborgLightBody", + "id": "Cyb-Flamer02-GROUND", + "name": "Thermite Cyborg", + "propulsion": "CyborgLegs", + "type": "CYBORG", + "weapons": [ + "CyborgFlamer02" + ] + }, "Cyb-Laser1-GROUND": { "available": true, "body": "CyborgLightBody", @@ -717,6 +739,17 @@ "CyborgRocket" ] }, + "CyborgRkt02Ground": { + "available": true, + "body": "CyborgLightBody", + "id": "Cyb-Rocket02-GROUND", + "name": "Tank Killer Cyborg", + "propulsion": "CyborgLegs", + "type": "CYBORG", + "weapons": [ + "CyborgRocket02" + ] + }, "Cyb-Rocket-GROUND": { "available": false, "body": "CyborgLightBody", diff --git a/data/base/stats/weapons.json b/data/base/stats/weapons.json index 9046a7779e3..859324b261f 100644 --- a/data/base/stats/weapons.json +++ b/data/base/stats/weapons.json @@ -1319,7 +1319,7 @@ "Cyb-Wpn-Atmiss": { "buildPoints": 1000, "buildPower": 250, - "damage": 430, + "damage": 440, "effectSize": 50, "explosionWav": "smlexpl.ogg", "facePlayer": 1, @@ -1358,7 +1358,7 @@ "Cyb-Wpn-Laser": { "buildPoints": 600, "buildPower": 150, - "damage": 156, + "damage": 176, "effectSize": 100, "explosionWav": "lsrexpl.ogg", "facePlayer": 1, @@ -1395,7 +1395,7 @@ "Cyb-Wpn-Rail1": { "buildPoints": 800, "buildPower": 200, - "damage": 200, + "damage": 210, "effectSize": 100, "explosionWav": "gaussgun.ogg", "facePlayer": 1, @@ -1432,11 +1432,11 @@ "CyborgCannon": { "buildPoints": 240, "buildPower": 60, - "damage": 20, - "effectSize": 25, + "damage": 42, + "effectSize": 50, "explosionWav": "smlexpl.ogg", "facePlayer": 1, - "firePause": 10, + "firePause": 20, "flightGfx": "FXcam20.PIE", "flightSpeed": 1000, "hitGfx": "FXGRDexl.PIE", @@ -1456,6 +1456,8 @@ "name": "Heavy Gunner", "numExplosions": 2, "radius": 64, + "radiusDamage": 10, + "radiusLife": 100, "recoilValue": 100, "rotate": 180, "shortHit": 70, @@ -1467,10 +1469,50 @@ "weaponWav": "smlcan.ogg", "weight": 120 }, + "CyborgCannon02": { + "buildPoints": 500, + "buildPower": 130, + "damage": 67, + "effectSize": 50, + "explosionWav": "smlexpl.ogg", + "facePlayer": 1, + "firePause": 20, + "flightGfx": "FXcam20.PIE", + "flightSpeed": 1800, + "hitGfx": "FXGRDexl.PIE", + "hitpoints": 50, + "id": "CyborgCannon02", + "lightWorld": 1, + "longHit": 70, + "longRange": 1024, + "maxElevation": 90, + "minElevation": -60, + "minimumDamage": 33, + "missGfx": "FXGRDexl.PIE", + "model": "cy_CAN.pie", + "mountModel": "Cybody.pie", + "movement": "DIRECT", + "muzzleGfx": "FXCan20A.PIE", + "name": "Sniper Cyborg", + "numExplosions": 2, + "radius": 64, + "radiusDamage": 12, + "radiusLife": 100, + "recoilValue": 100, + "rotate": 180, + "shortHit": 50, + "shortRange": 512, + "waterGfx": "FXSSplsh.PIE", + "weaponClass": "KINETIC", + "weaponEffect": "ALL ROUNDER", + "weaponSubClass": "CANNON", + "weaponWav": "hivelcan.ogg", + "weight": 120 + }, "CyborgChaingun": { "buildPoints": 160, "buildPower": 40, - "damage": 18, + "damage": 20, "effectSize": 100, "facePlayer": 1, "firePause": 7, @@ -1505,7 +1547,7 @@ "CyborgFlamer01": { "buildPoints": 200, "buildPower": 50, - "damage": 12, + "damage": 14, "effectSize": 100, "facePlayer": 1, "firePause": 22, @@ -1529,8 +1571,8 @@ "name": "Cyborg Flamer", "NoFriendlyFire": 1, "numExplosions": 1, - "periodicalDamage": 10, - "periodicalDamageRadius": 32, + "periodicalDamage": 16, + "periodicalDamageRadius": 64, "periodicalDamageTime": 50, "rotate": 180, "shortHit": 90, @@ -1542,10 +1584,50 @@ "weaponWav": "flmthrow.ogg", "weight": 120 }, + "CyborgFlamer02": { + "buildPoints": 300, + "buildPower": 75, + "damage": 42, + "effectSize": 100, + "facePlayer": 1, + "firePause": 50, + "flightGfx": "FXLThrow.PIE", + "flightSpeed": 800, + "hitGfx": "FXMETHIT.PIE", + "hitpoints": 20, + "id": "CyborgFlamer02", + "lightWorld": 1, + "longHit": 50, + "longRange": 576, + "maxElevation": 90, + "minElevation": -60, + "minRange": 64, + "minimumDamage": 33, + "missGfx": "FXMETHIT.PIE", + "model": "cy_flame.pie", + "mountModel": "Cybody.pie", + "movement": "DIRECT", + "muzzleGfx": "FXCan20m.PIE", + "name": "Cyborg Thermite", + "NoFriendlyFire": 1, + "numExplosions": 1, + "periodicalDamage": 22, + "periodicalDamageRadius": 64, + "periodicalDamageTime": 60, + "rotate": 180, + "shortHit": 75, + "shortRange": 384, + "waterGfx": "FXMETHIT.PIE", + "weaponClass": "HEAT", + "weaponEffect": "FLAMER", + "weaponSubClass": "FLAME", + "weaponWav": "flmthrow.ogg", + "weight": 120 + }, "CyborgRocket": { - "buildPoints": 500, - "buildPower": 125, - "damage": 120, + "buildPoints": 400, + "buildPower": 110, + "damage": 123, "effectSize": 25, "explosionWav": "lrgexpl.ogg", "faceInFlight": 1, @@ -1582,10 +1664,50 @@ "weaponWav": "rocket.ogg", "weight": 120 }, + "CyborgRocket02": { + "buildPoints": 700, + "buildPower": 160, + "damage": 188, + "effectSize": 75, + "explosionWav": "lrgexpl.ogg", + "faceInFlight": 1, + "facePlayer": 1, + "firePause": 80, + "flags": "ShootAir", + "flightGfx": "fxmflare.PIE", + "flightSpeed": 1000, + "hitGfx": "fxmexp.PIE", + "hitpoints": 50, + "id": "CyborgRocket02", + "lightWorld": 1, + "longHit": 60, + "longRange": 1024, + "maxElevation": 90, + "minElevation": -60, + "minRange": 128, + "minimumDamage": 33, + "missGfx": "fxmexp.PIE", + "model": "cy_rkt.PIE", + "mountModel": "cybody.PIE", + "movement": "DIRECT", + "muzzleGfx": "FXLRocPd.PIE", + "name": "Cyborg Tank Killer", + "numExplosions": 2, + "radiusLife": 10, + "rotate": 180, + "shortHit": 65, + "shortRange": 512, + "waterGfx": "fxssplsh.PIE", + "weaponClass": "KINETIC", + "weaponEffect": "ANTI TANK", + "weaponSubClass": "SLOW ROCKET", + "weaponWav": "rocket.ogg", + "weight": 120 + }, "CyborgRotMG": { "buildPoints": 270, "buildPower": 90, - "damage": 20, + "damage": 22, "effectSize": 100, "facePlayer": 1, "firePause": 5, @@ -1915,7 +2037,7 @@ "Laser2PULSE-VTOL": { "buildPoints": 800, "buildPower": 200, - "damage": 312, + "damage": 436, "designable": 1, "effectSize": 100, "explosionWav": "lsrexpl.ogg", @@ -1992,7 +2114,7 @@ "Laser3BEAM-VTOL": { "buildPoints": 600, "buildPower": 150, - "damage": 156, + "damage": 218, "designable": 1, "effectSize": 100, "explosionWav": "lsrexpl.ogg", @@ -2824,7 +2946,7 @@ "Missile-VTOL-AT": { "buildPoints": 1200, "buildPower": 300, - "damage": 430, + "damage": 571, "designable": 1, "effectSize": 50, "explosionWav": "smlexpl.ogg", @@ -3027,7 +3149,7 @@ "NX-Cyb-Rail1": { "buildPoints": 800, "buildPower": 200, - "damage": 200, + "damage": 210, "effectSize": 100, "explosionWav": "smlexpl.ogg", "facePlayer": 1, @@ -3063,7 +3185,7 @@ "NX-CyborgChaingun": { "buildPoints": 50, "buildPower": 10, - "damage": 20, + "damage": 22, "effectSize": 100, "facePlayer": 1, "firePause": 5, @@ -3098,7 +3220,7 @@ "NX-CyborgMiss": { "buildPoints": 700, "buildPower": 250, - "damage": 430, + "damage": 440, "effectSize": 50, "explosionWav": "smlexpl.ogg", "facePlayer": 1, @@ -3138,7 +3260,7 @@ "NX-CyborgPulseLas": { "buildPoints": 375, "buildPower": 125, - "damage": 312, + "damage": 332, "effectSize": 100, "explosionWav": "lsrexpl.ogg", "facePlayer": 1, @@ -3305,7 +3427,7 @@ "RailGun1-VTOL": { "buildPoints": 1000, "buildPower": 250, - "damage": 200, + "damage": 300, "designable": 1, "effectSize": 75, "explosionWav": "smlexpl.ogg", @@ -3327,7 +3449,7 @@ "movement": "DIRECT", "muzzleGfx": "FXLGauss.PIE", "name": "VTOL Needle Gun", - "numAttackRuns": 12, + "numAttackRuns": 8, "numExplosions": 1, "rotate": 180, "shortHit": 80, @@ -3378,7 +3500,7 @@ "RailGun2-VTOL": { "buildPoints": 1200, "buildPower": 300, - "damage": 300, + "damage": 400, "designable": 1, "effectSize": 100, "explosionWav": "lrgexpl.ogg", @@ -3400,7 +3522,7 @@ "movement": "DIRECT", "muzzleGfx": "FXMGauss.PIE", "name": "VTOL Rail Gun", - "numAttackRuns": 12, + "numAttackRuns": 6, "numExplosions": 1, "rotate": 180, "shortHit": 80, @@ -3740,12 +3862,12 @@ "Rocket-VTOL-BB": { "buildPoints": 1400, "buildPower": 375, - "damage": 125, + "damage": 166, "designable": 1, "effectSize": 25, "explosionWav": "smlexpl.ogg", "facePlayer": 1, - "firePause": 80, + "firePause": 20, "flightGfx": "FXSPLME.PIE", "flightSpeed": 1200, "hitGfx": "FXGRDexl.PIE", diff --git a/data/base/wrf/cam1/sub1-4/dinit.bjo b/data/base/wrf/cam1/sub1-4/dinit.bjo index 983436b0a5f04569c0f75c32d8c38edd02c03561..3c607dca9466be6052250a15a7982f191cb94f1d 100644 GIT binary patch delta 30 lcmbQBJVBW=B{Q#tgMop;da|RS|6~OwmdQSBDjQ7%1Oa;52VMXG delta 28 kcmbQBJVBW=B{Q#tgMop;dh$dz?Trlrf|K|(CYq=K0CNuqx&QzG diff --git a/data/base/wrf/cam1/sub1-4/struct.bjo b/data/base/wrf/cam1/sub1-4/struct.bjo index 50b91f6d99f0bd48bb3df68722b8ef921c205926..5c245c6c0f16cb626cd29bda3331cecd080a7195 100644 GIT binary patch delta 25 hcmX?Oa>itX7Te}UY-a=~tFf6)R$+45oF{RQ5deWR2_XOg delta 25 hcmX?Oa>itX7Te@s;zpBA7~M8&v7HgzoF{RQ5deh437r4{ diff --git a/data/base/wrf/cam3/cam3-4/labels.json b/data/base/wrf/cam3/cam3-4/labels.json index 3ddbed415dd..3d19e4acd2e 100644 --- a/data/base/wrf/cam3/cam3-4/labels.json +++ b/data/base/wrf/cam3/cam3-4/labels.json @@ -231,5 +231,11 @@ "id": 1235, "player": 3, "type": 1 + }, + "object_11": { + "label": "NX-HQ", + "id": 237, + "player": 3, + "type": 1 } }