From 3e44f08a0fd5513eac6f5e09743e2a1e6d429c69 Mon Sep 17 00:00:00 2001 From: Michael Ficocelli Date: Tue, 31 Mar 2026 13:28:39 -0700 Subject: [PATCH] CCT: Generate more frequent and lower-reward coding contracts (#2603) --- src/DarkNet/effects/cacheFiles.ts | 2 +- .../Player/PlayerObjectGeneralMethods.ts | 16 +++++++++------- src/engine.tsx | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/DarkNet/effects/cacheFiles.ts b/src/DarkNet/effects/cacheFiles.ts index 16dd4623d..21ee04990 100644 --- a/src/DarkNet/effects/cacheFiles.ts +++ b/src/DarkNet/effects/cacheFiles.ts @@ -74,7 +74,7 @@ export const getCCTReward = (difficulty: number, server: DarknetServer): string return getMoneyReward(difficulty); } for (let i = 0; i < contractCount; i++) { - generateContract({ server: server.hostname, rewardScaling: 1 / 5 }); + generateContract({ server: server.hostname, rewardScaling: 1 / 2 }); } return `New coding contracts are now available on the network!`; }; diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts index 28411faec..f11a180fb 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts @@ -505,25 +505,27 @@ export function gainCodingContractReward( if (!reward) { return `No reward for this contract`; } + // The new standard is smaller, more frequent rewards - a third of the reward size of the previous + const adjustedScaling = rewardScaling / 3; switch (reward.type) { case CodingContractRewardType.FactionReputation: { const factionsThatAllowHacking = Player.factions.filter((fac) => Factions[fac].getInfo().offerHackingWork); if (factionsThatAllowHacking.length === 0) { - return this.gainCodingContractReward({ type: CodingContractRewardType.Money }, difficulty, rewardScaling); + return this.gainCodingContractReward({ type: CodingContractRewardType.Money }, difficulty, adjustedScaling); } const randomFaction = factionsThatAllowHacking[getRandomIntInclusive(0, factionsThatAllowHacking.length - 1)]; - const repGain = CONSTANTS.CodingContractBaseFactionRepGain * difficulty * rewardScaling; + const repGain = CONSTANTS.CodingContractBaseFactionRepGain * difficulty * adjustedScaling; Factions[randomFaction].playerReputation += repGain; return `Gained ${repGain} faction reputation for ${randomFaction}`; } case CodingContractRewardType.FactionReputationAll: { const factionsThatAllowHacking = Player.factions.filter((fac) => Factions[fac].getInfo().offerHackingWork); if (factionsThatAllowHacking.length === 0) { - return this.gainCodingContractReward({ type: CodingContractRewardType.Money }, difficulty, rewardScaling); + return this.gainCodingContractReward({ type: CodingContractRewardType.Money }, difficulty, adjustedScaling); } - const totalGain = CONSTANTS.CodingContractBaseFactionRepGain * difficulty * rewardScaling; + const totalGain = CONSTANTS.CodingContractBaseFactionRepGain * difficulty * adjustedScaling; const gainPerFaction = Math.floor(totalGain / factionsThatAllowHacking.length); for (const facName of factionsThatAllowHacking) { Factions[facName].playerReputation += gainPerFaction; @@ -543,17 +545,17 @@ export function gainCodingContractReward( : CodingContractRewardType.FactionReputationAll, }, difficulty, - rewardScaling, + adjustedScaling, ); } const randomCompany = companies[getRandomIntInclusive(0, companies.length - 1)]; - const repGain = CONSTANTS.CodingContractBaseCompanyRepGain * difficulty * rewardScaling; + const repGain = CONSTANTS.CodingContractBaseCompanyRepGain * difficulty * adjustedScaling; Companies[randomCompany].playerReputation += repGain; return `Gained ${repGain} company reputation for ${randomCompany}`; } case CodingContractRewardType.Money: { const moneyGain = - CONSTANTS.CodingContractBaseMoneyGain * difficulty * currentNodeMults.CodingContractMoney * rewardScaling; + CONSTANTS.CodingContractBaseMoneyGain * difficulty * currentNodeMults.CodingContractMoney * adjustedScaling; this.gainMoney(moneyGain, "codingcontract"); return `Gained ${formatMoney(moneyGain)}`; } diff --git a/src/engine.tsx b/src/engine.tsx index 821968218..7701bd60c 100644 --- a/src/engine.tsx +++ b/src/engine.tsx @@ -209,7 +209,7 @@ const Engine = { } if (Engine.Counters.contractGeneration <= 0) { - tryGeneratingRandomContract(1); + tryGeneratingRandomContract(3); Engine.Counters.contractGeneration = 3000; } @@ -265,7 +265,7 @@ const Engine = { const numCyclesOffline = Math.floor(timeOffline / CONSTANTS.MilliPerCycle); // Generate bonus CCTs - tryGeneratingRandomContract(timeOffline / CONSTANTS.MillisecondsPerTenMinutes); + tryGeneratingRandomContract((timeOffline * 3) / CONSTANTS.MillisecondsPerTenMinutes); let offlineReputation = 0; let offlineHackingIncome =