diff --git a/src/data/layers/main.ts b/src/data/layers/main.ts index a55b03e..a47fb49 100644 --- a/src/data/layers/main.ts +++ b/src/data/layers/main.ts @@ -36,16 +36,33 @@ type ActionNodeData = { log: LogEntry[]; }; +enum LinkType { + LossOnly, + GainOnly, + Both +} + +// Links cause gain/loss of one resource to also affect other resources +type ResourceLink = { + resource: string; + amount: DecimalSource; + linkType: LinkType; +}; + type Resource = { readonly name: string; readonly color: string; readonly node: BoardNode; + readonly links?: ResourceLink[]; readonly maxAmount: DecimalSource; amount: DecimalSource; }; const resources = { - time: createResource("time", "#3EB489", 24 * 60 * 60, 24 * 60 * 60), + time: createResource("time", "#3EB489", 24 * 60 * 60, 24 * 60 * 60, [ + { resource: "social", amount: 1 / (60 * 60), linkType: LinkType.LossOnly }, + { resource: "mental", amount: 1 / (120 * 60), linkType: LinkType.LossOnly } + ]), energy: createResource("energy", "#FFA500", 100, 100), social: createResource("social", "#800080", 100, 100), mental: createResource("mental", "#32CD32", 100, 100), @@ -56,7 +73,8 @@ function createResource( name: string, color: string, maxAmount: DecimalSource, - defaultAmount: DecimalSource + defaultAmount: DecimalSource, + links?: ResourceLink[] ): Resource { const node = computed(() => player.layers.main?.boards.main.nodes.find( @@ -67,6 +85,7 @@ function createResource( return { name, color, + links, get node() { // Should only run once, but this tricks TS into knowing node.value exists while (node.value == null) { @@ -319,37 +338,16 @@ function getRandomEvent(events: WeightedEvent[]): LogEntry | null { return null; } -enum LinkType { - LossOnly, - GainOnly, - Both -} - -// Links cause gain/loss of one resource to also affect other resources -const links = { - time: [ - { resource: "social", amount: 1 / (60 * 60), linkType: LinkType.LossOnly }, - { resource: "mental", amount: 1 / (120 * 60), linkType: LinkType.LossOnly } - ] -} as Record< - string, - { - resource: string; - amount: DecimalSource; - linkType: LinkType; - }[] ->; - -for (const resource in links) { - const resourceLinks = links[resource]; +for (const id in resources) { + const resource = resources[id]; watch( - () => resources[resource].amount, + () => resource.amount, (amount, oldAmount) => { if (amount == null || oldAmount == null) { return; } const resourceGain = Decimal.sub(amount, oldAmount); - resourceLinks.forEach(link => { + resource.links?.forEach(link => { if (link.linkType === LinkType.LossOnly && Decimal.gt(amount, oldAmount)) { return; } @@ -412,10 +410,8 @@ const resourceNodeType = { selectedNode.value.type === "resource" ) { const selectedResource = getResource(selectedNode.value); - if (selectedResource.name in links) { - const link = links[selectedResource.name].find( - link => link.resource === resource.name - ); + if (selectedResource.links) { + const link = selectedResource.links.find(link => link.resource === resource.name); if (link) { let text; if (resource.name === "time") { @@ -691,8 +687,8 @@ export default { } if (selectedNode.value.type === "resource") { const resource = getResource(selectedNode.value); - if (resource.name in links) { - return links[resource.name].map(link => { + if (resource.links) { + return resource.links.map(link => { const linkResource = resources[link.resource]; let negativeLink = Decimal.lt(link.amount, 0); if (link.linkType === LinkType.LossOnly) {