mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-18 12:15:44 +01:00
Implemented Sleeve UI. Compiled but untested
This commit is contained in:
parent
d9b865ef17
commit
bcb231a966
@ -164,9 +164,9 @@ getCharacterInformation
|
|||||||
{
|
{
|
||||||
bitnode: Current BitNode number
|
bitnode: Current BitNode number
|
||||||
city: Name of city you are currently in
|
city: Name of city you are currently in
|
||||||
company: Name of company
|
|
||||||
factions: Array of factions you are currently a member of
|
factions: Array of factions you are currently a member of
|
||||||
jobTitle: Name of job
|
jobs: Array of all companies at which you have jobs
|
||||||
|
jobTitle: Array of job positions for all companies you are employed at. Same order as 'jobs'
|
||||||
tor: Boolean indicating whether or not you have a tor router
|
tor: Boolean indicating whether or not you have a tor router
|
||||||
|
|
||||||
// The following is an object with many of the player's multipliers from Augmentations/Source Files
|
// The following is an object with many of the player's multipliers from Augmentations/Source Files
|
||||||
|
BIN
favicon.ico
BIN
favicon.ico
Binary file not shown.
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
@ -84,7 +84,7 @@ function sanitizeRewardType(rewardType) {
|
|||||||
if (type === CodingContractRewardType.FactionReputationAll && factionsThatAllowHacking.length === 0) {
|
if (type === CodingContractRewardType.FactionReputationAll && factionsThatAllowHacking.length === 0) {
|
||||||
type = CodingContractRewardType.CompanyReputation;
|
type = CodingContractRewardType.CompanyReputation;
|
||||||
}
|
}
|
||||||
if (type === CodingContractRewardType.CompanyReputation && Player.companyName === "") {
|
if (type === CodingContractRewardType.CompanyReputation && Object.keys(Player.jobs).length === 0) {
|
||||||
type = CodingContractRewardType.Money;
|
type = CodingContractRewardType.Money;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,8 +115,9 @@ function getRandomReward() {
|
|||||||
reward.name = randFaction;
|
reward.name = randFaction;
|
||||||
break;
|
break;
|
||||||
case CodingContractRewardType.CompanyReputation:
|
case CodingContractRewardType.CompanyReputation:
|
||||||
if (Player.companyName !== "") {
|
const allJobs = Object.keys(Player.jobs);
|
||||||
reward.name = Player.companyName;
|
if (allJobs.length > 0) {
|
||||||
|
reward.name = allJobs[getRandomInt(0, allJobs.length - 1)];
|
||||||
} else {
|
} else {
|
||||||
reward.type = CodingContractRewardType.Money;
|
reward.type = CodingContractRewardType.Money;
|
||||||
}
|
}
|
||||||
|
@ -512,6 +512,9 @@ export let CONSTANTS: IMap<any> = {
|
|||||||
** Each stock now has a maximum number of shares you can purchase (both Long and Short positions combined)
|
** Each stock now has a maximum number of shares you can purchase (both Long and Short positions combined)
|
||||||
** Added getStockMaxShares() Netscript function to the TIX API
|
** Added getStockMaxShares() Netscript function to the TIX API
|
||||||
|
|
||||||
|
* Job Changes:
|
||||||
|
** You can now hold multiple jobs at once. This means you no longer lose reputation when leaving a company
|
||||||
|
** Because of this change, the getCharacterInformation() Netscript function returns a slightly different value
|
||||||
* Home Computer RAM is now capped at 2 ^ 30 GB (1073741824 GB)
|
* Home Computer RAM is now capped at 2 ^ 30 GB (1073741824 GB)
|
||||||
`
|
`
|
||||||
|
|
||||||
|
147
src/Crime/Crime.ts
Normal file
147
src/Crime/Crime.ts
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
import { CONSTANTS } from "../Constants";
|
||||||
|
export interface IConstructorParams {
|
||||||
|
hacking_success_weight?: number;
|
||||||
|
strength_success_weight?: number;
|
||||||
|
defense_success_weight?: number;
|
||||||
|
dexterity_success_weight?: number;
|
||||||
|
agility_success_weight?: number;
|
||||||
|
charisma_success_weight?: number;
|
||||||
|
hacking_exp?: number;
|
||||||
|
strength_exp?: number;
|
||||||
|
defense_exp?: number;
|
||||||
|
dexterity_exp?: number;
|
||||||
|
agility_exp?: number;
|
||||||
|
charisma_exp?: number;
|
||||||
|
intelligence_exp?: number;
|
||||||
|
|
||||||
|
kills?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IPlayer {
|
||||||
|
startCrime(crimeType: string,
|
||||||
|
hackExp: number,
|
||||||
|
strExp: number,
|
||||||
|
defExp: number,
|
||||||
|
dexExp: number,
|
||||||
|
agiExp: number,
|
||||||
|
chaExp: number,
|
||||||
|
money: number,
|
||||||
|
time: number,
|
||||||
|
singParams: any): void;
|
||||||
|
|
||||||
|
hacking_skill: number;
|
||||||
|
strength: number;
|
||||||
|
defense: number;
|
||||||
|
dexterity: number;
|
||||||
|
agility: number;
|
||||||
|
charisma: number;
|
||||||
|
intelligence: number;
|
||||||
|
|
||||||
|
crime_success_mult: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Crime {
|
||||||
|
// Number representing the difficulty of the crime. Used for success chance calculations
|
||||||
|
difficulty: number = 0;
|
||||||
|
|
||||||
|
// Amount of karma lost for SUCCESSFULLY committing this crime
|
||||||
|
karma: number = 0;
|
||||||
|
|
||||||
|
// How many people die as a result of this crime
|
||||||
|
kills: number = 0;
|
||||||
|
|
||||||
|
// How much money is given by the
|
||||||
|
money: number = 0;
|
||||||
|
|
||||||
|
// Name of crime
|
||||||
|
name: string = "";
|
||||||
|
|
||||||
|
// Milliseconds it takes to attempt the crime
|
||||||
|
time: number = 0;
|
||||||
|
|
||||||
|
// Corresponding type in CONSTANTS. Contains a description for the crime activity
|
||||||
|
type: string = "";
|
||||||
|
|
||||||
|
// Weighting factors that determine how stats affect the success rate of this crime
|
||||||
|
hacking_success_weight: number = 0;
|
||||||
|
strength_success_weight: number = 0;
|
||||||
|
defense_success_weight: number = 0;
|
||||||
|
dexterity_success_weight: number = 0;
|
||||||
|
agility_success_weight: number = 0;
|
||||||
|
charisma_success_weight: number = 0;
|
||||||
|
|
||||||
|
// How much stat experience is granted by this crime
|
||||||
|
hacking_exp: number = 0;
|
||||||
|
strength_exp: number = 0;
|
||||||
|
defense_exp: number = 0;
|
||||||
|
dexterity_exp: number = 0;
|
||||||
|
agility_exp: number = 0;
|
||||||
|
charisma_exp: number = 0;
|
||||||
|
intelligence_exp: number = 0;
|
||||||
|
|
||||||
|
constructor(name: string = "",
|
||||||
|
type: string = "",
|
||||||
|
time: number = 0,
|
||||||
|
money: number = 0,
|
||||||
|
difficulty: number = 0,
|
||||||
|
karma: number = 0,
|
||||||
|
params: IConstructorParams={}) {
|
||||||
|
this.name = name;
|
||||||
|
this.type = type;
|
||||||
|
this.time = time;
|
||||||
|
this.money = money;
|
||||||
|
this.difficulty = difficulty;
|
||||||
|
this.karma = karma;
|
||||||
|
|
||||||
|
this.hacking_success_weight = params.hacking_success_weight ? params.hacking_success_weight : 0;
|
||||||
|
this.strength_success_weight = params.strength_success_weight ? params.strength_success_weight : 0;
|
||||||
|
this.defense_success_weight = params.defense_success_weight ? params.defense_success_weight : 0;
|
||||||
|
this.dexterity_success_weight = params.dexterity_success_weight ? params.dexterity_success_weight : 0;
|
||||||
|
this.agility_success_weight = params.agility_success_weight ? params.agility_success_weight : 0;
|
||||||
|
this.charisma_success_weight = params.charisma_success_weight ? params.charisma_success_weight : 0;
|
||||||
|
|
||||||
|
this.hacking_exp = params.hacking_exp ? params.hacking_exp : 0;
|
||||||
|
this.strength_exp = params.strength_exp ? params.strength_exp : 0;
|
||||||
|
this.defense_exp = params.defense_exp ? params.defense_exp : 0;
|
||||||
|
this.dexterity_exp = params.dexterity_exp ? params.dexterity_exp : 0;
|
||||||
|
this.agility_exp = params.agility_exp ? params.agility_exp : 0;
|
||||||
|
this.charisma_exp = params.charisma_exp ? params.charisma_exp : 0;
|
||||||
|
this.intelligence_exp = params.intelligence_exp ? params.intelligence_exp : 0;
|
||||||
|
|
||||||
|
this.kills = params.kills ? params.kills : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
commit(p: IPlayer, div: number=1, singParams: any=null): number {
|
||||||
|
if (div <= 0) { div = 1; }
|
||||||
|
p.startCrime(
|
||||||
|
this.type,
|
||||||
|
this.hacking_exp/div,
|
||||||
|
this.strength_exp/div,
|
||||||
|
this.defense_exp/div,
|
||||||
|
this.dexterity_exp/div,
|
||||||
|
this.agility_exp/div,
|
||||||
|
this.charisma_exp/div,
|
||||||
|
this.money/div,
|
||||||
|
this.time,
|
||||||
|
singParams
|
||||||
|
);
|
||||||
|
|
||||||
|
return this.time;
|
||||||
|
}
|
||||||
|
|
||||||
|
successRate(p: IPlayer): number {
|
||||||
|
let chance: number = (this.hacking_success_weight * p.hacking_skill +
|
||||||
|
this.strength_success_weight * p.strength +
|
||||||
|
this.defense_success_weight * p.defense +
|
||||||
|
this.dexterity_success_weight * p.dexterity +
|
||||||
|
this.agility_success_weight * p.agility +
|
||||||
|
this.charisma_success_weight * p.charisma +
|
||||||
|
CONSTANTS.IntelligenceCrimeWeight * p.intelligence);
|
||||||
|
chance /= CONSTANTS.MaxSkillLevel;
|
||||||
|
chance /= this.difficulty;
|
||||||
|
chance *= p.crime_success_mult;
|
||||||
|
|
||||||
|
return Math.min(chance, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
57
src/Crime/CrimeHelpers.js
Normal file
57
src/Crime/CrimeHelpers.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
export function determineCrimeSuccess(type, moneyGained) {
|
||||||
|
var chance = 0;
|
||||||
|
var found = false;
|
||||||
|
for(const i in Crimes) {
|
||||||
|
const crime = Crimes[i];
|
||||||
|
if(crime.type == type) {
|
||||||
|
chance = crime.successRate(Player);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found) {
|
||||||
|
console.log(crime);
|
||||||
|
dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Math.random() <= chance) {
|
||||||
|
//Success
|
||||||
|
Player.gainMoney(moneyGained);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
//Failure
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function findCrime(roughName) {
|
||||||
|
if (roughName.includes("shoplift")) {
|
||||||
|
return Crimes.Shoplift;
|
||||||
|
} else if (roughName.includes("rob") && roughName.includes("store")) {
|
||||||
|
return Crimes.RobStore;
|
||||||
|
} else if (roughName.includes("mug")) {
|
||||||
|
return Crimes.Mug;
|
||||||
|
} else if (roughName.includes("larceny")) {
|
||||||
|
return Crimes.Larceny;
|
||||||
|
} else if (roughName.includes("drugs")) {
|
||||||
|
return Crimes.DealDrugs;
|
||||||
|
} else if (roughName.includes("bond") && roughName.includes("forge")) {
|
||||||
|
return Crimes.BondForgery;
|
||||||
|
} else if (roughName.includes("traffick") && roughName.includes("arms")) {
|
||||||
|
return Crimes.TraffickArms;
|
||||||
|
} else if (roughName.includes("homicide")) {
|
||||||
|
return Crimes.Homicide;
|
||||||
|
} else if (roughName.includes("grand") && roughName.includes("auto")) {
|
||||||
|
return Crimes.GrandTheftAuto;
|
||||||
|
} else if (roughName.includes("kidnap")) {
|
||||||
|
return Crimes.Kidnap;
|
||||||
|
} else if (roughName.includes("assassinate")) {
|
||||||
|
return Crimes.Assassination;
|
||||||
|
} else if (roughName.includes("heist")) {
|
||||||
|
return Crimes.Heist;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
163
src/Crime/Crimes.ts
Normal file
163
src/Crime/Crimes.ts
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
import { Crime } from "./Crime";
|
||||||
|
|
||||||
|
import { CONSTANTS } from "../Constants";
|
||||||
|
import { IMap } from "../types";
|
||||||
|
|
||||||
|
export const Crimes: IMap<Crime> = {
|
||||||
|
Shoplift: new Crime("Shoplift", CONSTANTS.CrimeShoplift, 2e3, 15e3, 1/20, 0.1, {
|
||||||
|
dexterity_success_weight: 1,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
|
||||||
|
dexterity_exp: 2,
|
||||||
|
agility_exp: 2,
|
||||||
|
}),
|
||||||
|
|
||||||
|
RobStore: new Crime("Rob Store", CONSTANTS.CrimeRobStore, 60e3, 400e3, 1/5, 0.5, {
|
||||||
|
hacking_exp: 30,
|
||||||
|
dexterity_exp: 45,
|
||||||
|
agility_exp: 45,
|
||||||
|
|
||||||
|
hacking_success_weight: 0.5 ,
|
||||||
|
dexterity_success_weight: 2,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
|
||||||
|
intelligence_exp: 0.25 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
}),
|
||||||
|
|
||||||
|
Mug: new Crime("Mug", CONSTANTS.CrimeMug, 4e3, 36e3, 1/5, 0.25, {
|
||||||
|
strength_exp: 3,
|
||||||
|
defense_exp: 3,
|
||||||
|
dexterity_exp: 3,
|
||||||
|
agility_exp: 3,
|
||||||
|
|
||||||
|
strength_success_weight: 1.5,
|
||||||
|
defense_success_weight: 0.5,
|
||||||
|
dexterity_success_weight: 1.5,
|
||||||
|
agility_success_weight: 0.5,
|
||||||
|
}),
|
||||||
|
|
||||||
|
Larceny: new Crime("Larceny", CONSTANTS.CrimeLarceny, 90e3, 800e3, 1/3, 1.5, {
|
||||||
|
hacking_exp: 45,
|
||||||
|
dexterity_exp: 60,
|
||||||
|
agility_exp: 60,
|
||||||
|
|
||||||
|
hacking_success_weight: 0.5,
|
||||||
|
dexterity_success_weight: 1,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
|
||||||
|
intelligence_exp: 0.5 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
}),
|
||||||
|
|
||||||
|
DealDrugs: new Crime("Deal Drugs", CONSTANTS.CrimeDrugs, 10e3, 120e3, 1, 0.5, {
|
||||||
|
dexterity_exp: 5,
|
||||||
|
agility_exp: 5,
|
||||||
|
charisma_exp: 10,
|
||||||
|
|
||||||
|
charisma_success_weight: 3,
|
||||||
|
dexterity_success_weight: 2,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
}),
|
||||||
|
|
||||||
|
BondForgery: new Crime("Bond Forgery", CONSTANTS.CrimeBondForgery, 300e3, 4.5e6, 1/2, 0.1, {
|
||||||
|
hacking_exp: 100,
|
||||||
|
dexterity_exp: 150,
|
||||||
|
charisma_exp: 15,
|
||||||
|
|
||||||
|
hacking_success_weight: 0.05,
|
||||||
|
dexterity_success_weight: 1.25,
|
||||||
|
|
||||||
|
intelligence_exp: 2 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
}),
|
||||||
|
|
||||||
|
TraffickArms: new Crime("Traffick Arms", CONSTANTS.CrimeTraffickArms, 40e3, 600e3, 2, 1, {
|
||||||
|
strength_exp: 20,
|
||||||
|
defense_exp: 20,
|
||||||
|
dexterity_exp: 20,
|
||||||
|
agility_exp: 20,
|
||||||
|
charisma_exp: 40,
|
||||||
|
|
||||||
|
charisma_success_weight: 1,
|
||||||
|
strength_success_weight: 1,
|
||||||
|
defense_success_weight: 1,
|
||||||
|
dexterity_success_weight: 1,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
}),
|
||||||
|
|
||||||
|
Homicide: new Crime("Homicide", CONSTANTS.CrimeHomicide, 3e3, 45e3, 1, 3, {
|
||||||
|
strength_exp: 2,
|
||||||
|
defense_exp: 2,
|
||||||
|
dexterity_exp: 2,
|
||||||
|
agility_exp: 2,
|
||||||
|
|
||||||
|
strength_success_weight: 2,
|
||||||
|
defense_success_weight: 2,
|
||||||
|
dexterity_success_weight: 0.5,
|
||||||
|
agility_success_weight: 0.5,
|
||||||
|
|
||||||
|
kills: 1,
|
||||||
|
}),
|
||||||
|
|
||||||
|
GrandTheftAuto: new Crime("Grand Theft Auto", CONSTANTS.CrimeGrandTheftAuto, 80e3, 1.6e6, 8, 5, {
|
||||||
|
strength_exp: 20,
|
||||||
|
defense_exp: 20,
|
||||||
|
dexterity_exp: 20,
|
||||||
|
agility_exp: 80,
|
||||||
|
charisma_exp: 40,
|
||||||
|
|
||||||
|
hacking_success_weight: 1,
|
||||||
|
strength_success_weight: 1,
|
||||||
|
dexterity_success_weight: 4,
|
||||||
|
agility_success_weight: 2,
|
||||||
|
charisma_success_weight: 2,
|
||||||
|
|
||||||
|
intelligence_exp: CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
}),
|
||||||
|
|
||||||
|
Kidnap: new Crime("Kidnap", CONSTANTS.CrimeKidnap, 120e3, 3.6e6, 5, 6, {
|
||||||
|
strength_exp: 80,
|
||||||
|
defense_exp: 80,
|
||||||
|
dexterity_exp: 80,
|
||||||
|
agility_exp: 80,
|
||||||
|
charisma_exp: 80,
|
||||||
|
|
||||||
|
charisma_success_weight: 1,
|
||||||
|
strength_success_weight: 1,
|
||||||
|
dexterity_success_weight: 1,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
|
||||||
|
intelligence_exp: 2 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
}),
|
||||||
|
|
||||||
|
Assassination: new Crime("Assassination", CONSTANTS.CrimeAssassination, 300e3, 12e6, 8, 10, {
|
||||||
|
strength_exp: 300,
|
||||||
|
defense_exp: 300,
|
||||||
|
dexterity_exp: 300,
|
||||||
|
agility_exp: 300,
|
||||||
|
|
||||||
|
strength_success_weight: 1,
|
||||||
|
dexterity_success_weight: 2,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
|
||||||
|
intelligence_exp: 5 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
|
||||||
|
kills: 1,
|
||||||
|
}),
|
||||||
|
|
||||||
|
Heist: new Crime("Heist", CONSTANTS.CrimeHeist, 600e3, 120e6, 18, 15, {
|
||||||
|
hacking_exp: 450,
|
||||||
|
strength_exp: 450,
|
||||||
|
defense_exp: 450,
|
||||||
|
dexterity_exp: 450,
|
||||||
|
agility_exp: 450,
|
||||||
|
charisma_exp: 450,
|
||||||
|
|
||||||
|
hacking_success_weight: 1,
|
||||||
|
strength_success_weight: 1,
|
||||||
|
defense_success_weight: 1,
|
||||||
|
dexterity_success_weight: 1,
|
||||||
|
agility_success_weight: 1,
|
||||||
|
charisma_success_weight: 1,
|
||||||
|
|
||||||
|
intelligence_exp: 10 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
||||||
|
}),
|
||||||
|
};
|
275
src/Crimes.js
275
src/Crimes.js
@ -1,275 +0,0 @@
|
|||||||
import {CONSTANTS} from "./Constants";
|
|
||||||
import {Player} from "./Player";
|
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
|
||||||
|
|
||||||
|
|
||||||
function Crime(name, type, time, money, difficulty, karma, params) {
|
|
||||||
this.name = name;
|
|
||||||
this.type = type;
|
|
||||||
this.time = time;
|
|
||||||
this.money = money;
|
|
||||||
this.difficulty = difficulty;
|
|
||||||
this.karma = karma;
|
|
||||||
|
|
||||||
this.hacking_success_weight = params.hacking_success_weight ? params.hacking_success_weight : 0;
|
|
||||||
this.strength_success_weight = params.strength_success_weight ? params.strength_success_weight : 0;
|
|
||||||
this.defense_success_weight = params.defense_success_weight ? params.defense_success_weight : 0;
|
|
||||||
this.dexterity_success_weight = params.dexterity_success_weight ? params.dexterity_success_weight : 0;
|
|
||||||
this.agility_success_weight = params.agility_success_weight ? params.agility_success_weight : 0;
|
|
||||||
this.charisma_success_weight = params.charisma_success_weight ? params.charisma_success_weight : 0;
|
|
||||||
|
|
||||||
this.hacking_exp = params.hacking_exp ? params.hacking_exp : 0;
|
|
||||||
this.strength_exp = params.strength_exp ? params.strength_exp : 0;
|
|
||||||
this.defense_exp = params.defense_exp ? params.defense_exp : 0;
|
|
||||||
this.dexterity_exp = params.dexterity_exp ? params.dexterity_exp : 0;
|
|
||||||
this.agility_exp = params.agility_exp ? params.agility_exp : 0;
|
|
||||||
this.charisma_exp = params.charisma_exp ? params.charisma_exp : 0;
|
|
||||||
this.intelligence_exp = params.intelligence_exp ? params.intelligence_exp : 0;
|
|
||||||
|
|
||||||
this.kills = params.kills ? params.kills : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Crime.prototype.commit = function(div=1, singParams=null) {
|
|
||||||
if (div <= 0) {div = 1;}
|
|
||||||
Player.crimeType = this.type;
|
|
||||||
Player.startCrime(
|
|
||||||
this.hacking_exp/div,
|
|
||||||
this.strength_exp/div,
|
|
||||||
this.defense_exp/div,
|
|
||||||
this.dexterity_exp/div,
|
|
||||||
this.agility_exp/div,
|
|
||||||
this.charisma_exp/div,
|
|
||||||
this.money/div, this.time, singParams);
|
|
||||||
return this.time;
|
|
||||||
}
|
|
||||||
|
|
||||||
Crime.prototype.successRate = function() {
|
|
||||||
var chance = (this.hacking_success_weight * Player.hacking_skill +
|
|
||||||
this.strength_success_weight * Player.strength +
|
|
||||||
this.defense_success_weight * Player.defense +
|
|
||||||
this.dexterity_success_weight * Player.dexterity +
|
|
||||||
this.agility_success_weight * Player.agility +
|
|
||||||
this.charisma_success_weight * Player.charisma +
|
|
||||||
CONSTANTS.IntelligenceCrimeWeight * Player.intelligence);
|
|
||||||
chance /= CONSTANTS.MaxSkillLevel;
|
|
||||||
chance /= this.difficulty;
|
|
||||||
chance *= Player.crime_success_mult;
|
|
||||||
return Math.min(chance, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const Crimes = {
|
|
||||||
Shoplift: new Crime("Shoplift", CONSTANTS.CrimeShoplift, 2e3, 15e3, 1/20, 0.1, {
|
|
||||||
dexterity_success_weight: 1,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
|
|
||||||
dexterity_exp: 2,
|
|
||||||
agility_exp: 2,
|
|
||||||
}),
|
|
||||||
|
|
||||||
RobStore: new Crime("Rob Store", CONSTANTS.CrimeRobStore, 60e3, 400e3, 1/5, 0.5, {
|
|
||||||
hacking_exp: 30,
|
|
||||||
dexterity_exp: 45,
|
|
||||||
agility_exp: 45,
|
|
||||||
|
|
||||||
hacking_success_weight: 0.5 ,
|
|
||||||
dexterity_success_weight: 2,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
|
|
||||||
intelligence_exp: 0.25 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
}),
|
|
||||||
|
|
||||||
Mug: new Crime("Mug", CONSTANTS.CrimeMug, 4e3, 36e3, 1/5, 0.25, {
|
|
||||||
strength_exp: 3,
|
|
||||||
defense_exp: 3,
|
|
||||||
dexterity_exp: 3,
|
|
||||||
agility_exp: 3,
|
|
||||||
|
|
||||||
strength_success_weight: 1.5,
|
|
||||||
defense_success_weight: 0.5,
|
|
||||||
dexterity_success_weight: 1.5,
|
|
||||||
agility_success_weight: 0.5,
|
|
||||||
}),
|
|
||||||
|
|
||||||
Larceny: new Crime("Larceny", CONSTANTS.CrimeLarceny, 90e3, 800e3, 1/3, 1.5, {
|
|
||||||
hacking_exp: 45,
|
|
||||||
dexterity_exp: 60,
|
|
||||||
agility_exp: 60,
|
|
||||||
|
|
||||||
hacking_success_weight: 0.5,
|
|
||||||
dexterity_success_weight: 1,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
|
|
||||||
intelligence_exp: 0.5 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
}),
|
|
||||||
|
|
||||||
DealDrugs: new Crime("Deal Drugs", CONSTANTS.CrimeDrugs, 10e3, 120e3, 1, 0.5, {
|
|
||||||
dexterity_exp: 5,
|
|
||||||
agility_exp: 5,
|
|
||||||
charisma_exp: 10,
|
|
||||||
|
|
||||||
charisma_success_weight: 3,
|
|
||||||
dexterity_success_weight: 2,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
}),
|
|
||||||
|
|
||||||
BondForgery: new Crime("Bond Forgery", CONSTANTS.CrimeBondForgery, 300e3, 4.5e6, 1/2, 0.1, {
|
|
||||||
hacking_exp: 100,
|
|
||||||
dexterity_exp: 150,
|
|
||||||
charisma_exp: 15,
|
|
||||||
|
|
||||||
hacking_success_weight: 0.05,
|
|
||||||
dexterity_success_weight: 1.25,
|
|
||||||
|
|
||||||
intelligence_exp: 2 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
}),
|
|
||||||
|
|
||||||
TraffickArms: new Crime("Traffick Arms", CONSTANTS.CrimeTraffickArms, 40e3, 600e3, 2, 1, {
|
|
||||||
strength_exp: 20,
|
|
||||||
defense_exp: 20,
|
|
||||||
dexterity_exp: 20,
|
|
||||||
agility_exp: 20,
|
|
||||||
charisma_exp: 40,
|
|
||||||
|
|
||||||
charisma_success_weight: 1,
|
|
||||||
strength_success_weight: 1,
|
|
||||||
defense_success_weight: 1,
|
|
||||||
dexterity_success_weight: 1,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
}),
|
|
||||||
|
|
||||||
Homicide: new Crime("Homicide", CONSTANTS.CrimeHomicide, 3e3, 45e3, 1, 3, {
|
|
||||||
strength_exp: 2,
|
|
||||||
defense_exp: 2,
|
|
||||||
dexterity_exp: 2,
|
|
||||||
agility_exp: 2,
|
|
||||||
|
|
||||||
strength_success_weight: 2,
|
|
||||||
defense_success_weight: 2,
|
|
||||||
dexterity_success_weight: 0.5,
|
|
||||||
agility_success_weight: 0.5,
|
|
||||||
|
|
||||||
kills: 1,
|
|
||||||
}),
|
|
||||||
|
|
||||||
GrandTheftAuto: new Crime("Grand Theft Auto", CONSTANTS.CrimeGrandTheftAuto, 80e3, 1.6e6, 8, 5, {
|
|
||||||
strength_exp: 20,
|
|
||||||
defense_exp: 20,
|
|
||||||
dexterity_exp: 20,
|
|
||||||
agility_exp: 80,
|
|
||||||
charisma_exp: 40,
|
|
||||||
|
|
||||||
hacking_success_weight: 1,
|
|
||||||
strength_success_weight: 1,
|
|
||||||
dexterity_success_weight: 4,
|
|
||||||
agility_success_weight: 2,
|
|
||||||
charisma_success_weight: 2,
|
|
||||||
|
|
||||||
intelligence_exp: CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
}),
|
|
||||||
|
|
||||||
Kidnap: new Crime("Kidnap", CONSTANTS.CrimeKidnap, 120e3, 3.6e6, 5, 6, {
|
|
||||||
strength_exp: 80,
|
|
||||||
defense_exp: 80,
|
|
||||||
dexterity_exp: 80,
|
|
||||||
agility_exp: 80,
|
|
||||||
charisma_exp: 80,
|
|
||||||
|
|
||||||
charisma_success_weight: 1,
|
|
||||||
strength_success_weight: 1,
|
|
||||||
dexterity_success_weight: 1,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
|
|
||||||
intelligence_exp: 2 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
}),
|
|
||||||
|
|
||||||
Assassination: new Crime("Assassination", CONSTANTS.CrimeAssassination, 300e3, 12e6, 8, 10, {
|
|
||||||
strength_exp: 300,
|
|
||||||
defense_exp: 300,
|
|
||||||
dexterity_exp: 300,
|
|
||||||
agility_exp: 300,
|
|
||||||
|
|
||||||
strength_success_weight: 1,
|
|
||||||
dexterity_success_weight: 2,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
|
|
||||||
intelligence_exp: 5 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
|
|
||||||
kills: 1,
|
|
||||||
}),
|
|
||||||
|
|
||||||
Heist: new Crime("Heist", CONSTANTS.CrimeHeist, 600e3, 120e6, 18, 15, {
|
|
||||||
hacking_exp: 450,
|
|
||||||
strength_exp: 450,
|
|
||||||
defense_exp: 450,
|
|
||||||
dexterity_exp: 450,
|
|
||||||
agility_exp: 450,
|
|
||||||
charisma_exp: 450,
|
|
||||||
|
|
||||||
hacking_success_weight: 1,
|
|
||||||
strength_success_weight: 1,
|
|
||||||
defense_success_weight: 1,
|
|
||||||
dexterity_success_weight: 1,
|
|
||||||
agility_success_weight: 1,
|
|
||||||
charisma_success_weight: 1,
|
|
||||||
|
|
||||||
intelligence_exp: 10 * CONSTANTS.IntelligenceCrimeBaseExpGain,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
|
|
||||||
function determineCrimeSuccess(type, moneyGained) {
|
|
||||||
var chance = 0;
|
|
||||||
var found = false;
|
|
||||||
for(const i in Crimes) {
|
|
||||||
const crime = Crimes[i];
|
|
||||||
if(crime.type == type) {
|
|
||||||
chance = crime.successRate();
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) {
|
|
||||||
console.log(crime);
|
|
||||||
dialogBoxCreate("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Math.random() <= chance) {
|
|
||||||
//Success
|
|
||||||
Player.gainMoney(moneyGained);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
//Failure
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function findCrime(roughName) {
|
|
||||||
if (roughName.includes("shoplift")) {
|
|
||||||
return Crimes.Shoplift;
|
|
||||||
} else if (roughName.includes("rob") && roughName.includes("store")) {
|
|
||||||
return Crimes.RobStore;
|
|
||||||
} else if (roughName.includes("mug")) {
|
|
||||||
return Crimes.Mug;
|
|
||||||
} else if (roughName.includes("larceny")) {
|
|
||||||
return Crimes.Larceny;
|
|
||||||
} else if (roughName.includes("drugs")) {
|
|
||||||
return Crimes.DealDrugs;
|
|
||||||
} else if (roughName.includes("bond") && roughName.includes("forge")) {
|
|
||||||
return Crimes.BondForgery;
|
|
||||||
} else if (roughName.includes("traffick") && roughName.includes("arms")) {
|
|
||||||
return Crimes.TraffickArms;
|
|
||||||
} else if (roughName.includes("homicide")) {
|
|
||||||
return Crimes.Homicide;
|
|
||||||
} else if (roughName.includes("grand") && roughName.includes("auto")) {
|
|
||||||
return Crimes.GrandTheftAuto;
|
|
||||||
} else if (roughName.includes("kidnap")) {
|
|
||||||
return Crimes.Kidnap;
|
|
||||||
} else if (roughName.includes("assassinate")) {
|
|
||||||
return Crimes.Assassination;
|
|
||||||
} else if (roughName.includes("heist")) {
|
|
||||||
return Crimes.Heist;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export {determineCrimeSuccess,findCrime,Crimes};
|
|
@ -5,7 +5,7 @@ import {getJobRequirementText} from "./Company/GetJobRequiremen
|
|||||||
import * as posNames from "./Company/data/CompanyPositionNames";
|
import * as posNames from "./Company/data/CompanyPositionNames";
|
||||||
import { Corporation } from "./Corporation/Corporation";
|
import { Corporation } from "./Corporation/Corporation";
|
||||||
import {CONSTANTS} from "./Constants";
|
import {CONSTANTS} from "./Constants";
|
||||||
import {Crimes} from "./Crimes";
|
import { Crimes } from "./Crime/Crimes";
|
||||||
import {Engine} from "./engine";
|
import {Engine} from "./engine";
|
||||||
import {beginInfiltration} from "./Infiltration";
|
import {beginInfiltration} from "./Infiltration";
|
||||||
import {hasBladeburnerSF} from "./NetscriptFunctions";
|
import {hasBladeburnerSF} from "./NetscriptFunctions";
|
||||||
@ -240,7 +240,7 @@ function displayLocationContent() {
|
|||||||
|
|
||||||
//Check if the player is employed at this Location. If he is, display the "Work" button,
|
//Check if the player is employed at this Location. If he is, display the "Work" button,
|
||||||
//update the job title, etc.
|
//update the job title, etc.
|
||||||
if (loc != "" && loc === Player.companyName) {
|
if (loc != "" && Object.keys(Player.jobs).includes(loc)) {
|
||||||
let company = Companies[loc];
|
let company = Companies[loc];
|
||||||
|
|
||||||
jobTitle.style.display = "block";
|
jobTitle.style.display = "block";
|
||||||
@ -249,7 +249,7 @@ function displayLocationContent() {
|
|||||||
locationTxtDiv1.style.display = "block";
|
locationTxtDiv1.style.display = "block";
|
||||||
locationTxtDiv2.style.display = "block";
|
locationTxtDiv2.style.display = "block";
|
||||||
locationTxtDiv3.style.display = "block";
|
locationTxtDiv3.style.display = "block";
|
||||||
jobTitle.innerHTML = "Job Title: " + Player.companyPosition;
|
jobTitle.innerHTML = `Job Title: ${Player.jobs[loc]}`;
|
||||||
let repGain = company.getFavorGain();
|
let repGain = company.getFavorGain();
|
||||||
if (repGain.length != 2) {repGain = 0;}
|
if (repGain.length != 2) {repGain = 0;}
|
||||||
repGain = repGain[0];
|
repGain = repGain[0];
|
||||||
@ -264,7 +264,7 @@ function displayLocationContent() {
|
|||||||
"favor you gain depends on how much reputation you have with the company</span>";
|
"favor you gain depends on how much reputation you have with the company</span>";
|
||||||
work.style.display = "block";
|
work.style.display = "block";
|
||||||
|
|
||||||
let currPos = CompanyPositions[Player.companyPosition];
|
let currPos = CompanyPositions[Player.jobs[loc]];
|
||||||
if (currPos == null) {
|
if (currPos == null) {
|
||||||
throw new Error("Player's companyPosition property has an invalid value");
|
throw new Error("Player's companyPosition property has an invalid value");
|
||||||
}
|
}
|
||||||
@ -1043,8 +1043,8 @@ function displayLocationContent() {
|
|||||||
|
|
||||||
// Make the "Apply to be Employee and Waiter" texts disappear if you already hold the job
|
// Make the "Apply to be Employee and Waiter" texts disappear if you already hold the job
|
||||||
// Includes part-time stuff
|
// Includes part-time stuff
|
||||||
if (loc == Player.companyName) {
|
if (Object.keys(Player.jobs).includes(loc)) {
|
||||||
var currPos = Player.companyPosition;
|
var currPos = Player.jobs[loc];
|
||||||
|
|
||||||
if (currPos == "Employee") {
|
if (currPos == "Employee") {
|
||||||
employeeJob.style.display = "none";
|
employeeJob.style.display = "none";
|
||||||
@ -1874,73 +1874,73 @@ function initLocationButtons() {
|
|||||||
|
|
||||||
slumsShoplift.addEventListener("click", function(e) {
|
slumsShoplift.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Shoplift.commit();
|
Crimes.Shoplift.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsRobStore.addEventListener("click", function(e) {
|
slumsRobStore.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.RobStore.commit();
|
Crimes.RobStore.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsMug.addEventListener("click", function(e) {
|
slumsMug.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Mug.commit();
|
Crimes.Mug.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsLarceny.addEventListener("click", function(e) {
|
slumsLarceny.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Larceny.commit();
|
Crimes.Larceny.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsDealDrugs.addEventListener("click", function(e) {
|
slumsDealDrugs.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.DealDrugs.commit();
|
Crimes.DealDrugs.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsBondForgery.addEventListener("click", function(e) {
|
slumsBondForgery.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.BondForgery.commit();
|
Crimes.BondForgery.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsTrafficArms.addEventListener("click", function(e) {
|
slumsTrafficArms.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.TraffickArms.commit();
|
Crimes.TraffickArms.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsHomicide.addEventListener("click", function(e) {
|
slumsHomicide.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Homicide.commit();
|
Crimes.Homicide.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsGta.addEventListener("click", function(e) {
|
slumsGta.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.GrandTheftAuto.commit();
|
Crimes.GrandTheftAuto.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsKidnap.addEventListener("click", function(e) {
|
slumsKidnap.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Kidnap.commit();
|
Crimes.Kidnap.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsAssassinate.addEventListener("click", function(e) {
|
slumsAssassinate.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Assassination.commit();
|
Crimes.Assassination.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
slumsHeist.addEventListener("click", function(e) {
|
slumsHeist.addEventListener("click", function(e) {
|
||||||
if (!e.isTrusted) {return false;}
|
if (!e.isTrusted) {return false;}
|
||||||
Crimes.Heist.commit();
|
Crimes.Heist.commit(Player);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import {Augmentations, Augmentation,
|
|||||||
augmentationExists, installAugmentations,
|
augmentationExists, installAugmentations,
|
||||||
AugmentationNames} from "./Augmentations";
|
AugmentationNames} from "./Augmentations";
|
||||||
import {BitNodeMultipliers} from "./BitNodeMultipliers";
|
import {BitNodeMultipliers} from "./BitNodeMultipliers";
|
||||||
import {determineCrimeSuccess, findCrime} from "./Crimes";
|
import { determineCrimeSuccess, findCrime } from "./Crime/CrimeHelpers";
|
||||||
import {Bladeburner} from "./Bladeburner";
|
import {Bladeburner} from "./Bladeburner";
|
||||||
import {Company} from "./Company/Company";
|
import {Company} from "./Company/Company";
|
||||||
import {Companies, companyExists} from "./Company/Companies";
|
import {Companies, companyExists} from "./Company/Companies";
|
||||||
@ -2902,16 +2902,12 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var companyPositionTitle = "";
|
|
||||||
if (CompanyPositions[Player.companyPosition] instanceof CompanyPosition) {
|
|
||||||
companyPositionTitle = Player.companyPosition;
|
|
||||||
}
|
|
||||||
return {
|
return {
|
||||||
bitnode: Player.bitNodeN,
|
bitnode: Player.bitNodeN,
|
||||||
city: Player.city,
|
city: Player.city,
|
||||||
company: Player.companyName,
|
|
||||||
factions: Player.factions.slice(),
|
factions: Player.factions.slice(),
|
||||||
jobTitle: companyPositionTitle,
|
jobs: Object.keys(Player.jobs),
|
||||||
|
jobTitles: Object.values(Player.jobs),
|
||||||
mult: {
|
mult: {
|
||||||
agility: Player.agility_mult,
|
agility: Player.agility_mult,
|
||||||
agilityExp: Player.agility_exp_mult,
|
agilityExp: Player.agility_exp_mult,
|
||||||
@ -3030,7 +3026,7 @@ function NetscriptFunctions(workerScript) {
|
|||||||
|
|
||||||
return Player.getUpgradeHomeRamCost();
|
return Player.getUpgradeHomeRamCost();
|
||||||
},
|
},
|
||||||
workForCompany : function() {
|
workForCompany : function(companyName) {
|
||||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||||
if (workerScript.checkingRam) {
|
if (workerScript.checkingRam) {
|
||||||
@ -3044,13 +3040,33 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inMission) {
|
// Sanitize input
|
||||||
workerScript.scriptRef.log("ERROR: workForCompany() failed because you are in the middle of a mission.");
|
if (companyName == null) {
|
||||||
return;
|
companyName = Player.companyName;
|
||||||
}
|
}
|
||||||
|
|
||||||
const companyPosition = CompanyPositions[Player.companyPosition];
|
// Make sure its a valid company
|
||||||
if (Player.companyPosition === "" || !(companyPosition instanceof CompanyPosition)) {
|
if (companyName == null || companyName === "" || !(Companies[companyName] instanceof Company)) {
|
||||||
|
workerScript.scriptRef.log(`ERROR: workForCompany() failed because of an invalid company specified: ${companyName}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure player is actually employed at the comapny
|
||||||
|
if (!Object.keys(Player.jobs).includes(companyName)) {
|
||||||
|
workerScript.scriptRef.log(`ERROR: workForCompany() failed because you do not have a job at ${companyName}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cant work while in a mission
|
||||||
|
if (inMission) {
|
||||||
|
workerScript.scriptRef.log("ERROR: workForCompany() failed because you are in the middle of a mission.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check to make sure company position data is valid
|
||||||
|
const companyPositionName = Player.jobs[companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
|
if (companyPositionName === "" || !(companyPosition instanceof CompanyPosition)) {
|
||||||
workerScript.scriptRef.log("ERROR: workForCompany() failed because you do not have a job");
|
workerScript.scriptRef.log("ERROR: workForCompany() failed because you do not have a job");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -3062,13 +3078,14 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Player.companyName = companyName;
|
||||||
if (companyPosition.isPartTimeJob()) {
|
if (companyPosition.isPartTimeJob()) {
|
||||||
Player.startWorkPartTime();
|
Player.startWorkPartTime();
|
||||||
} else {
|
} else {
|
||||||
Player.startWork();
|
Player.startWork();
|
||||||
}
|
}
|
||||||
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.workForCompany == null) {
|
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.workForCompany == null) {
|
||||||
workerScript.log(`Began working at ${Player.companyName} as a ${Player.companyPosition}`);
|
workerScript.log(`Began working at ${Player.companyName} as a ${companyPositionName}`);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
@ -3144,7 +3161,7 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
if (res) {
|
if (res) {
|
||||||
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.applyToCompany == null) {
|
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.applyToCompany == null) {
|
||||||
workerScript.log(`You were offered a new job at ${companyName} as a ${Player.companyPosition}`);
|
workerScript.log(`You were offered a new job at ${companyName} as a ${Player.jobs[companyName]}`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.applyToCompany == null) {
|
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.applyToCompany == null) {
|
||||||
@ -3582,7 +3599,7 @@ function NetscriptFunctions(workerScript) {
|
|||||||
if(workerScript.disableLogs.ALL == null && workerScript.disableLogs.commitCrime == null) {
|
if(workerScript.disableLogs.ALL == null && workerScript.disableLogs.commitCrime == null) {
|
||||||
workerScript.scriptRef.log("Attempting to commit crime: "+crime.name+"...");
|
workerScript.scriptRef.log("Attempting to commit crime: "+crime.name+"...");
|
||||||
}
|
}
|
||||||
return crime.commit(1, {workerscript: workerScript});
|
return crime.commit(Player, 1, {workerscript: workerScript});
|
||||||
},
|
},
|
||||||
getCrimeChance : function(crimeRoughName) {
|
getCrimeChance : function(crimeRoughName) {
|
||||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
import { BitNodeMultipliers } from "../BitNodeMultipliers";
|
import { BitNodeMultipliers } from "../BitNodeMultipliers";
|
||||||
import { Cities } from "../Locations/Cities";
|
import { Cities } from "../Locations/Cities";
|
||||||
import { CONSTANTS } from "../Constants";
|
import { CONSTANTS } from "../Constants";
|
||||||
|
import { IMap } from "../types";
|
||||||
|
|
||||||
// Interface for an object that represents the player (PlayerObject)
|
// Interface for an object that represents the player (PlayerObject)
|
||||||
// Used because at the time of implementation, the PlayerObject
|
// Used because at the time of implementation, the PlayerObject
|
||||||
@ -11,7 +12,19 @@ import { CONSTANTS } from "../Constants";
|
|||||||
export interface IPlayer {
|
export interface IPlayer {
|
||||||
companyName: string;
|
companyName: string;
|
||||||
factions: string[];
|
factions: string[];
|
||||||
|
jobs: IMap<string>;
|
||||||
money: any;
|
money: any;
|
||||||
|
|
||||||
|
hacking_skill: number;
|
||||||
|
strength: number;
|
||||||
|
defense: number;
|
||||||
|
dexterity: number;
|
||||||
|
agility: number;
|
||||||
|
charisma: number;
|
||||||
|
intelligence: number;
|
||||||
|
|
||||||
|
crime_success_mult: number;
|
||||||
|
|
||||||
gainHackingExp(exp: number): void;
|
gainHackingExp(exp: number): void;
|
||||||
gainStrengthExp(exp: number): void;
|
gainStrengthExp(exp: number): void;
|
||||||
gainDefenseExp(exp: number): void;
|
gainDefenseExp(exp: number): void;
|
||||||
@ -20,35 +33,16 @@ export interface IPlayer {
|
|||||||
gainCharismaExp(exp: number): void;
|
gainCharismaExp(exp: number): void;
|
||||||
gainMoney(money: number): void;
|
gainMoney(money: number): void;
|
||||||
loseMoney(money: number): void;
|
loseMoney(money: number): void;
|
||||||
}
|
startCrime(crimeType: string,
|
||||||
|
hackExp: number,
|
||||||
// Interface for a Crime object
|
strExp: number,
|
||||||
// Used because at the time of implementation, the Crime object has not been converted
|
defExp: number,
|
||||||
// to Typescript
|
dexExp: number,
|
||||||
export interface ICrime {
|
agiExp: number,
|
||||||
name: string;
|
chaExp: number,
|
||||||
type: string;
|
money: number,
|
||||||
time: number;
|
time: number,
|
||||||
money: number;
|
singParams: any): void;
|
||||||
difficulty: number;
|
|
||||||
karma: number;
|
|
||||||
|
|
||||||
hacking_success_weight: number;
|
|
||||||
strength_success_weight: number;
|
|
||||||
defense_success_weight: number;
|
|
||||||
dexterity_success_weight: number;
|
|
||||||
agility_success_weight: number;
|
|
||||||
charisma_success_weight: number;
|
|
||||||
|
|
||||||
hacking_exp: number;
|
|
||||||
strength_exp: number;
|
|
||||||
defense_exp: number;
|
|
||||||
dexterity_exp: number;
|
|
||||||
agility_exp: number;
|
|
||||||
charisma_exp: number;
|
|
||||||
intelligence_exp: number;
|
|
||||||
|
|
||||||
kills: number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interface that defines a generic object used to track experience/money
|
// Interface that defines a generic object used to track experience/money
|
||||||
@ -79,102 +73,60 @@ export abstract class Person {
|
|||||||
/**
|
/**
|
||||||
* Stats
|
* Stats
|
||||||
*/
|
*/
|
||||||
hacking_skill: number;
|
hacking_skill: number = 1;
|
||||||
strength: number;
|
strength: number = 1;
|
||||||
defense: number;
|
defense: number = 1;
|
||||||
dexterity: number;
|
dexterity: number = 1;
|
||||||
agility: number;
|
agility: number = 1;
|
||||||
charisma: number;
|
charisma: number = 1;
|
||||||
hp: number;
|
hp: number = 10;
|
||||||
max_hp: number;
|
max_hp: number = 10;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multipliers
|
* Multipliers
|
||||||
*/
|
*/
|
||||||
hacking_exp: number;
|
hacking_exp: number = 0;
|
||||||
strength_exp: number;
|
strength_exp: number = 0;
|
||||||
defense_exp: number;
|
defense_exp: number = 0;
|
||||||
dexterity_exp: number;
|
dexterity_exp: number = 0;
|
||||||
agility_exp: number;
|
agility_exp: number = 0;
|
||||||
charisma_exp: number;
|
charisma_exp: number = 0;
|
||||||
intelligence_exp: number;
|
intelligence_exp: number = 0;
|
||||||
|
|
||||||
hacking_mult: number;
|
hacking_mult: number = 1;
|
||||||
strength_mult: number;
|
strength_mult: number = 1;
|
||||||
defense_mult: number;
|
defense_mult: number = 1;
|
||||||
dexterity_mult: number;
|
dexterity_mult: number = 1;
|
||||||
agility_mult: number;
|
agility_mult: number = 1;
|
||||||
charisma_mult: number;
|
charisma_mult: number = 1;
|
||||||
|
|
||||||
hacking_exp_mult: number;
|
hacking_exp_mult: number = 1;
|
||||||
strength_exp_mult: number;
|
strength_exp_mult: number = 1;
|
||||||
defense_exp_mult: number;
|
defense_exp_mult: number = 1;
|
||||||
dexterity_exp_mult: number;
|
dexterity_exp_mult: number = 1;
|
||||||
agility_exp_mult: number;
|
agility_exp_mult: number = 1;
|
||||||
charisma_exp_mult: number;
|
charisma_exp_mult: number = 1;
|
||||||
|
|
||||||
company_rep_mult: number;
|
company_rep_mult: number = 1;
|
||||||
faction_rep_mult: number;
|
faction_rep_mult: number = 1;
|
||||||
|
|
||||||
crime_money_mult: number;
|
crime_money_mult: number = 1;
|
||||||
crime_success_mult: number;
|
crime_success_mult: number = 1;
|
||||||
|
|
||||||
work_money_mult: number;
|
work_money_mult: number = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Augmentations
|
* Augmentations
|
||||||
*/
|
*/
|
||||||
this.augmentations = [];
|
augmentations: string[] = [];
|
||||||
this.queuedAugmentations = [];
|
queuedAugmentations: string[] = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* City that the person is in
|
* City that the person is in
|
||||||
*/
|
*/
|
||||||
city: string;
|
city: string = Cities.Sector12;
|
||||||
|
|
||||||
constructor() {
|
constructor() {}
|
||||||
this.hacking_skill = 1;
|
|
||||||
this.strength = 1;
|
|
||||||
this.defense = 1;
|
|
||||||
this.dexterity = 1;
|
|
||||||
this.agility = 1;
|
|
||||||
this.charisma = 1;
|
|
||||||
this.hp = 10;
|
|
||||||
this.max_hp = 10;
|
|
||||||
|
|
||||||
// Multipliers
|
|
||||||
this.hacking_exp = 0;
|
|
||||||
this.strength_exp = 0;
|
|
||||||
this.defense_exp = 0;
|
|
||||||
this.dexterity_exp = 0;
|
|
||||||
this.agility_exp = 0;
|
|
||||||
this.charisma_exp = 0;
|
|
||||||
this.intelligence_exp = 0;
|
|
||||||
|
|
||||||
this.hacking_mult = 1;
|
|
||||||
this.strength_mult = 1;
|
|
||||||
this.defense_mult = 1;
|
|
||||||
this.dexterity_mult = 1;
|
|
||||||
this.agility_mult = 1;
|
|
||||||
this.charisma_mult = 1;
|
|
||||||
|
|
||||||
this.hacking_exp_mult = 1;
|
|
||||||
this.strength_exp_mult = 1;
|
|
||||||
this.defense_exp_mult = 1;
|
|
||||||
this.dexterity_exp_mult = 1;
|
|
||||||
this.agility_exp_mult = 1;
|
|
||||||
this.charisma_exp_mult = 1;
|
|
||||||
|
|
||||||
this.company_rep_mult = 1;
|
|
||||||
this.faction_rep_mult = 1;
|
|
||||||
|
|
||||||
this.crime_money_mult = 1;
|
|
||||||
this.crime_success_mult = 1;
|
|
||||||
|
|
||||||
this.work_money_mult = 1;
|
|
||||||
|
|
||||||
this.city = Cities.Sector12;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given an experience amount and stat multiplier, calculates the
|
* Given an experience amount and stat multiplier, calculates the
|
||||||
|
@ -10,18 +10,26 @@ import { SleeveTaskType } from "./SleeveTaskTypesEnum";
|
|||||||
|
|
||||||
import { Person,
|
import { Person,
|
||||||
IPlayer,
|
IPlayer,
|
||||||
ICrime,
|
|
||||||
ITaskTracker,
|
ITaskTracker,
|
||||||
createTaskTracker } from "../Person";
|
createTaskTracker } from "../Person";
|
||||||
|
|
||||||
import { BitNodeMultipliers } from "../../BitNodeMultipliers";
|
import { BitNodeMultipliers } from "../../BitNodeMultipliers";
|
||||||
|
|
||||||
|
import { Crime } from "../../Crime/Crime";
|
||||||
|
|
||||||
import { Cities } from "../../Locations/Cities";
|
import { Cities } from "../../Locations/Cities";
|
||||||
|
|
||||||
import { Companies } from "../../Company/Companies";
|
import { Companies } from "../../Company/Companies";
|
||||||
import { Company } from "../../Company/Company";
|
import { Company } from "../../Company/Company";
|
||||||
|
import { CompanyPosition } from "../../Company/CompanyPosition";
|
||||||
|
import { CompanyPositions } from "../../Company/CompanyPositions";
|
||||||
|
|
||||||
import { CONSTANTS } from "../../Constants";
|
import { CONSTANTS } from "../../Constants";
|
||||||
|
|
||||||
import { Faction } from "../../Faction/Faction";
|
import { Faction } from "../../Faction/Faction";
|
||||||
import { Factions } from "../../Faction/Factions";
|
import { Factions } from "../../Faction/Factions";
|
||||||
import { FactionWorkType } from "../../Faction/FactionWorkTypeEnum";
|
import { FactionWorkType } from "../../Faction/FactionWorkTypeEnum";
|
||||||
|
|
||||||
import { Locations } from "../../Locations";
|
import { Locations } from "../../Locations";
|
||||||
|
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../../utils/JSONReviver";
|
||||||
@ -45,8 +53,11 @@ export class Sleeve extends Person {
|
|||||||
currentTaskDescription: string = "";
|
currentTaskDescription: string = "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For what company/faction the current task is assigned to.
|
* Contains details about the sleeve's current task. The info stored
|
||||||
* Only applicable when working for faction or company, obviously
|
* in this depends on the task type
|
||||||
|
*
|
||||||
|
* Faction/Company Work: Name of Faction/Company
|
||||||
|
* Crime: Success rate of current crime, in decimal form
|
||||||
*/
|
*/
|
||||||
currentTaskLocation: string = "";
|
currentTaskLocation: string = "";
|
||||||
|
|
||||||
@ -119,29 +130,14 @@ export class Sleeve extends Person {
|
|||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
/*
|
|
||||||
this.currentTask = SleeveTaskType.Idle;
|
|
||||||
this.currentTaskDescription = "";
|
|
||||||
this.currentTaskTime = 0;
|
|
||||||
this.currentTaskMaxTime = 0;
|
|
||||||
this.earningsForSleeves = createTaskTracker();
|
|
||||||
this.earningsForPlayer = createTaskTracker();
|
|
||||||
this.earningsForTask = createTaskTracker();
|
|
||||||
this.gainRatesForTask = createTaskTracker();
|
|
||||||
this.logs = [];
|
|
||||||
this.memory = 0;
|
|
||||||
this.shock = 1;
|
|
||||||
this.storedCycles = 0;
|
|
||||||
this.sync = 1;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commit crimes
|
* Commit crimes
|
||||||
*/
|
*/
|
||||||
commitCrime(p: IPlayer, crime: ICrime): void {
|
commitCrime(p: IPlayer, crime: Crime): void {
|
||||||
if (this.currentTask !== SleeveTaskType.Idle) {
|
if (this.currentTask !== SleeveTaskType.Idle) {
|
||||||
this.finishTask();
|
this.finishTask(p);
|
||||||
} else {
|
} else {
|
||||||
this.resetTaskStatus();
|
this.resetTaskStatus();
|
||||||
}
|
}
|
||||||
@ -152,19 +148,38 @@ export class Sleeve extends Person {
|
|||||||
this.gainRatesForTask.dex = crime.dexterity_exp * this.dexterity_exp_mult * BitNodeMultipliers.CrimeExpGain;
|
this.gainRatesForTask.dex = crime.dexterity_exp * this.dexterity_exp_mult * BitNodeMultipliers.CrimeExpGain;
|
||||||
this.gainRatesForTask.agi = crime.agility_exp * this.agility_exp_mult * BitNodeMultipliers.CrimeExpGain;
|
this.gainRatesForTask.agi = crime.agility_exp * this.agility_exp_mult * BitNodeMultipliers.CrimeExpGain;
|
||||||
this.gainRatesForTask.cha = crime.charisma_exp * this.charisma_exp_mult * BitNodeMultipliers.CrimeExpGain;
|
this.gainRatesForTask.cha = crime.charisma_exp * this.charisma_exp_mult * BitNodeMultipliers.CrimeExpGain;
|
||||||
|
this.gainRatesForTask.money = crime.money * this.crime_money_mult * BitNodeMultipliers.CrimeMoney;
|
||||||
|
|
||||||
|
// We'll determine success now and adjust the earnings accordingly
|
||||||
|
if (Math.random() < crime.successRate(p)) {
|
||||||
|
this.gainRatesForTask.hack *= 2;
|
||||||
|
this.gainRatesForTask.str *= 2;
|
||||||
|
this.gainRatesForTask.def *= 2;
|
||||||
|
this.gainRatesForTask.dex *= 2;
|
||||||
|
this.gainRatesForTask.agi *= 2;
|
||||||
|
this.gainRatesForTask.cha *= 2;
|
||||||
|
} else {
|
||||||
|
this.gainRatesForTask.money = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this.currentTaskMaxTime = crime.time;
|
this.currentTaskMaxTime = crime.time;
|
||||||
|
|
||||||
this.currentTask = SleeveTaskType.Crime;
|
this.currentTask = SleeveTaskType.Crime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called to stop the current task
|
* Called to stop the current task
|
||||||
*/
|
*/
|
||||||
finishTask(): void {
|
finishTask(p: IPlayer): void {
|
||||||
if (this.currentTask === SleeveTaskType.Crime) {
|
if (this.currentTask === SleeveTaskType.Crime) {
|
||||||
} else {
|
// For crimes, all experience and money is gained at the end
|
||||||
|
if (this.currentTaskTime >= this.currentTaskMaxTime) {
|
||||||
|
let retValue: ITaskTracker = createTaskTracker(); // Amount of exp to be gained by other sleeves
|
||||||
|
|
||||||
|
retValue = this.gainExperience(p, this.gainRatesForTask);
|
||||||
|
this.gainMoney(p, this.gainRatesForTask);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For other crimes... I dont think anything else needs to be done
|
||||||
}
|
}
|
||||||
|
|
||||||
this.resetTaskStatus();
|
this.resetTaskStatus();
|
||||||
@ -336,14 +351,19 @@ export class Sleeve extends Person {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const repGainPerCycle: number = this.getRepGain();
|
fac.playerReputation += (this.getRepGain() * cyclesUsed);
|
||||||
fac.playerReputation += (repGainPerCycle * cyclesUsed);
|
|
||||||
break;
|
break;
|
||||||
case SleeveTaskType.Company:
|
case SleeveTaskType.Company:
|
||||||
retValue = this.gainExperience(p, this.gainRatesForTask, cyclesUsed);
|
retValue = this.gainExperience(p, this.gainRatesForTask, cyclesUsed);
|
||||||
this.gainMoney(p, this.gainRatesForTask, cyclesUsed);
|
this.gainMoney(p, this.gainRatesForTask, cyclesUsed);
|
||||||
|
|
||||||
// TODO Rep gain for this
|
const company: Company = Companies[this.currentTaskLocation];
|
||||||
|
if (!(company instanceof Company)) {
|
||||||
|
console.error(`Invalid company for Sleeve task: ${this.currentTaskLocation}`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
company.playerReputation *= (this.getRepGain() * cyclesUsed);
|
||||||
break;
|
break;
|
||||||
case SleeveTaskType.Recovery:
|
case SleeveTaskType.Recovery:
|
||||||
this.shock = Math.max(100, this.shock + (0.001 * this.storedCycles));
|
this.shock = Math.max(100, this.shock + (0.001 * this.storedCycles));
|
||||||
@ -356,9 +376,11 @@ export class Sleeve extends Person {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.currentTaskMaxTime !== 0 && this.currentTaskTime >= this.currentTaskMaxTime) {
|
if (this.currentTaskMaxTime !== 0 && this.currentTaskTime >= this.currentTaskMaxTime) {
|
||||||
this.finishTask();
|
this.finishTask(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.updateStatLevels();
|
||||||
|
|
||||||
this.storedCycles -= cyclesUsed;
|
this.storedCycles -= cyclesUsed;
|
||||||
|
|
||||||
// TODO Finish this
|
// TODO Finish this
|
||||||
@ -382,7 +404,7 @@ export class Sleeve extends Person {
|
|||||||
*/
|
*/
|
||||||
takeUniversityCourse(p: IPlayer, universityName: string, className: string): boolean {
|
takeUniversityCourse(p: IPlayer, universityName: string, className: string): boolean {
|
||||||
if (this.currentTask !== SleeveTaskType.Idle) {
|
if (this.currentTask !== SleeveTaskType.Idle) {
|
||||||
this.finishTask();
|
this.finishTask(p);
|
||||||
} else {
|
} else {
|
||||||
this.resetTaskStatus();
|
this.resetTaskStatus();
|
||||||
}
|
}
|
||||||
@ -471,22 +493,68 @@ export class Sleeve extends Person {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Work for a company
|
* Start work for one of the player's companies
|
||||||
|
* Returns boolean indicating success
|
||||||
*/
|
*/
|
||||||
workForCompany(p: IPlayer): boolean {
|
workForCompany(p: IPlayer, companyName: string): boolean {
|
||||||
return true;
|
if (!(Companies[companyName] instanceof Company) || p.jobs[companyName] == null) {
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Work for one of the player's factions
|
|
||||||
*/
|
|
||||||
workForFaction(p: IPlayer, factionName: string, workType: string): boolean {
|
|
||||||
if (!(Factions[factionName] instanceof Faction) || !p.factions.includes(factionName)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.currentTask !== SleeveTaskType.Idle) {
|
if (this.currentTask !== SleeveTaskType.Idle) {
|
||||||
this.finishTask();
|
this.finishTask(p);
|
||||||
|
} else {
|
||||||
|
this.resetTaskStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
const company: Company | null = Companies[companyName];
|
||||||
|
const companyPosition: CompanyPosition | null = CompanyPositions[p.jobs[companyName]];
|
||||||
|
if (company == null) { throw new Error(`Invalid company name specified in Sleeve.workForCompany(): ${companyName}`); }
|
||||||
|
if (companyPosition == null) { throw new Error(`Invalid CompanyPosition data in Sleeve.workForCompany(): ${companyName}`); }
|
||||||
|
|
||||||
|
this.gainRatesForTask.hack = companyPosition.hackingExpGain *
|
||||||
|
company.expMultiplier *
|
||||||
|
this.hacking_exp_mult *
|
||||||
|
BitNodeMultipliers.FactionWorkExpGain;
|
||||||
|
this.gainRatesForTask.str = companyPosition.strengthExpGain *
|
||||||
|
company.expMultiplier *
|
||||||
|
this.strength_exp_mult *
|
||||||
|
BitNodeMultipliers.FactionWorkExpGain;
|
||||||
|
this.gainRatesForTask.def = companyPosition.defenseExpGain *
|
||||||
|
company.expMultiplier *
|
||||||
|
this.defense_exp_mult *
|
||||||
|
BitNodeMultipliers.FactionWorkExpGain;
|
||||||
|
this.gainRatesForTask.dex = companyPosition.dexterityExpGain *
|
||||||
|
company.expMultiplier *
|
||||||
|
this.dexterity_exp_mult *
|
||||||
|
BitNodeMultipliers.FactionWorkExpGain;
|
||||||
|
this.gainRatesForTask.agi = companyPosition.agilityExpGain *
|
||||||
|
company.expMultiplier *
|
||||||
|
this.agility_exp_mult *
|
||||||
|
BitNodeMultipliers.FactionWorkExpGain;
|
||||||
|
this.gainRatesForTask.cha = companyPosition.charismaExpGain *
|
||||||
|
company.expMultiplier *
|
||||||
|
this.charisma_exp_mult *
|
||||||
|
BitNodeMultipliers.FactionWorkExpGain;
|
||||||
|
|
||||||
|
this.currentTaskLocation = companyName;
|
||||||
|
this.currentTask = SleeveTaskType.Company;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start work for one of the player's factions
|
||||||
|
* Returns boolean indicating success
|
||||||
|
*/
|
||||||
|
workForFaction(p: IPlayer, factionName: string, workType: string): boolean {
|
||||||
|
if (!(Factions[factionName] instanceof Faction) || !p.factions.includes(factionName)) {
|
||||||
|
throw new Error(`Invalid Faction specified for Sleeve.workForFaction(): ${factionName}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.currentTask !== SleeveTaskType.Idle) {
|
||||||
|
this.finishTask(p);
|
||||||
} else {
|
} else {
|
||||||
this.resetTaskStatus();
|
this.resetTaskStatus();
|
||||||
}
|
}
|
||||||
@ -526,7 +594,7 @@ export class Sleeve extends Person {
|
|||||||
*/
|
*/
|
||||||
workoutAtGym(p: IPlayer, gymName: string, stat: string): boolean {
|
workoutAtGym(p: IPlayer, gymName: string, stat: string): boolean {
|
||||||
if (this.currentTask !== SleeveTaskType.Idle) {
|
if (this.currentTask !== SleeveTaskType.Idle) {
|
||||||
this.finishTask();
|
this.finishTask(p);
|
||||||
} else {
|
} else {
|
||||||
this.resetTaskStatus();
|
this.resetTaskStatus();
|
||||||
}
|
}
|
||||||
|
@ -4,31 +4,45 @@
|
|||||||
import { Sleeve } from "./Sleeve";
|
import { Sleeve } from "./Sleeve";
|
||||||
import { SleeveTaskType } from "./SleeveTaskTypesEnum";
|
import { SleeveTaskType } from "./SleeveTaskTypesEnum";
|
||||||
|
|
||||||
|
import { IPlayer } from "../Person";
|
||||||
|
|
||||||
|
import { Locations } from "../../Locations";
|
||||||
|
|
||||||
|
import { Cities } from "../../Locations/Cities";
|
||||||
|
import { Crimes } from "../../Crime/Crimes";
|
||||||
|
|
||||||
import { IMap } from "../../types";
|
import { IMap } from "../../types";
|
||||||
|
|
||||||
|
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||||
import { Page,
|
import { Page,
|
||||||
routing } from "../../ui/navigationTracking";
|
routing } from "../../ui/navigationTracking";
|
||||||
|
|
||||||
|
import { dialogBoxCreate } from "../../../utils/DialogBox";
|
||||||
|
|
||||||
import { exceptionAlert } from "../../../utils/helpers/exceptionAlert";
|
import { exceptionAlert } from "../../../utils/helpers/exceptionAlert";
|
||||||
|
|
||||||
import { createElement } from "../../../utils/uiHelpers/createElement";
|
import { createElement } from "../../../utils/uiHelpers/createElement";
|
||||||
import { createOptionElement } from "../../../utils/uiHelpers/createOptionElement";
|
import { createOptionElement } from "../../../utils/uiHelpers/createOptionElement";
|
||||||
|
import { getSelectValue } from "../../../utils/uiHelpers/getSelectData";
|
||||||
|
import { removeChildrenFromElement } from "../../../utils/uiHelpers/removeChildrenFromElement";
|
||||||
import { removeElement } from "../../../utils/uiHelpers/removeElement";
|
import { removeElement } from "../../../utils/uiHelpers/removeElement";
|
||||||
import { removeElementById } from "../../../utils/uiHelpers/removeElementById";
|
import { removeElementById } from "../../../utils/uiHelpers/removeElementById";
|
||||||
|
|
||||||
// Object that keeps track of all DOM elements for the UI for a single Sleeve
|
// Object that keeps track of all DOM elements for the UI for a single Sleeve
|
||||||
interface ISleeveUIElems {
|
interface ISleeveUIElems {
|
||||||
container: Element | null,
|
container: HTMLElement | null,
|
||||||
statsPanel: Element | null,
|
statsPanel: HTMLElement | null,
|
||||||
stats: Element | null,
|
stats: HTMLElement | null,
|
||||||
statsTooltip: Element | null,
|
moreStatsButton: HTMLElement | null,
|
||||||
taskPanel: Element | null,
|
taskPanel: HTMLElement | null,
|
||||||
taskSelector: Element | null,
|
taskSelector: HTMLSelectElement | null,
|
||||||
taskDetailsSelector: Element | null,
|
taskDetailsSelector: HTMLSelectElement | null,
|
||||||
taskDescription: Element | null,
|
taskDetailsSelector2: HTMLSelectElement | null,
|
||||||
earningsPanel: Element | null,
|
taskDescription: HTMLElement | null,
|
||||||
currentEarningsInfo: Element | null,
|
taskSetButton: HTMLElement | null,
|
||||||
totalEarningsInfo: Element | null,
|
earningsPanel: HTMLElement | null,
|
||||||
|
currentEarningsInfo: HTMLElement | null,
|
||||||
|
totalEarningsButton: HTMLElement | null,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Object that keeps track of all DOM elements for the entire Sleeve UI
|
// Object that keeps track of all DOM elements for the entire Sleeve UI
|
||||||
@ -47,15 +61,18 @@ const UIElems: IPageUIElems = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Interface for Player object
|
// Interface for Player object
|
||||||
interface IPlayer {
|
interface ISleeveUiPlayer extends IPlayer {
|
||||||
sleeves: Sleeve[];
|
sleeves: Sleeve[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates the UI for the entire Sleeves page
|
// Creates the UI for the entire Sleeves page
|
||||||
export function createSleevesPage(p: IPlayer) {
|
let playerRef: ISleeveUiPlayer | null;
|
||||||
|
export function createSleevesPage(p: ISleeveUiPlayer) {
|
||||||
if (!routing.isOn(Page.Sleeves)) { return; }
|
if (!routing.isOn(Page.Sleeves)) { return; }
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
playerRef = p;
|
||||||
|
|
||||||
UIElems.container = createElement("div", {
|
UIElems.container = createElement("div", {
|
||||||
class: "generic-menupage-container",
|
class: "generic-menupage-container",
|
||||||
id: "sleeves-container",
|
id: "sleeves-container",
|
||||||
@ -73,8 +90,11 @@ export function createSleevesPage(p: IPlayer) {
|
|||||||
UIElems.sleeveList = createElement("ul");
|
UIElems.sleeveList = createElement("ul");
|
||||||
UIElems.sleeves = [];
|
UIElems.sleeves = [];
|
||||||
|
|
||||||
|
// Create UI modules for all Sleeve
|
||||||
for (const sleeve of p.sleeves) {
|
for (const sleeve of p.sleeves) {
|
||||||
UIElems.sleeves.push(this.createSleeveUi(sleeve, p.sleeves));
|
const sleeveUi = createSleeveUi(sleeve, p.sleeves);
|
||||||
|
UIElems.sleeveList.appendChild(sleeveUi.container!);
|
||||||
|
UIElems.sleeves.push(sleeveUi);
|
||||||
}
|
}
|
||||||
|
|
||||||
UIElems.container.appendChild(UIElems.info);
|
UIElems.container.appendChild(UIElems.info);
|
||||||
@ -94,29 +114,33 @@ export function updateSleevesPage() {
|
|||||||
export function clearSleevesPage() {
|
export function clearSleevesPage() {
|
||||||
removeElement(UIElems.container);
|
removeElement(UIElems.container);
|
||||||
for (const prop in UIElems) {
|
for (const prop in UIElems) {
|
||||||
UIElems[prop] = null;
|
(<any>UIElems)[prop] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
playerRef = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates the UI for a single Sleeve
|
// Creates the UI for a single Sleeve
|
||||||
// Returns an object containing the DOM elements in the UI (ISleeveUIElems)
|
// Returns an object containing the DOM elements in the UI (ISleeveUIElems)
|
||||||
function createSleeveUi(sleeve: Sleeve, allSleeves: Sleeve[]) {
|
function createSleeveUi(sleeve: Sleeve, allSleeves: Sleeve[]): ISleeveUIElems {
|
||||||
if (!routing.isOn(Page.Sleeves)) { return; }
|
|
||||||
|
|
||||||
const elems: ISleeveUIElems = {
|
const elems: ISleeveUIElems = {
|
||||||
container: null,
|
container: null,
|
||||||
statsPanel: null,
|
statsPanel: null,
|
||||||
stats: null,
|
stats: null,
|
||||||
statsTooltip: null,
|
moreStatsButton: null,
|
||||||
taskPanel: null,
|
taskPanel: null,
|
||||||
taskSelector: null,
|
taskSelector: null,
|
||||||
taskDetailsSelector: null,
|
taskDetailsSelector: null,
|
||||||
|
taskDetailsSelector2: null,
|
||||||
taskDescription: null,
|
taskDescription: null,
|
||||||
|
taskSetButton: null,
|
||||||
earningsPanel: null,
|
earningsPanel: null,
|
||||||
currentEarningsInfo: null,
|
currentEarningsInfo: null,
|
||||||
totalEarningsButton: null,
|
totalEarningsButton: null,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!routing.isOn(Page.Sleeves)) { return elems; }
|
||||||
|
|
||||||
elems.container = createElement("div", {
|
elems.container = createElement("div", {
|
||||||
class: "sleeve-container",
|
class: "sleeve-container",
|
||||||
display: "block",
|
display: "block",
|
||||||
@ -124,12 +148,46 @@ function createSleeveUi(sleeve: Sleeve, allSleeves: Sleeve[]) {
|
|||||||
|
|
||||||
elems.statsPanel = createElement("div", { class: "sleeve-panel" });
|
elems.statsPanel = createElement("div", { class: "sleeve-panel" });
|
||||||
elems.stats = createElement("p", { class: "sleeve-stats-text tooltip" });
|
elems.stats = createElement("p", { class: "sleeve-stats-text tooltip" });
|
||||||
elems.statsTooltip = createElement("span", { class: "tooltiptext" });
|
elems.moreStatsButton = createElement("button", {
|
||||||
elems.stats.appendChild(elems.statsTooltip);
|
class: "std-button",
|
||||||
|
innerText: "More Stats",
|
||||||
|
clickListener: () => {
|
||||||
|
dialogBoxCreate(
|
||||||
|
[
|
||||||
|
"<h2><u>Stats:</u></h2>",
|
||||||
|
`Hacking: ${sleeve.hacking_skill} (${numeralWrapper.formatBigNumber(sleeve.hacking_exp)} exp)`,
|
||||||
|
`Strength: ${sleeve.strength} (${numeralWrapper.formatBigNumber(sleeve.strength_exp)} exp)`,
|
||||||
|
`Defense: ${sleeve.defense} (${numeralWrapper.formatBigNumber(sleeve.defense_exp)} exp)`,
|
||||||
|
`Dexterity: ${sleeve.dexterity} (${numeralWrapper.formatBigNumber(sleeve.dexterity_exp)} exp)`,
|
||||||
|
`Agility: ${sleeve.agility} (${numeralWrapper.formatBigNumber(sleeve.agility_exp)} exp)`,
|
||||||
|
`Charisma: ${sleeve.charisma} (${numeralWrapper.formatBigNumber(sleeve.charisma_exp)} exp)<br>`,
|
||||||
|
"<h2><u>Multipliers:</u></h2>",
|
||||||
|
`Hacking Level multiplier: ${numeralWrapper.formatPercentage(sleeve.hacking_mult)}`,
|
||||||
|
`Hacking Experience multiplier: ${numeralWrapper.formatPercentage(sleeve.hacking_exp_mult)}`,
|
||||||
|
`Strength Level multiplier: ${numeralWrapper.formatPercentage(sleeve.strength_mult)}`,
|
||||||
|
`Strength Experience multiplier: ${numeralWrapper.formatPercentage(sleeve.strength_exp_mult)}`,
|
||||||
|
`Defense Level multiplier: ${numeralWrapper.formatPercentage(sleeve.defense_mult)}`,
|
||||||
|
`Defense Experience multiplier: ${numeralWrapper.formatPercentage(sleeve.defense_exp_mult)}`,
|
||||||
|
`Dexterity Level multiplier: ${numeralWrapper.formatPercentage(sleeve.dexterity_mult)}`,
|
||||||
|
`Dexterity Experience multiplier: ${numeralWrapper.formatPercentage(sleeve.dexterity_exp_mult)}`,
|
||||||
|
`Agility Level multiplier: ${numeralWrapper.formatPercentage(sleeve.agility_mult)}`,
|
||||||
|
`Agility Experience multiplier: ${numeralWrapper.formatPercentage(sleeve.agility_exp_mult)}`,
|
||||||
|
`Charisma Level multiplier: ${numeralWrapper.formatPercentage(sleeve.charisma_mult)}`,
|
||||||
|
`Charisma Experience multiplier: ${numeralWrapper.formatPercentage(sleeve.charisma_exp_mult)}`,
|
||||||
|
`Faction Reputation Gain multiplier: ${numeralWrapper.formatPercentage(sleeve.faction_rep_mult)}`,
|
||||||
|
`Company Reputation Gain multiplier: ${numeralWrapper.formatPercentage(sleeve.company_rep_mult)}`,
|
||||||
|
`Salary multiplier: ${numeralWrapper.formatPercentage(sleeve.work_money_mult)}`,
|
||||||
|
`Crime Money multiplier: ${numeralWrapper.formatPercentage(sleeve.crime_money_mult)}`,
|
||||||
|
`Crime Success multiplier: ${numeralWrapper.formatPercentage(sleeve.crime_success_mult)}`,
|
||||||
|
].join("<br>"), false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
elems.statsPanel.appendChild(elems.stats);
|
elems.statsPanel.appendChild(elems.stats);
|
||||||
|
elems.statsPanel.appendChild(elems.moreStatsButton);
|
||||||
|
|
||||||
elems.taskPanel = createElement("div", { class: "sleeve-panel" });
|
elems.taskPanel = createElement("div", { class: "sleeve-panel" });
|
||||||
elems.taskSelector = createElement("select");
|
elems.taskSelector = createElement("select") as HTMLSelectElement;
|
||||||
elems.taskSelector.add(createOptionElement("------"));
|
elems.taskSelector.add(createOptionElement("------"));
|
||||||
elems.taskSelector.add(createOptionElement("Work for Company"));
|
elems.taskSelector.add(createOptionElement("Work for Company"));
|
||||||
elems.taskSelector.add(createOptionElement("Work for Faction"));
|
elems.taskSelector.add(createOptionElement("Work for Faction"));
|
||||||
@ -142,25 +200,290 @@ function createSleeveUi(sleeve: Sleeve, allSleeves: Sleeve[]) {
|
|||||||
updateSleeveTaskSelector(sleeve, elems, allSleeves);
|
updateSleeveTaskSelector(sleeve, elems, allSleeves);
|
||||||
});
|
});
|
||||||
// TODO Set initial value for task selector
|
// TODO Set initial value for task selector
|
||||||
elems.taskDetailsSelector = createElement("select");
|
elems.taskDetailsSelector = createElement("select") as HTMLSelectElement;
|
||||||
|
elems.taskDetailsSelector2 = createElement("select") as HTMLSelectElement;
|
||||||
elems.taskDescription = createElement("p");
|
elems.taskDescription = createElement("p");
|
||||||
|
elems.taskSetButton = createElement("button", {
|
||||||
|
class: "std-button",
|
||||||
|
innerText: "Set Task",
|
||||||
|
clickListener: () => {
|
||||||
|
setSleeveTask(sleeve, elems);
|
||||||
|
}
|
||||||
|
});
|
||||||
elems.taskPanel.appendChild(elems.taskSelector);
|
elems.taskPanel.appendChild(elems.taskSelector);
|
||||||
elems.taskPanel.appendChild(elems.taskDetailsSelector);
|
elems.taskPanel.appendChild(elems.taskDetailsSelector);
|
||||||
|
elems.taskPanel.appendChild(elems.taskSetButton);
|
||||||
elems.taskPanel.appendChild(elems.taskDescription);
|
elems.taskPanel.appendChild(elems.taskDescription);
|
||||||
|
|
||||||
elems.earningsPanel = createElement("div", { class: "sleeve-panel" });
|
elems.earningsPanel = createElement("div", { class: "sleeve-panel" });
|
||||||
elems.currentEarningsInfo = createElement("p");
|
elems.currentEarningsInfo = createElement("p");
|
||||||
elems.totalEarningsButton = createElement("button", { class: "std-button" });
|
elems.totalEarningsButton = createElement("button", {
|
||||||
|
class: "std-button",
|
||||||
|
innerText: "More Earnings Info",
|
||||||
|
clickListener: () => {
|
||||||
|
dialogBoxCreate(
|
||||||
|
[
|
||||||
|
"<h2><u>Total Earnings for Current Task:</u></h2>",
|
||||||
|
`Money: ${numeralWrapper.formatMoney(sleeve.earningsForTask.money)}`,
|
||||||
|
`Hacking Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForTask.hack)}`,
|
||||||
|
`Strength Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForTask.str)}`,
|
||||||
|
`Defense Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForTask.def)}`,
|
||||||
|
`Dexterity Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForTask.dex)}`,
|
||||||
|
`Agility Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForTask.agi)}`,
|
||||||
|
`Charisma Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForTask.cha)}`,
|
||||||
|
"<h2><u>Earnings for Host Consciousness:</u></h2>",
|
||||||
|
`Money: ${numeralWrapper.formatMoney(sleeve.earningsForPlayer.money)}`,
|
||||||
|
`Hacking Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForPlayer.hack)}`,
|
||||||
|
`Strength Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForPlayer.str)}`,
|
||||||
|
`Defense Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForPlayer.def)}`,
|
||||||
|
`Dexterity Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForPlayer.dex)}`,
|
||||||
|
`Agility Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForPlayer.agi)}`,
|
||||||
|
`Charisma Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForPlayer.cha)}`,
|
||||||
|
"<h2><u>Earnings for Other Sleeves:</u></h2>",
|
||||||
|
`Money: ${numeralWrapper.formatMoney(sleeve.earningsForSleeves.money)}`,
|
||||||
|
`Hacking Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForSleeves.hack)}`,
|
||||||
|
`Strength Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForSleeves.str)}`,
|
||||||
|
`Defense Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForSleeves.def)}`,
|
||||||
|
`Dexterity Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForSleeves.dex)}`,
|
||||||
|
`Agility Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForSleeves.agi)}`,
|
||||||
|
`Charisma Exp: ${numeralWrapper.formatBigNumber(sleeve.earningsForSleeves.cha)}`,
|
||||||
|
].join("<br>"), false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return elems;
|
return elems;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updates the UI for a single Sleeve
|
// Updates the UI for a single Sleeve
|
||||||
function updateSleeveUi() {
|
function updateSleeveUi(sleeve: Sleeve, elems: ISleeveUIElems) {
|
||||||
if (!routing.isOn(Page.Sleeves)) { return; }
|
if (!routing.isOn(Page.Sleeves)) { return; }
|
||||||
|
|
||||||
|
elems.stats!.innerHTML = [`Hacking: ${numeralWrapper.format(sleeve.hacking_skill, "0,0")}`,
|
||||||
|
`Strength: ${numeralWrapper.format(sleeve.strength, "0,0")}`,
|
||||||
|
`Defense: ${numeralWrapper.format(sleeve.defense, "0,0")}`,
|
||||||
|
`Dexterity: ${numeralWrapper.format(sleeve.dexterity, "0,0")}`,
|
||||||
|
`Agility: ${numeralWrapper.format(sleeve.agility, "0,0")}`,
|
||||||
|
`Charisma: ${numeralWrapper.format(sleeve.charisma, "0,0")}`,
|
||||||
|
`HP: ${numeralWrapper.format(sleeve.hp, "0,0")} / ${numeralWrapper.format(sleeve.max_hp, "0,0")}<br>`,
|
||||||
|
`Shock: ${numeralWrapper.format(100 - sleeve.shock, "0,0")}`,
|
||||||
|
`Synchronization: ${numeralWrapper.format(sleeve.sync, "0,0")}`].join("<br>");
|
||||||
|
|
||||||
|
if (sleeve.currentTask === SleeveTaskType.Crime) {
|
||||||
|
elems.currentEarningsInfo!.innerHTML = [
|
||||||
|
`Money: ${numeralWrapper.formatMoney(sleeve.gainRatesForTask.money)} if successful`,
|
||||||
|
`Hacking Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.hack, "0.00")} (2x if successful)`,
|
||||||
|
`Strength Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.str, "0.00")} (2x if successful)`,
|
||||||
|
`Defense Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.def, "0.00")} (2x if successful)`,
|
||||||
|
`Dexterity Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.dex, "0.00")} (2x if successful)`,
|
||||||
|
`Agility Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.agi, "0.00")} (2x if successful)`,
|
||||||
|
`Charisma Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.cha, "0.00")} (2x if successful)`
|
||||||
|
].join("<br>");
|
||||||
|
} else {
|
||||||
|
elems.currentEarningsInfo!.innerHTML = [
|
||||||
|
`Money: ${numeralWrapper.formatMoney(sleeve.gainRatesForTask.money)} / s`,
|
||||||
|
`Hacking Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.hack, "0.00")} / s`,
|
||||||
|
`Strength Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.str, "0.00")} / s`,
|
||||||
|
`Defense Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.def, "0.00")} / s`,
|
||||||
|
`Dexterity Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.dex, "0.00")} / s`,
|
||||||
|
`Agility Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.agi, "0.00")} / s`,
|
||||||
|
`Charisma Exp: ${numeralWrapper.format(sleeve.gainRatesForTask.cha, "0.00")} / s`
|
||||||
|
].join("<br>");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const factionWorkTypeSelectorOptions: string[] = [
|
||||||
|
"Hacking Contracts",
|
||||||
|
"Security Work",
|
||||||
|
"Field Work"
|
||||||
|
];
|
||||||
|
|
||||||
|
const universitySelectorOptions: string[] = [
|
||||||
|
"Study Computer Science",
|
||||||
|
"Data Structures",
|
||||||
|
"Networks",
|
||||||
|
"Algorithms",
|
||||||
|
"Management",
|
||||||
|
"Leadership"
|
||||||
|
];
|
||||||
|
|
||||||
|
const gymSelectorOptions: string[] = [
|
||||||
|
"Train Strength",
|
||||||
|
"Train Defense",
|
||||||
|
"Train Dexterity",
|
||||||
|
"Train Agility"
|
||||||
|
];
|
||||||
|
|
||||||
// Whenever a new task is selected, the "details" selector must update accordingly
|
// Whenever a new task is selected, the "details" selector must update accordingly
|
||||||
function updateSleeveTaskSelector(sleeve: Sleeve, elems: ISleeveUIElems, allSleeves: Sleeve[]) {
|
function updateSleeveTaskSelector(sleeve: Sleeve, elems: ISleeveUIElems, allSleeves: Sleeve[]) {
|
||||||
const value: string =
|
if (playerRef == null) {
|
||||||
|
throw new Error(`playerRef is null in updateSleeveTaskSelector()`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Array of all companies that other sleeves are working at
|
||||||
|
const forbiddenCompanies: string[] = [];
|
||||||
|
for (const otherSleeve of allSleeves) {
|
||||||
|
if (sleeve === otherSleeve) { continue; }
|
||||||
|
if (otherSleeve.currentTask === SleeveTaskType.Company) {
|
||||||
|
forbiddenCompanies.push(otherSleeve.currentTaskLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Array of all factions that other sleeves are working for
|
||||||
|
const forbiddenFactions: string[] = [];
|
||||||
|
for (const otherSleeve of allSleeves) {
|
||||||
|
if (sleeve === otherSleeve) { continue; }
|
||||||
|
if (otherSleeve.currentTask === SleeveTaskType.Faction) {
|
||||||
|
forbiddenFactions.push(otherSleeve.currentTaskLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeChildrenFromElement(elems.taskDetailsSelector);
|
||||||
|
|
||||||
|
const value: string = getSelectValue(elems.taskSelector);
|
||||||
|
switch(value) {
|
||||||
|
case "Work for Company":
|
||||||
|
const allJobs: string[] = Object.keys(playerRef!.jobs!);
|
||||||
|
for (let i = 0; i < allJobs.length; ++i) {
|
||||||
|
if (!forbiddenCompanies.includes(allJobs[i])) {
|
||||||
|
elems.taskDetailsSelector!.add(createOptionElement(allJobs[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "Work for Faction":
|
||||||
|
for (let i = 0; i < playerRef!.factions!.length; ++i) {
|
||||||
|
const fac: string = playerRef!.factions[i]!;
|
||||||
|
if (!forbiddenFactions.includes(fac)) {
|
||||||
|
elems.taskDetailsSelector!.add(createOptionElement(fac));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0; i < factionWorkTypeSelectorOptions.length; ++i) {
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(factionWorkTypeSelectorOptions[i]));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "Commit Crime":
|
||||||
|
for (const crimeLabel in Crimes) {
|
||||||
|
const name: string = Crimes[crimeLabel].name;
|
||||||
|
elems.taskDetailsSelector!.add(createOptionElement(name, crimeLabel));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "Take University Course":
|
||||||
|
// First selector has class type
|
||||||
|
for (let i = 0; i < universitySelectorOptions.length; ++i) {
|
||||||
|
elems.taskDetailsSelector!.add(createOptionElement(universitySelectorOptions[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second selector has which university
|
||||||
|
switch (sleeve.city) {
|
||||||
|
case Cities.Aevum:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.AevumSummitUniversity));
|
||||||
|
break;
|
||||||
|
case Cities.Sector12:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.Sector12RothmanUniversity));
|
||||||
|
break;
|
||||||
|
case Cities.Volhaven:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.VolhavenZBInstituteOfTechnology));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement("No university available in city!"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "Workout at Gym":
|
||||||
|
// First selector has what stat is being trained
|
||||||
|
for (let i = 0; i < gymSelectorOptions.length; ++i) {
|
||||||
|
elems.taskDetailsSelector!.add(createOptionElement(gymSelectorOptions[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second selector has gym
|
||||||
|
switch (sleeve.city) {
|
||||||
|
case Cities.Aevum:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.AevumCrushFitnessGym));
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.AevumSnapFitnessGym));
|
||||||
|
break;
|
||||||
|
case Cities.Sector12:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.Sector12IronGym));
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.Sector12PowerhouseGym));
|
||||||
|
break;
|
||||||
|
case Cities.Volhaven:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement(Locations.VolhavenMilleniumFitnessGym));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
elems.taskDetailsSelector2!.add(createOptionElement("No gym available in city!"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "Shock Recovery":
|
||||||
|
// No options in "Details" selector
|
||||||
|
return;
|
||||||
|
case "Synchronize":
|
||||||
|
// No options in "Details" selector
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSleeveTask(sleeve: Sleeve, elems: ISleeveUIElems): void {
|
||||||
|
try {
|
||||||
|
if (playerRef == null) {
|
||||||
|
throw new Error("playerRef is null in Sleeve UI's setSleeveTask()");
|
||||||
|
}
|
||||||
|
|
||||||
|
const taskValue: string = getSelectValue(elems.taskSelector);
|
||||||
|
const detailValue: string = getSelectValue(elems.taskDetailsSelector);
|
||||||
|
const detailValue2: string = getSelectValue(elems.taskDetailsSelector);
|
||||||
|
|
||||||
|
let res: boolean = false;
|
||||||
|
switch(taskValue) {
|
||||||
|
case "Work for Company":
|
||||||
|
res = sleeve.workForCompany(playerRef!, detailValue);
|
||||||
|
if (res) {
|
||||||
|
elems.taskDescription!.innerText = `This sleeve is currently working your ` +
|
||||||
|
`job at ${sleeve.currentTaskLocation}.`;
|
||||||
|
} else {
|
||||||
|
elems.taskDescription!.innerText = "Failed to assign sleeve to task. Invalid choice(s).";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "Work for Faction":
|
||||||
|
res = sleeve.workForFaction(playerRef!, detailValue, detailValue2);
|
||||||
|
if (res) {
|
||||||
|
elems.taskDescription!.innerText = `This sleeve is currently doing ${detailValue2} for ` +
|
||||||
|
`${sleeve.currentTaskLocation}.`;
|
||||||
|
} else {
|
||||||
|
elems.taskDescription!.innerText = "Failed to assign sleeve to task. Invalid choice(s).";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "Commit Crime":
|
||||||
|
sleeve.commitCrime(playerRef!, Crimes[detailValue]);
|
||||||
|
elems.taskDescription!.innerText = `This sleeve is currently attempting to ` +
|
||||||
|
`${Crimes[detailValue]}.`;
|
||||||
|
break;
|
||||||
|
case "Take University Course":
|
||||||
|
res = sleeve.takeUniversityCourse(playerRef!, detailValue2, detailValue);
|
||||||
|
break;
|
||||||
|
case "Workout at Gym":
|
||||||
|
res = sleeve.workoutAtGym(playerRef!, detailValue2, detailValue);
|
||||||
|
break;
|
||||||
|
case "Shock Recovery":
|
||||||
|
sleeve.currentTask = SleeveTaskType.Recovery;
|
||||||
|
elems.taskDescription!.innerText = "This sleeve is currently set to focus on shock recovery. This causes " +
|
||||||
|
"the Sleeve's shock to decrease at a faster rate.";
|
||||||
|
break;
|
||||||
|
case "Synchronize":
|
||||||
|
sleeve.currentTask = SleeveTaskType.Sync;
|
||||||
|
elems.taskDescription!.innerText = "This sleeve is currently set to synchronize with the original consciousness. " +
|
||||||
|
"This causes the Sleeve's synchronization to increase."
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.error(`Invalid/Unrecognized taskValue in setSleeveTask(): ${taskValue}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (routing.isOn(Page.Sleeves)) {
|
||||||
|
updateSleevesPage();
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
exceptionAlert(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
144
src/Player.js
144
src/Player.js
@ -13,7 +13,8 @@ import * as posNames from "./Company/data/CompanyPosi
|
|||||||
import {CONSTANTS} from "./Constants";
|
import {CONSTANTS} from "./Constants";
|
||||||
import { Corporation } from "./Corporation/Corporation";
|
import { Corporation } from "./Corporation/Corporation";
|
||||||
import { Programs } from "./Programs/Programs";
|
import { Programs } from "./Programs/Programs";
|
||||||
import {determineCrimeSuccess, Crimes} from "./Crimes";
|
import { determineCrimeSuccess } from "./Crime/CrimeHelpers";
|
||||||
|
import { Crimes } from "./Crime/Crimes";
|
||||||
import {Engine} from "./engine";
|
import {Engine} from "./engine";
|
||||||
import { Faction } from "./Faction/Faction";
|
import { Faction } from "./Faction/Faction";
|
||||||
import { Factions } from "./Faction/Factions";
|
import { Factions } from "./Faction/Factions";
|
||||||
@ -98,9 +99,13 @@ function PlayerObject() {
|
|||||||
this.city = Locations.Sector12;
|
this.city = Locations.Sector12;
|
||||||
this.location = "";
|
this.location = "";
|
||||||
|
|
||||||
//Company Information
|
// Jobs that the player holds
|
||||||
|
// Map of company name (key) -> name of company position (value. Just the name, not the CompanyPosition object)
|
||||||
|
// The CompanyPosition name must match a key value in CompanyPositions
|
||||||
|
this.jobs = {};
|
||||||
|
|
||||||
|
// Company at which player is CURRENTLY working (only valid when the player is actively working)
|
||||||
this.companyName = ""; // Name of Company. Must match a key value in Companies map
|
this.companyName = ""; // Name of Company. Must match a key value in Companies map
|
||||||
this.companyPosition = ""; // Name of Company Position. Must match a key value in CompanyPositions map
|
|
||||||
|
|
||||||
//Servers
|
//Servers
|
||||||
this.currentServer = ""; //IP address of Server currently being accessed through terminal
|
this.currentServer = ""; //IP address of Server currently being accessed through terminal
|
||||||
@ -259,7 +264,7 @@ PlayerObject.prototype.prestigeAugmentation = function() {
|
|||||||
this.location = "";
|
this.location = "";
|
||||||
|
|
||||||
this.companyName = "";
|
this.companyName = "";
|
||||||
this.companyPosition = "";
|
this.jobs = {};
|
||||||
|
|
||||||
this.purchasedServers = [];
|
this.purchasedServers = [];
|
||||||
|
|
||||||
@ -339,7 +344,7 @@ PlayerObject.prototype.prestigeSourceFile = function() {
|
|||||||
this.location = "";
|
this.location = "";
|
||||||
|
|
||||||
this.companyName = "";
|
this.companyName = "";
|
||||||
this.companyPosition = "";
|
this.jobs = {};
|
||||||
|
|
||||||
this.purchasedServers = [];
|
this.purchasedServers = [];
|
||||||
|
|
||||||
@ -721,8 +726,10 @@ PlayerObject.prototype.work = function(numCycles) {
|
|||||||
companyRep = comp.playerReputation;
|
companyRep = comp.playerReputation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const position = this.jobs[this.companyName];
|
||||||
|
|
||||||
var txt = document.getElementById("work-in-progress-text");
|
var txt = document.getElementById("work-in-progress-text");
|
||||||
txt.innerHTML = "You are currently working as a " + this.companyPosition +
|
txt.innerHTML = "You are currently working as a " + position +
|
||||||
" at " + this.companyName + " (Current Company Reputation: " +
|
" at " + this.companyName + " (Current Company Reputation: " +
|
||||||
numeralWrapper.format(companyRep, '0,0') + ")<br><br>" +
|
numeralWrapper.format(companyRep, '0,0') + ")<br><br>" +
|
||||||
"You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
"You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
||||||
@ -841,9 +848,11 @@ PlayerObject.prototype.workPartTime = function(numCycles) {
|
|||||||
companyRep = comp.playerReputation;
|
companyRep = comp.playerReputation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const position = this.jobs[this.companyName];
|
||||||
|
|
||||||
var txt = document.getElementById("work-in-progress-text");
|
var txt = document.getElementById("work-in-progress-text");
|
||||||
txt.innerHTML = "You are currently working as a " + this.companyPosition +
|
txt.innerHTML = "You are currently working as a " + position +
|
||||||
" at " + Player.companyName + " (Current Company Reputation: " +
|
" at " + this.companyName + " (Current Company Reputation: " +
|
||||||
numeralWrapper.format(companyRep, '0,0') + ")<br><br>" +
|
numeralWrapper.format(companyRep, '0,0') + ")<br><br>" +
|
||||||
"You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
"You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
||||||
"You have earned: <br><br>" +
|
"You have earned: <br><br>" +
|
||||||
@ -1076,9 +1085,10 @@ PlayerObject.prototype.getWorkMoneyGain = function() {
|
|||||||
if (hasBn11SF) { bn11Mult = 1 + (company.favor / 100); }
|
if (hasBn11SF) { bn11Mult = 1 + (company.favor / 100); }
|
||||||
|
|
||||||
// Get base salary
|
// Get base salary
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (companyPosition == null) {
|
if (companyPosition == null) {
|
||||||
console.error(`Could not find CompanyPosition object for ${this.companyPosition}. Work salary will be 0`);
|
console.error(`Could not find CompanyPosition object for ${companyPositionName}. Work salary will be 0`);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1088,10 +1098,11 @@ PlayerObject.prototype.getWorkMoneyGain = function() {
|
|||||||
//Hack exp gained per game cycle
|
//Hack exp gained per game cycle
|
||||||
PlayerObject.prototype.getWorkHackExpGain = function() {
|
PlayerObject.prototype.getWorkHackExpGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work hack exp gain will be 0`].join(" "));
|
`Work hack exp gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1102,10 +1113,11 @@ PlayerObject.prototype.getWorkHackExpGain = function() {
|
|||||||
//Str exp gained per game cycle
|
//Str exp gained per game cycle
|
||||||
PlayerObject.prototype.getWorkStrExpGain = function() {
|
PlayerObject.prototype.getWorkStrExpGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work str exp gain will be 0`].join(" "));
|
`Work str exp gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1116,10 +1128,11 @@ PlayerObject.prototype.getWorkStrExpGain = function() {
|
|||||||
//Def exp gained per game cycle
|
//Def exp gained per game cycle
|
||||||
PlayerObject.prototype.getWorkDefExpGain = function() {
|
PlayerObject.prototype.getWorkDefExpGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work def exp gain will be 0`].join(" "));
|
`Work def exp gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1130,10 +1143,11 @@ PlayerObject.prototype.getWorkDefExpGain = function() {
|
|||||||
//Dex exp gained per game cycle
|
//Dex exp gained per game cycle
|
||||||
PlayerObject.prototype.getWorkDexExpGain = function() {
|
PlayerObject.prototype.getWorkDexExpGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work dex exp gain will be 0`].join(" "));
|
`Work dex exp gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1144,10 +1158,11 @@ PlayerObject.prototype.getWorkDexExpGain = function() {
|
|||||||
//Agi exp gained per game cycle
|
//Agi exp gained per game cycle
|
||||||
PlayerObject.prototype.getWorkAgiExpGain = function() {
|
PlayerObject.prototype.getWorkAgiExpGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work agi exp gain will be 0`].join(" "));
|
`Work agi exp gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1158,10 +1173,11 @@ PlayerObject.prototype.getWorkAgiExpGain = function() {
|
|||||||
//Charisma exp gained per game cycle
|
//Charisma exp gained per game cycle
|
||||||
PlayerObject.prototype.getWorkChaExpGain = function() {
|
PlayerObject.prototype.getWorkChaExpGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work cha exp gain will be 0`].join(" "));
|
`Work cha exp gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1172,10 +1188,11 @@ PlayerObject.prototype.getWorkChaExpGain = function() {
|
|||||||
//Reputation gained per game cycle
|
//Reputation gained per game cycle
|
||||||
PlayerObject.prototype.getWorkRepGain = function() {
|
PlayerObject.prototype.getWorkRepGain = function() {
|
||||||
const company = Companies[this.companyName];
|
const company = Companies[this.companyName];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
const companyPositionName = this.jobs[this.companyName];
|
||||||
|
const companyPosition = CompanyPositions[companyPositionName];
|
||||||
if (company == null || companyPosition == null) {
|
if (company == null || companyPosition == null) {
|
||||||
console.error([`Could not find Company object for ${this.companyName}`,
|
console.error([`Could not find Company object for ${this.companyName}`,
|
||||||
`or CompanyPosition object for ${this.companyPosition}.`,
|
`or CompanyPosition object for ${companyPositionName}.`,
|
||||||
`Work rep gain will be 0`].join(" "));
|
`Work rep gain will be 0`].join(" "));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1458,7 +1475,9 @@ PlayerObject.prototype.finishClass = function(sing=false) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//The EXP and $ gains are hardcoded. Time is in ms
|
//The EXP and $ gains are hardcoded. Time is in ms
|
||||||
PlayerObject.prototype.startCrime = function(hackExp, strExp, defExp, dexExp, agiExp, chaExp, money, time, singParams=null) {
|
PlayerObject.prototype.startCrime = function(crimeType, hackExp, strExp, defExp, dexExp, agiExp, chaExp, money, time, singParams=null) {
|
||||||
|
this.crimeType = crimeType;
|
||||||
|
|
||||||
this.resetWorkStatus();
|
this.resetWorkStatus();
|
||||||
this.isWorking = true;
|
this.isWorking = true;
|
||||||
this.workType = CONSTANTS.WorkTypeCrime;
|
this.workType = CONSTANTS.WorkTypeCrime;
|
||||||
@ -1672,7 +1691,7 @@ PlayerObject.prototype.applyForJob = function(entryPosType, sing=false) {
|
|||||||
if (this.companyName !== "") {
|
if (this.companyName !== "") {
|
||||||
currCompany = Companies[this.companyName];
|
currCompany = Companies[this.companyName];
|
||||||
}
|
}
|
||||||
const currPositionName = this.companyPosition;
|
const currPositionName = this.jobs[this.companyName];
|
||||||
|
|
||||||
// Get company that's being applied to
|
// Get company that's being applied to
|
||||||
const company = Companies[this.location]; //Company being applied to
|
const company = Companies[this.location]; //Company being applied to
|
||||||
@ -1729,33 +1748,14 @@ PlayerObject.prototype.applyForJob = function(entryPosType, sing=false) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Lose reputation from a Company if you are leaving it for another job
|
|
||||||
let leaveCompany = false;
|
|
||||||
let oldCompanyName = "";
|
|
||||||
if (currCompany != null) {
|
|
||||||
if (currCompany.name != company.name) {
|
|
||||||
leaveCompany = true;
|
|
||||||
oldCompanyName = currCompany.name;
|
|
||||||
currCompany.playerReputation -= 1000;
|
|
||||||
if (currCompany.playerReputation < 0) { currCompany.playerReputation = 0; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.companyName = company.name;
|
this.companyName = company.name;
|
||||||
this.companyPosition = pos.name;
|
this.jobs[company.name] = pos.name;
|
||||||
|
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
|
|
||||||
if (leaveCompany) {
|
|
||||||
if (sing) { return true; }
|
|
||||||
dialogBoxCreate([`Congratulations! You were offered a new job at ${this.companyName} as a ${pos.name}!`,
|
|
||||||
`You lost 1000 reputation at your old company ${oldCompanyName} because you left.`].join("<br>"));
|
|
||||||
} else {
|
|
||||||
if (sing) { return true; }
|
if (sing) { return true; }
|
||||||
dialogBoxCreate("Congratulations! You were offered a new job at " + this.companyName + " as a " + pos.name + "!");
|
dialogBoxCreate("Congratulations! You were offered a new job at " + this.companyName + " as a " + pos.name + "!");
|
||||||
}
|
|
||||||
|
|
||||||
Engine.loadLocationContent();
|
Engine.loadLocationContent();
|
||||||
}
|
}
|
||||||
@ -1775,7 +1775,8 @@ PlayerObject.prototype.getNextCompanyPosition = function(company, entryPosType)
|
|||||||
//If the entry pos type and the player's current position have the same type,
|
//If the entry pos type and the player's current position have the same type,
|
||||||
//return the player's "nextCompanyPosition". Otherwise return the entryposType
|
//return the player's "nextCompanyPosition". Otherwise return the entryposType
|
||||||
//Employed at this company, so just return the next position if it exists.
|
//Employed at this company, so just return the next position if it exists.
|
||||||
const currentPosition = CompanyPositions[this.companyPosition];
|
const currentPositionName = this.jobs[this.companyName];
|
||||||
|
const currentPosition = CompanyPositions[currentPositionName];
|
||||||
if ((currentPosition.isSoftwareJob() && entryPosType.isSoftwareJob()) ||
|
if ((currentPosition.isSoftwareJob() && entryPosType.isSoftwareJob()) ||
|
||||||
(currentPosition.isITJob() && entryPosType.isITJob()) ||
|
(currentPosition.isITJob() && entryPosType.isITJob()) ||
|
||||||
(currentPosition.isBusinessJob() && entryPosType.isBusinessJob()) ||
|
(currentPosition.isBusinessJob() && entryPosType.isBusinessJob()) ||
|
||||||
@ -1852,7 +1853,7 @@ PlayerObject.prototype.applyForEmployeeJob = function(sing=false) {
|
|||||||
var company = Companies[this.location]; //Company being applied to
|
var company = Companies[this.location]; //Company being applied to
|
||||||
if (this.isQualified(company, CompanyPositions[posNames.MiscCompanyPositions[1]])) {
|
if (this.isQualified(company, CompanyPositions[posNames.MiscCompanyPositions[1]])) {
|
||||||
this.companyName = company.name;
|
this.companyName = company.name;
|
||||||
this.companyPosition = posNames.MiscCompanyPositions[1];
|
this.jobs[company.name] = posNames.MiscCompanyPositions[1];
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
if (sing) {return true;}
|
if (sing) {return true;}
|
||||||
@ -1868,7 +1869,7 @@ PlayerObject.prototype.applyForPartTimeEmployeeJob = function(sing=false) {
|
|||||||
var company = Companies[this.location]; //Company being applied to
|
var company = Companies[this.location]; //Company being applied to
|
||||||
if (this.isQualified(company, CompanyPositions[posNames.PartTimeCompanyPositions[1]])) {
|
if (this.isQualified(company, CompanyPositions[posNames.PartTimeCompanyPositions[1]])) {
|
||||||
this.companyName = company.name;
|
this.companyName = company.name;
|
||||||
this.companyPosition = posNames.PartTimeCompanyPositions[1];
|
this.jobs[company.name] = posNames.PartTimeCompanyPositions[1];
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
if (sing) {return true;}
|
if (sing) {return true;}
|
||||||
@ -1884,7 +1885,7 @@ PlayerObject.prototype.applyForWaiterJob = function(sing=false) {
|
|||||||
var company = Companies[this.location]; //Company being applied to
|
var company = Companies[this.location]; //Company being applied to
|
||||||
if (this.isQualified(company, CompanyPositions[posNames.MiscCompanyPositions[0]])) {
|
if (this.isQualified(company, CompanyPositions[posNames.MiscCompanyPositions[0]])) {
|
||||||
this.companyName = company.name;
|
this.companyName = company.name;
|
||||||
this.companyPosition = posNames.MiscCompanyPositions[0];
|
this.jobs[company.name] = posNames.MiscCompanyPositions[0];
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
if (sing) {return true;}
|
if (sing) {return true;}
|
||||||
@ -1900,7 +1901,7 @@ PlayerObject.prototype.applyForPartTimeWaiterJob = function(sing=false) {
|
|||||||
var company = Companies[this.location]; //Company being applied to
|
var company = Companies[this.location]; //Company being applied to
|
||||||
if (this.isQualified(company, CompanyPositions[posNames.PartTimeCompanyPositions[0]])) {
|
if (this.isQualified(company, CompanyPositions[posNames.PartTimeCompanyPositions[0]])) {
|
||||||
this.companyName = company.name;
|
this.companyName = company.name;
|
||||||
this.companyPosition = posNames.PartTimeCompanyPositions[0];
|
this.jobs[company.name] = posNames.PartTimeCompanyPositions[0];
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
document.getElementById("world-menu-header").click();
|
document.getElementById("world-menu-header").click();
|
||||||
if (sing) {return true;}
|
if (sing) {return true;}
|
||||||
@ -1995,6 +1996,9 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
companyRep = company.playerReputation;
|
companyRep = company.playerReputation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const allCompanies = Object.keys(this.jobs);
|
||||||
|
const allPositions = Object.values(this.jobs);
|
||||||
|
|
||||||
//Illuminati
|
//Illuminati
|
||||||
var illuminatiFac = Factions["Illuminati"];
|
var illuminatiFac = Factions["Illuminati"];
|
||||||
if (!illuminatiFac.isBanned && !illuminatiFac.isMember && !illuminatiFac.alreadyInvited &&
|
if (!illuminatiFac.isBanned && !illuminatiFac.isMember && !illuminatiFac.alreadyInvited &&
|
||||||
@ -2033,14 +2037,14 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
//ECorp
|
//ECorp
|
||||||
var ecorpFac = Factions["ECorp"];
|
var ecorpFac = Factions["ECorp"];
|
||||||
if (!ecorpFac.isBanned && !ecorpFac.isMember && !ecorpFac.alreadyInvited &&
|
if (!ecorpFac.isBanned && !ecorpFac.isMember && !ecorpFac.alreadyInvited &&
|
||||||
this.companyName == Locations.AevumECorp && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.AevumECorp) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(ecorpFac);
|
invitedFactions.push(ecorpFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//MegaCorp
|
//MegaCorp
|
||||||
var megacorpFac = Factions["MegaCorp"];
|
var megacorpFac = Factions["MegaCorp"];
|
||||||
if (!megacorpFac.isBanned && !megacorpFac.isMember && !megacorpFac.alreadyInvited &&
|
if (!megacorpFac.isBanned && !megacorpFac.isMember && !megacorpFac.alreadyInvited &&
|
||||||
this.companyName == Locations.Sector12MegaCorp && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.Sector12MegaCorp) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(megacorpFac);
|
invitedFactions.push(megacorpFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2048,42 +2052,42 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
var bachmanandassociatesFac = Factions["Bachman & Associates"];
|
var bachmanandassociatesFac = Factions["Bachman & Associates"];
|
||||||
if (!bachmanandassociatesFac.isBanned && !bachmanandassociatesFac.isMember &&
|
if (!bachmanandassociatesFac.isBanned && !bachmanandassociatesFac.isMember &&
|
||||||
!bachmanandassociatesFac.alreadyInvited &&
|
!bachmanandassociatesFac.alreadyInvited &&
|
||||||
this.companyName == Locations.AevumBachmanAndAssociates && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.AevumBachmanAndAssociates) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(bachmanandassociatesFac);
|
invitedFactions.push(bachmanandassociatesFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Blade Industries
|
//Blade Industries
|
||||||
var bladeindustriesFac = Factions["Blade Industries"];
|
var bladeindustriesFac = Factions["Blade Industries"];
|
||||||
if (!bladeindustriesFac.isBanned && !bladeindustriesFac.isMember && !bladeindustriesFac.alreadyInvited &&
|
if (!bladeindustriesFac.isBanned && !bladeindustriesFac.isMember && !bladeindustriesFac.alreadyInvited &&
|
||||||
this.companyName == Locations.Sector12BladeIndustries && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.Sector12BladeIndustries) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(bladeindustriesFac);
|
invitedFactions.push(bladeindustriesFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//NWO
|
//NWO
|
||||||
var nwoFac = Factions["NWO"];
|
var nwoFac = Factions["NWO"];
|
||||||
if (!nwoFac.isBanned && !nwoFac.isMember && !nwoFac.alreadyInvited &&
|
if (!nwoFac.isBanned && !nwoFac.isMember && !nwoFac.alreadyInvited &&
|
||||||
this.companyName == Locations.VolhavenNWO && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.VolhavenNWO) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(nwoFac);
|
invitedFactions.push(nwoFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Clarke Incorporated
|
//Clarke Incorporated
|
||||||
var clarkeincorporatedFac = Factions["Clarke Incorporated"];
|
var clarkeincorporatedFac = Factions["Clarke Incorporated"];
|
||||||
if (!clarkeincorporatedFac.isBanned && !clarkeincorporatedFac.isMember && !clarkeincorporatedFac.alreadyInvited &&
|
if (!clarkeincorporatedFac.isBanned && !clarkeincorporatedFac.isMember && !clarkeincorporatedFac.alreadyInvited &&
|
||||||
this.companyName == Locations.AevumClarkeIncorporated && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.AevumClarkeIncorporated) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(clarkeincorporatedFac);
|
invitedFactions.push(clarkeincorporatedFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//OmniTek Incorporated
|
//OmniTek Incorporated
|
||||||
var omnitekincorporatedFac = Factions["OmniTek Incorporated"];
|
var omnitekincorporatedFac = Factions["OmniTek Incorporated"];
|
||||||
if (!omnitekincorporatedFac.isBanned && !omnitekincorporatedFac.isMember && !omnitekincorporatedFac.alreadyInvited &&
|
if (!omnitekincorporatedFac.isBanned && !omnitekincorporatedFac.isMember && !omnitekincorporatedFac.alreadyInvited &&
|
||||||
this.companyName == Locations.VolhavenOmniTekIncorporated && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.VolhavenOmniTekIncorporated) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(omnitekincorporatedFac);
|
invitedFactions.push(omnitekincorporatedFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Four Sigma
|
//Four Sigma
|
||||||
var foursigmaFac = Factions["Four Sigma"];
|
var foursigmaFac = Factions["Four Sigma"];
|
||||||
if (!foursigmaFac.isBanned && !foursigmaFac.isMember && !foursigmaFac.alreadyInvited &&
|
if (!foursigmaFac.isBanned && !foursigmaFac.isMember && !foursigmaFac.alreadyInvited &&
|
||||||
this.companyName == Locations.Sector12FourSigma && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.Sector12FourSigma) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(foursigmaFac);
|
invitedFactions.push(foursigmaFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2091,7 +2095,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
var kuaigonginternationalFac = Factions["KuaiGong International"];
|
var kuaigonginternationalFac = Factions["KuaiGong International"];
|
||||||
if (!kuaigonginternationalFac.isBanned && !kuaigonginternationalFac.isMember &&
|
if (!kuaigonginternationalFac.isBanned && !kuaigonginternationalFac.isMember &&
|
||||||
!kuaigonginternationalFac.alreadyInvited &&
|
!kuaigonginternationalFac.alreadyInvited &&
|
||||||
this.companyName == Locations.ChongqingKuaiGongInternational && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
allCompanies.includes(Locations.ChongqingKuaiGongInternational) && companyRep >= CONSTANTS.CorpFactionRepRequirement) {
|
||||||
invitedFactions.push(kuaigonginternationalFac);
|
invitedFactions.push(kuaigonginternationalFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2104,7 +2108,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
if (!fulcrumsecrettechonologiesFac.isBanned && !fulcrumsecrettechonologiesFac.isMember &&
|
if (!fulcrumsecrettechonologiesFac.isBanned && !fulcrumsecrettechonologiesFac.isMember &&
|
||||||
!fulcrumsecrettechonologiesFac.alreadyInvited &&
|
!fulcrumsecrettechonologiesFac.alreadyInvited &&
|
||||||
fulcrumSecretServer.manuallyHacked &&
|
fulcrumSecretServer.manuallyHacked &&
|
||||||
this.companyName == Locations.AevumFulcrumTechnologies && companyRep >= 250000) {
|
allCompanies.includes(Locations.AevumFulcrumTechnologies) && companyRep >= 250000) {
|
||||||
invitedFactions.push(fulcrumsecrettechonologiesFac);
|
invitedFactions.push(fulcrumsecrettechonologiesFac);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2187,8 +2191,8 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
if (!speakersforthedeadFac.isBanned && !speakersforthedeadFac.isMember && !speakersforthedeadFac.alreadyInvited &&
|
if (!speakersforthedeadFac.isBanned && !speakersforthedeadFac.isMember && !speakersforthedeadFac.alreadyInvited &&
|
||||||
this.hacking_skill >= 100 && this.strength >= 300 && this.defense >= 300 &&
|
this.hacking_skill >= 100 && this.strength >= 300 && this.defense >= 300 &&
|
||||||
this.dexterity >= 300 && this.agility >= 300 && this.numPeopleKilled >= 30 &&
|
this.dexterity >= 300 && this.agility >= 300 && this.numPeopleKilled >= 30 &&
|
||||||
this.karma <= -45 && this.companyName != Locations.Sector12CIA &&
|
this.karma <= -45 && !allCompanies.includes(Locations.Sector12CIA) &&
|
||||||
this.companyName != Locations.Sector12NSA) {
|
!allCompanies.includes(Locations.Sector12NSA)) {
|
||||||
invitedFactions.push(speakersforthedeadFac);
|
invitedFactions.push(speakersforthedeadFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2197,8 +2201,8 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
if (!thedarkarmyFac.isBanned && !thedarkarmyFac.isMember && !thedarkarmyFac.alreadyInvited &&
|
if (!thedarkarmyFac.isBanned && !thedarkarmyFac.isMember && !thedarkarmyFac.alreadyInvited &&
|
||||||
this.hacking_skill >= 300 && this.strength >= 300 && this.defense >= 300 &&
|
this.hacking_skill >= 300 && this.strength >= 300 && this.defense >= 300 &&
|
||||||
this.dexterity >= 300 && this.agility >= 300 && this.city == Locations.Chongqing &&
|
this.dexterity >= 300 && this.agility >= 300 && this.city == Locations.Chongqing &&
|
||||||
this.numPeopleKilled >= 5 && this.karma <= -45 && this.companyName != Locations.Sector12CIA &&
|
this.numPeopleKilled >= 5 && this.karma <= -45 && !allCompanies.includes(Locations.Sector12CIA) &&
|
||||||
this.companyName != Locations.Sector12NSA) {
|
!allCompanies.includes(Locations.Sector12NSA)) {
|
||||||
invitedFactions.push(thedarkarmyFac);
|
invitedFactions.push(thedarkarmyFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2209,18 +2213,16 @@ PlayerObject.prototype.checkForFactionInvitations = function() {
|
|||||||
this.dexterity >= 200 && this.agility >= 200 &&
|
this.dexterity >= 200 && this.agility >= 200 &&
|
||||||
(this.city == Locations.Aevum || this.city == Locations.Sector12) &&
|
(this.city == Locations.Aevum || this.city == Locations.Sector12) &&
|
||||||
this.money.gte(10000000) && this.karma <= -90 &&
|
this.money.gte(10000000) && this.karma <= -90 &&
|
||||||
this.companyName != Locations.Sector12CIA && this.companyName != Locations.Sector12NSA) {
|
!allCompanies.includes(Locations.Sector12CIA) && !allCompanies.includes(Locations.Sector12NSA)) {
|
||||||
invitedFactions.push(thesyndicateFac);
|
invitedFactions.push(thesyndicateFac);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Silhouette
|
//Silhouette
|
||||||
var silhouetteFac = Factions["Silhouette"];
|
var silhouetteFac = Factions["Silhouette"];
|
||||||
const companyPosition = CompanyPositions[this.companyPosition];
|
|
||||||
if (!silhouetteFac.isBanned && !silhouetteFac.isMember && !silhouetteFac.alreadyInvited &&
|
if (!silhouetteFac.isBanned && !silhouetteFac.isMember && !silhouetteFac.alreadyInvited &&
|
||||||
companyPosition != null &&
|
(allPositions.includes("Chief Technology Officer") ||
|
||||||
(companyPosition.name == "Chief Technology Officer" ||
|
allPositions.includes("Chief Financial Officer") ||
|
||||||
companyPosition.name == "Chief Financial Officer" ||
|
allPositions.includes("Chief Executive Officer")) &&
|
||||||
companyPosition.name == "Chief Executive Officer") &&
|
|
||||||
this.money.gte(15000000) && this.karma <= -22) {
|
this.money.gte(15000000) && this.karma <= -22) {
|
||||||
invitedFactions.push(silhouetteFac);
|
invitedFactions.push(silhouetteFac);
|
||||||
}
|
}
|
||||||
|
@ -151,6 +151,16 @@ function evaluateVersionCompatibility(ver) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This version allowed players to hold multiple jobs
|
||||||
|
if (ver <= "0.43.0") {
|
||||||
|
if (Player.companyName !== "" && Player.companyPosition !== "") {
|
||||||
|
console.log("Copied player's companyName and companyPosition properties to the Player.jobs map for v0.43.0");
|
||||||
|
Player.jobs[Player.companyName] = Player.companyPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete Player.companyPosition;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadGame(saveString) {
|
function loadGame(saveString) {
|
||||||
|
@ -557,9 +557,9 @@ const Engine = {
|
|||||||
displayCharacterInfo: function() {
|
displayCharacterInfo: function() {
|
||||||
removeChildrenFromElement(Engine.Display.characterInfo);
|
removeChildrenFromElement(Engine.Display.characterInfo);
|
||||||
|
|
||||||
var companyPosition = "";
|
let companyPosition = "";
|
||||||
if (Player.companyPosition !== "") {
|
if (Player.companyName !== "") {
|
||||||
companyPosition = Player.companyPosition;
|
companyPosition = Player.jobs[Player.companyName];
|
||||||
}
|
}
|
||||||
|
|
||||||
var intText = "";
|
var intText = "";
|
||||||
@ -576,8 +576,9 @@ const Engine = {
|
|||||||
innerHTML:
|
innerHTML:
|
||||||
'<b>General</b><br><br>' +
|
'<b>General</b><br><br>' +
|
||||||
'Current City: ' + Player.city + '<br><br>' +
|
'Current City: ' + Player.city + '<br><br>' +
|
||||||
'Employer: ' + Player.companyName + '<br>' +
|
`Employer at which you last worked: ${Player.companyName}<br>` +
|
||||||
'Job Title: ' + companyPosition + '<br><br>' +
|
`Job you last worked: ${companyPosition}<br>` +
|
||||||
|
`All Employers: ${Object.keys(Player.jobs).join(", ")}<br><br>` +
|
||||||
'Money: $' + formatNumber(Player.money.toNumber(), 2) + '<br><br><br>' +
|
'Money: $' + formatNumber(Player.money.toNumber(), 2) + '<br><br><br>' +
|
||||||
'<b>Stats</b><br><br>' +
|
'<b>Stats</b><br><br>' +
|
||||||
'Hacking Level: ' + (Player.hacking_skill).toLocaleString() +
|
'Hacking Level: ' + (Player.hacking_skill).toLocaleString() +
|
||||||
@ -1306,7 +1307,7 @@ const Engine = {
|
|||||||
else {factions.style.display = "none";}
|
else {factions.style.display = "none";}
|
||||||
if (Player.firstAugPurchased) {visibleMenuTabs.push(augmentations);}
|
if (Player.firstAugPurchased) {visibleMenuTabs.push(augmentations);}
|
||||||
else {augmentations.style.display = "none";}
|
else {augmentations.style.display = "none";}
|
||||||
if (Player.companyPosition !== "") {visibleMenuTabs.push(job);}
|
if (Player.companyName !== "") {visibleMenuTabs.push(job);}
|
||||||
else {job.style.display = "none";}
|
else {job.style.display = "none";}
|
||||||
if (Player.firstTimeTraveled) {visibleMenuTabs.push(travel);}
|
if (Player.firstTimeTraveled) {visibleMenuTabs.push(travel);}
|
||||||
else {travel.style.display = "none";}
|
else {travel.style.display = "none";}
|
||||||
@ -1589,7 +1590,7 @@ const Engine = {
|
|||||||
var gangLink = document.getElementById("gang-menu-link");
|
var gangLink = document.getElementById("gang-menu-link");
|
||||||
|
|
||||||
// Determine whether certain links should show up
|
// Determine whether certain links should show up
|
||||||
job.style.display = Player.companyPosition !== "" ? "list-item" : "none";
|
job.style.display = Player.companyName !== "" ? "list-item" : "none";
|
||||||
stockmarket.style.display = Player.hasWseAccount ? "list-item" : "none";
|
stockmarket.style.display = Player.hasWseAccount ? "list-item" : "none";
|
||||||
bladeburner.style.display = Player.bladeburner instanceof Bladeburner ? "list-item" : "none";
|
bladeburner.style.display = Player.bladeburner instanceof Bladeburner ? "list-item" : "none";
|
||||||
corporation.style.display = Player.corporation instanceof Corporation ? "list-item" : "none";
|
corporation.style.display = Player.corporation instanceof Corporation ? "list-item" : "none";
|
||||||
|
@ -40,13 +40,20 @@ class NumeralFormatter {
|
|||||||
return numeral(n).format(format);
|
return numeral(n).format(format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
formatBigNumber(n: number): string {
|
||||||
|
return this.format(n, "0.000a");
|
||||||
|
}
|
||||||
|
|
||||||
formatMoney(n: number): string {
|
formatMoney(n: number): string {
|
||||||
return this.format(n, "$0.000a");
|
return this.format(n, "$0.000a");
|
||||||
}
|
}
|
||||||
|
|
||||||
formatBigNumber(n: number): string {
|
formatPercentage(n: number, decimalPlaces: number=2): string {
|
||||||
return this.format(n, "0.000a");
|
const formatter: string = "0." + "0".repeat(decimalPlaces) + "%";
|
||||||
|
return this.format(n, formatter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const numeralWrapper = new NumeralFormatter();
|
export const numeralWrapper = new NumeralFormatter();
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { createElement } from "./createElement";
|
import { createElement } from "./createElement";
|
||||||
|
|
||||||
export function createOptionElement(text: string, value: string="") {
|
export function createOptionElement(text: string, value: string=""): HTMLOptionElement {
|
||||||
const sanitizedValue: string = value;
|
let sanitizedValue: string = value;
|
||||||
if (sanitizedValue === "") { sanitizedValue = text; }
|
if (sanitizedValue === "") { sanitizedValue = text; }
|
||||||
|
|
||||||
return createElement("option", {
|
return createElement("option", {
|
||||||
text: text,
|
text: text,
|
||||||
value: sanitizedValue,
|
value: sanitizedValue,
|
||||||
});
|
}) as HTMLOptionElement;
|
||||||
}
|
}
|
||||||
|
9
utils/uiHelpers/getSelectData.ts
Normal file
9
utils/uiHelpers/getSelectData.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export function getSelectValue(selector: HTMLSelectElement | null): string {
|
||||||
|
if (selector == null) { return ""; }
|
||||||
|
return selector[selector.selectedIndex].value;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSelectText(selector: HTMLSelectElement | null): string {
|
||||||
|
if (selector == null) { return ""; }
|
||||||
|
return selector[selector.selectedIndex].text;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user