aboutsummaryrefslogtreecommitdiff
path: root/test-client/announcement.ts
diff options
context:
space:
mode:
Diffstat (limited to 'test-client/announcement.ts')
-rw-r--r--test-client/announcement.ts77
1 files changed, 77 insertions, 0 deletions
diff --git a/test-client/announcement.ts b/test-client/announcement.ts
new file mode 100644
index 00000000..1c813fda
--- /dev/null
+++ b/test-client/announcement.ts
@@ -0,0 +1,77 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright (C) 2026 Hurry Curry! Contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+
+import { PacketC } from "./protocol.ts";
+import { System } from "./system.ts";
+
+export class SAnnouncement extends System {
+ timer = 0
+ active = false
+
+ override packet(p: PacketC): void {
+ if (p.type == "menu" && p.menu == "announce_start") {
+ this.active = true
+ this.timer = 3.5
+ }
+ }
+
+ override tick(dt: number): void {
+ if (this.active) {
+ this.timer -= dt
+ if (this.timer < -3)
+ this.active = false
+ }
+ }
+
+ override draw(ctx: CanvasRenderingContext2D): void {
+ if (!this.active) return
+ ctx.save()
+
+ ctx.fillStyle = "#ffffff"
+ ctx.strokeStyle = "#903544"
+ ctx.font = "80px sans-serif"
+ ctx.fillStyle = "white"
+ ctx.lineWidth = 10
+ ctx.textAlign = "center"
+ ctx.textBaseline = "middle"
+ ctx.lineJoin = "round"
+ ctx.lineCap = "round"
+ ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2)
+
+ for (const [text, t] of [["Ready?", 3.5], ["Go!", 1]] as const) {
+ const rt = t - this.timer;
+ if (rt < 0 || rt > 2) continue
+
+ const scale = rt < 0.5
+ ? 1 - Math.pow(1 - rt / 0.5, 3)
+ : 1 + Math.pow((rt - 0.5) / 1.5, 4)
+ const alpha = rt < 0.5
+ ? 1 - Math.pow(1 - rt / 0.5, 4)
+ : 1 - (rt - 0.5) / 1.5
+
+ ctx.save()
+ ctx.globalAlpha = alpha
+ ctx.scale(scale, scale)
+ ctx.strokeText(text, 0, 0)
+ ctx.fillText(text, 0, 0)
+ ctx.restore()
+ }
+
+ ctx.restore()
+ }
+}