summaryrefslogtreecommitdiff
path: root/src/state
diff options
context:
space:
mode:
Diffstat (limited to 'src/state')
-rw-r--r--src/state/const.ts11
-rw-r--r--src/state/index.ts31
-rw-r--r--src/state/types.ts25
3 files changed, 67 insertions, 0 deletions
diff --git a/src/state/const.ts b/src/state/const.ts
new file mode 100644
index 0000000..caac8ce
--- /dev/null
+++ b/src/state/const.ts
@@ -0,0 +1,11 @@
+export const GAME_SIZE = {
+ rows: 20,
+ cols: 20,
+};
+
+export const INITIAL_PADDLE_POSITION = 10;
+
+export const PADDLE_WIDTH = 3;
+export const PADDLE_HEIGHT = 1;
+
+export const NUM_STARTING_BALLS = 2;
diff --git a/src/state/index.ts b/src/state/index.ts
new file mode 100644
index 0000000..03d218f
--- /dev/null
+++ b/src/state/index.ts
@@ -0,0 +1,31 @@
+import { GAME_SIZE, NUM_STARTING_BALLS } from "./const";
+import { Ball, GameState, SessionState } from "./types";
+
+export * from "./const";
+export * from "./types";
+
+const createRandomBall = (): Ball => ({
+ position: [
+ GAME_SIZE.cols / 4 + (Math.random() * GAME_SIZE.cols) / 2,
+ GAME_SIZE.rows / 4 + (Math.random() * GAME_SIZE.rows) / 2,
+ ],
+ velocity: [-1 + Math.random() * 2, 0.5 + Math.random()],
+});
+
+const createGameState = () =>
+ ({
+ paddle: { position: [0, GAME_SIZE.rows - 1] },
+ balls: new Array(NUM_STARTING_BALLS)
+ .fill(undefined)
+ .map(() => createRandomBall()),
+ bricks: new Array(GAME_SIZE.cols * 5).fill(undefined).map((_, i) => ({
+ position: [i % GAME_SIZE.cols, Math.floor(i / GAME_SIZE.cols)],
+ })),
+ } satisfies GameState);
+
+export const createSessionState = (sessionId: string) =>
+ ({
+ sessionId,
+ localPlayerGameState: createGameState(),
+ remotePlayerGameState: createGameState(),
+ } satisfies SessionState);
diff --git a/src/state/types.ts b/src/state/types.ts
new file mode 100644
index 0000000..202e65e
--- /dev/null
+++ b/src/state/types.ts
@@ -0,0 +1,25 @@
+export type Paddle = {
+ position: [number, number];
+};
+
+export type Ball = {
+ //float positions
+ position: [number, number];
+ velocity: [number, number];
+};
+
+export type Brick = {
+ position: [number, number];
+};
+
+export type GameState = {
+ paddle: Paddle;
+ balls: Ball[];
+ bricks: Brick[];
+};
+
+export type SessionState = {
+ sessionId: string;
+ localPlayerGameState: GameState;
+ remotePlayerGameState: GameState;
+};