diff --git a/index.html b/index.html
index 20f7cebb3..30914e2ef 100644
--- a/index.html
+++ b/index.html
@@ -50,6 +50,7 @@
+
@@ -212,6 +213,9 @@
Snap Fitness Gym
+
+ The Slums
+
@@ -529,6 +548,19 @@
Travel to New Tokyo
Travel to Ishima
Travel to Volhaven
+
+
+
+ You have entered the Slums, a poverty-ridden district filled with gangs, criminals, and
+ other shadowy entities. The city's government and police have neglected this area for years...
+
+ Shoplift
+ Mug someone
+ Deal drugs
+ Traffick illegal arms
+ Homicide
+ Kidnap and ransom
+
diff --git a/src/Constants.js b/src/Constants.js
index 265543cd6..f035aa5e5 100644
--- a/src/Constants.js
+++ b/src/Constants.js
@@ -63,6 +63,7 @@ CONSTANTS = {
WorkTypeFaction: "Working for Faction",
WorkTypeCreateProgram: "Working on Create a Program",
WorkTypeStudyClass: "Studying or Taking a class at university",
+ WorkTypeCrime: "Committing a crime",
ClassStudyComputerScience: "studying Computer Science",
ClassDataStructures: "taking a Data Structures course",
@@ -71,6 +72,13 @@ CONSTANTS = {
ClassManagement: "taking a Management course",
ClassLeadership: "taking a Leadership course",
+ CrimeShoplift: "shoplift",
+ CrimeMug: "mug someone",
+ CrimeDrugs: "deal drugs",
+ CrimeTraffickArms: "traffick illegal arms",
+ CrimeHomicide: "commit homicide",
+ CrimeKidnap: "kidnap someone for ransom",
+
//Text that is displayed when the 'help' command is ran in Terminal
HelpText: "analyze Get statistics and information about current machine
" +
"clear Clear all text on the terminal
" +
diff --git a/src/Crimes.js b/src/Crimes.js
new file mode 100644
index 000000000..402ba4f39
--- /dev/null
+++ b/src/Crimes.js
@@ -0,0 +1,8 @@
+/* Crimes.js */
+
+ Shoplift
+ Mug someone
+ Deal Drugs
+ Traffick illegal arms
+ Homicide
+ Kidnap and ransom
\ No newline at end of file
diff --git a/src/Faction.js b/src/Faction.js
index 9736b3453..cd70b6aa4 100644
--- a/src/Faction.js
+++ b/src/Faction.js
@@ -347,7 +347,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
if (speakersforthedeadFac.isBanned == false && speakersforthedeadFac.isMember == false &&
this.hacking_skill >= 100 && this.strength >= 300 && this.defense >= 300 &&
this.dexterity >= 300 && this.agility >= 300 && this.numPeopleKilled >= 10 &&
- this.numPeopleKilledTotal >= 100 && this.companyName != Locations.Sector12CIA &&
+ this.numPeopleKilledTotal >= 100 && this.karma <= -50 && this.companyName != Locations.Sector12CIA &&
this.companyName != Locations.Sector12NSA) {
invitedFactions.push(speakersforthedeadFac);
}
@@ -357,7 +357,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
if (thedarkarmyFac.isBanned == false && thedarkarmyFac.isMember == false &&
this.hacking_skill >= 300 && this.strength >= 300 && this.defense >= 300 &&
this.dexterity >= 300 && this.agility >= 300 && this.location == Locations.Chongqing &&
- this.numPeopleKilled >= 5 && this.companyName != Locations.Sector12CIA &&
+ this.numPeopleKilled >= 5 && this.karma <= -50 && this.companyName != Locations.Sector12CIA &&
this.companyName != Locations.Sector12NSA) {
invitedFactions.push(thedarkarmyFac);
}
@@ -368,8 +368,8 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
this.hacking_skill >= 200 && this.strength >= 200 && this.defense >= 200 &&
this.dexterity >= 200 && this.agility >= 200 &&
(this.location == Locations.Aevum || this.location == Locations.Sector12) &&
- this.money >= 10000000 && this.companyName != Locations.Sector12CIA &&
- this.companyName != Locations.Sector12NSA) {
+ this.money >= 10000000 && this.karma <= -100 &&
+ this.companyName != Locations.Sector12CIA && this.companyName != Locations.Sector12NSA) {
invitedFactions.push(thesyndicateFac);
}
@@ -379,7 +379,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
(this.companyPosition.positionName == CompanyPositions.CTO.positionName ||
this.companyPosition.positionName == CompanyPositions.CFO.positionName ||
this.companyPosition.positionName == CompanyPositions.CEO.positionName) &&
- this.money >= 15000000) {
+ this.money >= 15000000 && this.karma <= -25) {
invitedFactions.push(silhouetteFac);
}
diff --git a/src/Location.js b/src/Location.js
index 1697ea357..d13de583a 100644
--- a/src/Location.js
+++ b/src/Location.js
@@ -10,7 +10,6 @@ Locations = {
Ishima: "Ishima",
Volhaven: "Volhaven",
-
//Aevum Locations
AevumTravelAgency: "Aevum Travel Agency",
AevumSummitUniversity: "Summit University",
@@ -26,11 +25,13 @@ Locations = {
AevumNetLinkTechnologies: "NetLink Technologies",
AevumCrushFitnessGym: "Crush Fitness Gym",
AevumSnapFitnessGym: "Snap Fitness Gym",
+ AevumSlums: "Aevum Slums",
//Chongqing locations
ChongqingTravelAgency: "Chongqing Travel Agency",
ChongqingKuaiGongInternational: "KuaiGong International",
ChongqingSolarisSpaceSystems: "Solaris Space Systems",
+ ChongqingSlums: "Chongqing Slums",
//Sector 12
Sector12TravelAgency: "Sector-12 Travel Agency",
@@ -49,6 +50,7 @@ Locations = {
Sector12JoesGuns: "Joe's Guns",
Sector12IronGym: "Iron Gym",
Sector12PowerhouseGym: "Powerhouse Gym",
+ Sector12Slums: "Sector12 Slums",
//New Tokyo
NewTokyoTravelAgency: "New Tokyo Travel Agency",
@@ -56,12 +58,14 @@ Locations = {
NewTokyoVitaLife: "VitaLife",
NewTokyoGlobalPharmaceuticals: "Global Pharmaceuticals",
NewTokyoNoodleBar: "Noodle Bar",
+ NewTokyoSlums: "New Tokyo Slums"
//Ishima
IshimaTravelAgency: "Ishima Travel Agency",
IshimaStormTechnologies: "Storm Technologies",
IshimaNovaMedical: "Nova Medical",
IshimaOmegaSoftware: "Omega Software",
+ IshimaSlums: "Ishima Slums",
//Volhaven
VolhavenTravelAgency: "Volhaven Travel Agency",
@@ -74,6 +78,7 @@ Locations = {
VolhavenSysCoreSecurities: "SysCore Securities",
VolhavenCompuTek: "CompuTek",
VolhavenMilleniumFitnessGym: "Millenium Fitness Gym",
+ VolhavenSlums: "Volhaven Slums",
}
displayLocationContent = function() {
@@ -136,6 +141,14 @@ displayLocationContent = function() {
var travelToIshima = document.getElementById("location-travel-to-ishima");
var travelToVolhaven = document.getElementById("location-travel-to-volhaven");
+ var slumsDescText = document.getElementById("location-slums-description");
+ var slumsShoplift = document.getElementById("location-slums-shoplift");
+ var slumsMug = document.getElementById("location-slums-mug");
+ var slumsDealDrugs = document.getElementById("location-slums-deal-drugs");
+ var slumsTrafficArms = document.getElementById("location-slums-traffic-arms");
+ var slumsHomicide = document.getElementById("location-slums-homicide");
+ var slumsKidnap = document.getElementById("location-slums-kidnap");
+
var loc = Player.location;
returnToWorld.addEventListener("click", function() {
@@ -203,6 +216,14 @@ displayLocationContent = function() {
travelToIshima.style.display = "none";
travelToVolhaven.style.display = "none";
+ slumsDescText.style.display = "none";
+ slumsShoplift.style.display = "none";
+ slumsMug.style.display = "none";
+ slumsDealDrugs.style.display = "none";
+ slumsTrafficArms.style.display = "none";
+ slumsHomicide.style.display = "none";
+ slumsKidnap.style.display = "none";
+
//Check if the player is employed at this Location. If he is, display the "Work" button,
//update the job title, etc.
if (loc == Player.companyName) {
@@ -785,6 +806,21 @@ displayLocationContent = function() {
gymTrainAgi.style.display = "block";
break;
+ //All Slums
+ case Locations.AevumSlums:
+ case Locations.ChongqingSlums:
+ case Locations.Sector12Slums:
+ case Locations.NewTokyokSlums:
+ case Locations.IshimaSlums:
+ case Locations.VolhavenSlums:
+ slumsDescText.style.display = "block";
+ slumsShoplift.style.display = "block";
+ slumsMug.style.display = "block";
+ slumsDealDrugs.style.display = "block";
+ slumsTrafficArms.style.display = "block";
+ slumsHomicide.style.display = "block";
+ slumsKidnap.style.display = "block";
+
default:
console.log("ERROR: INVALID LOCATION");
@@ -901,6 +937,13 @@ initLocationButtons = function() {
Engine.loadLocationContent();
return false;
});
+
+ aevumSlums = document.getElementById("aevum-slums");
+ aevumSlums.addEventListener("click", function() {
+ Player.location = Locations.AevumSlums;
+ Engine.loadLocationContent();
+ return false;
+ });
chongqingTravelAgency = document.getElementById("chongqing-travelagency");
chongqingTravelAgency.addEventListener("click", function() {
@@ -922,6 +965,14 @@ initLocationButtons = function() {
Engine.loadLocationContent();
return false;
});
+
+ chongqingSlums = document.getElementById("chongqing-slums");
+ chongqingSlums.addEventListener("click", function() {
+ Player.location = Locations.ChongqingSlums;
+ Engine.loadLocationContent();
+ return false;
+ });
+
sector12TravelAgency = document.getElementById("sector12-travelagency");
sector12TravelAgency.addEventListener("click", function() {
@@ -1034,6 +1085,13 @@ initLocationButtons = function() {
Engine.loadLocationContent();
return false;
});
+
+ sector12Slums = document.getElementById("sector12-slums");
+ sector12Slums.addEventListener("click", function() {
+ Player.location = Locations.Sector12Slums;
+ Engine.loadLocationContent();
+ return false;
+ });
newTokyoTravelAgency = document.getElementById("newtokyo-travelagency");
newTokyoTravelAgency.addEventListener("click", function() {
@@ -1069,6 +1127,13 @@ initLocationButtons = function() {
Engine.loadLocationContent();
return false;
});
+
+ newTokyoSlums = document.getElementByID("newtokyo-slums");
+ newTokyoSlums.addEventListener("click", function() {
+ Player.location = Locations.NewTokyoSlums;
+ Engine.loadLocationContent();
+ return false;
+ });
ishimaTravelAgency = document.getElementById("ishima-travelagency");
ishimaTravelAgency.addEventListener("click", function() {
@@ -1097,6 +1162,13 @@ initLocationButtons = function() {
Engine.loadLocationContent();
return false;
});
+
+ ishimaSlums = document.getElementById("ishima-slums");
+ ishimaSlums.addEventListener("click", function() {
+ Player.location = Locations.IshimaSlums;
+ Engine.loadLocationContent();
+ return false;
+ });
volhavenTravelAgency = document.getElementById("volhaven-travelagency");
volhavenTravelAgency.addEventListener("click", function() {
@@ -1168,6 +1240,13 @@ initLocationButtons = function() {
return false;
});
+ volhavenSlums = document.getElementById("volhaven-slums");
+ volhavenSlums.addEventListener("click", function() {
+ Player.location = Locations.VolhavenSlums;
+ Engine.loadLocationContent();
+ return false;
+ });
+
//Buttons to interact at a location (apply for job/promotion, train, purchase, etc.)
var softwareJob = document.getElementById("location-software-job");
@@ -1208,6 +1287,13 @@ initLocationButtons = function() {
var travelToIshima = document.getElementById("location-travel-to-ishima");
var travelToVolhaven = document.getElementById("location-travel-to-volhaven");
+ var slumsShoplift = document.getElementById("location-slums-shoplift");
+ var slumsMug = document.getElementById("location-slums-mug");
+ var slumsDealDrugs = document.getElementById("location-slums-deal-drugs");
+ var slumsTrafficArms = document.getElementById("location-slums-traffic-arms");
+ var slumsHomicide = document.getElementById("location-slums-homicide");
+ var slumsKidnap = document.getElementById("location-slums-kidnap");
+
softwareJob.addEventListener("click", function() {
Player.applyForSoftwareJob();
return false;
@@ -1348,6 +1434,15 @@ initLocationButtons = function() {
return false;
});
+ //TODO
+ /*
+ var slumsShoplift = document.getElementById("location-slums-shoplift");
+ var slumsMug = document.getElementById("location-slums-mug");
+ var slumsDealDrugs = document.getElementById("location-slums-deal-drugs");
+ var slumsTrafficArms = document.getElementById("location-slums-traffic-arms");
+ var slumsHomicide = document.getElementById("location-slums-homicide");
+ var slumsKidnap = document.getElementById("location-slums-kidnap");
+ */
}
travelToCity = function(destCityName, cost) {
diff --git a/src/Player.js b/src/Player.js
index 9348a66a5..2570f3036 100644
--- a/src/Player.js
+++ b/src/Player.js
@@ -61,7 +61,7 @@ function PlayerObject() {
//Money
this.money = 1000;
- this.total_money = 0; //Total money ever earned
+ this.total_money = 0; //Total money ever earned in this "simulation"
this.lifetime_money = 0; //Total money ever earned
//IP Address of Starting (home) computer
@@ -88,10 +88,26 @@ function PlayerObject() {
this.augmentations = []; //Names of all installed augmentations
this.numAugmentations = 0;
- //Misc statistics
- this.numPeopleKilled = 0;
- this.numPeopleKilledTotal = 0;
- this.numPeopleKilledLifetime = 0;
+ //Crime statistics (Total refers to this 'simulation'. Lifetime is forever)
+ this.karma = 0;
+ this.numTimesShoplifted = 0;
+ this.numTimesShopliftedTotal = 0;
+ this.numTimesShopliftedLifetime = 0;
+ this.numPeopleMugged = 0;
+ this.numPeopleMuggedTotal = 0;
+ this.numPeopleMuggedLifetime = 0;
+ this.numTimesDealtDrugs = 0;
+ this.numTimesDealtDrugsTotal = 0;
+ this.numTimesDealtDrugsLifetime = 0;
+ this.numTimesTraffickArms = 0;
+ this.numTimesTraffickArmsTotal = 0;
+ this.numTimesTrafficksArmsLifetime = 0;
+ this.numPeopleKilled = 0;
+ this.numPeopleKilledTotal = 0;
+ this.numPeopleKilledLifetime = 0;
+ this.numTimesKidnapped = 0;
+ this.numTimesKidnappedTotal = 0;
+ this.numTimesKidnappedLifetime = 0;
//Achievements and achievement progress
@@ -130,6 +146,8 @@ function PlayerObject() {
this.className = "";
+ this.crimeType = "";
+
this.timeWorked = 0; //in ms
this.timeNeededToCompleteWork = 0;
@@ -303,6 +321,43 @@ PlayerObject.prototype.gainCharismaExp = function(exp) {
console.log("ERR: NaN passed into Player.gainCharismaExp()"); return;
}
this.charisma_exp += exp;
+}
+
+/******* Working functions *******/
+PlayerObject.prototype.resetWorkStatus = function() {
+ this.workHackExpGainRate = 0;
+ this.workStrExpGainRate = 0;
+ this.workDefExpGainRate = 0;
+ this.workDexExpGainRate = 0;
+ this.workAgiExpGainRate = 0;
+ this.workChaExpGainRate = 0;
+ this.workRepGainRate = 0;
+ this.workMoneyGainRate = 0;
+
+ this.workHackExpGained = 0;
+ this.workStrExpGained = 0;
+ this.workDefExpGained = 0;
+ this.workDexExpGained = 0;
+ this.workAgiExpGained = 0;
+ this.workChaExpGained = 0;
+ this.workRepGained = 0;
+ this.workMoneyGained = 0;
+
+ this.timeWorked = 0;
+
+ this.currentWorkFactionName = "";
+ this.currentWorkFactionDescription = "";
+ this.createProgramName = "";
+ this.className = "";
+}
+
+PlayerObject.prototype.gainWorkExp = function(divMult = 1) {
+ this.gainHackingExp(this.workHackExpGained / divMult);
+ this.gainStrengthExp(this.workStrExpGained / divMult);
+ this.gainDefenseExp(this.workDefExpGained / divMult);
+ this.gainDexterityExp(this.workDexExpGained / divMult);
+ this.gainAgilityExp(this.workAgiExpGained / divMult);
+ this.gainCharismaExp(this.workChaExpGained / divMult);
}
/* Working for Company */
@@ -314,12 +369,8 @@ PlayerObject.prototype.finishWork = function(cancelled) {
if (Engine.Debug) {
console.log("Player finishWork() called with " + this.workMoneyGained / cancMult + " $ gained");
}
- this.gainHackingExp(this.workHackExpGained / cancMult);
- this.gainStrengthExp(this.workStrExpGained / cancMult);
- this.gainDefenseExp(this.workDefExpGained / cancMult);
- this.gainDexterityExp(this.workDexExpGained / cancMult);
- this.gainAgilityExp(this.workAgiExpGained / cancMult);
- this.gainCharismaExp(this.workChaExpGained / cancMult);
+
+ this.gainWorkExp(cancMult);
var company = Companies[this.companyName];
company.playerReputation += (this.workRepGained / cancMult);
@@ -365,11 +416,9 @@ PlayerObject.prototype.finishWork = function(cancelled) {
}
PlayerObject.prototype.startWork = function() {
+ this.resetWorkStatus();
this.isWorking = true;
this.workType = CONSTANTS.WorkTypeCompany;
- this.currentWorkFactionName = "";
- this.currentWorkFactionDescription = "";
- this.createProgramName = "";
this.workHackExpGainRate = this.getWorkHackExpGain();
this.workStrExpGainRate = this.getWorkStrExpGain();
@@ -380,16 +429,6 @@ PlayerObject.prototype.startWork = function() {
this.workRepGainRate = this.getWorkRepGain();
this.workMoneyGainRate = this.getWorkMoneyGain();
- this.workHackExpGained = 0;
- this.workStrExpGained = 0;
- this.workDefExpGained = 0;
- this.workDexExpGained = 0;
- this.workAgiExpGained = 0;
- this.workChaExpGained = 0;
- this.workRepGained = 0;
- this.workMoneyGained = 0;
-
- this.timeWorked = 0;
this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours;
var cancelButton = document.getElementById("work-in-progress-cancel-button");
@@ -459,12 +498,7 @@ PlayerObject.prototype.work = function(numCycles) {
/* Working for Faction */
PlayerObject.prototype.finishFactionWork = function(cancelled, faction) {
- this.gainHackingExp(this.workHackExpGained);
- this.gainStrengthExp(this.workStrExpGained);
- this.gainDefenseExp(this.workDefExpGained);
- this.gainDexterityExp(this.workDexExpGained);
- this.gainAgilityExp(this.workAgiExpGained);
- this.gainCharismaExp(this.workChaExpGained);
+ this.gainWorkExp();
var faction = Factions[this.currentWorkFactionName];
faction.playerReputation += (this.workRepGained);
@@ -497,18 +531,7 @@ PlayerObject.prototype.startFactionWork = function(faction) {
this.isWorking = true;
this.workType = CONSTANTS.WorkTypeFaction;
this.currentWorkFactionName = faction.name;
- this.createProgramName = "";
- this.workHackExpGained = 0;
- this.workStrExpGained = 0;
- this.workDefExpGained = 0;
- this.workDexExpGained = 0;
- this.workAgiExpGained = 0;
- this.workChaExpGained = 0;
- this.workRepGained = 0;
- this.workMoneyGained = 0;
-
- this.timeWorked = 0;
this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer20Hours;
var cancelButton = document.getElementById("work-in-progress-cancel-button");
@@ -527,14 +550,10 @@ PlayerObject.prototype.startFactionWork = function(faction) {
}
PlayerObject.prototype.startFactionHackWork = function(faction) {
+ this.resetWorkStatus();
+
this.workHackExpGainRate = .02 * this.hacking_exp_mult;
- this.workStrExpGainRate = 0;
- this.workDefExpGainRate = 0;
- this.workDexExpGainRate = 0;
- this.workAgiExpGainRate = 0;
- this.workChaExpGainRate = 0;
this.workRepGainRate = this.hacking_skill / CONSTANTS.MaxSkillLevel * this.faction_rep_mult;
- this.workMoneyGainRate = 0;
this.factionWorkType = CONSTANTS.FactionWorkHacking;
this.currentWorkFactionDescription = "carrying out hacking contracts";
@@ -543,6 +562,8 @@ PlayerObject.prototype.startFactionHackWork = function(faction) {
}
PlayerObject.prototype.startFactionFieldWork = function(faction) {
+ this.resetWorkStatus();
+
this.workHackExpGainRate = .05 * this.hacking_exp_mult;
this.workStrExpGainRate = .05 * this.strength_exp_mult;
this.workDefExpGainRate = .05 * this.defense_exp_mult;
@@ -550,7 +571,6 @@ PlayerObject.prototype.startFactionFieldWork = function(faction) {
this.workAgiExpGainRate = .05 * this.agility_exp_mult;
this.workChaExpGainRate = .05 * this.charisma_exp_mult;
this.workRepGainRate = this.getFactionFieldWorkRepGain();
- this.workMoneyGainRate = 0;
this.factionWorkType = CONSTANTS.factionWorkField;
this.currentWorkFactionDescription = "carrying out field missions"
@@ -559,14 +579,15 @@ PlayerObject.prototype.startFactionFieldWork = function(faction) {
}
PlayerObject.prototype.startFactionSecurityWork = function(faction) {
- this.workHackExpGainRate = .1 * this.hacking_exp_mult;
- this.workStrExpGainRate = 0;
- this.workDefExpGainRate = 0;
- this.workDexExpGainRate = 0;
- this.workAgiExpGainRate = 0;
- this.workChaExpGainRate = 0;
+ this.resetWorkStatus();
+
+ this.workHackExpGainRate = 0.01 * this.hacking_exp_mult;
+ this.workStrExpGainRate = 0.01 * this.strength_exp_mult;
+ this.workDefExpGainRate = 0.01 * this.defense_exp_mult;
+ this.workDexExpGainRate = 0.01 * this.dexterity_exp_mult;
+ this.workAgiExpGainRate = 0.01 * this.agility_exp_mult;
+ this.workChaExpGainRate = 0.01 * this.charisma_exp_mult;
this.workRepGainRate = this.getFactionSecurityWorkRepGain();
- this.workMoneyGainRate = 0;
this.factionWorkType = CONSTANTS.FactionWorkSecurity;
this.currentWorkFactionDescription = "performing security detail"
@@ -709,14 +730,12 @@ PlayerObject.prototype.getFactionFieldWorkRepGain = function() {
/* Creating a Program */
PlayerObject.prototype.startCreateProgramWork = function(programName, time) {
+ this.resetWorkStatus();
this.isWorking = true;
this.workType = CONSTANTS.WorkTypeCreateProgram;
- this.timeWorked = 0;
this.timeNeededToCompleteWork = time;
- this.currentWorkFactionName = "";
- this.currentWorkFactionDescription = "";
this.createProgramName = programName;
var cancelButton = document.getElementById("work-in-progress-cancel-button");
@@ -767,28 +786,12 @@ PlayerObject.prototype.finishCreateProgramWork = function(cancelled, programName
/* Studying/Taking Classes */
PlayerObject.prototype.startClass = function(costMult, expMult, className) {
+ this.resetWorkStatus();
this.isWorking = true;
this.workType = CONSTANTS.WorkTypeStudyClass;
- this.timeWorked = 0;
this.className = className;
- this.workStrExpGainRate = 0;
- this.workDefExpGainRate = 0;
- this.workDexExpGainRate = 0;
- this.workAgiExpGainRate = 0;
- this.workRepGainRate = 0;
- this.workMoneyGainRate = 0;
-
- this.workHackExpGained = 0;
- this.workStrExpGained = 0;
- this.workDefExpGained = 0;
- this.workDexExpGained = 0;
- this.workAgiExpGained = 0;
- this.workChaExpGained = 0;
- this.workRepGained = 0;
- this.workMoneyGained = 0;
-
var gameCPS = 1000 / Engine._idleSpeed;
//Base costs/exp (per second)
var baseDataStructuresCost = 1;
@@ -871,9 +874,7 @@ PlayerObject.prototype.takeClass = function(numCycles) {
this.workMoneyGained -= this.workMoneyLossRate * numCycles;
var cyclesPerSec = 1000 / Engine._idleSpeed;
-
- //TODO Account for running out of money when numCycles is very big
-
+
var txt = document.getElementById("work-in-progress-text");
txt.innerHTML = "You have been " + className + " for " + convertTimeMsToTimeElapsedString(this.timeWorked) + ".
" +
"This has cost you:
" +
@@ -885,17 +886,11 @@ PlayerObject.prototype.takeClass = function(numCycles) {
this.workDexExpGained.toFixed(3) + " (" + (this.workDexExpGainRate * cyclesPerSec).toFixed(3) + " / sec) dexterity exp
" +
this.workAgiExpGained.toFixed(3) + " (" + (this.workAgiExpGainRate * cyclesPerSec).toFixed(3) + " / sec) agility exp
" +
this.workChaExpGained.toFixed(3) + " (" + (this.workChaExpGainRate * cyclesPerSec).toFixed(3) + " / sec) charisma exp
" +
- "You may cancel at any time";
-
+ "You may cancel at any time";
}
PlayerObject.prototype.finishClass = function() {
- this.gainHackingExp(this.workHackExpGained);
- this.gainStrengthExp(this.workStrExpGained);
- this.gainDefenseExp(this.workDefExpGained);
- this.gainDexterityExp(this.workDexExpGained);
- this.gainAgilityExp(this.workAgiExpGained);
- this.gainCharismaExp(this.workChaExpGained);
+ this.gainWorkExp();
if (this.workMoneyGained > 0) {
throw new Error("ERR: Somehow gained money while taking class");
@@ -923,6 +918,90 @@ PlayerObject.prototype.finishClass = function() {
Engine.loadTerminalContent();
}
+//The EXP and $ gains are hardcoded. Time is in ms
+PlayerObject.prototype.startCrime = function(hackExp, strExp, defExp, dexExp, agiExp, chaExp, money, time) {
+ this.resetWorkStatus();
+ this.isWorking = true;
+ this.workType = CONSTANTS.WorkTypeCrime;
+
+ this.workHackExpGained = hackExp;
+ this.workStrExpGained = strExp;
+ this.workDefExpGained = defExp;
+ this.workDexExpGained = dexExp;
+ this.workAgiExpGained = agiExp;
+ this.workChaExpGained = chaExp;
+ this.workMoneyGained = money;
+
+ this.timeNeededToCompleteWork = time;
+
+ var cancelButton = document.getElementById("work-in-progress-cancel-button");
+
+ //Remove all old event listeners from Cancel button
+ var newCancelButton = cancelButton.cloneNode(true);
+ cancelButton.parentNode.replaceChild(newCancelButton, cancelButton);
+
+ newCancelButton.addEventListener("click", function() {
+ Player.finishCrime(true);
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ Engine.loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.commitCrime = function () {
+ this.timeWorked += Engine._idleSpeed * numCycles;
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You are attempting to " + Player.crimeType + ".
" +
+ "Time remaining: " + convertTimeMsToTimeElapsedString(this.timeNeededToCompleteWork - this.timeWorked);
+}
+
+PlayerObject.prototype.finishCrime = function(cancelled) {
+ if (cancelled) {
+ //Do nothing
+ } else {
+ this.gainWorkExp();
+ this.gainMoney(this.workMoneyGained);
+
+ //Handle Karma and crime statistics
+ switch(this.crimeType) {
+ case CONSTANTS.CrimeShoplift:
+ this.karma -= 0.1;
+ ++this.numTimesShoplifted;
+ break;
+ case CONSTANTS.CrimeMug:
+ this.karma -= 0.2;
+ ++this.numPeopleMugged;
+ break;
+ case CONSTANTS.CrimeDrugs:
+ ++this.numTimesDealtDrugs;
+ this.karma -= 0.5;
+ break;
+ case CONSTANTS.CrimeTraffickArms:
+ ++this.numTimesTraffickArms;
+ this.karma -= 1;
+ break;
+ case CONSTANTS.CrimeHomicide:
+ ++this.numPeopleKilled;
+ this.karma -= 3;
+ break;
+ case CONSTANTS.CrimeKidnap:
+ ++this.numTimesKidnapped;
+ this.karma -= 3;
+ break;
+ default:
+ dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
+ return;
+ }
+ }
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+ this.isWorking = false;
+ Engine.loadTerminalContent();
+}
+
/* Functions for saving and loading the Player data */
PlayerObject.prototype.toJSON = function() {
return Generic_toJSON("PlayerObject", this);
diff --git a/src/Terminal.js b/src/Terminal.js
index c11af8830..dfd873717 100644
--- a/src/Terminal.js
+++ b/src/Terminal.js
@@ -32,6 +32,7 @@ $(document).keydown(function(event) {
//Terminal
if (Engine.currentPage == Engine.Page.Terminal) {
var terminalInput = document.getElementById("terminal-input-text-box");
+ if (terminalInput != null && !event.ctrlKey) {terminalInput.focus();}
//Enter
if (event.keyCode == 13) {