Compare commits

...

14 Commits

Author SHA1 Message Date
dependabot[bot]
ba504558b0 chore(deps): bump the rust-minor group across 1 directory with 9 updates
Bumps the rust-minor group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [bitflags](https://github.com/bitflags/bitflags) | `2.9.4` | `2.10.0` |
| [circular-buffer](https://github.com/andreacorbellini/rust-circular-buffer) | `1.1.0` | `1.2.0` |
| rust-embed | `8.7.2` | `8.9.0` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.47.1` | `1.48.0` |
| [http](https://github.com/hyperium/http) | `1.3.1` | `1.4.0` |
| [hyper](https://github.com/hyperium/hyper) | `1.7.0` | `1.8.1` |
| [bytes](https://github.com/tokio-rs/bytes) | `1.10.1` | `1.11.0` |
| [bon](https://github.com/elastio/bon) | `3.7.2` | `3.8.1` |



Updates `bitflags` from 2.9.4 to 2.10.0
- [Release notes](https://github.com/bitflags/bitflags/releases)
- [Changelog](https://github.com/bitflags/bitflags/blob/main/CHANGELOG.md)
- [Commits](https://github.com/bitflags/bitflags/compare/2.9.4...2.10.0)

Updates `circular-buffer` from 1.1.0 to 1.2.0
- [Release notes](https://github.com/andreacorbellini/rust-circular-buffer/releases)
- [Changelog](https://github.com/andreacorbellini/rust-circular-buffer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/andreacorbellini/rust-circular-buffer/compare/v1.1.0...v1.2.0)

Updates `rust-embed` from 8.7.2 to 8.9.0

Updates `serde` from 1.0.225 to 1.0.228
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.225...v1.0.228)

Updates `tokio` from 1.47.1 to 1.48.0
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.47.1...tokio-1.48.0)

Updates `http` from 1.3.1 to 1.4.0
- [Release notes](https://github.com/hyperium/http/releases)
- [Changelog](https://github.com/hyperium/http/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hyperium/http/compare/v1.3.1...v1.4.0)

Updates `hyper` from 1.7.0 to 1.8.1
- [Release notes](https://github.com/hyperium/hyper/releases)
- [Changelog](https://github.com/hyperium/hyper/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hyperium/hyper/compare/v1.7.0...v1.8.1)

Updates `bytes` from 1.10.1 to 1.11.0
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v1.10.1...v1.11.0)

Updates `bon` from 3.7.2 to 3.8.1
- [Release notes](https://github.com/elastio/bon/releases)
- [Changelog](https://github.com/elastio/bon/blob/master/release-plz.toml)
- [Commits](https://github.com/elastio/bon/compare/v3.7.2...v3.8.1)

---
updated-dependencies:
- dependency-name: bitflags
  dependency-version: 2.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: circular-buffer
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: rust-embed
  dependency-version: 8.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: serde
  dependency-version: 1.0.228
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-minor
- dependency-name: tokio
  dependency-version: 1.48.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: http
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: hyper
  dependency-version: 1.8.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: bytes
  dependency-version: 1.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
- dependency-name: bon
  dependency-version: 3.8.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 01:08:29 +00:00
dependabot[bot]
191fe49c64 chore(deps): bump actions/checkout in the github-actions group (#11)
Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).


Updates `actions/checkout` from 5 to 6
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-25 16:14:41 -06:00
Ryan Walters
cc6a1a4c6a fix(ci): skip Railway deployment and Coveralls upload when tokens unavailable
Dependabot PRs lack access to repository secrets, causing workflow failures.
This change adds token availability checks with informative warnings, allowing
CI to complete successfully while skipping deployment steps that require secrets.

Coverage generation still runs to maintain build verification, but upload is
conditional on token availability.
2025-11-23 11:48:58 -06:00
Ryan Walters
0338188e94 refactor: reorganize project structure for clarity
Move documentation assets to .github/assets/ and backend scripts to pacman-server/scripts/. Updates all references in README and Justfile.
2025-11-23 11:47:43 -06:00
dependabot[bot]
a60d309a66 chore(deps): bump mockall from 0.13.1 to 0.14.0 in the rust-major group (#14) 2025-11-23 16:15:22 +00:00
Ryan Walters
203a5c0e2e fix(ci): skip Coveralls upload when token unavailable
The coverage workflow was failing on Dependabot PRs because
COVERALLS_REPO_TOKEN is not available to PRs from forks for security
reasons. Add a conditional check to skip the upload step when the
token is missing, while still running coverage generation.

This allows PRs to pass CI while retaining coverage reports on master.
2025-11-23 01:38:41 -06:00
Ryan Walters
cb50ade88f fix(web): resolve leaderboard production crashes by removing react-animated-numbers
Remove react-animated-numbers dependency which caused production-only crashes due to CommonJS/ESM interop issues with Vite's production bundler. Replace animated score displays with simple toLocaleString() formatting.

Also add missing +config.ts to disable SSR for the leaderboard page, fixing 307 redirect loop caused by SSR/prerender configuration mismatch.

Changes:
- Remove react-animated-numbers from package.json
- Add web/pages/leaderboard/+config.ts with ssr: false
- Replace AnimatedNumbers component with direct number formatting
- Simplify leaderboard score display (no animation, instant render)
2025-11-23 01:21:02 -06:00
Ryan Walters
984a2e95ca fix(ci): consolidate Dependabot configs to resolve overlapping directories
Dependabot rejected the previous configuration due to duplicate
package-ecosystem/directory combinations. Merged separate patch/minor/major
update configs into single configs per directory with grouped update types.
2025-11-23 01:21:02 -06:00
Ryan Walters
50c0033f2f fix(game): track cursor and touch state in dirty flag for immediate visual feedback
Extends dirty_render_system to detect changes in CursorPosition and TouchState resources. This ensures re-renders trigger immediately when clicking to activate drag functionality, when cursor debug visualization updates, and when cursor fade-out occurs after timeout.
2025-11-23 00:44:38 -06:00
Ryan Walters
61a1590289 fix(ci): use dynamic proxy Dockerfile for Railway deployment
Replace railway redeploy with railway up using a dynamically generated
proxy Dockerfile. The proxy pulls the pre-built image from GHCR using
the exact SHA256 digest, avoiding Railpack source builds while ensuring
deterministic deployments.
2025-11-22 23:45:53 -06:00
Ryan Walters
7eb4705b7c fix(ci): use railway redeploy instead of railway up
Changed deployment command from `railway up` to `railway redeploy` because
the Railway service is configured to use an external Docker image from GHCR,
not source code deployment. The `railway up` command was attempting to build
from source with Railpack, which failed since no source code was provided.

The `railway redeploy` command triggers Railway to pull the latest image
from ghcr.io/xevion/pac-man:latest and redeploy the service.
2025-11-22 22:15:50 -06:00
Ryan Walters
a98ad23348 chore(deps): reconfigure Dependabot with granular update groups
Replaced monolithic dependency grouping with 13 separate update groups
across Cargo (game/server), npm (frontend), and GitHub Actions ecosystems.

Key improvements:
- Separate patch/minor/major updates to prevent breaking changes from
  blocking safe updates
- Group by crate (game vs server) for easier review
- Enable auto-merge for patch updates via labels
- Weekly checks with 5 PR limit to avoid spam
- Ignore bevy_ecs 0.17+ and jsonwebtoken 10+ until manual migration

Closed PR #10 (22 jumbled updates causing build failures).
2025-11-22 21:58:27 -06:00
Ryan Walters
3e08720b43 fix(ci): correct Railway CLI invocation in GitHub Actions
The deployment was failing because the workflow used incorrect syntax
with `uses: docker://` which caused Docker to misinterpret `up` as an
executable rather than an argument to the Railway CLI.

Split deployment into a separate job using `container:` at the job level,
allowing the Railway CLI to execute properly. This follows Railway's
official documentation for GitHub Actions integration.
2025-11-22 21:43:04 -06:00
Ryan Walters
c306e992c4 fix(game): resolve race condition in render dirty flag using bitwise OR
The render dirty flag was being reset instead of accumulated, causing
the game to become stuck and unplayable in web builds. Changed from
assignment to bitwise OR to preserve all dirty state updates.

Also adds game layout component and updates Justfile to build frontend.
2025-11-22 21:14:24 -06:00
25 changed files with 254 additions and 231 deletions

View File

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -1,20 +1,86 @@
# Dependabot Configuration
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
#
# Strategy:
# - Weekly checks for faster vulnerability detection
# - Separate patch/minor/major updates to prevent blocking
# - Auto-merge patches via GitHub branch protection rules
# - Limit concurrent PRs to avoid spam
version: 2
updates:
# Cargo workspace (all Rust crates)
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "monthly"
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
ignore:
# Bevy ECS 0.17+ requires API migration
- dependency-name: "bevy_ecs"
versions: ["0.17.x", "0.18.x", "0.19.x"]
# jsonwebtoken 10+ requires crypto backend feature flag
- dependency-name: "jsonwebtoken"
versions: ["10.x", "11.x"]
groups:
dependencies:
rust-patches:
applies-to: "version-updates"
update-types: ["patch"]
rust-minor:
applies-to: "version-updates"
update-types: ["minor"]
rust-major:
applies-to: "version-updates"
update-types: ["major"]
labels:
- "dependencies"
- "rust"
# Frontend (web/)
- package-ecosystem: "npm"
directory: "/web"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
groups:
frontend-patches:
applies-to: "version-updates"
update-types: ["patch"]
frontend-minor:
applies-to: "version-updates"
update-types: ["minor"]
frontend-major-framework:
applies-to: "version-updates"
update-types: ["major"]
patterns:
- "*"
- "react"
- "react-dom"
- "vike"
- "vite"
frontend-major-other:
applies-to: "version-updates"
update-types: ["major"]
exclude-patterns:
- "react"
- "react-dom"
- "vike"
- "vite"
labels:
- "dependencies"
- "frontend"
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
groups:
dependencies:
patterns:
- "*"
github-actions:
patterns: ["*"]
labels:
- "dependencies"
- "github-actions"

View File

@@ -38,7 +38,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Setup Rust Toolchain
uses: dtolnay/rust-toolchain@master

View File

@@ -19,7 +19,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
@@ -56,7 +56,16 @@ jobs:
just coverage
working-directory: pacman
- name: Check Coveralls Token
run: |
if [ -z "${{ secrets.COVERALLS_REPO_TOKEN }}" ]; then
echo "::warning::COVERALLS_REPO_TOKEN not available - coverage upload skipped (common for Dependabot PRs)"
else
echo "COVERALLS_REPO_TOKEN is available - will upload coverage"
fi
- name: Coveralls upload
if: ${{ secrets.COVERALLS_REPO_TOKEN != '' }}
uses: coverallsapp/github-action@v2
with:
github-token: ${{ secrets.COVERALLS_REPO_TOKEN }}

View File

@@ -18,9 +18,11 @@ jobs:
build-and-deploy:
name: Build and Deploy
runs-on: ubuntu-latest
outputs:
digest: ${{ steps.docker_build.outputs.digest }}
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Setup Emscripten SDK
uses: pyodide/setup-emsdk@v15
@@ -104,6 +106,7 @@ jobs:
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push Docker image
id: docker_build
uses: docker/build-push-action@v6
with:
context: .
@@ -120,10 +123,26 @@ jobs:
- name: Wait for registry propagation
run: sleep 5
# Deploy to Railway
# Deploy to Railway - separate job to use container properly
deploy:
name: Deploy to Railway
runs-on: ubuntu-latest
needs: build-and-deploy
container: ghcr.io/railwayapp/cli:latest
env:
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
steps:
- name: Check Railway Token
run: |
if [ -z "$RAILWAY_TOKEN" ]; then
echo "::warning::RAILWAY_TOKEN not available - deployment skipped (common for Dependabot PRs)"
exit 0
fi
- name: Generate proxy Dockerfile
if: env.RAILWAY_TOKEN != ''
run: echo "FROM ghcr.io/xevion/pac-man@${{ needs.build-and-deploy.outputs.digest }}" > Dockerfile
- name: Deploy to Railway
uses: docker://ghcr.io/railwayapp/cli:latest
env:
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
with:
args: up --service pac-man
if: env.RAILWAY_TOKEN != ''
run: railway up --service pac-man

View File

@@ -19,7 +19,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master

270
Cargo.lock generated
View File

@@ -2,15 +2,6 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "addr2line"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
[[package]]
name = "adler2"
version = "2.0.1"
@@ -264,7 +255,7 @@ checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
dependencies = [
"axum-core",
"axum-macros",
"bytes 1.10.1",
"bytes 1.11.0",
"form_urlencoded",
"futures-util",
"http",
@@ -284,7 +275,7 @@ dependencies = [
"serde_path_to_error",
"serde_urlencoded",
"sync_wrapper",
"tokio 1.47.1",
"tokio 1.48.0",
"tower",
"tower-layer",
"tower-service",
@@ -310,7 +301,7 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"futures-core",
"http",
"http-body",
@@ -343,7 +334,7 @@ checksum = "680e88effaafbb28675074f29cda0e984c984bed5eb513085c17caf7de564225"
dependencies = [
"anyhow",
"axum",
"bytes 1.10.1",
"bytes 1.11.0",
"bytesize",
"cookie",
"expect-json",
@@ -359,26 +350,11 @@ dependencies = [
"serde_json",
"serde_urlencoded",
"smallvec 1.15.1",
"tokio 1.47.1",
"tokio 1.48.0",
"tower",
"url",
]
[[package]]
name = "backtrace"
version = "0.3.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
dependencies = [
"addr2line",
"cfg-if 1.0.3",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
"windows-targets 0.52.6",
]
[[package]]
name = "base64"
version = "0.21.7"
@@ -410,7 +386,7 @@ dependencies = [
"bevy_reflect",
"bevy_tasks",
"bevy_utils",
"bitflags 2.9.4",
"bitflags 2.10.0",
"bumpalo",
"concurrent-queue",
"derive_more",
@@ -544,7 +520,7 @@ version = "0.72.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"cexpr",
"clang-sys",
"itertools 0.13.0",
@@ -572,11 +548,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.9.4"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
dependencies = [
"serde",
"serde_core",
]
[[package]]
@@ -602,10 +578,10 @@ checksum = "899ca34eb6924d6ec2a77c6f7f5c7339e60fd68235eaf91edd5a15f12958bb06"
dependencies = [
"async-stream",
"base64 0.22.1",
"bitflags 2.9.4",
"bitflags 2.10.0",
"bollard-buildkit-proto",
"bollard-stubs",
"bytes 1.10.1",
"bytes 1.11.0",
"chrono",
"futures-core",
"futures-util",
@@ -632,7 +608,7 @@ dependencies = [
"serde_repr",
"serde_urlencoded",
"thiserror 2.0.16",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-stream",
"tokio-util",
"tonic",
@@ -661,7 +637,7 @@ checksum = "64ea257e555d16a2c01e5593f40b73865cdf12efbceda33c6d14a2d8d1490368"
dependencies = [
"base64 0.22.1",
"bollard-buildkit-proto",
"bytes 1.10.1",
"bytes 1.11.0",
"chrono",
"prost",
"serde",
@@ -672,9 +648,9 @@ dependencies = [
[[package]]
name = "bon"
version = "3.7.2"
version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2529c31017402be841eb45892278a6c21a000c0a17643af326c73a73f83f0fb"
checksum = "ebeb9aaf9329dff6ceb65c689ca3db33dbf15f324909c60e4e5eef5701ce31b1"
dependencies = [
"bon-macros",
"rustversion",
@@ -682,9 +658,9 @@ dependencies = [
[[package]]
name = "bon-macros"
version = "3.7.2"
version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d82020dadcb845a345591863adb65d74fa8dc5c18a0b6d408470e13b7adc7005"
checksum = "77e9d642a7e3a318e37c2c9427b5a6a48aa1ad55dcd986f3034ab2239045a645"
dependencies = [
"darling 0.21.3",
"ident_case",
@@ -737,9 +713,9 @@ dependencies = [
[[package]]
name = "bytes"
version = "1.10.1"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
[[package]]
name = "bytesize"
@@ -827,9 +803,9 @@ dependencies = [
[[package]]
name = "circular-buffer"
version = "1.1.0"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23bdce1da528cadbac4654b5632bfcd8c6c63e25b1d42cea919a95958790b51d"
checksum = "14c638459986b83c2b885179bd4ea6a2cbb05697b001501a56adb3a3d230803b"
[[package]]
name = "clang-sys"
@@ -1807,12 +1783,6 @@ dependencies = [
"weezl",
]
[[package]]
name = "gimli"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "glam"
version = "0.29.3"
@@ -1841,14 +1811,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386"
dependencies = [
"atomic-waker",
"bytes 1.10.1",
"bytes 1.11.0",
"fnv",
"futures-core",
"futures-sink",
"http",
"indexmap 2.11.3",
"slab",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-util",
"tracing",
]
@@ -1963,12 +1933,11 @@ dependencies = [
[[package]]
name = "http"
version = "1.3.1"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
dependencies = [
"bytes 1.10.1",
"fnv",
"bytes 1.11.0",
"itoa",
]
@@ -1978,7 +1947,7 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"http",
]
@@ -1988,7 +1957,7 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"futures-core",
"http",
"http-body",
@@ -2015,12 +1984,12 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hyper"
version = "1.7.0"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
dependencies = [
"atomic-waker",
"bytes 1.10.1",
"bytes 1.11.0",
"futures-channel",
"futures-core",
"h2",
@@ -2032,7 +2001,7 @@ dependencies = [
"pin-project-lite",
"pin-utils",
"smallvec 1.15.1",
"tokio 1.47.1",
"tokio 1.48.0",
"want",
]
@@ -2046,7 +2015,7 @@ dependencies = [
"hyper",
"hyper-util",
"pin-project-lite",
"tokio 1.47.1",
"tokio 1.48.0",
"tower-service",
"winapi 0.3.9",
]
@@ -2062,7 +2031,7 @@ dependencies = [
"hyper-util",
"rustls",
"rustls-pki-types",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-rustls",
"tower-service",
"webpki-roots 1.0.2",
@@ -2077,7 +2046,7 @@ dependencies = [
"hyper",
"hyper-util",
"pin-project-lite",
"tokio 1.47.1",
"tokio 1.48.0",
"tower-service",
]
@@ -2087,12 +2056,12 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"http-body-util",
"hyper",
"hyper-util",
"native-tls",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-native-tls",
"tower-service",
]
@@ -2104,7 +2073,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8"
dependencies = [
"base64 0.22.1",
"bytes 1.10.1",
"bytes 1.11.0",
"futures-channel",
"futures-core",
"futures-util",
@@ -2117,7 +2086,7 @@ dependencies = [
"pin-project-lite",
"socket2 0.6.0",
"system-configuration",
"tokio 1.47.1",
"tokio 1.48.0",
"tower-service",
"tracing",
"windows-registry",
@@ -2134,7 +2103,7 @@ dependencies = [
"hyper",
"hyper-util",
"pin-project-lite",
"tokio 1.47.1",
"tokio 1.48.0",
"tower-service",
]
@@ -2373,17 +2342,6 @@ dependencies = [
"rustversion",
]
[[package]]
name = "io-uring"
version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
dependencies = [
"bitflags 2.9.4",
"cfg-if 1.0.3",
"libc",
]
[[package]]
name = "iovec"
version = "0.1.4"
@@ -2529,7 +2487,7 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"libc",
"redox_syscall 0.5.17",
]
@@ -2760,9 +2718,9 @@ dependencies = [
[[package]]
name = "mockall"
version = "0.13.1"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39a6bfcc6c8c7eed5ee98b9c3e33adc726054389233e201c95dab2d41a3839d2"
checksum = "f58d964098a5f9c6b63d0798e5372fd04708193510a7af313c22e9f29b7b620b"
dependencies = [
"cfg-if 1.0.3",
"downcast",
@@ -2774,9 +2732,9 @@ dependencies = [
[[package]]
name = "mockall_derive"
version = "0.13.1"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25ca3004c2efe9011bd4e461bd8256445052b9615405b4f7ea43fc8ca5c20898"
checksum = "ca41ce716dda6a9be188b385aa78ee5260fc25cd3802cb2a8afdc6afbe6b6dbf"
dependencies = [
"cfg-if 1.0.3",
"proc-macro2",
@@ -3003,15 +2961,6 @@ dependencies = [
"url",
]
[[package]]
name = "object"
version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.21.3"
@@ -3024,7 +2973,7 @@ version = "0.10.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"cfg-if 1.0.3",
"foreign-types",
"libc",
@@ -3078,7 +3027,7 @@ version = "0.81.1"
dependencies = [
"anyhow",
"bevy_ecs",
"bitflags 2.9.4",
"bitflags 2.10.0",
"circular-buffer",
"glam 0.30.5",
"libc",
@@ -3122,7 +3071,7 @@ dependencies = [
"axum-cookie",
"axum-test",
"bon",
"bytes 1.10.1",
"bytes 1.11.0",
"chrono",
"cookie",
"dashmap",
@@ -3145,7 +3094,7 @@ dependencies = [
"sqlx",
"testcontainers",
"time",
"tokio 1.47.1",
"tokio 1.48.0",
"tower-http",
"tracing",
"tracing-futures",
@@ -3399,7 +3348,7 @@ version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"crc32fast",
"fdeflate",
"flate2",
@@ -3538,7 +3487,7 @@ version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"prost-derive",
]
@@ -3604,7 +3553,7 @@ version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"cfg_aliases",
"pin-project-lite",
"quinn-proto",
@@ -3613,7 +3562,7 @@ dependencies = [
"rustls",
"socket2 0.6.0",
"thiserror 2.0.16",
"tokio 1.47.1",
"tokio 1.48.0",
"tracing",
"web-time",
]
@@ -3624,7 +3573,7 @@ version = "0.11.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"getrandom 0.3.3",
"lru-slab",
"rand 0.9.2",
@@ -3818,7 +3767,7 @@ version = "0.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
]
[[package]]
@@ -3877,7 +3826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb"
dependencies = [
"base64 0.22.1",
"bytes 1.10.1",
"bytes 1.11.0",
"encoding_rs",
"futures-core",
"h2",
@@ -3901,7 +3850,7 @@ dependencies = [
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-native-tls",
"tokio-rustls",
"tower",
@@ -3965,9 +3914,9 @@ dependencies = [
[[package]]
name = "rust-embed"
version = "8.7.2"
version = "8.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a"
checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca"
dependencies = [
"rust-embed-impl",
"rust-embed-utils",
@@ -3976,9 +3925,9 @@ dependencies = [
[[package]]
name = "rust-embed-impl"
version = "8.7.2"
version = "8.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c"
checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2"
dependencies = [
"proc-macro2",
"quote",
@@ -3989,9 +3938,9 @@ dependencies = [
[[package]]
name = "rust-embed-utils"
version = "8.7.2"
version = "8.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594"
checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475"
dependencies = [
"sha2",
"walkdir",
@@ -4013,7 +3962,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c839d037155ebc06a571e305af66ff9fd9063a6e662447051737e1ac75beea41"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"futures-core",
"futures-util",
"http",
@@ -4022,12 +3971,6 @@ dependencies = [
"thiserror 2.0.16",
]
[[package]]
name = "rustc-demangle"
version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
[[package]]
name = "rustc-hash"
version = "2.1.1"
@@ -4049,7 +3992,7 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"errno",
"libc",
"linux-raw-sys",
@@ -4127,7 +4070,7 @@ version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65bc94b580d0f5a6b7a2d604e597513d3c673154b52ddeccd1d5c32360d945ee"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"rxml_validation",
]
@@ -4154,7 +4097,7 @@ checksum = "2fd8d44de9045104205a93dcfe3525889df62af2d2db6d95ccb44663733b8832"
dependencies = [
"aws-region",
"base64 0.22.1",
"bytes 1.10.1",
"bytes 1.11.0",
"femlol-aws-creds",
"futures 0.3.31",
"hex",
@@ -4175,7 +4118,7 @@ dependencies = [
"strum_macros",
"thiserror 2.0.16",
"time",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-stream",
"tokio-util",
"url",
@@ -4260,7 +4203,7 @@ version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"core-foundation 0.9.4",
"core-foundation-sys",
"libc",
@@ -4273,7 +4216,7 @@ version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"core-foundation 0.10.1",
"core-foundation-sys",
"libc",
@@ -4313,9 +4256,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "serde"
version = "1.0.225"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
@@ -4323,18 +4266,18 @@ dependencies = [
[[package]]
name = "serde_core"
version = "1.0.225"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.225"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
@@ -4618,7 +4561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6"
dependencies = [
"base64 0.22.1",
"bytes 1.10.1",
"bytes 1.11.0",
"chrono",
"crc",
"crossbeam-queue 0.3.12",
@@ -4641,7 +4584,7 @@ dependencies = [
"sha2",
"smallvec 1.15.1",
"thiserror 2.0.16",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-stream",
"tracing",
"url",
@@ -4682,7 +4625,7 @@ dependencies = [
"sqlx-postgres",
"sqlx-sqlite",
"syn",
"tokio 1.47.1",
"tokio 1.48.0",
"url",
]
@@ -4694,9 +4637,9 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526"
dependencies = [
"atoi",
"base64 0.22.1",
"bitflags 2.9.4",
"bitflags 2.10.0",
"byteorder",
"bytes 1.10.1",
"bytes 1.11.0",
"chrono",
"crc",
"digest",
@@ -4737,7 +4680,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46"
dependencies = [
"atoi",
"base64 0.22.1",
"bitflags 2.9.4",
"bitflags 2.10.0",
"byteorder",
"chrono",
"crc",
@@ -4905,7 +4848,7 @@ version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"core-foundation 0.9.4",
"system-configuration-sys",
]
@@ -4967,7 +4910,7 @@ dependencies = [
"async-trait",
"bollard",
"bollard-stubs",
"bytes 1.10.1",
"bytes 1.11.0",
"docker_credential",
"either",
"etcetera 0.10.0",
@@ -4980,7 +4923,7 @@ dependencies = [
"serde_json",
"serde_with",
"thiserror 2.0.16",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-stream",
"tokio-tar",
"tokio-util",
@@ -5147,22 +5090,19 @@ dependencies = [
[[package]]
name = "tokio"
version = "1.47.1"
version = "1.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
dependencies = [
"backtrace",
"bytes 1.10.1",
"io-uring",
"bytes 1.11.0",
"libc",
"mio 1.0.4",
"parking_lot 0.12.4",
"pin-project-lite",
"signal-hook-registry",
"slab",
"socket2 0.6.0",
"tokio-macros",
"windows-sys 0.59.0",
"windows-sys 0.61.0",
]
[[package]]
@@ -5220,9 +5160,9 @@ dependencies = [
[[package]]
name = "tokio-macros"
version = "2.5.0"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
@@ -5236,7 +5176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
dependencies = [
"native-tls",
"tokio 1.47.1",
"tokio 1.48.0",
]
[[package]]
@@ -5265,7 +5205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
dependencies = [
"rustls",
"tokio 1.47.1",
"tokio 1.48.0",
]
[[package]]
@@ -5276,7 +5216,7 @@ checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047"
dependencies = [
"futures-core",
"pin-project-lite",
"tokio 1.47.1",
"tokio 1.48.0",
]
[[package]]
@@ -5299,7 +5239,7 @@ dependencies = [
"futures-core",
"libc",
"redox_syscall 0.3.5",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-stream",
"xattr",
]
@@ -5386,11 +5326,11 @@ version = "0.7.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
dependencies = [
"bytes 1.10.1",
"bytes 1.11.0",
"futures-core",
"futures-sink",
"pin-project-lite",
"tokio 1.47.1",
"tokio 1.48.0",
]
[[package]]
@@ -5436,7 +5376,7 @@ dependencies = [
"async-trait",
"axum",
"base64 0.22.1",
"bytes 1.10.1",
"bytes 1.11.0",
"h2",
"http",
"http-body",
@@ -5448,7 +5388,7 @@ dependencies = [
"pin-project",
"prost",
"socket2 0.5.10",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-stream",
"tower",
"tower-layer",
@@ -5468,7 +5408,7 @@ dependencies = [
"pin-project-lite",
"slab",
"sync_wrapper",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-util",
"tower-layer",
"tower-service",
@@ -5481,8 +5421,8 @@ version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
dependencies = [
"bitflags 2.9.4",
"bytes 1.10.1",
"bitflags 2.10.0",
"bytes 1.11.0",
"futures-core",
"futures-util",
"http",
@@ -5495,7 +5435,7 @@ dependencies = [
"mime_guess",
"percent-encoding",
"pin-project-lite",
"tokio 1.47.1",
"tokio 1.48.0",
"tokio-util",
"tower",
"tower-layer",
@@ -5985,7 +5925,7 @@ version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c"
dependencies = [
"bitflags 2.9.4",
"bitflags 2.10.0",
"js-sys",
"log",
"serde",

View File

@@ -36,7 +36,8 @@ samply:
# Build the project for Emscripten
web *args:
bun run pacman/web.build.ts {{args}};
bun run pacman/web.build.ts {{args}}
bun run --cwd web build
caddy file-server --root web/dist/client
# Fix linting errors & formatting
@@ -51,7 +52,7 @@ push:
# Create a postgres container for the server
server-postgres:
bun run .scripts/postgres.ts
bun run pacman-server/scripts/postgres.ts
# Build the server image
server-image:

View File

@@ -2,7 +2,7 @@
<!-- markdownlint-disable MD041 -->
<div align="center">
<img src="assets/banner.png" alt="Pac-Man Banner Screenshot">
<img src=".github/assets/banner.png" alt="Pac-Man Banner Screenshot">
</div>
# Pac-Man
@@ -49,16 +49,16 @@ However, every commit has build artifacts, so you can grab the [latest build art
## Screenshots
<div align="center">
<img src="assets/screenshots/0.png" alt="Screenshot 0 - Starting Game">
<img src=".github/assets/screenshots/0.png" alt="Screenshot 0 - Starting Game">
<p><em>Starting a new game</em></p>
<img src="assets/screenshots/1.png" alt="Screenshot 1 - Eating Dots">
<img src=".github/assets/screenshots/1.png" alt="Screenshot 1 - Eating Dots">
<p><em>Pac-Man collecting dots and avoiding ghosts</em></p>
<img src="assets/screenshots/2.png" alt="Screenshot 2 - Game Over">
<img src=".github/assets/screenshots/2.png" alt="Screenshot 2 - Game Over">
<p><em>Game over screen after losing all lives</em></p>
<img src="assets/screenshots/3.png" alt="Screenshot 3 - Debug Mode">
<img src=".github/assets/screenshots/3.png" alt="Screenshot 3 - Debug Mode">
<p><em>Debug mode showing hitboxes, node graph, and performance details.</em></p>
</div>

View File

@@ -51,7 +51,7 @@ s3-tokio = { version = "0.39.6", default-features = false }
rustls = { version = "0.23", features = ["ring"] }
image = { version = "0.25", features = ["png", "jpeg"] }
sha2 = "0.10"
mockall = "0.13.1"
mockall = "0.14.0"
# validator = { version = "0.16", features = ["derive"] }
[dev-dependencies]
@@ -64,7 +64,7 @@ anyhow = "1"
axum-test = "18.1.0"
pretty_assertions = "1.4.1"
testcontainers = "0.25.0"
bon = "3.7.2"
bon = "3.8.1"
cookie = "0.18.1"
[lints.rust]

View File

@@ -28,9 +28,9 @@ time = { version = "0.3.43", features = ["formatting", "macros"] }
thiserror = "2.0.16"
anyhow = "1.0"
smallvec = "1.15.1"
bitflags = "2.9.4"
bitflags = "2.10.0"
micromap = "0.1.0"
circular-buffer = "=1.1.0"
circular-buffer = "=1.2.0"
parking_lot = "0.12.3"
strum = "0.27.2"
strum_macros = "0.27.2"
@@ -50,7 +50,7 @@ windows-sys = { version = "0.61.0", features = ["Win32_System_Console"] }
# On desktop platforms, build SDL2 with cargo-vcpkg
sdl2 = { version = "0.38", default-features = false, features = ["image", "ttf", "gfx", "mixer", "unsafe_textures", "static-link", "use-vcpkg"] }
rand = { version = "0.9.2", default-features = false, features = ["thread_rng"] }
rust-embed = "8.7.2"
rust-embed = "8.9.0"
spin_sleep = "1.3.3"
# Browser-specific dependencies

View File

@@ -521,7 +521,7 @@ impl Game {
stage_system.in_set(GameplaySet::Respond),
(
(|mut dirty: ResMut<RenderDirty>, score: Res<ScoreResource>, stage: Res<GameStage>| {
dirty.0 = score.is_changed() || stage.is_changed();
dirty.0 |= score.is_changed() || stage.is_changed();
}),
dirty_render_system.run_if(|dirty: Res<RenderDirty>| dirty.0.not()),
combined_render_system,

View File

@@ -2,9 +2,10 @@ use crate::error::{GameError, TextureError};
use crate::map::builder::Map;
use crate::systems::{
debug_render_system, BatchedLinesResource, Collider, CursorPosition, DebugState, DebugTextureResource, Position, SystemId,
SystemTimings, TtfAtlasResource,
SystemTimings, TouchState, TtfAtlasResource,
};
use crate::texture::sprite::{AtlasTile, SpriteAtlas};
use bevy_ecs::change_detection::DetectChanges;
use bevy_ecs::component::Component;
use bevy_ecs::entity::Entity;
use bevy_ecs::event::EventWriter;
@@ -92,8 +93,10 @@ pub fn dirty_render_system(
mut dirty: ResMut<RenderDirty>,
changed: Query<(), Or<(Changed<Renderable>, Changed<Position>, Changed<Visibility>)>>,
removed_renderables: RemovedComponents<Renderable>,
cursor: Res<CursorPosition>,
touch_state: Res<TouchState>,
) {
if changed.iter().count() > 0 || !removed_renderables.is_empty() {
if changed.iter().count() > 0 || !removed_renderables.is_empty() || cursor.is_changed() || touch_state.is_changed() {
dirty.0 = true;
}
}

View File

@@ -9,7 +9,6 @@
"@tabler/icons-react": "^3.35.0",
"@vitejs/plugin-react": "^5.0.2",
"react": "^19.1.1",
"react-animated-numbers": "^1.1.1",
"react-dom": "^19.1.1",
"vike": "^0.4.240",
"vike-react": "^0.6.5",
@@ -465,8 +464,6 @@
"for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
"framer-motion": ["framer-motion@11.18.2", "", { "dependencies": { "motion-dom": "^11.18.1", "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
@@ -641,12 +638,6 @@
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
"motion": ["motion@11.18.2", "", { "dependencies": { "framer-motion": "^11.18.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg=="],
"motion-dom": ["motion-dom@11.18.1", "", { "dependencies": { "motion-utils": "^11.18.1" } }, "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw=="],
"motion-utils": ["motion-utils@11.18.1", "", {}, "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA=="],
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
@@ -711,8 +702,6 @@
"react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="],
"react-animated-numbers": ["react-animated-numbers@1.1.1", "", { "dependencies": { "motion": "^11.16.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-Jr2vbDWjo5wW+X8wBYRBACpuKdPkLa4A2ZYfxlAR0oc/gXWVeWyAmAWzZj73276IQxycxrTL7aGn4quWV7+l2Q=="],
"react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="],
"react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
@@ -803,8 +792,6 @@
"ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
"typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],

View File

@@ -14,7 +14,6 @@
"@tabler/icons-react": "^3.35.0",
"@vitejs/plugin-react": "^5.0.2",
"react": "^19.1.1",
"react-animated-numbers": "^1.1.1",
"react-dom": "^19.1.1",
"vike": "^0.4.240",
"vike-react": "^0.6.5"

View File

@@ -0,0 +1,9 @@
import "../../layouts/tailwind.css";
export default function GameLayout({ children }: { children: React.ReactNode }) {
return (
<div className="bg-black text-yellow-400 min-h-screen flex flex-col">
<main className="flex-1">{children}</main>
</div>
);
}

View File

@@ -2,32 +2,27 @@ import { useEffect } from "react";
export default function Page() {
useEffect(() => {
// Only setup Module if not already configured (prevents double-initialization on hot reload)
if (!(window as any).Module) {
const canvas = document.getElementById("canvas");
// Simple Module configuration matching the original working approach
(window as any).Module = {
canvas: canvas,
locateFile: (path: string) => {
// Return absolute paths for all resources
return path.startsWith("/") ? path : `/${path}`;
},
preRun: [],
};
// Load the Emscripten script
const script = document.createElement("script");
script.src = "/pacman.js";
script.async = false; // Load synchronously to ensure Module is configured first
script.async = false;
document.body.appendChild(script);
// Cleanup function (runs when component unmounts)
return () => {
script.remove();
};
}
}, []); // Empty dependency array = run once on mount
}, []);
return (
<div className="mt-4 flex justify-center h-[calc(100vh-120px)]">

View File

@@ -1,8 +1,5 @@
import { useState } from "react";
import { IconTrophy, IconCalendar } from "@tabler/icons-react";
import { clientOnly } from "vike-react/clientOnly";
const AnimatedNumbers = clientOnly(() => import("react-animated-numbers"));
interface LeaderboardEntry {
id: number;
@@ -238,15 +235,7 @@ function LeaderboardTable({ data }: { data: LeaderboardEntry[] }) {
</td>
<td className="py-2">
<span className="text-yellow-300 font-[600] text-lg">
<AnimatedNumbers
fallback={<span className="text-transparent">{entry.score.toLocaleString()}</span>}
useThousandsSeparator
transitions={(digitIndex) => ({
type: "easeIn",
duration: 0.75 + digitIndex * 0.25 + entryIndex * 0.2,
})}
animateToNumber={entry.score}
/>
{entry.score.toLocaleString()}
</span>
</td>
<td className="py-2">

View File

@@ -0,0 +1,6 @@
import type { Config } from "vike/types";
export default {
prerender: true, // Generate static HTML for deployment
ssr: false, // Force client-side only rendering
} satisfies Config;