advent22/ui/src/lib/rects/door.ts
Jörn-Michael Miehe f72d8e65a5 🧰 ui: tooling update
- new devcontainer spec "18-bookworm" -> "20-trixie"
- fixed "vue serve"
- improved vscode settings.json
- improved typescript config
- minor formatting
2026-02-12 21:59:41 +00:00

54 lines
1.3 KiB
TypeScript

import { type VueLike, unwrap_vuelike } from "../helpers";
import type { DoorSaved } from "../model";
import { Rectangle } from "./rectangle";
import { Vector2D } from "./vector2d";
export class Door {
public static readonly MIN_DAY = 1;
private _day = Door.MIN_DAY;
public position: Rectangle;
constructor(position: VueLike<Rectangle>);
constructor(position: VueLike<Rectangle>, day: number);
constructor(position: VueLike<Rectangle>, day = Door.MIN_DAY) {
this.day = day;
this.position = unwrap_vuelike(position);
}
public get day(): number {
return this._day;
}
public set day(value: number | string) {
// integer coercion
let day = Number(value);
day =
!Number.isNaN(day) && Number.isFinite(day)
? Math.trunc(day)
: Door.MIN_DAY;
this._day = Math.max(day, Door.MIN_DAY);
}
public static load(serialized: DoorSaved): Door {
return new Door(
new Rectangle(
new Vector2D(serialized.x1, serialized.y1),
new Vector2D(serialized.x2, serialized.y2),
),
serialized.day,
);
}
public save(): DoorSaved {
return {
day: this.day,
x1: this.position.origin.x,
y1: this.position.origin.y,
x2: this.position.corner.x,
y2: this.position.corner.y,
};
}
}