diff --git a/.dockerignore b/.dockerignore index baa891e..b9e9d6d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ # Don't send build artifacts to Docker daemon vendor/ +!vendor/rcheevos/ coverage/ tmp/ **/*.gem diff --git a/.github/workflows/dep-check.yml b/.github/workflows/dep-check.yml index ab4c26a..4a4ef9d 100644 --- a/.github/workflows/dep-check.yml +++ b/.github/workflows/dep-check.yml @@ -10,7 +10,7 @@ jobs: name: Check mGBA version runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Check for new mGBA release run: | diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a9df05b..71f8147 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -19,7 +19,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Fetch coverage data run: | diff --git a/.github/workflows/smoke.yml b/.github/workflows/smoke.yml index 56e7860..e2e948b 100644 --- a/.github/workflows/smoke.yml +++ b/.github/workflows/smoke.yml @@ -8,7 +8,10 @@ jobs: name: smoke test runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 + with: + submodules: true + - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a132ef7..2c41de1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,11 +7,15 @@ on: - '**.md' - 'docs/**' - 'docs_site/**' + - '.github/workflows/windows-test.yml' + - '.github/workflows/smoke.yml' pull_request: paths-ignore: - '**.md' - 'docs/**' - 'docs_site/**' + - '.github/workflows/windows-test.yml' + - '.github/workflows/smoke.yml' schedule: # Run weekly to keep Docker cache fresh (expires after 7 days of no access) - cron: '0 4 * * 0' # Sundays at 4am UTC @@ -28,7 +32,10 @@ jobs: matrix: ruby: ['4.0'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 + with: + submodules: true + - name: Set up Docker Buildx id: buildx @@ -106,7 +113,10 @@ jobs: matrix: ruby: ['4.0'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 + with: + submodules: true + - name: Set up Docker Buildx id: buildx diff --git a/.github/workflows/windows-test.yml b/.github/workflows/windows-test.yml index c6cf07f..aa196c2 100644 --- a/.github/workflows/windows-test.yml +++ b/.github/workflows/windows-test.yml @@ -18,7 +18,9 @@ jobs: name: test (ruby ${{ github.event.inputs.ruby_version }}, Windows) runs-on: windows-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 + with: + submodules: true - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/.gitignore b/.gitignore index 73d28b7..c4da48d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,11 @@ Makefile # Vendor build artifacts (rebuilt with `rake deps`) -vendor/ +# Ignore specific build artifact dirs; vendor/rcheevos is a tracked submodule +vendor/install +vendor/mgba +vendor/install/ +vendor/mgba/ # Gem build *.gem diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4142150 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vendor/rcheevos"] + path = vendor/rcheevos + url = git@github.com:RetroAchievements/rcheevos.git diff --git a/CHANGELOG.md b/CHANGELOG.md index bad7f65..248961e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Added +- RetroAchievements integration — earn achievements while you play; progress tracked and submitted in real time +- Rich Presence support — reports current game activity to your RetroAchievements profile +- Achievements window showing earned/unearned status, points, and descriptions for the current game +- `gemba ra` CLI commands: `login`, `verify`, `logout`, and `achievements` (list a ROM's achievements without launching the emulator) +- Loading a save state while paused now renders the frame the state was captured at, so you can see exactly where you are before resuming - Game Boy and Game Boy Color ROM support (160×144 resolution, correct aspect ratio) - Input recording and replay — record button inputs to `.gir` files and replay them deterministically - Video/audio capture to `.grec` files (F10 hotkey) diff --git a/Dockerfile.ci-test b/Dockerfile.ci-test index 61308b6..ed2395c 100644 --- a/Dockerfile.ci-test +++ b/Dockerfile.ci-test @@ -127,6 +127,7 @@ RUN --mount=type=cache,target=/bundle-cache \ COPY Rakefile ./ COPY ext/ ext/ COPY lib/ lib/ +COPY vendor/rcheevos/ vendor/rcheevos/ # Compile gemba C extension RUN MAKEFLAGS="-j$(nproc)" bundle exec rake compile diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES index 6126c02..ff59e08 100644 --- a/THIRD_PARTY_NOTICES +++ b/THIRD_PARTY_NOTICES @@ -1,5 +1,40 @@ -gemba bundles the following third-party fonts in the assets/ directory. -Both are licensed under the SIL Open Font License, Version 1.1. +gemba bundles the following third-party libraries and fonts. + +================================================================================ +rcheevos +================================================================================ + +Copyright (c) 2018 RetroAchievements.org +https://github.com/RetroAchievements/rcheevos + +Licensed under the MIT License. + +Used for: RetroAchievements runtime — achievement condition evaluation, +Rich Presence string evaluation, and rcheevos network protocol helpers. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +================================================================================ +Fonts (assets/ directory) +================================================================================ + +Both fonts below are licensed under the SIL Open Font License, Version 1.1. ================================================================================ JetBrains Mono NL diff --git a/docs_site/_includes/nav.html b/docs_site/_includes/nav.html index d500490..9e3337d 100644 --- a/docs_site/_includes/nav.html +++ b/docs_site/_includes/nav.html @@ -19,12 +19,126 @@