diff --git a/src/DevMenu/ui/General.tsx b/src/DevMenu/ui/General.tsx index 39ae31742..ba01ee10a 100644 --- a/src/DevMenu/ui/General.tsx +++ b/src/DevMenu/ui/General.tsx @@ -10,7 +10,7 @@ import Button from "@mui/material/Button"; import { Money } from "../../ui/React/Money"; import { IPlayer } from "../../PersonObjects/IPlayer"; import { IRouter } from "../../ui/Router"; -import { checkForMessagesToSend } from "../../Message/MessageHelpers" +import { checkForMessagesToSend } from "../../Message/MessageHelpers"; interface IProps { player: IPlayer; diff --git a/src/Message/MessageHelpers.ts b/src/Message/MessageHelpers.ts index 3134e63d4..ee1058756 100644 --- a/src/Message/MessageHelpers.ts +++ b/src/Message/MessageHelpers.ts @@ -5,23 +5,23 @@ import { Programs } from "../Programs/Programs"; import { Player } from "../Player"; import { Page } from "../ui/Router"; import { GetServer } from "../Server/AllServers"; +import { SpecialServers } from "../Server/data/SpecialServers"; import { Settings } from "../Settings/Settings"; import { dialogBoxCreate } from "../ui/React/DialogBox"; -import { Reviver } from "../utils/JSONReviver"; import { FactionNames } from "../Faction/data/FactionNames"; +import { Server } from "../Server/Server"; //Sends message to player, including a pop up function sendMessage(msg: Message, forced = false): void { - msg.recvd = true; if (forced || !Settings.SuppressMessages) { showMessage(msg.filename); } - addMessageToServer(msg, "home"); + addMessageToServer(msg); } function showMessage(name: string): void { const msg = Messages[name]; - if (!msg) throw new Error("trying to display unexistent message"); + if (!(msg instanceof Message)) throw new Error("trying to display unexistent message"); const txt = "Message received from unknown sender:

" + "" + @@ -34,21 +34,27 @@ function showMessage(name: string): void { } //Adds a message to a server -function addMessageToServer(msg: Message, serverHostname: string): void { - const server = GetServer(serverHostname); - if (server == null) { - console.warn(`Could not find server ${serverHostname}`); +function addMessageToServer(msg: Message): void { + //Short-circuit if the message has already been saved + if (recvd(msg)) { return; } - for (let i = 0; i < server.messages.length; ++i) { - const other = server.messages[i]; - if (msg.filename === other) { - return; //Already exists - } + const server = GetServer("home"); + if (server == null) { + throw new Error("The home server doesn't exist. You done goofed."); } server.messages.push(msg.filename); } +//Returns whether the given message has already been received +function recvd(msg: Message): boolean { + const server = GetServer("home"); + if (server == null) { + throw new Error("The home server doesn't exist. You done goofed."); + } + return server.messages.includes(msg.filename); +} + //Checks if any of the 'timed' messages should be sent function checkForMessagesToSend(): void { if (Router.page() === Page.BitVerse) return; @@ -60,45 +66,47 @@ function checkForMessagesToSend(): void { const cybersecTest = Messages[MessageFilenames.CyberSecTest]; const nitesecTest = Messages[MessageFilenames.NiteSecTest]; const bitrunnersTest = Messages[MessageFilenames.BitRunnersTest]; + const truthGazer = Messages[MessageFilenames.TruthGazer]; const redpill = Messages[MessageFilenames.RedPill]; if (Player.hasAugmentation(AugmentationNames.TheRedPill)) { - //Force the message if the player has never destroyed a BitNode - sendMessage(redpill, Player.sourceFiles.length === 0); - } else if (!jumper0.recvd && Player.hacking >= 25) { + //Get the world daemon required hacking level + const worldDaemon = GetServer(SpecialServers.WorldDaemon); + if (!(worldDaemon instanceof Server)) { + throw new Error("The world daemon is not a server???? Please un-break reality"); + } + //If the daemon can be hacked, send the player icarus.msg + if (Player.hacking >= worldDaemon.requiredHackingSkill) { + sendMessage(redpill, Player.sourceFiles.length === 0); + } + //If the daemon cannot be hacked, send the player truthgazer.msg a single time. + else if (!recvd(truthGazer)) { + sendMessage(truthGazer); + } + } else if (!recvd(jumper0) && Player.hacking >= 25) { sendMessage(jumper0); const flightName = Programs.Flight.name; const homeComp = Player.getHomeComputer(); if (!homeComp.programs.includes(flightName)) { homeComp.programs.push(flightName); } - } else if (!jumper1.recvd && Player.hacking >= 40) { + } else if (!recvd(jumper1) && Player.hacking >= 40) { sendMessage(jumper1); - } else if (!cybersecTest.recvd && Player.hacking >= 50) { + } else if (!recvd(cybersecTest) && Player.hacking >= 50) { sendMessage(cybersecTest); - } else if (!jumper2.recvd && Player.hacking >= 175) { + } else if (!recvd(jumper2) && Player.hacking >= 175) { sendMessage(jumper2); - } else if (!nitesecTest.recvd && Player.hacking >= 200) { + } else if (!recvd(nitesecTest) && Player.hacking >= 200) { sendMessage(nitesecTest); - } else if (!jumper3.recvd && Player.hacking >= 350) { + } else if (!recvd(jumper3) && Player.hacking >= 350) { sendMessage(jumper3); - } else if (!jumper4.recvd && Player.hacking >= 490) { + } else if (!recvd(jumper4) && Player.hacking >= 490) { sendMessage(jumper4); - } else if (!bitrunnersTest.recvd && Player.hacking >= 500) { + } else if (!recvd(bitrunnersTest) && Player.hacking >= 500) { sendMessage(bitrunnersTest); } } -function AddToAllMessages(msg: Message): void { - Messages[msg.filename] = msg; -} - -let Messages: { [key: string]: Message } = {}; - -function loadMessages(saveString: string): void { - Messages = JSON.parse(saveString, Reviver); -} - enum MessageFilenames { Jumper0 = "j0.msg", Jumper1 = "j1.msg", @@ -108,105 +116,103 @@ enum MessageFilenames { CyberSecTest = "csec-test.msg", NiteSecTest = "nitesec-test.msg", BitRunnersTest = "19dfj3l1nd.msg", + TruthGazer = "truthgazer.msg", RedPill = "icarus.msg", } -function initMessages(): void { - //Reset - Messages = {}; - +//Reset +const Messages = { //jump3R Messages - AddToAllMessages( - new Message( - MessageFilenames.Jumper0, - "I know you can sense it. I know you're searching for it. " + - "It's why you spend night after " + - "night at your computer.

It's real, I've seen it. And I can " + - "help you find it. But not right now. You're not ready yet.

" + - "Use this program to track your progress

" + - "The fl1ght.exe program was added to your home computer

" + - "-jump3R", - ), - ); - AddToAllMessages( - new Message( - MessageFilenames.Jumper1, - `Soon you will be contacted by a hacking group known as ${FactionNames.NiteSec}. ` + - "They can help you with your search.

" + - "You should join them, garner their favor, and " + - "exploit them for their Augmentations. But do not trust them. " + - "They are not what they seem. No one is.

" + - "-jump3R", - ), - ); - AddToAllMessages( - new Message( - MessageFilenames.Jumper2, - "Do not try to save the world. There is no world to save. If " + - "you want to find the truth, worry only about yourself. Ethics and " + - `morals will get you killed.

Watch out for a hacking group known as ${FactionNames.NiteSec}.` + - "

-jump3R", - ), - ); - AddToAllMessages( - new Message( - MessageFilenames.Jumper3, - "You must learn to walk before you can run. And you must " + - `run before you can fly. Look for ${FactionNames.TheBlackHand}.

` + - "I.I.I.I

-jump3R", - ), - ); - AddToAllMessages( - new Message( - MessageFilenames.Jumper4, - "To find what you are searching for, you must understand the bits. " + - "The bits are all around us. The runners will help you.

" + - "-jump3R", - ), - ); + [MessageFilenames.Jumper0]: new Message( + MessageFilenames.Jumper0, + "I know you can sense it. I know you're searching for it. " + + "It's why you spend night after " + + "night at your computer.

It's real, I've seen it. And I can " + + "help you find it. But not right now. You're not ready yet.

" + + "Use this program to track your progress

" + + "The fl1ght.exe program was added to your home computer

" + + "-jump3R", + ), + + [MessageFilenames.Jumper1]: new Message( + MessageFilenames.Jumper1, + `Soon you will be contacted by a hacking group known as ${FactionNames.NiteSec}. ` + + "They can help you with your search.

" + + "You should join them, garner their favor, and " + + "exploit them for their Augmentations. But do not trust them. " + + "They are not what they seem. No one is.

" + + "-jump3R", + ), + + [MessageFilenames.Jumper2]: new Message( + MessageFilenames.Jumper2, + "Do not try to save the world. There is no world to save. If " + + "you want to find the truth, worry only about yourself. Ethics and " + + `morals will get you killed.

Watch out for a hacking group known as ${FactionNames.NiteSec}.` + + "

-jump3R", + ), + + [MessageFilenames.Jumper3]: new Message( + MessageFilenames.Jumper3, + "You must learn to walk before you can run. And you must " + + `run before you can fly. Look for ${FactionNames.TheBlackHand}.

` + + "I.I.I.I

-jump3R", + ), + + [MessageFilenames.Jumper4]: new Message( + MessageFilenames.Jumper4, + "To find what you are searching for, you must understand the bits. " + + "The bits are all around us. The runners will help you.

" + + "-jump3R", + ), //Messages from hacking factions - AddToAllMessages( - new Message( - MessageFilenames.CyberSecTest, - "We've been watching you. Your skills are very impressive. But you're wasting " + - "your talents. If you join us, you can put your skills to good use and change " + - "the world for the better. If you join us, we can unlock your full potential.

" + - "But first, you must pass our test. Find and install the backdoor on our server.

" + - `-${FactionNames.CyberSec}`, - ), - ); - AddToAllMessages( - new Message( - MessageFilenames.NiteSecTest, - "People say that the corrupted governments and corporations rule the world. " + - "Yes, maybe they do. But do you know who everyone really fears? People " + - "like us. Because they can't hide from us. Because they can't fight shadows " + - "and ideas with bullets.

" + - "Join us, and people will fear you, too.

" + - "Find and install the backdoor on our server. Then, we will contact you again." + - `

-${FactionNames.NiteSec}`, - ), - ); - AddToAllMessages( - new Message( - MessageFilenames.BitRunnersTest, - "We know what you are doing. We know what drives you. We know " + - "what you are looking for.

" + - "We can help you find the answers.

" + - "run4theh111z", - ), - ); + [MessageFilenames.CyberSecTest]: new Message( + MessageFilenames.CyberSecTest, + "We've been watching you. Your skills are very impressive. But you're wasting " + + "your talents. If you join us, you can put your skills to good use and change " + + "the world for the better. If you join us, we can unlock your full potential.

" + + "But first, you must pass our test. Find and install the backdoor on our server.

" + + `-${FactionNames.CyberSec}`, + ), - AddToAllMessages( - new Message( - MessageFilenames.RedPill, - "@)(#V%*N)@(#*)*C)@#%*)*V)@#(*%V@)(#VN%*)@#(*%
" + - ")@B(*#%)@)M#B*%V)____FIND___#$@)#%(B*)@#(*%B)
" + - "@_#(%_@#M(BDSPOMB__THE-CAVE_#)$(*@#$)@#BNBEGB
" + - "DFLSMFVMV)#@($*)@#*$MV)@#(*$V)M#(*$)M@(#*VM$)", - ), - ); -} + [MessageFilenames.NiteSecTest]: new Message( + MessageFilenames.NiteSecTest, + "People say that the corrupted governments and corporations rule the world. " + + "Yes, maybe they do. But do you know who everyone really fears? People " + + "like us. Because they can't hide from us. Because they can't fight shadows " + + "and ideas with bullets.

" + + "Join us, and people will fear you, too.

" + + "Find and install the backdoor on our server. Then, we will contact you again." + + `

-${FactionNames.NiteSec}`, + ), -export { Messages, checkForMessagesToSend, showMessage, loadMessages, initMessages }; + [MessageFilenames.BitRunnersTest]: new Message( + MessageFilenames.BitRunnersTest, + "We know what you are doing. We know what drives you. We know " + + "what you are looking for.

" + + "We can help you find the answers.

" + + "run4theh111z", + ), + + //Messages to guide players to the daemon + [MessageFilenames.TruthGazer]: new Message( + MessageFilenames.TruthGazer, + //"THE TRUTH CAN NO LONGER ESCAPE YOUR GAZE" + "@&*($#@&__TH3__#@A&#@*)__TRU1H__(*)&*)($#@&()E&R)W&
" + + "%@*$^$()@&$)$*@__CAN__()(@^#)@&@)#__N0__(#@&#)@&@&(
" + + "*(__LON6ER__^#)@)(()*#@)@__ESCAP3__)#(@(#@*@()@(#*$
" + + "()@)#$*%)$#()$#__Y0UR__(*)$#()%(&(%)*!)($__GAZ3__#(", + ), + + [MessageFilenames.RedPill]: new Message( + MessageFilenames.RedPill, + //"FIND THE-CAVE" + "@)(#V%*N)@(#*)*C)@#%*)*V)@#(*%V@)(#VN%*)@#(*%
" + + ")@B(*#%)@)M#B*%V)____FIND___#$@)#%(B*)@#(*%B)
" + + "@_#(%_@#M(BDSPOMB__THE-CAVE_#)$(*@#$)@#BNBEGB
" + + "DFLSMFVMV)#@($*)@#*$MV)@#(*$V)M#(*$)M@(#*VM$)", + ), +}; + +export { Messages, checkForMessagesToSend, showMessage }; diff --git a/src/Prestige.ts b/src/Prestige.ts index 405fe5a73..ab3df9ccc 100755 --- a/src/Prestige.ts +++ b/src/Prestige.ts @@ -12,7 +12,6 @@ import { Faction } from "./Faction/Faction"; import { Factions, initFactions } from "./Faction/Factions"; import { joinFaction } from "./Faction/FactionHelpers"; import { updateHashManagerCapacity } from "./Hacknet/HacknetHelpers"; -import { initMessages } from "./Message/MessageHelpers"; import { prestigeWorkerScripts } from "./NetscriptWorker"; import { Player } from "./Player"; import { Router } from "./ui/GameRoot"; @@ -105,9 +104,6 @@ export function prestigeAugmentation(): void { Player.reapplyAllSourceFiles(); initCompanies(); - // Messages - initMessages(); - // Apply entropy from grafting Player.applyEntropy(Player.entropy); @@ -251,9 +247,6 @@ export function prestigeSourceFile(flume: boolean): void { Player.reapplyAllSourceFiles(); initCompanies(); - // Messages - initMessages(); - if (Player.sourceFileLvl(5) > 0 || Player.bitNodeN === 5) { homeComp.programs.push(Programs.Formulas.name); } diff --git a/src/SaveObject.tsx b/src/SaveObject.tsx index fc6a5ff06..44573385d 100755 --- a/src/SaveObject.tsx +++ b/src/SaveObject.tsx @@ -3,7 +3,6 @@ import { Companies, loadCompanies } from "./Company/Companies"; import { CONSTANTS } from "./Constants"; import { Factions, loadFactions } from "./Faction/Factions"; import { loadAllGangs, AllGangs } from "./Gang/AllGangs"; -import { loadMessages, initMessages, Messages } from "./Message/MessageHelpers"; import { Player, loadPlayer } from "./Player"; import { saveAllServers, loadAllServers, GetAllServers } from "./Server/AllServers"; import { Settings } from "./Settings/Settings"; @@ -67,7 +66,6 @@ class BitburnerSaveObject { FactionsSave = ""; AliasesSave = ""; GlobalAliasesSave = ""; - MessagesSave = ""; StockMarketSave = ""; SettingsSave = ""; VersionSave = ""; @@ -83,7 +81,6 @@ class BitburnerSaveObject { this.FactionsSave = JSON.stringify(Factions); this.AliasesSave = JSON.stringify(Aliases); this.GlobalAliasesSave = JSON.stringify(GlobalAliases); - this.MessagesSave = JSON.stringify(Messages); this.StockMarketSave = JSON.stringify(StockMarket); this.SettingsSave = JSON.stringify(Settings); this.VersionSave = JSON.stringify(CONSTANTS.VersionNumber); @@ -441,17 +438,6 @@ function loadGame(saveString: string): boolean { console.warn(`Save file did not contain a GlobalAliases property`); loadGlobalAliases(""); } - if (saveObj.hasOwnProperty("MessagesSave")) { - try { - loadMessages(saveObj.MessagesSave); - } catch (e) { - console.warn(`Could not load Messages from save`); - initMessages(); - } - } else { - console.warn(`Save file did not contain a Messages property`); - initMessages(); - } if (saveObj.hasOwnProperty("StockMarketSave")) { try { loadStockMarket(saveObj.StockMarketSave); diff --git a/src/engine.tsx b/src/engine.tsx index 43d459bdd..766832af8 100644 --- a/src/engine.tsx +++ b/src/engine.tsx @@ -25,7 +25,7 @@ import { } from "./PersonObjects/formulas/reputation"; import { hasHacknetServers, processHacknetEarnings } from "./Hacknet/HacknetHelpers"; import { iTutorialStart } from "./InteractiveTutorial"; -import { checkForMessagesToSend, initMessages } from "./Message/MessageHelpers"; +import { checkForMessagesToSend } from "./Message/MessageHelpers"; import { loadAllRunningScripts, updateOnlineScriptTimes } from "./NetscriptWorker"; import { Player } from "./Player"; import { saveObject, loadGame } from "./SaveObject"; @@ -439,7 +439,6 @@ const Engine: { initCompanies(); initFactions(); initAugmentations(); - initMessages(); updateSourceFileFlags(Player); // Start interactive tutorial