Merge pull request #104 from danielyxie/dev

Balancing. Buffed crimes, infiltration, jobs, nerfed hacking
This commit is contained in:
danielyxie 2017-08-01 14:07:05 -05:00 committed by GitHub
commit dd90011643
10 changed files with 345 additions and 271 deletions

@ -732,7 +732,9 @@
successful. Your chance at successfully committing a crime is determined by your stats. successful. Your chance at successfully committing a crime is determined by your stats.
</p> </p>
<a class="a-link-button tooltip" id="location-slums-shoplift"> Shoplift </a> <a class="a-link-button tooltip" id="location-slums-shoplift"> Shoplift </a>
<a id="location-slums-rob-store" class="a-link-button tooltip"> Rob a store </a>
<a id="location-slums-mug" class="a-link-button tooltip"> Mug someone </a> <a id="location-slums-mug" class="a-link-button tooltip"> Mug someone </a>
<a id="location-slums-larceny" class="a-link-button tooltip"> Commit Larceny </a>
<a id="location-slums-deal-drugs" class="a-link-button tooltip"> Deal Drugs </a> <a id="location-slums-deal-drugs" class="a-link-button tooltip"> Deal Drugs </a>
<a id="location-slums-traffic-arms" class="a-link-button tooltip"> Traffick Illegal Arms </a> <a id="location-slums-traffic-arms" class="a-link-button tooltip"> Traffick Illegal Arms </a>
<a id="location-slums-homicide" class="a-link-button tooltip"> Homicide </a> <a id="location-slums-homicide" class="a-link-button tooltip"> Homicide </a>

@ -229,58 +229,58 @@ CompanyPositions = {
//Constructor: CompanyPosition(name, reqHack, reqStr, reqDef, reqDex, reqAgi, reqCha, reqRep, salary) //Constructor: CompanyPosition(name, reqHack, reqStr, reqDef, reqDex, reqAgi, reqCha, reqRep, salary)
//Software //Software
SoftwareIntern: new CompanyPosition("Software Engineering Intern", 1, 0, 0, 0, 0, 0, 0, 15), SoftwareIntern: new CompanyPosition("Software Engineering Intern", 1, 0, 0, 0, 0, 0, 0, 30),
JuniorDev: new CompanyPosition("Junior Software Engineer", 51, 0, 0, 0, 0, 0, 8000, 35), JuniorDev: new CompanyPosition("Junior Software Engineer", 51, 0, 0, 0, 0, 0, 8000, 72),
SeniorDev: new CompanyPosition("Senior Software Engineer", 251, 0, 0, 0, 0, 51, 40000, 70), SeniorDev: new CompanyPosition("Senior Software Engineer", 251, 0, 0, 0, 0, 51, 40000, 150),
LeadDev: new CompanyPosition("Lead Software Developer", 401, 0, 0, 0, 0, 151, 200000, 230), LeadDev: new CompanyPosition("Lead Software Developer", 401, 0, 0, 0, 0, 151, 200000, 450),
//TODO Through darkweb, maybe? //TODO Through darkweb, maybe?
FreelanceDeveloper: new CompanyPosition("Freelance Developer", 0, 0, 0, 0, 0, 0, 0, 0), FreelanceDeveloper: new CompanyPosition("Freelance Developer", 0, 0, 0, 0, 0, 0, 0, 0),
SoftwareConsultant: new CompanyPosition("Software Consultant", 51, 0, 0, 0, 0, 0, 0, 25), SoftwareConsultant: new CompanyPosition("Software Consultant", 51, 0, 0, 0, 0, 0, 0, 60),
SeniorSoftwareConsultant: new CompanyPosition("Senior Software Consultant", 251, 0, 0, 0, 0, 51, 0, 50), SeniorSoftwareConsultant: new CompanyPosition("Senior Software Consultant", 251, 0, 0, 0, 0, 51, 0, 120),
//IT //IT
ITIntern: new CompanyPosition("IT Intern", 1, 0, 0, 0, 0, 0, 0, 13), ITIntern: new CompanyPosition("IT Intern", 1, 0, 0, 0, 0, 0, 0, 24),
ITAnalyst: new CompanyPosition("IT Analyst", 26, 0, 0, 0, 0, 0, 7000, 28), ITAnalyst: new CompanyPosition("IT Analyst", 26, 0, 0, 0, 0, 0, 7000, 60),
ITManager: new CompanyPosition("IT Manager", 151, 0, 0, 0, 0, 51, 35000, 60), ITManager: new CompanyPosition("IT Manager", 151, 0, 0, 0, 0, 51, 35000, 120),
SysAdmin: new CompanyPosition("Systems Administrator", 251, 0, 0, 0, 0, 76, 175000, 180), SysAdmin: new CompanyPosition("Systems Administrator", 251, 0, 0, 0, 0, 76, 175000, 375),
SecurityEngineer: new CompanyPosition("Security Engineer", 151, 0, 0, 0, 0, 26, 35000, 60), SecurityEngineer: new CompanyPosition("Security Engineer", 151, 0, 0, 0, 0, 26, 35000, 110),
NetworkEngineer: new CompanyPosition("Network Engineer", 151, 0, 0, 0, 0, 26, 35000, 60), NetworkEngineer: new CompanyPosition("Network Engineer", 151, 0, 0, 0, 0, 26, 35000, 110),
NetworkAdministrator: new CompanyPosition("Network Administrator", 251, 0, 0, 0, 0, 76, 175000, 180), NetworkAdministrator: new CompanyPosition("Network Administrator", 251, 0, 0, 0, 0, 76, 175000, 375),
//Technology management //Technology management
HeadOfSoftware: new CompanyPosition("Head of Software", 501, 0, 0, 0, 0, 251, 400000, 360), HeadOfSoftware: new CompanyPosition("Head of Software", 501, 0, 0, 0, 0, 251, 400000, 720),
HeadOfEngineering: new CompanyPosition("Head of Engineering", 501, 0, 0, 0, 0, 251, 800000, 725), HeadOfEngineering: new CompanyPosition("Head of Engineering", 501, 0, 0, 0, 0, 251, 800000, 1500),
VicePresident: new CompanyPosition("Vice President of Technology", 601, 0, 0, 0, 0, 401, 1600000, 1050), VicePresident: new CompanyPosition("Vice President of Technology", 601, 0, 0, 0, 0, 401, 1600000, 2100),
CTO: new CompanyPosition("Chief Technology Officer", 751, 0, 0, 0, 0, 501, 3200000, 1200), CTO: new CompanyPosition("Chief Technology Officer", 751, 0, 0, 0, 0, 501, 3200000, 2400),
//Business //Business
BusinessIntern: new CompanyPosition("Business Intern", 1, 0, 0, 0, 0, 1, 0, 20), BusinessIntern: new CompanyPosition("Business Intern", 1, 0, 0, 0, 0, 1, 0, 42),
BusinessAnalyst: new CompanyPosition("Business Analyst", 6, 0, 0, 0, 0, 51, 8000, 46), BusinessAnalyst: new CompanyPosition("Business Analyst", 6, 0, 0, 0, 0, 51, 8000, 90),
BusinessManager: new CompanyPosition("Business Manager", 51, 0, 0, 0, 0, 101, 40000, 92), BusinessManager: new CompanyPosition("Business Manager", 51, 0, 0, 0, 0, 101, 40000, 180),
OperationsManager: new CompanyPosition("Operations Manager", 51, 0, 0, 0, 0, 226, 200000, 300), OperationsManager: new CompanyPosition("Operations Manager", 51, 0, 0, 0, 0, 226, 200000, 600),
CFO: new CompanyPosition("Chief Financial Officer", 76, 0, 0, 0, 0, 501, 800000, 900), CFO: new CompanyPosition("Chief Financial Officer", 76, 0, 0, 0, 0, 501, 800000, 1800),
CEO: new CompanyPosition("Chief Executive Officer", 101, 0, 0, 0, 0, 751, 3200000, 1700), CEO: new CompanyPosition("Chief Executive Officer", 101, 0, 0, 0, 0, 751, 3200000, 3600),
BusinessConsultant: new CompanyPosition("Business Consultant", 6, 0, 0, 0, 0, 51, 0, 32), BusinessConsultant: new CompanyPosition("Business Consultant", 6, 0, 0, 0, 0, 51, 0, 80),
SeniorBusinessConsultant: new CompanyPosition("Senior Business Consultant", 51, 0, 0, 0, 0, 226, 0, 190), SeniorBusinessConsultant: new CompanyPosition("Senior Business Consultant", 51, 0, 0, 0, 0, 226, 0, 480),
//Non-tech/management jobs //Non-tech/management jobs
PartTimeWaiter: new CompanyPosition("Part-time Waiter", 0, 0, 0, 0, 0, 0, 0, 10), PartTimeWaiter: new CompanyPosition("Part-time Waiter", 0, 0, 0, 0, 0, 0, 0, 18),
PartTimeEmployee: new CompanyPosition("Part-time Employee", 0, 0, 0, 0, 0, 0, 0, 10), PartTimeEmployee: new CompanyPosition("Part-time Employee", 0, 0, 0, 0, 0, 0, 0, 18),
Waiter: new CompanyPosition("Waiter", 0, 0, 0, 0, 0, 0, 0, 12), Waiter: new CompanyPosition("Waiter", 0, 0, 0, 0, 0, 0, 0, 20),
Employee: new CompanyPosition("Employee", 0, 0, 0, 0, 0, 0, 0, 12), Employee: new CompanyPosition("Employee", 0, 0, 0, 0, 0, 0, 0, 20),
PoliceOfficer: new CompanyPosition("Police Officer", 11, 101, 101, 101, 101, 51, 8000, 40), PoliceOfficer: new CompanyPosition("Police Officer", 11, 101, 101, 101, 101, 51, 8000, 75),
PoliceChief: new CompanyPosition("Police Chief", 101, 301, 301, 301, 301, 151, 36000, 200), PoliceChief: new CompanyPosition("Police Chief", 101, 301, 301, 301, 301, 151, 36000, 425),
SecurityGuard: new CompanyPosition("Security Guard", 0, 51, 51, 51, 51, 1, 0, 22), SecurityGuard: new CompanyPosition("Security Guard", 0, 51, 51, 51, 51, 1, 0, 45),
SecurityOfficer: new CompanyPosition("Security Officer", 26, 151, 151, 151, 151, 51, 8000, 85), SecurityOfficer: new CompanyPosition("Security Officer", 26, 151, 151, 151, 151, 51, 8000, 175),
SecuritySupervisor: new CompanyPosition("Security Supervisor", 26, 251, 251, 251, 251, 101, 36000, 300), SecuritySupervisor: new CompanyPosition("Security Supervisor", 26, 251, 251, 251, 251, 101, 36000, 600),
HeadOfSecurity: new CompanyPosition("Head of Security", 51, 501, 501, 501, 501, 151, 144000, 600), HeadOfSecurity: new CompanyPosition("Head of Security", 51, 501, 501, 501, 501, 151, 144000, 1200),
FieldAgent: new CompanyPosition("Field Agent", 101, 101, 101, 101, 101, 101, 8000, 60), FieldAgent: new CompanyPosition("Field Agent", 101, 101, 101, 101, 101, 101, 8000, 300),
SecretAgent: new CompanyPosition("Secret Agent", 201, 251, 251, 251, 251, 201, 32000, 225), SecretAgent: new CompanyPosition("Secret Agent", 201, 251, 251, 251, 251, 201, 32000, 900),
SpecialOperative: new CompanyPosition("Special Operative", 251, 501, 501, 501, 501, 251, 162000, 475), SpecialOperative: new CompanyPosition("Special Operative", 251, 501, 501, 501, 501, 251, 162000, 1800),
init: function() { init: function() {
//Argument order: hack, str, def, dex, agi, cha //Argument order: hack, str, def, dex, agi, cha
@ -290,9 +290,9 @@ CompanyPositions = {
CompanyPositions.JuniorDev.setPerformanceParameters(85, 0, 0, 0, 0, 15, 1.1); CompanyPositions.JuniorDev.setPerformanceParameters(85, 0, 0, 0, 0, 15, 1.1);
CompanyPositions.JuniorDev.setExperienceGains(.1, 0, 0, 0, 0, .05); CompanyPositions.JuniorDev.setExperienceGains(.1, 0, 0, 0, 0, .05);
CompanyPositions.SeniorDev.setPerformanceParameters(80, 0, 0, 0, 0, 20, 1.3); CompanyPositions.SeniorDev.setPerformanceParameters(80, 0, 0, 0, 0, 20, 1.3);
CompanyPositions.SeniorDev.setExperienceGains(.3, 0, 0, 0, 0, .08); CompanyPositions.SeniorDev.setExperienceGains(.4, 0, 0, 0, 0, .08);
CompanyPositions.LeadDev.setPerformanceParameters(75, 0, 0, 0, 0, 25, 1.5); CompanyPositions.LeadDev.setPerformanceParameters(75, 0, 0, 0, 0, 25, 1.5);
CompanyPositions.LeadDev.setExperienceGains(.5, 0, 0, 0, 0, .1); CompanyPositions.LeadDev.setExperienceGains(.8, 0, 0, 0, 0, .1);
CompanyPositions.SoftwareConsultant.setPerformanceParameters(80, 0, 0, 0, 0, 20, 1); CompanyPositions.SoftwareConsultant.setPerformanceParameters(80, 0, 0, 0, 0, 20, 1);
CompanyPositions.SoftwareConsultant.setExperienceGains(.08, 0, 0, 0, 0, .03); CompanyPositions.SoftwareConsultant.setExperienceGains(.08, 0, 0, 0, 0, .03);
@ -351,27 +351,27 @@ CompanyPositions = {
CompanyPositions.PartTimeEmployee.setExperienceGains(0, .0075, .0075, .0075, .0075, .03); CompanyPositions.PartTimeEmployee.setExperienceGains(0, .0075, .0075, .0075, .0075, .03);
CompanyPositions.Waiter.setPerformanceParameters(0, 10, 0, 10, 10, 70); CompanyPositions.Waiter.setPerformanceParameters(0, 10, 0, 10, 10, 70);
CompanyPositions.Waiter.setExperienceGains(0, .01, .01, .01, .01, .05); CompanyPositions.Waiter.setExperienceGains(0, .02, .02, .02, .02, .05);
CompanyPositions.Employee.setPerformanceParameters(0, 10, 0, 10, 10, 70); CompanyPositions.Employee.setPerformanceParameters(0, 10, 0, 10, 10, 70);
CompanyPositions.Employee.setExperienceGains(0, .01, .01, .01, .01, .04); CompanyPositions.Employee.setExperienceGains(0, .02, .02, .02, .02, .04);
CompanyPositions.SecurityGuard.setPerformanceParameters(5, 20, 20, 20, 20, 15, 1); CompanyPositions.SecurityGuard.setPerformanceParameters(5, 20, 20, 20, 20, 15, 1);
CompanyPositions.SecurityGuard.setExperienceGains(.01, .02, .02, .02, .02, .01); CompanyPositions.SecurityGuard.setExperienceGains(.01, .04, .04, .04, .04, .02);
CompanyPositions.PoliceOfficer.setPerformanceParameters(5, 20, 20, 20, 20, 15, 1); CompanyPositions.PoliceOfficer.setPerformanceParameters(5, 20, 20, 20, 20, 15, 1);
CompanyPositions.PoliceOfficer.setExperienceGains(.01, .04, .04, .04, .04, .02); CompanyPositions.PoliceOfficer.setExperienceGains(.02, .08, .08, .08, .08, .04);
CompanyPositions.PoliceChief.setPerformanceParameters(5, 20, 20, 20, 20, 15, 1.25); CompanyPositions.PoliceChief.setPerformanceParameters(5, 20, 20, 20, 20, 15, 1.25);
CompanyPositions.PoliceChief.setExperienceGains(.02, .06, .06, .06, .06, .05); CompanyPositions.PoliceChief.setExperienceGains(.02, .1, .1, .1, .1, .1);
CompanyPositions.SecurityOfficer.setPerformanceParameters(10, 20, 20, 20, 20, 10, 1.1); CompanyPositions.SecurityOfficer.setPerformanceParameters(10, 20, 20, 20, 20, 10, 1.1);
CompanyPositions.SecurityOfficer.setExperienceGains(.02, .06, .06, .06, .06, .04); CompanyPositions.SecurityOfficer.setExperienceGains(.02, .1, .1, .1, .1, .05);
CompanyPositions.SecuritySupervisor.setPerformanceParameters(10, 15, 15, 15, 15, 30, 1.25); CompanyPositions.SecuritySupervisor.setPerformanceParameters(10, 15, 15, 15, 15, 30, 1.25);
CompanyPositions.SecuritySupervisor.setExperienceGains(.02, .06, .06, .06, .06, .08); CompanyPositions.SecuritySupervisor.setExperienceGains(.02, .12, .12, .12, .12, .1);
CompanyPositions.HeadOfSecurity.setPerformanceParameters(10, 15, 15, 15, 15, 30, 1.4); CompanyPositions.HeadOfSecurity.setPerformanceParameters(10, 15, 15, 15, 15, 30, 1.4);
CompanyPositions.HeadOfSecurity.setExperienceGains(.05, .1, .1, .1, .1, .1); CompanyPositions.HeadOfSecurity.setExperienceGains(.05, .15, .15, .15, .15, .15);
CompanyPositions.FieldAgent.setPerformanceParameters(10, 15, 15, 20, 20, 20, 1); CompanyPositions.FieldAgent.setPerformanceParameters(10, 15, 15, 20, 20, 20, 1);
CompanyPositions.FieldAgent.setExperienceGains(.04, .06, .06, .06, .06, .04); CompanyPositions.FieldAgent.setExperienceGains(.04, .08, .08, .08, .08, .05);
CompanyPositions.SecretAgent.setPerformanceParameters(15, 15, 15, 20, 20, 15, 1.25); CompanyPositions.SecretAgent.setPerformanceParameters(15, 15, 15, 20, 20, 15, 1.25);
CompanyPositions.SecretAgent.setExperienceGains(.08, .1, .1, .1, .1, .08); CompanyPositions.SecretAgent.setExperienceGains(.1, .15, .15, .15, .15, .1);
CompanyPositions.SpecialOperative.setPerformanceParameters(15, 15, 15, 20, 20, 15, 1.5); CompanyPositions.SpecialOperative.setPerformanceParameters(15, 15, 15, 20, 20, 15, 1.5);
CompanyPositions.SpecialOperative.setExperienceGains(.12, .15, .15, .15, .15, .12); CompanyPositions.SpecialOperative.setExperienceGains(.15, .2, .2, .2, .2, .15);
} }
} }

@ -1,5 +1,5 @@
CONSTANTS = { CONSTANTS = {
Version: "0.26.3", Version: "0.26.4",
//Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience //Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
//and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then //and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
@ -11,7 +11,7 @@ CONSTANTS = {
/* Base costs */ /* Base costs */
BaseCostFor1GBOfRamHome: 30000, BaseCostFor1GBOfRamHome: 30000,
BaseCostFor1GBOfRamServer: 55000, //1 GB of RAM BaseCostFor1GBOfRamServer: 50000, //1 GB of RAM
BaseCostFor1GBOfRamHacknetNode: 30000, BaseCostFor1GBOfRamHacknetNode: 30000,
BaseCostForHacknetNode: 1000, BaseCostForHacknetNode: 1000,
@ -20,9 +20,9 @@ CONSTANTS = {
/* Hacknet Node constants */ /* Hacknet Node constants */
HacknetNodeMoneyGainPerLevel: 1.6, HacknetNodeMoneyGainPerLevel: 1.6,
HacknetNodePurchaseNextMult: 1.85, //Multiplier when purchasing an additional hacknet node HacknetNodePurchaseNextMult: 1.85, //Multiplier when purchasing an additional hacknet node
HacknetNodeUpgradeLevelMult: 1.05, //Multiplier for cost when upgrading level HacknetNodeUpgradeLevelMult: 1.04, //Multiplier for cost when upgrading level
HacknetNodeUpgradeRamMult: 1.29, //Multiplier for cost when upgrading RAM HacknetNodeUpgradeRamMult: 1.28, //Multiplier for cost when upgrading RAM
HacknetNodeUpgradeCoreMult: 1.49, //Multiplier for cost when buying another core HacknetNodeUpgradeCoreMult: 1.48, //Multiplier for cost when buying another core
HacknetNodeMaxLevel: 200, HacknetNodeMaxLevel: 200,
HacknetNodeMaxRam: 64, HacknetNodeMaxRam: 64,
@ -36,11 +36,6 @@ CONSTANTS = {
//NeuroFlux Governor cost multiplier as you level up //NeuroFlux Governor cost multiplier as you level up
NeuroFluxGovernorLevelMult: 1.14, NeuroFluxGovernorLevelMult: 1.14,
/* Script related things */
//Time (ms) it takes to run one operation in Netscript.
CodeInstructionRunTime: 100,
//RAM Costs for different commands //RAM Costs for different commands
ScriptWhileRamCost: 0.2, ScriptWhileRamCost: 0.2,
ScriptForRamCost: 0.2, ScriptForRamCost: 0.2,
@ -79,7 +74,7 @@ CONSTANTS = {
MultithreadingRAMCost: 1, MultithreadingRAMCost: 1,
//Server constants //Server constants
ServerBaseGrowthRate: 1.025, //Unadjusted Growth rate ServerBaseGrowthRate: 1.03, //Unadjusted Growth rate
ServerMaxGrowthRate: 1.0035, //Maximum possible growth rate (max rate accounting for server security) ServerMaxGrowthRate: 1.0035, //Maximum possible growth rate (max rate accounting for server security)
ServerFortifyAmount: 0.002, //Amount by which server's security increases when its hacked/grown ServerFortifyAmount: 0.002, //Amount by which server's security increases when its hacked/grown
ServerWeakenAmount: 0.05, //Amount by which server's security decreases when weakened ServerWeakenAmount: 0.05, //Amount by which server's security decreases when weakened
@ -91,9 +86,6 @@ CONSTANTS = {
AugmentationRepMultiplier: 2.5, //Used for balancing rep cost without having to readjust every value AugmentationRepMultiplier: 2.5, //Used for balancing rep cost without having to readjust every value
MultipleAugMultiplier: 1.9, MultipleAugMultiplier: 1.9,
MaxLogCapacity: 50, //Maximum number of log entries for a script
MaxPortCapacity: 50, //Maximum amount of data in a Netscript port
//How much a TOR router costs //How much a TOR router costs
TorRouterCost: 200000, TorRouterCost: 200000,
@ -158,15 +150,17 @@ CONSTANTS = {
ClassGymDexterity: "training your dexterity at a gym", ClassGymDexterity: "training your dexterity at a gym",
ClassGymAgility: "training your agility at a gym", ClassGymAgility: "training your agility at a gym",
ClassDataStructuresBaseCost: 30, ClassDataStructuresBaseCost: 40,
ClassNetworksBaseCost: 60, ClassNetworksBaseCost: 80,
ClassAlgorithmsBaseCost: 240, ClassAlgorithmsBaseCost: 320,
ClassManagementBaseCost: 120, ClassManagementBaseCost: 160,
ClassLeadershipBaseCost: 240, ClassLeadershipBaseCost: 320,
ClassGymBaseCost: 120, ClassGymBaseCost: 120,
CrimeShoplift: "shoplift", CrimeShoplift: "shoplift",
CrimeRobStore: "rob a store",
CrimeMug: "mug someone", CrimeMug: "mug someone",
CrimeLarceny: "commit larceny",
CrimeDrugs: "deal drugs", CrimeDrugs: "deal drugs",
CrimeTraffickArms: "traffick illegal arms", CrimeTraffickArms: "traffick illegal arms",
CrimeHomicide: "commit homicide", CrimeHomicide: "commit homicide",
@ -678,11 +672,21 @@ CONSTANTS = {
"World Stock Exchange account and TIX API Access<br>", "World Stock Exchange account and TIX API Access<br>",
LatestUpdate: LatestUpdate:
"v0.26.4<br>" +
"-All of the 'low-level servers' in early game that have a required hacking level now have 8GB of RAM " +
"instead of 4GB<br>" +
"-Increased the amount of experience given at university<br>" +
"-Slightly increased the production of Hacknet Nodes and made them cheaper to upgrade<br>" +
"-Infiltration now gives slightly more EXP and faction reputation<br>" +
"-Added two new crimes. These crimes are viable to attempt early on in the game and are relatively passive (each take 60+ seconds to complete)<br>" +
"-Crimes give more exp and more money<br>" +
"-Max money available on a server decreased from 50x the server's starting money to 25x<br>" +
"-Significantly increased wages for all jobs<br><br>" +
"v0.26.3<br>" + "v0.26.3<br>" +
"-Added support for large numbers using Decimal.js. Right now it only applies for the player's money<br>" + "-Added support for large numbers using Decimal.js. Right now it only applies for the player's money<br>" +
"-Purchasing servers with the Netscript function purchaseServer() is no longer 2x as expensive as doing manually, " + "-Purchasing servers with the Netscript function purchaseServer() is no longer 2x as expensive as doing manually, " +
"it now costs the same<br>" + "it now costs the same<br>" +
"-Early game servers have more starting money<br>" + "-Early game servers have more starting money<br><br>" +
"v0.26.2<br>" + "v0.26.2<br>" +
"-Major rebalancing and randomization of the amount of money that servers start with<br>" + "-Major rebalancing and randomization of the amount of money that servers start with<br>" +
"-Significantly lowered hacking exp gain from hacking servers. The exp gain for higher-level servers was lowered more than " + "-Significantly lowered hacking exp gain from hacking servers. The exp gain for higher-level servers was lowered more than " +

@ -1,47 +1,57 @@
/* Crimes.js */ /* Crimes.js */
function commitShopliftCrime() { function commitShopliftCrime() {
Player.crimeType = CONSTANTS.CrimeShoplift; Player.crimeType = CONSTANTS.CrimeShoplift;
Player.startCrime(0, 0, 0, 1.5, 1.5, 0, 10000, 2000); //$5000/s, .375 exp/s Player.startCrime(0, 0, 0, 2, 2, 0, 15000, 2000); //$7500/s, 1 exp/s
}
function commitRobStoreCrime() {
Player.crimeType = CONSTANTS.CrimeRobStore;
Player.startCrime(30, 0, 0, 45, 45, 0, 400000, 60000); //$6666,6/2, 0.5exp/s, 0.75exp/s
} }
function commitMugCrime() { function commitMugCrime() {
Player.crimeType = CONSTANTS.CrimeMug; Player.crimeType = CONSTANTS.CrimeMug;
Player.startCrime(0, 1.5, 1.5, 1.5, 1.5, 0, 32000, 4000); //$8000/s, .375 exp/s Player.startCrime(0, 3, 3, 3, 3, 0, 36000, 4000); //$9000/s, .66 exp/s
}
function commitLarcenyCrime() {
Player.crimeType = CONSTANTS.CrimeLarceny;
Player.startCrime(45, 0, 0, 60, 60, 0, 800000, 90000) // $8888.88/s, .5 exp/s, .66 exp/s
} }
function commitDealDrugsCrime() { function commitDealDrugsCrime() {
Player.crimeType = CONSTANTS.CrimeDrugs; Player.crimeType = CONSTANTS.CrimeDrugs;
Player.startCrime(0, 0, 0, 4, 4, 8, 100000, 10000); //$10000/s, .4 exp/s Player.startCrime(0, 0, 0, 5, 5, 10, 120000, 10000); //$12000/s, .5 exp/s, 1 exp/s
} }
function commitTraffickArmsCrime() { function commitTraffickArmsCrime() {
Player.crimeType = CONSTANTS.CrimeTraffickArms; Player.crimeType = CONSTANTS.CrimeTraffickArms;
Player.startCrime(0, 10, 10, 10, 10, 15, 480000, 40000); //$12000/s, .25 combat exp/s, .375 cha exp/s Player.startCrime(0, 20, 20, 20, 20, 40, 600000, 40000); //$15000/s, .5 combat exp/s, 1 cha exp/s
} }
function commitHomicideCrime() { function commitHomicideCrime() {
Player.crimeType = CONSTANTS.CrimeHomicide; Player.crimeType = CONSTANTS.CrimeHomicide;
Player.startCrime(0, 2, 2, 2, 2, 0, 30000, 3000); //$10000/s, 0.66 combat exp/s Player.startCrime(0, 2, 2, 2, 2, 0, 45000, 3000); //$15000/s, 0.66 combat exp/s
} }
function commitGrandTheftAutoCrime() { function commitGrandTheftAutoCrime() {
Player.crimeType = CONSTANTS.CrimeGrandTheftAuto; Player.crimeType = CONSTANTS.CrimeGrandTheftAuto;
Player.startCrime(0, 10, 10, 10, 40, 20, 1200000, 80000); //$15000/s, .125 exp/s, .5 exp/s, .25 exp/s Player.startCrime(0, 20, 20, 20, 80, 40, 1600000, 80000); //$20000/s, .25 exp/s, 1 exp/s, .5 exp/s
} }
function commitKidnapCrime() { function commitKidnapCrime() {
Player.crimeType = CONSTANTS.CrimeKidnap; Player.crimeType = CONSTANTS.CrimeKidnap;
Player.startCrime(0, 30, 30, 30, 30, 30, 2400000, 120000); //$20000/s. .25 exp/s Player.startCrime(0, 80, 80, 80, 80, 80, 3600000, 120000); //$30000/s. .66 exp/s
} }
function commitAssassinationCrime() { function commitAssassinationCrime() {
Player.crimeType = CONSTANTS.CrimeAssassination; Player.crimeType = CONSTANTS.CrimeAssassination;
Player.startCrime(0, 75, 75, 75, 75, 0, 7500000, 300000); //$25000/s, .25 exp/s Player.startCrime(0, 300, 300, 300, 300, 0, 12000000, 300000); //$40000/s, 1 exp/s
} }
function commitHeistCrime() { function commitHeistCrime() {
Player.crimeType = CONSTANTS.CrimeHeist; Player.crimeType = CONSTANTS.CrimeHeist;
Player.startCrime(120, 120, 120, 120, 120, 120, 75000000, 600000); //$125000/s, .2exp/s Player.startCrime(450, 450, 450, 450, 450, 450, 120000000, 600000); //$200000/s, .75exp/s
} }
function determineCrimeSuccess(crime, moneyGained) { function determineCrimeSuccess(crime, moneyGained) {
@ -50,9 +60,15 @@ function determineCrimeSuccess(crime, moneyGained) {
case CONSTANTS.CrimeShoplift: case CONSTANTS.CrimeShoplift:
chance = determineCrimeChanceShoplift(); chance = determineCrimeChanceShoplift();
break; break;
case CONSTANTS.CrimeRobStore:
chance = determineCrimeChanceRobStore();
break;
case CONSTANTS.CrimeMug: case CONSTANTS.CrimeMug:
chance = determineCrimeChanceMug(); chance = determineCrimeChanceMug();
break; break;
case CONSTANTS.CrimeLarceny:
chance = determineCrimeChanceLarceny();
break;
case CONSTANTS.CrimeDrugs: case CONSTANTS.CrimeDrugs:
chance = determineCrimeChanceDealDrugs(); chance = determineCrimeChanceDealDrugs();
break; break;
@ -75,6 +91,7 @@ function determineCrimeSuccess(crime, moneyGained) {
chance = determineCrimeChanceHeist(); chance = determineCrimeChanceHeist();
break; break;
default: default:
console.log(crime);
dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer"); dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
return; return;
} }
@ -96,6 +113,14 @@ function determineCrimeChanceShoplift() {
return Math.min(chance, 1); return Math.min(chance, 1);
} }
function determineCrimeChanceRobStore() {
var chance = ((0.5 * Player.hacking_skill / CONSTANTS.MaxSkillLevel +
2 * Player.dexterity / CONSTANTS.MaxSkillLevel +
1 * Player.agility / CONSTANTS.MaxSkillLevel)) * 5;
chance *= Player.crime_success_mult;
return Math.min(chance, 1);
}
function determineCrimeChanceMug() { function determineCrimeChanceMug() {
var chance = ((1.5 * Player.strength / CONSTANTS.MaxSkillLevel + var chance = ((1.5 * Player.strength / CONSTANTS.MaxSkillLevel +
0.5 * Player.defense / CONSTANTS.MaxSkillLevel + 0.5 * Player.defense / CONSTANTS.MaxSkillLevel +
@ -105,6 +130,14 @@ function determineCrimeChanceMug() {
return Math.min(chance, 1); return Math.min(chance, 1);
} }
function determineCrimeChanceLarceny() {
var chance = ((0.5 * Player.hacking_skill / CONSTANTS.MaxSkillLevel +
Player.dexterity / CONSTANTS.MaxSkillLevel +
Player.agility / CONSTANTS.MaxSkillLevel)) * 3;
chance *= Player.crime_success_mult;
return Math.min(chance, 1);
}
function determineCrimeChanceDealDrugs() { function determineCrimeChanceDealDrugs() {
var chance = ((3*Player.charisma / CONSTANTS.MaxSkillLevel + var chance = ((3*Player.charisma / CONSTANTS.MaxSkillLevel +
2*Player.dexterity / CONSTANTS.MaxSkillLevel + 2*Player.dexterity / CONSTANTS.MaxSkillLevel +

@ -51,6 +51,11 @@ HelpTexts = {
"Entering just the command 'alias' without any arguments prints the list of all defined aliases in the reusable form " + "Entering just the command 'alias' without any arguments prints the list of all defined aliases in the reusable form " +
"'alias NAME=VALUE' on the Terminal. <br><br>" + "'alias NAME=VALUE' on the Terminal. <br><br>" +
"The 'unalias' command can be used to remove aliases.<br><br>", "The 'unalias' command can be used to remove aliases.<br><br>",
analyze: "analze<br>" +
"Prints details and statistics about the current server. The information that is printed includes basic " +
"server details such as the hostname, whether the player has root access, what ports are opened/closed, and also " +
"hacking-related information such as an estimated chance to successfully hack, an estimate of how much money is " +
"available on the server, etc.",
cat: "cat [message]<br>" + cat: "cat [message]<br>" +
"Display message files, which are files ending with the '.msg' extension. Example:<br><br>" + "Display message files, which are files ending with the '.msg' extension. Example:<br><br>" +
"cat j1.msg", "cat j1.msg",

@ -397,7 +397,7 @@ function endInfiltrationLevel(inst) {
//Check if you gained any secrets //Check if you gained any secrets
if (inst.clearanceLevel % 5 == 0) { if (inst.clearanceLevel % 5 == 0) {
var baseSecretValue = inst.baseValue * inst.clearanceLevel / 2; var baseSecretValue = inst.baseValue * inst.clearanceLevel / 2;
var secretValue = baseSecretValue * Player.faction_rep_mult * 1.2; var secretValue = baseSecretValue * Player.faction_rep_mult * 1.25;
var secretMoneyValue = baseSecretValue * CONSTANTS.InfiltrationMoneyValue; var secretMoneyValue = baseSecretValue * CONSTANTS.InfiltrationMoneyValue;
inst.secretsStolen.push(baseSecretValue); inst.secretsStolen.push(baseSecretValue);
dialogBoxCreate("You found and stole a set of classified documents from the company. " + dialogBoxCreate("You found and stole a set of classified documents from the company. " +
@ -574,10 +574,10 @@ function updateInfiltrationButtons(inst, scenario) {
//Success: 5%, Failure 10%, -Karma //Success: 5%, Failure 10%, -Karma
function attemptInfiltrationKill(inst) { function attemptInfiltrationKill(inst) {
var chance = getInfiltrationKillChance(inst); var chance = getInfiltrationKillChance(inst);
inst.gainStrengthExp(inst.securityLevel / 750) * Player.strength_exp_mult; inst.gainStrengthExp(inst.securityLevel / 500) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 750) * Player.defense_exp_mult; inst.gainDefenseExp(inst.securityLevel / 500) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 750) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 500) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 750) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 500) * Player.agility_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
inst.securityLevel *= 1.05; inst.securityLevel *= 1.05;
return [true, 1.05]; return [true, 1.05];
@ -600,10 +600,10 @@ function getInfiltrationKillChance(inst) {
//Success: 3%, Failure: 10% //Success: 3%, Failure: 10%
function attemptInfiltrationKnockout(inst) { function attemptInfiltrationKnockout(inst) {
var chance = getInfiltrationKnockoutChance(inst); var chance = getInfiltrationKnockoutChance(inst);
inst.gainStrengthExp(inst.securityLevel / 750) * Player.strength_exp_mult; inst.gainStrengthExp(inst.securityLevel / 500) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 750) * Player.defense_exp_mult; inst.gainDefenseExp(inst.securityLevel / 500) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 750) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 500) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 750) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 500) * Player.agility_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
inst.securityLevel *= 1.03; inst.securityLevel *= 1.03;
return [true, 1.03]; return [true, 1.03];
@ -625,9 +625,9 @@ function getInfiltrationKnockoutChance(inst) {
//Success: 0%, Failure: 10% //Success: 0%, Failure: 10%
function attemptInfiltrationStealthKnockout(inst) { function attemptInfiltrationStealthKnockout(inst) {
var chance = getInfiltrationStealthKnockoutChance(inst); var chance = getInfiltrationStealthKnockoutChance(inst);
inst.gainStrengthExp(inst.securityLevel / 750) * Player.strength_exp_mult; inst.gainStrengthExp(inst.securityLevel / 500) * Player.strength_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 500) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 300) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 500) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 300) * Player.agility_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
return [true, 1]; return [true, 1];
} else { } else {
@ -648,9 +648,9 @@ function getInfiltrationStealthKnockoutChance(inst) {
//Success: 0%, Failure: 5%, -Karma //Success: 0%, Failure: 5%, -Karma
function attemptInfiltrationAssassinate(inst) { function attemptInfiltrationAssassinate(inst) {
var chance = getInfiltrationAssassinateChance(inst); var chance = getInfiltrationAssassinateChance(inst);
inst.gainStrengthExp(inst.securityLevel / 750) * Player.strength_exp_mult; inst.gainStrengthExp(inst.securityLevel / 500) * Player.strength_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 500) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 300) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 500) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 300) * Player.agility_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
return [true, 1]; return [true, 1];
} else { } else {
@ -671,10 +671,10 @@ function getInfiltrationAssassinateChance(inst) {
//Success: 5%, Failure: 10% //Success: 5%, Failure: 10%
function attemptInfiltrationDestroySecurity(inst) { function attemptInfiltrationDestroySecurity(inst) {
var chance = getInfiltrationDestroySecurityChance(inst); var chance = getInfiltrationDestroySecurityChance(inst);
inst.gainStrengthExp(inst.securityLevel / 750) * Player.strength_exp_mult; inst.gainStrengthExp(inst.securityLevel / 500) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 750) * Player.defense_exp_mult; inst.gainDefenseExp(inst.securityLevel / 500) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 750) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 500) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 750) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 500) * Player.agility_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
inst.securityLevel *= 1.05; inst.securityLevel *= 1.05;
return [true, 1.05]; return [true, 1.05];
@ -698,7 +698,7 @@ function getInfiltrationDestroySecurityChance(inst) {
//Success: 1%, Failure: 5% //Success: 1%, Failure: 5%
function attemptInfiltrationHack(inst) { function attemptInfiltrationHack(inst) {
var chance = getInfiltrationHackChance(inst); var chance = getInfiltrationHackChance(inst);
inst.gainHackingExp(inst.securityLevel / 250) * Player.hacking_exp_mult; inst.gainHackingExp(inst.securityLevel / 200) * Player.hacking_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
inst.securityLevel *= 1.03; inst.securityLevel *= 1.03;
return [true, 1.03]; return [true, 1.03];
@ -719,7 +719,7 @@ function getInfiltrationHackChance(inst) {
//Success: 0%, Failure: 8% //Success: 0%, Failure: 8%
function attemptInfiltrationSneak(inst) { function attemptInfiltrationSneak(inst) {
var chance = getInfiltrationSneakChance(inst); var chance = getInfiltrationSneakChance(inst);
inst.gainAgilityExp(inst.securityLevel / 250) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 200) * Player.agility_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
return [true, 1]; return [true, 1];
} else { } else {
@ -739,7 +739,7 @@ function getInfiltrationSneakChance(inst) {
//Success: 1%, Failure: 3% //Success: 1%, Failure: 3%
function attemptInfiltrationPickLockedDoor(inst) { function attemptInfiltrationPickLockedDoor(inst) {
var chance = getInfiltrationPickLockedDoorChance(inst); var chance = getInfiltrationPickLockedDoorChance(inst);
inst.gainDexterityExp(inst.securityLevel / 250) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 200) * Player.dexterity_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
inst.securityLevel *= 1.01; inst.securityLevel *= 1.01;
return [true, 1.01]; return [true, 1.01];
@ -759,7 +759,7 @@ function getInfiltrationPickLockedDoorChance(inst) {
//Success: 0%, Failure: 15%, //Success: 0%, Failure: 15%,
function attemptInfiltrationBribe(inst) { function attemptInfiltrationBribe(inst) {
var chance = getInfiltrationBribeChance(inst); var chance = getInfiltrationBribeChance(inst);
inst.gainCharismaExp(inst.securityLevel / 250) * Player.charisma_exp_mult; inst.gainCharismaExp(inst.securityLevel / 200) * Player.charisma_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
return [true, 1]; return [true, 1];
} else { } else {
@ -778,8 +778,8 @@ function getInfiltrationBribeChance(inst) {
//Failure: 5% //Failure: 5%
function attemptInfiltrationEscape(inst) { function attemptInfiltrationEscape(inst) {
var chance = getInfiltrationEscapeChance(inst); var chance = getInfiltrationEscapeChance(inst);
inst.gainAgilityExp(inst.securityLevel / 500) * Player.agility_exp_mult; inst.gainAgilityExp(inst.securityLevel / 400) * Player.agility_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 500) * Player.dexterity_exp_mult; inst.gainDexterityExp(inst.securityLevel / 400) * Player.dexterity_exp_mult;
if (Math.random() <= chance) { if (Math.random() <= chance) {
return [true, 1]; return [true, 1];
} else { } else {

@ -159,7 +159,9 @@ displayLocationContent = function() {
var slumsDescText = document.getElementById("location-slums-description"); var slumsDescText = document.getElementById("location-slums-description");
var slumsShoplift = document.getElementById("location-slums-shoplift"); var slumsShoplift = document.getElementById("location-slums-shoplift");
var slumsRobStore = document.getElementById("location-slums-rob-store");
var slumsMug = document.getElementById("location-slums-mug"); var slumsMug = document.getElementById("location-slums-mug");
var slumsLarceny = document.getElementById("location-slums-larceny");
var slumsDealDrugs = document.getElementById("location-slums-deal-drugs"); var slumsDealDrugs = document.getElementById("location-slums-deal-drugs");
var slumsTrafficArms = document.getElementById("location-slums-traffic-arms"); var slumsTrafficArms = document.getElementById("location-slums-traffic-arms");
var slumsHomicide = document.getElementById("location-slums-homicide"); var slumsHomicide = document.getElementById("location-slums-homicide");
@ -260,7 +262,9 @@ displayLocationContent = function() {
slumsDescText.style.display = "none"; slumsDescText.style.display = "none";
slumsShoplift.style.display = "none"; slumsShoplift.style.display = "none";
slumsRobStore.style.display = "none";
slumsMug.style.display = "none"; slumsMug.style.display = "none";
slumsLarceny.style.display = "none";
slumsDealDrugs.style.display = "none"; slumsDealDrugs.style.display = "none";
slumsTrafficArms.style.display = "none"; slumsTrafficArms.style.display = "none";
slumsHomicide.style.display = "none"; slumsHomicide.style.display = "none";
@ -976,7 +980,9 @@ displayLocationContent = function() {
case Locations.IshimaSlums: case Locations.IshimaSlums:
case Locations.VolhavenSlums: case Locations.VolhavenSlums:
var shopliftChance = determineCrimeChanceShoplift(); var shopliftChance = determineCrimeChanceShoplift();
var robStoreChance = determineCrimeChanceRobStore();
var mugChance = determineCrimeChanceMug(); var mugChance = determineCrimeChanceMug();
var larcenyChance = determineCrimeChanceLarceny();
var drugsChance = determineCrimeChanceDealDrugs(); var drugsChance = determineCrimeChanceDealDrugs();
var armsChance = determineCrimeChanceTraffickArms(); var armsChance = determineCrimeChanceTraffickArms();
var homicideChance = determineCrimeChanceHomicide(); var homicideChance = determineCrimeChanceHomicide();
@ -989,9 +995,15 @@ displayLocationContent = function() {
slumsShoplift.style.display = "block"; slumsShoplift.style.display = "block";
slumsShoplift.innerHTML = "Shoplift (" + (shopliftChance*100).toFixed(3) + "% chance of success)"; slumsShoplift.innerHTML = "Shoplift (" + (shopliftChance*100).toFixed(3) + "% chance of success)";
slumsShoplift.innerHTML += '<span class="tooltiptext"> Attempt to shoplift from a low-end retailer </span>'; slumsShoplift.innerHTML += '<span class="tooltiptext"> Attempt to shoplift from a low-end retailer </span>';
slumsRobStore.style.display = "block";
slumsRobStore.innerHTML = "Rob store(" + (robStoreChance*100).toFixed(3) + "% chance of success)";
slumsRobStore.innerHTML += '<span class="tooltiptext">Attempt to commit armed robbery on a high-end store </span>';
slumsMug.style.display = "block"; slumsMug.style.display = "block";
slumsMug.innerHTML = "Mug someone (" + (mugChance*100).toFixed(3) + "% chance of success)"; slumsMug.innerHTML = "Mug someone (" + (mugChance*100).toFixed(3) + "% chance of success)";
slumsMug.innerHTML += '<span class="tooltiptext"> Attempt to mug a random person on the street </span>'; slumsMug.innerHTML += '<span class="tooltiptext"> Attempt to mug a random person on the street </span>';
slumsLarceny.style.display = "block";
slumsLarceny.innerHTML = "Larceny (" + (larcenyChance*100).toFixed(3) + "% chance of success)";
slumsLarceny.innerHTML +="<span class='tooltiptext'> Attempt to rob property from someone's house </span>";
slumsDealDrugs.style.display = "block"; slumsDealDrugs.style.display = "block";
slumsDealDrugs.innerHTML = "Deal Drugs (" + (drugsChance*100).toFixed(3) + "% chance of success)"; slumsDealDrugs.innerHTML = "Deal Drugs (" + (drugsChance*100).toFixed(3) + "% chance of success)";
slumsDealDrugs.innerHTML += '<span class="tooltiptext"> Attempt to deal drugs </span>'; slumsDealDrugs.innerHTML += '<span class="tooltiptext"> Attempt to deal drugs </span>';
@ -1540,7 +1552,9 @@ initLocationButtons = function() {
var travelToVolhaven = document.getElementById("location-travel-to-volhaven"); var travelToVolhaven = document.getElementById("location-travel-to-volhaven");
var slumsShoplift = document.getElementById("location-slums-shoplift"); var slumsShoplift = document.getElementById("location-slums-shoplift");
var slumsRobStore = document.getElementById("location-slums-rob-store");
var slumsMug = document.getElementById("location-slums-mug"); var slumsMug = document.getElementById("location-slums-mug");
var slumsLarceny = document.getElementById("location-slums-larceny");
var slumsDealDrugs = document.getElementById("location-slums-deal-drugs"); var slumsDealDrugs = document.getElementById("location-slums-deal-drugs");
var slumsTrafficArms = document.getElementById("location-slums-traffic-arms"); var slumsTrafficArms = document.getElementById("location-slums-traffic-arms");
var slumsHomicide = document.getElementById("location-slums-homicide"); var slumsHomicide = document.getElementById("location-slums-homicide");
@ -1711,11 +1725,21 @@ initLocationButtons = function() {
return false; return false;
}); });
slumsRobStore.addEventListener("click", function() {
commitRobStoreCrime();
return false;
});
slumsMug.addEventListener("click", function() { slumsMug.addEventListener("click", function() {
commitMugCrime(); commitMugCrime();
return false; return false;
}); });
slumsLarceny.addEventListener("click", function() {
commitLarcenyCrime();
return false;
});
slumsDealDrugs.addEventListener("click", function() { slumsDealDrugs.addEventListener("click", function() {
commitDealDrugsCrime(); commitDealDrugsCrime();
return false; return false;

@ -181,8 +181,8 @@ function NetscriptFunctions(workerScript) {
} }
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.NukeProgram)) { if (!Player.hasProgram(Programs.NukeProgram)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the NUKE.exe virus!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the NUKE.exe virus!");
@ -204,8 +204,8 @@ function NetscriptFunctions(workerScript) {
} }
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.BruteSSHProgram)) { if (!Player.hasProgram(Programs.BruteSSHProgram)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the BruteSSH.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the BruteSSH.exe program!");
@ -225,8 +225,8 @@ function NetscriptFunctions(workerScript) {
} }
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.FTPCrackProgram)) { if (!Player.hasProgram(Programs.FTPCrackProgram)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the FTPCrack.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the FTPCrack.exe program!");
@ -246,8 +246,8 @@ function NetscriptFunctions(workerScript) {
} }
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.RelaySMTPProgram)) { if (!Player.hasProgram(Programs.RelaySMTPProgram)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the relaySMTP.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the relaySMTP.exe program!");
@ -267,8 +267,8 @@ function NetscriptFunctions(workerScript) {
} }
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.HTTPWormProgram)) { if (!Player.hasProgram(Programs.HTTPWormProgram)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the HTTPWorm.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the HTTPWorm.exe program!");
@ -288,8 +288,8 @@ function NetscriptFunctions(workerScript) {
} }
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call " + programName + ". Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.SQLInjectProgram)) { if (!Player.hasProgram(Programs.SQLInjectProgram)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the SQLInject.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the SQLInject.exe program!");

@ -939,12 +939,12 @@ PlayerObject.prototype.startClass = function(costMult, expMult, className) {
var gameCPS = 1000 / Engine._idleSpeed; var gameCPS = 1000 / Engine._idleSpeed;
//Base exp gains per second //Base exp gains per second
var baseStudyComputerScienceExp = 0.25; var baseStudyComputerScienceExp = 0.5;
var baseDataStructuresExp = 0.5; var baseDataStructuresExp = 1;
var baseNetworksExp = 1; var baseNetworksExp = 2;
var baseAlgorithmsExp = 2; var baseAlgorithmsExp = 4;
var baseManagementExp = 1; var baseManagementExp = 2;
var baseLeadershipExp = 2; var baseLeadershipExp = 4;
var baseGymExp = 1; var baseGymExp = 1;
//Find cost and exp gain per game cycle //Find cost and exp gain per game cycle
@ -1135,11 +1135,16 @@ PlayerObject.prototype.finishCrime = function(cancelled) {
case CONSTANTS.CrimeShoplift: case CONSTANTS.CrimeShoplift:
this.karma -= 0.1; this.karma -= 0.1;
++this.numTimesShoplifted; ++this.numTimesShoplifted;
break;
case CONSTANTS.CrimeRobStore:
break; break;
case CONSTANTS.CrimeMug: case CONSTANTS.CrimeMug:
this.karma -= 0.25; this.karma -= 0.25;
++this.numPeopleMugged; ++this.numPeopleMugged;
break; break;
case CONSTANTS.CrimeLarceny:
break;
case CONSTANTS.CrimeDrugs: case CONSTANTS.CrimeDrugs:
++this.numTimesDealtDrugs; ++this.numTimesDealtDrugs;
this.karma -= 0.5; this.karma -= 0.5;
@ -1169,6 +1174,7 @@ PlayerObject.prototype.finishCrime = function(cancelled) {
this.karma -= 15; this.karma -= 15;
break; break;
default: default:
console.log(this.crimeType);
dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer"); dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
return; return;
} }

@ -84,7 +84,7 @@ Server.prototype.setHackingParameters = function(requiredHackingSkill, moneyAvai
} else { } else {
this.moneyAvailable = moneyAvailable; this.moneyAvailable = moneyAvailable;
} }
this.moneyMax = 50 * moneyAvailable; this.moneyMax = 25 * moneyAvailable;
this.hackDifficulty = hackDifficulty; this.hackDifficulty = hackDifficulty;
this.baseDifficulty = hackDifficulty; this.baseDifficulty = hackDifficulty;
this.minDifficulty = Math.max(1, Math.round(hackDifficulty / 3)); this.minDifficulty = Math.max(1, Math.round(hackDifficulty / 3));
@ -421,19 +421,19 @@ initForeignServers = function() {
//"Low level" targets //"Low level" targets
var FoodNStuffServer = new Server(); var FoodNStuffServer = new Server();
FoodNStuffServer.init(createRandomIp(), "foodnstuff", "Food N Stuff Supermarket", true, false, false, false, 4); FoodNStuffServer.init(createRandomIp(), "foodnstuff", "Food N Stuff Supermarket", true, false, false, false, 8);
FoodNStuffServer.setHackingParameters(1, 2000000, 10, 5); FoodNStuffServer.setHackingParameters(1, 2000000, 10, 5);
FoodNStuffServer.setPortProperties(0); FoodNStuffServer.setPortProperties(0);
AddToAllServers(FoodNStuffServer); AddToAllServers(FoodNStuffServer);
var SigmaCosmeticsServer = new Server(); var SigmaCosmeticsServer = new Server();
SigmaCosmeticsServer.init(createRandomIp(), "sigma-cosmetics", "Sigma Cosmetics", true, false, false, false, 4); SigmaCosmeticsServer.init(createRandomIp(), "sigma-cosmetics", "Sigma Cosmetics", true, false, false, false, 8);
SigmaCosmeticsServer.setHackingParameters(5, 2300000, 10, 10); SigmaCosmeticsServer.setHackingParameters(5, 2300000, 10, 10);
SigmaCosmeticsServer.setPortProperties(0); SigmaCosmeticsServer.setPortProperties(0);
AddToAllServers(SigmaCosmeticsServer); AddToAllServers(SigmaCosmeticsServer);
var JoesGunsServer = new Server(); var JoesGunsServer = new Server();
JoesGunsServer.init(createRandomIp(), "joesguns", "Joe's Guns", true, false, false, false, 4); JoesGunsServer.init(createRandomIp(), "joesguns", "Joe's Guns", true, false, false, false, 8);
JoesGunsServer.setHackingParameters(10, 2500000, 15, 20); JoesGunsServer.setHackingParameters(10, 2500000, 15, 20);
JoesGunsServer.setPortProperties(0); JoesGunsServer.setPortProperties(0);
AddToAllServers(JoesGunsServer); AddToAllServers(JoesGunsServer);
@ -445,7 +445,7 @@ initForeignServers = function() {
AddToAllServers(Zer0NightclubServer); AddToAllServers(Zer0NightclubServer);
var NectarNightclubServer = new Server(); var NectarNightclubServer = new Server();
NectarNightclubServer.init(createRandomIp(), "nectar-net", "Nectar Nightclub Network", true, false, false, false, 4); NectarNightclubServer.init(createRandomIp(), "nectar-net", "Nectar Nightclub Network", true, false, false, false, 8);
NectarNightclubServer.setHackingParameters(20, 2750000, 20, 25); NectarNightclubServer.setHackingParameters(20, 2750000, 20, 25);
NectarNightclubServer.setPortProperties(0); NectarNightclubServer.setPortProperties(0);
AddToAllServers(NectarNightclubServer); AddToAllServers(NectarNightclubServer);
@ -463,13 +463,13 @@ initForeignServers = function() {
AddToAllServers(SilverHelixServer); AddToAllServers(SilverHelixServer);
var HongFangTeaHouseServer = new Server(); var HongFangTeaHouseServer = new Server();
HongFangTeaHouseServer.init(createRandomIp(), "hong-fang-tea", "HongFang Teahouse", true, false, false, false, 4); HongFangTeaHouseServer.init(createRandomIp(), "hong-fang-tea", "HongFang Teahouse", true, false, false, false, 8);
HongFangTeaHouseServer.setHackingParameters(30, 3000000, 15, 20); HongFangTeaHouseServer.setHackingParameters(30, 3000000, 15, 20);
HongFangTeaHouseServer.setPortProperties(0); HongFangTeaHouseServer.setPortProperties(0);
AddToAllServers(HongFangTeaHouseServer); AddToAllServers(HongFangTeaHouseServer);
var HaraKiriSushiBarServer = new Server(); var HaraKiriSushiBarServer = new Server();
HaraKiriSushiBarServer.init(createRandomIp(), "harakiri-sushi", "HaraKiri Sushi Bar Network", true, false, false, false, 4); HaraKiriSushiBarServer.init(createRandomIp(), "harakiri-sushi", "HaraKiri Sushi Bar Network", true, false, false, false, 8);
HaraKiriSushiBarServer.setHackingParameters(40, 4000000, 15, 40); HaraKiriSushiBarServer.setHackingParameters(40, 4000000, 15, 40);
HaraKiriSushiBarServer.setPortProperties(0); HaraKiriSushiBarServer.setPortProperties(0);
AddToAllServers(HaraKiriSushiBarServer); AddToAllServers(HaraKiriSushiBarServer);