diff --git a/src/components/Game.svelte b/src/components/Game.svelte
new file mode 100644
index 0000000..32f5360
--- /dev/null
+++ b/src/components/Game.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/src/components/ResourceTable/ResourceGroup.svelte b/src/components/ResourceTable/ResourceGroup.svelte
index b9b469d..c7d9853 100644
--- a/src/components/ResourceTable/ResourceGroup.svelte
+++ b/src/components/ResourceTable/ResourceGroup.svelte
@@ -1,10 +1,11 @@
diff --git a/src/components/ResourceTable/ResourceTable.svelte b/src/components/ResourceTable/ResourceTable.svelte
index e4bc3f3..0366929 100644
--- a/src/components/ResourceTable/ResourceTable.svelte
+++ b/src/components/ResourceTable/ResourceTable.svelte
@@ -1,85 +1,29 @@
-
-
-
+
+
+
+
+
diff --git a/src/components/Tabs/Home.svelte b/src/components/Tabs/Home.svelte
new file mode 100644
index 0000000..c671a06
--- /dev/null
+++ b/src/components/Tabs/Home.svelte
@@ -0,0 +1,41 @@
+
+
+
+ {#each Object.entries(HomeActions.getActionTable()) as [homeActionId, homeAction]}
+
+ {/each}
+
+
+
diff --git a/src/components/Tabs/Lab.svelte b/src/components/Tabs/Lab.svelte
new file mode 100644
index 0000000..af62d02
--- /dev/null
+++ b/src/components/Tabs/Lab.svelte
@@ -0,0 +1 @@
+Haha, Laboratory go BRRRRRRRRRRRRRRR!
diff --git a/src/components/Wrapper.svelte b/src/components/Wrapper.svelte
index 06df4b5..9f20fbf 100644
--- a/src/components/Wrapper.svelte
+++ b/src/components/Wrapper.svelte
@@ -1,14 +1,23 @@
-
+
+
+
+
+
diff --git a/src/global.d.ts b/src/global.d.ts
index 1a25456..74ad4c4 100644
--- a/src/global.d.ts
+++ b/src/global.d.ts
@@ -1 +1,9 @@
///
+
+import type { SharkGame } from "./shark/SharkGame";
+
+declare global {
+ interface Window {
+ SharkGame: SharkGame;
+ }
+}
diff --git a/src/shark/SharkGame.ts b/src/shark/SharkGame.ts
index f728b71..e611022 100644
--- a/src/shark/SharkGame.ts
+++ b/src/shark/SharkGame.ts
@@ -1,6 +1,8 @@
+import { Resources } from "./data/Resources";
import { Log } from "./Log";
import { Settings } from "./Settings";
import { StaticClass } from "./StaticClass";
+import { Tabs } from "./Tabs";
export class SharkGame extends StaticClass {
static readonly #GAME_NAMES = [
@@ -55,6 +57,8 @@ export class SharkGame extends StaticClass {
static title: string;
static readonly Settings = Settings;
static readonly Log = Log;
+ static readonly Resources = Resources;
+ static readonly Tabs = Tabs;
static init(): void {
for (const setting of Object.values(Settings)) {
@@ -68,4 +72,4 @@ export class SharkGame extends StaticClass {
}
}
-globalThis.SharkGame = SharkGame;
+window.SharkGame = SharkGame;
diff --git a/src/shark/Tabs.ts b/src/shark/Tabs.ts
new file mode 100644
index 0000000..c98cae0
--- /dev/null
+++ b/src/shark/Tabs.ts
@@ -0,0 +1,11 @@
+import Home from "../components/Tabs/Home.svelte";
+import Lab from "../components/Tabs/Lab.svelte";
+import { StaticClass } from "./StaticClass";
+
+export class Tabs extends StaticClass {
+ static readonly Tabs = {
+ Home,
+ Lab,
+ } as const;
+ static currentTab: keyof typeof Tabs.Tabs = "Home";
+}
diff --git a/src/shark/data/HomeActions.ts b/src/shark/data/HomeActions.ts
new file mode 100644
index 0000000..c5fe2d8
--- /dev/null
+++ b/src/shark/data/HomeActions.ts
@@ -0,0 +1,73 @@
+import { StaticClass } from "../StaticClass";
+
+export type HomeAction = {
+ name: string;
+ effect: {
+ resource: Record;
+ };
+ outcomes: string[];
+ multiOutcomes?: string[];
+ helpText: string;
+};
+
+export class HomeActions extends StaticClass {
+ static getActionTable(): { [actionName: string]: HomeAction } {
+ return HomeActions.actionTable;
+ }
+
+ static actionTable = {
+ catchFish: {
+ name: "Catch fish",
+ effect: {
+ resource: {
+ fish: 1,
+ },
+ },
+ cost: {},
+ prereq: {},
+ outcomes: [
+ "Dropped the bass.",
+ "Ate a kipper. Wait. Hang on.",
+ "You eat a fish hooray!",
+ "Fish.",
+ "Ate a shark. Wait. No, it wasn't a shark.",
+ "Ate an anchovy.",
+ "Ate a catfish.",
+ "Ate a flounder.",
+ "Ate a haddock.",
+ "Ate a herring.",
+ "Ate a mackerel.",
+ "Ate a mullet.",
+ "Ate a perch.",
+ "Ate a pollock.",
+ "Ate a salmon.",
+ "Ate a sardine.",
+ "Ate a sole.",
+ "Ate a tilapia.",
+ "Ate a trout.",
+ "Ate a whitefish.",
+ "Ate a bass.",
+ "Ate a carp.",
+ "Ate a cod.",
+ "Ate a halibut.",
+ "Ate a mahi mahi.",
+ "Ate a monkfish.",
+ "Ate a perch.",
+ "Ate a snapper.",
+ "Ate a bluefish.",
+ "Ate a grouper.",
+ "Ate a sea bass.",
+ "Ate a yellowfin tuna.",
+ "Ate a marlin.",
+ "Ate an orange roughy.",
+ "Ate a shark.",
+ "Ate a swordfish.",
+ "Ate a tilefish.",
+ "Ate a tuna.",
+ "Ate a swedish fish.",
+ "Ate a goldfish.",
+ ],
+ helpText: "Use your natural shark prowess to find and catch a fish.",
+ },
+ };
+}
diff --git a/src/shark/data/Resources.ts b/src/shark/data/Resources.ts
new file mode 100644
index 0000000..d1c5ba6
--- /dev/null
+++ b/src/shark/data/Resources.ts
@@ -0,0 +1,73 @@
+import { writable } from "svelte/store";
+
+import { StaticClass } from "../StaticClass";
+
+export class Resource {
+ category: string;
+ amount: number;
+ change: number;
+
+ constructor(category: string) {
+ this.category = category;
+ this.amount = 0;
+ this.change = 0;
+ }
+}
+
+export class Resources extends StaticClass {
+ static readonly Resources = writable>({
+ shark: new Resource("Frenzy"),
+ ray: new Resource("Frenzy"),
+ fish: new Resource("Animals"),
+ });
+
+ static createResource(name: string, category: string): void {
+ Resources.Resources.update((res) => {
+ res[name] = new Resource(category);
+ return res;
+ });
+ }
+
+ static setResource(resourceName: string, amount: number): void {
+ Resources.Resources.update((res) => {
+ res[resourceName].amount = amount;
+ return res;
+ });
+ }
+
+ static getResource(resourceName: string): Resource | null {
+ let result: null | Resource = null;
+ Resources.Resources.update((res) => {
+ if (Object.hasOwnProperty.call(res, resourceName))
+ result = res[resourceName];
+ return res;
+ });
+ return result;
+ }
+
+ static getResources(resourceNames: string[]): Record | null;
+ static getResources(
+ ...resourceNames: string[]
+ ): Record | null;
+ static getResources(
+ ...resourceNames: string[] | string[][]
+ ): Record | null {
+ if (Array.isArray(resourceNames[0])) {
+ resourceNames = resourceNames[0];
+ }
+
+ let result: null | [string, Resource][] = null;
+ Resources.Resources.update((res) => {
+ for (const resourceName of resourceNames as string[]) {
+ if (Object.hasOwnProperty.call(res, resourceName)) {
+ if (result === null) {
+ result = [];
+ }
+ result.push([resourceName, res[resourceName]]);
+ }
+ }
+ return res;
+ });
+ return result === null ? null : Object.fromEntries(result);
+ }
+}
diff --git a/src/styles/global.scss b/src/styles/global.scss
index fbd9daf..7749959 100644
--- a/src/styles/global.scss
+++ b/src/styles/global.scss
@@ -23,13 +23,18 @@ a {
button {
background-color: var(--color-light);
border: 1px solid var(--color-lighter);
- border-radius: 10px;
+ border-radius: 5px;
text-shadow: 0 0 2px black;
color: white;
&:hover {
box-shadow: 0 0 2px 2px var(--color-lighter);
}
+ &:active {
+ background-color: var(--color-dark);
+ color: var(--color-light);
+ box-shadow: 0 3px 7px 7px var(--color-darker) inset;
+ }
&:not(:disabled) {
cursor: pointer;
diff --git a/tsconfig.json b/tsconfig.json
index 41051d9..f9eac3a 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -4,5 +4,9 @@
"target": "es2021",
"include": ["src/**/*"],
- "exclude": ["node_modules/*", "__sapper__/*", "public/*"]
+ "exclude": ["node_modules/*", "__sapper__/*", "public/*"],
+
+ "compilerOptions": {
+ "strict": true
+ }
}