bitburner-src/src/CotMG/Fragment.ts

290 lines
5.9 KiB
TypeScript
Raw Normal View History

2021-09-25 23:21:50 +02:00
import { FragmentType } from "./FragmentType";
import { Shapes } from "./data/Shapes";
2021-09-25 23:21:50 +02:00
export const Fragments: Fragment[] = [];
export class Fragment {
2021-10-04 18:28:57 +02:00
id: number;
shape: boolean[][];
type: FragmentType;
power: number;
limit: number;
2021-09-25 23:21:50 +02:00
2021-10-04 18:28:57 +02:00
constructor(id: number, shape: boolean[][], type: FragmentType, power: number, limit: number) {
this.id = id;
this.shape = shape;
this.type = type;
this.power = power;
this.limit = limit;
}
2021-09-25 23:21:50 +02:00
2021-10-16 23:12:04 +02:00
fullAt(x: number, y: number, rotation: number, debug = false): boolean {
2021-10-04 18:28:57 +02:00
if (y < 0) return false;
2021-10-16 23:12:04 +02:00
if (y >= this.height(rotation)) return false;
2021-10-04 18:28:57 +02:00
if (x < 0) return false;
2021-10-16 23:12:04 +02:00
if (x >= this.width(rotation)) return false;
// start xy, modifier xy
let [sx, sy, mx, my] = [0, 0, 1, 1];
if (rotation === 1) {
[sx, sy, mx, my] = [this.width(rotation) - 1, 0, -1, 1];
} else if (rotation === 2) {
[sx, sy, mx, my] = [this.width(rotation) - 1, this.height(rotation) - 1, -1, -1];
} else if (rotation === 3) {
[sx, sy, mx, my] = [0, this.height(rotation) - 1, 1, -1];
}
let [qx, qy] = [sx + mx * x, sy + my * y];
if (rotation % 2 === 1) [qx, qy] = [qy, qx];
if (debug) {
console.log("q " + [qx, qy]);
}
return this.shape[qy][qx];
2021-10-04 18:28:57 +02:00
}
2021-09-25 23:21:50 +02:00
2021-10-16 23:12:04 +02:00
width(rotation: number): number {
if (rotation % 2 === 0) return this.shape[0].length;
return this.shape.length;
2021-10-04 18:28:57 +02:00
}
2021-09-25 23:21:50 +02:00
2021-10-16 23:12:04 +02:00
height(rotation: number): number {
if (rotation % 2 === 0) return this.shape.length;
return this.shape[0].length;
2021-10-04 18:28:57 +02:00
}
2021-09-25 23:21:50 +02:00
2021-10-04 18:28:57 +02:00
// List of direct neighboors of this fragment.
2021-10-16 23:12:04 +02:00
neighboors(rotation: number): number[][] {
2021-10-04 18:28:57 +02:00
const candidates: number[][] = [];
2021-09-25 23:21:50 +02:00
2021-10-04 18:28:57 +02:00
const add = (x: number, y: number): void => {
2021-10-16 23:12:04 +02:00
if (this.fullAt(x, y, rotation)) return;
2021-10-04 18:28:57 +02:00
if (candidates.some((coord) => coord[0] === x && coord[1] === y)) return;
candidates.push([x, y]);
};
for (let y = 0; y < this.shape.length; y++) {
for (let x = 0; x < this.shape[y].length; x++) {
// This cell is full, add all it's neighboors.
if (!this.shape[y][x]) continue;
add(x - 1, y);
add(x + 1, y);
add(x, y - 1);
add(x, y + 1);
}
2021-09-25 23:21:50 +02:00
}
2021-10-04 18:28:57 +02:00
const cells: number[][] = [];
for (const candidate of candidates) {
if (cells.some((cell) => cell[0] === candidate[0] && cell[1] === candidate[1])) continue;
cells.push(candidate);
2021-09-25 23:21:50 +02:00
}
2021-10-04 18:28:57 +02:00
return cells;
}
copy(): Fragment {
return new Fragment(
this.id,
this.shape.map((a) => a.slice()),
this.type,
this.power,
this.limit,
);
}
2021-09-25 23:21:50 +02:00
}
export function FragmentById(id: number): Fragment | null {
2021-10-04 18:28:57 +02:00
for (const fragment of Fragments) {
if (fragment.id === id) return fragment;
}
return null;
2021-09-25 23:21:50 +02:00
}
2021-10-04 18:28:57 +02:00
(function () {
const _ = false;
const X = true;
Fragments.push(
new Fragment(
0, // id
Shapes.T,
2021-10-04 18:28:57 +02:00
FragmentType.Hacking, // type
2021-10-07 07:36:59 +02:00
1,
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
1, // id
Shapes.Z,
2021-10-04 18:28:57 +02:00
FragmentType.Hacking, // type
2021-10-07 07:36:59 +02:00
1,
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
5, // id
Shapes.S,
2021-10-04 18:28:57 +02:00
FragmentType.HackingSpeed, // type
2021-10-07 07:36:59 +02:00
1.3,
2021-10-04 18:28:57 +02:00
1, // limit
),
);
2021-09-25 23:21:50 +02:00
2021-10-04 18:28:57 +02:00
Fragments.push(
new Fragment(
6, // id
Shapes.I,
2021-10-04 18:28:57 +02:00
FragmentType.HackingMoney, // type
2021-10-07 07:36:59 +02:00
2, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
7, // id
Shapes.J,
2021-10-04 18:28:57 +02:00
FragmentType.HackingGrow, // type
2021-10-07 07:36:59 +02:00
0.5, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
8, // id
Shapes.O,
2021-10-04 18:28:57 +02:00
FragmentType.Hacking, // type
2021-10-07 07:36:59 +02:00
1, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
10, // id
Shapes.T,
2021-10-04 18:28:57 +02:00
FragmentType.Strength, // type
2021-10-07 07:36:59 +02:00
2, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
12, // id
Shapes.L,
2021-10-04 18:28:57 +02:00
FragmentType.Defense, // type
2021-10-07 07:36:59 +02:00
2, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
14, // id
Shapes.L,
2021-10-04 18:28:57 +02:00
FragmentType.Dexterity, // type
2021-10-07 07:36:59 +02:00
2, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
16, // id
Shapes.S,
2021-10-04 18:28:57 +02:00
FragmentType.Agility, // type
2021-10-07 07:36:59 +02:00
2, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
18, // id
Shapes.S,
2021-10-04 18:28:57 +02:00
FragmentType.Charisma, // type
2021-10-07 07:36:59 +02:00
3, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
20, // id
Shapes.I,
2021-10-04 18:28:57 +02:00
FragmentType.HacknetMoney, // type
2021-10-07 07:36:59 +02:00
1, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
21, // id
Shapes.O,
2021-10-04 18:28:57 +02:00
FragmentType.HacknetCost, // type
2021-10-07 07:36:59 +02:00
-1, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
25, // id
Shapes.J,
2021-10-04 18:28:57 +02:00
FragmentType.Rep, // type
2021-10-07 07:36:59 +02:00
0.5, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
27, // id
Shapes.J,
2021-10-04 18:28:57 +02:00
FragmentType.WorkMoney, // type
2021-10-07 07:36:59 +02:00
10, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
28, // id
Shapes.L,
2021-10-04 18:28:57 +02:00
FragmentType.Crime, // type
2021-10-07 07:36:59 +02:00
2, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
Fragments.push(
new Fragment(
30, // id
Shapes.S,
2021-10-04 18:28:57 +02:00
FragmentType.Bladeburner, // type
2021-10-15 21:40:19 +02:00
0.4, // power
2021-10-04 18:28:57 +02:00
1, // limit
),
);
2021-10-07 07:36:59 +02:00
Fragments.push(
new Fragment(
2, // id
[
// shape
2021-10-15 21:40:19 +02:00
[X, X, X, X],
[X, _, _, X],
[X, _, _, X],
[X, X, X, X],
2021-10-07 07:36:59 +02:00
],
FragmentType.Booster, // type
1.1, // power
3, // limit
),
);
Fragments.push(
new Fragment(
31, // id
[
// shape
[X],
[X],
[X],
[X],
],
FragmentType.Booster, // type
1.1, // power
3, // limit
),
);
2021-09-25 23:21:50 +02:00
})();
export const NoneFragment = new Fragment(-2, [], FragmentType.None, 0, Infinity);
export const DeleteFragment = new Fragment(-2, [], FragmentType.Delete, 0, Infinity);