From 7590a3592140579108e4b2d930d0a20d2ff87592 Mon Sep 17 00:00:00 2001
From: Corwin <corwin@kuiper.dev>
Date: Sun, 28 Apr 2024 23:00:03 +0100
Subject: [PATCH] add hyperspace roll

---
 .../tapir/hyperspace/hyperspace-roll-0.png    | Bin 0 -> 2867 bytes
 .../tapir/hyperspace/hyperspace-roll-1.png    | Bin 0 -> 2605 bytes
 .../data/tapir/hyperspace/hyperspace.tsx      |  30 ++++++++++++++++++
 website/agb/src/app/showcase/games.tsx        |   3 +-
 website/agb/src/app/showcase/page.tsx         |  14 +++-----
 website/agb/src/app/showcase/styles.tsx       |  24 +++++++-------
 6 files changed, 47 insertions(+), 24 deletions(-)
 create mode 100644 website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace-roll-0.png
 create mode 100644 website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace-roll-1.png
 create mode 100644 website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace.tsx

diff --git a/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace-roll-0.png b/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace-roll-0.png
new file mode 100644
index 0000000000000000000000000000000000000000..d03f89eb63d4f9e4d425beb57f25f98c33de41e7
GIT binary patch
literal 2867
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
RPG|rC002ovPDHLkV1jk6fqMV|

literal 0
HcmV?d00001

diff --git a/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace-roll-1.png b/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace-roll-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..47f792dfd0a9df3f305ef526ea840520ebc984e3
GIT binary patch
literal 2605
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
P00000NkvXXu0mjfdw=?z

literal 0
HcmV?d00001

diff --git a/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace.tsx b/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace.tsx
new file mode 100644
index 00000000..84ffdcd9
--- /dev/null
+++ b/website/agb/src/app/showcase/data/tapir/hyperspace/hyperspace.tsx
@@ -0,0 +1,30 @@
+import { ShowcaseGame, shuffle } from "@/app/showcase/games";
+import h1 from "./hyperspace-roll-0.png";
+import h2 from "./hyperspace-roll-1.png";
+
+const Screenshots = [h1, h2];
+
+export const Hyperspace: ShowcaseGame = {
+  name: "Hyperspace Roll",
+  developers: shuffle(["Corwin Kuiper", "Gwilym Inzani", "Sam Williams"]),
+  screenshots: Screenshots,
+  description: (
+    <>
+      <p>
+        Get through as many levels as possible in this space themed, dice
+        rolling roguelike.
+      </p>
+      <p>
+        Build up powerful combos to defeat enemies which keep getting stronger.
+        Slowly acquire more dice and upgrade them in order to handle the
+        increasing strength of the enemies you face.
+      </p>
+
+      <p>
+        Hyperspace Roll was influenced by great games such as Slay the Spire,
+        FTL and the board game Escape: The Curse of the Temple.
+      </p>
+    </>
+  ),
+  itch: new URL("https://lostimmortal.itch.io/the-purple-night"),
+};
diff --git a/website/agb/src/app/showcase/games.tsx b/website/agb/src/app/showcase/games.tsx
index 3ba4a542..02418bb7 100644
--- a/website/agb/src/app/showcase/games.tsx
+++ b/website/agb/src/app/showcase/games.tsx
@@ -2,6 +2,7 @@ import { StaticImageData } from "next/image";
 import { ReactNode } from "react";
 import { HatWiz } from "./data/tapir/hatwiz/hatwiz";
 import { Purple } from "./data/tapir/purple/purple";
+import { Hyperspace } from "./data/tapir/hyperspace/hyperspace";
 
 export interface ShowcaseGame {
   name: string;
@@ -24,4 +25,4 @@ export function shuffle<T>(a: T[]) {
   return a;
 }
 
-export const Games: ShowcaseGame[] = [HatWiz, Purple];
+export const Games: ShowcaseGame[] = [HatWiz, Purple, Hyperspace];
diff --git a/website/agb/src/app/showcase/page.tsx b/website/agb/src/app/showcase/page.tsx
index 7387c023..8ebb7fbc 100644
--- a/website/agb/src/app/showcase/page.tsx
+++ b/website/agb/src/app/showcase/page.tsx
@@ -1,10 +1,8 @@
 import { Metadata } from "next";
 import { ContentBlock } from "@/components/contentBlock";
 import { Games, ShowcaseGame } from "./games";
-import Link from "next/link";
 import { slugify } from "@/sluggify";
 import { GameDisplay, GameGrid, GameImage } from "./styles";
-import Image from "next/image";
 
 export const metadata: Metadata = {
   title: "Games made with agb",
@@ -28,15 +26,11 @@ export default function ColourPickerPage() {
 }
 
 function Game({ game }: { game: ShowcaseGame }) {
-  const lastImage = game.screenshots[game.screenshots.length - 1];
+  const showcaseImage = game.screenshots[game.screenshots.length - 1];
   return (
-    <GameDisplay>
-      <Link href={`./showcase/${slugify(game.name)}`}>
-        <GameImage>
-          <Image src={lastImage} alt={`Screenshot of ${game.name}`} />
-        </GameImage>
-        <h2>{game.name}</h2>
-      </Link>
+    <GameDisplay href={`./showcase/${slugify(game.name)}`}>
+      <GameImage src={showcaseImage} alt={`Screenshot of ${game.name}`} />
+      <h2>{game.name}</h2>
     </GameDisplay>
   );
 }
diff --git a/website/agb/src/app/showcase/styles.tsx b/website/agb/src/app/showcase/styles.tsx
index 0b7a5395..32936871 100644
--- a/website/agb/src/app/showcase/styles.tsx
+++ b/website/agb/src/app/showcase/styles.tsx
@@ -1,6 +1,8 @@
 "use client";
 
+import Link from "next/link";
 import styled from "styled-components";
+import Image from "next/image";
 
 export const GameGrid = styled.div`
   display: flex;
@@ -8,22 +10,18 @@ export const GameGrid = styled.div`
   justify-content: center;
 `;
 
-export const GameImage = styled.div`
-  img {
-    width: 100%;
-    width: round(down, 100%, 240px);
-    height: auto;
-    image-rendering: pixelated;
-  }
+export const GameImage = styled(Image)`
+  width: 100%;
+  width: round(down, 100%, 240px);
+  height: auto;
+  image-rendering: pixelated;
 `;
 
-export const GameDisplay = styled.div`
+export const GameDisplay = styled(Link)`
   width: 600px;
-  a {
-    text-align: center;
-    color: black;
-    text-decoration: none;
-  }
+  text-align: center;
+  color: black;
+  text-decoration: none;
 
   h2 {
     margin: 0;