2021-10-05 04:25:21 +02:00
|
|
|
import { INetscriptHelper } from "./INetscriptHelper";
|
|
|
|
import { IPlayer } from "../PersonObjects/IPlayer";
|
|
|
|
import { getRamCost } from "../Netscript/RamCostGenerator";
|
|
|
|
import { FactionWorkType } from "../Faction/FactionWorkTypeEnum";
|
|
|
|
import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
|
|
|
|
import { SleeveTaskType } from "../PersonObjects/Sleeve/SleeveTaskTypesEnum";
|
|
|
|
import { WorkerScript } from "../Netscript/WorkerScript";
|
|
|
|
import { findSleevePurchasableAugs } from "../PersonObjects/Sleeve/SleeveHelpers";
|
|
|
|
import { Augmentations } from "../Augmentation/Augmentations";
|
|
|
|
import { CityName } from "../Locations/data/CityNames";
|
2021-10-11 23:12:08 +02:00
|
|
|
import { findCrime } from "../Crime/CrimeHelpers";
|
2021-10-05 04:25:21 +02:00
|
|
|
|
2021-11-03 23:16:10 +01:00
|
|
|
import { Sleeve as ISleeve } from "../ScriptEditor/NetscriptDefinitions";
|
2021-10-05 04:25:21 +02:00
|
|
|
|
2021-11-03 23:16:10 +01:00
|
|
|
export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, helper: INetscriptHelper): ISleeve {
|
2021-10-05 04:25:21 +02:00
|
|
|
const checkSleeveAPIAccess = function (func: any): void {
|
|
|
|
if (player.bitNodeN !== 10 && !SourceFileFlags[10]) {
|
|
|
|
throw helper.makeRuntimeErrorMsg(
|
|
|
|
`sleeve.${func}`,
|
|
|
|
"You do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const checkSleeveNumber = function (func: any, sleeveNumber: any): void {
|
|
|
|
if (sleeveNumber >= player.sleeves.length || sleeveNumber < 0) {
|
|
|
|
const msg = `Invalid sleeve number: ${sleeveNumber}`;
|
2021-11-27 00:30:58 +01:00
|
|
|
workerScript.log(func, () => msg);
|
2021-10-05 04:25:21 +02:00
|
|
|
throw helper.makeRuntimeErrorMsg(`sleeve.${func}`, msg);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return {
|
|
|
|
getNumSleeves: function (): number {
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("getNumSleeves", getRamCost(player, "sleeve", "getNumSleeves"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("getNumSleeves");
|
|
|
|
return player.sleeves.length;
|
|
|
|
},
|
|
|
|
setToShockRecovery: function (asleeveNumber: any = 0): boolean {
|
|
|
|
const sleeveNumber = helper.number("setToShockRecovery", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToShockRecovery", getRamCost(player, "sleeve", "setToShockRecovery"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToShockRecovery");
|
|
|
|
checkSleeveNumber("setToShockRecovery", sleeveNumber);
|
|
|
|
return player.sleeves[sleeveNumber].shockRecovery(player);
|
|
|
|
},
|
|
|
|
setToSynchronize: function (asleeveNumber: any = 0): boolean {
|
|
|
|
const sleeveNumber = helper.number("setToSynchronize", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToSynchronize", getRamCost(player, "sleeve", "setToSynchronize"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToSynchronize");
|
|
|
|
checkSleeveNumber("setToSynchronize", sleeveNumber);
|
|
|
|
return player.sleeves[sleeveNumber].synchronize(player);
|
|
|
|
},
|
2021-10-11 23:12:08 +02:00
|
|
|
setToCommitCrime: function (asleeveNumber: any = 0, aCrimeRoughName: any = ""): boolean {
|
2021-10-05 04:25:21 +02:00
|
|
|
const sleeveNumber = helper.number("setToCommitCrime", "sleeveNumber", asleeveNumber);
|
2021-10-11 23:12:08 +02:00
|
|
|
const crimeRoughName = helper.string("setToCommitCrime", "crimeName", aCrimeRoughName);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToCommitCrime", getRamCost(player, "sleeve", "setToCommitCrime"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToCommitCrime");
|
|
|
|
checkSleeveNumber("setToCommitCrime", sleeveNumber);
|
2021-10-11 23:12:08 +02:00
|
|
|
const crime = findCrime(crimeRoughName);
|
|
|
|
if (crime === null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return player.sleeves[sleeveNumber].commitCrime(player, crime.name);
|
2021-10-05 04:25:21 +02:00
|
|
|
},
|
|
|
|
setToUniversityCourse: function (asleeveNumber: any = 0, auniversityName: any = "", aclassName: any = ""): boolean {
|
|
|
|
const sleeveNumber = helper.number("setToUniversityCourse", "sleeveNumber", asleeveNumber);
|
|
|
|
const universityName = helper.string("setToUniversityCourse", "universityName", auniversityName);
|
|
|
|
const className = helper.string("setToUniversityCourse", "className", aclassName);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToUniversityCourse", getRamCost(player, "sleeve", "setToUniversityCourse"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToUniversityCourse");
|
|
|
|
checkSleeveNumber("setToUniversityCourse", sleeveNumber);
|
|
|
|
return player.sleeves[sleeveNumber].takeUniversityCourse(player, universityName, className);
|
|
|
|
},
|
|
|
|
travel: function (asleeveNumber: any = 0, acityName: any = ""): boolean {
|
|
|
|
const sleeveNumber = helper.number("travel", "sleeveNumber", asleeveNumber);
|
|
|
|
const cityName = helper.string("setToUniversityCourse", "cityName", acityName);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("travel", getRamCost(player, "sleeve", "travel"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("travel");
|
|
|
|
checkSleeveNumber("travel", sleeveNumber);
|
|
|
|
return player.sleeves[sleeveNumber].travel(player, cityName as CityName);
|
|
|
|
},
|
|
|
|
setToCompanyWork: function (asleeveNumber: any = 0, acompanyName: any = ""): boolean {
|
|
|
|
const sleeveNumber = helper.number("setToCompanyWork", "sleeveNumber", asleeveNumber);
|
|
|
|
const companyName = helper.string("setToUniversityCourse", "companyName", acompanyName);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToCompanyWork", getRamCost(player, "sleeve", "setToCompanyWork"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToCompanyWork");
|
|
|
|
checkSleeveNumber("setToCompanyWork", sleeveNumber);
|
|
|
|
|
|
|
|
// Cannot work at the same company that another sleeve is working at
|
|
|
|
for (let i = 0; i < player.sleeves.length; ++i) {
|
|
|
|
if (i === sleeveNumber) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const other = player.sleeves[i];
|
|
|
|
if (other.currentTask === SleeveTaskType.Company && other.currentTaskLocation === companyName) {
|
|
|
|
throw helper.makeRuntimeErrorMsg(
|
|
|
|
"sleeve.setToFactionWork",
|
|
|
|
`Sleeve ${sleeveNumber} cannot work for company ${companyName} because Sleeve ${i} is already working for them.`,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return player.sleeves[sleeveNumber].workForCompany(player, companyName);
|
|
|
|
},
|
|
|
|
setToFactionWork: function (asleeveNumber: any = 0, afactionName: any = "", aworkType: any = ""): boolean {
|
|
|
|
const sleeveNumber = helper.number("setToFactionWork", "sleeveNumber", asleeveNumber);
|
|
|
|
const factionName = helper.string("setToUniversityCourse", "factionName", afactionName);
|
|
|
|
const workType = helper.string("setToUniversityCourse", "workType", aworkType);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToFactionWork", getRamCost(player, "sleeve", "setToFactionWork"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToFactionWork");
|
|
|
|
checkSleeveNumber("setToFactionWork", sleeveNumber);
|
|
|
|
|
|
|
|
// Cannot work at the same faction that another sleeve is working at
|
|
|
|
for (let i = 0; i < player.sleeves.length; ++i) {
|
|
|
|
if (i === sleeveNumber) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const other = player.sleeves[i];
|
|
|
|
if (other.currentTask === SleeveTaskType.Faction && other.currentTaskLocation === factionName) {
|
|
|
|
throw helper.makeRuntimeErrorMsg(
|
|
|
|
"sleeve.setToFactionWork",
|
|
|
|
`Sleeve ${sleeveNumber} cannot work for faction ${factionName} because Sleeve ${i} is already working for them.`,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return player.sleeves[sleeveNumber].workForFaction(player, factionName, workType);
|
|
|
|
},
|
|
|
|
setToGymWorkout: function (asleeveNumber: any = 0, agymName: any = "", astat: any = ""): boolean {
|
|
|
|
const sleeveNumber = helper.number("setToGymWorkout", "sleeveNumber", asleeveNumber);
|
|
|
|
const gymName = helper.string("setToUniversityCourse", "gymName", agymName);
|
|
|
|
const stat = helper.string("setToUniversityCourse", "stat", astat);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("setToGymWorkout", getRamCost(player, "sleeve", "setToGymWorkout"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("setToGymWorkout");
|
|
|
|
checkSleeveNumber("setToGymWorkout", sleeveNumber);
|
|
|
|
|
|
|
|
return player.sleeves[sleeveNumber].workoutAtGym(player, gymName, stat);
|
|
|
|
},
|
|
|
|
getSleeveStats: function (asleeveNumber: any = 0): {
|
|
|
|
shock: number;
|
|
|
|
sync: number;
|
2021-11-05 22:12:52 +01:00
|
|
|
hacking: number;
|
2021-10-05 04:25:21 +02:00
|
|
|
strength: number;
|
|
|
|
defense: number;
|
|
|
|
dexterity: number;
|
|
|
|
agility: number;
|
|
|
|
charisma: number;
|
|
|
|
} {
|
|
|
|
const sleeveNumber = helper.number("getSleeveStats", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("getSleeveStats", getRamCost(player, "sleeve", "getSleeveStats"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("getSleeveStats");
|
|
|
|
checkSleeveNumber("getSleeveStats", sleeveNumber);
|
|
|
|
|
|
|
|
const sl = player.sleeves[sleeveNumber];
|
|
|
|
return {
|
|
|
|
shock: 100 - sl.shock,
|
|
|
|
sync: sl.sync,
|
2021-11-05 22:12:52 +01:00
|
|
|
hacking: sl.hacking,
|
2021-10-05 04:25:21 +02:00
|
|
|
strength: sl.strength,
|
|
|
|
defense: sl.defense,
|
|
|
|
dexterity: sl.dexterity,
|
|
|
|
agility: sl.agility,
|
|
|
|
charisma: sl.charisma,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
getTask: function (asleeveNumber: any = 0): {
|
|
|
|
task: string;
|
|
|
|
crime: string;
|
|
|
|
location: string;
|
|
|
|
gymStatType: string;
|
|
|
|
factionWorkType: string;
|
|
|
|
} {
|
|
|
|
const sleeveNumber = helper.number("getTask", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("getTask", getRamCost(player, "sleeve", "getTask"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("getTask");
|
|
|
|
checkSleeveNumber("getTask", sleeveNumber);
|
|
|
|
|
|
|
|
const sl = player.sleeves[sleeveNumber];
|
|
|
|
return {
|
|
|
|
task: SleeveTaskType[sl.currentTask],
|
|
|
|
crime: sl.crimeType,
|
|
|
|
location: sl.currentTaskLocation,
|
|
|
|
gymStatType: sl.gymStatType,
|
|
|
|
factionWorkType: FactionWorkType[sl.factionWorkType],
|
|
|
|
};
|
|
|
|
},
|
|
|
|
getInformation: function (asleeveNumber: any = 0): any {
|
|
|
|
const sleeveNumber = helper.number("getInformation", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("getInformation", getRamCost(player, "sleeve", "getInformation"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("getInformation");
|
|
|
|
checkSleeveNumber("getInformation", sleeveNumber);
|
|
|
|
|
|
|
|
const sl = player.sleeves[sleeveNumber];
|
|
|
|
return {
|
|
|
|
city: sl.city,
|
|
|
|
hp: sl.hp,
|
|
|
|
jobs: Object.keys(player.jobs), // technically sleeves have the same jobs as the player.
|
|
|
|
jobTitle: Object.values(player.jobs),
|
|
|
|
maxHp: sl.max_hp,
|
|
|
|
|
|
|
|
mult: {
|
|
|
|
agility: sl.agility_mult,
|
|
|
|
agilityExp: sl.agility_exp_mult,
|
2021-12-09 00:27:14 +01:00
|
|
|
charisma: sl.charisma_mult,
|
|
|
|
charismaExp: sl.charisma_exp_mult,
|
2021-10-05 04:25:21 +02:00
|
|
|
companyRep: sl.company_rep_mult,
|
|
|
|
crimeMoney: sl.crime_money_mult,
|
|
|
|
crimeSuccess: sl.crime_success_mult,
|
|
|
|
defense: sl.defense_mult,
|
|
|
|
defenseExp: sl.defense_exp_mult,
|
|
|
|
dexterity: sl.dexterity_mult,
|
|
|
|
dexterityExp: sl.dexterity_exp_mult,
|
|
|
|
factionRep: sl.faction_rep_mult,
|
|
|
|
hacking: sl.hacking_mult,
|
|
|
|
hackingExp: sl.hacking_exp_mult,
|
|
|
|
strength: sl.strength_mult,
|
|
|
|
strengthExp: sl.strength_exp_mult,
|
|
|
|
workMoney: sl.work_money_mult,
|
|
|
|
},
|
|
|
|
|
|
|
|
timeWorked: sl.currentTaskTime,
|
|
|
|
earningsForSleeves: {
|
|
|
|
workHackExpGain: sl.earningsForSleeves.hack,
|
|
|
|
workStrExpGain: sl.earningsForSleeves.str,
|
|
|
|
workDefExpGain: sl.earningsForSleeves.def,
|
|
|
|
workDexExpGain: sl.earningsForSleeves.dex,
|
|
|
|
workAgiExpGain: sl.earningsForSleeves.agi,
|
|
|
|
workChaExpGain: sl.earningsForSleeves.cha,
|
|
|
|
workMoneyGain: sl.earningsForSleeves.money,
|
|
|
|
},
|
|
|
|
earningsForPlayer: {
|
|
|
|
workHackExpGain: sl.earningsForPlayer.hack,
|
|
|
|
workStrExpGain: sl.earningsForPlayer.str,
|
|
|
|
workDefExpGain: sl.earningsForPlayer.def,
|
|
|
|
workDexExpGain: sl.earningsForPlayer.dex,
|
|
|
|
workAgiExpGain: sl.earningsForPlayer.agi,
|
|
|
|
workChaExpGain: sl.earningsForPlayer.cha,
|
|
|
|
workMoneyGain: sl.earningsForPlayer.money,
|
|
|
|
},
|
|
|
|
earningsForTask: {
|
|
|
|
workHackExpGain: sl.earningsForTask.hack,
|
|
|
|
workStrExpGain: sl.earningsForTask.str,
|
|
|
|
workDefExpGain: sl.earningsForTask.def,
|
|
|
|
workDexExpGain: sl.earningsForTask.dex,
|
|
|
|
workAgiExpGain: sl.earningsForTask.agi,
|
|
|
|
workChaExpGain: sl.earningsForTask.cha,
|
|
|
|
workMoneyGain: sl.earningsForTask.money,
|
|
|
|
},
|
|
|
|
workRepGain: sl.getRepGain(player),
|
|
|
|
};
|
|
|
|
},
|
|
|
|
getSleeveAugmentations: function (asleeveNumber: any = 0): string[] {
|
|
|
|
const sleeveNumber = helper.number("getSleeveAugmentations", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("getSleeveAugmentations", getRamCost(player, "sleeve", "getSleeveAugmentations"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("getSleeveAugmentations");
|
|
|
|
checkSleeveNumber("getSleeveAugmentations", sleeveNumber);
|
|
|
|
|
|
|
|
const augs = [];
|
|
|
|
for (let i = 0; i < player.sleeves[sleeveNumber].augmentations.length; i++) {
|
|
|
|
augs.push(player.sleeves[sleeveNumber].augmentations[i].name);
|
|
|
|
}
|
|
|
|
return augs;
|
|
|
|
},
|
|
|
|
getSleevePurchasableAugs: function (asleeveNumber: any = 0): {
|
|
|
|
name: string;
|
|
|
|
cost: number;
|
|
|
|
}[] {
|
|
|
|
const sleeveNumber = helper.number("getSleevePurchasableAugs", "sleeveNumber", asleeveNumber);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("getSleevePurchasableAugs", getRamCost(player, "sleeve", "getSleevePurchasableAugs"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("getSleevePurchasableAugs");
|
|
|
|
checkSleeveNumber("getSleevePurchasableAugs", sleeveNumber);
|
|
|
|
|
|
|
|
const purchasableAugs = findSleevePurchasableAugs(player.sleeves[sleeveNumber], player);
|
|
|
|
const augs = [];
|
|
|
|
for (let i = 0; i < purchasableAugs.length; i++) {
|
|
|
|
const aug = purchasableAugs[i];
|
|
|
|
augs.push({
|
|
|
|
name: aug.name,
|
|
|
|
cost: aug.startingCost,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return augs;
|
|
|
|
},
|
|
|
|
purchaseSleeveAug: function (asleeveNumber: any = 0, aaugName: any = ""): boolean {
|
|
|
|
const sleeveNumber = helper.number("purchaseSleeveAug", "sleeveNumber", asleeveNumber);
|
2022-02-01 22:45:50 +01:00
|
|
|
const augName = helper.string("purchaseSleeveAug", "augName", aaugName);
|
2022-01-05 01:09:34 +01:00
|
|
|
helper.updateDynamicRam("purchaseSleeveAug", getRamCost(player, "sleeve", "purchaseSleeveAug"));
|
2021-10-05 04:25:21 +02:00
|
|
|
checkSleeveAPIAccess("purchaseSleeveAug");
|
|
|
|
checkSleeveNumber("purchaseSleeveAug", sleeveNumber);
|
|
|
|
|
|
|
|
const aug = Augmentations[augName];
|
|
|
|
if (!aug) {
|
|
|
|
throw helper.makeRuntimeErrorMsg("sleeve.purchaseSleeveAug", `Invalid aug: ${augName}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
return player.sleeves[sleeveNumber].tryBuyAugmentation(player, aug);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|