From 9ac754a298c8fc7a187215df35ea67987c0153d1 Mon Sep 17 00:00:00 2001 From: Aly Date: Thu, 28 Nov 2024 17:28:54 -0800 Subject: [PATCH] Finish shell of difficulty system --- src/App.svelte | 206 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 192 insertions(+), 14 deletions(-) diff --git a/src/App.svelte b/src/App.svelte index b4da5b0..89c19cf 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -13,7 +13,33 @@ ` const characters: string[] = [ - +` + rr + rr +rrrrrr + rr + r r + r r +`, +` + l +lLL +lll +`, +` + l + ll +lLLLl +lllLl +`, +` + l + ll + lllLl +lLLlLl +llLLLl + lllll +` ] let smallTrashWeight: number = $state(3) @@ -21,22 +47,94 @@ let smallTrashScore: number = $state(1) let smallTrashMeterPct: number = $state(5) + function smallTrashTime() { + return smallTrashPauseSeconds + (smallTrashMeterPct / meterEmptyRate) + } + function smallTrashProb() { + return smallTrashWeight / (smallTrashWeight + medTrashWeight + largeTrashWeight) + } + let medTrashWeight: number = $state(2) let medTrashPauseSeconds: number = $state(1) let medTrashScore: number = $state(5) let medTrashMeterPct: number = $state(7) + function medTrashTime() { + return medTrashPauseSeconds + (medTrashMeterPct / meterEmptyRate) + } + function medTrashProb() { + return medTrashWeight / (smallTrashWeight + medTrashWeight + largeTrashWeight) + } + let largeTrashWeight: number = $state(1) let largeTrashPauseSeconds: number = $state(3) let largeTrashScore: number = $state(25) let largeTrashMeterPct: number = $state(10) + function largeTrashTime() { + return largeTrashPauseSeconds + (largeTrashMeterPct / meterEmptyRate) + } + function largeTrashProb() { + return largeTrashWeight / (smallTrashWeight + medTrashWeight + largeTrashWeight) + } + + let initialSpawnDelay: number = $state(5) + let maxTrash: number = $state(20) + let powerupAdjustment: number = $state(2) + + let meterEmptyRate: number = $state(10) + let meterPct: number = 0 + function maxMathematicalDelay() { + const avgTime = (smallTrashProb() * smallTrashTime()) + + (medTrashProb() * medTrashTime()) + + (largeTrashProb() * largeTrashTime()) + return avgTime + } + + function rateInterpolation() { + const initialRate = initialSpawnDelay + const adjustedMaxDelay = maxMathematicalDelay() / powerupAdjustment + + return (initialRate - ((2 / Math.PI) * (initialRate - adjustedMaxDelay) * Math.atan(4 * (difficulty - 1)))) + } + + let currentDelay: number = $state(rateInterpolation()) + + type Trash = { + size: "small" | "medium" | "large", + id: number, + x: number, + y: number + } + + let nextTrashId: number = 1 + let startedCollectingTick: number = 0 + let currentlyCollecting: number = -1 + const gravity: number = 1 + + const trashes: Trash[] = [] + let lastSpawnTick = 0 + + let x = 50 + function update() { + if(!ticks) { + meterPct = 0 + nextTrashId = 1 + startedCollectingTick = 0 + currentlyCollecting = -1 + trashes.length = 0 + x = 50 + lastSpawnTick = ticks + } + + currentDelay = rateInterpolation() + // draw grass color("green") - rect(0, 90, 100, 10) + rect(0, 80, 100, 20) // draw meter // outline @@ -49,6 +147,63 @@ color("red") const pixelHeight = Math.floor(50 * (meterPct / 100)) rect(91, 21 + pixelHeight, 6, pixelHeight) + color("black") + + const ticksToSpawn = 60 * currentDelay + if((ticks - lastSpawnTick) >= ticksToSpawn) { + lastSpawnTick = ticks + + let spawnX = (Math.random() * (97 - 3)) + 3 + let spawnY = 60 + + let roll = Math.floor(Math.random() * (smallTrashWeight + medTrashWeight + largeTrashWeight)) + let trashType: "small" | "medium" | "large"; + if(roll < smallTrashWeight) trashType = "small" + else if(roll < (smallTrashWeight + medTrashWeight)) trashType = "medium" + else trashType = "large" + + const ourId = nextTrashId + nextTrashId++ + + trashes.push({ + size: trashType, + id: ourId, + x: spawnX, + y: spawnY + }) + } + + char("a", x, 78) + + let shouldMove = true + + remove(trashes, trash => { + let ticksNeededToSpend: number; + let character: string; + switch(trash.size) { + case 'small': + ticksNeededToSpend = 60 * smallTrashPauseSeconds + character = "b" + break + case 'medium': + ticksNeededToSpend = 60 * medTrashPauseSeconds + character = "c" + break + case 'large': + ticksNeededToSpend = 60 * largeTrashPauseSeconds + character = "d" + break + } + + trash.y += gravity + if(trash.y > 79) trash.y = 79 + + let collision = char(character, trash.x, trash.y) + + if(collision.isColliding.char!["a"]) { + + } + }) } onMount(() => { @@ -66,35 +221,58 @@

Small Trash

- + - + - + - +

Medium Trash

- + - + - + - +

Large Trash

- + - + - + - + +
+
+

All Trash Settings

+ + + + + + +
+
+

Meter/Powerup Settings

+ + +
+
+

Stats

+
+ Delay Between Trash: {currentDelay} +
+
+ Time Until Next Trash: {currentDelay - ((ticks - lastSpawnTick) / 60.0)} +