cleaned up setupFeatures
This commit is contained in:
parent
d30cc8688f
commit
fbd01497e7
3 changed files with 43 additions and 70 deletions
|
@ -44,7 +44,7 @@ export default defineComponent({
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
nodes: Object as PropType<Record<string, Array<string | number>>>,
|
nodes: Object as PropType<Record<string, Array<string>>>,
|
||||||
append: Boolean
|
append: Boolean
|
||||||
},
|
},
|
||||||
inject: ["tab"],
|
inject: ["tab"],
|
||||||
|
@ -55,31 +55,25 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
return layers[this.modal].name || this.modal;
|
return layers[this.modal].name || this.modal;
|
||||||
},
|
},
|
||||||
rows(): Record<string | number, Array<string | number>> {
|
rows(): Record<string, Array<string>> {
|
||||||
if (this.nodes != undefined) {
|
if (this.nodes != undefined) {
|
||||||
return this.nodes;
|
return this.nodes;
|
||||||
}
|
}
|
||||||
const rows = Object.keys(layers).reduce(
|
const rows = Object.keys(layers).reduce((acc: Record<string, Array<string>>, curr) => {
|
||||||
(acc: Record<string | number, Array<string | number>>, curr) => {
|
if (!(layers[curr].displayRow in acc)) {
|
||||||
if (!(layers[curr].displayRow in acc)) {
|
acc[layers[curr].displayRow] = [];
|
||||||
acc[layers[curr].displayRow] = [];
|
}
|
||||||
}
|
if (layers[curr].position != undefined) {
|
||||||
if (layers[curr].position != undefined) {
|
acc[layers[curr].displayRow][layers[curr].position!] = curr;
|
||||||
acc[layers[curr].displayRow][layers[curr].position!] = curr;
|
} else {
|
||||||
} else {
|
acc[layers[curr].displayRow].push(curr);
|
||||||
acc[layers[curr].displayRow].push(curr);
|
}
|
||||||
}
|
return acc;
|
||||||
return acc;
|
}, {});
|
||||||
},
|
return Object.keys(rows).reduce((acc: Record<string, Array<string>>, curr) => {
|
||||||
{}
|
acc[curr] = rows[curr].filter(layer => layer);
|
||||||
);
|
return acc;
|
||||||
return Object.keys(rows).reduce(
|
}, {});
|
||||||
(acc: Record<string | number, Array<string | number>>, curr) => {
|
|
||||||
acc[curr] = rows[curr].filter(layer => layer);
|
|
||||||
return acc;
|
|
||||||
},
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
@ -58,7 +58,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
layer = clone(layer);
|
layer = clone(layer);
|
||||||
|
|
||||||
setDefault(player, "layers", {});
|
setDefault(player, "layers", {});
|
||||||
player.layers![layer.id] = applyPlayerData(
|
player.layers[layer.id] = applyPlayerData(
|
||||||
{
|
{
|
||||||
points: new Decimal(0),
|
points: new Decimal(0),
|
||||||
unlocked: false,
|
unlocked: false,
|
||||||
|
@ -74,7 +74,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
confirmRespecBuyables: false,
|
confirmRespecBuyables: false,
|
||||||
...(layer.startData?.() || {})
|
...(layer.startData?.() || {})
|
||||||
},
|
},
|
||||||
player.layers![layer.id]
|
player.layers[layer.id]
|
||||||
);
|
);
|
||||||
|
|
||||||
// Set default property values
|
// Set default property values
|
||||||
|
@ -92,10 +92,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.upgrades) {
|
if (layer.upgrades) {
|
||||||
setupFeatures<NonNullable<RawLayer["upgrades"]>, NonNullable<Layer["upgrades"]>, Upgrade>(
|
setupFeatures<NonNullable<RawLayer["upgrades"]>, Upgrade>(layer.id, layer.upgrades);
|
||||||
layer.id,
|
|
||||||
layer.upgrades
|
|
||||||
);
|
|
||||||
setRowCol(layer.upgrades);
|
setRowCol(layer.upgrades);
|
||||||
for (const id in layer.upgrades.data) {
|
for (const id in layer.upgrades.data) {
|
||||||
layer.upgrades.data[id].bought = function() {
|
layer.upgrades.data[id].bought = function() {
|
||||||
|
@ -188,11 +185,10 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.achievements) {
|
if (layer.achievements) {
|
||||||
setupFeatures<
|
setupFeatures<NonNullable<RawLayer["achievements"]>, Achievement>(
|
||||||
NonNullable<RawLayer["achievements"]>,
|
layer.id,
|
||||||
NonNullable<Layer["achievements"]>,
|
layer.achievements
|
||||||
Achievement
|
);
|
||||||
>(layer.id, layer.achievements);
|
|
||||||
setRowCol(layer.achievements);
|
setRowCol(layer.achievements);
|
||||||
for (const id in layer.achievements.data) {
|
for (const id in layer.achievements.data) {
|
||||||
layer.achievements.data[id].earned = function() {
|
layer.achievements.data[id].earned = function() {
|
||||||
|
@ -207,11 +203,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.challenges) {
|
if (layer.challenges) {
|
||||||
setupFeatures<
|
setupFeatures<NonNullable<RawLayer["challenges"]>, Challenge>(layer.id, layer.challenges);
|
||||||
NonNullable<RawLayer["challenges"]>,
|
|
||||||
NonNullable<Layer["challenges"]>,
|
|
||||||
Challenge
|
|
||||||
>(layer.id, layer.challenges);
|
|
||||||
setRowCol(layer.challenges);
|
setRowCol(layer.challenges);
|
||||||
layer.activeChallenge = function() {
|
layer.activeChallenge = function() {
|
||||||
return Object.values(this.challenges!.data).find(
|
return Object.values(this.challenges!.data).find(
|
||||||
|
@ -300,10 +292,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.buyables) {
|
if (layer.buyables) {
|
||||||
setupFeatures<NonNullable<RawLayer["buyables"]>, NonNullable<Layer["buyables"]>, Buyable>(
|
setupFeatures<NonNullable<RawLayer["buyables"]>, Buyable>(layer.id, layer.buyables);
|
||||||
layer.id,
|
|
||||||
layer.buyables
|
|
||||||
);
|
|
||||||
setRowCol(layer.buyables);
|
setRowCol(layer.buyables);
|
||||||
setDefault(layer.buyables, "respec", undefined, false);
|
setDefault(layer.buyables, "respec", undefined, false);
|
||||||
setDefault(
|
setDefault(
|
||||||
|
@ -350,11 +339,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.clickables) {
|
if (layer.clickables) {
|
||||||
setupFeatures<
|
setupFeatures<NonNullable<RawLayer["clickables"]>, Clickable>(layer.id, layer.clickables);
|
||||||
NonNullable<RawLayer["clickables"]>,
|
|
||||||
NonNullable<Layer["clickables"]>,
|
|
||||||
Clickable
|
|
||||||
>(layer.id, layer.clickables);
|
|
||||||
setRowCol(layer.clickables);
|
setRowCol(layer.clickables);
|
||||||
setDefault(layer.clickables, "masterButtonClick", undefined, false);
|
setDefault(layer.clickables, "masterButtonClick", undefined, false);
|
||||||
if (layer.clickables.masterButtonDisplay != undefined) {
|
if (layer.clickables.masterButtonDisplay != undefined) {
|
||||||
|
@ -373,11 +358,7 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.milestones) {
|
if (layer.milestones) {
|
||||||
setupFeatures<
|
setupFeatures<NonNullable<RawLayer["milestones"]>, Milestone>(layer.id, layer.milestones);
|
||||||
NonNullable<RawLayer["milestones"]>,
|
|
||||||
NonNullable<Layer["milestones"]>,
|
|
||||||
Milestone
|
|
||||||
>(layer.id, layer.milestones);
|
|
||||||
for (const id in layer.milestones.data) {
|
for (const id in layer.milestones.data) {
|
||||||
layer.milestones.data[id].earned = function() {
|
layer.milestones.data[id].earned = function() {
|
||||||
return (
|
return (
|
||||||
|
@ -415,12 +396,9 @@ export function addLayer(layer: RawLayer, player?: Partial<PlayerData>): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (layer.grids) {
|
if (layer.grids) {
|
||||||
setupFeatures<NonNullable<RawLayer["grids"]>, NonNullable<Layer["grids"]>, Grid>(
|
setupFeatures<NonNullable<RawLayer["grids"]>, Grid>(layer.id, layer.grids);
|
||||||
layer.id,
|
|
||||||
layer.grids
|
|
||||||
);
|
|
||||||
for (const id in layer.grids.data) {
|
for (const id in layer.grids.data) {
|
||||||
setDefault(player.layers![layer.id].grids, id, {});
|
setDefault(player.layers[layer.id].grids, id, {});
|
||||||
layer.grids.data[id].getData = function(cell): State {
|
layer.grids.data[id].getData = function(cell): State {
|
||||||
if (playerProxy.layers[this.layer].grids[id][cell] != undefined) {
|
if (playerProxy.layers[this.layer].grids[id][cell] != undefined) {
|
||||||
return playerProxy.layers[this.layer].grids[id][cell];
|
return playerProxy.layers[this.layer].grids[id][cell];
|
||||||
|
@ -578,17 +556,18 @@ function setRowCol<T extends GridFeatures<S>, S extends Feature>(features: RawGr
|
||||||
features.cols = maxCol;
|
features.cols = maxCol;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupFeatures<T extends RawFeatures<R, S>, R extends Features<S>, S extends Feature>(
|
function setupFeatures<
|
||||||
layer: string,
|
T extends RawFeatures<R, S, unknown>,
|
||||||
features: T
|
S extends Feature,
|
||||||
) {
|
R extends Features<S> = Features<S>
|
||||||
|
>(layer: string, features: T) {
|
||||||
features.layer = layer;
|
features.layer = layer;
|
||||||
for (const id in features.data) {
|
for (const id in features.data) {
|
||||||
const feature = features.data[id];
|
const feature = features.data[id];
|
||||||
(feature as Feature).id = id;
|
(feature as S).id = id;
|
||||||
(feature as Feature).layer = layer;
|
(feature as S).layer = layer;
|
||||||
if (feature.unlocked == undefined) {
|
if ((feature as S).unlocked == undefined) {
|
||||||
(feature as Feature).unlocked = true;
|
(feature as S).unlocked = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -599,7 +578,7 @@ function setDefault<T, K extends keyof T>(
|
||||||
value: T[K],
|
value: T[K],
|
||||||
forceCached?: boolean
|
forceCached?: boolean
|
||||||
): asserts object is Exclude<T, K> & Required<Pick<T, K>> {
|
): asserts object is Exclude<T, K> & Required<Pick<T, K>> {
|
||||||
if (object[key] == undefined && value != undefined) {
|
if (object[key] === undefined && value != undefined) {
|
||||||
object[key] = value;
|
object[key] = value;
|
||||||
}
|
}
|
||||||
if (object[key] != undefined && isFunction(object[key]) && forceCached != undefined) {
|
if (object[key] != undefined && isFunction(object[key]) && forceCached != undefined) {
|
||||||
|
|
6
src/typings/features/feature.d.ts
vendored
6
src/typings/features/feature.d.ts
vendored
|
@ -9,16 +9,16 @@ export interface Feature {
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RawFeatures<T extends Features<S>, S extends Feature>
|
export interface RawFeatures<T extends Features<S>, S extends Feature, R = RawFeature<S>>
|
||||||
extends Partial<Omit<Computable<T>, "data">>,
|
extends Partial<Omit<Computable<T>, "data">>,
|
||||||
ThisType<T> {
|
ThisType<T> {
|
||||||
layer?: string;
|
layer?: string;
|
||||||
data: Record<string | number, RawFeature<S>>;
|
data: Record<string, R>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Features<T extends Feature> {
|
export interface Features<T extends Feature> {
|
||||||
layer: string;
|
layer: string;
|
||||||
data: Record<string | number, T>;
|
data: Record<string, T>;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue