2025-03-07 20:18:18 +01:00
|
|
|
import { rawUpgrades } from "./rawUpgrades";
|
2025-03-06 16:46:25 +01:00
|
|
|
|
|
|
|
export type colorString = string;
|
2025-03-06 14:06:02 +01:00
|
|
|
|
|
|
|
export type RawLevel = {
|
2025-03-07 20:18:18 +01:00
|
|
|
name: string;
|
|
|
|
size: number;
|
|
|
|
bricks: string;
|
2025-03-13 08:53:02 +01:00
|
|
|
svg: number | null;
|
2025-03-07 20:18:18 +01:00
|
|
|
color: string;
|
2025-03-06 14:06:02 +01:00
|
|
|
};
|
|
|
|
export type Level = {
|
2025-03-07 20:18:18 +01:00
|
|
|
name: string;
|
|
|
|
size: number;
|
|
|
|
bricks: colorString[];
|
|
|
|
svg: string;
|
|
|
|
color: string;
|
2025-03-10 15:05:48 +01:00
|
|
|
threshold: number;
|
|
|
|
sortKey: number;
|
2025-03-06 14:06:02 +01:00
|
|
|
};
|
|
|
|
|
2025-03-06 16:46:25 +01:00
|
|
|
export type Palette = { [k: string]: string };
|
2025-03-06 14:06:02 +01:00
|
|
|
|
2025-03-06 16:46:25 +01:00
|
|
|
export type Upgrade = {
|
2025-03-07 20:18:18 +01:00
|
|
|
threshold: number;
|
|
|
|
giftable: boolean;
|
|
|
|
id: PerkId;
|
|
|
|
name: string;
|
|
|
|
icon: string;
|
|
|
|
max: number;
|
|
|
|
help: (lvl: number) => string;
|
|
|
|
fullHelp: string;
|
|
|
|
requires: PerkId | "";
|
2025-03-06 16:46:25 +01:00
|
|
|
};
|
2025-03-06 14:06:02 +01:00
|
|
|
|
2025-03-06 16:46:25 +01:00
|
|
|
export type PerkId = (typeof rawUpgrades)[number]["id"];
|
2025-03-06 14:06:02 +01:00
|
|
|
|
|
|
|
declare global {
|
2025-03-07 20:18:18 +01:00
|
|
|
interface Window {
|
|
|
|
webkitAudioContext?: typeof AudioContext;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface Document {
|
|
|
|
webkitFullscreenEnabled?: boolean;
|
|
|
|
webkitCancelFullScreen?: () => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface Element {
|
|
|
|
webkitRequestFullscreen: typeof Element.requestFullscreen;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface MediaStream {
|
|
|
|
// https://devdoc.net/web/developer.mozilla.org/en-US/docs/Web/API/CanvasCaptureMediaStream.html
|
|
|
|
// On firefox, the capture stream has the requestFrame option
|
|
|
|
// instead of the track, go figure
|
|
|
|
requestFrame?: () => void;
|
|
|
|
}
|
2025-03-07 11:34:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export type BallLike = {
|
2025-03-07 20:18:18 +01:00
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
vx?: number;
|
|
|
|
vy?: number;
|
|
|
|
};
|
2025-03-06 16:46:25 +01:00
|
|
|
|
2025-03-07 11:34:11 +01:00
|
|
|
export type Coin = {
|
2025-03-07 20:18:18 +01:00
|
|
|
points: number;
|
|
|
|
color: colorString;
|
|
|
|
x: number;
|
|
|
|
y: number;
|
2025-03-10 15:05:48 +01:00
|
|
|
previousX: number;
|
|
|
|
previousY: number;
|
2025-03-07 20:18:18 +01:00
|
|
|
vx: number;
|
|
|
|
vy: number;
|
|
|
|
sx: number;
|
|
|
|
sy: number;
|
|
|
|
a: number;
|
|
|
|
sa: number;
|
|
|
|
weight: number;
|
|
|
|
destroyed?: boolean;
|
|
|
|
coloredABrick?: boolean;
|
|
|
|
};
|
2025-03-06 16:46:25 +01:00
|
|
|
export type Ball = {
|
2025-03-07 20:18:18 +01:00
|
|
|
x: number;
|
2025-03-10 15:05:48 +01:00
|
|
|
previousX: number;
|
2025-03-07 20:18:18 +01:00
|
|
|
y: number;
|
2025-03-10 15:05:48 +01:00
|
|
|
previousY: number;
|
2025-03-07 20:18:18 +01:00
|
|
|
vx: number;
|
|
|
|
vy: number;
|
2025-03-10 15:05:48 +01:00
|
|
|
previousVX: number;
|
|
|
|
previousVY: number;
|
2025-03-07 20:18:18 +01:00
|
|
|
sx: number;
|
|
|
|
sy: number;
|
|
|
|
sparks: number;
|
|
|
|
piercedSinceBounce: number;
|
|
|
|
hitSinceBounce: number;
|
|
|
|
hitItem: { index: number; color: string }[];
|
2025-03-10 15:05:48 +01:00
|
|
|
bouncesList: { x: number; y: number }[];
|
2025-03-07 20:18:18 +01:00
|
|
|
sapperUses: number;
|
|
|
|
destroyed?: boolean;
|
|
|
|
};
|
2025-03-06 16:46:25 +01:00
|
|
|
|
2025-03-10 15:05:48 +01:00
|
|
|
interface BaseFlash {
|
2025-03-11 13:56:42 +01:00
|
|
|
time: number;
|
2025-03-07 20:18:18 +01:00
|
|
|
color: colorString;
|
|
|
|
duration: number;
|
|
|
|
size: number;
|
|
|
|
destroyed?: boolean;
|
2025-03-10 15:05:48 +01:00
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
}
|
2025-03-11 13:56:42 +01:00
|
|
|
interface ParticleFlash extends BaseFlash {
|
|
|
|
type: "particle";
|
2025-03-10 15:05:48 +01:00
|
|
|
vx: number;
|
|
|
|
vy: number;
|
|
|
|
ethereal: boolean;
|
|
|
|
}
|
|
|
|
|
2025-03-11 13:56:42 +01:00
|
|
|
interface TextFlash extends BaseFlash {
|
|
|
|
type: "text";
|
|
|
|
text: string;
|
2025-03-10 15:05:48 +01:00
|
|
|
}
|
|
|
|
|
2025-03-11 13:56:42 +01:00
|
|
|
interface BallFlash extends BaseFlash {
|
|
|
|
type: "ball";
|
2025-03-10 15:05:48 +01:00
|
|
|
}
|
|
|
|
|
2025-03-11 13:56:42 +01:00
|
|
|
export type Flash = ParticleFlash | TextFlash | BallFlash;
|
2025-03-06 16:46:25 +01:00
|
|
|
|
2025-03-07 20:18:18 +01:00
|
|
|
export type RunStats = {
|
|
|
|
started: number;
|
|
|
|
levelsPlayed: number;
|
|
|
|
runTime: number;
|
|
|
|
coins_spawned: number;
|
|
|
|
score: number;
|
|
|
|
bricks_broken: number;
|
|
|
|
misses: number;
|
|
|
|
balls_lost: number;
|
|
|
|
puck_bounces: number;
|
|
|
|
upgrades_picked: number;
|
|
|
|
max_combo: number;
|
|
|
|
max_level: number;
|
|
|
|
};
|
2025-03-06 16:46:25 +01:00
|
|
|
|
2025-03-10 15:05:48 +01:00
|
|
|
export type PerksMap = {
|
2025-03-07 20:53:39 +01:00
|
|
|
[k in PerkId]: number;
|
2025-03-10 15:05:48 +01:00
|
|
|
};
|
|
|
|
|
2025-03-07 20:18:18 +01:00
|
|
|
export type RunHistoryItem = RunStats & {
|
2025-03-07 20:53:39 +01:00
|
|
|
perks?: PerksMap;
|
2025-03-07 20:18:18 +01:00
|
|
|
appVersion?: string;
|
|
|
|
};
|