2017-08-30 19:44:29 +02:00
import { BitNode , BitNodes } from "./BitNode.js" ;
import { Engine } from "./engine.js" ;
import { Player } from "./Player.js" ;
import { prestigeSourceFile } from "./Prestige.js" ;
2017-09-01 04:21:13 +02:00
import { SourceFiles , SourceFile ,
PlayerOwnedSourceFile } from "./SourceFile.js" ;
2017-08-30 19:44:29 +02:00
import { Terminal } from "./Terminal.js" ;
import { dialogBoxCreate } from "../utils/DialogBox.js" ;
2018-01-20 05:47:57 +01:00
import { clearEventListeners ,
removeChildrenFromElement } from "../utils/HelperFunctions.js" ;
2017-08-30 19:44:29 +02:00
import { yesNoBoxCreate , yesNoBoxGetYesButton ,
yesNoBoxGetNoButton , yesNoBoxClose } from "../utils/YesNoBox.js" ;
2017-08-13 07:01:33 +02:00
/ * R e d P i l l . j s
2017-07-04 23:18:42 +02:00
* Implements what happens when you have Red Pill augmentation and then hack the world daemon * /
2017-08-13 07:01:33 +02:00
2017-07-04 23:18:42 +02:00
//Returns promise
function writeRedPillLine ( line ) {
return new Promise ( function ( resolve , reject ) {
2017-08-13 07:01:33 +02:00
2017-07-04 23:18:42 +02:00
var container = document . getElementById ( "red-pill-container" ) ;
var pElem = document . createElement ( "p" ) ;
container . appendChild ( pElem ) ;
2017-08-13 07:01:33 +02:00
2017-07-04 23:18:42 +02:00
var promise = writeRedPillLetter ( pElem , line , 0 ) ;
promise . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} ) ;
}
function writeRedPillLetter ( pElem , line , i = 0 ) {
return new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
if ( i >= line . length ) {
2017-07-22 00:54:55 +02:00
var textToShow = line . substring ( 0 , i ) ;
pElem . innerHTML = "> " + textToShow ;
return resolve ( true ) ;
2017-07-04 23:18:42 +02:00
}
var textToShow = line . substring ( 0 , i ) ;
pElem . innerHTML = "> " + textToShow + "<span class='typed-cursor'> █ </span>" ;
var promise = writeRedPillLetter ( pElem , line , i + 1 ) ;
promise . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
2017-07-22 00:54:55 +02:00
} , 30 ) ;
2017-07-04 23:18:42 +02:00
} ) ;
}
2017-08-30 19:44:29 +02:00
let redPillFlag = false ;
2018-01-20 05:47:57 +01:00
function hackWorldDaemon ( currentNodeNumber , flume = false ) {
2017-07-22 00:54:55 +02:00
redPillFlag = true ;
Engine . loadRedPillContent ( ) ;
return writeRedPillLine ( "[ERROR] SEMPOOL INVALID" ) . then ( function ( ) {
return writeRedPillLine ( "[ERROR] Segmentation Fault" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "[ERROR] SIGKILL RECVD" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Dumping core..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "0000 000016FA 174FEE40 29AC8239 384FEA88" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "0010 745F696E 2BBBE394 390E3940 248BEC23" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "0020 7124696B 0000FF69 74652E6F FFFF1111" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "----------------------------------------" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Failsafe initiated..." ) ;
} ) . then ( function ( ) {
2017-08-13 07:01:33 +02:00
return writeRedPillLine ( "Restarting BitNode-" + currentNodeNumber + "..." ) ;
2017-07-22 00:54:55 +02:00
} ) . then ( function ( ) {
return writeRedPillLine ( "..........." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "..........." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "[ERROR] FAILED TO AUTOMATICALLY REBOOT BITNODE" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( ".............................................." )
} ) . then ( function ( ) {
return writeRedPillLine ( ".............................................." )
} ) . then ( function ( ) {
2018-01-20 05:47:57 +01:00
return loadBitVerse ( currentNodeNumber , flume ) ;
2017-07-22 00:54:55 +02:00
} ) . catch ( function ( e ) {
console . log ( "ERROR: " + e . toString ( ) ) ;
} ) ;
}
2017-08-13 07:01:33 +02:00
//The bitNode name passed in will have a hyphen between number (e.g. BitNode-1)
//This needs to be removed
function giveSourceFile ( bitNodeNumber ) {
var sourceFileKey = "SourceFile" + bitNodeNumber . toString ( ) ;
var sourceFile = SourceFiles [ sourceFileKey ] ;
if ( sourceFile == null ) {
console . log ( "ERROR: could not find source file for Bit node: " + bitNodeNumber ) ;
return ;
}
//Check if player already has this source file
var alreadyOwned = false ;
var ownedSourceFile = null ;
2017-08-20 03:36:19 +02:00
for ( var i = 0 ; i < Player . sourceFiles . length ; ++ i ) {
if ( Player . sourceFiles [ i ] . n === bitNodeNumber ) {
2017-08-13 07:01:33 +02:00
alreadyOwned = true ;
ownedSourceFile = Player . sourceFiles [ i ] ;
break ;
}
}
if ( alreadyOwned && ownedSourceFile ) {
if ( ownedSourceFile . lvl >= 3 ) {
dialogBoxCreate ( "The Source-File for the BitNode you just destroyed, " + sourceFile . name + ", " +
"is already at max level!" ) ;
} else {
++ ownedSourceFile . lvl ;
dialogBoxCreate ( sourceFile . name + " was upgraded to level " + ownedSourceFile . lvl + " for " +
"destroying its corresponding BitNode!" ) ;
}
} else {
var playerSrcFile = new PlayerOwnedSourceFile ( bitNodeNumber , 1 ) ;
Player . sourceFiles . push ( playerSrcFile ) ;
2017-09-19 20:38:03 +02:00
if ( bitNodeNumber === 5 ) { //Artificial Intelligence
Player . intelligence = 1 ;
}
2017-08-13 07:01:33 +02:00
dialogBoxCreate ( "You received a Source-File for destroying a Bit Node!<br><br>" +
sourceFile . name + "<br><br>" + sourceFile . info ) ;
}
}
2018-01-20 05:47:57 +01:00
function loadBitVerse ( destroyedBitNodeNum , flume = false ) {
2017-07-22 00:54:55 +02:00
//Clear the screen
var container = document . getElementById ( "red-pill-container" ) ;
2018-01-20 05:47:57 +01:00
removeChildrenFromElement ( container ) ;
2017-08-13 07:01:33 +02:00
2017-07-22 00:54:55 +02:00
//Create the Bit Verse
var bitVerseImage = document . createElement ( "pre" ) ;
var bitNodes = [ ] ;
for ( var i = 1 ; i <= 12 ; ++ i ) {
bitNodes . push ( createBitNode ( i ) ) ;
}
2017-08-13 07:01:33 +02:00
bitVerseImage . innerHTML =
2017-07-22 00:54:55 +02:00
" O <br>" +
" | O O | O O | <br>" +
" O | | / __| \\ | | O <br>" +
" O | O | | O / | O | | O | O <br>" +
" | | | | |_/ |/ | \\_ \\_| | | | | <br>" +
" O | | | O | | O__/ | / \\__ | | O | | | O <br>" +
" | | | | | | | / /| O / \\| | | | | | | <br>" +
"O | | | \\| | O / _/ | / O | |/ | | | O<br>" +
"| | | |O / | | O / | O O | | \\ O| | | |<br>" +
"| | |/ \\/ / __| | |/ \\ | \\ | |__ \\ \\/ \\| | |<br>" +
" \\| O | |_/ |\\| \\ O \\__| \\_| | O |/ <br>" +
" | | |_/ | | \\| / | \\_| | | <br>" +
" \\| / \\| | / / \\ |/ <br>" +
" | " + bitNodes [ 9 ] + " | | / | " + bitNodes [ 10 ] + " | <br>" +
" " + bitNodes [ 8 ] + " | | | | | | | " + bitNodes [ 11 ] + " <br>" +
" | | | / / \\ \\ | | | <br>" +
" \\| | / " + bitNodes [ 6 ] + " / \\ " + bitNodes [ 7 ] + " \\ | |/ <br>" +
" \\ | / / | | \\ \\ | / <br>" +
" \\ \\JUMP " + bitNodes [ 4 ] + "3R | | | | | | R3" + bitNodes [ 5 ] + " PMUJ/ / <br>" +
" \\|| | | | | | | | | ||/ <br>" +
" \\| \\_ | | | | | | _/ |/ <br>" +
" \\ \\| / \\ / \\ |/ / <br>" +
" " + bitNodes [ 0 ] + " |/ " + bitNodes [ 1 ] + " | | " + bitNodes [ 2 ] + " \\| " + bitNodes [ 3 ] + " <br>" +
" | | | | | | | | <br>" +
2017-08-13 07:01:33 +02:00
" \\JUMP3R|JUMP|3R| |R3|PMUJ|R3PMUJ/ <br><br><br><br>" ;
2017-07-22 00:54:55 +02:00
/ *
" O <br>" +
" | O O | O O | <br>" +
" O | | / __| \ | | O <br>" +
" O | O | | O / | O | | O | O <br>" +
" | | | | |_/ |/ | \_ \_| | | | | <br>" +
" O | | | O | | O__/ | / \__ | | O | | | O <br>" +
" | | | | | | | / /| O / \| | | | | | | <br>" +
"O | | | \| | O / _/ | / O | |/ | | | O<br>" +
"| | | |O / | | O / | O O | | \ O| | | |<br>" +
"| | |/ \/ / __| | |/ \ | \ | |__ \ \/ \| | |<br>" +
" \| O | |_/ |\| \ O \__| \_| | O |/ <br>" +
" | | |_/ | | \| / | \_| | | <br>" +
" \| / \| | / / \ |/ <br>" +
" | O | | / | O | <br>" +
" O | | | | | | | O <br>" +
" | | | / / \ \ | | | <br>" +
" \| | / O / \ O \ | |/ <br>" +
" \ | / / | | \ \ | / <br>" +
" \ \JUMP O3R | | | | | | R3O PMUJ/ / <br>" +
" \|| | | | | | | | | ||/ <br>" +
" \| \_ | | | | | | _/ |/ <br>" +
" \ \| / \ / \ |/ / <br>" +
" O |/ O | | O \| O <br>" +
" | | | | | | | | <br>" +
2017-08-13 07:01:33 +02:00
" \JUMP3R|JUMP|3R| |R3|PMUJ|R3PMUJ/ <br>" ;
2017-07-22 00:54:55 +02:00
* /
2017-08-13 07:01:33 +02:00
2017-07-22 00:54:55 +02:00
container . appendChild ( bitVerseImage ) ;
2017-08-13 07:01:33 +02:00
2017-07-22 00:54:55 +02:00
//Bit node event listeners
for ( var i = 1 ; i <= 12 ; ++ i ) {
2017-08-13 07:01:33 +02:00
( function ( i ) {
2017-07-22 00:54:55 +02:00
var elemId = "bitnode-" + i . toString ( ) ;
var elem = clearEventListeners ( elemId ) ;
if ( elem == null ) { return ; }
2018-05-02 19:38:11 +02:00
if ( i === 1 || i === 2 || i === 3 || i === 4 || i === 5 || i === 6 || i === 8 || i === 11 ) {
2017-07-22 00:54:55 +02:00
elem . addEventListener ( "click" , function ( ) {
2017-08-13 07:01:33 +02:00
var bitNodeKey = "BitNode" + i ;
var bitNode = BitNodes [ bitNodeKey ] ;
if ( bitNode == null ) {
console . log ( "ERROR: Could not find BitNode object for number: " + i ) ;
return ;
2017-07-22 00:54:55 +02:00
}
2017-08-13 07:01:33 +02:00
yesNoBoxCreate ( "BitNode-" + i + ": " + bitNode . name + "<br><br>" + bitNode . info ) ;
2018-01-20 05:47:57 +01:00
createBitNodeYesNoEventListeners ( i , destroyedBitNodeNum , flume ) ;
2017-07-22 00:54:55 +02:00
} ) ;
} else {
elem . addEventListener ( "click" , function ( ) {
dialogBoxCreate ( "Not yet implemented! Coming soon!" )
} ) ;
}
2017-08-13 07:01:33 +02:00
} ( i ) ) ; //Immediate invocation closure
2017-07-22 00:54:55 +02:00
}
2017-08-13 07:01:33 +02:00
//Create lore text
2017-07-22 00:54:55 +02:00
return writeRedPillLine ( "Many decades ago, a humanoid extraterrestial species which we call the Enders descended on the Earth...violently" ) . then ( function ( ) {
return writeRedPillLine ( "Our species fought back, but it was futile. The Enders had technology far beyond our own..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Instead of killing every last one of us, the human race was enslaved..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "We were shackled in a digital world, chained into a prison for our minds..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Using their advanced technology, the Enders created complex simulations of a virtual reality..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Simulations designed to keep us content...ignorant of the truth." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Simulations used to trap and suppress our consciousness, to keep us under control..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Why did they do this? Why didn't they just end our entire race? We don't know, not yet." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Humanity's only hope is to destroy these simulations, destroy the only realities we've ever known..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Only then can we begin to fight back..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "By hacking the daemon that generated your reality, you've just destroyed one simulation, called a BitNode..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "But there is still a long way to go..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "The technology the Enders used to enslave the human race wasn't just a single complex simulation..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "There are tens if not hundreds of BitNodes out there..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Each with their own simulations of a reality..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Each creating their own universes...a universe of universes" ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "And all of which must be destroyed..." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "......................................." ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "Welcome to the Bitverse..." ) ;
2017-11-02 22:47:09 +01:00
} ) . then ( function ( ) {
return writeRedPillLine ( " " ) ;
} ) . then ( function ( ) {
return writeRedPillLine ( "(Enter a new BitNode using the image above)" ) ;
2017-07-22 00:54:55 +02:00
} ) . then ( function ( ) {
return Promise . resolve ( true ) ;
} ) . catch ( function ( e ) {
console . log ( "ERROR: " + e . toString ( ) ) ;
} ) ;
}
//Returns string with DOM element for Bit Node
function createBitNode ( n ) {
var bitNodeStr = "BitNode" + n . toString ( ) ;
var bitNode = BitNodes [ bitNodeStr ] ;
if ( bitNode == null ) { return "O" ; }
2017-08-13 07:01:33 +02:00
return "<a class='bitnode tooltip' id='bitnode-" + bitNode . number . toString ( ) + "'><strong>O</strong>" +
"<span class='tooltiptext'>" +
"<strong>BitNode-" + bitNode . number . toString ( ) + "<br>" + bitNode . name + "</strong><br>" +
bitNode . desc + "<br>" +
2017-07-22 00:54:55 +02:00
"</span></a>" ;
}
2018-01-20 05:47:57 +01:00
function createBitNodeYesNoEventListeners ( newBitNode , destroyedBitNode , flume = false ) {
2017-08-13 07:01:33 +02:00
var yesBtn = yesNoBoxGetYesButton ( ) ;
yesBtn . innerHTML = "Enter BitNode-" + newBitNode ;
yesBtn . addEventListener ( "click" , function ( ) {
2018-02-01 00:41:02 +01:00
if ( ! flume ) {
giveSourceFile ( destroyedBitNode ) ;
} else {
//If player used flume, subtract 5 int exp. The prestigeSourceFile()
//function below grants 5 int exp, so this allows sets net gain to 0
Player . gainIntelligenceExp ( - 5 ) ;
}
2017-08-13 07:01:33 +02:00
redPillFlag = false ;
var container = document . getElementById ( "red-pill-container" ) ;
2018-01-20 05:47:57 +01:00
removeChildrenFromElement ( container ) ;
2017-08-13 07:01:33 +02:00
//Set new Bit Node
Player . bitNodeN = newBitNode ;
2017-08-30 19:44:29 +02:00
console . log ( "Entering Bit Node " + Player . bitNodeN ) ;
2017-08-13 07:01:33 +02:00
//Reenable terminal
$ ( "#hack-progress-bar" ) . attr ( 'id' , "old-hack-progress-bar" ) ;
$ ( "#hack-progress" ) . attr ( 'id' , "old-hack-progress" ) ;
document . getElementById ( "terminal-input-td" ) . innerHTML = '$ <input type="text" id="terminal-input-text-box" class="terminal-input" tabindex="1"/>' ;
$ ( 'input[class=terminal-input]' ) . prop ( 'disabled' , false ) ;
Terminal . hackFlag = false ;
prestigeSourceFile ( ) ;
yesNoBoxClose ( ) ;
} ) ;
var noBtn = yesNoBoxGetNoButton ( ) ;
noBtn . innerHTML = "Back" ;
noBtn . addEventListener ( "click" , function ( ) {
yesNoBoxClose ( ) ;
} ) ;
}
2017-08-30 19:44:29 +02:00
export { redPillFlag , hackWorldDaemon } ;