diff --git a/markdown/bitburner.fragmentenumtype.md b/markdown/bitburner.fragmentenumtype.md new file mode 100644 index 000000000..ae6343274 --- /dev/null +++ b/markdown/bitburner.fragmentenumtype.md @@ -0,0 +1,29 @@ + + +[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; +}; +``` diff --git a/markdown/bitburner.fragmenttype.md b/markdown/bitburner.fragmenttype.md new file mode 100644 index 000000000..fc8eee365 --- /dev/null +++ b/markdown/bitburner.fragmenttype.md @@ -0,0 +1,14 @@ + + +[Home](./index.md) > [bitburner](./bitburner.md) > [FragmentType](./bitburner.fragmenttype.md) + +## FragmentType type + + +**Signature:** + +```typescript +type FragmentType = _ValueOf; +``` +**References:** [\_ValueOf](./bitburner._valueof.md), [FragmentEnumType](./bitburner.fragmentenumtype.md) + diff --git a/markdown/bitburner.md b/markdown/bitburner.md index 0ac2f6177..08e350e1a 100644 --- a/markdown/bitburner.md +++ b/markdown/bitburner.md @@ -1802,6 +1802,26 @@ Warning: Spoiler ahead. This enum contains names of \*\*all\*\* factions. If you + + + +[FragmentEnumType](./bitburner.fragmentenumtype.md) + + + + + + + + + +[FragmentType](./bitburner.fragmenttype.md) + + + + + + diff --git a/src/CotMG/Fragment.ts b/src/CotMG/Fragment.ts index 441e12f10..9b1e41550 100644 --- a/src/CotMG/Fragment.ts +++ b/src/CotMG/Fragment.ts @@ -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, ""); diff --git a/src/CotMG/FragmentType.ts b/src/CotMG/FragmentType.ts index 52d6e0fc4..10073287f 100644 --- a/src/CotMG/FragmentType.ts +++ b/src/CotMG/FragmentType.ts @@ -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); } diff --git a/src/CotMG/StaneksGift.ts b/src/CotMG/StaneksGift.ts index 95dc283b4..5137414b4 100644 --- a/src/CotMG/StaneksGift.ts +++ b/src/CotMG/StaneksGift.ts @@ -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; diff --git a/src/CotMG/ui/ActiveFragmentSummary.tsx b/src/CotMG/ui/ActiveFragmentSummary.tsx index e6046c0d6..ab4125930 100644 --- a/src/CotMG/ui/ActiveFragmentSummary.tsx +++ b/src/CotMG/ui/ActiveFragmentSummary.tsx @@ -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, - }); - } } }); diff --git a/src/CotMG/ui/FragmentInspector.tsx b/src/CotMG/ui/FragmentInspector.tsx index b2ed43536..9c55e49cb 100644 --- a/src/CotMG/ui/FragmentInspector.tsx +++ b/src/CotMG/ui/FragmentInspector.tsx @@ -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%")) { diff --git a/src/CotMG/ui/FragmentSelector.tsx b/src/CotMG/ui/FragmentSelector.tsx index 481b0688f..fa7d1ed9c 100644 --- a/src/CotMG/ui/FragmentSelector.tsx +++ b/src/CotMG/ui/FragmentSelector.tsx @@ -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"; }} /> - {props.fragment.type === FragmentType.Booster + {props.fragment.type === FragmentTypeEnum.Booster ? `${props.fragment.power}x adjacent fragment power` : Effect(props.fragment.type)}
@@ -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("None"); function onChange(event: SelectChangeEvent): void { diff --git a/src/CotMG/ui/MainBoard.tsx b/src/CotMG/ui/MainBoard.tsx index a320dee53..d15bfbaf8 100644 --- a/src/CotMG/ui/MainBoard.tsx +++ b/src/CotMG/ui/MainBoard.tsx @@ -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(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); diff --git a/src/Documentation/pages.ts b/src/Documentation/pages.ts index 98299487c..cd2b8c9df 100644 --- a/src/Documentation/pages.ts +++ b/src/Documentation/pages.ts @@ -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; diff --git a/src/NetscriptFunctions/Stanek.ts b/src/NetscriptFunctions/Stanek.ts index 903f65978..668279cc1 100644 --- a/src/NetscriptFunctions/Stanek.ts +++ b/src/NetscriptFunctions/Stanek.ts @@ -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 { 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.`, diff --git a/src/ScriptEditor/NetscriptDefinitions.d.ts b/src/ScriptEditor/NetscriptDefinitions.d.ts index 0cf535f97..32ba6df49 100644 --- a/src/ScriptEditor/NetscriptDefinitions.d.ts +++ b/src/ScriptEditor/NetscriptDefinitions.d.ts @@ -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; + /** @public */ interface Fragment { id: number;