2022-03-30 02:12:55 +02:00
|
|
|
import { FactionNames } from "../Faction/data/FactionNames";
|
|
|
|
import { GangConstants } from "../Gang/data/Constants";
|
2022-10-10 00:42:14 +02:00
|
|
|
import { Player } from "@player";
|
2021-10-05 03:06:55 +02:00
|
|
|
import { Gang } from "../Gang/Gang";
|
|
|
|
import { AllGangs } from "../Gang/AllGangs";
|
|
|
|
import { GangMemberTasks } from "../Gang/GangMemberTasks";
|
|
|
|
import { GangMemberUpgrades } from "../Gang/GangMemberUpgrades";
|
|
|
|
import { GangMember } from "../Gang/GangMember";
|
|
|
|
import { GangMemberTask } from "../Gang/GangMemberTask";
|
2022-08-08 19:43:41 +02:00
|
|
|
import { helpers } from "../Netscript/NetscriptHelpers";
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-12-30 02:28:53 +01:00
|
|
|
import { Gang as IGang, EquipmentStats, GangOtherInfoObject } from "@nsdefs";
|
2022-05-08 01:08:07 +02:00
|
|
|
import { InternalAPI, NetscriptContext } from "../Netscript/APIWrapper";
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-08-09 21:41:47 +02:00
|
|
|
export function NetscriptGang(): InternalAPI<IGang> {
|
2022-09-27 21:14:34 +02:00
|
|
|
/** Functions as an API check and also returns the gang object */
|
|
|
|
const getGang = function (ctx: NetscriptContext): Gang {
|
|
|
|
if (!Player.gang) throw helpers.makeRuntimeErrorMsg(ctx, "Must have joined gang", "API ACCESS");
|
|
|
|
return Player.gang;
|
2021-10-05 03:06:55 +02:00
|
|
|
};
|
|
|
|
|
2022-05-08 01:08:07 +02:00
|
|
|
const getGangMember = function (ctx: NetscriptContext, name: string): GangMember {
|
2022-09-27 21:14:34 +02:00
|
|
|
const gang = getGang(ctx);
|
2021-10-05 03:06:55 +02:00
|
|
|
for (const member of gang.members) if (member.name === name) return member;
|
2022-08-08 19:43:41 +02:00
|
|
|
throw helpers.makeRuntimeErrorMsg(ctx, `Invalid gang member: '${name}'`);
|
2021-10-05 03:06:55 +02:00
|
|
|
};
|
|
|
|
|
2022-05-08 01:08:07 +02:00
|
|
|
const getGangTask = function (ctx: NetscriptContext, name: string): GangMemberTask {
|
2021-10-05 03:06:55 +02:00
|
|
|
const task = GangMemberTasks[name];
|
|
|
|
if (!task) {
|
2022-08-08 19:43:41 +02:00
|
|
|
throw helpers.makeRuntimeErrorMsg(ctx, `Invalid task: '${name}'`);
|
2021-10-05 03:06:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return task;
|
|
|
|
};
|
|
|
|
|
|
|
|
return {
|
2022-10-12 14:49:27 +02:00
|
|
|
createGang: (ctx) => (_faction) => {
|
|
|
|
const faction = helpers.string(ctx, "faction", _faction);
|
|
|
|
// this list is copied from Faction/ui/Root.tsx
|
2022-03-19 09:09:59 +01:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
if (!Player.canAccessGang() || !GangConstants.Names.includes(faction)) return false;
|
|
|
|
if (Player.gang) return false;
|
|
|
|
if (!Player.factions.includes(faction)) return false;
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
const isHacking = faction === FactionNames.NiteSec || faction === FactionNames.TheBlackHand;
|
|
|
|
Player.startGang(faction, isHacking);
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
inGang: () => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
return Player.gang ? true : false;
|
2021-10-05 03:06:55 +02:00
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
getMemberNames: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
const gang = getGang(ctx);
|
2021-10-05 03:06:55 +02:00
|
|
|
return gang.members.map((member) => member.name);
|
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
getGangInformation: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
const gang = getGang(ctx);
|
2021-10-05 03:06:55 +02:00
|
|
|
return {
|
|
|
|
faction: gang.facName,
|
|
|
|
isHacking: gang.isHackingGang,
|
|
|
|
moneyGainRate: gang.moneyGainRate,
|
|
|
|
power: gang.getPower(),
|
|
|
|
respect: gang.respect,
|
|
|
|
respectGainRate: gang.respectGainRate,
|
|
|
|
territory: gang.getTerritory(),
|
|
|
|
territoryClashChance: gang.territoryClashChance,
|
|
|
|
territoryWarfareEngaged: gang.territoryWarfareEngaged,
|
|
|
|
wantedLevel: gang.wanted,
|
|
|
|
wantedLevelGainRate: gang.wantedGainRate,
|
2021-12-08 23:39:01 +01:00
|
|
|
wantedPenalty: gang.getWantedPenalty(),
|
2021-10-05 03:06:55 +02:00
|
|
|
};
|
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
getOtherGangInformation: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
getGang(ctx);
|
2022-07-15 07:58:00 +02:00
|
|
|
const cpy: Record<string, GangOtherInfoObject> = {};
|
2022-01-16 01:45:03 +01:00
|
|
|
for (const gang of Object.keys(AllGangs)) {
|
2021-10-05 03:06:55 +02:00
|
|
|
cpy[gang] = Object.assign({}, AllGangs[gang]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return cpy;
|
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
getMemberInformation: (ctx) => (_memberName) => {
|
|
|
|
const memberName = helpers.string(ctx, "memberName", _memberName);
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
const member = getGangMember(ctx, memberName);
|
|
|
|
return {
|
|
|
|
name: member.name,
|
|
|
|
task: member.task,
|
|
|
|
earnedRespect: member.earnedRespect,
|
|
|
|
hack: member.hack,
|
|
|
|
str: member.str,
|
|
|
|
def: member.def,
|
|
|
|
dex: member.dex,
|
|
|
|
agi: member.agi,
|
|
|
|
cha: member.cha,
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
hack_exp: member.hack_exp,
|
|
|
|
str_exp: member.str_exp,
|
|
|
|
def_exp: member.def_exp,
|
|
|
|
dex_exp: member.dex_exp,
|
|
|
|
agi_exp: member.agi_exp,
|
|
|
|
cha_exp: member.cha_exp,
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
hack_mult: member.hack_mult,
|
|
|
|
str_mult: member.str_mult,
|
|
|
|
def_mult: member.def_mult,
|
|
|
|
dex_mult: member.dex_mult,
|
|
|
|
agi_mult: member.agi_mult,
|
|
|
|
cha_mult: member.cha_mult,
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
hack_asc_mult: member.calculateAscensionMult(member.hack_asc_points),
|
|
|
|
str_asc_mult: member.calculateAscensionMult(member.str_asc_points),
|
|
|
|
def_asc_mult: member.calculateAscensionMult(member.def_asc_points),
|
|
|
|
dex_asc_mult: member.calculateAscensionMult(member.dex_asc_points),
|
|
|
|
agi_asc_mult: member.calculateAscensionMult(member.agi_asc_points),
|
|
|
|
cha_asc_mult: member.calculateAscensionMult(member.cha_asc_points),
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
hack_asc_points: member.hack_asc_points,
|
|
|
|
str_asc_points: member.str_asc_points,
|
|
|
|
def_asc_points: member.def_asc_points,
|
|
|
|
dex_asc_points: member.dex_asc_points,
|
|
|
|
agi_asc_points: member.agi_asc_points,
|
|
|
|
cha_asc_points: member.cha_asc_points,
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
upgrades: member.upgrades.slice(),
|
|
|
|
augmentations: member.augmentations.slice(),
|
2021-12-08 23:39:01 +01:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
respectGain: member.calculateRespectGain(gang),
|
|
|
|
wantedLevelGain: member.calculateWantedLevelGain(gang),
|
|
|
|
moneyGain: member.calculateMoneyGain(gang),
|
|
|
|
};
|
|
|
|
},
|
|
|
|
canRecruitMember: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
const gang = getGang(ctx);
|
2021-10-05 03:06:55 +02:00
|
|
|
return gang.canRecruitMember();
|
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
recruitMember: (ctx) => (_memberName) => {
|
|
|
|
const memberName = helpers.string(ctx, "memberName", _memberName);
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
const recruited = gang.recruitMember(memberName);
|
|
|
|
if (recruited) {
|
|
|
|
ctx.workerScript.log("gang.recruitMember", () => `Successfully recruited Gang Member '${memberName}'`);
|
|
|
|
} else {
|
|
|
|
ctx.workerScript.log("gang.recruitMember", () => `Failed to recruit Gang Member '${memberName}'`);
|
|
|
|
}
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
return recruited;
|
|
|
|
},
|
|
|
|
getTaskNames: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
const gang = getGang(ctx);
|
2021-10-05 03:06:55 +02:00
|
|
|
const tasks = gang.getAllTaskNames();
|
|
|
|
tasks.unshift("Unassigned");
|
|
|
|
return tasks;
|
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
setMemberTask: (ctx) => (_memberName, _taskName) => {
|
|
|
|
const memberName = helpers.string(ctx, "memberName", _memberName);
|
|
|
|
const taskName = helpers.string(ctx, "taskName", _taskName);
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
const member = getGangMember(ctx, memberName);
|
|
|
|
if (!gang.getAllTaskNames().includes(taskName)) {
|
|
|
|
ctx.workerScript.log(
|
|
|
|
"gang.setMemberTask",
|
|
|
|
() =>
|
|
|
|
`Failed to assign Gang Member '${memberName}' to Invalid task '${taskName}'. '${memberName}' is now Unassigned`,
|
|
|
|
);
|
|
|
|
return member.assignToTask("Unassigned");
|
|
|
|
}
|
|
|
|
const success = member.assignToTask(taskName);
|
|
|
|
if (success) {
|
|
|
|
ctx.workerScript.log(
|
|
|
|
"gang.setMemberTask",
|
|
|
|
() => `Successfully assigned Gang Member '${memberName}' to '${taskName}' task`,
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
ctx.workerScript.log(
|
|
|
|
"gang.setMemberTask",
|
|
|
|
() => `Failed to assign Gang Member '${memberName}' to '${taskName}' task. '${memberName}' is now Unassigned`,
|
|
|
|
);
|
|
|
|
}
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
return success;
|
|
|
|
},
|
|
|
|
getTaskStats: (ctx) => (_taskName) => {
|
|
|
|
const taskName = helpers.string(ctx, "taskName", _taskName);
|
|
|
|
getGang(ctx);
|
|
|
|
const task = getGangTask(ctx, taskName);
|
|
|
|
const copy = Object.assign({}, task);
|
|
|
|
copy.territory = Object.assign({}, task.territory);
|
|
|
|
return copy;
|
|
|
|
},
|
|
|
|
getEquipmentNames: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
getGang(ctx);
|
2021-10-05 03:06:55 +02:00
|
|
|
return Object.keys(GangMemberUpgrades);
|
|
|
|
},
|
2022-10-12 14:49:27 +02:00
|
|
|
getEquipmentCost: (ctx) => (_equipName) => {
|
|
|
|
const equipName = helpers.string(ctx, "equipName", _equipName);
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
const upg = GangMemberUpgrades[equipName];
|
|
|
|
if (upg === null) return Infinity;
|
|
|
|
return gang.getUpgradeCost(upg);
|
|
|
|
},
|
|
|
|
getEquipmentType: (ctx) => (_equipName) => {
|
|
|
|
const equipName = helpers.string(ctx, "equipName", _equipName);
|
|
|
|
getGang(ctx);
|
|
|
|
const upg = GangMemberUpgrades[equipName];
|
|
|
|
if (upg == null) return "";
|
|
|
|
return upg.getType();
|
|
|
|
},
|
|
|
|
getEquipmentStats: (ctx) => (_equipName) => {
|
|
|
|
const equipName = helpers.string(ctx, "equipName", _equipName);
|
|
|
|
getGang(ctx);
|
|
|
|
const equipment = GangMemberUpgrades[equipName];
|
|
|
|
if (!equipment) {
|
|
|
|
throw helpers.makeRuntimeErrorMsg(ctx, `Invalid equipment: ${equipName}`);
|
|
|
|
}
|
|
|
|
const typecheck: EquipmentStats = equipment.mults;
|
|
|
|
return Object.assign({}, typecheck);
|
|
|
|
},
|
|
|
|
purchaseEquipment: (ctx) => (_memberName, _equipName) => {
|
|
|
|
const memberName = helpers.string(ctx, "memberName", _memberName);
|
|
|
|
const equipName = helpers.string(ctx, "equipName", _equipName);
|
|
|
|
getGang(ctx);
|
|
|
|
const member = getGangMember(ctx, memberName);
|
|
|
|
const equipment = GangMemberUpgrades[equipName];
|
|
|
|
if (!equipment) return false;
|
|
|
|
const res = member.buyUpgrade(equipment);
|
|
|
|
if (res) {
|
|
|
|
ctx.workerScript.log(
|
|
|
|
"gang.purchaseEquipment",
|
|
|
|
() => `Purchased '${equipName}' for Gang member '${memberName}'`,
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
ctx.workerScript.log(
|
|
|
|
"gang.purchaseEquipment",
|
|
|
|
() => `Failed to purchase '${equipName}' for Gang member '${memberName}'`,
|
|
|
|
);
|
|
|
|
}
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
return res;
|
|
|
|
},
|
|
|
|
ascendMember: (ctx) => (_memberName) => {
|
|
|
|
const memberName = helpers.string(ctx, "memberName", _memberName);
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
const member = getGangMember(ctx, memberName);
|
|
|
|
if (!member.canAscend()) return;
|
|
|
|
return gang.ascendMember(member, ctx.workerScript);
|
|
|
|
},
|
|
|
|
getAscensionResult: (ctx) => (_memberName) => {
|
|
|
|
const memberName = helpers.string(ctx, "memberName", _memberName);
|
|
|
|
getGang(ctx);
|
|
|
|
const member = getGangMember(ctx, memberName);
|
|
|
|
if (!member.canAscend()) return;
|
|
|
|
return {
|
|
|
|
respect: member.earnedRespect,
|
|
|
|
...member.getAscensionResults(),
|
|
|
|
};
|
|
|
|
},
|
|
|
|
setTerritoryWarfare: (ctx) => (_engage) => {
|
|
|
|
const engage = !!_engage;
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
if (engage) {
|
|
|
|
gang.territoryWarfareEngaged = true;
|
|
|
|
ctx.workerScript.log("gang.setTerritoryWarfare", () => "Engaging in Gang Territory Warfare");
|
|
|
|
} else {
|
|
|
|
gang.territoryWarfareEngaged = false;
|
|
|
|
ctx.workerScript.log("gang.setTerritoryWarfare", () => "Disengaging in Gang Territory Warfare");
|
|
|
|
}
|
|
|
|
},
|
|
|
|
getChanceToWinClash: (ctx) => (_otherGang) => {
|
|
|
|
const otherGang = helpers.string(ctx, "otherGang", _otherGang);
|
|
|
|
const gang = getGang(ctx);
|
|
|
|
if (AllGangs[otherGang] == null) {
|
|
|
|
throw helpers.makeRuntimeErrorMsg(ctx, `Invalid gang: ${otherGang}`);
|
|
|
|
}
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
const playerPower = AllGangs[gang.facName].power;
|
|
|
|
const otherPower = AllGangs[otherGang].power;
|
2021-10-05 03:06:55 +02:00
|
|
|
|
2022-10-12 14:49:27 +02:00
|
|
|
return playerPower / (otherPower + playerPower);
|
|
|
|
},
|
|
|
|
getBonusTime: (ctx) => () => {
|
2022-09-27 21:14:34 +02:00
|
|
|
const gang = getGang(ctx);
|
2022-04-28 13:20:53 +02:00
|
|
|
return Math.round(gang.storedCycles / 5) * 1000;
|
2021-10-05 03:06:55 +02:00
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|