2d-mini-tennis 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export default function TennisGame(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=TennisGame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TennisGame.d.ts","sourceRoot":"","sources":["../src/TennisGame.tsx"],"names":[],"mappings":"AA4JA,MAAM,CAAC,OAAO,UAAU,UAAU,4CA+CjC"}
@@ -0,0 +1,607 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef } from "react";
4
+ import { CANVAS_WIDTH, CANVAS_HEIGHT, BALL, PLAYER, PHYSICS } from "./constants";
5
+ import { createCourtDimensions, drawCourt } from "./court";
6
+ import { createInputHandlers } from "./input";
7
+ import { updateBall, calcArcVz, distance, isInServiceBox, isOnSide, ballOutOfCourt, calcVelocity, } from "./physics";
8
+ import { startToss, updateToss, getServiceBox, fireServe, } from "./serve";
9
+ import { updateBot, botTryHit } from "./bot";
10
+ import { createInitialScore, awardPoint, toggleServiceBox, formatPointScore, formatGameScore, } from "./scoring";
11
+ // ── Create initial game state ────────────────────────────
12
+ function createGameState() {
13
+ const court = createCourtDimensions();
14
+ return {
15
+ phase: "IDLE",
16
+ ball: {
17
+ pos: { x: court.centerServiceX, y: court.netY },
18
+ vel: { x: 0, y: 0 },
19
+ z: 0,
20
+ vz: 0,
21
+ radius: BALL.RADIUS,
22
+ shadow: { x: court.centerServiceX, y: court.netY },
23
+ isInPlay: false,
24
+ lastHitBy: null,
25
+ hasBounced: false,
26
+ },
27
+ player: {
28
+ pos: { x: court.centerServiceX, y: court.y + court.height - 40 },
29
+ radius: PLAYER.RADIUS,
30
+ color: PLAYER.COLOR,
31
+ side: "near",
32
+ swingTimer: 0,
33
+ },
34
+ bot: {
35
+ pos: { x: court.centerServiceX, y: court.y + court.height * 0.2 },
36
+ radius: PLAYER.RADIUS,
37
+ color: PLAYER.BOT_COLOR,
38
+ side: "far",
39
+ swingTimer: 0,
40
+ },
41
+ score: createInitialScore(),
42
+ serve: {
43
+ phase: "idle",
44
+ tossProgress: 0,
45
+ aimTarget: null,
46
+ aimTimer: 0,
47
+ },
48
+ court,
49
+ mousePos: { x: court.centerServiceX, y: court.y + court.height - 40 },
50
+ lastPointWinner: null,
51
+ pointPauseTimer: 0,
52
+ botServeTimer: 0,
53
+ faultMessage: null,
54
+ faultTimer: 0,
55
+ };
56
+ }
57
+ // ── Setup serve position ─────────────────────────────────
58
+ function setupServePosition(state) {
59
+ const court = state.court;
60
+ const isPlayerServing = state.score.servingSide === "player";
61
+ const box = state.score.serviceBox;
62
+ // Server stands on opposite side of target box (cross-court serve)
63
+ const serverX = box === "right"
64
+ ? court.centerServiceX - 40
65
+ : court.centerServiceX + 40;
66
+ if (isPlayerServing) {
67
+ // Player serves from behind near baseline
68
+ state.player.pos = {
69
+ x: serverX,
70
+ y: court.y + court.height + 20,
71
+ };
72
+ // Bot returns from behind far baseline
73
+ state.bot.pos = {
74
+ x: court.centerServiceX,
75
+ y: court.y - 20,
76
+ };
77
+ }
78
+ else {
79
+ // Bot serves from behind far baseline
80
+ state.bot.pos = {
81
+ x: serverX,
82
+ y: court.y - 20,
83
+ };
84
+ // Player returns from behind near baseline
85
+ state.player.pos = {
86
+ x: court.centerServiceX,
87
+ y: court.y + court.height + 20,
88
+ };
89
+ }
90
+ }
91
+ function isServePhase(phase) {
92
+ return (phase === "SERVE_SETUP" ||
93
+ phase === "SERVE_TOSS" ||
94
+ phase === "SERVE_AIM" ||
95
+ phase === "SERVE_FIRE" ||
96
+ phase === "FAULT");
97
+ }
98
+ // ── Compute sweeping serve aim cursor ────────────────────
99
+ function getServeAimCursor(state) {
100
+ const t = state.serve.aimTimer;
101
+ // Service box bounds + padding
102
+ const box = getServiceBox(state);
103
+ const pad = 40;
104
+ const sweepLeft = box.left - pad;
105
+ const sweepRight = box.right + pad;
106
+ // Pendulum: horizontal sweep with slight vertical drift between passes
107
+ const boxMidY = (box.top + box.bottom) / 2;
108
+ // Main axis: smooth left-right sweep
109
+ const nx = (Math.sin(t * PHYSICS.SERVE_AIM_SPEED_X) + 1) / 2; // 0..1
110
+ const x = sweepLeft + nx * (sweepRight - sweepLeft);
111
+ // Vertical: gentle drift up/down, much slower than horizontal
112
+ // Stays mostly within service box with slight overshoot
113
+ const yDrift = Math.sin(t * PHYSICS.SERVE_AIM_SPEED_Y) * (pad * 0.8);
114
+ const y = boxMidY + yDrift;
115
+ return { x, y };
116
+ }
117
+ // ── Main Component ───────────────────────────────────────
118
+ export default function TennisGame() {
119
+ const canvasRef = useRef(null);
120
+ const rafRef = useRef(0);
121
+ useEffect(() => {
122
+ const canvas = canvasRef.current;
123
+ if (!canvas)
124
+ return;
125
+ canvas.width = CANVAS_WIDTH;
126
+ canvas.height = CANVAS_HEIGHT;
127
+ const ctx = canvas.getContext("2d");
128
+ const state = createGameState();
129
+ const input = createInputHandlers(canvas);
130
+ const loop = () => {
131
+ // Sync input
132
+ state.mousePos = input.state.mousePos;
133
+ // Handle clicks
134
+ if (input.state.mouseClicked) {
135
+ handleClick(state);
136
+ input.consumeClick();
137
+ }
138
+ // Update + draw
139
+ update(state);
140
+ draw(ctx, state);
141
+ rafRef.current = requestAnimationFrame(loop);
142
+ };
143
+ rafRef.current = requestAnimationFrame(loop);
144
+ return () => {
145
+ cancelAnimationFrame(rafRef.current);
146
+ input.cleanup();
147
+ };
148
+ }, []);
149
+ return (_jsx("canvas", { ref: canvasRef, className: "block mx-auto max-w-[480px] w-full h-auto cursor-crosshair", style: { aspectRatio: `${CANVAS_WIDTH}/${CANVAS_HEIGHT}` } }));
150
+ }
151
+ // ── Click handler ────────────────────────────────────────
152
+ function handleClick(state) {
153
+ switch (state.phase) {
154
+ case "IDLE":
155
+ state.phase = "SERVE_SETUP";
156
+ state.score = createInitialScore();
157
+ setupServePosition(state);
158
+ break;
159
+ case "SERVE_SETUP":
160
+ // No click needed — toss starts automatically in update()
161
+ break;
162
+ case "SERVE_AIM":
163
+ if (state.score.servingSide === "player") {
164
+ // Fire at wherever the sweeping cursor currently is
165
+ const aimPos = getServeAimCursor(state);
166
+ fireServe(state, aimPos);
167
+ }
168
+ break;
169
+ case "POINT_SCORED":
170
+ // Let the pause timer handle transition
171
+ break;
172
+ case "GAME_OVER":
173
+ state.phase = "IDLE";
174
+ break;
175
+ }
176
+ }
177
+ // ── Update ───────────────────────────────────────────────
178
+ function update(state) {
179
+ switch (state.phase) {
180
+ case "IDLE":
181
+ break;
182
+ case "SERVE_SETUP":
183
+ if (state.score.servingSide === "bot") {
184
+ state.botServeTimer += 1;
185
+ if (state.botServeTimer >= PHYSICS.BOT_SERVE_DELAY) {
186
+ state.botServeTimer = 0;
187
+ startToss(state);
188
+ }
189
+ }
190
+ else {
191
+ // Player: auto-start toss immediately (no click needed)
192
+ startToss(state);
193
+ }
194
+ break;
195
+ case "SERVE_TOSS":
196
+ updateToss(state);
197
+ break;
198
+ case "SERVE_AIM":
199
+ // Sweep the aim cursor
200
+ state.serve.aimTimer += 1;
201
+ break;
202
+ case "SERVE_FIRE":
203
+ updateBall(state.ball);
204
+ // Only the receiver moves during serve
205
+ if (state.score.servingSide === "player") {
206
+ updateBot(state);
207
+ }
208
+ // Check for ball landing (z hit ground)
209
+ if (state.ball.z <= 0 && state.ball.isInPlay) {
210
+ const servingSide = state.score.servingSide;
211
+ const targetSide = servingSide === "player" ? "far" : "near";
212
+ const inBox = isInServiceBox(state.ball.pos, state.court, targetSide, state.score.serviceBox);
213
+ if (inBox) {
214
+ // Good serve — bounce and start rally
215
+ state.phase = "RALLY";
216
+ // Snap mousePos to player so there's no sudden teleport
217
+ state.mousePos = { ...state.player.pos };
218
+ state.ball.hasBounced = true;
219
+ state.ball.z = 0;
220
+ state.ball.vz = PHYSICS.BOUNCE_VZ;
221
+ state.ball.vel.x *= PHYSICS.BOUNCE_FRICTION;
222
+ state.ball.vel.y *= PHYSICS.BOUNCE_FRICTION;
223
+ // Reset to first serve for next point
224
+ state.score.serveAttempt = 1;
225
+ }
226
+ else {
227
+ // Fault!
228
+ handleFault(state);
229
+ }
230
+ }
231
+ // Ball went way off court
232
+ if (ballOutOfCourt(state.ball, state.court)) {
233
+ const receiver = state.score.servingSide === "player" ? "bot" : "player";
234
+ scorePoint(state, receiver);
235
+ }
236
+ break;
237
+ case "RALLY":
238
+ updateRally(state);
239
+ break;
240
+ case "FAULT":
241
+ state.faultTimer -= 1;
242
+ if (state.faultTimer <= 0) {
243
+ const wasDoubleFault = state.faultMessage === "DOUBLE FAULT";
244
+ state.faultMessage = null;
245
+ if (wasDoubleFault) {
246
+ // Double fault → point to receiver
247
+ const receiver = state.score.servingSide === "player" ? "bot" : "player";
248
+ state.score.serveAttempt = 1;
249
+ scorePoint(state, receiver);
250
+ }
251
+ else {
252
+ // First fault → go to second serve
253
+ state.phase = "SERVE_SETUP";
254
+ state.botServeTimer = 0;
255
+ setupServePosition(state);
256
+ }
257
+ }
258
+ break;
259
+ case "POINT_SCORED":
260
+ state.pointPauseTimer -= 1;
261
+ if (state.pointPauseTimer <= 0) {
262
+ if (state.phase === "POINT_SCORED") {
263
+ state.phase = "SERVE_SETUP";
264
+ state.botServeTimer = 0;
265
+ setupServePosition(state);
266
+ }
267
+ }
268
+ break;
269
+ case "GAME_OVER":
270
+ break;
271
+ }
272
+ // Player follows mouse during rally,
273
+ // and during bot's serve flight (so they can position to return)
274
+ const canMove = state.phase === "RALLY" ||
275
+ (state.phase === "SERVE_FIRE" && state.score.servingSide === "bot");
276
+ if (canMove) {
277
+ const p = state.player;
278
+ const court = state.court;
279
+ // Smooth follow
280
+ p.pos.x += (state.mousePos.x - p.pos.x) * PHYSICS.PLAYER_LERP;
281
+ p.pos.y += (state.mousePos.y - p.pos.y) * PHYSICS.PLAYER_LERP;
282
+ // Clamp to player's half (allow going behind baseline)
283
+ p.pos.x = Math.max(court.x, Math.min(court.x + court.width, p.pos.x));
284
+ p.pos.y = Math.max(court.netY + 15, Math.min(court.y + court.height + 30, p.pos.y));
285
+ }
286
+ // Tick down swing animations
287
+ if (state.player.swingTimer > 0)
288
+ state.player.swingTimer--;
289
+ if (state.bot.swingTimer > 0)
290
+ state.bot.swingTimer--;
291
+ }
292
+ // ── Rally logic ──────────────────────────────────────────
293
+ function updateRally(state) {
294
+ updateBall(state.ball);
295
+ updateBot(state);
296
+ const ball = state.ball;
297
+ const court = state.court;
298
+ // Ball hit the ground
299
+ if (ball.z <= 0 && ball.isInPlay) {
300
+ if (!ball.hasBounced) {
301
+ // First bounce — give a small upward bounce
302
+ ball.hasBounced = true;
303
+ ball.z = 0;
304
+ ball.vz = PHYSICS.BOUNCE_VZ;
305
+ ball.vel.x *= PHYSICS.BOUNCE_FRICTION;
306
+ ball.vel.y *= PHYSICS.BOUNCE_FRICTION;
307
+ }
308
+ else {
309
+ // Second bounce — point to the last hitter
310
+ if (ball.lastHitBy) {
311
+ scorePoint(state, ball.lastHitBy);
312
+ }
313
+ return;
314
+ }
315
+ }
316
+ // Ball out of court entirely
317
+ if (ballOutOfCourt(ball, court)) {
318
+ if (ball.lastHitBy) {
319
+ const winner = ball.lastHitBy === "player" ? "bot" : "player";
320
+ scorePoint(state, winner);
321
+ }
322
+ return;
323
+ }
324
+ // Player hit attempt — ball on player's side, near ground, has bounced
325
+ if (ball.isInPlay &&
326
+ ball.lastHitBy === "bot" &&
327
+ ball.hasBounced &&
328
+ ball.z < 8 &&
329
+ isOnSide(ball.pos, court, "near")) {
330
+ const dist = distance(state.player.pos, ball.pos);
331
+ if (dist <= PHYSICS.HIT_RADIUS) {
332
+ playerHit(state);
333
+ }
334
+ }
335
+ // Bot hit attempt
336
+ botTryHit(state);
337
+ }
338
+ // ── Player hits the ball ─────────────────────────────────
339
+ function playerHit(state) {
340
+ const ball = state.ball;
341
+ const court = state.court;
342
+ // Aim toward the bot's side — bias away from bot position
343
+ const botX = state.bot.pos.x;
344
+ const courtMidX = court.centerServiceX;
345
+ const aimX = botX > courtMidX
346
+ ? court.singlesLeft + 20 + Math.random() * 80
347
+ : court.singlesRight - 20 - Math.random() * 80;
348
+ const aimY = court.y + 30 + Math.random() * (court.netY - court.y - 60);
349
+ const target = { x: aimX, y: aimY };
350
+ ball.vel = calcVelocity(ball.pos, target, PHYSICS.BALL_SPEED_RALLY);
351
+ ball.vz = calcArcVz(ball.z, ball.pos, target, PHYSICS.BALL_SPEED_RALLY);
352
+ ball.lastHitBy = "player";
353
+ ball.hasBounced = false;
354
+ state.player.swingTimer = PHYSICS.SWING_DURATION;
355
+ }
356
+ // ── Score a point ────────────────────────────────────────
357
+ function scorePoint(state, winner) {
358
+ state.lastPointWinner = winner;
359
+ state.ball.isInPlay = false;
360
+ state.ball.vel = { x: 0, y: 0 };
361
+ state.score.serveAttempt = 1; // reset for next point
362
+ const result = awardPoint(state.score, winner);
363
+ if (result.setOver) {
364
+ state.phase = "GAME_OVER";
365
+ }
366
+ else {
367
+ state.phase = "POINT_SCORED";
368
+ state.pointPauseTimer = PHYSICS.POINT_PAUSE_FRAMES;
369
+ toggleServiceBox(state.score);
370
+ }
371
+ }
372
+ // ── Handle serve fault ──────────────────────────────────
373
+ function handleFault(state) {
374
+ state.ball.isInPlay = false;
375
+ state.ball.vel = { x: 0, y: 0 };
376
+ if (state.score.serveAttempt === 1) {
377
+ // First serve fault → show "FAULT", go to second serve
378
+ state.faultMessage = "FAULT";
379
+ state.faultTimer = PHYSICS.FAULT_PAUSE_FRAMES;
380
+ state.phase = "FAULT";
381
+ state.score.serveAttempt = 2;
382
+ }
383
+ else {
384
+ // Double fault → point to receiver
385
+ state.faultMessage = "DOUBLE FAULT";
386
+ state.faultTimer = PHYSICS.FAULT_PAUSE_FRAMES;
387
+ state.phase = "FAULT";
388
+ // Will score the point when fault timer expires
389
+ }
390
+ }
391
+ // ── Draw ─────────────────────────────────────────────────
392
+ function draw(ctx, state) {
393
+ // Court
394
+ drawCourt(ctx, state.court);
395
+ // Service box highlight during aim
396
+ if (state.phase === "SERVE_AIM" && state.score.servingSide === "player") {
397
+ drawServiceBoxHighlight(ctx, state);
398
+ }
399
+ // Sweeping serve aim cursor
400
+ if (state.phase === "SERVE_AIM" && state.score.servingSide === "player") {
401
+ const cursor = getServeAimCursor(state);
402
+ const box = getServiceBox(state);
403
+ const inBox = cursor.x >= box.left &&
404
+ cursor.x <= box.right &&
405
+ cursor.y >= box.top &&
406
+ cursor.y <= box.bottom;
407
+ // Crosshair color: green if in box, red if out
408
+ const color = inBox ? "rgba(100,255,100,0.8)" : "rgba(255,100,100,0.8)";
409
+ const fillColor = inBox ? "rgba(100,255,100,0.3)" : "rgba(255,100,100,0.3)";
410
+ ctx.beginPath();
411
+ ctx.arc(cursor.x, cursor.y, 8, 0, Math.PI * 2);
412
+ ctx.fillStyle = fillColor;
413
+ ctx.fill();
414
+ ctx.strokeStyle = color;
415
+ ctx.lineWidth = 2;
416
+ ctx.stroke();
417
+ // Crosshair lines
418
+ ctx.beginPath();
419
+ ctx.moveTo(cursor.x - 14, cursor.y);
420
+ ctx.lineTo(cursor.x - 4, cursor.y);
421
+ ctx.moveTo(cursor.x + 4, cursor.y);
422
+ ctx.lineTo(cursor.x + 14, cursor.y);
423
+ ctx.moveTo(cursor.x, cursor.y - 14);
424
+ ctx.lineTo(cursor.x, cursor.y - 4);
425
+ ctx.moveTo(cursor.x, cursor.y + 4);
426
+ ctx.lineTo(cursor.x, cursor.y + 14);
427
+ ctx.strokeStyle = color;
428
+ ctx.lineWidth = 1.5;
429
+ ctx.stroke();
430
+ }
431
+ // Ball shadow
432
+ if (state.ball.isInPlay || state.serve.phase === "tossing" || state.serve.phase === "aiming") {
433
+ ctx.beginPath();
434
+ ctx.ellipse(state.ball.shadow.x, state.ball.shadow.y, state.ball.radius + 2, state.ball.radius * 0.5, 0, 0, Math.PI * 2);
435
+ ctx.fillStyle = BALL.SHADOW_COLOR;
436
+ ctx.fill();
437
+ }
438
+ // Ball
439
+ if (state.ball.isInPlay || state.serve.phase === "tossing" || state.serve.phase === "aiming") {
440
+ const visualY = state.ball.pos.y - state.ball.z;
441
+ ctx.beginPath();
442
+ ctx.arc(state.ball.pos.x, visualY, state.ball.radius, 0, Math.PI * 2);
443
+ ctx.fillStyle = BALL.COLOR;
444
+ ctx.fill();
445
+ ctx.strokeStyle = BALL.STROKE_COLOR;
446
+ ctx.lineWidth = 1;
447
+ ctx.stroke();
448
+ }
449
+ // Players
450
+ drawPlayer(ctx, state.player);
451
+ drawPlayer(ctx, state.bot);
452
+ // UI
453
+ drawUI(ctx, state);
454
+ }
455
+ // ── Draw helpers ─────────────────────────────────────────
456
+ function drawPlayer(ctx, player) {
457
+ const x = player.pos.x;
458
+ const y = player.pos.y;
459
+ // near = facing up (toward net), far = facing down (toward net)
460
+ const d = player.side === "near" ? -1 : 1;
461
+ const s = 2; // sprite scale
462
+ ctx.save();
463
+ // Shadow (drawn at world scale, not sprite scale)
464
+ ctx.beginPath();
465
+ ctx.ellipse(x, y + 4, 16, 7, 0, 0, Math.PI * 2);
466
+ ctx.fillStyle = "rgba(0,0,0,0.18)";
467
+ ctx.fill();
468
+ // Scale up the sprite from player center
469
+ ctx.translate(x, y);
470
+ ctx.scale(s, s);
471
+ // Shoes
472
+ ctx.fillStyle = "#E0E0E0";
473
+ ctx.fillRect(-5, -d * 9, 4, 3);
474
+ ctx.fillRect(1, -d * 9, 4, 3);
475
+ // Shorts
476
+ ctx.fillStyle = "#FFFFFF";
477
+ ctx.fillRect(-5, -d * 6 - 1, 10, 4);
478
+ // Shirt (main body)
479
+ ctx.fillStyle = player.color;
480
+ ctx.beginPath();
481
+ ctx.roundRect(-6, -3, 12, 7, 2);
482
+ ctx.fill();
483
+ // Arms (skin)
484
+ ctx.fillStyle = "#DEB887";
485
+ ctx.fillRect(-9, -2, 3, 5);
486
+ ctx.fillRect(6, -2, 3, 5);
487
+ // Racket — interpolate between idle and swing pose
488
+ // t = 1 at hit, eases to 0 as swing finishes
489
+ const swingRaw = player.swingTimer / PHYSICS.SWING_DURATION;
490
+ const t = swingRaw * swingRaw; // ease-out (fast start, slow return)
491
+ // Idle pose: handle tip (14, d*4), head (16, d*7), rotation d*0.3
492
+ // Swing pose: handle tip (2, d*12), head (0, d*17), rotation d*1.4 (parallel)
493
+ const handleX = 14 + (2 - 14) * t; // 14 → 2
494
+ const handleY = d * (4 + (12 - 4) * t); // d*4 → d*12
495
+ const headX = 16 + (0 - 16) * t; // 16 → 0
496
+ const headY = d * (7 + (17 - 7) * t); // d*7 → d*17
497
+ const headRot = d * (0.3 + (1.4 - 0.3) * t); // d*0.3 → d*1.4
498
+ // Handle
499
+ ctx.strokeStyle = "#8B7355";
500
+ ctx.lineWidth = 1.5;
501
+ ctx.beginPath();
502
+ ctx.moveTo(8, 0);
503
+ ctx.lineTo(handleX, handleY);
504
+ ctx.stroke();
505
+ // Racket head
506
+ const headRx = 3 + 2 * t; // wider when swinging (3 → 5)
507
+ const headRy = 5 - 2 * t; // shorter when swinging (5 → 3)
508
+ ctx.beginPath();
509
+ ctx.ellipse(headX, headY, headRx, headRy, headRot, 0, Math.PI * 2);
510
+ ctx.strokeStyle = "#BBBBBB";
511
+ ctx.lineWidth = 1;
512
+ ctx.stroke();
513
+ // Racket strings
514
+ ctx.strokeStyle = "rgba(200,200,200,0.4)";
515
+ ctx.lineWidth = 0.4;
516
+ ctx.beginPath();
517
+ ctx.moveTo(headX, headY - headRy);
518
+ ctx.lineTo(headX, headY + headRy);
519
+ ctx.moveTo(headX - headRx, headY);
520
+ ctx.lineTo(headX + headRx, headY);
521
+ ctx.stroke();
522
+ // Head
523
+ ctx.beginPath();
524
+ ctx.arc(0, d * 7, 5, 0, Math.PI * 2);
525
+ ctx.fillStyle = "#F0CCA8";
526
+ ctx.fill();
527
+ // Cap (half-circle covering the "front" of head)
528
+ ctx.beginPath();
529
+ if (d === -1) {
530
+ ctx.arc(0, d * 7, 5, Math.PI, 0);
531
+ }
532
+ else {
533
+ ctx.arc(0, d * 7, 5, 0, Math.PI);
534
+ }
535
+ ctx.fillStyle = player.color;
536
+ ctx.fill();
537
+ // Cap visor
538
+ ctx.fillStyle = player.color;
539
+ ctx.fillRect(-5, d * 7 + d * 4, 10, 2);
540
+ ctx.restore();
541
+ }
542
+ function drawServiceBoxHighlight(ctx, state) {
543
+ const box = getServiceBox(state);
544
+ ctx.fillStyle = "rgba(255,255,100,0.08)";
545
+ ctx.fillRect(box.left, box.top, box.right - box.left, box.bottom - box.top);
546
+ ctx.strokeStyle = "rgba(255,255,100,0.3)";
547
+ ctx.lineWidth = 1;
548
+ ctx.strokeRect(box.left, box.top, box.right - box.left, box.bottom - box.top);
549
+ }
550
+ function drawUI(ctx, state) {
551
+ ctx.textAlign = "center";
552
+ // Score display at the top
553
+ ctx.font = "bold 16px monospace";
554
+ ctx.fillStyle = "#FFFFFF";
555
+ ctx.fillText(formatGameScore(state.score), CANVAS_WIDTH / 2, 24);
556
+ ctx.font = "14px monospace";
557
+ ctx.fillText(formatPointScore(state.score), CANVAS_WIDTH / 2, 44);
558
+ // Serving indicator
559
+ const serverLabel = state.score.servingSide === "player" ? "Your" : "Bot's";
560
+ const attemptLabel = state.score.serveAttempt === 2 ? " (2nd)" : "";
561
+ ctx.font = "11px monospace";
562
+ ctx.fillStyle = state.score.serveAttempt === 2 ? "rgba(255,180,80,0.7)" : "rgba(255,255,255,0.5)";
563
+ ctx.fillText(`${serverLabel} serve${attemptLabel}`, CANVAS_WIDTH / 2, 60);
564
+ // Phase-specific messages
565
+ ctx.font = "bold 14px monospace";
566
+ ctx.fillStyle = "#FFFFFF";
567
+ switch (state.phase) {
568
+ case "IDLE":
569
+ ctx.font = "bold 20px monospace";
570
+ ctx.fillText("🎾 TENNIS", CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2 - 20);
571
+ ctx.font = "14px monospace";
572
+ ctx.fillStyle = "rgba(255,255,255,0.7)";
573
+ ctx.fillText("Click to start", CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2 + 10);
574
+ break;
575
+ case "SERVE_SETUP":
576
+ case "SERVE_TOSS":
577
+ if (state.score.servingSide === "bot") {
578
+ ctx.fillStyle = "rgba(255,255,255,0.5)";
579
+ ctx.fillText("Bot serving...", CANVAS_WIDTH / 2, CANVAS_HEIGHT - 30);
580
+ }
581
+ break;
582
+ case "SERVE_AIM":
583
+ ctx.fillText("Click to serve", CANVAS_WIDTH / 2, CANVAS_HEIGHT - 30);
584
+ break;
585
+ case "FAULT":
586
+ ctx.font = "bold 20px monospace";
587
+ ctx.fillStyle = "#FF8844";
588
+ ctx.fillText(state.faultMessage ?? "FAULT", CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2);
589
+ break;
590
+ case "POINT_SCORED":
591
+ ctx.font = "bold 18px monospace";
592
+ ctx.fillStyle = state.lastPointWinner === "player" ? "#4488FF" : "#FF4444";
593
+ ctx.fillText(state.lastPointWinner === "player" ? "Your point!" : "Bot's point!", CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2);
594
+ break;
595
+ case "GAME_OVER": {
596
+ const winner = state.score.playerGames >= 6 ? "You win!" : "Bot wins!";
597
+ ctx.font = "bold 24px monospace";
598
+ ctx.fillStyle = state.score.playerGames >= 6 ? "#4488FF" : "#FF4444";
599
+ ctx.fillText(winner, CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2 - 15);
600
+ ctx.font = "14px monospace";
601
+ ctx.fillStyle = "rgba(255,255,255,0.7)";
602
+ ctx.fillText("Click to restart", CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2 + 15);
603
+ break;
604
+ }
605
+ }
606
+ }
607
+ //# sourceMappingURL=TennisGame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TennisGame.js","sourceRoot":"","sources":["../src/TennisGame.tsx"],"names":[],"mappings":"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"}
package/dist/bot.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { GameState } from "./types";
2
+ export declare function updateBot(state: GameState): void;
3
+ export declare function botTryHit(state: GameState): boolean;
4
+ //# sourceMappingURL=bot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAQ,MAAM,SAAS,CAAC;AAM/C,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CA2ChD;AAID,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAyBnD"}