mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-16 06:18:42 +02:00
CODEBASE: Refactor Stanek's Gift UI code and change internal FragmentType enum (#2346)
This commit is contained in:
29
markdown/bitburner.fragmentenumtype.md
Normal file
29
markdown/bitburner.fragmentenumtype.md
Normal file
@@ -0,0 +1,29 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [FragmentEnumType](./bitburner.fragmentenumtype.md)
|
||||
|
||||
## FragmentEnumType type
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type FragmentEnumType = {
|
||||
HackingSpeed: 3;
|
||||
HackingMoney: 4;
|
||||
HackingGrow: 5;
|
||||
Hacking: 6;
|
||||
Strength: 7;
|
||||
Defense: 8;
|
||||
Dexterity: 9;
|
||||
Agility: 10;
|
||||
Charisma: 11;
|
||||
HacknetMoney: 12;
|
||||
HacknetCost: 13;
|
||||
Rep: 14;
|
||||
WorkMoney: 15;
|
||||
Crime: 16;
|
||||
Bladeburner: 17;
|
||||
Booster: 18;
|
||||
};
|
||||
```
|
||||
14
markdown/bitburner.fragmenttype.md
Normal file
14
markdown/bitburner.fragmenttype.md
Normal file
@@ -0,0 +1,14 @@
|
||||
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||
|
||||
[Home](./index.md) > [bitburner](./bitburner.md) > [FragmentType](./bitburner.fragmenttype.md)
|
||||
|
||||
## FragmentType type
|
||||
|
||||
|
||||
**Signature:**
|
||||
|
||||
```typescript
|
||||
type FragmentType = _ValueOf<FragmentEnumType>;
|
||||
```
|
||||
**References:** [\_ValueOf](./bitburner._valueof.md)<!-- -->, [FragmentEnumType](./bitburner.fragmentenumtype.md)
|
||||
|
||||
@@ -1802,6 +1802,26 @@ Warning: Spoiler ahead. This enum contains names of \*\*all\*\* factions. If you
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[FragmentEnumType](./bitburner.fragmentenumtype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
[FragmentType](./bitburner.fragmenttype.md)
|
||||
|
||||
|
||||
</td><td>
|
||||
|
||||
|
||||
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { FragmentType, Effect } from "./FragmentType";
|
||||
import type { FragmentType } from "@nsdefs";
|
||||
import { FragmentTypeEnum, Effect } from "./FragmentType";
|
||||
import { Shapes } from "./data/Shapes";
|
||||
|
||||
export const Fragments: Fragment[] = [];
|
||||
@@ -96,10 +97,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
new Fragment(
|
||||
0, // id
|
||||
Shapes.S,
|
||||
FragmentType.Hacking, // type
|
||||
FragmentTypeEnum.Hacking,
|
||||
1,
|
||||
1, // limit
|
||||
Effect(FragmentType.Hacking),
|
||||
Effect(FragmentTypeEnum.Hacking),
|
||||
//Effect(FragmentType.Hacking],
|
||||
),
|
||||
);
|
||||
@@ -107,20 +108,20 @@ export function FragmentById(id: number): Fragment | null {
|
||||
new Fragment(
|
||||
1, // id
|
||||
Shapes.Z,
|
||||
FragmentType.Hacking, // type
|
||||
FragmentTypeEnum.Hacking,
|
||||
1,
|
||||
1, // limit
|
||||
Effect(FragmentType.Hacking),
|
||||
Effect(FragmentTypeEnum.Hacking),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
5, // id
|
||||
Shapes.T,
|
||||
FragmentType.HackingSpeed, // type
|
||||
FragmentTypeEnum.HackingSpeed,
|
||||
1.3,
|
||||
1, // limit
|
||||
Effect(FragmentType.HackingSpeed),
|
||||
Effect(FragmentTypeEnum.HackingSpeed),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -128,130 +129,130 @@ export function FragmentById(id: number): Fragment | null {
|
||||
new Fragment(
|
||||
6, // id
|
||||
Shapes.I,
|
||||
FragmentType.HackingMoney, // type
|
||||
FragmentTypeEnum.HackingMoney,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.HackingMoney),
|
||||
Effect(FragmentTypeEnum.HackingMoney),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
7, // id
|
||||
Shapes.J,
|
||||
FragmentType.HackingGrow, // type
|
||||
FragmentTypeEnum.HackingGrow,
|
||||
0.5, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.HackingGrow),
|
||||
Effect(FragmentTypeEnum.HackingGrow),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
10, // id
|
||||
Shapes.T,
|
||||
FragmentType.Strength, // type
|
||||
FragmentTypeEnum.Strength,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Strength),
|
||||
Effect(FragmentTypeEnum.Strength),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
12, // id
|
||||
Shapes.L,
|
||||
FragmentType.Defense, // type
|
||||
FragmentTypeEnum.Defense,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Defense),
|
||||
Effect(FragmentTypeEnum.Defense),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
14, // id
|
||||
Shapes.L,
|
||||
FragmentType.Dexterity, // type
|
||||
FragmentTypeEnum.Dexterity,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Dexterity),
|
||||
Effect(FragmentTypeEnum.Dexterity),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
16, // id
|
||||
Shapes.S,
|
||||
FragmentType.Agility, // type
|
||||
FragmentTypeEnum.Agility,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Agility),
|
||||
Effect(FragmentTypeEnum.Agility),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
18, // id
|
||||
Shapes.S,
|
||||
FragmentType.Charisma, // type
|
||||
FragmentTypeEnum.Charisma,
|
||||
3, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Charisma),
|
||||
Effect(FragmentTypeEnum.Charisma),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
20, // id
|
||||
Shapes.I,
|
||||
FragmentType.HacknetMoney, // type
|
||||
FragmentTypeEnum.HacknetMoney,
|
||||
1, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.HacknetMoney),
|
||||
Effect(FragmentTypeEnum.HacknetMoney),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
21, // id
|
||||
Shapes.O,
|
||||
FragmentType.HacknetCost, // type
|
||||
FragmentTypeEnum.HacknetCost,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.HacknetCost),
|
||||
Effect(FragmentTypeEnum.HacknetCost),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
25, // id
|
||||
Shapes.J,
|
||||
FragmentType.Rep, // type
|
||||
FragmentTypeEnum.Rep,
|
||||
0.5, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Rep),
|
||||
Effect(FragmentTypeEnum.Rep),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
27, // id
|
||||
Shapes.J,
|
||||
FragmentType.WorkMoney, // type
|
||||
FragmentTypeEnum.WorkMoney,
|
||||
10, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.WorkMoney),
|
||||
Effect(FragmentTypeEnum.WorkMoney),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
28, // id
|
||||
Shapes.L,
|
||||
FragmentType.Crime, // type
|
||||
FragmentTypeEnum.Crime,
|
||||
2, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Crime),
|
||||
Effect(FragmentTypeEnum.Crime),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
new Fragment(
|
||||
30, // id
|
||||
Shapes.S,
|
||||
FragmentType.Bladeburner, // type
|
||||
FragmentTypeEnum.Bladeburner,
|
||||
0.4, // power
|
||||
1, // limit
|
||||
Effect(FragmentType.Bladeburner),
|
||||
Effect(FragmentTypeEnum.Bladeburner),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -263,10 +264,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[X, X, _],
|
||||
[_, X, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -277,10 +278,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[X, X, X, X],
|
||||
[X, _, _, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -291,10 +292,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[_, X, X, X],
|
||||
[X, X, _, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -305,10 +306,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[X, X, X, _],
|
||||
[_, _, X, X],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -320,10 +321,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[_, X, _],
|
||||
[X, X, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -335,10 +336,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[_, X, X],
|
||||
[X, X, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -350,10 +351,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[X, X, X],
|
||||
[X, _, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
Fragments.push(
|
||||
@@ -365,13 +366,10 @@ export function FragmentById(id: number): Fragment | null {
|
||||
[X, X, X],
|
||||
[_, X, _],
|
||||
],
|
||||
FragmentType.Booster, // type
|
||||
FragmentTypeEnum.Booster,
|
||||
1.1, // power
|
||||
99, // limit
|
||||
Effect(FragmentType.Booster),
|
||||
Effect(FragmentTypeEnum.Booster),
|
||||
),
|
||||
);
|
||||
})();
|
||||
|
||||
export const NoneFragment = new Fragment(-2, [], FragmentType.None, 0, Infinity, "");
|
||||
export const DeleteFragment = new Fragment(-2, [], FragmentType.Delete, 0, Infinity, "");
|
||||
|
||||
@@ -1,84 +1,75 @@
|
||||
import type { FragmentType } from "@nsdefs";
|
||||
|
||||
// Numeric enum
|
||||
export enum FragmentType {
|
||||
// Special fragments for the UI
|
||||
None,
|
||||
Delete,
|
||||
export const FragmentTypeEnum = {
|
||||
HackingSpeed: 3,
|
||||
HackingMoney: 4,
|
||||
HackingGrow: 5,
|
||||
Hacking: 6,
|
||||
Strength: 7,
|
||||
Defense: 8,
|
||||
Dexterity: 9,
|
||||
Agility: 10,
|
||||
Charisma: 11,
|
||||
HacknetMoney: 12,
|
||||
HacknetCost: 13,
|
||||
Rep: 14,
|
||||
WorkMoney: 15,
|
||||
Crime: 16,
|
||||
Bladeburner: 17,
|
||||
// Utility fragments.
|
||||
Booster: 18,
|
||||
} as const;
|
||||
|
||||
// Stats boosting fragments
|
||||
HackingChance,
|
||||
HackingSpeed,
|
||||
HackingMoney,
|
||||
HackingGrow,
|
||||
Hacking,
|
||||
Strength,
|
||||
Defense,
|
||||
Dexterity,
|
||||
Agility,
|
||||
Charisma,
|
||||
HacknetMoney,
|
||||
HacknetCost,
|
||||
Rep,
|
||||
WorkMoney,
|
||||
Crime,
|
||||
Bladeburner,
|
||||
|
||||
// utility fragments.
|
||||
Booster,
|
||||
}
|
||||
|
||||
export function Effect(tpe: FragmentType): string {
|
||||
switch (tpe) {
|
||||
case FragmentType.HackingChance: {
|
||||
return "+x% hack() success chance";
|
||||
}
|
||||
case FragmentType.HackingSpeed: {
|
||||
export function Effect(type: FragmentType): string {
|
||||
switch (type) {
|
||||
case FragmentTypeEnum.HackingSpeed: {
|
||||
return "+x% faster hack(), grow(), and weaken()";
|
||||
}
|
||||
case FragmentType.HackingMoney: {
|
||||
case FragmentTypeEnum.HackingMoney: {
|
||||
return "+x% hack() power";
|
||||
}
|
||||
case FragmentType.HackingGrow: {
|
||||
case FragmentTypeEnum.HackingGrow: {
|
||||
return "+x% grow() power";
|
||||
}
|
||||
case FragmentType.Hacking: {
|
||||
case FragmentTypeEnum.Hacking: {
|
||||
return "+x% hacking experience and skill level";
|
||||
}
|
||||
case FragmentType.Strength: {
|
||||
case FragmentTypeEnum.Strength: {
|
||||
return "+x% strength experience and skill level";
|
||||
}
|
||||
case FragmentType.Defense: {
|
||||
case FragmentTypeEnum.Defense: {
|
||||
return "+x% defense experience and skill level";
|
||||
}
|
||||
case FragmentType.Dexterity: {
|
||||
case FragmentTypeEnum.Dexterity: {
|
||||
return "+x% dexterity experience and skill level";
|
||||
}
|
||||
case FragmentType.Agility: {
|
||||
case FragmentTypeEnum.Agility: {
|
||||
return "+x% agility experience and skill level";
|
||||
}
|
||||
case FragmentType.Charisma: {
|
||||
case FragmentTypeEnum.Charisma: {
|
||||
return "+x% charisma experience and skill level";
|
||||
}
|
||||
case FragmentType.HacknetMoney: {
|
||||
case FragmentTypeEnum.HacknetMoney: {
|
||||
return "+x% hacknet production";
|
||||
}
|
||||
case FragmentType.HacknetCost: {
|
||||
case FragmentTypeEnum.HacknetCost: {
|
||||
return "-x% cheaper hacknet costs";
|
||||
}
|
||||
case FragmentType.Rep: {
|
||||
case FragmentTypeEnum.Rep: {
|
||||
return "+x% reputation from factions and companies";
|
||||
}
|
||||
case FragmentType.WorkMoney: {
|
||||
case FragmentTypeEnum.WorkMoney: {
|
||||
return "+x% work money";
|
||||
}
|
||||
case FragmentType.Crime: {
|
||||
case FragmentTypeEnum.Crime: {
|
||||
return "+x% crime money and success chance";
|
||||
}
|
||||
case FragmentType.Bladeburner: {
|
||||
case FragmentTypeEnum.Bladeburner: {
|
||||
return "+x% bladeburner stats (max stamina, stamina gain, Field Analysis effectiveness, action success chance)";
|
||||
}
|
||||
case FragmentType.Booster: {
|
||||
case FragmentTypeEnum.Booster: {
|
||||
return "1.1x adjacent fragment power";
|
||||
}
|
||||
}
|
||||
throw new Error("Calling effect for fragment type that doesn't have an effect " + tpe);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Player } from "@player";
|
||||
import { AugmentationName, FactionName } from "@enums";
|
||||
import { Fragment } from "./Fragment";
|
||||
import { ActiveFragment } from "./ActiveFragment";
|
||||
import { FragmentType } from "./FragmentType";
|
||||
import { FragmentTypeEnum } from "./FragmentType";
|
||||
import { BaseGift } from "./BaseGift";
|
||||
import { Factions } from "../Faction/Factions";
|
||||
import { CalculateEffect } from "./formulas/effect";
|
||||
@@ -70,7 +70,7 @@ export class StaneksGift extends BaseGift {
|
||||
// Filter out undefined with typescript "Type guard". Whatever
|
||||
let neighbors = maybeFragments.filter((v: ActiveFragment | undefined): v is ActiveFragment => !!v);
|
||||
|
||||
neighbors = neighbors.filter((fragment) => fragment.fragment().type === FragmentType.Booster);
|
||||
neighbors = neighbors.filter((fragment) => fragment.fragment().type === FragmentTypeEnum.Booster);
|
||||
let boost = 1;
|
||||
|
||||
neighbors = neighbors.filter((v, i, s) => s.indexOf(v) === i);
|
||||
@@ -139,63 +139,60 @@ export class StaneksGift extends BaseGift {
|
||||
|
||||
const power = this.effect(aFrag);
|
||||
switch (fragment.type) {
|
||||
case FragmentType.HackingChance:
|
||||
mults.hacking_chance *= power;
|
||||
break;
|
||||
case FragmentType.HackingSpeed:
|
||||
case FragmentTypeEnum.HackingSpeed:
|
||||
mults.hacking_speed *= power;
|
||||
break;
|
||||
case FragmentType.HackingMoney:
|
||||
case FragmentTypeEnum.HackingMoney:
|
||||
mults.hacking_money *= power;
|
||||
break;
|
||||
case FragmentType.HackingGrow:
|
||||
case FragmentTypeEnum.HackingGrow:
|
||||
mults.hacking_grow *= power;
|
||||
break;
|
||||
case FragmentType.Hacking:
|
||||
case FragmentTypeEnum.Hacking:
|
||||
mults.hacking *= power;
|
||||
mults.hacking_exp *= power;
|
||||
break;
|
||||
case FragmentType.Strength:
|
||||
case FragmentTypeEnum.Strength:
|
||||
mults.strength *= power;
|
||||
mults.strength_exp *= power;
|
||||
break;
|
||||
case FragmentType.Defense:
|
||||
case FragmentTypeEnum.Defense:
|
||||
mults.defense *= power;
|
||||
mults.defense_exp *= power;
|
||||
break;
|
||||
case FragmentType.Dexterity:
|
||||
case FragmentTypeEnum.Dexterity:
|
||||
mults.dexterity *= power;
|
||||
mults.dexterity_exp *= power;
|
||||
break;
|
||||
case FragmentType.Agility:
|
||||
case FragmentTypeEnum.Agility:
|
||||
mults.agility *= power;
|
||||
mults.agility_exp *= power;
|
||||
break;
|
||||
case FragmentType.Charisma:
|
||||
case FragmentTypeEnum.Charisma:
|
||||
mults.charisma *= power;
|
||||
mults.charisma_exp *= power;
|
||||
break;
|
||||
case FragmentType.HacknetMoney:
|
||||
case FragmentTypeEnum.HacknetMoney:
|
||||
mults.hacknet_node_money *= power;
|
||||
break;
|
||||
case FragmentType.HacknetCost:
|
||||
case FragmentTypeEnum.HacknetCost:
|
||||
mults.hacknet_node_purchase_cost /= power;
|
||||
mults.hacknet_node_ram_cost /= power;
|
||||
mults.hacknet_node_core_cost /= power;
|
||||
mults.hacknet_node_level_cost /= power;
|
||||
break;
|
||||
case FragmentType.Rep:
|
||||
case FragmentTypeEnum.Rep:
|
||||
mults.company_rep *= power;
|
||||
mults.faction_rep *= power;
|
||||
break;
|
||||
case FragmentType.WorkMoney:
|
||||
case FragmentTypeEnum.WorkMoney:
|
||||
mults.work_money *= power;
|
||||
break;
|
||||
case FragmentType.Crime:
|
||||
case FragmentTypeEnum.Crime:
|
||||
mults.crime_success *= power;
|
||||
mults.crime_money *= power;
|
||||
break;
|
||||
case FragmentType.Bladeburner:
|
||||
case FragmentTypeEnum.Bladeburner:
|
||||
mults.bladeburner_max_stamina *= power;
|
||||
mults.bladeburner_stamina_gain *= power;
|
||||
mults.bladeburner_analysis *= power;
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import React from "react";
|
||||
import { ActiveFragment } from "../ActiveFragment";
|
||||
import { StaneksGift } from "../StaneksGift";
|
||||
import { FragmentType, Effect } from "../FragmentType";
|
||||
import { FragmentTypeEnum, Effect } from "../FragmentType";
|
||||
import { formatPercent } from "../../ui/formatNumber";
|
||||
|
||||
import Paper from "@mui/material/Paper";
|
||||
import Typography from "@mui/material/Typography";
|
||||
import Table from "@mui/material/Table";
|
||||
import { TableBody, TableCell, TableRow } from "@mui/material";
|
||||
import type { FragmentType } from "@nsdefs";
|
||||
|
||||
interface IProps {
|
||||
gift: StaneksGift;
|
||||
@@ -29,24 +30,25 @@ export function ActiveFragmentSummary(props: IProps): React.ReactElement {
|
||||
// Iterate through Active Fragment
|
||||
props.gift.fragments.forEach((fragment: ActiveFragment) => {
|
||||
const f = fragment.fragment();
|
||||
// Discard ToolBrush and Booster.
|
||||
if (![FragmentType.Booster, FragmentType.None, FragmentType.Delete].includes(f.type)) {
|
||||
// Check for an existing entry in summary for this fragment's type
|
||||
const entry = summary.find((e) => {
|
||||
return e.type === f.type;
|
||||
// Discard Booster.
|
||||
if (f.type === FragmentTypeEnum.Booster) {
|
||||
return;
|
||||
}
|
||||
// Check for an existing entry in summary for this fragment's type
|
||||
const entry = summary.find((e) => {
|
||||
return e.type === f.type;
|
||||
});
|
||||
if (entry) {
|
||||
// If there's one, update the existing entry
|
||||
entry.effect *= props.gift.effect(fragment);
|
||||
entry.coordinate.push({ x: fragment.x, y: fragment.y });
|
||||
} else {
|
||||
// If there's none, create a new entry
|
||||
summary.push({
|
||||
coordinate: [{ x: fragment.x, y: fragment.y }],
|
||||
effect: props.gift.effect(fragment),
|
||||
type: f.type,
|
||||
});
|
||||
if (entry) {
|
||||
// If there's one, update the existing entry
|
||||
entry.effect *= props.gift.effect(fragment);
|
||||
entry.coordinate.push({ x: fragment.x, y: fragment.y });
|
||||
} else {
|
||||
// If there's none, create a new entry
|
||||
summary.push({
|
||||
coordinate: [{ x: fragment.x, y: fragment.y }],
|
||||
effect: props.gift.effect(fragment),
|
||||
type: f.type,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React, { useState, useEffect } from "react";
|
||||
import { ActiveFragment } from "../ActiveFragment";
|
||||
import { StaneksGift } from "../StaneksGift";
|
||||
import { FragmentType, Effect } from "../FragmentType";
|
||||
import { FragmentTypeEnum, Effect } from "../FragmentType";
|
||||
import { formatPercent, formatStaneksGiftCharge, formatStaneksGiftPower } from "../../ui/formatNumber";
|
||||
|
||||
import Paper from "@mui/material/Paper";
|
||||
@@ -48,8 +48,8 @@ export function FragmentInspector(props: IProps): React.ReactElement {
|
||||
|
||||
let charge = formatStaneksGiftCharge(props.fragment.highestCharge * props.fragment.numCharge);
|
||||
let effect = "N/A";
|
||||
// Boosters and cooling don't deal with heat.
|
||||
if ([FragmentType.Booster, FragmentType.None, FragmentType.Delete].includes(f.type)) {
|
||||
// Boosters cannot be charged.
|
||||
if (f.type === FragmentTypeEnum.Booster) {
|
||||
charge = "N/A";
|
||||
effect = `${f.power}x adjacent fragment power`;
|
||||
} else if (Effect(f.type).includes("+x%")) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React, { useState } from "react";
|
||||
import { Fragments, Fragment, NoneFragment, DeleteFragment } from "../Fragment";
|
||||
import { FragmentType, Effect } from "../FragmentType";
|
||||
import { Fragments, type Fragment } from "../Fragment";
|
||||
import { FragmentTypeEnum, Effect } from "../FragmentType";
|
||||
import { StaneksGift } from "../StaneksGift";
|
||||
import { FragmentPreview } from "./FragmentPreview";
|
||||
import { formatStaneksGiftPower } from "../../ui/formatNumber";
|
||||
@@ -28,12 +28,12 @@ function FragmentOption(props: IOptionProps): React.ReactElement {
|
||||
colorAt={(x, y) => {
|
||||
if (!props.fragment.fullAt(x, y, 0)) return "";
|
||||
if (left === 0) return "grey";
|
||||
return props.fragment.type === FragmentType.Booster ? "blue" : "green";
|
||||
return props.fragment.type === FragmentTypeEnum.Booster ? "blue" : "green";
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
<Typography>
|
||||
{props.fragment.type === FragmentType.Booster
|
||||
{props.fragment.type === FragmentTypeEnum.Booster
|
||||
? `${props.fragment.power}x adjacent fragment power`
|
||||
: Effect(props.fragment.type)}
|
||||
<br />
|
||||
@@ -45,11 +45,22 @@ function FragmentOption(props: IOptionProps): React.ReactElement {
|
||||
);
|
||||
}
|
||||
|
||||
export interface UIFragment {
|
||||
type: "None" | "Delete";
|
||||
}
|
||||
|
||||
export function isUIFragment(fragment: object): fragment is UIFragment {
|
||||
return "type" in fragment && (fragment.type === "None" || fragment.type === "Delete");
|
||||
}
|
||||
|
||||
interface IProps {
|
||||
gift: StaneksGift;
|
||||
selectFragment: (fragment: Fragment) => void;
|
||||
selectFragment: (fragment: UIFragment | Fragment) => void;
|
||||
}
|
||||
|
||||
export const NoneFragment: UIFragment = { type: "None" };
|
||||
const DeleteFragment: UIFragment = { type: "Delete" };
|
||||
|
||||
export function FragmentSelector(props: IProps): React.ReactElement {
|
||||
const [value, setValue] = useState<string | number>("None");
|
||||
function onChange(event: SelectChangeEvent<string | number>): void {
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import * as React from "react";
|
||||
import { Fragment, NoneFragment } from "../Fragment";
|
||||
import { FragmentType } from "../FragmentType";
|
||||
import { type Fragment } from "../Fragment";
|
||||
import { StaneksGift } from "../StaneksGift";
|
||||
import { FragmentInspector } from "./FragmentInspector";
|
||||
import { FragmentSelector } from "./FragmentSelector";
|
||||
import { FragmentSelector, isUIFragment, NoneFragment, type UIFragment } from "./FragmentSelector";
|
||||
import Box from "@mui/material/Box";
|
||||
import Button from "@mui/material/Button";
|
||||
import { Table } from "../../ui/React/Table";
|
||||
@@ -21,11 +20,13 @@ export function MainBoard(props: IProps): React.ReactElement {
|
||||
const [ghostGrid, setGhostGrid] = React.useState(zeros(props.gift.width(), props.gift.height()));
|
||||
const [pos, setPos] = React.useState([0, 0]);
|
||||
const [rotation, setRotation] = React.useState(0);
|
||||
const [selectedFragment, setSelectedFragment] = React.useState(NoneFragment);
|
||||
const [selectedFragment, setSelectedFragment] = React.useState<UIFragment | Fragment>(NoneFragment);
|
||||
|
||||
function moveGhost(worldX: number, worldY: number, rotation: number): void {
|
||||
setPos([worldX, worldY]);
|
||||
if (selectedFragment.type === FragmentType.None || selectedFragment.type === FragmentType.Delete) return;
|
||||
if (isUIFragment(selectedFragment)) {
|
||||
return;
|
||||
}
|
||||
const newgrid = zeros(props.gift.width(), props.gift.height());
|
||||
for (let y = 0; y < selectedFragment.height(rotation); y++) {
|
||||
for (let x = 0; x < selectedFragment.width(rotation); x++) {
|
||||
@@ -46,20 +47,23 @@ export function MainBoard(props: IProps): React.ReactElement {
|
||||
}
|
||||
|
||||
function clickAt(worldX: number, worldY: number): void {
|
||||
if (selectedFragment.type == FragmentType.None) return;
|
||||
if (selectedFragment.type == FragmentType.Delete) {
|
||||
deleteAt(worldX, worldY);
|
||||
} else {
|
||||
if (!props.gift.canPlace(worldX, worldY, rotation, selectedFragment)) return;
|
||||
props.gift.place(worldX, worldY, rotation, selectedFragment);
|
||||
if (isUIFragment(selectedFragment)) {
|
||||
if (selectedFragment.type === "Delete") {
|
||||
deleteAt(worldX, worldY);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!props.gift.canPlace(worldX, worldY, rotation, selectedFragment)) {
|
||||
return;
|
||||
}
|
||||
props.gift.place(worldX, worldY, rotation, selectedFragment);
|
||||
}
|
||||
|
||||
function clear(): void {
|
||||
props.gift.clear();
|
||||
}
|
||||
|
||||
function updateSelectedFragment(fragment: Fragment): void {
|
||||
function updateSelectedFragment(fragment: UIFragment | Fragment): void {
|
||||
setSelectedFragment(fragment);
|
||||
const newgrid = zeros(props.gift.width(), props.gift.height());
|
||||
setGhostGrid(newgrid);
|
||||
|
||||
@@ -480,6 +480,8 @@ import nsDoc_bitburner_fragment_md from "../../markdown/bitburner.fragment.md?ra
|
||||
import nsDoc_bitburner_fragment_power_md from "../../markdown/bitburner.fragment.power.md?raw";
|
||||
import nsDoc_bitburner_fragment_shape_md from "../../markdown/bitburner.fragment.shape.md?raw";
|
||||
import nsDoc_bitburner_fragment_type_md from "../../markdown/bitburner.fragment.type.md?raw";
|
||||
import nsDoc_bitburner_fragmentenumtype_md from "../../markdown/bitburner.fragmentenumtype.md?raw";
|
||||
import nsDoc_bitburner_fragmenttype_md from "../../markdown/bitburner.fragmenttype.md?raw";
|
||||
import nsDoc_bitburner_gameinfo_commit_md from "../../markdown/bitburner.gameinfo.commit.md?raw";
|
||||
import nsDoc_bitburner_gameinfo_md from "../../markdown/bitburner.gameinfo.md?raw";
|
||||
import nsDoc_bitburner_gameinfo_platform_md from "../../markdown/bitburner.gameinfo.platform.md?raw";
|
||||
@@ -1986,6 +1988,8 @@ AllPages["nsDoc/bitburner.fragment.md"] = nsDoc_bitburner_fragment_md;
|
||||
AllPages["nsDoc/bitburner.fragment.power.md"] = nsDoc_bitburner_fragment_power_md;
|
||||
AllPages["nsDoc/bitburner.fragment.shape.md"] = nsDoc_bitburner_fragment_shape_md;
|
||||
AllPages["nsDoc/bitburner.fragment.type.md"] = nsDoc_bitburner_fragment_type_md;
|
||||
AllPages["nsDoc/bitburner.fragmentenumtype.md"] = nsDoc_bitburner_fragmentenumtype_md;
|
||||
AllPages["nsDoc/bitburner.fragmenttype.md"] = nsDoc_bitburner_fragmenttype_md;
|
||||
AllPages["nsDoc/bitburner.gameinfo.commit.md"] = nsDoc_bitburner_gameinfo_commit_md;
|
||||
AllPages["nsDoc/bitburner.gameinfo.md"] = nsDoc_bitburner_gameinfo_md;
|
||||
AllPages["nsDoc/bitburner.gameinfo.platform.md"] = nsDoc_bitburner_gameinfo_platform_md;
|
||||
|
||||
@@ -3,7 +3,7 @@ import { AugmentationName, FactionName } from "@enums";
|
||||
|
||||
import { canAcceptStaneksGift, staneksGift } from "../CotMG/Helper";
|
||||
import { Fragments, FragmentById } from "../CotMG/Fragment";
|
||||
import { FragmentType } from "../CotMG/FragmentType";
|
||||
import { FragmentTypeEnum } from "../CotMG/FragmentType";
|
||||
|
||||
import { Stanek as IStanek } from "@nsdefs";
|
||||
import { NetscriptContext, InternalAPI } from "../Netscript/APIWrapper";
|
||||
@@ -37,7 +37,7 @@ export function NetscriptStanek(): InternalAPI<IStanek> {
|
||||
const fragment = staneksGift.findFragment(rootX, rootY);
|
||||
//Check whether the selected fragment can ge charged
|
||||
if (!fragment) throw helpers.errorMessage(ctx, `No fragment with root (${rootX}, ${rootY}).`);
|
||||
if (fragment.fragment().type == FragmentType.Booster) {
|
||||
if (fragment.fragment().type == FragmentTypeEnum.Booster) {
|
||||
throw helpers.errorMessage(
|
||||
ctx,
|
||||
`The fragment with root (${rootX}, ${rootY}) is a Booster Fragment and thus cannot be charged.`,
|
||||
|
||||
23
src/ScriptEditor/NetscriptDefinitions.d.ts
vendored
23
src/ScriptEditor/NetscriptDefinitions.d.ts
vendored
@@ -5771,6 +5771,29 @@ export interface Formulas {
|
||||
bladeburner: BladeburnerFormulas;
|
||||
}
|
||||
|
||||
/** @public */
|
||||
type FragmentEnumType = {
|
||||
HackingSpeed: 3;
|
||||
HackingMoney: 4;
|
||||
HackingGrow: 5;
|
||||
Hacking: 6;
|
||||
Strength: 7;
|
||||
Defense: 8;
|
||||
Dexterity: 9;
|
||||
Agility: 10;
|
||||
Charisma: 11;
|
||||
HacknetMoney: 12;
|
||||
HacknetCost: 13;
|
||||
Rep: 14;
|
||||
WorkMoney: 15;
|
||||
Crime: 16;
|
||||
Bladeburner: 17;
|
||||
Booster: 18;
|
||||
};
|
||||
|
||||
/** @public */
|
||||
type FragmentType = _ValueOf<FragmentEnumType>;
|
||||
|
||||
/** @public */
|
||||
interface Fragment {
|
||||
id: number;
|
||||
|
||||
Reference in New Issue
Block a user