CODEBASE: Refactor Stanek's Gift UI code and change internal FragmentType enum (#2346)

This commit is contained in:
catloversg
2025-10-13 03:23:45 +07:00
committed by GitHub
parent 950c21d734
commit 030be41df9
13 changed files with 253 additions and 160 deletions

View File

@@ -0,0 +1,29 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [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;
};
```

View File

@@ -0,0 +1,14 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [bitburner](./bitburner.md) &gt; [FragmentType](./bitburner.fragmenttype.md)
## FragmentType type
**Signature:**
```typescript
type FragmentType = _ValueOf<FragmentEnumType>;
```
**References:** [\_ValueOf](./bitburner._valueof.md)<!-- -->, [FragmentEnumType](./bitburner.fragmentenumtype.md)

View File

@@ -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>

View File

@@ -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, "");

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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,
});
}
}
});

View File

@@ -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%")) {

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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.`,

View File

@@ -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;