diff --git a/src/lib/components/ShipEdit/Weaponry/Weapon/HeavyMissile/index.svelte b/src/lib/components/ShipEdit/Weaponry/Weapon/HeavyMissile/index.svelte
new file mode 100644
index 0000000..989666f
--- /dev/null
+++ b/src/lib/components/ShipEdit/Weaponry/Weapon/HeavyMissile/index.svelte
@@ -0,0 +1,72 @@
+heavy missile
+
+
+
setFirstArc(detail)}
+ />
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/components/ShipEdit/Weaponry/Weapon/index.svelte b/src/lib/components/ShipEdit/Weaponry/Weapon/index.svelte
index ad06add..c330b45 100644
--- a/src/lib/components/ShipEdit/Weaponry/Weapon/index.svelte
+++ b/src/lib/components/ShipEdit/Weaponry/Weapon/index.svelte
@@ -19,6 +19,7 @@
import Needle from "./Needle.svelte";
import Graser from "./Graser/index.svelte";
import Torpedo from "./Torpedo/index.svelte";
+ import Missile from "./HeavyMissile/index.svelte";
const component = {
beam: Beam,
@@ -28,6 +29,7 @@
needle: Needle,
graser: Graser,
torpedo: Torpedo,
+ heavyMissile: Missile,
};
export let reqs = {};
diff --git a/src/lib/shipDux/weaponry/weapons.ts b/src/lib/shipDux/weaponry/weapons.ts
index 3a0f98d..bdb974a 100644
--- a/src/lib/shipDux/weaponry/weapons.ts
+++ b/src/lib/shipDux/weaponry/weapons.ts
@@ -35,6 +35,16 @@ export const weaponTypes = [
reqs: { mass: 2, cost: 6 },
initial: { arc: "F" },
},
+ {
+ name: "heavy missile",
+ type: "missile",
+ reqs: missileReqs,
+ initial: {
+ arcs: ["FS", "F", "FP"],
+ extended: false,
+ multiState: false,
+ },
+ },
];
const weaponsSlice = createSlice({
diff --git a/src/lib/store/ship/weaponry/rules.ts b/src/lib/store/ship/weaponry/rules.ts
index 99c4e4d..001ad74 100644
--- a/src/lib/store/ship/weaponry/rules.ts
+++ b/src/lib/store/ship/weaponry/rules.ts
@@ -27,6 +27,13 @@ type Scattergun = { type: "scattergun" };
type Needle = { type: "needle"; arc: Arc };
+type HeavyMissile = {
+ type: "heavyMissile";
+ arcs: Arc[];
+ extended: boolean;
+ multiStage: boolean;
+};
+
type Graser = {
type: "graser";
weaponClass: 1 | 2 | 3;
@@ -46,7 +53,8 @@ export type Weapon =
| Scattergun
| Needle
| Graser
- | Torpedo;
+ | Torpedo
+ | HeavyMissile;
export const weaponTypes = [
{
@@ -120,6 +128,17 @@ export const weaponTypes = [
reqs: { mass: 2, cost: 6 },
initial: { arc: "F", type: "needle" },
},
+ {
+ name: "heavy missile",
+ type: "heavyMissile",
+ reqs: missileReqs,
+ initial: {
+ arcs: ["FP", "F", "FS"],
+ extended: false,
+ multiStage: false,
+ type: "heavyMissile",
+ },
+ },
];
export function weaponReqs(weapon): Reqs {
@@ -213,6 +232,21 @@ function graserReqs({ weaponClass, arcs }: Graser) {
};
}
+function missileReqs({ extended, multiStage }: HeavyMissile): Reqs {
+ let mass = 2;
+ let cost = 6;
+ if (extended) {
+ mass += 1;
+ cost += 3;
+ }
+ if (multiStage) {
+ mass += 2;
+ cost *= 2;
+ }
+
+ return { cost, mass };
+}
+
function torpedoReqs({ weaponClass, arcs }: Torpedo): Reqs {
let mass: number = 4;
diff --git a/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissile/index.svelte b/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissile/index.svelte
new file mode 100644
index 0000000..5729720
--- /dev/null
+++ b/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissile/index.svelte
@@ -0,0 +1,52 @@
+
+
+
+
+
+ {#if extended}
+
extended range
+ {/if}
+ {#if multiStage}
+
multi-stage
+ {/if}
+
+
+
+
+
+
diff --git a/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissile/index.test.js b/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissile/index.test.js
new file mode 100644
index 0000000..200782f
--- /dev/null
+++ b/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissile/index.test.js
@@ -0,0 +1,14 @@
+import { render } from "@testing-library/svelte";
+import HeavyMissile from "./index.svelte";
+
+test("basic", () => {
+ const { queryByText } = render(HeavyMissile, {
+ props: {
+ extended: true,
+ multiStage: false,
+ },
+ });
+
+ expect(queryByText("extended range")).toBeTruthy();
+ expect(queryByText("multi-stage")).toBeFalsy();
+});
diff --git a/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissiles.svelte b/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissiles.svelte
new file mode 100644
index 0000000..3574ce0
--- /dev/null
+++ b/src/routes/(editor)/export/print/PrintShip/Weapons/HeavyMissiles.svelte
@@ -0,0 +1,18 @@
+
+ {#each heavyMissiles as w}
+
+ {/each}
+
+
+
+
+
diff --git a/src/routes/(editor)/export/print/PrintShip/Weapons/printComps.js b/src/routes/(editor)/export/print/PrintShip/Weapons/printComps.js
index 2f82b89..24d059c 100644
--- a/src/routes/(editor)/export/print/PrintShip/Weapons/printComps.js
+++ b/src/routes/(editor)/export/print/PrintShip/Weapons/printComps.js
@@ -5,6 +5,7 @@ import Scattergun from "./Scattergun.svelte";
import Needlebeam from "./Needlebeam.svelte";
import Graser from "./Graser/index.svelte";
import Torpedo from "./Torpedo/index.svelte";
+import HeavyMissile from "./HeavyMissile/index.svelte";
export default {
torpedo: Torpedo,
@@ -14,4 +15,5 @@ export default {
pds: PDS,
scattergun: Scattergun,
needle: Needlebeam,
+ heavyMissile: HeavyMissile,
};
diff --git a/src/routes/(editor)/export/print/PrintShip/index.svelte b/src/routes/(editor)/export/print/PrintShip/index.svelte
index ddf0db6..fdc5f76 100644
--- a/src/routes/(editor)/export/print/PrintShip/index.svelte
+++ b/src/routes/(editor)/export/print/PrintShip/index.svelte
@@ -5,6 +5,8 @@
+
+
@@ -49,6 +51,7 @@
import Cargo from "./Cargo.svelte";
import PDS from "./Weapons/PDS.svelte";
import Beams from "./Weapons/Beams.svelte";
+ import HeavyMissiles from "./Weapons/HeavyMissiles.svelte";
export let identification = {};
export let propulsion = {};
@@ -62,7 +65,9 @@
$: weapons = weaponry?.weapons ?? [];
$: weapons = u.reject(
weapons,
- u.matches({ specs: { type: (t) => ["pds", "beam"].includes(t) } })
+ u.matches({
+ specs: { type: (t) => ["pds", "beam", "heavyMissiles"].includes(t) },
+ })
);
$: pds = (weaponry?.weapons ?? []).filter(
@@ -71,6 +76,9 @@
$: beams = (weaponry?.weapons ?? []).filter(
u.matches({ specs: { type: "beam" } })
);
+ $: heavyMissiles = (weaponry?.weapons ?? []).filter(
+ u.matches({ specs: { type: "heavyMissiles" } })
+ );