remove hacking missions

This commit is contained in:
Olivier Gagnon 2021-10-01 15:26:12 -04:00
parent 0ae8b72188
commit 9cbb525da3
13 changed files with 6 additions and 1763 deletions

@ -47,14 +47,6 @@ export const CONSTANTS: {
IntelligenceTerminalHackBaseExpGain: number; IntelligenceTerminalHackBaseExpGain: number;
IntelligenceSingFnBaseExpGain: number; IntelligenceSingFnBaseExpGain: number;
IntelligenceClassBaseExpGain: number; IntelligenceClassBaseExpGain: number;
IntelligenceHackingMissionBaseExpGain: number;
HackingMissionRepToDiffConversion: number;
HackingMissionRepToRewardConversion: number;
HackingMissionSpamTimeIncrease: number;
HackingMissionTransferAttackIncrease: number;
HackingMissionMiscDefenseIncrease: number;
HackingMissionDifficultyToHacking: number;
HackingMissionHowToPlay: string;
MillisecondsPer20Hours: number; MillisecondsPer20Hours: number;
GameCyclesPer20Hours: number; GameCyclesPer20Hours: number;
MillisecondsPer10Hours: number; MillisecondsPer10Hours: number;
@ -199,63 +191,6 @@ export const CONSTANTS: {
IntelligenceTerminalHackBaseExpGain: 200, // Hacking exp divided by this to determine int exp gain IntelligenceTerminalHackBaseExpGain: 200, // Hacking exp divided by this to determine int exp gain
IntelligenceSingFnBaseExpGain: 1.5, IntelligenceSingFnBaseExpGain: 1.5,
IntelligenceClassBaseExpGain: 0.01, IntelligenceClassBaseExpGain: 0.01,
IntelligenceHackingMissionBaseExpGain: 3, // Hacking Mission difficulty multiplied by this to get exp gain
// Hacking Missions
// TODO Move this into Hacking Mission implementation
HackingMissionRepToDiffConversion: 10000, // Faction rep is divided by this to get mission difficulty
HackingMissionRepToRewardConversion: 7, // Faction rep divided byt his to get mission rep reward
HackingMissionSpamTimeIncrease: 25000, // How much time limit increase is gained when conquering a Spam Node (ms)
HackingMissionTransferAttackIncrease: 1.05, // Multiplier by which the attack for all Core Nodes is increased when conquering a Transfer Node
HackingMissionMiscDefenseIncrease: 1.05, // The amount by which every misc node's defense is multiplied when one is conquered
HackingMissionDifficultyToHacking: 135, // Difficulty is multiplied by this to determine enemy's "hacking" level (to determine effects of scan/attack, etc)
HackingMissionHowToPlay:
"Hacking missions are a minigame that, if won, will reward you with faction reputation.<br><br>" +
"In this game you control a set of Nodes and use them to try and defeat an enemy. Your Nodes " +
"are colored blue, while the enemy's are red. There are also other nodes on the map colored gray " +
"that initially belong to neither you nor the enemy. The goal of the game is " +
"to capture all of the enemy's Database nodes within the time limit. " +
"If you fail to do this, you will lose.<br><br>" +
"Each Node has three stats: Attack, Defense, and HP. There are five different actions that " +
"a Node can take:<br><br> " +
"Attack - Targets an enemy Node and lowers its HP. The effectiveness is determined by the owner's Attack, the Player's " +
"hacking level, and the enemy's defense.<br><br>" +
"Scan - Targets an enemy Node and lowers its Defense. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the " +
"enemy's defense.<br><br>" +
"Weaken - Targets an enemy Node and lowers its Attack. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the enemy's " +
"defense.<br><br>" +
"Fortify - Raises the Node's Defense. The effectiveness is determined by your hacking level.<br><br>" +
"Overflow - Raises the Node's Attack but lowers its Defense. The effectiveness is determined by your hacking level.<br><br>" +
"Note that when determining the effectiveness of the above actions, the TOTAL Attack or Defense of the team is used, not just the " +
"Attack/Defense of the individual Node that is performing the action.<br><br>" +
"To capture a Node, you must lower its HP down to 0.<br><br>" +
"There are six different types of Nodes:<br><br>" +
"CPU Core - These are your main Nodes that are used to perform actions. Capable of performing every action<br><br>" +
"Firewall - Nodes with high defense. These Nodes can 'Fortify'<br><br>" +
"Database - A special type of Node. The player's objective is to conquer all of the enemy's Database Nodes within " +
"the time limit. These Nodes cannot perform any actions<br><br>" +
"Spam - Conquering one of these Nodes will slow the enemy's trace, giving the player additional time to complete " +
"the mission. These Nodes cannot perform any actions<br><br>" +
"Transfer - Conquering one of these nodes will increase the Attack of all of your CPU Cores by a small fixed percentage. " +
"These Nodes are capable of performing every action except the 'Attack' action<br><br>" +
"Shield - Nodes with high defense. These Nodes can 'Fortify'<br><br>" +
"To assign an action to a Node, you must first select one of your Nodes. This can be done by simply clicking on it. Double-clicking " +
"a node will select all of your Nodes of the same type (e.g. select all CPU Core Nodes or all Transfer Nodes). Note that only Nodes " +
"that can perform actions (CPU Core, Transfer, Shield, Firewall) can be selected. Selected Nodes will be denoted with a white highlight. After selecting a Node or multiple Nodes, " +
"select its action using the Action Buttons near the top of the screen. Every action also has a corresponding keyboard " +
"shortcut.<br><br>" +
"For certain actions such as attacking, scanning, and weakening, the Node performing the action must have a target. To target " +
"another node, simply click-and-drag from the 'source' Node to a target. A Node can only have one target, and you can target " +
"any Node that is adjacent to one of your Nodes (immediately above, below, or to the side. NOT diagonal). Furthermore, only CPU Cores and Transfer Nodes " +
"can target, since they are the only ones that can perform the related actions. To remove a target, you can simply click on the line that represents " +
"the connection between one of your Nodes and its target. Alternatively, you can select the 'source' Node and click the 'Drop Connection' button, " +
"or press 'd'.<br><br>" +
"Other Notes:<br><br>" +
"-Whenever a miscellenaous Node (not owned by the player or enemy) is conquered, the defense of all remaining miscellaneous Nodes that " +
"are not actively being targeted will increase by a fixed percentage.<br><br>" +
"-Whenever a Node is conquered, its stats are significantly reduced<br><br>" +
"-Miscellaneous Nodes slowly raise their defense over time<br><br>" +
"-Nodes slowly regenerate health over time.",
// Time-related constants // Time-related constants
MillisecondsPer20Hours: 72000000, MillisecondsPer20Hours: 72000000,

@ -7,7 +7,6 @@ import { CONSTANTS } from "../Constants";
import { Faction } from "./Faction"; import { Faction } from "./Faction";
import { Factions } from "./Factions"; import { Factions } from "./Factions";
import { HackingMission, setInMission } from "../Missions";
import { Player } from "../Player"; import { Player } from "../Player";
import { Settings } from "../Settings/Settings"; import { Settings } from "../Settings/Settings";
import { import {
@ -49,12 +48,6 @@ export function joinFaction(faction: Faction): void {
} }
} }
export function startHackingMission(faction: Faction): void {
const mission = new HackingMission(faction.playerReputation, faction);
setInMission(true, mission); //Sets inMission flag to true
mission.init();
}
//Returns a boolean indicating whether the player has the prerequisites for the //Returns a boolean indicating whether the player has the prerequisites for the
//specified Augmentation //specified Augmentation
export function hasAugmentationPrereqs(aug: Augmentation): boolean { export function hasAugmentationPrereqs(aug: Augmentation): boolean {

@ -30,10 +30,6 @@ type IProps = {
// Info text for all options on the UI // Info text for all options on the UI
const gangInfo = "Create and manage a gang for this Faction. Gangs will earn you money and " + "faction reputation"; const gangInfo = "Create and manage a gang for this Faction. Gangs will earn you money and " + "faction reputation";
const hackingMissionInfo =
"Attempt a hacking mission for your faction. " +
"A mission is a mini game that, if won, earns you " +
"significant reputation with this faction. (Recommended hacking level: 200+)";
const hackingContractsInfo = const hackingContractsInfo =
"Complete hacking contracts for your faction. " + "Complete hacking contracts for your faction. " +
"Your effectiveness, which determines how much " + "Your effectiveness, which determines how much " +
@ -96,11 +92,6 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
player.startFactionHackWork(router, faction); player.startFactionHackWork(router, faction);
} }
function startHackingMission(faction: Faction): void {
player.singularityStopWork();
router.toHackingMission(faction);
}
function startSecurityWork(faction: Faction): void { function startSecurityWork(faction: Faction): void {
player.startFactionSecurityWork(router, faction); player.startFactionSecurityWork(router, faction);
} }
@ -138,13 +129,6 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
<CreateGangModal facName={faction.name} open={gangOpen} onClose={() => setGangOpen(false)} /> <CreateGangModal facName={faction.name} open={gangOpen} onClose={() => setGangOpen(false)} />
</> </>
)} )}
{!isPlayersGang && factionInfo.offerHackingMission && (
<Option
buttonText={"Hacking Mission"}
infoText={hackingMissionInfo}
onClick={() => startHackingMission(faction)}
/>
)}
{!isPlayersGang && factionInfo.offerHackingWork && ( {!isPlayersGang && factionInfo.offerHackingWork && (
<Option <Option
buttonText={"Hacking Contracts"} buttonText={"Hacking Contracts"}

@ -1,13 +0,0 @@
import React, { useEffect } from "react";
import { startHackingMission } from "../../Faction/FactionHelpers";
import { Faction } from "../../Faction/Faction";
interface IProps {
faction: Faction;
}
export function HackingMissionRoot(props: IProps): React.ReactElement {
useEffect(() => startHackingMission(props.faction));
return <div id="mission-container"></div>;
}

@ -2,7 +2,6 @@ import { Message } from "./Message";
import { Augmentations } from "../Augmentation/Augmentations"; import { Augmentations } from "../Augmentation/Augmentations";
import { AugmentationNames } from "../Augmentation/data/AugmentationNames"; import { AugmentationNames } from "../Augmentation/data/AugmentationNames";
import { Programs } from "../Programs/Programs"; import { Programs } from "../Programs/Programs";
import { inMission } from "../Missions";
import { Player } from "../Player"; import { Player } from "../Player";
import { redPillFlag } from "../RedPill"; import { redPillFlag } from "../RedPill";
import { GetServerByHostname } from "../Server/ServerHelpers"; import { GetServerByHostname } from "../Server/ServerHelpers";
@ -66,11 +65,11 @@ function checkForMessagesToSend(): void {
redpillOwned = true; redpillOwned = true;
} }
if (redpill && redpillOwned && Player.sourceFiles.length === 0 && !redPillFlag && !inMission) { if (redpill && redpillOwned && Player.sourceFiles.length === 0 && !redPillFlag) {
sendMessage(redpill, true); sendMessage(redpill, true);
} else if (redpill && redpillOwned) { } else if (redpill && redpillOwned) {
//If player has already destroyed a BitNode, message is not forced //If player has already destroyed a BitNode, message is not forced
if (!redPillFlag && !inMission) { if (!redPillFlag) {
sendMessage(redpill); sendMessage(redpill);
} }
} else if (jumper0 && !jumper0.recvd && Player.hacking_skill >= 25) { } else if (jumper0 && !jumper0.recvd && Player.hacking_skill >= 25) {

8
src/Missions.d.ts vendored

@ -1,8 +0,0 @@
export declare let inMission: boolean;
export declare class HackingMission {
constructor(reputation: number, faction: Faction);
init(): void;
process(numCycles: number): void;
}
export declare function setInMission(inMission: boolean, mission: HackingMission): void;
export declare let currMission: HackingMission;

File diff suppressed because it is too large Load Diff

@ -98,7 +98,6 @@ import { Terminal } from "./Terminal";
import { calculateSkill, calculateExp } from "./PersonObjects/formulas/skill"; import { calculateSkill, calculateExp } from "./PersonObjects/formulas/skill";
import { Message } from "./Message/Message"; import { Message } from "./Message/Message";
import { inMission } from "./Missions";
import { Player } from "./Player"; import { Player } from "./Player";
import { Programs } from "./Programs/Programs"; import { Programs } from "./Programs/Programs";
import { Script } from "./Script/Script"; import { Script } from "./Script/Script";
@ -2965,10 +2964,6 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
universityCourse: function (universityName: any, className: any): any { universityCourse: function (universityName: any, className: any): any {
updateDynamicRam("universityCourse", getRamCost("universityCourse")); updateDynamicRam("universityCourse", getRamCost("universityCourse"));
checkSingularityAccess("universityCourse", 1); checkSingularityAccess("universityCourse", 1);
if (inMission) {
workerScript.log("universityCourse", "You are in the middle of a mission.");
return;
}
if (Player.isWorking) { if (Player.isWorking) {
const txt = Player.singularityStopWork(); const txt = Player.singularityStopWork();
workerScript.log("universityCourse", txt); workerScript.log("universityCourse", txt);
@ -3049,10 +3044,6 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
gymWorkout: function (gymName: any, stat: any): any { gymWorkout: function (gymName: any, stat: any): any {
updateDynamicRam("gymWorkout", getRamCost("gymWorkout")); updateDynamicRam("gymWorkout", getRamCost("gymWorkout"));
checkSingularityAccess("gymWorkout", 1); checkSingularityAccess("gymWorkout", 1);
if (inMission) {
workerScript.log("gymWorkout", "You are in the middle of a mission.");
return;
}
if (Player.isWorking) { if (Player.isWorking) {
const txt = Player.singularityStopWork(); const txt = Player.singularityStopWork();
workerScript.log("gymWorkout", txt); workerScript.log("gymWorkout", txt);
@ -3486,7 +3477,7 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
isBusy: function (): any { isBusy: function (): any {
updateDynamicRam("isBusy", getRamCost("isBusy")); updateDynamicRam("isBusy", getRamCost("isBusy"));
checkSingularityAccess("isBusy", 1); checkSingularityAccess("isBusy", 1);
return Player.isWorking || inMission; return Player.isWorking;
}, },
stopAction: function (): any { stopAction: function (): any {
updateDynamicRam("stopAction", getRamCost("stopAction")); updateDynamicRam("stopAction", getRamCost("stopAction"));
@ -3553,12 +3544,6 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
return false; return false;
} }
// Cant work while in a mission
if (inMission) {
workerScript.log("workForCompany", "You are in the middle of a mission.");
return false;
}
// Check to make sure company position data is valid // Check to make sure company position data is valid
const companyPositionName = Player.jobs[companyName]; const companyPositionName = Player.jobs[companyName];
const companyPosition = CompanyPositions[companyPositionName]; const companyPosition = CompanyPositions[companyPositionName];
@ -3708,11 +3693,6 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
return; return;
} }
if (inMission) {
workerScript.log("workForFaction", "You are in the middle of a mission.");
return;
}
if (!Player.factions.includes(name)) { if (!Player.factions.includes(name)) {
workerScript.log("workForFaction", `You are not a member of '${name}'`); workerScript.log("workForFaction", `You are not a member of '${name}'`);
return false; return false;
@ -3900,10 +3880,6 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
updateDynamicRam("createProgram", getRamCost("createProgram")); updateDynamicRam("createProgram", getRamCost("createProgram"));
checkSingularityAccess("createProgram", 3); checkSingularityAccess("createProgram", 3);
if (inMission) {
workerScript.log("createProgram", "You are in the middle of a mission.");
return;
}
if (Player.isWorking) { if (Player.isWorking) {
const txt = Player.singularityStopWork(); const txt = Player.singularityStopWork();
workerScript.log("createProgram", txt); workerScript.log("createProgram", txt);
@ -3946,10 +3922,7 @@ function NetscriptFunctions(workerScript: WorkerScript): NS {
commitCrime: function (crimeRoughName: any): any { commitCrime: function (crimeRoughName: any): any {
updateDynamicRam("commitCrime", getRamCost("commitCrime")); updateDynamicRam("commitCrime", getRamCost("commitCrime"));
checkSingularityAccess("commitCrime", 3); checkSingularityAccess("commitCrime", 3);
if (inMission) {
workerScript.log("commitCrime", "You are in the middle of a mission.");
return;
}
if (Player.isWorking) { if (Player.isWorking) {
const txt = Player.singularityStopWork(); const txt = Player.singularityStopWork();
workerScript.log("commitCrime", txt); workerScript.log("commitCrime", txt);

@ -50,7 +50,6 @@ import { getAvailableCreatePrograms } from "../../Programs/ProgramHelpers";
import { Settings } from "../../Settings/Settings"; import { Settings } from "../../Settings/Settings";
import { redPillFlag } from "../../RedPill"; import { redPillFlag } from "../../RedPill";
import { inMission } from "../../Missions";
import { KEY } from "../../utils/helpers/keyCodes"; import { KEY } from "../../utils/helpers/keyCodes";
const openedMixin = (theme: Theme): CSSObject => ({ const openedMixin = (theme: Theme): CSSObject => ({
@ -266,7 +265,7 @@ export function SidebarRoot(props: IProps): React.ReactElement {
// Alt-o - Options // Alt-o - Options
function handleShortcuts(this: Document, event: KeyboardEvent): any { function handleShortcuts(this: Document, event: KeyboardEvent): any {
if (Settings.DisableHotkeys) return; if (Settings.DisableHotkeys) return;
if (props.player.isWorking || redPillFlag || inMission) return; if (props.player.isWorking || redPillFlag) return;
if (event.keyCode == KEY.T && event.altKey) { if (event.keyCode == KEY.T && event.altKey) {
event.preventDefault(); event.preventDefault();
clickTerminal(); clickTerminal();

@ -23,7 +23,6 @@ import {
import { hasHacknetServers, processHacknetEarnings } from "./Hacknet/HacknetHelpers"; import { hasHacknetServers, processHacknetEarnings } from "./Hacknet/HacknetHelpers";
import { iTutorialStart } from "./InteractiveTutorial"; import { iTutorialStart } from "./InteractiveTutorial";
import { checkForMessagesToSend, initMessages } from "./Message/MessageHelpers"; import { checkForMessagesToSend, initMessages } from "./Message/MessageHelpers";
import { inMission, currMission } from "./Missions";
import { loadAllRunningScripts, updateOnlineScriptTimes } from "./NetscriptWorker"; import { loadAllRunningScripts, updateOnlineScriptTimes } from "./NetscriptWorker";
import { Player } from "./Player"; import { Player } from "./Player";
import { saveObject, loadGame } from "./SaveObject"; import { saveObject, loadGame } from "./SaveObject";
@ -131,11 +130,6 @@ const Engine: {
Player.gang.process(numCycles, Player); Player.gang.process(numCycles, Player);
} }
// Mission
if (inMission && currMission) {
currMission.process(numCycles);
}
// Corporation // Corporation
if (Player.corporation instanceof Corporation) { if (Player.corporation instanceof Corporation) {
// Stores cycles in a "buffer". Processed separately using Engine Counters // Stores cycles in a "buffer". Processed separately using Engine Counters

@ -56,7 +56,6 @@ import { TerminalRoot } from "../Terminal/ui/TerminalRoot";
import { TutorialRoot } from "../Tutorial/ui/TutorialRoot"; import { TutorialRoot } from "../Tutorial/ui/TutorialRoot";
import { ActiveScriptsRoot } from "../ui/ActiveScripts/ActiveScriptsRoot"; import { ActiveScriptsRoot } from "../ui/ActiveScripts/ActiveScriptsRoot";
import { FactionsRoot } from "../Faction/ui/FactionsRoot"; import { FactionsRoot } from "../Faction/ui/FactionsRoot";
import { HackingMissionRoot } from "../HackingMission/ui/HackingMissionRoot";
import { FactionRoot } from "../Faction/ui/FactionRoot"; import { FactionRoot } from "../Faction/ui/FactionRoot";
import { CharacterStats } from "./CharacterStats"; import { CharacterStats } from "./CharacterStats";
import { TravelAgencyRoot } from "../Locations/ui/TravelAgencyRoot"; import { TravelAgencyRoot } from "../Locations/ui/TravelAgencyRoot";
@ -178,9 +177,6 @@ export let Router: IRouter = {
toLocation: () => { toLocation: () => {
throw new Error("Router called before initialization"); throw new Error("Router called before initialization");
}, },
toHackingMission: () => {
throw new Error("Router called before initialization");
},
}; };
function determineStartPage(player: IPlayer): Page { function determineStartPage(player: IPlayer): Page {
@ -270,10 +266,6 @@ export function GameRoot({ player, engine, terminal }: IProps): React.ReactEleme
setLocation(location); setLocation(location);
setPage(Page.Location); setPage(Page.Location);
}, },
toHackingMission: (faction: Faction) => {
setPage(Page.HackingMission);
setFaction(faction);
},
}; };
useEffect(() => { useEffect(() => {
@ -296,8 +288,6 @@ export function GameRoot({ player, engine, terminal }: IProps): React.ReactEleme
<BitverseRoot flume={flume} enter={enterBitNode} quick={quick} /> <BitverseRoot flume={flume} enter={enterBitNode} quick={quick} />
) : page === Page.Infiltration ? ( ) : page === Page.Infiltration ? (
<InfiltrationRoot location={location} /> <InfiltrationRoot location={location} />
) : page === Page.HackingMission ? (
<HackingMissionRoot faction={faction} />
) : page === Page.BladeburnerCinematic ? ( ) : page === Page.BladeburnerCinematic ? (
<BladeburnerCinematic /> <BladeburnerCinematic />
) : page === Page.Work ? ( ) : page === Page.Work ? (

@ -23,8 +23,7 @@ export function Overview({ children }: IProps): React.ReactElement {
const [open, setOpen] = useState(true); const [open, setOpen] = useState(true);
const classes = useStyles(); const classes = useStyles();
const router = use.Router(); const router = use.Router();
if (router.page() === Page.BitVerse || router.page() === Page.HackingMission || router.page() === Page.Loading) if (router.page() === Page.BitVerse || router.page() === Page.Loading) return <></>;
return <></>;
let icon; let icon;
if (open) { if (open) {
icon = <VisibilityOffIcon color="primary" />; icon = <VisibilityOffIcon color="primary" />;

@ -33,7 +33,6 @@ export enum Page {
Work, Work,
BladeburnerCinematic, BladeburnerCinematic,
Location, Location,
HackingMission,
Loading, Loading,
} }
@ -74,5 +73,4 @@ export interface IRouter {
toWork(): void; toWork(): void;
toBladeburnerCinematic(): void; toBladeburnerCinematic(): void;
toLocation(location: Location): void; toLocation(location: Location): void;
toHackingMission(faction: Faction): void;
} }