From 4d2d027bd4fd7f846e404d775847d4ea39c04960 Mon Sep 17 00:00:00 2001 From: Alex Yancey Date: Wed, 21 Jan 2026 20:58:18 -0800 Subject: [PATCH 1/4] Auto create .apworld file on git tag, remove unused GitHub Actions workflows --- .github/workflows/analyze-modified-files.yml | 80 ------- .github/workflows/build.yml | 226 ++----------------- .github/workflows/codeql-analysis.yml | 75 ------ .github/workflows/ctest.yml | 54 ----- .github/workflows/docker.yml | 154 ------------- .github/workflows/label-pull-requests.yml | 47 ---- .github/workflows/release.yml | 176 --------------- .github/workflows/scan-build.yml | 65 ------ .github/workflows/strict-type-check.yml | 33 --- .github/workflows/unittests.yml | 96 -------- 10 files changed, 22 insertions(+), 984 deletions(-) delete mode 100644 .github/workflows/analyze-modified-files.yml delete mode 100644 .github/workflows/codeql-analysis.yml delete mode 100644 .github/workflows/ctest.yml delete mode 100644 .github/workflows/docker.yml delete mode 100644 .github/workflows/label-pull-requests.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/scan-build.yml delete mode 100644 .github/workflows/strict-type-check.yml delete mode 100644 .github/workflows/unittests.yml diff --git a/.github/workflows/analyze-modified-files.yml b/.github/workflows/analyze-modified-files.yml deleted file mode 100644 index 862a050c517..00000000000 --- a/.github/workflows/analyze-modified-files.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Analyze modified files - -on: - pull_request: - paths: - - "**.py" - push: - paths: - - "**.py" - -env: - BASE: ${{ github.event.pull_request.base.sha }} - HEAD: ${{ github.event.pull_request.head.sha }} - BEFORE: ${{ github.event.before }} - AFTER: ${{ github.event.after }} - -jobs: - flake8-or-mypy: - strategy: - fail-fast: false - matrix: - task: [flake8, mypy] - - name: ${{ matrix.task }} - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: "Determine modified files (pull_request)" - if: github.event_name == 'pull_request' - run: | - git fetch origin $BASE $HEAD - DIFF=$(git diff --diff-filter=d --name-only $BASE...$HEAD -- "*.py") - echo "modified files:" - echo "$DIFF" - echo "diff=${DIFF//$'\n'/$' '}" >> $GITHUB_ENV - - - name: "Determine modified files (push)" - if: github.event_name == 'push' && github.event.before != '0000000000000000000000000000000000000000' - run: | - git fetch origin $BEFORE $AFTER - DIFF=$(git diff --diff-filter=d --name-only $BEFORE..$AFTER -- "*.py") - echo "modified files:" - echo "$DIFF" - echo "diff=${DIFF//$'\n'/$' '}" >> $GITHUB_ENV - - - name: "Treat all files as modified (new branch)" - if: github.event_name == 'push' && github.event.before == '0000000000000000000000000000000000000000' - run: | - echo "diff=." >> $GITHUB_ENV - - - uses: actions/setup-python@v5 - if: env.diff != '' - with: - python-version: '3.11' - - - name: "Install dependencies" - if: env.diff != '' - run: | - python -m pip install --upgrade pip ${{ matrix.task }} - python ModuleUpdate.py --append "WebHostLib/requirements.txt" --force --yes - - - name: "flake8: Stop the build if there are Python syntax errors or undefined names" - continue-on-error: false - if: env.diff != '' && matrix.task == 'flake8' - run: | - flake8 --count --select=E9,F63,F7,F82 --ignore F824 --show-source --statistics ${{ env.diff }} - - - name: "flake8: Lint modified files" - continue-on-error: true - if: env.diff != '' && matrix.task == 'flake8' - run: | - flake8 --count --max-complexity=14 --max-doc-length=120 --max-line-length=120 --statistics ${{ env.diff }} - - - name: "mypy: Type check modified files" - continue-on-error: true - if: env.diff != '' && matrix.task == 'mypy' - run: | - mypy --follow-imports=silent --install-types --non-interactive --strict ${{ env.diff }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c0cd14f8b2..8ce4682953b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,219 +1,37 @@ -# This workflow will build a release-like distribution when manually dispatched - name: Build on: push: - paths: - - '.github/workflows/build.yml' - - 'setup.py' - - 'requirements.txt' - - '*.iss' - - 'worlds/*/archipelago.json' + branches: [ "master", "main" ] + tags: + - '*' pull_request: - paths: - - '.github/workflows/build.yml' - - 'setup.py' - - 'requirements.txt' - - '*.iss' - - 'worlds/*/archipelago.json' - workflow_dispatch: - -env: - ENEMIZER_VERSION: 7.1 - # NOTE: since appimage/appimagetool and appimage/type2-runtime does not have tags anymore, - # we check the sha256 and require manual intervention if it was updated. - APPIMAGE_FORK: 'PopTracker' - APPIMAGETOOL_VERSION: 'r-2025-11-18' - APPIMAGETOOL_X86_64_HASH: '4577a452b30af2337123fbb383aea154b618e51ad5448c3b62085cbbbfbfd9a2' - APPIMAGE_RUNTIME_VERSION: 'r-2025-11-07' - APPIMAGE_RUNTIME_X86_64_HASH: '27ddd3f78e483fc5f7856e413d7c17092917f8c35bfe3318a0d378aa9435ad17' + branches: [ "master", "main" ] -permissions: # permissions required for attestation - id-token: 'write' - attestations: 'write' +permissions: + contents: write jobs: - # build-release-macos: # LF volunteer - - build-win: # RCs and releases may still be built and signed by hand - runs-on: windows-latest + build-apworld: + runs-on: ubuntu-latest steps: - # - copy code below to release.yml - - uses: actions/checkout@v4 - - name: Install python - uses: actions/setup-python@v5 - with: - python-version: '~3.12.7' - check-latest: true - - name: Download run-time dependencies - run: | - Invoke-WebRequest -Uri https://github.com/Ijwu/Enemizer/releases/download/${Env:ENEMIZER_VERSION}/win-x64.zip -OutFile enemizer.zip - Expand-Archive -Path enemizer.zip -DestinationPath EnemizerCLI -Force - choco install innosetup --version=6.2.2 --allow-downgrade - - name: Build - run: | - python -m pip install --upgrade pip - python setup.py build_exe --yes - if ( $? -eq $false ) { - Write-Error "setup.py failed!" - exit 1 - } - $NAME="$(ls build | Select-String -Pattern 'exe')".Split('.',2)[1] - $ZIP_NAME="Archipelago_$NAME.7z" - echo "$NAME -> $ZIP_NAME" - echo "ZIP_NAME=$ZIP_NAME" >> $Env:GITHUB_ENV - New-Item -Path dist -ItemType Directory -Force - cd build - Rename-Item "exe.$NAME" Archipelago - 7z a -mx=9 -mhe=on -ms "../dist/$ZIP_NAME" Archipelago - Rename-Item Archipelago "exe.$NAME" # inno_setup.iss expects the original name - - name: Build Setup - run: | - & "${env:ProgramFiles(x86)}\Inno Setup 6\iscc.exe" inno_setup.iss /DNO_SIGNTOOL - if ( $? -eq $false ) { - Write-Error "Building setup failed!" - exit 1 - } - $contents = Get-ChildItem -Path setups/*.exe -Force -Recurse - $SETUP_NAME=$contents[0].Name - echo "SETUP_NAME=$SETUP_NAME" >> $Env:GITHUB_ENV - # - copy code above to release.yml - - - name: Attest Build - if: ${{ github.event_name == 'workflow_dispatch' }} - uses: actions/attest-build-provenance@v2 - with: - subject-path: | - build/exe.*/ArchipelagoLauncher.exe - build/exe.*/ArchipelagoLauncherDebug.exe - build/exe.*/ArchipelagoGenerate.exe - build/exe.*/ArchipelagoServer.exe - dist/${{ env.ZIP_NAME }} - setups/${{ env.SETUP_NAME }} - - name: Check build loads expected worlds - shell: bash - run: | - cd build/exe* - mv Players/Templates/meta.yaml . - ls -1 Players/Templates | sort > setup-player-templates.txt - rm -R Players/Templates - timeout 30 ./ArchipelagoLauncher "Generate Template Options" || true - ls -1 Players/Templates | sort > generated-player-templates.txt - cmp setup-player-templates.txt generated-player-templates.txt \ - || diff setup-player-templates.txt generated-player-templates.txt - mv meta.yaml Players/Templates/ - - name: Test Generate - shell: bash - run: | - cd build/exe* - cp Players/Templates/VVVVVV.yaml Players/ - timeout 30 ./ArchipelagoGenerate - - name: Store 7z - uses: actions/upload-artifact@v4 - with: - name: ${{ env.ZIP_NAME }} - path: dist/${{ env.ZIP_NAME }} - compression-level: 0 # .7z is incompressible by zip - if-no-files-found: error - retention-days: 7 # keep for 7 days, should be enough - - name: Store Setup - uses: actions/upload-artifact@v4 - with: - name: ${{ env.SETUP_NAME }} - path: setups/${{ env.SETUP_NAME }} - if-no-files-found: error - retention-days: 7 # keep for 7 days, should be enough - build-ubuntu2204: - runs-on: ubuntu-22.04 - steps: - # - copy code below to release.yml - - - uses: actions/checkout@v4 - - name: Install base dependencies - run: | - sudo apt update - sudo apt -y install build-essential p7zip xz-utils wget libglib2.0-0 - sudo apt -y install python3-gi libgirepository1.0-dev # should pull dependencies for gi installation below - - name: Get a recent python - uses: actions/setup-python@v5 - with: - python-version: '~3.12.7' - check-latest: true - - name: Install build-time dependencies + - name: Create minecraft.apworld run: | - echo "PYTHON=python3.12" >> $GITHUB_ENV - wget -nv https://github.com/$APPIMAGE_FORK/appimagetool/releases/download/$APPIMAGETOOL_VERSION/appimagetool-x86_64.AppImage - echo "$APPIMAGETOOL_X86_64_HASH appimagetool-x86_64.AppImage" | sha256sum -c - wget -nv https://github.com/$APPIMAGE_FORK/type2-runtime/releases/download/$APPIMAGE_RUNTIME_VERSION/runtime-x86_64 - echo "$APPIMAGE_RUNTIME_X86_64_HASH runtime-x86_64" | sha256sum -c - chmod a+rx appimagetool-x86_64.AppImage - ./appimagetool-x86_64.AppImage --appimage-extract - echo -e '#/bin/sh\n./squashfs-root/AppRun --runtime-file runtime-x86_64 "$@"' > appimagetool - chmod a+rx appimagetool - - name: Download run-time dependencies - run: | - wget -nv https://github.com/Ijwu/Enemizer/releases/download/$ENEMIZER_VERSION/ubuntu.16.04-x64.7z - 7za x -oEnemizerCLI/ ubuntu.16.04-x64.7z - - name: Build - run: | - # pygobject is an optional dependency for kivy that's not in requirements - # charset-normalizer was somehow incomplete in the github runner - "${{ env.PYTHON }}" -m venv venv - source venv/bin/activate - "${{ env.PYTHON }}" -m pip install --upgrade pip "PyGObject<3.51.0" charset-normalizer - python setup.py build_exe --yes bdist_appimage --yes - echo -e "setup.py build output:\n `ls build`" - echo -e "setup.py dist output:\n `ls dist`" - cd dist && export APPIMAGE_NAME="`ls *.AppImage`" && cd .. - export TAR_NAME="${APPIMAGE_NAME%.AppImage}.tar.gz" - (cd build && DIR_NAME="`ls | grep exe`" && mv "$DIR_NAME" Archipelago && tar -cv Archipelago | gzip -8 > ../dist/$TAR_NAME && mv Archipelago "$DIR_NAME") - echo "APPIMAGE_NAME=$APPIMAGE_NAME" >> $GITHUB_ENV - echo "TAR_NAME=$TAR_NAME" >> $GITHUB_ENV - # - copy code above to release.yml - - - name: Attest Build - if: ${{ github.event_name == 'workflow_dispatch' }} - uses: actions/attest-build-provenance@v2 - with: - subject-path: | - build/exe.*/ArchipelagoLauncher - build/exe.*/ArchipelagoGenerate - build/exe.*/ArchipelagoServer - dist/${{ env.APPIMAGE_NAME }}* - dist/${{ env.TAR_NAME }} - - name: Build Again - run: | - source venv/bin/activate - python setup.py build_exe --yes - - name: Check build loads expected worlds - shell: bash - run: | - cd build/exe* - mv Players/Templates/meta.yaml . - ls -1 Players/Templates | sort > setup-player-templates.txt - rm -R Players/Templates - timeout 30 ./ArchipelagoLauncher "Generate Template Options" || true - ls -1 Players/Templates | sort > generated-player-templates.txt - cmp setup-player-templates.txt generated-player-templates.txt \ - || diff setup-player-templates.txt generated-player-templates.txt - mv meta.yaml Players/Templates/ - - name: Test Generate - shell: bash - run: | - cd build/exe* - cp Players/Templates/VVVVVV.yaml Players/ - timeout 30 ./ArchipelagoGenerate - - name: Store AppImage + cd worlds + zip -r ../minecraft_fabric.apworld minecraft_fabric + + - name: Upload APWorld Artifact uses: actions/upload-artifact@v4 with: - name: ${{ env.APPIMAGE_NAME }} - path: dist/${{ env.APPIMAGE_NAME }} - if-no-files-found: error - retention-days: 7 - - name: Store .tar.gz - uses: actions/upload-artifact@v4 + name: Archipelago-Worlds + path: "*.apworld" + + - name: Update Release with APWorlds + if: github.event_name == 'release' + uses: softprops/action-gh-release@v2 with: - name: ${{ env.TAR_NAME }} - path: dist/${{ env.TAR_NAME }} - compression-level: 0 # .gz is incompressible by zip - if-no-files-found: error - retention-days: 7 + files: "*.apworld" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 3abbb5f6449..00000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,75 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ main ] - paths: - - '**.py' - - '**.js' - - '.github/workflows/codeql-analysis.yml' - pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - paths: - - '**.py' - - '**.js' - - '.github/workflows/codeql-analysis.yml' - schedule: - - cron: '44 8 * * 1' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - language: [ 'javascript', 'python' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/ctest.yml b/.github/workflows/ctest.yml deleted file mode 100644 index 610f6d74777..00000000000 --- a/.github/workflows/ctest.yml +++ /dev/null @@ -1,54 +0,0 @@ -# Run CMake / CTest C++ unit tests - -name: ctest - -on: - push: - paths: - - '**.cc?' - - '**.cpp' - - '**.cxx' - - '**.hh?' - - '**.hpp' - - '**.hxx' - - '**/CMakeLists.txt' - - '.github/workflows/ctest.yml' - pull_request: - paths: - - '**.cc?' - - '**.cpp' - - '**.cxx' - - '**.hh?' - - '**.hpp' - - '**.hxx' - - '**/CMakeLists.txt' - - '.github/workflows/ctest.yml' - -jobs: - ctest: - runs-on: ${{ matrix.os }} - name: Test C++ ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, windows-latest] - - steps: - - uses: actions/checkout@v4 - - uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 - if: startsWith(matrix.os,'windows') - - uses: Bacondish2023/setup-googletest@49065d1f7a6d21f6134864dd65980fe5dbe06c73 - with: - build-type: 'Release' - - name: Build tests - run: | - cd test/cpp - mkdir build - cmake -S . -B build/ -DCMAKE_BUILD_TYPE=Release - cmake --build build/ --config Release - ls - - name: Run tests - run: | - cd test/cpp - ctest --test-dir build/ -C Release --output-on-failure diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index 0061dd15b00..00000000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,154 +0,0 @@ -name: Build and Publish Docker Images - -on: - push: - paths: - - "**" - - "!docs/**" - - "!deploy/**" - - "!setup.py" - - "!.gitignore" - - "!.github/workflows/**" - - ".github/workflows/docker.yml" - branches: - - "main" - tags: - - "v?[0-9]+.[0-9]+.[0-9]*" - workflow_dispatch: - -env: - REGISTRY: ghcr.io - -jobs: - prepare: - runs-on: ubuntu-latest - outputs: - image-name: ${{ steps.image.outputs.name }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - package-name: ${{ steps.package.outputs.name }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set lowercase image name - id: image - run: | - echo "name=${GITHUB_REPOSITORY,,}" >> $GITHUB_OUTPUT - - - name: Set package name - id: package - run: | - echo "name=$(basename ${GITHUB_REPOSITORY,,})" >> $GITHUB_OUTPUT - - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ steps.image.outputs.name }} - tags: | - type=ref,event=branch,enable={{is_not_default_branch}} - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,value=nightly,enable={{is_default_branch}} - - - name: Compute final tags - id: final-tags - run: | - readarray -t tags <<< "${{ steps.meta.outputs.tags }}" - - if [[ "${{ github.ref_type }}" == "tag" ]]; then - tag="${{ github.ref_name }}" - if [[ "$tag" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - full_latest="${{ env.REGISTRY }}/${{ steps.image.outputs.name }}:latest" - # Check if latest is already in tags to avoid duplicates - if ! printf '%s\n' "${tags[@]}" | grep -q "^$full_latest$"; then - tags+=("$full_latest") - fi - fi - fi - - # Set multiline output - echo "tags<> $GITHUB_OUTPUT - printf '%s\n' "${tags[@]}" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - build: - needs: prepare - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - strategy: - matrix: - include: - - platform: amd64 - runner: ubuntu-latest - suffix: amd64 - cache-scope: amd64 - - platform: arm64 - runner: ubuntu-24.04-arm - suffix: arm64 - cache-scope: arm64 - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Compute suffixed tags - id: tags - run: | - readarray -t tags <<< "${{ needs.prepare.outputs.tags }}" - suffixed=() - for t in "${tags[@]}"; do - suffixed+=("$t-${{ matrix.suffix }}") - done - echo "tags=$(IFS=','; echo "${suffixed[*]}")" >> $GITHUB_OUTPUT - - - name: Build and push Docker image - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - platforms: linux/${{ matrix.platform }} - push: true - tags: ${{ steps.tags.outputs.tags }} - labels: ${{ needs.prepare.outputs.labels }} - cache-from: type=gha,scope=${{ matrix.cache-scope }} - cache-to: type=gha,mode=max,scope=${{ matrix.cache-scope }} - provenance: false - - manifest: - needs: [prepare, build] - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - name: Log in to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Create and push multi-arch manifest - run: | - readarray -t tag_array <<< "${{ needs.prepare.outputs.tags }}" - - for tag in "${tag_array[@]}"; do - docker manifest create "$tag" \ - "$tag-amd64" \ - "$tag-arm64" - - docker manifest push "$tag" - done diff --git a/.github/workflows/label-pull-requests.yml b/.github/workflows/label-pull-requests.yml deleted file mode 100644 index 1675c942bdd..00000000000 --- a/.github/workflows/label-pull-requests.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Label Pull Request -on: - pull_request_target: - types: ['opened', 'reopened', 'synchronize', 'ready_for_review', 'converted_to_draft', 'closed'] - branches: ['main'] -permissions: - contents: read - pull-requests: write -env: - GH_REPO: ${{ github.repository }} - -jobs: - labeler: - name: 'Apply content-based labels' - runs-on: ubuntu-latest - steps: - - uses: actions/labeler@v5 - with: - sync-labels: false - peer_review: - name: 'Apply peer review label' - needs: labeler - if: >- - (github.event.action == 'opened' || github.event.action == 'reopened' || - github.event.action == 'ready_for_review') && !github.event.pull_request.draft - runs-on: ubuntu-latest - steps: - - name: 'Add label' - run: "gh pr edit \"$PR_URL\" --add-label 'waiting-on: peer-review'" - env: - PR_URL: ${{ github.event.pull_request.html_url }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - unblock_draft_prs: - name: 'Remove waiting-on labels' - needs: labeler - if: github.event.action == 'converted_to_draft' || github.event.action == 'closed' - runs-on: ubuntu-latest - steps: - - name: 'Remove labels' - run: |- - gh pr edit "$PR_URL" --remove-label 'waiting-on: peer-review' \ - --remove-label 'waiting-on: core-review' \ - --remove-label 'waiting-on: world-maintainer' \ - --remove-label 'waiting-on: author' - env: - PR_URL: ${{ github.event.pull_request.html_url }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 7f81e575074..00000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,176 +0,0 @@ -# This workflow will create a release and store builds to it when an x.y.z tag is pushed - -name: Release - -on: - push: - tags: - - 'v?[0-9]+.[0-9]+.[0-9]*' - -env: - ENEMIZER_VERSION: 7.1 - # NOTE: since appimage/appimagetool and appimage/type2-runtime does not have tags anymore, - # we check the sha256 and require manual intervention if it was updated. - APPIMAGE_FORK: 'PopTracker' - APPIMAGETOOL_VERSION: 'r-2025-11-18' - APPIMAGETOOL_X86_64_HASH: '4577a452b30af2337123fbb383aea154b618e51ad5448c3b62085cbbbfbfd9a2' - APPIMAGE_RUNTIME_VERSION: 'r-2025-11-07' - APPIMAGE_RUNTIME_X86_64_HASH: '27ddd3f78e483fc5f7856e413d7c17092917f8c35bfe3318a0d378aa9435ad17' - -permissions: # permissions required for attestation - id-token: 'write' - attestations: 'write' - contents: 'write' # additionally required for release - -jobs: - create-release: - runs-on: ubuntu-latest - steps: - - name: Set env - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV # tag x.y.z will become "Archipelago x.y.z" - - name: Create Release - uses: softprops/action-gh-release@975c1b265e11dd76618af1c374e7981f9a6ff44a - with: - draft: true # don't publish right away, especially since windows build is added by hand - prerelease: false - name: Archipelago ${{ env.RELEASE_VERSION }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # build-release-macos: # LF volunteer - - build-release-win: - runs-on: windows-latest - if: ${{ true }} # change to false to skip if release is built by hand - needs: create-release - steps: - - name: Set env - shell: bash - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - # - code below copied from build.yml - - - uses: actions/checkout@v4 - - name: Install python - uses: actions/setup-python@v5 - with: - python-version: '~3.12.7' - check-latest: true - - name: Download run-time dependencies - run: | - Invoke-WebRequest -Uri https://github.com/Ijwu/Enemizer/releases/download/${Env:ENEMIZER_VERSION}/win-x64.zip -OutFile enemizer.zip - Expand-Archive -Path enemizer.zip -DestinationPath EnemizerCLI -Force - choco install innosetup --version=6.2.2 --allow-downgrade - - name: Build - run: | - python -m pip install --upgrade pip - python setup.py build_exe --yes - if ( $? -eq $false ) { - Write-Error "setup.py failed!" - exit 1 - } - $NAME="$(ls build | Select-String -Pattern 'exe')".Split('.',2)[1] - $ZIP_NAME="Archipelago_$NAME.7z" - echo "$NAME -> $ZIP_NAME" - echo "ZIP_NAME=$ZIP_NAME" >> $Env:GITHUB_ENV - New-Item -Path dist -ItemType Directory -Force - cd build - Rename-Item "exe.$NAME" Archipelago - 7z a -mx=9 -mhe=on -ms "../dist/$ZIP_NAME" Archipelago - Rename-Item Archipelago "exe.$NAME" # inno_setup.iss expects the original name - - name: Build Setup - run: | - & "${env:ProgramFiles(x86)}\Inno Setup 6\iscc.exe" inno_setup.iss /DNO_SIGNTOOL - if ( $? -eq $false ) { - Write-Error "Building setup failed!" - exit 1 - } - $contents = Get-ChildItem -Path setups/*.exe -Force -Recurse - $SETUP_NAME=$contents[0].Name - echo "SETUP_NAME=$SETUP_NAME" >> $Env:GITHUB_ENV - # - code above copied from build.yml - - - name: Attest Build - uses: actions/attest-build-provenance@v2 - with: - subject-path: | - build/exe.*/ArchipelagoLauncher.exe - build/exe.*/ArchipelagoLauncherDebug.exe - build/exe.*/ArchipelagoGenerate.exe - build/exe.*/ArchipelagoServer.exe - setups/* - - name: Add to Release - uses: softprops/action-gh-release@975c1b265e11dd76618af1c374e7981f9a6ff44a - with: - draft: true # see above - prerelease: false - name: Archipelago ${{ env.RELEASE_VERSION }} - files: | - setups/* - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - build-release-ubuntu2204: - runs-on: ubuntu-22.04 - needs: create-release - steps: - - name: Set env - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - # - code below copied from build.yml - - - uses: actions/checkout@v4 - - name: Install base dependencies - run: | - sudo apt update - sudo apt -y install build-essential p7zip xz-utils wget libglib2.0-0 - sudo apt -y install python3-gi libgirepository1.0-dev # should pull dependencies for gi installation below - - name: Get a recent python - uses: actions/setup-python@v5 - with: - python-version: '~3.12.7' - check-latest: true - - name: Install build-time dependencies - run: | - echo "PYTHON=python3.12" >> $GITHUB_ENV - wget -nv https://github.com/$APPIMAGE_FORK/appimagetool/releases/download/$APPIMAGETOOL_VERSION/appimagetool-x86_64.AppImage - echo "$APPIMAGETOOL_X86_64_HASH appimagetool-x86_64.AppImage" | sha256sum -c - wget -nv https://github.com/$APPIMAGE_FORK/type2-runtime/releases/download/$APPIMAGE_RUNTIME_VERSION/runtime-x86_64 - echo "$APPIMAGE_RUNTIME_X86_64_HASH runtime-x86_64" | sha256sum -c - chmod a+rx appimagetool-x86_64.AppImage - ./appimagetool-x86_64.AppImage --appimage-extract - echo -e '#/bin/sh\n./squashfs-root/AppRun --runtime-file runtime-x86_64 "$@"' > appimagetool - chmod a+rx appimagetool - - name: Download run-time dependencies - run: | - wget -nv https://github.com/Ijwu/Enemizer/releases/download/$ENEMIZER_VERSION/ubuntu.16.04-x64.7z - 7za x -oEnemizerCLI/ ubuntu.16.04-x64.7z - - name: Build - run: | - # pygobject is an optional dependency for kivy that's not in requirements - # charset-normalizer was somehow incomplete in the github runner - "${{ env.PYTHON }}" -m venv venv - source venv/bin/activate - "${{ env.PYTHON }}" -m pip install --upgrade pip "PyGObject<3.51.0" charset-normalizer - python setup.py build_exe --yes bdist_appimage --yes - echo -e "setup.py build output:\n `ls build`" - echo -e "setup.py dist output:\n `ls dist`" - cd dist && export APPIMAGE_NAME="`ls *.AppImage`" && cd .. - export TAR_NAME="${APPIMAGE_NAME%.AppImage}.tar.gz" - (cd build && DIR_NAME="`ls | grep exe`" && mv "$DIR_NAME" Archipelago && tar -cv Archipelago | gzip -8 > ../dist/$TAR_NAME && mv Archipelago "$DIR_NAME") - echo "APPIMAGE_NAME=$APPIMAGE_NAME" >> $GITHUB_ENV - echo "TAR_NAME=$TAR_NAME" >> $GITHUB_ENV - # - code above copied from build.yml - - - name: Attest Build - uses: actions/attest-build-provenance@v2 - with: - subject-path: | - build/exe.*/ArchipelagoLauncher - build/exe.*/ArchipelagoGenerate - build/exe.*/ArchipelagoServer - dist/* - - name: Add to Release - uses: softprops/action-gh-release@975c1b265e11dd76618af1c374e7981f9a6ff44a - with: - draft: true # see above - prerelease: false - name: Archipelago ${{ env.RELEASE_VERSION }} - files: | - dist/* - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/scan-build.yml b/.github/workflows/scan-build.yml deleted file mode 100644 index ac842070625..00000000000 --- a/.github/workflows/scan-build.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Native Code Static Analysis - -on: - push: - paths: - - '**.c' - - '**.cc' - - '**.cpp' - - '**.cxx' - - '**.h' - - '**.hh' - - '**.hpp' - - '**.pyx' - - 'setup.py' - - 'requirements.txt' - - '.github/workflows/scan-build.yml' - pull_request: - paths: - - '**.c' - - '**.cc' - - '**.cpp' - - '**.cxx' - - '**.h' - - '**.hh' - - '**.hpp' - - '**.pyx' - - 'setup.py' - - 'requirements.txt' - - '.github/workflows/scan-build.yml' - -jobs: - scan-build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Install newer Clang - run: | - wget https://apt.llvm.org/llvm.sh - chmod +x ./llvm.sh - sudo ./llvm.sh 19 - - name: Install scan-build command - run: | - sudo apt install clang-tools-19 - - name: Get a recent python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - python -m venv venv - source venv/bin/activate - python -m pip install --upgrade pip -r requirements.txt - - name: scan-build - run: | - source venv/bin/activate - scan-build-19 --status-bugs -o scan-build-reports -disable-checker deadcode.DeadStores python setup.py build -y - - name: Store report - if: failure() - uses: actions/upload-artifact@v4 - with: - name: scan-build-reports - path: scan-build-reports diff --git a/.github/workflows/strict-type-check.yml b/.github/workflows/strict-type-check.yml deleted file mode 100644 index 2ccdad8d11a..00000000000 --- a/.github/workflows/strict-type-check.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: type check - -on: - pull_request: - paths: - - "**.py" - - ".github/pyright-config.json" - - ".github/workflows/strict-type-check.yml" - - "**.pyi" - push: - paths: - - "**.py" - - ".github/pyright-config.json" - - ".github/workflows/strict-type-check.yml" - - "**.pyi" - -jobs: - pyright: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - - name: "Install dependencies" - run: | - python -m pip install --upgrade pip pyright==1.1.392.post0 - python ModuleUpdate.py --append "WebHostLib/requirements.txt" --force --yes - - - name: "pyright: strict check on specific files" - run: python .github/type_check.py diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml deleted file mode 100644 index b08b389005e..00000000000 --- a/.github/workflows/unittests.yml +++ /dev/null @@ -1,96 +0,0 @@ -# This workflow will install Python dependencies, run tests and lint with a single version of Python -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions - -name: unittests - -on: - push: - paths: - - '**' - - '!docs/**' - - '!deploy/**' - - '!setup.py' - - '!Dockerfile' - - '!*.iss' - - '!.gitignore' - - '!.dockerignore' - - '!.github/workflows/**' - - '.github/workflows/unittests.yml' - pull_request: - paths: - - '**' - - '!docs/**' - - '!deploy/**' - - '!setup.py' - - '!Dockerfile' - - '!*.iss' - - '!.gitignore' - - '!.dockerignore' - - '!.github/workflows/**' - - '.github/workflows/unittests.yml' - -jobs: - unit: - runs-on: ${{ matrix.os }} - name: Test Python ${{ matrix.python.version }} ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - python: - - {version: '3.11.2'} # Change to '3.11' around 2026-06-10 - - {version: '3.12'} - - {version: '3.13'} - include: - - python: {version: '3.11'} # old compat - os: windows-latest - - python: {version: '3.13'} # current - os: windows-latest - - python: {version: '3.13'} # current - os: macos-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python.version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python.version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r ci-requirements.txt - python ModuleUpdate.py --yes --force --append "WebHostLib/requirements.txt" - python Launcher.py --update_settings # make sure host.yaml exists for tests - - name: Unittests - run: | - pytest -n auto - - hosting: - runs-on: ${{ matrix.os }} - name: Test hosting with ${{ matrix.python.version }} on ${{ matrix.os }} - - strategy: - matrix: - os: - - ubuntu-latest - python: - - {version: '3.13'} # current - - steps: - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python.version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python.version }} - - name: Install dependencies - run: | - python -m venv venv - source venv/bin/activate - python -m pip install --upgrade pip - python ModuleUpdate.py --yes --force --append "WebHostLib/requirements.txt" - - name: Test hosting - run: | - source venv/bin/activate - export PYTHONPATH=$(pwd) - timeout 600 python test/hosting/__main__.py From be75167db2fee3fdc7c78e875a533f7ab9df0bc4 Mon Sep 17 00:00:00 2001 From: Alex Yancey Date: Wed, 21 Jan 2026 21:01:03 -0800 Subject: [PATCH 2/4] Support release-triggered builds and tag-based uploads in GitHub Actions --- .github/workflows/build.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ce4682953b..1942c105d9d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,8 @@ on: - '*' pull_request: branches: [ "master", "main" ] + release: + types: [published] permissions: contents: write @@ -28,10 +30,11 @@ jobs: name: Archipelago-Worlds path: "*.apworld" - - name: Update Release with APWorlds - if: github.event_name == 'release' + - name: Update Release with APWorlds (tag push or published release) + if: github.event_name == 'release' || startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: files: "*.apworld" + tag_name: ${{ github.event_name == 'release' && github.event.release.tag_name || github.ref_name }} env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 807f327a79dd0696ea5f2ff7ef3cbcefaa64d61a Mon Sep 17 00:00:00 2001 From: Alex Yancey Date: Wed, 21 Jan 2026 21:08:21 -0800 Subject: [PATCH 3/4] Overhauled README.md to simplify content, focus on Archipelago Mod features, and improve clarity. --- README.md | 215 +++++++++++++++++------------------------------------- 1 file changed, 67 insertions(+), 148 deletions(-) diff --git a/README.md b/README.md index efa18bc1ef0..71f8e9811dc 100644 --- a/README.md +++ b/README.md @@ -1,148 +1,67 @@ -# [Archipelago](https://archipelago.gg) ![Discord Shield](https://discordapp.com/api/guilds/731205301247803413/widget.png?style=shield) | [Install](https://github.com/ArchipelagoMW/Archipelago/releases) - -Archipelago provides a generic framework for developing multiworld capability for game randomizers. In all cases, -presently, Archipelago is also the randomizer itself. - -Currently, the following games are supported: - -* The Legend of Zelda: A Link to the Past -* Factorio -* Subnautica -* Risk of Rain 2 -* The Legend of Zelda: Ocarina of Time -* Timespinner -* Super Metroid -* Secret of Evermore -* Final Fantasy -* VVVVVV -* Raft -* Super Mario 64 -* Meritous -* Super Metroid/Link to the Past combo randomizer (SMZ3) -* ChecksFinder -* Hollow Knight -* The Witness -* Sonic Adventure 2: Battle -* Starcraft 2 -* Donkey Kong Country 3 -* Dark Souls 3 -* Super Mario World -* Pokémon Red and Blue -* Hylics 2 -* Overcooked! 2 -* Zillion -* Lufia II Ancient Cave -* Blasphemous -* Wargroove -* Stardew Valley -* The Legend of Zelda -* The Messenger -* Kingdom Hearts 2 -* The Legend of Zelda: Link's Awakening DX -* Adventure -* DLC Quest -* Noita -* Undertale -* Bumper Stickers -* Mega Man Battle Network 3: Blue Version -* Muse Dash -* DOOM 1993 -* Terraria -* Lingo -* Pokémon Emerald -* DOOM II -* Shivers -* Heretic -* Landstalker: The Treasures of King Nole -* Final Fantasy Mystic Quest -* TUNIC -* Kirby's Dream Land 3 -* Celeste 64 -* Castlevania 64 -* A Short Hike -* Yoshi's Island -* Mario & Luigi: Superstar Saga -* Bomb Rush Cyberfunk -* Aquaria -* Yu-Gi-Oh! Ultimate Masters: World Championship Tournament 2006 -* A Hat in Time -* Old School Runescape -* Kingdom Hearts 1 -* Mega Man 2 -* Yacht Dice -* Faxanadu -* Saving Princess -* Castlevania: Circle of the Moon -* Inscryption -* Civilization VI -* The Legend of Zelda: The Wind Waker -* Jak and Daxter: The Precursor Legacy -* Super Mario Land 2: 6 Golden Coins -* shapez -* Paint -* Celeste (Open World) -* Choo-Choo Charles -* APQuest -* Satisfactory -* EarthBound - -For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). -Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled -windows binaries. - -## History - -Archipelago is built upon a strong legacy of brilliant hobbyists. We want to honor that legacy by showing it here. -The repositories which Archipelago is built upon, inspired by, or otherwise owes its gratitude to are: - -* [bonta0's MultiWorld](https://github.com/Bonta0/ALttPEntranceRandomizer/tree/multiworld_31) -* [AmazingAmpharos' Entrance Randomizer](https://github.com/AmazingAmpharos/ALttPEntranceRandomizer) -* [VT Web Randomizer](https://github.com/sporchia/alttp_vt_randomizer) -* [Dessyreqt's alttprandomizer](https://github.com/Dessyreqt/alttprandomizer) -* [Zarby89's](https://github.com/Ijwu/Enemizer/commits?author=Zarby89) - and [sosuke3's](https://github.com/Ijwu/Enemizer/commits?author=sosuke3) contributions to Enemizer, which make up the - vast majority of Enemizer contributions. - -We recognize that there is a strong community of incredibly smart people that have come before us and helped pave the -path. Just because one person's name may be in a repository title does not mean that only one person made that project -happen. We can't hope to perfectly cover every single contribution that lead up to Archipelago, but we hope to honor -them fairly. - -### Path to the Archipelago - -Archipelago was directly forked from bonta0's `multiworld_31` branch of ALttPEntranceRandomizer (this project has a -long legacy of its own, please check it out linked above) on January 12, 2020. The repository was then named to -_MultiWorld-Utilities_ to better encompass its intended function. As Archipelago matured, then known as -"Berserker's MultiWorld" by some, we found it necessary to transform our repository into a root level repository -(as opposed to a 'forked repo') and change the name (which came later) to better reflect our project. - -## Running Archipelago - -For most people, all you need to do is head over to -the [releases page](https://github.com/ArchipelagoMW/Archipelago/releases), then download and run the appropriate -installer, or AppImage for Linux-based systems. - -If you are a developer or are running on a platform with no compiled releases available, please see our doc on -[running Archipelago from source](docs/running%20from%20source.md). - -## Related Repositories - -This project makes use of multiple other projects. We wouldn't be here without these other repositories and the -contributions of their developers, past and present. - -* [z3randomizer](https://github.com/ArchipelagoMW/z3randomizer) -* [Enemizer](https://github.com/Ijwu/Enemizer) -* [Ocarina of Time Randomizer](https://github.com/TestRunnerSRL/OoT-Randomizer) - -## Contributing - -To contribute to Archipelago, including the WebHost, core program, or by adding a new game, see our -[Contributing guidelines](/docs/contributing.md). - -## FAQ - -For Frequently asked questions, please see the website's [FAQ Page](https://archipelago.gg/faq/en/). - -## Code of Conduct - -Please refer to our [code of conduct](/docs/code_of_conduct.md). +> [!WARNING] +> Right now this mod is still in a very early stage, so do keep in mind that this mod could generate a Randomized Game that is unbeatable! + + +# Archipelago Mod + +This is the "Archipelago Mod," a mod that allows users to connect their Minecraft Game to the Archipelago multiworld multi-game randomizer in order to play Randomizers with multiple games, and/or multiple people! + +Note: The mod sends information from your game to Archipelago to work! + + Advancements the Player Unlocks + Players who have died + Player Inventory Contents + Player Messages in chat (this is used for talking to other players while playing or running commands on the Archipelago Server, but can be toggled on/off in the configs if desired) + +## What does this mod do? + +This mod Interacts with Archipelago to allow for multiple games to communicate with eachother in a Randomizer. + +Everytime an Advancement is unlocked, an Item is sent to either you, or another persons game. + +The Items can be unlocked for Minecraft are Recipes (such as tools, armor, and weapons) and Abilities (such as sleeping, smelting, and trading); These items can be locked behind locations in other peoples games, or behind advancements in Minecraft. + +For more information on what Archipelago is or how it works, you can read HERE! + +## How do I set this mod up? + +In order to play with this mod, you will need to generate an Archipelago Game, which you can read about doing by clicking HERE! (Note: you will need the latest version of the AP World for this!) + +Once you have an Archipelago Game setup, you can open up your game (with this mod installed of course). The next instructions will differ slightly depending on if you want to play Single Player or Multiplayer. + +### Setting up for Single Player + +In order to setup for Single Player, all you need to do is Create a New World, and fill in the required prompts for the AP Server, Slot Name, and Password. + +Screenshot of World Creation showing new Fields for inputting the Server, Slot, and Password + + + +In the event that an incorrect AP Server, Slot Name, or Password is entered, or the Displays a popup that it failed to connect to an Archipelago Server, you can either generate a new world, or you can follow the instructions for Multiplayer. + +### Setting up for Multiplayer + +The instructions for playing on a Multiplayer World are the same up until you join the world. Once you're in the world, you can run the command /connect or /archipelago connect, and fill in the necessary information. + +Screenshot of World Creation showing new Fields for inputting the Server, Slot, and Password + + + +If a World was already generated in Single Player before being put on the server, the Server should connect automatically when the world starts. + +## Does this currently support other Mods? + +Currently this mod doesn't impact other mods, and only randomizes thing within the Vanilla Game, however, Mod Support is a planned feature, and will be coming very soon! + +Once Mod Support is added, Information regarding that will be added here. + +## Will this mod be ported to Forge? + +No, there are no plans to port this to Forge. However, Sinytra Connector can allow Fabric Mods to be run on Forge. + + > [!WARNING] + > Currently there is a crash when trying to run this with Sinytra Connector, but this will be fixed in the very near future. + +Will this be ported to Newer Versions? + +There are no plans to do that at the current moment. I wouldn't be against doing so, but it isn't likely to happen for a long time. From 2072e6af98f6cca9e3f792cd3eaaeb7b97c68339 Mon Sep 17 00:00:00 2001 From: Alex Yancey Date: Wed, 21 Jan 2026 21:40:33 -0800 Subject: [PATCH 4/4] Update README --- README.md | 78 ++++++++++++++++++----------- screenshots/multiplayer_setup.png | Bin 0 -> 18242 bytes screenshots/singleplayer_setup.png | Bin 0 -> 232297 bytes 3 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 screenshots/multiplayer_setup.png create mode 100644 screenshots/singleplayer_setup.png diff --git a/README.md b/README.md index 71f8e9811dc..4512e6ad041 100644 --- a/README.md +++ b/README.md @@ -2,66 +2,84 @@ > Right now this mod is still in a very early stage, so do keep in mind that this mod could generate a Randomized Game that is unbeatable! -# Archipelago Mod +# [Archipelago](https://archipelago.gg/) Randomizer for Minecraft -This is the "Archipelago Mod," a mod that allows users to connect their Minecraft Game to the Archipelago multiworld multi-game randomizer in order to play Randomizers with multiple games, and/or multiple people! +This mod is inspired by [Minecraft_AP_Randomizer](https://github.com/jacobmix/Minecraft_AP_Randomizer), but is written in Fabric instead of Forge. It also has additional features such as easier setup, and the ability to play in singleplayer mode. -Note: The mod sends information from your game to Archipelago to work! +This repo contains the .apworld file to install in the Archipelago launcher. The Fabric mod is [located here](https://github.com/Deadlydiamond98/MinecraftFabricArchipelagoMod). - Advancements the Player Unlocks - Players who have died - Player Inventory Contents - Player Messages in chat (this is used for talking to other players while playing or running commands on the Archipelago Server, but can be toggled on/off in the configs if desired) +## Items -## What does this mod do? +Item recipes, and some mechanics (like jumping, swimming, and running) are locked behind items found by you/other players. Filler items are also included such as experience drops, arrows, planks, and food. -This mod Interacts with Archipelago to allow for multiple games to communicate with eachother in a Randomizer. -Everytime an Advancement is unlocked, an Item is sent to either you, or another persons game. +## Locations (sending items) -The Items can be unlocked for Minecraft are Recipes (such as tools, armor, and weapons) and Abilities (such as sleeping, smelting, and trading); These items can be locked behind locations in other peoples games, or behind advancements in Minecraft. +Locations in this randomizer are represented by various Minecraft achievements. -For more information on what Archipelago is or how it works, you can read HERE! +## Setting it Up -## How do I set this mod up? +1. Follow the [Archipelago Setup Guide](https://archipelago.gg/tutorial/Archipelago/setup_en) to install the launcher +2. Download the latest [AP World](https://github.com/Deadlydiamond98/MinecraftFabricAPWorld/releases) for this mod +3. Use the Options Creator in Archipelago launcher to generate your YAML config +3. Once you've gathered all the YAML configs, and started the server, you can open up your game (with this mod installed of course). The next instructions will differ slightly depending on if you want to play singleplayer or multiplayer -In order to play with this mod, you will need to generate an Archipelago Game, which you can read about doing by clicking HERE! (Note: you will need the latest version of the AP World for this!) +### Singleplayer -Once you have an Archipelago Game setup, you can open up your game (with this mod installed of course). The next instructions will differ slightly depending on if you want to play Single Player or Multiplayer. +1. Install [Prism Launcher](https://prismlauncher.org/) (or your preferred MC launcher if you haven't already) +2. Create a new `1.20.1` instance running Fabric `0.18.4` +3. Install the [Archipelago Mod](https://modrinth.com/mod/archipelago-mod) for Minecraft +4. Create a new single player world, filling in Archipelago server address, port, and password (if needed) -### Setting up for Single Player - -In order to setup for Single Player, all you need to do is Create a New World, and fill in the required prompts for the AP Server, Slot Name, and Password. - -Screenshot of World Creation showing new Fields for inputting the Server, Slot, and Password - - +![Screenshot of World Creation showing new Fields for inputting the Server, Slot, and Password](screenshots/singleplayer_setup.png) In the event that an incorrect AP Server, Slot Name, or Password is entered, or the Displays a popup that it failed to connect to an Archipelago Server, you can either generate a new world, or you can follow the instructions for Multiplayer. -### Setting up for Multiplayer +### Multiplayer The instructions for playing on a Multiplayer World are the same up until you join the world. Once you're in the world, you can run the command /connect or /archipelago connect, and fill in the necessary information. -Screenshot of World Creation showing new Fields for inputting the Server, Slot, and Password +![Screenshot of World Creation showing new Fields for inputting the Server, Slot, and Password +](screenshots/multiplayer_setup.png) - If a World was already generated in Single Player before being put on the server, the Server should connect automatically when the world starts. -## Does this currently support other Mods? + +#### Docker Compose Server Example + +```yaml +services: + mc-archipelago: + image: itzg/minecraft-server:latest + tty: true + stdin_open: true + ports: + - "25565:25565" + environment: + EULA: "TRUE" + TYPE: "FABRIC" + VERSION: "1.20.1" + MODRINTH_PROJECTS: |- + archipelago-mod + MODRINTH_DOWNLOAD_DEPENDENCIES: "required" + volumes: + - "./data:/data" +``` + +## Does this support other Mods? Currently this mod doesn't impact other mods, and only randomizes thing within the Vanilla Game, however, Mod Support is a planned feature, and will be coming very soon! Once Mod Support is added, Information regarding that will be added here. -## Will this mod be ported to Forge? +## Will this be ported to Forge? No, there are no plans to port this to Forge. However, Sinytra Connector can allow Fabric Mods to be run on Forge. - > [!WARNING] - > Currently there is a crash when trying to run this with Sinytra Connector, but this will be fixed in the very near future. +> [!WARNING] +> Currently there is a crash when trying to run this with Sinytra Connector, but this will be fixed in the very near future. -Will this be ported to Newer Versions? +## Will this be ported to Newer Versions? There are no plans to do that at the current moment. I wouldn't be against doing so, but it isn't likely to happen for a long time. diff --git a/screenshots/multiplayer_setup.png b/screenshots/multiplayer_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..02225514a85363f464e0a1cf900f36bd38fed506 GIT binary patch literal 18242 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%0DIx8)FPLn&Y>KhLfoDkc46!7Xm1xb4q(XwObQ4 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 literal 0 HcmV?d00001