Typed existing game.ts

This commit is contained in:
Renan LE CARO 2025-03-07 11:34:11 +01:00
parent 3cb662bc92
commit 6850d3b652
6 changed files with 632 additions and 444 deletions

File diff suppressed because it is too large Load diff

54
src/options.ts Normal file
View file

@ -0,0 +1,54 @@
import {fitSize, gameCanvas} from "./game";
export const options = {
sound: {
default: true,
name: `Game sounds`,
help: `Can slow down some phones.`,
disabled: () => false,
},
"mobile-mode": {
default: window.innerHeight > window.innerWidth,
name: `Mobile mode`,
help: `Leaves space for your thumb.`,
afterChange() {
fitSize();
},
disabled: () => false,
},
basic: {
default: false,
name: `Basic graphics`,
help: `Better performance on older devices.`,
disabled: () => false,
},
pointerLock: {
default: false,
name: `Mouse pointer lock`,
help: `Locks and hides the mouse cursor.`,
disabled: () => !gameCanvas.requestPointerLock,
},
easy: {
default: false,
name: `Kids mode`,
help: `Start future runs with "slower ball".`,
disabled: () => false,
}, // Could not get the sharing to work without loading androidx and all the modern android things so for now i'll just disable sharing in the android app
record: {
default: false,
name: `Record gameplay videos`,
help: `Get a video of each level.`,
disabled() {
return window.location.search.includes("isInWebView=true");
},
},
} as {[k:string]:OptionDef}
export type OptionDef = {
default:boolean;
name:string;
help:string;
disabled:()=>boolean
afterChange?:()=>void
}
export type OptionId = keyof (typeof options)

View file

@ -212,8 +212,8 @@ export const rawUpgrades = [
id: "compound_interest",
giftable: true,
name: "Compound interest",
max: 3,
help: (lvl) => `+${lvl} combo / brick broken, -${lvl} combo per coin lost`,
max: 1,
help: () => `+1 combo per brick broken, resets on coin lost`,
fullHelp: `Your combo will grow by one every time you break a brick, spawning more and more coin with every brick you break. Be sure however to catch every one of those coins
with your puck, as any lost coin will decrease your combo by one point. One your combo is above the minimum, the bottom of the play area will

192
src/types.d.ts vendored
View file

@ -1,103 +1,143 @@
import { rawUpgrades } from "./rawUpgrades";
import {rawUpgrades} from "./rawUpgrades";
export type colorString = string;
export type RawLevel = {
name: string;
size: number;
bricks: string;
svg: string;
color: string;
name: string;
size: number;
bricks: string;
svg: string;
color: string;
};
export type Level = {
name: string;
size: number;
bricks: colorString[];
svg: string;
color: string;
threshold?: number;
sortKey?: number;
name: string;
size: number;
bricks: colorString[];
svg: string;
color: string;
threshold?: number;
sortKey?: number;
};
export type Palette = { [k: string]: string };
export type Upgrade = {
threshold: number;
giftable: boolean;
id: string;
name: string;
icon: string;
max: number;
help: (lvl: string) => string;
fullHelp: string;
requires: PerkId | "";
threshold: number;
giftable: boolean;
id: PerkId;
name: string;
icon: string;
max: number;
help: (lvl: number) => string;
fullHelp: string;
requires: PerkId | "";
};
export type PerkId = (typeof rawUpgrades)[number]["id"];
declare global {
interface Window {
webkitAudioContext?: typeof AudioContext;
}
interface Document {
webkitFullscreenEnabled?: boolean;
webkitCancelFullScreen?: ()=>void;
}
interface Element {
webkitRequestFullscreen: typeof Element.requestFullscreen
}
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
}
}
export type Coin={
points:number;
color: colorString;
x:number;
y:number;
previousx:number;
previousy:number;
vx:number;
vy:number;
sx:number;
sy:number;
a:number;
sa:number;
weight:number;
destroyed?:boolean;
coloredABrick?:boolean;
export type BallLike = {
x: number;
y: number;
vx?: number;
vy?: number;
}
export type Coin = {
points: number;
color: colorString;
x: number;
y: number;
previousx: number;
previousy: number;
vx: number;
vy: number;
sx: number;
sy: number;
a: number;
sa: number;
weight: number;
destroyed?: boolean;
coloredABrick?: boolean;
}
export type Ball = {
x:number;
previousx:number;
y:number;
previousy:number;
vx:number;
vy:number;
sx:number;
sy:number;
sparks:number;
piercedSinceBounce:number;
hitSinceBounce:number;
hitItem: {index:number, color:string}[],
sapperUses:number;
destroyed?:boolean;
x: number;
previousx: number;
y: number;
previousy: number;
vx: number;
vy: number;
sx: number;
sy: number;
sparks: number;
piercedSinceBounce: number;
hitSinceBounce: number;
hitItem: { index: number, color: string }[];
bouncesList?: { x: number, y: number }[];
sapperUses: number;
destroyed?: boolean;
previousvx?: number;
previousvy?: number;
}
export type FlashTypes= "text"|"particle"|'ball'
export type FlashTypes = "text" | "particle" | 'ball'
export type Flash = {
type: FlashTypes;
text?:string;
time:number;
color:colorString;
x:number;
y:number;
duration:number;
size:number;
vx?:number;
vy?:number;
ethereal?:boolean;
destroyed?:boolean;
type: FlashTypes;
text?: string;
time: number;
color: colorString;
x: number;
y: number;
duration: number;
size: number;
vx?: number;
vy?: number;
ethereal?: boolean;
destroyed?: boolean;
}
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;
}
export type RunHistoryItem =RunStats & {
perks?: {[k in PerkId]:number};
appVersion?:string;
}