First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
import {
|
2022-01-14 04:25:47 +00:00
|
|
|
CoercableComponent,
|
|
|
|
persistent,
|
|
|
|
PersistentRef,
|
|
|
|
Replace,
|
|
|
|
setDefault,
|
|
|
|
StyleValue
|
|
|
|
} from "@/features/feature";
|
|
|
|
import { Link } from "@/features/links";
|
2022-01-25 04:23:30 +00:00
|
|
|
import Decimal from "@/util/bignum";
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
import {
|
2022-01-14 04:25:47 +00:00
|
|
|
Computable,
|
|
|
|
GetComputableType,
|
|
|
|
GetComputableTypeWithDefault,
|
|
|
|
processComputable,
|
|
|
|
ProcessedComputable
|
|
|
|
} from "@/util/computed";
|
|
|
|
import { createProxy } from "@/util/proxies";
|
|
|
|
import { createNanoEvents, Emitter } from "nanoevents";
|
2022-01-28 04:47:26 +00:00
|
|
|
import { customRef, Ref } from "vue";
|
2022-01-25 04:23:30 +00:00
|
|
|
import { globalBus } from "./events";
|
2022-01-14 04:25:47 +00:00
|
|
|
import player from "./player";
|
|
|
|
|
2022-01-25 04:23:30 +00:00
|
|
|
export interface LayerEvents {
|
|
|
|
// Generation
|
|
|
|
preUpdate: (diff: Decimal) => void;
|
|
|
|
// Actions (e.g. automation)
|
|
|
|
update: (diff: Decimal) => void;
|
|
|
|
// Effects (e.g. milestones)
|
|
|
|
postUpdate: (diff: Decimal) => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const layers: Record<string, Readonly<GenericLayer> | undefined> = {};
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
window.layers = layers;
|
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export interface Position {
|
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
}
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export interface LayerOptions {
|
|
|
|
id: string;
|
|
|
|
color?: Computable<string>;
|
|
|
|
display: Computable<CoercableComponent>;
|
|
|
|
classes?: Computable<Record<string, boolean>>;
|
|
|
|
style?: Computable<StyleValue>;
|
|
|
|
name?: Computable<string>;
|
|
|
|
minimizable?: Computable<boolean>;
|
|
|
|
forceHideGoBack?: Computable<boolean>;
|
|
|
|
minWidth?: Computable<number>;
|
|
|
|
links?: Computable<Link[]>;
|
|
|
|
}
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export interface BaseLayer {
|
|
|
|
minimized: PersistentRef<boolean>;
|
|
|
|
emitter: Emitter<LayerEvents>;
|
|
|
|
on: OmitThisParameter<Emitter<LayerEvents>["on"]>;
|
|
|
|
emit: <K extends keyof LayerEvents>(event: K, ...args: Parameters<LayerEvents[K]>) => void;
|
|
|
|
}
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export type Layer<T extends LayerOptions> = Replace<
|
|
|
|
T & BaseLayer,
|
|
|
|
{
|
|
|
|
color: GetComputableType<T["color"]>;
|
|
|
|
display: GetComputableType<T["display"]>;
|
|
|
|
classes: GetComputableType<T["classes"]>;
|
|
|
|
style: GetComputableType<T["style"]>;
|
|
|
|
name: GetComputableTypeWithDefault<T["name"], T["id"]>;
|
|
|
|
minWidth: GetComputableTypeWithDefault<T["minWidth"], 600>;
|
|
|
|
minimizable: GetComputableTypeWithDefault<T["minimizable"], true>;
|
|
|
|
forceHideGoBack: GetComputableType<T["forceHideGoBack"]>;
|
|
|
|
links: GetComputableType<T["links"]>;
|
|
|
|
}
|
|
|
|
>;
|
|
|
|
|
|
|
|
export type GenericLayer = Replace<
|
|
|
|
Layer<LayerOptions>,
|
|
|
|
{
|
|
|
|
name: ProcessedComputable<string>;
|
|
|
|
minWidth: ProcessedComputable<number>;
|
|
|
|
minimizable: ProcessedComputable<boolean>;
|
|
|
|
}
|
|
|
|
>;
|
|
|
|
|
2022-01-28 04:47:26 +00:00
|
|
|
export function createLayer<T extends LayerOptions>(optionsFunc: () => T): Ref<Layer<T>> {
|
|
|
|
let layer: Layer<T> | null = null;
|
|
|
|
|
|
|
|
return customRef(track => {
|
|
|
|
return {
|
|
|
|
get() {
|
|
|
|
if (layer == undefined) {
|
|
|
|
const partialLayer = optionsFunc() as T & Partial<BaseLayer>;
|
|
|
|
const emitter = (partialLayer.emitter = createNanoEvents<LayerEvents>());
|
|
|
|
partialLayer.on = emitter.on.bind(emitter);
|
|
|
|
partialLayer.emit = emitter.emit.bind(emitter);
|
|
|
|
|
|
|
|
partialLayer.minimized = persistent(false);
|
|
|
|
|
|
|
|
processComputable(partialLayer as T, "color");
|
|
|
|
processComputable(partialLayer as T, "display");
|
|
|
|
processComputable(partialLayer as T, "name");
|
|
|
|
setDefault(partialLayer, "name", partialLayer.id);
|
|
|
|
processComputable(partialLayer as T, "minWidth");
|
|
|
|
setDefault(partialLayer, "minWidth", 600);
|
|
|
|
processComputable(partialLayer as T, "minimizable");
|
|
|
|
setDefault(partialLayer, "minimizable", true);
|
|
|
|
processComputable(partialLayer as T, "links");
|
|
|
|
|
|
|
|
layer = createProxy(partialLayer as unknown as Layer<T>);
|
|
|
|
}
|
|
|
|
track();
|
|
|
|
return layer;
|
|
|
|
},
|
|
|
|
set() {
|
|
|
|
console.error("Layers are read-only!");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
});
|
2022-01-14 04:25:47 +00:00
|
|
|
}
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export function addLayer(
|
|
|
|
layer: GenericLayer,
|
|
|
|
player: { layers?: Record<string, Record<string, unknown>> }
|
|
|
|
): void {
|
2022-01-25 04:23:30 +00:00
|
|
|
console.info("Adding layer", layer.id);
|
|
|
|
if (layers[layer.id]) {
|
2022-01-14 04:25:47 +00:00
|
|
|
console.error(
|
|
|
|
"Attempted to add layer with same ID as existing layer",
|
2021-08-18 05:18:23 +00:00
|
|
|
layer.id,
|
2022-01-14 04:25:47 +00:00
|
|
|
layers[layer.id]
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
);
|
2022-01-14 04:25:47 +00:00
|
|
|
return;
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
}
|
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
setDefault(player, "layers", {});
|
|
|
|
if (player.layers[layer.id] == null) {
|
|
|
|
player.layers[layer.id] = {};
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
}
|
2022-01-14 04:25:47 +00:00
|
|
|
layers[layer.id] = layer;
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
globalBus.emit("addLayer", layer, player.layers[layer.id]);
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
}
|
|
|
|
|
2022-01-28 04:47:26 +00:00
|
|
|
export function getLayer<T extends GenericLayer>(layerID: string): T {
|
|
|
|
return layers[layerID] as T;
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
}
|
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export function removeLayer(layer: GenericLayer): void {
|
2022-01-25 04:23:30 +00:00
|
|
|
console.info("Removing layer", layer.id);
|
2022-01-14 04:25:47 +00:00
|
|
|
globalBus.emit("removeLayer", layer);
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
|
2022-01-25 04:23:30 +00:00
|
|
|
layers[layer.id] = undefined;
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
}
|
|
|
|
|
2022-01-14 04:25:47 +00:00
|
|
|
export function reloadLayer(layer: GenericLayer): void {
|
|
|
|
removeLayer(layer);
|
|
|
|
|
|
|
|
// Re-create layer
|
|
|
|
addLayer(layer, player);
|
First pass at typescript support
Oh man did this end up requiring a *ton* of other work as well.
There's still a few typing issues I still can't quite work out,
and others I'd like to improve when I have time. In fact, this version
doesn't even really work, it has a stack overflow error caused by
a tooltip for some reason have a tree inside it, which in turn has
another tooltip, etc. There's also 17 errors that I *really* feel like
shouldn't be there, but they are, and 113 warnings - mostly using !
to assert that things are non-null. Lots of work left to do, to sum up.
The reason I'm committing this now is because I really need to get to
work on my game jam, and since it won't use a tree or really many of
TMT-X's features, I can get away with using a broken engine :)
2021-08-17 04:30:54 +00:00
|
|
|
}
|
2022-01-25 04:23:30 +00:00
|
|
|
|
|
|
|
globalBus.on("update", function updateLayers(diff) {
|
|
|
|
Object.values(layers).forEach(layer => {
|
|
|
|
layer?.emit("preUpdate", diff);
|
|
|
|
});
|
|
|
|
Object.values(layers).forEach(layer => {
|
|
|
|
layer?.emit("update", diff);
|
|
|
|
});
|
|
|
|
Object.values(layers).forEach(layer => {
|
|
|
|
layer?.emit("postUpdate", diff);
|
|
|
|
});
|
|
|
|
});
|