mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2026-04-02 13:37:24 +02:00
feat: add labels module and integrate into PackedGraph
This commit is contained in:
parent
be82ddb0a4
commit
7bf33b6e65
3 changed files with 155 additions and 0 deletions
|
|
@ -12,4 +12,5 @@ import "./routes-generator";
|
||||||
import "./states-generator";
|
import "./states-generator";
|
||||||
import "./zones-generator";
|
import "./zones-generator";
|
||||||
import "./religions-generator";
|
import "./religions-generator";
|
||||||
|
import "./labels";
|
||||||
import "./provinces-generator";
|
import "./provinces-generator";
|
||||||
|
|
|
||||||
152
src/modules/labels.ts
Normal file
152
src/modules/labels.ts
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
declare global {
|
||||||
|
var Labels: LabelsModule;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Types ---
|
||||||
|
|
||||||
|
export interface StateLabelData {
|
||||||
|
i: number;
|
||||||
|
type: "state";
|
||||||
|
stateId: number;
|
||||||
|
text: string;
|
||||||
|
pathPoints: [number, number][];
|
||||||
|
startOffset: number;
|
||||||
|
fontSize: number;
|
||||||
|
letterSpacing: number;
|
||||||
|
transform: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BurgLabelData {
|
||||||
|
i: number;
|
||||||
|
type: "burg";
|
||||||
|
burgId: number;
|
||||||
|
group: string;
|
||||||
|
text: string;
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
dx: number;
|
||||||
|
dy: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CustomLabelData {
|
||||||
|
i: number;
|
||||||
|
type: "custom";
|
||||||
|
group: string;
|
||||||
|
text: string;
|
||||||
|
pathPoints: [number, number][];
|
||||||
|
startOffset: number;
|
||||||
|
fontSize: number;
|
||||||
|
letterSpacing: number;
|
||||||
|
transform: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type LabelData = StateLabelData | BurgLabelData | CustomLabelData;
|
||||||
|
|
||||||
|
// --- Implementation ---
|
||||||
|
|
||||||
|
class LabelsModule {
|
||||||
|
private getNextId(): number {
|
||||||
|
const labels = pack.labels;
|
||||||
|
if (labels.length === 0) return 0;
|
||||||
|
|
||||||
|
const existingIds = labels.map((l) => l.i).sort((a, b) => a - b);
|
||||||
|
for (let id = 0; id < existingIds[existingIds.length - 1]; id++) {
|
||||||
|
if (!existingIds.includes(id)) return id;
|
||||||
|
}
|
||||||
|
return existingIds[existingIds.length - 1] + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
getAll(): LabelData[] {
|
||||||
|
return pack.labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
get(id: number): LabelData | undefined {
|
||||||
|
return pack.labels.find((l) => l.i === id);
|
||||||
|
}
|
||||||
|
|
||||||
|
getByType(type: LabelData["type"]): LabelData[] {
|
||||||
|
return pack.labels.filter((l) => l.type === type);
|
||||||
|
}
|
||||||
|
|
||||||
|
getByGroup(group: string): LabelData[] {
|
||||||
|
return pack.labels.filter(
|
||||||
|
(l) => (l.type === "burg" || l.type === "custom") && l.group === group,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
getStateLabel(stateId: number): StateLabelData | undefined {
|
||||||
|
return pack.labels.find(
|
||||||
|
(l) => l.type === "state" && l.stateId === stateId,
|
||||||
|
) as StateLabelData | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
getBurgLabel(burgId: number): BurgLabelData | undefined {
|
||||||
|
return pack.labels.find(
|
||||||
|
(l) => l.type === "burg" && l.burgId === burgId,
|
||||||
|
) as BurgLabelData | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
addStateLabel(
|
||||||
|
data: Omit<StateLabelData, "i" | "type">,
|
||||||
|
): StateLabelData {
|
||||||
|
const label: StateLabelData = { i: this.getNextId(), type: "state", ...data };
|
||||||
|
pack.labels.push(label);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
addBurgLabel(data: Omit<BurgLabelData, "i" | "type">): BurgLabelData {
|
||||||
|
const label: BurgLabelData = { i: this.getNextId(), type: "burg", ...data };
|
||||||
|
pack.labels.push(label);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
addCustomLabel(
|
||||||
|
data: Omit<CustomLabelData, "i" | "type">,
|
||||||
|
): CustomLabelData {
|
||||||
|
const label: CustomLabelData = { i: this.getNextId(), type: "custom", ...data };
|
||||||
|
pack.labels.push(label);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLabel(id: number, updates: Partial<LabelData>): void {
|
||||||
|
const label = pack.labels.find((l) => l.i === id);
|
||||||
|
if (!label) return;
|
||||||
|
Object.assign(label, updates, { i: label.i, type: label.type });
|
||||||
|
}
|
||||||
|
|
||||||
|
removeLabel(id: number): void {
|
||||||
|
const index = pack.labels.findIndex((l) => l.i === id);
|
||||||
|
if (index !== -1) pack.labels.splice(index, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeByType(type: LabelData["type"]): void {
|
||||||
|
pack.labels = pack.labels.filter((l) => l.type !== type);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeByGroup(group: string): void {
|
||||||
|
pack.labels = pack.labels.filter(
|
||||||
|
(l) =>
|
||||||
|
!((l.type === "burg" || l.type === "custom") && l.group === group),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeStateLabel(stateId: number): void {
|
||||||
|
const index = pack.labels.findIndex(
|
||||||
|
(l) => l.type === "state" && l.stateId === stateId,
|
||||||
|
);
|
||||||
|
if (index !== -1) pack.labels.splice(index, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeBurgLabel(burgId: number): void {
|
||||||
|
const index = pack.labels.findIndex(
|
||||||
|
(l) => l.type === "burg" && l.burgId === burgId,
|
||||||
|
);
|
||||||
|
if (index !== -1) pack.labels.splice(index, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
clear(): void {
|
||||||
|
pack.labels = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.Labels = new LabelsModule();
|
||||||
|
|
@ -5,6 +5,7 @@ import type { Province } from "../modules/provinces-generator";
|
||||||
import type { River } from "../modules/river-generator";
|
import type { River } from "../modules/river-generator";
|
||||||
import type { Route } from "../modules/routes-generator";
|
import type { Route } from "../modules/routes-generator";
|
||||||
import type { State } from "../modules/states-generator";
|
import type { State } from "../modules/states-generator";
|
||||||
|
import type { LabelData } from "../modules/labels";
|
||||||
import type { Zone } from "../modules/zones-generator";
|
import type { Zone } from "../modules/zones-generator";
|
||||||
|
|
||||||
type TypedArray =
|
type TypedArray =
|
||||||
|
|
@ -62,5 +63,6 @@ export interface PackedGraph {
|
||||||
zones: Zone[];
|
zones: Zone[];
|
||||||
markers: any[];
|
markers: any[];
|
||||||
ice: any[];
|
ice: any[];
|
||||||
|
labels: LabelData[];
|
||||||
provinces: Province[];
|
provinces: Province[];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue