import { canvas2d } from "./lib/html"; const BLOWUP = 4; const WIDTH = 240; const HEIGHT = 135; type Lookup2d = (x: number, y: number) => number; function dim(width: number, height: number): Lookup2d { return function xy(x: number, y: number) { return ( (((x % width) + width) % width) + width * (((y % height) + height) % height) ); }; } class IslandGrid { data: number[]; xy: Lookup2d; constructor(public width: number, public height: number) { this.data = Array(width * height).fill(0); this.xy = dim(width, height); } } function renderIslands(islands: IslandGrid, cx: CanvasRenderingContext2D) { for (let y = 0; y < islands.height; y++) { for (let x = 0; x < islands.width; x++) { const tile = islands.data[islands.xy(x, y)]; switch (tile) { case 0: cx.fillStyle = "blue"; break; case 1: cx.fillStyle = "yellow"; break; case 2: cx.fillStyle = "#00ff00"; break; case 3: cx.fillStyle = "#008800"; break; default: cx.fillStyle = "#666666"; break; } cx.fillRect(x, y, 1, 1); } } } export function IslandApplet() { const [canvas, cx] = canvas2d({ width: WIDTH * BLOWUP, height: HEIGHT * BLOWUP, }); cx.scale(BLOWUP, BLOWUP); const islands = new IslandGrid(WIDTH, HEIGHT); islands.data[islands.xy(5, 5)] = 1; islands.data[islands.xy(6, 5)] = 2; islands.data[islands.xy(7, 5)] = 3; islands.data[islands.xy(8, 5)] = 4; islands.data[islands.xy(9, 5)] = 5; renderIslands(islands, cx); return [canvas]; } (globalThis as any).IslandApplet = IslandApplet;