More rebalancing for re-worked Gang mechanic

This commit is contained in:
danielyxie 2018-10-22 19:34:39 -05:00
parent e073c08011
commit 8c5931a142
5 changed files with 165 additions and 60 deletions

@ -518,6 +518,7 @@ let CONSTANTS = {
*** Gang Members can now be killed during territory 'warfare' *** Gang Members can now be killed during territory 'warfare'
*** Changed BitNode-2 Multipliers to make hacking slightly less profitable *** Changed BitNode-2 Multipliers to make hacking slightly less profitable
*** Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect *** Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect
*** The effects of Source-File 2 are now slightly more powerful
* RAM Cost of accessing the global document object lowered from 100 GB to 25 GB * RAM Cost of accessing the global document object lowered from 100 GB to 25 GB
* RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4 * RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4
* b1t_flum3.exe now takes significantly less time to create * b1t_flum3.exe now takes significantly less time to create

@ -321,7 +321,6 @@ export function createDevMenu() {
const bladeburnerGainRankInput = createElement("input", { const bladeburnerGainRankInput = createElement("input", {
class: "text-input", class: "text-input",
display: "block",
placeholder: "Rank to gain (or negative to lose rank)", placeholder: "Rank to gain (or negative to lose rank)",
type: "number", type: "number",
}); });
@ -336,7 +335,6 @@ export function createDevMenu() {
exceptionAlert(`Failed to change Bladeburner Rank in dev menu: ${e}`); exceptionAlert(`Failed to change Bladeburner Rank in dev menu: ${e}`);
} }
}, },
display: "block",
innerText: "Gain Bladeburner Rank", innerText: "Gain Bladeburner Rank",
}); });
@ -345,7 +343,6 @@ export function createDevMenu() {
const gangStoredCyclesInput = createElement("input", { const gangStoredCyclesInput = createElement("input", {
class: "text-input", class: "text-input",
display: "block",
placeholder: "# Cycles to add", placeholder: "# Cycles to add",
type: "number", type: "number",
}); });
@ -360,7 +357,6 @@ export function createDevMenu() {
exceptionAlert(`Failed to add stored cycles to gang mechanic: ${e}`); exceptionAlert(`Failed to add stored cycles to gang mechanic: ${e}`);
} }
}, },
display: "block",
innerText: "Add cycles to Gang mechanic", innerText: "Add cycles to Gang mechanic",
}) })
@ -418,9 +414,11 @@ export function createDevMenu() {
devMenuContainer.appendChild(bladeburnerHeader); devMenuContainer.appendChild(bladeburnerHeader);
devMenuContainer.appendChild(bladeburnerGainRankInput); devMenuContainer.appendChild(bladeburnerGainRankInput);
devMenuContainer.appendChild(bladeburnerGainRankButton); devMenuContainer.appendChild(bladeburnerGainRankButton);
devMenuContainer.appendChild(createElement("br"));
devMenuContainer.appendChild(gangHeader); devMenuContainer.appendChild(gangHeader);
devMenuContainer.appendChild(gangStoredCyclesInput); devMenuContainer.appendChild(gangStoredCyclesInput);
devMenuContainer.appendChild(gangAddStoredCycles); devMenuContainer.appendChild(gangAddStoredCycles);
devMenuContainer.appendChild(createElement("br"));
const entireGameContainer = document.getElementById("entire-game-container"); const entireGameContainer = document.getElementById("entire-game-container");
if (entireGameContainer == null) { if (entireGameContainer == null) {

@ -390,8 +390,7 @@ Gang.prototype.processExperienceGains = function(numCycles=1) {
Gang.prototype.calculatePower = function() { Gang.prototype.calculatePower = function() {
var memberTotal = 0; var memberTotal = 0;
for (var i = 0; i < this.members.length; ++i) { for (var i = 0; i < this.members.length; ++i) {
if (this.members[i].task instanceof GangMemberTask && if (GangMemberTasks.hasOwnProperty(this.members[i].task) && this.members[i].task == "Territory Warfare") {
this.members[i].task.name == "Territory Warfare") {
const gain = this.members[i].calculatePower(); const gain = this.members[i].calculatePower();
memberTotal += gain; memberTotal += gain;
} }
@ -413,7 +412,7 @@ Gang.prototype.clash = function(won=false) {
const member = this.members[i]; const member = this.members[i];
// Only members assigned to Territory Warfare can die // Only members assigned to Territory Warfare can die
if (member.task.name !== "Territory Warfare") { continue; } if (member.task !== "Territory Warfare") { continue; }
// Chance to die is decreased based on defense // Chance to die is decreased based on defense
const modifiedDeathChance = baseDeathChance / Math.pow(def, 0.25); const modifiedDeathChance = baseDeathChance / Math.pow(def, 0.25);
@ -541,7 +540,7 @@ Reviver.constructors.Gang = Gang;
/*** Gang Member object ***/ /*** Gang Member object ***/
function GangMember(name) { function GangMember(name) {
this.name = name; this.name = name;
this.task = GangMemberTasks["Unassigned"]; //GangMemberTask object this.task = "Unassigned"; //GangMemberTask object
this.earnedRespect = 0; this.earnedRespect = 0;
@ -592,32 +591,38 @@ GangMember.prototype.updateSkillLevels = function() {
} }
GangMember.prototype.calculatePower = function() { GangMember.prototype.calculatePower = function() {
return (this.hack + this.str + this.def + return (this.hack + this.str + this.def + this.dex + this.agi + this.cha) / 95;
this.dex + this.agi + this.cha) / 100;
} }
GangMember.prototype.assignToTask = function(taskName) { GangMember.prototype.assignToTask = function(taskName) {
if (GangMemberTasks.hasOwnProperty(taskName)) { if (GangMemberTasks.hasOwnProperty(taskName)) {
this.task = GangMemberTasks[taskName]; this.task = taskName;
return true; return true;
} else { } else {
this.task = GangMemberTasks["Unassigned"]; this.task = "Unassigned";
return false; return false;
} }
} }
GangMember.prototype.unassignFromTask = function() { GangMember.prototype.unassignFromTask = function() {
if (GangMemberTasks.hasOwnProperty("Unassigned")) { this.task = "Unassigned";
this.task = GangMemberTasks["Unassigned"]; }
} else {
console.log("ERROR: Can't find Unassigned Gang member task"); GangMember.prototype.getTask = function() {
this.task = null; // Backwards compatibility
if (this.task instanceof GangMemberTask) {
this.task = this.task.name;
} }
if (GangMemberTasks.hasOwnProperty(this.task)) {
return GangMemberTasks[this.task];
}
return GangMemberTasks["Unassigned"];
} }
//Gains are per cycle //Gains are per cycle
GangMember.prototype.calculateRespectGain = function(gang) { GangMember.prototype.calculateRespectGain = function(gang) {
var task = this.task; const task = this.getTask();
if (task == null || !(task instanceof GangMemberTask) || task.baseRespect === 0) {return 0;} if (task == null || !(task instanceof GangMemberTask) || task.baseRespect === 0) {return 0;}
var statWeight = (task.hackWeight/100) * this.hack + var statWeight = (task.hackWeight/100) * this.hack +
(task.strWeight/100) * this.str + (task.strWeight/100) * this.str +
@ -625,16 +630,16 @@ GangMember.prototype.calculateRespectGain = function(gang) {
(task.dexWeight/100) * this.dex + (task.dexWeight/100) * this.dex +
(task.agiWeight/100) * this.agi + (task.agiWeight/100) * this.agi +
(task.chaWeight/100) * this.cha; (task.chaWeight/100) * this.cha;
statWeight -= (3.5 * task.difficulty); statWeight -= (4 * task.difficulty);
if (statWeight <= 0) { return 0; } if (statWeight <= 0) { return 0; }
var territoryMult = AllGangs[gang.facName].territory; const territoryMult = Math.pow(AllGangs[gang.facName].territory * 100, task.territory.respect) / 100;
if (territoryMult <= 0) { return 0; } if (isNaN(territoryMult) || territoryMult <= 0) { return 0; }
var respectMult = gang.getWantedPenalty(); var respectMult = gang.getWantedPenalty();
return 12 * task.baseRespect * statWeight * territoryMult * respectMult; return 12 * task.baseRespect * statWeight * territoryMult * respectMult;
} }
GangMember.prototype.calculateWantedLevelGain = function(gang) { GangMember.prototype.calculateWantedLevelGain = function(gang) {
var task = this.task; const task = this.getTask();
if (task == null || !(task instanceof GangMemberTask) || task.baseWanted === 0) {return 0;} if (task == null || !(task instanceof GangMemberTask) || task.baseWanted === 0) {return 0;}
var statWeight = (task.hackWeight/100) * this.hack + var statWeight = (task.hackWeight/100) * this.hack +
(task.strWeight/100) * this.str + (task.strWeight/100) * this.str +
@ -643,9 +648,9 @@ GangMember.prototype.calculateWantedLevelGain = function(gang) {
(task.agiWeight/100) * this.agi + (task.agiWeight/100) * this.agi +
(task.chaWeight/100) * this.cha; (task.chaWeight/100) * this.cha;
statWeight -= (3.5 * task.difficulty); statWeight -= (3.5 * task.difficulty);
if (statWeight <= 0) {return 0;} if (statWeight <= 0) { return 0; }
var territoryMult = AllGangs[gang.facName].territory; const territoryMult = Math.pow(AllGangs[gang.facName].territory * 100, task.territory.wanted) / 100;
if (territoryMult <= 0) {return 0;} if (isNaN(territoryMult) || territoryMult <= 0) { return 0; }
if (task.baseWanted < 0) { if (task.baseWanted < 0) {
return task.baseWanted * statWeight * territoryMult; return task.baseWanted * statWeight * territoryMult;
} else { } else {
@ -654,7 +659,7 @@ GangMember.prototype.calculateWantedLevelGain = function(gang) {
} }
GangMember.prototype.calculateMoneyGain = function(gang) { GangMember.prototype.calculateMoneyGain = function(gang) {
var task = this.task; const task = this.getTask();
if (task == null || !(task instanceof GangMemberTask) || task.baseMoney === 0) {return 0;} if (task == null || !(task instanceof GangMemberTask) || task.baseMoney === 0) {return 0;}
var statWeight = (task.hackWeight/100) * this.hack + var statWeight = (task.hackWeight/100) * this.hack +
(task.strWeight/100) * this.str + (task.strWeight/100) * this.str +
@ -663,15 +668,15 @@ GangMember.prototype.calculateMoneyGain = function(gang) {
(task.agiWeight/100) * this.agi + (task.agiWeight/100) * this.agi +
(task.chaWeight/100) * this.cha; (task.chaWeight/100) * this.cha;
statWeight -= (3.5 * task.difficulty); statWeight -= (3.5 * task.difficulty);
if (statWeight <= 0) {return 0;} if (statWeight <= 0) { return 0; }
var territoryMult = AllGangs[gang.facName].territory; const territoryMult = Math.pow(AllGangs[gang.facName].territory * 100, task.territory.money) / 100;
if (territoryMult <= 0) {return 0;} if (isNaN(territoryMult) || territoryMult <= 0) { return 0; }
var respectMult = gang.getWantedPenalty(); var respectMult = gang.getWantedPenalty();
return 5 * task.baseMoney * statWeight * territoryMult * respectMult; return 5 * task.baseMoney * statWeight * territoryMult * respectMult;
} }
GangMember.prototype.gainExperience = function(numCycles=1) { GangMember.prototype.gainExperience = function(numCycles=1) {
var task = this.task; const task = this.getTask();
if (task == null || !(task instanceof GangMemberTask)) {return;} if (task == null || !(task instanceof GangMemberTask)) {return;}
this.hack_exp += (task.hackWeight / 1500) * task.difficulty * numCycles; this.hack_exp += (task.hackWeight / 1500) * task.difficulty * numCycles;
this.str_exp += (task.strWeight / 1500) * task.difficulty * numCycles; this.str_exp += (task.strWeight / 1500) * task.difficulty * numCycles;
@ -826,8 +831,18 @@ function GangMemberTask(name="", desc="", isHacking=false, isCombat=false,
this.agiWeight = params.agiWeight ? params.agiWeight : 0; this.agiWeight = params.agiWeight ? params.agiWeight : 0;
this.chaWeight = params.chaWeight ? params.chaWeight : 0; this.chaWeight = params.chaWeight ? params.chaWeight : 0;
if (Math.round(this.hackWeight + this.strWeight + this.defWeight + this.dexWeight + this.agiWeight + this.chaWeight) != 100) {
throw new Error(`GangMemberTask ${this.name} weights do not add up to 100`);
}
// 1 - 100 // 1 - 100
this.difficulty = params.difficulty ? params.difficulty : 1; this.difficulty = params.difficulty ? params.difficulty : 1;
// Territory Factors. Exponential factors that dictate how territory affects gains
// Formula: Territory Mutiplier = (Territory * 100) ^ factor / 100
// So factor should be > 1 if something should scale exponentially with territory
// and should be < 1 if it should have diminshing returns
this.territory = params.territory ? params.territory : {money: 1, respect: 1, wanted: 1};
} }
GangMemberTask.prototype.toJSON = function() { GangMemberTask.prototype.toJSON = function() {
@ -937,7 +952,7 @@ Gang.prototype.createGangMemberUpgradeBox = function(player, initialFilter="") {
var filter = UIElems.gangMemberUpgradeBoxFilter.value.toString(); var filter = UIElems.gangMemberUpgradeBoxFilter.value.toString();
for (var i = 0; i < this.members.length; ++i) { for (var i = 0; i < this.members.length; ++i) {
if (this.members[i].name.indexOf(filter) > -1 || this.members[i].task.name.indexOf(filter) > -1) { if (this.members[i].name.indexOf(filter) > -1 || this.members[i].task.indexOf(filter) > -1) {
var newPanel = this.members[i].createGangMemberUpgradePanel(this, player); var newPanel = this.members[i].createGangMemberUpgradePanel(this, player);
UIElems.gangMemberUpgradeBoxContent.appendChild(newPanel); UIElems.gangMemberUpgradeBoxContent.appendChild(newPanel);
UIElems.gangMemberUpgradeBoxElements.push(newPanel); UIElems.gangMemberUpgradeBoxElements.push(newPanel);
@ -965,7 +980,7 @@ Gang.prototype.createGangMemberUpgradeBox = function(player, initialFilter="") {
var filter = UIElems.gangMemberUpgradeBoxFilter.value.toString(); var filter = UIElems.gangMemberUpgradeBoxFilter.value.toString();
for (var i = 0; i < this.members.length; ++i) { for (var i = 0; i < this.members.length; ++i) {
if (this.members[i].name.indexOf(filter) > -1 || this.members[i].task.name.indexOf(filter) > -1) { if (this.members[i].name.indexOf(filter) > -1 || this.members[i].task.indexOf(filter) > -1) {
UIElems.gangMemberUpgradeBoxElements.push(this.members[i].createGangMemberUpgradePanel(this, player)); UIElems.gangMemberUpgradeBoxElements.push(this.members[i].createGangMemberUpgradePanel(this, player));
} }
} }
@ -983,7 +998,7 @@ GangMember.prototype.createGangMemberUpgradePanel = function(gangObj, player) {
}); });
var header = createElement("h1", { var header = createElement("h1", {
innerText: this.name + " (" + this.task.name + ")" innerText: this.name + " (" + this.task + ")"
}); });
container.appendChild(header); container.appendChild(header);
@ -1472,7 +1487,7 @@ Gang.prototype.displayGangMemberList = function() {
const members = this.members; const members = this.members;
const filter = UIElems.gangMemberFilter.value.toString(); const filter = UIElems.gangMemberFilter.value.toString();
for (var i = 0; i < members.length; ++i) { for (var i = 0; i < members.length; ++i) {
if (members[i].name.indexOf(filter) > -1 || members[i].task.name.indexOf(filter) > -1) { if (members[i].name.indexOf(filter) > -1 || members[i].task.indexOf(filter) > -1) {
this.createGangMemberDisplayElement(members[i]); this.createGangMemberDisplayElement(members[i]);
} }
} }
@ -1744,8 +1759,8 @@ Gang.prototype.createGangMemberDisplayElement = function(memberObj) {
}); });
// Set initial task in selector // Set initial task in selector
if (memberObj.task instanceof GangMemberTask) { if (GangMemberTasks.hasOwnProperty(memberObj.task)) {
var taskName = memberObj.task.name; var taskName = memberObj.task;
var taskIndex = 0; var taskIndex = 0;
for (let i = 0; i < tasks.length; ++i) { for (let i = 0; i < tasks.length; ++i) {
if (taskName === tasks[i]) { if (taskName === tasks[i]) {

@ -27,9 +27,9 @@ function initSourceFiles() {
"Level 3: 28%"); "Level 3: 28%");
SourceFiles["SourceFile2"] = new SourceFile(2, "This Source-File increases the player's crime success rate, crime money, and charisma " + SourceFiles["SourceFile2"] = new SourceFile(2, "This Source-File increases the player's crime success rate, crime money, and charisma " +
"multipliers by:<br><br>" + "multipliers by:<br><br>" +
"Level 1: 20%<br>" + "Level 1: 24%<br>" +
"Level 2: 30%<br>" + "Level 2: 36%<br>" +
"Level 3: 35%"); "Level 3: 42%");
SourceFiles["SourceFile3"] = new SourceFile(3,"This Source-File lets you create corporations on other BitNodes (although " + SourceFiles["SourceFile3"] = new SourceFile(3,"This Source-File lets you create corporations on other BitNodes (although " +
"some BitNodes will disable this mechanic). This Source-File also increases your charisma and company salary multipliers by:<br>" + "some BitNodes will disable this mechanic). This Source-File also increases your charisma and company salary multipliers by:<br>" +
"Level 1: 8%<br>" + "Level 1: 8%<br>" +
@ -126,7 +126,7 @@ function applySourceFile(srcFile) {
case 2: //Rise of the Underworld case 2: //Rise of the Underworld
var mult = 0; var mult = 0;
for (var i = 0; i < srcFile.lvl; ++i) { for (var i = 0; i < srcFile.lvl; ++i) {
mult += (20 / (Math.pow(2, i))); mult += (24 / (Math.pow(2, i)));
} }
var incMult = 1 + (mult / 100); var incMult = 1 + (mult / 100);
Player.crime_money_mult *= incMult; Player.crime_money_mult *= incMult;

@ -42,6 +42,7 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
isCombat: true, isCombat: true,
isHacking: true, isHacking: true,
name: "Unassigned", name: "Unassigned",
params: {hackWeight: 100}, // This is just to get by the weight check in the GangMemberTask constructor
}, },
{ {
desc: "Assign this gang member to create and distribute ransomware<br><br>Earns money - Slightly increases respect - Slightly increases wanted level", desc: "Assign this gang member to create and distribute ransomware<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
@ -55,49 +56,49 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "Phishing", name: "Phishing",
params: {baseRespect: 0.00008, baseWanted: 0.001, baseMoney: 2.5, hackWeight: 85, chaWeight: 15, difficulty: 3}, params: {baseRespect: 0.00008, baseWanted: 0.001, baseMoney: 2.5, hackWeight: 85, chaWeight: 15, difficulty: 3.5},
}, },
{ {
desc: "Assign this gang member to attempt identity theft<br><br>Earns money - Increases respect - Increases wanted level", desc: "Assign this gang member to attempt identity theft<br><br>Earns money - Increases respect - Increases wanted level",
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "Identity Theft", name: "Identity Theft",
params: {baseRespect: 0.0001, baseWanted: 0.01, baseMoney: 6, hackWeight: 80, chaWeight: 20, difficulty: 4}, params: {baseRespect: 0.0001, baseWanted: 0.01, baseMoney: 6, hackWeight: 80, chaWeight: 20, difficulty: 5},
}, },
{ {
desc: "Assign this gang member to carry out DDoS attacks<br><br>Increases respect - Increases wanted level", desc: "Assign this gang member to carry out DDoS attacks<br><br>Increases respect - Increases wanted level",
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "DDoS Attacks", name: "DDoS Attacks",
params: {baseRespect: 0.0004, baseWanted: 0.05, hackWeight: 100, difficulty: 7}, params: {baseRespect: 0.0004, baseWanted: 0.05, hackWeight: 100, difficulty: 8},
}, },
{ {
desc: "Assign this gang member to create and distribute malicious viruses<br><br>Increases respect - Increases wanted level", desc: "Assign this gang member to create and distribute malicious viruses<br><br>Increases respect - Increases wanted level",
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "Plant Virus", name: "Plant Virus",
params: {baseRespect: 0.0006, baseWanted: 0.05, hackWeight: 100, difficulty: 10}, params: {baseRespect: 0.0006, baseWanted: 0.05, hackWeight: 100, difficulty: 12},
}, },
{ {
desc: "Assign this gang member to commit financial fraud and digital counterfeiting<br><br>Earns money - Slightly increases respect - Slightly increases wanted level", desc: "Assign this gang member to commit financial fraud and digital counterfeiting<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "Fraud & Counterfeiting", name: "Fraud & Counterfeiting",
params: {baseRespect: 0.0005, baseWanted: 0.1, baseMoney: 15, hackWeight: 80, chaWeight: 20, difficulty: 17}, params: {baseRespect: 0.0005, baseWanted: 0.1, baseMoney: 15, hackWeight: 80, chaWeight: 20, difficulty: 20},
}, },
{ {
desc: "Assign this gang member to launder money<br><br>Earns money - Increases respect - Increases wanted level", desc: "Assign this gang member to launder money<br><br>Earns money - Increases respect - Increases wanted level",
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "Money Laundering", name: "Money Laundering",
params: {baseRespect: 0.0006, baseWanted: 0.2, baseMoney: 40, hackWeight: 75, chaWeight: 25, difficulty: 20}, params: {baseRespect: 0.0006, baseWanted: 0.2, baseMoney: 40, hackWeight: 75, chaWeight: 25, difficulty: 25},
}, },
{ {
desc: "Assign this gang member to commit acts of cyberterrorism<br><br>Greatly increases respect - Greatly increases wanted level", desc: "Assign this gang member to commit acts of cyberterrorism<br><br>Greatly increases respect - Greatly increases wanted level",
isCombat: false, isCombat: false,
isHacking: true, isHacking: true,
name: "Cyberterrorism", name: "Cyberterrorism",
params: {baseRespect: 0.001, baseWanted: 0.5, hackWeight: 80, chaWeight: 20, difficulty: 33}, params: {baseRespect: 0.001, baseWanted: 0.5, hackWeight: 80, chaWeight: 20, difficulty: 36},
}, },
{ {
desc: "Assign this gang member to be an ethical hacker for corporations<br><br>Earns money - Lowers wanted level", desc: "Assign this gang member to be an ethical hacker for corporations<br><br>Earns money - Lowers wanted level",
@ -111,63 +112,150 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Mug People", name: "Mug People",
params: {baseRespect: 0.00005, baseWanted: 0.00001, baseMoney: 1, strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 10, chaWeight: 15, difficulty: 1}, params: {
baseRespect: 0.00005, baseWanted: 0.00001, baseMoney: 1.2,
strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 10, chaWeight: 15,
difficulty: 1,
},
}, },
{ {
desc: "Assign this gang member to sell drugs.<br><br>Earns money - Slightly increases respect - Slightly increases wanted level", desc: "Assign this gang member to sell drugs<br><br>Earns money - Slightly increases respect - Slightly increases wanted level - Scales slightly with territory",
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Deal Drugs", name: "Deal Drugs",
params: {baseRespect: 0.00008, baseWanted: 0.001, baseMoney: 4, agiWeight: 20, dexWeight: 20, chaWeight: 60, difficulty: 3}, params: {
baseRespect: 0.00008, baseWanted: 0.001, baseMoney: 5,
agiWeight: 20, dexWeight: 20, chaWeight: 60,
difficulty: 3.5,
territory: {
money: 1.1,
respect: 1,
wanted: 1.15,
},
},
},
{
desc: "Assign this gang member to extort civilians in your territory<br><br>Earns money - Slightly increases respect - Increases wanted - Scales heavily with territory",
isCombat: true,
isHacking: false,
name: "Strongarm Civilians",
params: {
baseRespect: 0.00004, baseWanted: 0.0001, baseMoney: 2.5,
hackWeight: 10, strWeight: 25, defWeight: 25, dexWeight: 20, agiWeight: 10, chaWeight: 10,
difficulty: 5,
territory: {
money: 2,
respect: 1.1,
wanted: 1.5
}
}
}, },
{ {
desc: "Assign this gang member to run cons<br><br>Earns money - Increases respect - Increases wanted level", desc: "Assign this gang member to run cons<br><br>Earns money - Increases respect - Increases wanted level",
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Run a Con", name: "Run a Con",
params: {baseRespect: 0.00015, baseWanted: 0.01, baseMoney: 10, strWeight: 5, defWeight: 5, agiWeight: 25, dexWeight: 25, chaWeight: 40, difficulty: 10}, params: {
baseRespect: 0.00015, baseWanted: 0.01, baseMoney: 12.5,
strWeight: 5, defWeight: 5, agiWeight: 25, dexWeight: 25, chaWeight: 40,
difficulty: 14,
},
}, },
{ {
desc: "Assign this gang member to commit armed robbery on stores, banks and armored cars<br><br>Earns money - Increases respect - Increases wanted level", desc: "Assign this gang member to commit armed robbery on stores, banks and armored cars<br><br>Earns money - Increases respect - Increases wanted level",
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Armed Robbery", name: "Armed Robbery",
params: {baseRespect: 0.00015, baseWanted: 0.05, baseMoney: 25, hackWeight: 20, strWeight: 15, defWeight: 15, agiWeight: 10, dexWeight: 20, chaWeight: 20, difficulty: 17}, params: {
baseRespect: 0.00015, baseWanted: 0.05, baseMoney: 32,
hackWeight: 20, strWeight: 15, defWeight: 15, agiWeight: 10, dexWeight: 20, chaWeight: 20,
difficulty: 20,
},
}, },
{ {
desc: "Assign this gang member to traffick illegal arms<br><br>Earns money - Increases respect - Increases wanted level", desc: "Assign this gang member to traffick illegal arms<br><br>Earns money - Increases respect - Increases wanted level - Scales heavily with territory",
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Traffick Illegal Arms", name: "Traffick Illegal Arms",
params: {baseRespect: 0.0003, baseWanted: 0.1, baseMoney: 40, hackWeight: 15, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 75, difficulty: 25}, params: {
baseRespect: 0.0003, baseWanted: 0.1, baseMoney: 50,
hackWeight: 15, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 25,
difficulty: 28,
territory: {
money: 1.2,
respect: 1.3,
wanted: 1.25,
},
},
}, },
{ {
desc: "Assign this gang member to threaten and black mail high-profile targets<br><br>Earns money - Slightly increases respect - Slightly increases wanted level", desc: "Assign this gang member to threaten and black mail high-profile targets<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Threaten & Blackmail", name: "Threaten & Blackmail",
params: {baseRespect: 0.0002, baseWanted: 0.05, baseMoney: 15, hackWeight: 25, strWeight: 25, dexWeight: 25, chaWeight: 25, difficulty: 28}, params: {
baseRespect: 0.0002, baseWanted: 0.05, baseMoney: 20,
hackWeight: 25, strWeight: 25, dexWeight: 25, chaWeight: 25,
difficulty: 28,
},
}, },
{ {
desc: "Assign this gang member to commit acts of terrorism<br><br>Greatly increases respect - Greatly increases wanted level", desc: "Assign this gang member to engage in human trafficking operations<br><br>Earns money - Increases respect - Increases wanted level - Scales heavily with territory",
isCombat: true,
isHacking: false,
name: "Human Trafficking",
params: {
baseRespect: 0.005, baseWanted: 0.2, baseMoney: 100,
hackWeight: 30, strWeight: 5, defWeight: 5, dexWeight: 30, chaWeight: 30,
difficulty: 36,
territory: {
money: 1.5,
respect: 1.5,
wanted: 1.6,
}
}
},
{
desc: "Assign this gang member to commit acts of terrorism<br><br>Greatly increases respect - Greatly increases wanted level - Scales heavily with territory",
isCombat: true, isCombat: true,
isHacking: false, isHacking: false,
name: "Terrorism", name: "Terrorism",
params: {baseRespect: 0.001, baseWanted: 1, hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 20, difficulty: 33}, params: {
baseRespect: 0.001, baseWanted: 1,
hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 20,
difficulty: 36,
territory: {
money: 1,
respect: 2,
wanted: 2,
},
},
}, },
{ {
desc: "Assign this gang member to be a vigilante and protect the city from criminals<br><br>Decreases wanted level", desc: "Assign this gang member to be a vigilante and protect the city from criminals<br><br>Decreases wanted level",
isCombat: true, isCombat: true,
isHacking: true, isHacking: true,
name: "Vigilante Justice", name: "Vigilante Justice",
params: {baseWanted: -0.001, hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, agiWeight: 20, difficulty: 1}, params: {
baseWanted: -0.001,
hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, agiWeight: 20,
difficulty: 1,
territory: {
money: 1,
respect: 1,
wanted: 0.9, // Gets harder with more territory
},
},
}, },
{ {
desc: "Assign this gang member to increase their combat stats (str, def, dex, agi)", desc: "Assign this gang member to increase their combat stats (str, def, dex, agi)",
isCombat: true, isCombat: true,
isHacking: true, isHacking: true,
name: "Train Combat", name: "Train Combat",
params: {strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 25, difficulty: 5}, params: {
strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 25,
difficulty: 5
},
}, },
{ {
desc: "Assign this gang member to train their hacking skills", desc: "Assign this gang member to train their hacking skills",
@ -181,6 +269,9 @@ export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
isCombat: true, isCombat: true,
isHacking: true, isHacking: true,
name: "Territory Warfare", name: "Territory Warfare",
params: {hackWeight: 15, strWeight: 20, defWeight: 20, dexWeight: 20, agiWeight: 20, chaWeight: 5, difficulty: 3}, params: {
hackWeight: 15, strWeight: 20, defWeight: 20, dexWeight: 20, agiWeight: 20, chaWeight: 5,
difficulty: 3
},
}, },
]; ];