From 21ee80b08a7ab7b107bd2f97f0c4d9b8f303d84f Mon Sep 17 00:00:00 2001 From: Alexander Bass Date: Fri, 9 Feb 2024 00:34:25 -0500 Subject: [PATCH] general cleanup --- src/assets/{froob.html => index.html} | 29 ++++-- src/gameState.ts | 135 ++++++++++++++------------ src/lib/controller.ts | 51 +++++----- src/lib/option.ts | 61 +----------- src/lib/util.ts | 29 +++--- src/sidebar.ts | 2 +- tetris_mockup.xcf | Bin 242385 -> 0 bytes 7 files changed, 139 insertions(+), 168 deletions(-) rename src/assets/{froob.html => index.html} (85%) delete mode 100644 tetris_mockup.xcf diff --git a/src/assets/froob.html b/src/assets/index.html similarity index 85% rename from src/assets/froob.html rename to src/assets/index.html index 8688583..d9c41a0 100644 --- a/src/assets/froob.html +++ b/src/assets/index.html @@ -96,7 +96,7 @@ font-size: medium; } #infobox ul { - margin: 0 0.5vw; + margin: 0; padding: 0; list-style-type: none; } @@ -105,17 +105,20 @@ align-items: center; justify-content: space-between; } + #infobox h2 { + border-bottom: 1px solid gray; + margin-bottom: 5px; + } kbd { background-color: #eee; border-radius: 3px; text-align: center; - height: 1.8vw; - width: 1.8vw; - font-size: 1.5vw; - margin-block: 2px; + padding: 4px 6px; + margin: 1px 2px; color: black; border: 1px solid #b4b4b4; } + .with-border { margin: 4px; border: 4px solid #525252; @@ -131,6 +134,12 @@ flex-direction: column; flex-wrap: wrap; } + #quitButton a { + color: black; + } + h2 { + margin-block: 0.5vw; + } @@ -147,10 +156,11 @@

Controls

@@ -160,6 +170,7 @@

You’ve been froobed!

With a score of

try again?

+

quit

diff --git a/src/gameState.ts b/src/gameState.ts index ede3c28..19eb5be 100644 --- a/src/gameState.ts +++ b/src/gameState.ts @@ -1,5 +1,4 @@ import { RotationStyle, TileColor } from "./tetrisPieces"; -import { Option, ifSome, isNone, isSome } from "./lib/option"; import { Point, addPoint } from "./lib/util"; import { TextureStore } from "./textureStore"; import { Sidebar } from "./sidebar"; @@ -33,10 +32,10 @@ function posToGridIndex(x: number, y: number): number { export class GameState { // Whenever an operation is performed which requires the board to be redrawn, reDraw is set to true reDraw: boolean; - heldPiece: Option; + heldPiece: null | HeldPiece; fallTimer: number; movementTimer: number; - grid: Array>; + grid: Array; sidebarRef: Sidebar; constructor(sidebarRef: Sidebar) { @@ -57,24 +56,22 @@ export class GameState { PLAYFIELD_HEIGHT ); for (const [i, tile] of this.grid.entries()) { - if (isNone(tile)) { + if (tile === null) { continue; } - ifSome(tile, (tile) => { - GameState.drawTile(...gridIndexToPos(i), tile, ctx, textures); - }); + GameState.drawTile(...gridIndexToPos(i), tile, ctx, textures); } - ifSome(this.heldPiece, (held) => { - for (const tileOffset of held.tiles) { - const pos = addPoint(held.pos, tileOffset); - GameState.drawTile(...pos, held.schema.color, ctx, textures); + if (this.heldPiece !== null ) { + for (const tileOffset of this.heldPiece.tiles) { + const pos = addPoint(this.heldPiece.pos, tileOffset); + GameState.drawTile(...pos, this.heldPiece.schema.color, ctx, textures); } - }); + } this.reDraw = false; } fallTick(): void | boolean { - if (isNone(this.heldPiece)) { + if (this.heldPiece === null) { this.heldPiece = this.sidebarRef.getNextPiece(); if (this.allPointsInEmptyGridSpace(this.heldPieceTilesAdjusted())) { this.reDraw = true; @@ -86,12 +83,14 @@ export class GameState { } if (!this.moveHeld(0, 1)) { + console.log("move failed"); this.flashHeldToGrid(); } } inputTick(pressed: Array): void { - if (isNone(this.heldPiece)) return; + + if (this.heldPiece === null) return; for (const key of pressed) { switch (key) { case KeyEvent.Up: @@ -115,54 +114,57 @@ export class GameState { } rotate(): void { - ifSome(this.heldPiece, (held) => { - const style = held.schema.rotation; - if (style === RotationStyle.None) { - return; - } + if (this.heldPiece === null) return; + const held = this.heldPiece; + const style = held.schema.rotation; + if (style === RotationStyle.None) { + return; + } - let rotationFunc: (p: Point) => Point; - if (style === RotationStyle.Center) { - // For 3x2 - rotationFunc = (p): Point => [-p[1], p[0]]; - } else { - // For 1x4 - rotationFunc = (p): Point => [1 - p[1], p[0]]; - } - const rotated = held.tiles.map(rotationFunc); - const rotatedAdjusted = rotated.map((p) => addPoint(p, held.pos)); - if (this.allPointsInEmptyGridSpace(rotatedAdjusted)) { - held.tiles = rotated; - this.reDraw = true; - } - }); + let rotationFunc: (p: Point) => Point; + if (style === RotationStyle.Center) { + // For 3x2 + rotationFunc = (p): Point => [-p[1], p[0]]; + } else { + // For 1x4 + rotationFunc = (p): Point => [1 - p[1], p[0]]; + } + const rotated = held.tiles.map(rotationFunc); + + const rotatedAdjusted = rotated.map((p) => addPoint(p, held.pos)); + if (this.allPointsInEmptyGridSpace(rotatedAdjusted)) { + this.heldPiece.tiles = rotated; + this.reDraw = true; + } } private moveHeld(dx: number, dy: number): boolean { - let success = false; - ifSome(this.heldPiece, (held) => { - const newPos: Point = addPoint(held.pos, [dx, dy]); - if ( - this.allPointsInEmptyGridSpace(this.heldPieceTilesAdjusted([dx, dy])) - ) { - held.pos = newPos; - this.reDraw = true; - success = true; - } - }); - return success; + + if (this.heldPiece === null) return false; + const held = this.heldPiece; + const newPos: Point = addPoint(held.pos, [dx, dy]); + if ( + this.allPointsInEmptyGridSpace(this.heldPieceTilesAdjusted([dx, dy])) + ) { + held.pos = newPos; + this.reDraw = true; + return true; + } + return false; } private allPointsInEmptyGridSpace(points: Array): boolean { - return ( - points - .map((p): boolean => this.isGridSquareFilled(...p)) - .find((v) => v) === undefined - ); + for (const p of points ) { + if (this.isGridSquareFilled(...p)) { + return false; + } + } + return true; } // Should only be called when held piece is non none; uses unsafe type assertion. private heldPieceTilesAdjusted(offset: Point = [0, 0]): Array { + console.assert(this.heldPiece !== null); const held = this.heldPiece as HeldPiece; const adjusted: Array = held.tiles.map((t): Point => { @@ -172,23 +174,25 @@ export class GameState { } private flashHeldToGrid(): void { - ifSome(this.heldPiece, (held) => { - this.heldPieceTilesAdjusted().forEach((pos) => { - const index = posToGridIndex(...pos); - this.grid[index] = held.schema.color; - }); - - this.heldPiece = null; - this.reDraw = true; - this.checkForTetris(); + if (this.heldPiece === null) { + return; + } + const held = this.heldPiece; + this.heldPieceTilesAdjusted().forEach((pos) => { + const index = posToGridIndex(...pos); + this.grid[index] = held.schema.color; }); + + this.heldPiece = null; + this.reDraw = true; + this.checkForTetris(); } private checkForTetris(): void { // Iterate through rows, starting at bottom and going to top for (let i = 0; i < this.grid.length - GRID_WIDTH; i += GRID_WIDTH) { // While the current row is completely filled, thus tetris - while (this.grid.slice(i, i + GRID_WIDTH).every((t) => isSome(t))) { + while (this.grid.slice(i, i + GRID_WIDTH).every((t) => t !== null)) { // Remove all of the tiles from the current row. this.grid.splice(i, GRID_WIDTH); // Then fill the empty space with new tiles @@ -204,10 +208,13 @@ export class GameState { if (x >= GRID_WIDTH || x < 0 || y >= GRID_HEIGHT) return true; const index = posToGridIndex(x, y); - if (isSome(this.grid[index])) { - return true; + + // There's a bug here where sometimes a tile can be undefined. It's supposed to only ever be a valid tile or null. + // Couldn't find it so just check for undefined too. + if (this.grid[index] === null || this.grid[index] === undefined) { + return false; } - return false; + return true; } private static drawTile( diff --git a/src/lib/controller.ts b/src/lib/controller.ts index 265d05d..390148c 100644 --- a/src/lib/controller.ts +++ b/src/lib/controller.ts @@ -1,4 +1,3 @@ -import { ifSome } from "./option"; export const enum KeyEventType { IfCaught, @@ -57,21 +56,24 @@ export class Keyboard { } pollSpecificKey(key: T, callback: () => void): void { const v = this.keyQueue.get(key); - ifSome(v, (vv) => { - if (!this.keysPressed.has(vv.outputValue)) { - if (vv.eventType === KeyEventType.IfCaught || vv.polled) { - vv.polled = false; - this.keyQueue.delete(vv.outputValue); - return; - } + if (v === null || v === undefined) { + return; + } + if (!this.keysPressed.has(v.outputValue)) { + if (v.eventType === KeyEventType.IfCaught || v.polled) { + v.polled = false; + this.keyQueue.delete(v.outputValue); + return; } - if (!vv.polled && vv.eventType === KeyEventType.OnlyOnce) { - callback(); - } else if (vv.eventType !== KeyEventType.OnlyOnce) { - callback(); - } - vv.polled = true; - }); + } + if (!v.polled && v.eventType === KeyEventType.OnlyOnce) { + callback(); + } else if (v.eventType !== KeyEventType.OnlyOnce) { + callback(); + } + v.polled = true; + + } poll(): Array { @@ -100,16 +102,19 @@ export class Keyboard { private keyDown(key: string): void { const mapped = this.keyMap.get(key); - ifSome(mapped, (m) => { - this.keysPressed.add(m.outputValue); - if (!this.keyQueue.has(m.outputValue)) - this.keyQueue.set(m.outputValue, m); - }); + if (mapped === null || mapped === undefined) { + return; + } + this.keysPressed.add(mapped.outputValue); + if (!this.keyQueue.has(mapped.outputValue)) { + this.keyQueue.set(mapped.outputValue, mapped); + } } private keyUp(key: string): void { const mapped = this.keyMap.get(key); - ifSome(mapped, (m) => { - this.keysPressed.delete(m.outputValue); - }); + if (mapped === null || mapped === undefined) { + return; + } + this.keysPressed.delete(mapped.outputValue); } } diff --git a/src/lib/option.ts b/src/lib/option.ts index 6c04f8a..2fcd439 100644 --- a/src/lib/option.ts +++ b/src/lib/option.ts @@ -1,67 +1,12 @@ -// -// Options (inspired by rust) -// +type Option = null | undefined | T; -// Most methods like `document.getElementById("something")` will naturally return something of the type `Option` -// This type has been chosen to remain compatible with most vanilla JS methods. -// A more capable option type could have been made by creating an option object, but would lose compatibility with JS. -export type Option = null | undefined | T; - -export function isNone(input: Option): boolean { - if (input === null || input === undefined) { - return true; - } - return false; -} - -export function isSome(input: Option): boolean { - if (input === null || input === undefined) { - return false; - } - return true; -} - -type SingleArgCallback = (v: T) => void; -type EmptyCallback = () => void; - -/** - * If the input `Option` is some, then run the `doAfter` callback. - * Intended to mimic rust's conditional enum matching pattern: `if let Some(v) = opt {}` - */ -export function ifSome( - input: Option, - doAfter: SingleArgCallback -): void { - if (isSome(input)) { - doAfter(input as T); - } -} - -export function ifNone(input: Option, doAfter: EmptyCallback): void { - if (isNone(input)) { - doAfter(); - } -} - -// Not sure how ergonomic this is in actual use. It may get axed. -export function ifEither( - input: Option, - doIfSome: SingleArgCallback, - doIfNone: EmptyCallback -): void { - if (isSome(input)) { - doIfSome(input as T); - return; - } - doIfNone(); -} /** Unwrap option of `null|undefined|T` to `T` throw error if value is not `T`. `expect()` is preferred to this function as it gives better error messages */ export function unwrap(input: Option): T { - if (isNone(input)) { + if (input === null || input === undefined) { throw new TypeError("Unwrap called on null/undefined value"); } return input as T; @@ -71,7 +16,7 @@ export function unwrap(input: Option): T { Unwrap option of `null|undefined|T` to `T` throw error with `exceptionMessage` if value is not `T` */ export function expect(input: Option, exceptionMessage: string): T { - if (isNone(input)) { + if (input === null || input === undefined) { throw new TypeError(exceptionMessage); } return input as T; diff --git a/src/lib/util.ts b/src/lib/util.ts index 6035f21..52014c9 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -1,4 +1,3 @@ -import { Option, ifSome } from "./option"; export type Point = [number, number]; export function addPoint(p1: Point, p2: Point): Point { @@ -10,24 +9,28 @@ export function addPoint(p1: Point, p2: Point): Point { // // Who needs Jquery? -export function $(elementId: string): Option { +export function $(elementId: string): null | HTMLElement { return document.getElementById(elementId); } export function createCanvas( width: number, height: number -): Option<{ canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D }> { - let ret = null; - ifSome(document.createElement("canvas"), (canvas) => { - canvas.width = width; - canvas.height = height; - ifSome(canvas.getContext("2d"), (ctx) => { - ctx.imageSmoothingEnabled = false; - ret = { canvas, ctx }; - }); - }); - return ret; +): null | { canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D } { + const canvas = document.createElement("canvas"); + if (canvas === null) { + return null; + } + canvas.width = width; + canvas.height = height; + + const ctx = canvas.getContext("2d"); + if (ctx === null) { + return null; + } + ctx.imageSmoothingEnabled = false; + return { canvas, ctx }; + } export function clearBody(): void { diff --git a/src/sidebar.ts b/src/sidebar.ts index e20708c..17431c4 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -1,6 +1,6 @@ import { SIDEBAR_HEIGHT, SIDEBAR_WIDTH, TILE_SIZE } from "./constants"; import { HeldPiece } from "./heldPiece"; -import { addPoint, minMax, pickRandom } from "./lib/util"; +import { minMax, pickRandom } from "./lib/util"; import { TETRIS_PIECE, TETRIS_PIECE_LIST } from "./tetrisPieces"; import { TextureStore } from "./textureStore"; diff --git a/tetris_mockup.xcf b/tetris_mockup.xcf deleted file mode 100644 index d5f722ca4c3ac748a132183a0b50fb2d707d3904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242385 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