Compare commits

..
Author SHA1 Message Date
admin 415acf27cd Use Input System as active input backend 2026-06-11 07:34:26 -07:00
236 changed files with 4874 additions and 8070 deletions
+18 -13
View File
@@ -3,9 +3,18 @@
# for now: filter out annoying TASTY warnings
common --ui_event_filters=-INFO
common --enable_bzlmod
# Use pre-built protoc binary instead of compiling from source
common --incompatible_enable_proto_toolchain_resolution
common --@com_google_protobuf//bazel/toolchains:prefer_prebuilt_protoc=true
# Don't use toolchains_llvm for the swift app build
common:mactools --ignore_dev_dependency
# Try to speed up sandboxes
common --experimental_reuse_sandbox_directories
common --enable_platform_specific_config
common --strategy=Scalac=worker
@@ -16,18 +25,10 @@ common --jobs=64
common --cxxopt="--std=c++23"
common --cxxopt="-Wno-deprecated-non-prototype"
common --per_file_copt=src/test/cpp/.*@-Wno-character-conversion
common --per_file_copt=src/test/cpp/.*@-Wno-deprecated-enum-compare
common --per_file_copt=src/test/cpp/.*@-Wno-sign-compare
common --per_file_copt=src/test/cpp/.*@-Wno-unknown-warning-option
common --host_cxxopt="--std=c++23"
common --javacopt="-Xlint:-options"
# Prefer protobuf's prebuilt protoc toolchain instead of building protoc from
# source when compatible binaries are available.
common --@com_google_protobuf//bazel/toolchains:prefer_prebuilt_protoc
# std::filesystem and other modern C++ deps require macOS 10.15+.
common:macos --macos_minimum_os=10.15
common:macos --host_macos_minimum_os=10.15
@@ -36,8 +37,13 @@ common:macos --host_macos_minimum_os=10.15
# Use host_linkopt for macOS-specific flags to avoid passing them to Linux cross-compilation
common:macos --host_linkopt=-Wl,-no_warn_duplicate_libraries
# Pin default DEVELOPER_DIR so Apple repo rules use full Xcode instead of
# Command Line Tools when they are needed.
# Workaround for grpc cf_event_engine build error on macOS with Bazel 7.x
# See: https://github.com/grpc/grpc/issues/37619
common:macos --features=-module_maps
# Pin DEVELOPER_DIR so Apple repo rules use full Xcode instead of Command Line
# Tools. The sync script writes .bazelrc.xcode with an Xcode build-version
# marker so in-place Xcode updates refresh Bazel's generated Apple toolchains.
common:macos --repo_env=DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
# Local machine or CI overrides. This lets Bazel-only runners use Command Line
@@ -45,9 +51,8 @@ common:macos --repo_env=DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
# generated Xcode settings win when both files exist.
try-import %workspace%/.bazelrc.local
# Xcode config for Apple tool builds. Generated by scripts/sync_bazel_xcode.sh.
# Bakes the Xcode build version into mactools action cache keys without making
# ordinary macOS Bazel builds depend on the installed Xcode build number.
# Xcode config for macOS builds. Generated by scripts/sync_bazel_xcode.sh.
# Bakes the Xcode build version into action cache keys and sets DEVELOPER_DIR.
try-import %workspace%/.bazelrc.xcode
common --java_language_version=25
+1 -1
View File
@@ -1 +1 @@
9.1.1
8.5.1
-93
View File
@@ -1,93 +0,0 @@
name: Bazel Cache Parity
on:
workflow_dispatch:
schedule:
- cron: '17 11 * * *'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: read
jobs:
warm-cache:
runs-on: [self-hosted, bazel]
steps:
- name: Clean workspace
run: |
git sparse-checkout disable 2>/dev/null || true
git config --local core.sparseCheckout false 2>/dev/null || true
git config --local --unset extensions.worktreeConfig 2>/dev/null || true
rm -f .git/info/sparse-checkout .git/config.worktree 2>/dev/null || true
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS=(/opt/homebrew/bin /usr/local/bin)
for path in "${COMMON_PATHS[@]}"; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
export PATH="$path:$PATH"
fi
done
if command -v git-lfs >/dev/null 2>&1; then
git-lfs version
exit 0
fi
brew install git-lfs
git-lfs version
- name: Checkout repository
uses: actions/checkout@v6
with:
persist-credentials: false
lfs: false
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Warm remote cache
run: ./scripts/check_bazel_remote_cache_parity.sh warm
verify-cache:
needs: warm-cache
runs-on: [self-hosted, bazel]
strategy:
fail-fast: false
matrix:
probe: [a, b]
steps:
- name: Clean workspace
run: |
git sparse-checkout disable 2>/dev/null || true
git config --local core.sparseCheckout false 2>/dev/null || true
git config --local --unset extensions.worktreeConfig 2>/dev/null || true
rm -f .git/info/sparse-checkout .git/config.worktree 2>/dev/null || true
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS=(/opt/homebrew/bin /usr/local/bin)
for path in "${COMMON_PATHS[@]}"; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
export PATH="$path:$PATH"
fi
done
if command -v git-lfs >/dev/null 2>&1; then
git-lfs version
exit 0
fi
brew install git-lfs
git-lfs version
- name: Checkout repository
uses: actions/checkout@v6
with:
persist-credentials: false
lfs: false
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Verify remote cache parity
run: ./scripts/check_bazel_remote_cache_parity.sh verify
-7
View File
@@ -7,11 +7,9 @@ on:
- 'src/**'
- 'WORKSPACE'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- 'BUILD.bazel'
- '.bazelrc'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'ci/github_actions/summarize_bazel_bep.py'
- '.github/workflows/bazel_test.yml'
- '!src/main/csharp/**'
- '!src/test/csharp/**'
@@ -20,11 +18,9 @@ on:
- 'src/**'
- 'WORKSPACE'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- 'BUILD.bazel'
- '.bazelrc'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'ci/github_actions/summarize_bazel_bep.py'
- '.github/workflows/bazel_test.yml'
- '!src/main/csharp/**'
- '!src/test/csharp/**'
@@ -112,9 +108,6 @@ jobs:
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Run tests
run: bazel test --build_event_json_file=test.json //src/test/... //src/main/go/...
- name: Summarize Bazel build metrics
if: always()
run: python3 ci/github_actions/summarize_bazel_bep.py test.json
- name: Collect failed test logs
if: always()
run: |
+2 -3
View File
@@ -20,7 +20,6 @@ on:
- 'ci/BUILD.bazel'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- '.bazelrc'
- 'docker-compose.prod.yml'
- 'nginx/**'
@@ -117,7 +116,7 @@ jobs:
bazel build \
--stamp \
--platforms=//:linux_x86_64 \
--extra_toolchains=@llvm_toolchain_linux//:cc-toolchain-x86_64-linux \
--extra_toolchains=@llvm_toolchain_linux//:all \
//ci:eagle_server_image \
//ci:admin_server_image \
//ci:jfr_sidecar_image \
@@ -320,7 +319,7 @@ jobs:
./ci/github_actions/ensure_bazel_installed.sh
bazel build \
--platforms=//:linux_x86_64 \
--extra_toolchains=@llvm_toolchain_linux//:cc-toolchain-x86_64-linux \
--extra_toolchains=@llvm_toolchain_linux//:all \
//ci:warmup_tar
mkdir -p scripts/bin
tar -xf bazel-bin/ci/warmup_tar.tar -C scripts/bin --strip-components=1
+1 -6
View File
@@ -7,16 +7,11 @@ on:
- 'src/main/scala/**'
- 'src/main/protobuf/net/eagle0/eagle/**'
- 'src/main/protobuf/net/eagle0/common/**'
- 'src/main/go/net/eagle0/build/**'
- 'go.mod'
- 'go.sum'
- 'WORKSPACE'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- 'BUILD.bazel'
- '.bazelrc'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'scripts/build_eagle_ci.sh'
- '.github/workflows/eagle_build.yml'
concurrency:
@@ -56,4 +51,4 @@ jobs:
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Build Eagle server
run: ./scripts/build_eagle_ci.sh
run: bazel build //src/main/scala/net/eagle0/eagle:eagle_server
-66
View File
@@ -1,66 +0,0 @@
name: Go Services Build
on:
pull_request:
paths:
- 'src/main/go/net/eagle0/admin_server/**'
- 'src/main/go/net/eagle0/authcli/**'
- 'src/main/go/net/eagle0/authservice/**'
- 'src/main/go/net/eagle0/common/**'
- 'src/main/go/net/eagle0/util/**'
- 'src/main/protobuf/net/eagle0/eagle/api/auth.proto'
- 'src/main/protobuf/net/eagle0/eagle/api/admin/**'
- 'src/main/protobuf/net/eagle0/eagle/internal/auth_internal.proto'
- 'src/main/resources/net/eagle0/attributions.json'
- 'ci/BUILD.bazel'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'ci/github_actions/fetch_lfs.sh'
- 'go.mod'
- 'go.sum'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- '.bazelrc'
- '.github/workflows/go_services_build.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
build:
runs-on: [self-hosted, bazel]
steps:
- name: Prepare non-LFS checkout
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig-no-lfs
GIT_CONFIG_NOSYSTEM: "1"
run: |
git config --global --unset-all filter.lfs.process || true
git config --global filter.lfs.smudge "cat"
git config --global filter.lfs.clean "cat"
git config --global filter.lfs.required false
rm -f .git/hooks/post-checkout .git/hooks/post-merge .git/hooks/pre-push
- name: Checkout repository
uses: actions/checkout@v6
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig-no-lfs
GIT_CONFIG_NOSYSTEM: "1"
with:
persist-credentials: false
lfs: false
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Fetch LFS files needed for admin server
env:
GITHUB_TOKEN: ${{ github.token }}
run: ./ci/github_actions/fetch_lfs.sh --include="src/main/go/net/eagle0/admin_server/static/tiles/*"
- name: Build Go service Docker images
run: bazel build --stamp //ci:admin_server_image //ci:auth_server_image
-2
View File
@@ -6,13 +6,11 @@ on:
paths:
- ".github/workflows/installer_build.yml"
- "ci/github_actions/ensure_bazel_installed.sh"
- ".bazelrc"
- "src/main/go/net/eagle0/clients/win/installer/**"
pull_request:
paths:
- ".github/workflows/installer_build.yml"
- "ci/github_actions/ensure_bazel_installed.sh"
- ".bazelrc"
- "src/main/go/net/eagle0/clients/win/installer/**"
workflow_dispatch:
+1 -2
View File
@@ -31,7 +31,7 @@ jobs:
steps:
- name: Check for relevant changes since last successful run
id: check
uses: actions/github-script@v9
uses: actions/github-script@v8
with:
script: |
if (context.eventName === 'workflow_dispatch') {
@@ -74,7 +74,6 @@ jobs:
'ci/', // CI scripts & workflows
'.github/workflows/ios_testflight.yml',
'MODULE.bazel',
'MODULE.bazel.lock',
'.bazelrc',
];
+150 -155
View File
@@ -24,7 +24,6 @@ on:
- "ci/github_actions/upload_addressables.sh"
- "ci/github_actions/ensure_unity_installed.sh"
- "src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt"
- ".bazelrc"
- "ci/mac/**"
pull_request:
# On PRs, only build Mac when Mac-specific files change. Shared C#/proto
@@ -42,7 +41,6 @@ on:
- "ci/github_actions/build_mac.sh"
- "ci/github_actions/build_unity_mac.sh"
- "ci/github_actions/ensure_bazel_installed.sh"
- ".bazelrc"
- "ci/mac/**"
workflow_dispatch:
inputs:
@@ -52,6 +50,10 @@ on:
default: 'false'
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
permissions:
contents: read
actions: write # Required to delete artifacts after deploy
@@ -63,12 +65,10 @@ env:
KEYCHAIN_NAME: build-${{ github.run_id }}.keychain
jobs:
build-mac:
build-and-sign:
runs-on: [self-hosted, macOS, unity-mac]
concurrency:
group: ${{ github.workflow }}-build-${{ github.head_ref || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
outputs:
submission_id: ${{ steps.notarize-submit.outputs.submission_id }}
should_deploy: ${{ steps.check-deploy.outputs.should_deploy }}
steps:
@@ -151,6 +151,21 @@ jobs:
mkdir -p src/main/csharp/net/eagle0/clients/unity/eagle0/Library
git rev-parse HEAD > src/main/csharp/net/eagle0/clients/unity/eagle0/Library/.last_built_sha
- name: Upload Addressables to CDN
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
env:
ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
run: ./ci/github_actions/upload_addressables.sh StandaloneOSX
- name: Inject Sparkle Framework
if: success()
env:
SPARKLE_EDDSA_PUBLIC_KEY: ${{ secrets.SPARKLE_EDDSA_PUBLIC_KEY }}
run: |
chmod +x ./scripts/inject_sparkle.sh
./scripts/inject_sparkle.sh "${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app"
- name: Check if should deploy
id: check-deploy
run: |
@@ -164,137 +179,8 @@ jobs:
echo "should_deploy=false" >> $GITHUB_OUTPUT
fi
- name: Zip unsigned app for deploy
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
run: |
cd ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
ditto -c -k --keepParent eagle0.app eagle0.app.zip
- name: Upload unsigned app
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
uses: actions/upload-artifact@v7
with:
name: unsigned-mac-app-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app.zip
retention-days: 1
- name: Upload Mac Addressables for deploy
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
uses: actions/upload-artifact@v7
with:
name: mac-addressables-${{ github.run_id }}
path: src/main/csharp/net/eagle0/clients/unity/eagle0/ServerData/StandaloneOSX
if-no-files-found: ignore
retention-days: 1
- name: Archive Build Log
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: editor_mac.log
path: ${{ env.EAGLE0_BUILD_DIR }}/editor_mac.log
retention-days: 3
- name: Cleanup build directory
if: always()
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}"
deploy-mac:
needs: build-mac
if: needs.build-mac.outputs.should_deploy == 'true'
runs-on: [self-hosted, macOS, notarize]
outputs:
deployed_version: ${{ steps.deploy-mac.outputs.deployed_version }}
concurrency:
group: mac-deploy-${{ github.ref }}
cancel-in-progress: false
steps:
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PATH="${COMMON_PATHS}:${PATH}"
for path in /opt/homebrew/bin /usr/local/bin; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
fi
done
if ! command -v git-lfs >/dev/null 2>&1; then
brew install git-lfs
fi
git-lfs --version
- uses: actions/checkout@v6
env:
GIT_LFS_SKIP_SMUDGE: 1
with:
persist-credentials: false
fetch-depth: 0 # For version numbering
- name: Check if run is still latest main
id: check-latest
run: |
if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/main" ]]; then
LATEST_SHA=$(curl -fsSL \
-H "Authorization: Bearer ${{ github.token }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/${{ github.repository }}/commits/main" \
| python3 -c 'import json, sys; print(json.load(sys.stdin)["sha"])')
if [[ "$LATEST_SHA" != "${{ github.sha }}" ]]; then
echo "Skipping deploy because ${{ github.sha }} is no longer latest main ($LATEST_SHA is latest)"
echo "should_deploy=false" >> "$GITHUB_OUTPUT"
exit 0
fi
fi
echo "should_deploy=true" >> "$GITHUB_OUTPUT"
- name: Clean download directory
if: steps.check-latest.outputs.should_deploy == 'true'
run: rm -rf ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
- name: Download unsigned app
if: steps.check-latest.outputs.should_deploy == 'true'
uses: actions/download-artifact@v8
with:
name: unsigned-mac-app-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
- name: Unzip unsigned app
if: steps.check-latest.outputs.should_deploy == 'true'
run: |
cd ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
ditto -x -k eagle0.app.zip .
rm eagle0.app.zip
ls -la ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app/
- name: Clean Addressables directory
if: steps.check-latest.outputs.should_deploy == 'true'
run: rm -rf src/main/csharp/net/eagle0/clients/unity/eagle0/ServerData/StandaloneOSX
- name: Download Mac Addressables
if: steps.check-latest.outputs.should_deploy == 'true'
uses: actions/download-artifact@v8
continue-on-error: true
with:
name: mac-addressables-${{ github.run_id }}
path: src/main/csharp/net/eagle0/clients/unity/eagle0/ServerData/StandaloneOSX
- name: Upload Addressables to CDN
if: steps.check-latest.outputs.should_deploy == 'true'
env:
ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
run: ./ci/github_actions/upload_addressables.sh StandaloneOSX
- name: Inject Sparkle Framework
if: steps.check-latest.outputs.should_deploy == 'true'
env:
SPARKLE_EDDSA_PUBLIC_KEY: ${{ secrets.SPARKLE_EDDSA_PUBLIC_KEY }}
run: |
chmod +x ./scripts/inject_sparkle.sh
./scripts/inject_sparkle.sh "${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app"
- name: Import Code Signing Certificate
if: steps.check-latest.outputs.should_deploy == 'true'
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
env:
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
@@ -337,7 +223,7 @@ jobs:
rm certificate.p12
- name: Code Sign App
if: steps.check-latest.outputs.should_deploy == 'true'
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
env:
SIGNING_IDENTITY: ${{ secrets.SIGNING_IDENTITY }}
run: |
@@ -346,7 +232,7 @@ jobs:
- name: Submit for Notarization
id: notarize-submit
if: steps.check-latest.outputs.should_deploy == 'true'
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APP_SPECIFIC_PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }}
@@ -355,47 +241,156 @@ jobs:
chmod +x ./scripts/notarize_submit.sh
./scripts/notarize_submit.sh "${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app" >> $GITHUB_OUTPUT
- name: Cleanup Keychain
if: always()
run: |
security delete-keychain "$KEYCHAIN_NAME" 2>/dev/null || true
- name: Zip signed app for artifact
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
run: |
cd ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
ditto -c -k --keepParent eagle0.app eagle0.app.zip
- name: Upload signed app
if: success() && steps.check-deploy.outputs.should_deploy == 'true'
uses: actions/upload-artifact@v7
with:
name: signed-mac-app-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app.zip
retention-days: 1
- name: Archive Build Log
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: editor_mac.log
path: ${{ env.EAGLE0_BUILD_DIR }}/editor_mac.log
retention-days: 3
- name: Cleanup build directory
if: always()
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}"
wait-notarization:
needs: build-and-sign
if: needs.build-and-sign.outputs.should_deploy == 'true'
runs-on: [self-hosted, macOS, notarize]
steps:
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PATH="${COMMON_PATHS}:${PATH}"
for path in /opt/homebrew/bin /usr/local/bin; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
fi
done
if ! command -v git-lfs >/dev/null 2>&1; then
brew install git-lfs
fi
git-lfs --version
- uses: actions/checkout@v6
env:
GIT_LFS_SKIP_SMUDGE: 1
with:
persist-credentials: false
sparse-checkout: scripts
- name: Clean download directory
run: rm -rf ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
- name: Download signed app
uses: actions/download-artifact@v8
with:
name: signed-mac-app-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
- name: Unzip signed app
run: |
cd ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
ditto -x -k eagle0.app.zip .
rm eagle0.app.zip
ls -la ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app/
- name: Wait for Notarization and Staple
if: steps.check-latest.outputs.should_deploy == 'true'
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APP_SPECIFIC_PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }}
TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: |
chmod +x ./scripts/notarize_wait.sh
./scripts/notarize_wait.sh "${{ steps.notarize-submit.outputs.submission_id }}" "${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app"
- name: Cleanup Keychain
if: always()
run: |
security delete-keychain "$KEYCHAIN_NAME" 2>/dev/null || true
./scripts/notarize_wait.sh "${{ needs.build-and-sign.outputs.submission_id }}" "${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app"
- name: Zip notarized app for artifact
if: steps.check-latest.outputs.should_deploy == 'true'
run: |
cd ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
rm -f eagle0.app.zip
ditto -c -k --keepParent eagle0.app eagle0.app.zip
- name: Upload notarized app
if: steps.check-latest.outputs.should_deploy == 'true'
uses: actions/upload-artifact@v7
with:
name: notarized-mac-app-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC/eagle0.app.zip
retention-days: 1
- name: Cleanup build directory
if: always()
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}"
deploy:
needs: [build-and-sign, wait-notarization]
if: needs.build-and-sign.outputs.should_deploy == 'true'
runs-on: [self-hosted, macOS, notarize]
outputs:
deployed_version: ${{ steps.deploy-mac.outputs.deployed_version }}
steps:
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PATH="${COMMON_PATHS}:${PATH}"
for path in /opt/homebrew/bin /usr/local/bin; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
fi
done
if ! command -v git-lfs >/dev/null 2>&1; then
brew install git-lfs
fi
git-lfs --version
- uses: actions/checkout@v6
env:
GIT_LFS_SKIP_SMUDGE: 1
with:
persist-credentials: false
fetch-depth: 0 # For version numbering
- name: Clean download directory
run: rm -rf ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
- name: Download notarized app
uses: actions/download-artifact@v8
with:
name: notarized-mac-app-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
- name: Unzip notarized app
run: |
cd ${{ env.EAGLE0_BUILD_DIR }}/eagle0MAC
ditto -x -k eagle0.app.zip .
rm eagle0.app.zip
- name: Ensure Bazel installed
if: steps.check-latest.outputs.should_deploy == 'true'
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Sync Bazel Xcode config
if: steps.check-latest.outputs.should_deploy == 'true'
run: ./scripts/sync_bazel_xcode.sh
- name: Deploy Mac Build
id: deploy-mac
if: steps.check-latest.outputs.should_deploy == 'true'
env:
ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
@@ -439,8 +434,8 @@ jobs:
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}"
notify-mac:
needs: deploy-mac
if: needs.deploy-mac.outputs.deployed_version != ''
needs: deploy
if: needs.deploy.outputs.deployed_version != ''
runs-on: ubuntu-latest
steps:
- name: Purge CDN cache and notify clients
@@ -455,13 +450,13 @@ jobs:
-d '{"files": ["mac/*", "addressables/StandaloneOSX/*"]}' \
--fail || echo "Warning: CDN purge failed (non-fatal)"
curl -X POST "https://admin.eagle0.net/notify-update?platform=mac&version=${{ needs.deploy-mac.outputs.deployed_version }}&required=false" \
curl -X POST "https://admin.eagle0.net/notify-update?platform=mac&version=${{ needs.deploy.outputs.deployed_version }}&required=false" \
-H "X-Notify-Secret: $NOTIFY_SECRET" \
--fail --silent --show-error || echo "Warning: Failed to notify clients (non-fatal)"
# Cleanup job runs regardless of success/failure to prevent artifact accumulation
cleanup:
needs: [build-mac, deploy-mac, notify-mac]
needs: [build-and-sign, wait-notarization, deploy, notify-mac]
if: always()
runs-on: ubuntu-latest
@@ -471,7 +466,7 @@ jobs:
GH_TOKEN: ${{ github.token }}
run: |
# Delete this run's artifacts (names include run ID to avoid conflicts)
for artifact_name in unsigned-mac-app-${{ github.run_id }} notarized-mac-app-${{ github.run_id }} mac-addressables-${{ github.run_id }}; do
for artifact_name in signed-mac-app-${{ github.run_id }} notarized-mac-app-${{ github.run_id }}; do
echo "Deleting artifact: $artifact_name"
artifact_id=$(gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" \
-q ".artifacts[] | select(.name == \"$artifact_name\") | .id")
@@ -1,125 +0,0 @@
name: Renovate Bazel Lockfile
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
paths:
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- 'maven_install.json'
- 'renovate.json'
- '.github/workflows/renovate_bazel_lockfile.yml'
pull_request_target:
types: [opened, reopened, synchronize, ready_for_review]
paths:
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- 'maven_install.json'
- 'renovate.json'
- '.github/workflows/renovate_bazel_lockfile.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.head.ref }}
cancel-in-progress: true
permissions:
contents: write
pull-requests: read
jobs:
check-lockfile:
if: >-
github.event_name == 'pull_request' &&
github.event.pull_request.user.login != 'renovate[bot]'
runs-on: [self-hosted, bazel]
permissions:
contents: read
steps:
- name: Checkout PR
uses: actions/checkout@v6
with:
lfs: false
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Update Maven lockfile
env:
REPIN: "1"
run: bazel run @maven//:pin
- name: Refresh Bazel lockfile
run: bazel build --nobuild //src/main/scala/net/eagle0/eagle:eagle_server //src/main/cpp/net/eagle0/shardok:shardok-server
- name: Verify generated lockfiles are current
run: |
if git diff --quiet -- MODULE.bazel.lock maven_install.json; then
echo "Generated dependency lockfiles are current"
exit 0
fi
echo "Generated dependency lockfiles are stale. Run the lockfile update commands and commit the result:"
echo " REPIN=1 bazel run @maven//:pin"
echo " bazel build --nobuild //src/main/scala/net/eagle0/eagle:eagle_server //src/main/cpp/net/eagle0/shardok:shardok-server"
git diff -- MODULE.bazel.lock maven_install.json
exit 1
update-lockfile:
if: >-
github.event.pull_request.user.login == 'renovate[bot]' &&
github.event.pull_request.head.repo.full_name == github.repository &&
startsWith(github.event.pull_request.head.ref, 'renovate/')
runs-on: [self-hosted, bazel]
steps:
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS=(/opt/homebrew/bin /usr/local/bin)
for path in "${COMMON_PATHS[@]}"; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
export PATH="$path:$PATH"
fi
done
if command -v git-lfs >/dev/null 2>&1; then
git-lfs version
exit 0
fi
brew install git-lfs
git-lfs version
- name: Checkout Renovate branch
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
token: ${{ secrets.RENOVATE_LOCKFILE_TOKEN || github.token }}
lfs: false
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Update Maven lockfile
env:
REPIN: "1"
run: bazel run @maven//:pin
- name: Refresh Bazel lockfile
run: bazel build --nobuild //src/main/scala/net/eagle0/eagle:eagle_server //src/main/cpp/net/eagle0/shardok:shardok-server
- name: Commit generated lockfile updates
run: |
if git diff --quiet -- MODULE.bazel.lock maven_install.json; then
echo "Generated dependency lockfiles are already up to date"
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add MODULE.bazel.lock maven_install.json
git commit -m "Update generated dependency lockfiles"
git push origin "HEAD:${{ github.event.pull_request.head.ref }}"
@@ -1,75 +0,0 @@
name: Renovate Go Artifacts
on:
pull_request_target:
types: [opened, reopened, synchronize, ready_for_review]
paths:
- 'go.mod'
- 'go.sum'
- 'renovate.json'
- '.github/workflows/renovate_go_artifacts.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.head.ref }}
cancel-in-progress: true
permissions:
contents: write
pull-requests: read
jobs:
update-go-artifacts:
if: >-
github.event.pull_request.user.login == 'renovate[bot]' &&
github.event.pull_request.head.repo.full_name == github.repository &&
startsWith(github.event.pull_request.head.ref, 'renovate/')
runs-on: [self-hosted, bazel]
steps:
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS=(/opt/homebrew/bin /usr/local/bin)
for path in "${COMMON_PATHS[@]}"; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
export PATH="$path:$PATH"
fi
done
if command -v git-lfs >/dev/null 2>&1; then
git-lfs version
exit 0
fi
brew install git-lfs
git-lfs version
- name: Checkout Renovate branch
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
token: ${{ secrets.RENOVATE_LOCKFILE_TOKEN || github.token }}
lfs: false
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
cache: false
- name: Update Go module sums
run: go mod download all
- name: Commit generated Go artifact updates
run: |
if git diff --quiet -- go.sum; then
echo "Go artifacts are already up to date"
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add go.sum
git commit -m "Update generated Go artifacts"
git push origin "HEAD:${{ github.event.pull_request.head.ref }}"
+2 -7
View File
@@ -7,14 +7,10 @@ on:
- 'src/main/cpp/**'
- 'src/main/protobuf/net/eagle0/shardok/**'
- 'src/main/protobuf/net/eagle0/common/**'
- 'src/main/go/net/eagle0/build/**'
- 'src/main/resources/net/eagle0/shardok/**'
- 'ci/BUILD.bazel'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'go.mod'
- 'go.sum'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- '.bazelrc'
- '.github/workflows/shardok_arm64_build.yml'
workflow_dispatch:
@@ -68,7 +64,7 @@ jobs:
echo "=== Building shardok-server binary for linux-aarch64 ==="
bazel build \
--platforms=//:linux_arm64 \
--extra_toolchains=@llvm_toolchain_linux_arm64//:cc-toolchain-aarch64-linux \
--extra_toolchains=@llvm_toolchain_linux_arm64//:all \
//src/main/cpp/net/eagle0/shardok:shardok-server
LINUX_BIN="bazel-bin/src/main/cpp/net/eagle0/shardok/shardok-server"
@@ -109,10 +105,9 @@ jobs:
run: |
set -ex
# Keep this in sync with the standalone binary build above.
bazel build \
--platforms=//:linux_arm64 \
--extra_toolchains=@llvm_toolchain_linux_arm64//:cc-toolchain-aarch64-linux \
--extra_toolchains=@llvm_toolchain_linux_arm64//:all \
//ci:shardok_server_image_arm64
IMAGE_PATH=$(readlink -f bazel-bin/ci/shardok_server_image_arm64)
+1 -5
View File
@@ -8,15 +8,11 @@ on:
- 'src/main/protobuf/net/eagle0/shardok/**'
- 'src/main/protobuf/net/eagle0/common/**'
- 'src/main/go/net/eagle0/build/**'
- 'go.mod'
- 'go.sum'
- 'WORKSPACE'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- 'BUILD.bazel'
- '.bazelrc'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'scripts/build_shardok_ci.sh'
- '.github/workflows/shardok_build.yml'
concurrency:
@@ -56,4 +52,4 @@ jobs:
- name: Ensure Bazel installed
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Build Shardok server
run: ./scripts/build_shardok_ci.sh
run: bazel build -c opt //src/main/cpp/net/eagle0/shardok:shardok-server
+28 -228
View File
@@ -21,8 +21,6 @@ on:
- "ci/github_actions/ensure_unity_installed.sh"
- "src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt"
- "MODULE.bazel"
- "MODULE.bazel.lock"
- ".bazelrc"
- "WORKSPACE"
workflow_dispatch:
pull_request:
@@ -44,12 +42,13 @@ on:
- "ci/github_actions/ensure_unity_installed.sh"
- "src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt"
- "MODULE.bazel"
- "MODULE.bazel.lock"
- ".bazelrc"
- "WORKSPACE"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
permissions:
actions: write
contents: read
env:
@@ -60,10 +59,7 @@ jobs:
windows-unity:
runs-on: [self-hosted, macOS, unity-windows]
outputs:
addressables_changed: ${{ steps.addressables.outputs.changed }}
concurrency:
group: ${{ github.workflow }}-build-${{ github.head_ref || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
deployed_version: ${{ steps.get-version.outputs.deployed_version }}
steps:
- name: Prune stale PR refs
@@ -99,7 +95,6 @@ jobs:
persist-credentials: false
lfs: false # Fetch LFS after checkout to avoid stale ref issues
clean: false # Library/ persists between runs on self-hosted runners
fetch-depth: 2 # Keep the previous main commit available for Addressables change detection
- name: Clean stale files
run: |
@@ -161,209 +156,21 @@ jobs:
mkdir -p src/main/csharp/net/eagle0/clients/unity/eagle0/Library
grep "m_EditorVersion:" src/main/csharp/net/eagle0/clients/unity/eagle0/ProjectSettings/ProjectVersion.txt | head -1 | sed 's/m_EditorVersion: //' > src/main/csharp/net/eagle0/clients/unity/eagle0/Library/.last_unity_version
- name: Detect Addressables changes
id: addressables
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
shell: bash
run: |
set -euo pipefail
BASE_SHA="${{ github.event.before }}"
HEAD_SHA="${{ github.sha }}"
if [ -z "$BASE_SHA" ] || [[ "$BASE_SHA" =~ ^0+$ ]]; then
echo "No usable base SHA for this run; uploading Addressables as a safe default."
echo "changed=true" >> "$GITHUB_OUTPUT"
exit 0
fi
if ! git cat-file -e "$BASE_SHA^{commit}"; then
echo "Base SHA $BASE_SHA is not available locally; uploading Addressables as a safe default."
echo "changed=true" >> "$GITHUB_OUTPUT"
exit 0
fi
UNITY_PROJECT="src/main/csharp/net/eagle0/clients/unity/eagle0"
ADDRESSABLE_PREFIXES=(
"$UNITY_PROJECT/Assets/AddressableAssetsData/"
"$UNITY_PROJECT/Assets/Eagle/Effects/"
"$UNITY_PROJECT/Assets/Hex Tiles/"
"$UNITY_PROJECT/Assets/TileableBridgePack/"
"$UNITY_PROJECT/Assets/Shardok/LargeFlames.prefab"
"$UNITY_PROJECT/Assets/Shardok/soundEffects/"
"$UNITY_PROJECT/Assets/Shardok/Sounds/"
"$UNITY_PROJECT/Assets/Medieval Combat Sounds/"
"$UNITY_PROJECT/Assets/Magic Spells Sound Effects LITE/"
"$UNITY_PROJECT/Assets/Fantasy Interface Sounds/"
"$UNITY_PROJECT/Assets/AustraliaAnimalsPackv1/"
"$UNITY_PROJECT/Assets/Editor/BuildScript.cs"
"ci/github_actions/upload_addressables.sh"
)
changed=false
while IFS= read -r file; do
for prefix in "${ADDRESSABLE_PREFIXES[@]}"; do
if [[ "$file" == "$prefix"* ]]; then
echo "Addressables-impacting change: $file"
changed=true
break
fi
done
if [ "$changed" = "true" ]; then
break
fi
done < <(git diff --name-only "$BASE_SHA" "$HEAD_SHA")
if [ "$changed" = "true" ]; then
echo "Uploading Addressables because their inputs changed."
else
echo "Skipping Addressables upload; no Addressables inputs changed."
fi
echo "changed=$changed" >> "$GITHUB_OUTPUT"
- name: Upload Windows player for deploy
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
uses: actions/upload-artifact@v7
with:
name: windows-unity-player-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0WIN
retention-days: 1
- name: Upload Windows Addressables for deploy
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && steps.addressables.outputs.changed == 'true'
uses: actions/upload-artifact@v7
with:
name: windows-addressables-${{ github.run_id }}
path: src/main/csharp/net/eagle0/clients/unity/eagle0/ServerData/StandaloneWindows64
if-no-files-found: ignore
retention-days: 1
- name: Archive build log
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: editor_win.log
path: ${{ env.EAGLE0_BUILD_DIR }}/editor_win.log
retention-days: 3
- name: Archive EditMode test artifacts
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: unity_editmode_tests
path: |
${{ env.EAGLE0_BUILD_DIR }}/editor_editmode_tests.log
${{ env.EAGLE0_BUILD_DIR }}/editmode-test-results.xml
retention-days: 3
- name: Cleanup build directory
if: always()
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}"
deploy-windows:
needs: windows-unity
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
runs-on: [self-hosted, macOS, bazel]
outputs:
deployed_version: ${{ steps.get-version.outputs.deployed_version }}
concurrency:
group: unity-windows-deploy-${{ github.ref }}
cancel-in-progress: false
steps:
- name: Prune stale PR refs
run: |
# Self-hosted runners persist .git between runs. When a PR is updated,
# old local refs (refs/remotes/pull/*/merge) may point to commits whose
# objects were never fetched or have been pruned. Remove these stale refs
# before checkout to prevent "missing object" errors.
if [ -d ".git" ]; then
echo "Pruning stale PR refs..."
git for-each-ref --format='%(refname)' refs/remotes/pull/ 2>/dev/null | \
xargs -r git update-ref -d 2>/dev/null || true
fi
- name: Ensure Git LFS available for checkout
run: |
COMMON_PATHS="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PATH="${COMMON_PATHS}:${PATH}"
for path in /opt/homebrew/bin /usr/local/bin; do
if [ -d "$path" ]; then
echo "$path" >> "$GITHUB_PATH"
fi
done
if ! command -v git-lfs >/dev/null 2>&1; then
brew install git-lfs
fi
git-lfs --version
- uses: actions/checkout@v6
env:
GIT_LFS_SKIP_SMUDGE: 1
with:
persist-credentials: false
lfs: false
clean: false
- name: Check if run is still latest main
id: check-latest
run: |
if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/main" ]]; then
LATEST_SHA=$(curl -fsSL \
-H "Authorization: Bearer ${{ github.token }}" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/${{ github.repository }}/commits/main" \
| python3 -c 'import json, sys; print(json.load(sys.stdin)["sha"])')
if [[ "$LATEST_SHA" != "${{ github.sha }}" ]]; then
echo "Skipping deploy because ${{ github.sha }} is no longer latest main ($LATEST_SHA is latest)"
echo "should_deploy=false" >> "$GITHUB_OUTPUT"
exit 0
fi
fi
echo "should_deploy=true" >> "$GITHUB_OUTPUT"
- name: Clean deploy directory
if: steps.check-latest.outputs.should_deploy == 'true'
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}/eagle0WIN"
- name: Download Windows player
if: steps.check-latest.outputs.should_deploy == 'true'
uses: actions/download-artifact@v8
with:
name: windows-unity-player-${{ github.run_id }}
path: ${{ env.EAGLE0_BUILD_DIR }}/eagle0WIN
- name: Clean Addressables directory
if: steps.check-latest.outputs.should_deploy == 'true' && needs.windows-unity.outputs.addressables_changed == 'true'
run: rm -rf src/main/csharp/net/eagle0/clients/unity/eagle0/ServerData/StandaloneWindows64
- name: Download Windows Addressables
if: steps.check-latest.outputs.should_deploy == 'true' && needs.windows-unity.outputs.addressables_changed == 'true'
uses: actions/download-artifact@v8
continue-on-error: true
with:
name: windows-addressables-${{ github.run_id }}
path: src/main/csharp/net/eagle0/clients/unity/eagle0/ServerData/StandaloneWindows64
- name: Ensure Bazel installed
if: steps.check-latest.outputs.should_deploy == 'true'
run: ./ci/github_actions/ensure_bazel_installed.sh
- name: Upload Addressables to CDN
if: steps.check-latest.outputs.should_deploy == 'true' && needs.windows-unity.outputs.addressables_changed == 'true'
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
env:
ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
run: ./ci/github_actions/upload_addressables.sh StandaloneWindows64
- name: Deploy Windows unity
if: steps.check-latest.outputs.should_deploy == 'true'
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
env:
ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
run: bazel run //src/main/go/net/eagle0/build/unity3d_windows_build_handler:unity3d_windows_build_handler -- "${{ env.EAGLE0_BUILD_DIR }}/eagle0WIN" "/tmp/unity_manifest.txt"
- name: Update unified manifest
if: steps.check-latest.outputs.should_deploy == 'true'
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
env:
ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
@@ -388,47 +195,40 @@ jobs:
- name: Export deployed version
id: get-version
if: steps.check-latest.outputs.should_deploy == 'true'
if: success() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
run: |
VERSION=$(grep "^version=" /tmp/unity_manifest.txt | cut -d= -f2 || date +%Y.%m.%d)
echo "deployed_version=$VERSION" >> $GITHUB_OUTPUT
- name: Archive build log
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: editor_win.log
path: ${{ env.EAGLE0_BUILD_DIR }}/editor_win.log
retention-days: 3
- name: Archive EditMode test artifacts
if: success() || failure()
uses: actions/upload-artifact@v7
with:
name: unity_editmode_tests
path: |
${{ env.EAGLE0_BUILD_DIR }}/editor_editmode_tests.log
${{ env.EAGLE0_BUILD_DIR }}/editmode-test-results.xml
retention-days: 3
- name: Cleanup build directory
if: always()
run: rm -rf "${{ env.EAGLE0_BUILD_DIR }}"
notify-windows:
needs: deploy-windows
if: needs.deploy-windows.outputs.deployed_version != ''
needs: windows-unity
if: needs.windows-unity.outputs.deployed_version != ''
runs-on: ubuntu-latest
steps:
- name: Notify clients of update
env:
NOTIFY_SECRET: ${{ secrets.EAGLE_NOTIFY_SECRET }}
run: |
curl -X POST "https://admin.eagle0.net/notify-update?platform=windows&version=${{ needs.deploy-windows.outputs.deployed_version }}&required=false" \
curl -X POST "https://admin.eagle0.net/notify-update?platform=windows&version=${{ needs.windows-unity.outputs.deployed_version }}&required=false" \
-H "X-Notify-Secret: $NOTIFY_SECRET" \
--fail --silent --show-error || echo "Warning: Failed to notify clients (non-fatal)"
# Cleanup job runs regardless of success/failure to prevent artifact accumulation
cleanup:
needs: [windows-unity, deploy-windows, notify-windows]
if: always() && github.event_name != 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Delete this run's Windows deploy artifacts
env:
GH_TOKEN: ${{ github.token }}
run: |
# Delete this run's artifacts (names include run ID to avoid conflicts)
for artifact_name in windows-unity-player-${{ github.run_id }} windows-addressables-${{ github.run_id }}; do
echo "Deleting artifact: $artifact_name"
artifact_id=$(gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" \
-q ".artifacts[] | select(.name == \"$artifact_name\") | .id")
if [ -n "$artifact_id" ]; then
echo "Deleting artifact ID: $artifact_id"
gh api -X DELETE "repos/${{ github.repository }}/actions/artifacts/$artifact_id" || true
fi
done
echo "Cleanup complete"
+7 -24
View File
@@ -49,10 +49,6 @@ When code changes appear correct locally, create the PR promptly even if long-ru
Opening the PR starts CI on the build machines, uploads results to the Bazel remote cache, and can speed up subsequent
local validation. Continue monitoring any already-started local and CI validation after opening the PR.
For PRs expected to trigger substantial Bazel work in CI, run the relevant Bazel builds and tests locally too. This
workstation is fast, and local Bazel runs can help hydrate the remote cache for the CI builders while still giving
earlier signal on failures.
## GitHub CLI PR Bodies
When creating or editing PR descriptions with multiline bodies, write the body to a temporary markdown file and pass it
@@ -105,14 +101,14 @@ Unity Client ↔ Eagle (gRPC streaming) ↔ Shardok (internal gRPC)
### Building
```bash
# Build Eagle server using the same target as GitHub Actions
./scripts/build_eagle_ci.sh
# Build Eagle server (Scala strategic layer)
bazel build //src/main/scala/net/eagle0/eagle:eagle_server_deploy.jar
# Build Shardok server using the same target and flags as GitHub Actions
./scripts/build_shardok_ci.sh
# Build Shardok server (C++ tactical layer)
bazel build -c opt //src/main/cpp/net/eagle0/shardok:shardok-server
# Warm the remote cache for the main GitHub Actions Bazel builds
./scripts/hydrate_bazel_remote_cache.sh
# Shardok server includes both AI algorithms
bazel build //src/main/cpp/net/eagle0/shardok:shardok-server
# Build Unity/C# client
./scripts/build_protos.sh # Protocol buffer generation for Unity
@@ -165,19 +161,6 @@ bazel run gazelle # Update Go build files
The pre-commit hook runs gazelle but only checks if it succeeds - it does NOT verify the BUILD files are in canonical format. The `gazelle_test` will fail if deps are not alphabetically sorted. **Always run gazelle manually after BUILD file changes.**
### Bazel Cache Hydration
When making changes that will trigger GitHub Actions Bazel builds, run the matching CI script instead of hand-writing
`bazel build` commands. The scripts keep local cache hydration aligned with CI targets, compilation modes, and flags:
```bash
./scripts/build_eagle_ci.sh
./scripts/build_shardok_ci.sh
./scripts/hydrate_bazel_remote_cache.sh
```
Use direct `bazel build` commands only for targeted debugging where CI cache hydration is not the goal.
### Code Formatting
```bash
@@ -238,7 +221,7 @@ ShardokAIClient client(playerId, isDefender, hexMap, settings, AIAlgorithmType::
```bash
# Build the server (includes both AI algorithms)
./scripts/build_shardok_ci.sh
bazel build //src/main/cpp/net/eagle0/shardok:shardok-server
# Test both algorithms
bazel test //src/test/cpp/net/eagle0/shardok/ai:ai_iterative_deepening_test
-3
View File
@@ -1,6 +1,5 @@
load("@bazel_gazelle//:def.bzl", "gazelle")
load("@io_bazel_rules_go//go:def.bzl", "nogo")
load("@rules_shell//shell:sh_test.bzl", "sh_test")
package(default_visibility = ["//visibility:public"])
@@ -11,7 +10,6 @@ platform(
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
missing_toolchain_error = "No Linux x86_64 toolchain matched. Docker/Eagle image builds should pass --platforms=//:linux_x86_64 and --extra_toolchains=@llvm_toolchain_linux//:cc-toolchain-x86_64-linux when compiling C++ code.",
)
# Platform for cross-compiling to Linux ARM64
@@ -21,7 +19,6 @@ platform(
"@platforms//os:linux",
"@platforms//cpu:aarch64",
],
missing_toolchain_error = "No Linux ARM64 toolchain matched. Shardok ARM64 builds should pass --platforms=//:linux_arm64 and --extra_toolchains=@llvm_toolchain_linux_arm64//:cc-toolchain-aarch64-linux.",
)
gazelle(name = "gazelle")
+28 -63
View File
@@ -9,7 +9,7 @@ SCALAPB_VERSION = "1.0.0-alpha.5"
SCALAPB_JSON4S_VERSION = "1.0.0-alpha.1"
AWS_SDK_VERSION = "2.46.9"
AWS_SDK_VERSION = "2.46.7"
SLF4J_VERSION = "2.0.18"
@@ -18,22 +18,14 @@ SLF4J_VERSION = "2.0.18"
#
bazel_dep(name = "bazel_skylib", version = "1.9.0")
bazel_dep(name = "aspect_rules_esbuild", version = "0.26.0")
bazel_dep(name = "aspect_rules_js", version = "3.2.2")
bazel_dep(name = "bazel_jar_jar", version = "0.1.15", repo_name = "bazel_jar_jar")
bazel_dep(name = "platforms", version = "1.1.0")
bazel_dep(name = "rules_dotnet", version = "0.21.5")
bazel_dep(name = "rules_foreign_cc", version = "0.15.1")
bazel_dep(name = "rules_android", version = "0.7.3")
bazel_dep(name = "rules_nodejs", version = "6.7.4")
bazel_dep(name = "rules_pkg", version = "1.2.0")
bazel_dep(name = "rules_shell", version = "0.8.0")
#
# Language Support - Scala
#
bazel_dep(name = "rules_scala", version = "7.2.6")
bazel_dep(name = "rules_scala", version = "7.2.5")
scala_config = use_extension(
"@rules_scala//scala/extensions:config.bzl",
@@ -57,27 +49,17 @@ bazel_dep(name = "toolchains_llvm", version = "1.7.0")
llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm")
LLVM_VERSION = "22.1.7"
LLVM_DISTRIBUTIONS = {
"LLVM-22.1.7-Linux-ARM64.tar.xz": "118ca2d3ad9da34367e05735317854e7977db45dc4c02a32af58da64c23b8789",
"LLVM-22.1.7-Linux-X64.tar.xz": "edb0522b41e261819c06ea437d249f9b8acfa413d3805bc9920eec6fb76ff830",
"LLVM-22.1.7-macOS-ARM64.tar.xz": "4177245188b0a30a6539c96b361dea56f253485756bfd8927a6a59e7301e7806",
}
# Native toolchain (macOS -> macOS, Linux -> Linux)
llvm.toolchain(
name = "llvm_toolchain",
extra_llvm_distributions = LLVM_DISTRIBUTIONS,
llvm_version = LLVM_VERSION,
llvm_version = "20.1.8",
)
# Cross-compilation toolchain (macOS -> Linux x86_64)
# Uses the same LLVM distribution but with a Linux sysroot
llvm.toolchain(
name = "llvm_toolchain_linux",
extra_llvm_distributions = LLVM_DISTRIBUTIONS,
llvm_version = LLVM_VERSION,
llvm_version = "20.1.8",
)
# Linux x86_64 sysroot for cross-compilation
@@ -90,8 +72,7 @@ llvm.sysroot(
# Cross-compilation toolchain (macOS -> Linux ARM64)
llvm.toolchain(
name = "llvm_toolchain_linux_arm64",
extra_llvm_distributions = LLVM_DISTRIBUTIONS,
llvm_version = LLVM_VERSION,
llvm_version = "20.1.8",
)
# Linux ARM64 sysroot for cross-compilation
@@ -172,16 +153,8 @@ use_repo(crate, "map_generator_crates")
# Platform Support - Apple/iOS
#
bazel_dep(name = "apple_support", version = "2.6.1", repo_name = "build_bazel_apple_support")
bazel_dep(name = "rules_apple", version = "4.5.3", repo_name = "build_bazel_rules_apple")
multiple_version_override(
module_name = "rules_swift",
versions = [
"2.1.1",
"3.5.0",
],
)
bazel_dep(name = "apple_support", version = "1.24.5", repo_name = "build_bazel_apple_support")
bazel_dep(name = "rules_apple", version = "4.3.3", repo_name = "build_bazel_rules_apple")
# Register Apple CC toolchain for Objective-C compilation
apple_cc_configure = use_extension(
@@ -194,15 +167,11 @@ use_repo(apple_cc_configure, "local_config_apple_cc", "local_config_apple_cc_too
# Protocol Buffers & RPC
#
bazel_dep(name = "protobuf", version = "35.1", repo_name = "com_google_protobuf")
single_version_override(
module_name = "protobuf",
version = "35.1",
)
bazel_dep(name = "protobuf", version = "33.6", repo_name = "com_google_protobuf")
# Use pre-built protoc binaries instead of compiling from source.
# See: https://protobuf.dev/reference/cpp/cpp-generated/#invocation
prebuilt_protoc = use_extension("@com_google_protobuf//bazel/private/oss/toolchains/prebuilt:protoc_extension.bzl", "protoc")
prebuilt_protoc = use_extension("@com_google_protobuf//bazel/private:prebuilt_protoc_extension.bzl", "protoc")
use_repo(
prebuilt_protoc,
"prebuilt_protoc.linux_aarch_64",
@@ -218,14 +187,17 @@ use_repo(
bazel_dep(name = "rules_proto", version = "7.1.0")
bazel_dep(name = "rules_cc", version = "0.2.19")
bazel_dep(name = "grpc", version = "1.81.1")
bazel_dep(name = "grpc", version = "1.78.0")
# gRPC 1.81.1's generated upb module map trips Clang's layering check in the
# Linux ARM64 cross-toolchain even though the normal Bazel deps are present.
# Patch grpc 1.78.0 to fix rules_python incompatibility: grpc requests Python
# 3.14.0b2 toolchain but rules_python >= 1.6.0 removed it in favor of 3.14.
# Upstream fix: https://github.com/grpc/grpc/commit/459279b
# TODO: Remove this override once a fixed grpc version is published to BCR.
single_version_override(
module_name = "grpc",
patch_strip = 1,
patches = ["//third_party/grpc/patches:disable_xds_client_layering_check.patch"],
patches = ["//third_party/patches:grpc_fix_python_version.patch"],
version = "1.78.0",
)
bazel_dep(name = "grpc-java", version = "1.78.0.bcr.1")
@@ -253,19 +225,19 @@ oci = use_extension("@rules_oci//oci:extensions.bzl", "oci")
# curl -s -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.oci.image.index.v1+json,application/vnd.docker.distribution.manifest.list.v2+json" "https://registry-1.docker.io/v2/library/eclipse-temurin/manifests/25-jre" | python3 -c "import json,sys; m=json.load(sys.stdin); [print(p['digest']) for p in m.get('manifests',[]) if p['platform']['architecture']=='amd64']"
oci.pull(
name = "eclipse_temurin_25_jre",
digest = "sha256:0beb258e10ad28d2bae0f74349a170bdfa67da0ef87c028cbf3d95c3e1170120",
digest = "sha256:98236ffdfb61cff3fc4f8e40e5b80460a5a4c35a0f56a5b4182a926844a7db49",
image = "docker.io/library/eclipse-temurin",
platforms = ["linux/amd64"],
tag = "26-jre",
tag = "25-jre",
)
# Base image for JFR sidecar (Java 25 JDK - includes jcmd for JFR dumps)
oci.pull(
name = "eclipse_temurin_25_jdk",
digest = "sha256:41c3a5b8a607d226c73e81538cd94d0e66f746f41f057561447eb47b40a91a65",
digest = "sha256:bc2d562355813350f47bc472b9721b0b84761866671ad95d9a9f1151fa69da6e",
image = "docker.io/library/eclipse-temurin",
platforms = ["linux/amd64"],
tag = "26-jdk",
tag = "25-jdk",
)
# Base image for Shardok (Ubuntu 24.04 for C++ runtime)
@@ -276,16 +248,15 @@ oci.pull(
"linux/amd64",
"linux/arm64/v8",
],
tag = "26.04",
tag = "24.04",
)
# Base image for Admin Server (Alpine for lightweight Go binary)
oci.pull(
name = "alpine_linux",
digest = "sha256:a2d49ea686c2adfe3c992e47dc3b5e7fa6e6b5055609400dc2acaeb241c829f4",
image = "docker.io/library/alpine",
platforms = ["linux/amd64"],
tag = "3.24",
tag = "3.21",
)
use_repo(oci, "alpine_linux", "alpine_linux_linux_amd64", "eclipse_temurin_25_jdk", "eclipse_temurin_25_jdk_linux_amd64", "eclipse_temurin_25_jre", "eclipse_temurin_25_jre_linux_amd64", "ubuntu_24_04", "ubuntu_24_04_linux_amd64", "ubuntu_24_04_linux_arm64_v8")
@@ -294,7 +265,7 @@ use_repo(oci, "alpine_linux", "alpine_linux_linux_amd64", "eclipse_temurin_25_jd
#
bazel_dep(name = "rules_java", version = "9.6.1")
bazel_dep(name = "rules_jvm_external", version = "7.0")
bazel_dep(name = "rules_jvm_external", version = "6.10")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
@@ -369,10 +340,6 @@ maven.install(
],
duplicate_version_warning = "error",
fail_if_repin_required = True,
known_contributing_modules = [
"grpc-java",
"protobuf",
],
lock_file = "//:maven_install.json",
repositories = [
"https://repo.maven.apache.org/maven2",
@@ -405,7 +372,7 @@ maven.artifact(
artifact = "guava",
force_version = True,
group = "com.google.guava",
version = "33.6.0-jre",
version = "33.6.0-android",
)
use_repo(maven, "maven", "unpinned_maven")
@@ -425,8 +392,6 @@ GTL_SHA = "1969c45dd76eac0dd87e9e2b65cffe358617f4fe1bcd203f72f427742537913a"
http_archive(
name = "gtl",
build_file_content = """
load("@rules_cc//cc:defs.bzl", "cc_library")
cc_library(
name = "gtl",
hdrs = glob(["include/gtl/*.hpp"]),
@@ -454,12 +419,12 @@ http_archive(
)
# Sparkle framework for macOS auto-updates
SPARKLE_VERSION = "2.9.3"
SPARKLE_VERSION = "2.6.4"
http_archive(
name = "sparkle",
build_file = "//src/main/objc/net/eagle0/clients/unity/sparkle/external:BUILD.sparkle",
sha256 = "74a07da821f92b79310009954c0e15f350173374a3abe39095b4fc5096916be6",
sha256 = "50612a06038abc931f16011d7903b8326a362c1074dabccb718404ce8e585f0b",
strip_prefix = "",
url = "https://github.com/sparkle-project/Sparkle/releases/download/%s/Sparkle-%s.tar.xz" % (SPARKLE_VERSION, SPARKLE_VERSION),
)
@@ -560,7 +525,7 @@ register_toolchains("@local_config_apple_cc_toolchains//:all")
# Set dev_dependency so we can turn this off for swift MacOS builds
register_toolchains(
"@llvm_toolchain//:all",
"@llvm_toolchain_linux//:cc-toolchain-x86_64-linux",
"@llvm_toolchain_linux_arm64//:cc-toolchain-aarch64-linux",
"@llvm_toolchain_linux//:all",
"@llvm_toolchain_linux_arm64//:all",
dev_dependency = True,
)
+2366 -1801
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -214,7 +214,7 @@ oci_push(
#
# Shardok Server ARM64 Docker Image (for Hetzner on-demand compute)
#
# Build: bazel build //ci:shardok_server_image_arm64 --platforms=//:linux_arm64 --extra_toolchains=@llvm_toolchain_linux_arm64//:cc-toolchain-aarch64-linux
# Build: bazel build //ci:shardok_server_image_arm64 --platforms=//:linux_arm64 --extra_toolchains=@llvm_toolchain_linux_arm64//:all
# Load: bazel run //ci:shardok_server_load_arm64
# Push: bazel run //ci:shardok_server_push_arm64
#
+2 -22
View File
@@ -5,26 +5,8 @@ set -euo pipefail
COMMON_PATHS="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PATH="${COMMON_PATHS}:${PATH}"
repo_contents_cache_dir() {
if [ "$(uname -s)" = "Darwin" ]; then
printf '%s\n' "${HOME}/Library/Caches/eagle0-bazel-repo-contents"
else
printf '%s\n' "${XDG_CACHE_HOME:-${HOME}/.cache}/eagle0-bazel-repo-contents"
fi
}
write_bazel_local_config() {
local repo_contents_cache
repo_contents_cache="$(repo_contents_cache_dir)"
write_developer_dir_override() {
if [ "$(uname -s)" != "Darwin" ]; then
if [ -n "${CI:-}" ]; then
mkdir -p "$repo_contents_cache"
{
echo "# Generated by ci/github_actions/ensure_bazel_installed.sh; do not edit."
printf 'common --repo_contents_cache=%s\n' "$repo_contents_cache"
} > .bazelrc.local
fi
return
fi
@@ -48,10 +30,8 @@ write_bazel_local_config() {
if [ -f .bazelrc.local ] && [ -z "${CI:-}" ]; then
echo "Keeping existing .bazelrc.local outside CI"
else
mkdir -p "$repo_contents_cache"
{
echo "# Generated by ci/github_actions/ensure_bazel_installed.sh; do not edit."
printf 'common --repo_contents_cache=%s\n' "$repo_contents_cache"
printf 'common:macos --repo_env=DEVELOPER_DIR=%s\n' "$developer_dir"
} > .bazelrc.local
fi
@@ -63,7 +43,7 @@ write_bazel_local_config() {
echo "Using Apple developer directory at $developer_dir"
}
write_bazel_local_config
write_developer_dir_override
if [ -n "${GITHUB_PATH:-}" ]; then
for path in /opt/homebrew/bin /usr/local/bin; do
-235
View File
@@ -1,235 +0,0 @@
#!/usr/bin/env python3
"""Print a compact timing summary from a Bazel build event JSON file."""
from __future__ import annotations
import json
import sys
from collections import Counter, defaultdict
from pathlib import Path
from typing import Any
def duration_to_ms(value: Any) -> float | None:
if value is None:
return None
if isinstance(value, (int, float)):
return float(value)
if isinstance(value, str):
if value.endswith("s"):
try:
return float(value[:-1]) * 1000
except ValueError:
return None
try:
return float(value)
except ValueError:
return None
if isinstance(value, dict):
seconds = value.get("seconds", 0)
nanos = value.get("nanos", 0)
try:
return float(seconds) * 1000 + float(nanos) / 1_000_000
except (TypeError, ValueError):
return None
return None
def format_ms(milliseconds: float | None) -> str | None:
if milliseconds is None:
return None
if milliseconds >= 1000:
return f"{milliseconds / 1000:.2f}s"
return f"{milliseconds:.0f}ms"
def nested_get(data: dict[str, Any], *keys: str) -> Any:
current: Any = data
for key in keys:
if not isinstance(current, dict):
return None
current = current.get(key)
return current
def read_events(path: Path) -> list[dict[str, Any]]:
events = []
with path.open() as file:
for line_number, line in enumerate(file, start=1):
stripped = line.strip()
if not stripped:
continue
try:
event = json.loads(stripped)
except json.JSONDecodeError as error:
print(f"Ignoring malformed BEP line {line_number}: {error}")
continue
if isinstance(event, dict):
events.append(event)
return events
def collect_metric_events(events: list[dict[str, Any]]) -> list[dict[str, Any]]:
metric_events = []
for event in events:
if isinstance(event.get("buildMetrics"), dict):
metric_events.append(event["buildMetrics"])
return metric_events
def first_present(data: dict[str, Any], keys: list[str]) -> Any:
for key in keys:
value = data.get(key)
if value is not None:
return value
return None
def summarize_timing(build_metrics: dict[str, Any]) -> list[str]:
timing = build_metrics.get("timingMetrics")
if not isinstance(timing, dict):
return []
labels = [
("Wall time", ["wallTimeInMs", "wallTime", "elapsedTime"]),
("Loading phase", ["loadingPhaseTimeInMs", "loadingPhaseTime"]),
("Analysis phase", ["analysisPhaseTimeInMs", "analysisPhaseTime"]),
("Execution phase", ["executionPhaseTimeInMs", "executionPhaseTime"]),
("Critical path", ["criticalPathTimeInMs", "criticalPathTime"]),
]
lines = []
for label, keys in labels:
value = format_ms(duration_to_ms(first_present(timing, keys)))
if value is not None:
lines.append(f" {label}: {value}")
return lines
def summarize_counts(build_metrics: dict[str, Any]) -> list[str]:
summaries: list[tuple[str, Any]] = []
action_summary = build_metrics.get("actionSummary")
if isinstance(action_summary, dict):
summaries.extend(
[
("Actions created", action_summary.get("actionsCreated")),
("Actions executed", action_summary.get("actionsExecuted")),
("Action cache hits", action_summary.get("actionCacheHits")),
("Remote cache hits", action_summary.get("remoteCacheHits")),
]
)
target_metrics = build_metrics.get("targetMetrics")
if isinstance(target_metrics, dict):
summaries.extend(
[
("Targets configured", target_metrics.get("targetsConfigured")),
("Targets loaded", target_metrics.get("targetsLoaded")),
]
)
package_metrics = build_metrics.get("packageMetrics")
if isinstance(package_metrics, dict):
summaries.extend(
[
("Packages loaded", package_metrics.get("packagesLoaded")),
("Packages successfully loaded", package_metrics.get("packagesSuccessfullyLoaded")),
]
)
return [f" {label}: {value}" for label, value in summaries if value is not None]
def worker_mnemonic(metric: dict[str, Any]) -> str:
for path in [
("mnemonic",),
("workerKey", "mnemonic"),
("workerKeyInfo", "mnemonic"),
]:
value = nested_get(metric, *path)
if value:
return str(value)
return "unknown"
def worker_actions(metric: dict[str, Any]) -> int | None:
for key in ["actionsExecuted", "executedActionCount", "actionCount", "actions"]:
value = metric.get(key)
if isinstance(value, int):
return value
if isinstance(value, str):
try:
return int(value)
except ValueError:
pass
return None
def summarize_workers(build_metrics: dict[str, Any]) -> list[str]:
worker_metrics = build_metrics.get("workerMetrics")
if not isinstance(worker_metrics, list) or not worker_metrics:
return []
counts = Counter()
actions_by_mnemonic: defaultdict[str, int] = defaultdict(int)
saw_action_counts = False
for metric in worker_metrics:
if not isinstance(metric, dict):
continue
mnemonic = worker_mnemonic(metric)
counts[mnemonic] += 1
actions = worker_actions(metric)
if actions is not None:
saw_action_counts = True
actions_by_mnemonic[mnemonic] += actions
if not counts:
return []
lines = [" Worker metric entries:"]
for mnemonic, count in counts.most_common():
suffix = ""
if saw_action_counts:
suffix = f", actions={actions_by_mnemonic[mnemonic]}"
lines.append(f" {mnemonic}: workers={count}{suffix}")
return lines
def main() -> int:
if len(sys.argv) != 2:
print("Usage: summarize_bazel_bep.py <build_event_json_file>")
return 0
path = Path(sys.argv[1])
if not path.exists():
print(f"Bazel BEP summary: {path} does not exist")
return 0
events = read_events(path)
metric_events = collect_metric_events(events)
if not metric_events:
print("Bazel BEP summary: no buildMetrics event found")
return 0
build_metrics = metric_events[-1]
sections = [
summarize_timing(build_metrics),
summarize_counts(build_metrics),
summarize_workers(build_metrics),
]
lines = [line for section in sections for line in section]
if not lines:
print("Bazel BEP summary: buildMetrics event had no recognized metrics")
return 0
print("Bazel BEP summary:")
for line in lines:
print(line)
return 0
if __name__ == "__main__":
sys.exit(main())
+3 -16
View File
@@ -44,26 +44,13 @@ echo "Target: s3://$DO_BUCKET/addressables/$BUILD_TARGET/"
export AWS_ACCESS_KEY_ID="$ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="$SECRET_KEY"
# Sync bundles to Spaces. Addressable bundle filenames include content hashes, so a
# same-sized existing bundle is already the same content. Use --size-only to avoid
# re-uploading every rebuilt bundle just because Unity gave it a fresh local mtime.
# Metadata files keep stable names, so sync them again without --size-only below.
#
# --delete removes files in destination that don't exist in source.
# --acl public-read makes files publicly accessible.
# Sync bundles to Spaces
# --delete removes files in destination that don't exist in source
# --acl public-read makes files publicly accessible
aws s3 sync "$SERVER_DATA" "s3://$DO_BUCKET/addressables/$BUILD_TARGET/" \
--endpoint-url "$DO_ENDPOINT" \
--acl public-read \
--size-only \
--delete
aws s3 sync "$SERVER_DATA" "s3://$DO_BUCKET/addressables/$BUILD_TARGET/" \
--endpoint-url "$DO_ENDPOINT" \
--acl public-read \
--exclude "*" \
--include "*.bin" \
--include "*.hash" \
--include "*.json"
echo "Addressables upload complete"
echo "Files available at: https://assets.eagle0.net/addressables/$BUILD_TARGET/"
-2
View File
@@ -5,8 +5,6 @@ lower OCI layer and frequently-changing first-party jars in a small top layer,
so most pushes only re-upload the small layer.
"""
load("@rules_java//java/common:java_info.bzl", "JavaInfo")
def _unique_name(jar):
# short_path is unique per jar and stable across commits (it depends only on
# the jar's own package/coordinate, not on unrelated targets), so the deps
+2
View File
@@ -1,3 +1,5 @@
load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
#pkg_tar(
# name = "eagle_servers",
# strip_prefix = "/src/main/scala/net/eagle0",
+1 -1
View File
@@ -532,7 +532,7 @@ jobs:
uses: actions/cache@v3
with:
path: ~/.cache/bazel
key: bazel-linux-${{ hashFiles('MODULE.bazel', 'MODULE.bazel.lock', 'WORKSPACE') }}
key: bazel-linux-${{ hashFiles('MODULE.bazel', 'WORKSPACE') }}
- name: Build Shardok server
run: bazel build -c opt //src/main/cpp/net/eagle0/shardok:shardok-server
+147 -272
View File
@@ -1,298 +1,173 @@
# URP Migration Plan
Last refreshed: 2026-06-12
## Why
## Why This Matters
Unity is removing Built-In Render Pipeline (BiRP) support after Unity 6.7. We're currently on Unity 6.4. Each Unity minor version ships roughly quarterly, giving us a few release cycles before BiRP is dropped. This document lays out the migration plan.
Unity is steering projects away from the Built-in Render Pipeline (BiRP) toward the
Universal Render Pipeline (URP). Eagle0 now runs on URP:
## Strategy: Long-Lived Feature Branch
- `ProjectSettings/GraphicsSettings.asset` points at
`Assets/Settings/URP/Eagle0URPPipeline.asset`.
- Every active quality level in `ProjectSettings/QualitySettings.asset` uses the
same URP pipeline asset.
- Legacy Post Processing Stack v2 has been removed from `Packages/manifest.json`;
keep verifying it stays out with the migration inventory.
All URP conversion work happens on a **long-lived `urp-migration` branch**. Main stays fully functional on BiRP throughout the migration.
The migration should stay visible as a compatibility project, not a cosmetic cleanup.
The remaining goal is to keep future rendering fixes small and well-baselined instead
of rediscovering URP-specific failures late in a Unity upgrade.
- **Main branch**: Continues using BiRP. All gameplay, AI, and server development proceeds normally.
- **URP branch**: Accumulates rendering pipeline changes across all phases.
- **Regular rebasing**: Periodically rebase/merge `main` into the URP branch to stay current. Shader and material changes rarely conflict with gameplay code, so merge conflicts should be manageable.
- **Merge to main**: Only when everything renders correctly and visual QA passes.
## Current Recommendation
This avoids the "everything is pink" problem of switching the pipeline on main before shaders are converted.
Keep URP enabled on main. For follow-up rendering work, use the baseline checklist
and inventory tooling before changing shaders, materials, camera layering, or render
pipeline settings.
## Current State
The next useful work is hardening:
1. Keep the visual baseline current for Connection, Eagle, Shardok, and Settings.
2. Refresh the shader/material inventory after meaningful asset or scene changes.
3. Remove or isolate unused rendering dependencies.
4. Keep third-party beast/effect material compatibility covered by focused tests.
5. Treat future pipeline experiments as separate branches with explicit findings.
This keeps normal gameplay work moving while making rendering regressions easier to
localize.
## What We Can Do Right Now
### 1. Create Visual Baselines
Capture a small set of known-good views before any follow-up change to URP settings,
custom shaders, render ordering, or third-party visual materials. These should be
reproducible enough that a human can compare screenshots after each rendering change.
Minimum baseline scenes and states:
| Area | Required View |
|---|---|
| Connection | Connect panel, stored account list, running games list |
| Eagle map | Normal province map with borders, faction highlights, selected province tooltip |
| Eagle weather | Drought/heat shimmer, flood, blizzard/rain overlays |
| Eagle beasts | Bird/animal/monster beast effects on map and notification panel |
| Eagle UI | Command panel, notifications, settings panel, generated text |
| Shardok | Terrain, grid lines, labels/icons, bridges, fires, overlays, command buttons |
| Scene transitions | Connection -> Eagle -> Shardok -> Eagle |
Immediate deliverable: keep the manual checklist and editor-only capture tool working
so each rendering PR can leave screenshots in an ignored directory.
Use `docs/URP_VISUAL_BASELINE_CHECKLIST.md` for the current manual baseline capture
set.
### 2. Refresh The Shader And Material Inventory
The inventory is useful because scene split, URP, and recent visual fixes changed the
project enough that we should regenerate it before significant rendering work.
Immediate deliverable: a report containing:
- all shaders under `Assets/`
- all materials and the shader each material uses
- all scenes/prefabs that reference custom shaders or Post Processing components
- all usages of Built-in-only shader features:
- `GrabPass`
- `#pragma surface`
- `UnityCG.cginc`
- `UnityUI.cginc`
- tessellation
This report can be generated by an editor script or a small external scanner. The
important bit is making it repeatable so we can measure progress during migration.
Run `Eagle0 > Rendering > Generate URP Migration Inventory` in the Unity editor to
generate the current report. The tool writes markdown and CSV files under Unity
`Temp/urp_migration/`, so running it should not dirty project assets.
The generated CSVs include both the full material list and production material
references, which helps separate game-path shader risk from unused package/demo
assets.
`docs/URP_SHADER_DEBT_INVENTORY.md` records the current production-vs-package
classification for remaining Built-in-style shader patterns.
Current inventory snapshot from June 12, 2026:
- Render pipeline settings are URP for both graphics default and active quality.
- Post Processing Stack reference hits are still zero.
- The all-material inventory is noisy: most material assets are `Standard`, and
many Built-in-only shader hits are in third-party or package/demo assets.
- The production material-reference report is the better starting point for the
probe. Current production shader references are concentrated in TextMeshPro,
Eagle custom map/effect shaders, Shardok grid/fire materials, and a small number
of standard-material beast assets.
- Highest production custom shader priorities remain `Eagle/ProvinceMap`,
`Eagle/ProvinceWeatherMap`, `Eagle/ProvinceParticle`,
`Eagle/ClipRectParticleUnlit`, `Shardok/Fire Overlay`, and the Shardok
hex/overlay materials.
### 3. Verify Legacy Post Processing Usage
The project no longer depends on `com.unity.postprocessing`. The old references were
limited to an unused Orc/Ogre sample scene profile and scene-template type metadata,
not production scenes.
Immediate deliverable: keep the project free of Post Processing Stack v2 references
and use the inventory report to catch regressions.
If references reappear:
- document the exact scene/camera/profile usage
- either remove the stale dependency or plan the equivalent URP Volume settings
This is a good small PR because it either deletes a risky dependency now or precisely
scopes the later migration work.
### 4. Keep Drought Effects URP-Friendly
The old `Eagle/HeatShimmer` shader used a Built-in-style `GrabPass`, but shimmer was
already disabled in `DroughtEffect` because it did not work well with the UI Canvas.
Drought now intentionally uses the animated sun overlay as its current visual signal.
Immediate deliverable: keep drought visuals free of `GrabPass` unless we intentionally
add a new URP-friendly effect.
If stronger drought visuals are needed later, prefer:
- an animated transparent texture overlay clipped like the existing province particles
- a small particle/sprite effect around the sun icon
- a URP renderer feature only if screen-space distortion is truly worth the complexity
### 5. Check Third-Party URP Paths
The riskiest third-party shader set is Polytope Studio. The plan should not assume
hand conversion until we know whether vendor URP variants exist or whether a current
package update has already solved part of this.
Immediate deliverable: for each paid/third-party visual package, record:
- current installed version
- whether a URP-compatible version exists
- whether upgrading is license/account-accessible
- whether the package is still used in production scenes
`docs/URP_THIRD_PARTY_ASSET_AUDIT.md` records the current production GUID-reference
scan. The important result is that production assets use Polytope character prefabs
for Eagle beast effects, but the Polytope environment/water assets that still contain
`GrabPass` were not found on the production path.
Prioritize:
- Polytope Studio lowpoly character/environment shaders
- GUI Pro Kit Fantasy RPG shaders
- Modern UI Pack
- RRFreelance Orc/Ogre shaders
- DungeonMonsters2D sprite/animation shaders
### 6. Keep Probe Guidance For Future Pipeline Experiments
The original disposable probe has served its main purpose: URP is enabled on main and
the biggest visual regressions were fixed in focused PRs. Keep the probe playbook as
a template for future risky pipeline experiments, not as current migration guidance.
Use `docs/URP_PROBE_PLAYBOOK.md` when we need to measure a future Unity or render
pipeline change cheaply before committing to a mergeable branch.
## Current Known Risks
| Risk | Why It Matters | Right-Now Action |
| Category | Count | Notes |
|---|---|---|
| `ProvinceMapShader` | Core Eagle map rendering: province IDs, borders, ocean animation, faction highlighting, clipping | Audit inputs/properties and baseline screenshots |
| `UnityUI.cginc` usage | URP does not provide the same include path/semantics | Inventory exact shader uses; plan replacement clipping helpers |
| `GrabPass` | No direct URP equivalent | Drought shimmer is removed/deferred; Polytope water shaders are present but not currently production-referenced |
| Surface shaders | URP does not support Built-in surface shader generation | Inventory and convert or replace |
| Polytope Studio shaders | Human-type Eagle beast effects use Polytope character prefabs with Built-in surface shaders | Check vendor URP availability before hand conversion; prioritize character materials over unused environment shaders |
| Post Processing Stack v2 | Replaced by URP Volume system | Verify whether production scenes use it |
| Scene lighting | URP lighting/shadow settings differ from BiRP | Baseline and rebake only after shader work is stable |
| Render ordering | Recent Shardok fixes rely on careful labels/fire/bridge ordering | Include Shardok overlay cases in baseline |
| Shaders | 47 | 7 custom Eagle, 1 hex mesh, 20 Polytope, 13 TextMesh Pro, 6 other third-party |
| Materials | 325 | Mix of Standard shader, custom, and third-party |
| ShaderGraph files | 4 | All TextMesh Pro (URP + HDRP variants already exist) |
| Scenes with baked lighting | 5 | Connection, Eagle, Shardok, Shared, Map Editor |
| Post-processing | 1 profile | PPP_Orc.asset (Post Processing Stack v2, FXAA/TAA, AO) |
| C# rendering scripts | 16 | Material/shader property manipulation only |
| Rendering path | Forward | Matches URP default |
## Follow-Up Strategy
### Positive Findings
Main now carries the URP switch. Future rendering work should be split by observable
behavior:
- **No OnRenderImage, Graphics.Blit, CommandBuffer, or GL.\* usage** in C# code
- Forward rendering already in use (matches URP default)
- TextMesh Pro already has URP ShaderGraph variants in the project
- No custom render passes or ScriptableRenderFeatures
- Shader property manipulation (SetTexture, SetFloat, SetColor) is URP-compatible
- **Compatibility fixes**: small PRs for specific pink/missing/dark assets.
- **Render ordering fixes**: small PRs for Shardok/Eagle layer order regressions.
- **Inventory/docs updates**: docs-only or editor-tool PRs that do not alter runtime
visuals.
- **Pipeline experiments**: isolated branches using the probe playbook, with findings
copied into a mergeable follow-up.
### Known Risk Areas
This keeps the project from accumulating another broad, hard-to-revert rendering PR.
- **GrabPass shaders** (HeatShimmerShader, PT_Water_Shader) have no direct URP equivalent
- **ProvinceMapShader** is complex (province ID lookup, border rendering, ocean animation, faction highlighting, UI clipping)
- **Surface shaders** (`#pragma surface surf Standard`) must be rewritten as HLSL or ShaderGraph
- **Polytope Studio shaders** (20 shaders) have no vendor-provided URP variants
- **Post Processing Stack v2** must be replaced with URP's integrated Volume system
- **Tessellation** (PT_Water_Shader) is not natively supported in URP
## Long-Term Phases
## Shader Inventory
### Phase 0: Preparation And Switch
### Custom Eagle Shaders (7) -- HIGH PRIORITY
- Visual baseline checklist/screenshots: complete, keep current
- Repeatable shader/material inventory: complete, keep current
- Post Processing Stack usage decision: complete, keep removed
- Drought visual decision: complete, use non-GrabPass visual signal
- Third-party URP availability check: documented
- Disposable URP probe findings: superseded by the merged URP switch
| Shader | Complexity | Key Issues |
|---|---|---|
| ProvinceMapShader | High | Province ID texture lookup, border rendering, ocean animation, faction highlighting, `UnityUI.cginc` dependency, stencil/clipping |
| ProvinceWeatherMapShader | Medium | Weather overlay rendering |
| ProvinceWeatherShader | Medium | Province weather effects |
| ProvinceParticleShader | Low | Custom particle rendering |
| HeatShimmerShader | High | **GrabPass** for screen distortion, province masking |
| ClipRectParticleUnlit | Low | UI-clipped particle shader |
| maskShader | Low | UI masking |
### Phase 1: Pipeline Setup
### Hex Mesh Shader (1) -- MODERATE PRIORITY
- Install/configure URP: complete
- Create URP Pipeline Asset and Renderer Asset: complete
- Configure forward rendering, shadows, HDR, and renderer features: complete enough
for current gameplay paths
- Run Unity's Render Pipeline Converter: complete for the merged switch
- Keep a record of every auto-converted material: use the inventory/audit tools
Uses `#pragma surface surf Standard` with GPU instancing. Straightforward conversion to URP Lit or ShaderGraph.
### Phase 2: Core Custom Shaders
### Third-Party Shaders (39)
Highest priority:
- `ProvinceMapShader`
- `ProvinceWeatherMapShader`
- `ProvinceWeatherShader`
- `ProvinceParticleShader`
- `ClipRectParticleUnlit`
- `maskShader`
- `Hex Mesh Shader`
Conversion notes:
- Replace Built-in includes such as `UnityCG.cginc`.
- Replace `UnityUI.cginc` clipping with URP-compatible code.
- Preserve stencil operations, render queues, texture lookups, and property names.
- Test map interactions, not just static rendering.
### Phase 3: GrabPass And Special Effects
- Keep drought visuals on the current animated sun overlay unless a new URP-friendly
effect is intentionally added.
- Reimplement or replace the Polytope `PT_Water_Shader` GrabPass shaders if they are
ever become used by production assets.
- Avoid leaving screen-space effects until the end; they are likely to drive renderer
feature requirements.
### Phase 4: Third-Party Shaders
- Upgrade packages where vendor URP shaders exist.
- Convert remaining PBR/toon/vegetation shaders manually.
- Prefer replacement or deletion for unused demo-only assets.
### Phase 5: Materials, Lighting, And Post Processing
- Batch-update remaining materials.
- Replace Post Processing Stack v2 with URP Volumes if still needed.
- Rebake lighting for production scenes.
- Tune shadow and HDR settings.
### Phase 6: Validation
Required visual QA:
- Connection lobby
- Eagle map and command flows
- Eagle weather/beasts/notifications
- Shardok battle map overlays, unit text/icons, bridges, fires
- Scene transitions
- Mac and Windows builds
- Performance sanity check
## Rough Effort
| Work | Best Case | Realistic | Worst Case |
| Source | Count | Complexity | Notes |
|---|---|---|---|
| Preparation/probe | 2-4 days | 1 week | 2 weeks |
| Core custom shaders | 1.5 weeks | 2-3 weeks | 4 weeks |
| GrabPass/special effects | 2-4 days | 1-2 weeks | 3 weeks |
| Third-party shaders/materials | 1.5 weeks | 2-3 weeks | 4 weeks |
| Lighting/post-processing | 3-5 days | 1-2 weeks | 2 weeks |
| QA/polish | 1 week | 2 weeks | 3 weeks |
| **Total** | **5-7 weeks** | **8-12 weeks** | **16+ weeks** |
| Polytope Studio | 20 | Moderate-High | PBR, Toon, vegetation (custom lighting), water (**GrabPass + tessellation**). No vendor URP pack available. |
| TextMesh Pro | 13 | Low | URP ShaderGraph variants already exist in project |
| RRFreelance | 3 | Low | Standard surface shaders, direct conversion |
| Clown.fat | 2 | Moderate | Custom ToonRamp lighting model |
| GUI Pro Kit | 1 | Low | Hidden particle shader |
The biggest variable is still third-party shader conversion. Vendor URP packages or
asset deletion can shrink this significantly.
### GrabPass Shaders (Require Special Handling)
GrabPass does not exist in URP. These must be reimplemented using `ScriptableRenderPass` + `Renderer Features` or Blit-based alternatives:
1. **HeatShimmerShader** -- Screen distortion effect (currently has a shimmer-disabled TODO, may be deprioritized)
2. **PT_Water_Shader** -- Water refraction/transparency (PT_Water_Shader_WebGl exists without GrabPass as a reference)
## Phased Approach
### Phase 1: Pipeline Setup + Auto-Conversion (Days 1-3)
- Install URP package
- Create URP Pipeline Asset and Renderer Asset
- Configure basic pipeline settings (forward rendering, shadow settings)
- Run Unity's **Render Pipeline Converter** (Edit > Rendering > Render Pipeline Converter)
- Auto-converts Standard shader materials and some built-in shaders
- Handles a significant portion of the 325 materials
- Will NOT touch custom shaders
- Create a test scene to validate basic rendering
- Migrate viewport clipping system (`RendererViewportClipper`, `ViewportClipper`, `PopupClipper`) to use URP-compatible global shader properties
### Phase 2: Custom Eagle Shaders (Weeks 1-3)
This is the critical path. Without these, the game is unplayable.
**Week 1-2: ProvinceMapShader**
- Convert from BiRP Cg/HLSL to URP HLSL
- Replace `UnityCG.cginc` includes with `Core.hlsl` / `Common.hlsl`
- Replace `UnityUI.cginc` with custom URP-compatible UI clipping
- Preserve province ID texture lookup, border rendering, ocean animation, faction highlighting
- Validate stencil operations and render queue ordering
**Week 2-3: Remaining Eagle shaders**
- ProvinceWeatherMapShader + ProvinceWeatherShader
- ProvinceParticleShader + ClipRectParticleUnlit
- maskShader
- Hex Mesh Shader (convert surface shader to URP Lit)
- HeatShimmerShader (reimplement without GrabPass, or defer if shimmer remains disabled)
### Phase 3: Third-Party Shaders (Weeks 4-6)
**Polytope Studio (20 shaders)**
- Convert PBR shaders (Armors, NPC, Weapons, Props, Rock) from surface shaders to URP Lit / ShaderGraph
- Convert Toon shaders to custom URP shader or ShaderGraph with custom lighting
- Convert vegetation shaders (custom `StandardCustom` lighting) to ShaderGraph
- PT_Water_Shader: Reimplement without GrabPass and tessellation (use PT_Water_Shader_WebGl as reference for non-GrabPass approach)
**Other third-party**
- Clown.fat ToonRamp shaders: Convert custom lighting model to ShaderGraph
- RRFreelance shaders: Direct Standard-to-URP-Lit conversion
- GUI Pro Kit particle shader: Convert to URP particle shader
### Phase 4: Materials, Lighting & Post-Processing (Weeks 7-8)
**Materials**
- Batch-update any remaining materials not handled by the auto-converter
- Verify all 325 materials render correctly
- Fix any visual differences from lighting model changes
**Lighting**
- Rebake lightmaps for all 5 scenes (Connection, Eagle, Shardok, Shared, Map Editor)
- Configure URP shadow cascade settings to match current quality levels
- Verify HDR rendering
**Post-Processing**
- Remove Post Processing Stack v2 dependency (`com.unity.postprocessing: 3.5.1`)
- Replace with URP integrated Volume system
- Recreate PPP_Orc effects (FXAA/TAA, Ambient Occlusion) using URP Volume overrides
### Phase 5: Testing & Validation (Weeks 9-11)
- Visual QA across all 6 scenes
- Verify beast/character rendering (vertex colors, animations)
- Verify weather effects (blizzard, drought, flood)
- Verify particle systems (fire & explosion effects, UI particles)
- Verify UI rendering (GUI Pro Kit, Modern UI Pack, TextMesh Pro)
- Performance profiling (URP has different performance characteristics)
- Test on target platforms
- Bug fixes and visual polish
## Effort Estimates
| Phase | Best Case | Realistic | Worst Case |
|---|---|---|---|
| 1. Pipeline Setup | 1-2 days | 2-3 days | 3-5 days |
| 2. Custom Eagle Shaders | 1.5 weeks | 2-3 weeks | 3-4 weeks |
| 3. Third-Party Shaders | 1.5 weeks | 2-3 weeks | 3-4 weeks |
| 4. Materials & Lighting | 3-5 days | 1-1.5 weeks | 2 weeks |
| 5. Testing & Validation | 1 week | 1.5-2 weeks | 2-3 weeks |
| **Total** | **6-8 weeks** | **8-12 weeks** | **12-16 weeks** |
The biggest variable is Polytope Studio shader conversion. If vendor URP packs become available, Phase 3 shrinks significantly.
## Key Reminders
- Do not switch main to URP as a first step.
- Do not leave `ProvinceMapShader`, `UnityUI.cginc`, or `GrabPass` work until the end.
- Keep C# changes minimal; current rendering scripts mostly set material properties.
- Preserve recent Shardok render-order behavior while changing pipelines.
- Treat screenshots as migration tests; compilation alone is not meaningful here.
- **Don't leave GrabPass rewrites and ProvinceMapShader for the end** -- they're the riskiest pieces and should be tackled early.
- The migration window (~1 year) is comfortable. Spreading the work across this window is fine, but front-load the hard shader work.
- C# code changes should be minimal -- the codebase avoids direct rendering API usage.
- `UnityUI.cginc` has no direct URP equivalent. Custom implementation will be needed for UI clipping in shaders.
-134
View File
@@ -1,134 +0,0 @@
# URP Probe Playbook
Last refreshed: 2026-06-12
This playbook is historical reference for the disposable URP probe described in
`docs/URP_MIGRATION_PLAN.md`. URP is now enabled on main; keep this as a template
for future risky render-pipeline experiments. A probe branch is not a production
branch and should not be merged as-is.
## Goals
- Use the already-installed URP package in an isolated branch.
- Create the minimum URP pipeline/renderer assets needed to enter Play Mode.
- Run Unity's Render Pipeline Converter.
- Record compile errors, pink materials, broken shaders, and visual regressions.
- Preserve findings in docs, then discard or reset the probe branch.
## Branch Shape
Use two branches:
| Branch | Purpose | Mergeable |
|---|---|---|
| `codex/urp-probe` | Disposable package/settings/material conversion experiment | No |
| `codex/urp-probe-findings` | Small docs-only summary copied from the probe | Yes |
Do not open a PR from `codex/urp-probe` unless it is clearly marked draft and
experimental. Prefer opening the PR from `codex/urp-probe-findings`.
## Before Starting
1. Confirm `origin/main` is fresh.
2. Confirm the worktree is clean.
3. Capture or review the baseline checklist in
`docs/URP_VISUAL_BASELINE_CHECKLIST.md`.
4. Generate a current inventory with
`Eagle0 > Rendering > Generate URP Migration Inventory`.
5. Keep the inventory output under Unity `Temp/urp_migration/`; do not commit
generated reports unless they are intentionally summarized.
## Probe Steps
1. Create `codex/urp-probe` from `origin/main`.
2. Confirm `com.unity.render-pipelines.universal` is installed in
`Packages/manifest.json`.
3. If testing new pipeline settings, create alternate URP Pipeline/Renderer assets
under a clearly named temporary folder.
4. Assign the alternate URP pipeline asset in:
- `ProjectSettings/GraphicsSettings.asset`
- `ProjectSettings/QualitySettings.asset`
5. Run Unity's Render Pipeline Converter only if the experiment intentionally tests
material conversion.
6. Enter Play Mode from `Assets/Scenes/Main.unity`.
7. Exercise the baseline views:
- Connection lobby
- Eagle map
- Eagle weather and beast effects
- Shardok terrain, grid, labels, bridges, fires, overlays
- Connection -> Eagle -> Shardok -> Eagle transitions
8. Record the exact failure mode for every broken visual:
- compile error
- pink material
- invisible mesh or sprite
- wrong render order
- lighting/shadow difference
- input or scene-load regression
## Expected High-Risk Areas
- Eagle province map shaders:
- `ProvinceMapShader`
- `ProvinceWeatherMapShader`
- `ProvinceWeatherShader`
- `ProvinceParticleShader`
- Shardok map and overlay shaders:
- `Hex Mesh Shader`
- `maskShader`
- `ClipRectParticleUnlit`
- Third-party 3D materials:
- Polytope Studio character prefabs used by Eagle human-type beast effects
- RRFreelance Orc/Ogre materials used by `OgreEffect`
- Render ordering in Shardok:
- unit text/icons versus fires
- unit text/icons versus bridges
- selection/command overlays versus labels
## Findings Template
Copy this template into the mergeable findings branch after the probe:
```markdown
# URP Probe Findings
Date:
Unity version:
URP package version:
Probe branch commit:
## Summary
- Entered Play Mode:
- Connection usable:
- Eagle usable:
- Shardok usable:
- Build attempted:
## Converter Results
- Materials converted:
- Materials left pink:
- Shader compile errors:
## Visual Regressions
| Area | Expected | Actual | Likely Cause | Next Action |
|---|---|---|---|---|
## Required Migration PRs
1.
2.
3.
## Notes
-
```
## After The Probe
1. Copy findings into a docs-only branch.
2. Delete or abandon `codex/urp-probe`.
3. Do not merge probe-generated package/settings/material churn into main until the
findings have been reviewed and broken visuals have owner PRs.
-106
View File
@@ -1,106 +0,0 @@
# URP Shader Debt Inventory
Last refreshed: 2026-06-12
This inventory classifies remaining Built-in Render Pipeline shader patterns after
the URP switch. The project is running URP, but some shader source files still use
Built-in-era helpers or features. That is shader debt, not evidence that the old
pipeline is active.
## Scan Method
The scan looked for these patterns in Unity shader-like assets:
- `GrabPass`
- `#pragma surface`
- `UnityCG.cginc`
- `UnityUI.cginc`
- `UNITY_MATRIX_`
- `sampler2D _GrabTexture`
- `tessell`
- `Tessellation`
It then mapped every matching shader asset to its Unity GUID and scanned production
serialized assets under:
- `Assets/Scenes/`
- `Assets/Eagle/`
- `Assets/Shardok/`
- `Assets/ConnectionHandler/`
- `Assets/UI/`
- `Assets/common/`
- `Assets/Tutorial/`
- `Assets/Resources/`
- `Assets/Materials/`
This catches serialized production references. It does not prove runtime code never
loads an asset by path, but it separates game-path shader debt from package/demo
noise well enough to prioritize follow-up PRs.
## Summary
| Bucket | Shader Assets With Built-in Patterns | Serialized Production References |
|---|---:|---:|
| Project-owned production shaders | 9 | 7 referenced |
| TextMeshPro package shaders | 17 | 1 referenced |
| Third-party/package shaders | 25 | 0 referenced |
## Highest Priority: Referenced Project-Owned Shaders
These are the URP hardening targets that are actually referenced by production
assets.
| Shader | Patterns | Production References | Recommended Action |
|---|---|---|---|
| `Assets/Eagle/Shaders/ProvinceMapShader.shader` | `UnityCG.cginc`, `UnityUI.cginc` | `Assets/Eagle/Materials/ProvinceMapMaterial.mat` | Convert includes/clipping to URP-compatible code, then baseline Eagle province colors, borders, ocean, faction highlights, and selected province state. |
| `Assets/Eagle/Shaders/ProvinceWeatherMapShader.shader` | `UnityCG.cginc`, `UnityUI.cginc` | `Assets/Eagle/Materials/ProvinceWeatherMapMaterial.mat` | Convert with province map shader; baseline weather map overlay alignment and clipping. |
| `Assets/Eagle/Shaders/ProvinceWeatherShader.shader` | `UnityCG.cginc`, `UnityUI.cginc` | `Assets/Eagle/Weather/BlizzardEffect.mat`, `Assets/Eagle/Weather/DroughtEffect.mat`, `Assets/Eagle/Weather/FloodEffect.mat` | Convert weather effect shader; baseline drought, flood, and blizzard/rain overlays. |
| `Assets/Eagle/Shaders/ProvinceParticleShader.shader` | `UnityCG.cginc` | `Assets/Eagle/Effects/ProvinceParticleMaterial.mat` | Convert after map/weather shaders; baseline province particles and popup clipping. |
| `Assets/Eagle/Shaders/ClipRectParticleUnlit.shader` | `UnityCG.cginc` | `Assets/Eagle/Effects/Fireworks.prefab`, `Assets/Eagle/Effects/ParticleAlphaBlendMaterial.mat`, `Assets/Eagle/Effects/ParticleStandardUnlitMaterial.mat` | Convert particle helper shader; baseline Eagle one-shot effects and popup clipping. |
| `Assets/Eagle/maskShader.shader` | `UnityCG.cginc`, `UnityUI.cginc` | `Assets/Eagle/Materials/map_color_nolabels.mat`, `Assets/Eagle/Materials/map_color_whitened.mat` | Confirm whether these materials are still used at runtime; convert or delete stale material path. |
| `Assets/Shardok/ShardokFireOverlay.shader` | `UnityCG.cginc` | `Assets/Shardok/ShardokFireOverlay.mat` | Convert separately from Eagle; baseline terrain < bridge < fire < grid < labels/icons < animations ordering. |
## Referenced Package Shader
| Shader | Patterns | Production References | Recommended Action |
|---|---|---|---|
| `Assets/TextMesh Pro/Resources/Shaders/TMP_Sprite.shader` | `UnityCG.cginc`, `UnityUI.cginc`, `UNITY_MATRIX_` | 16 tutorial sprite assets under `Assets/Tutorial/Sprite Assets/` | Leave alone unless Unity/URP surfaces a visible TextMeshPro sprite regression. Prefer package/vendor updates over hand-editing TMP package shaders. |
## Project-Owned Hits Without Serialized Production References
| Shader | Patterns | Recommended Action |
|---|---|---|
| `Assets/Hex Mesh Shader.shader` | `#pragma surface` | Candidate for deletion or archival if no runtime path uses it. Current Shardok scene uses the newer layered render stack, not this serialized shader path. |
| `Assets/Shardok/Shaders/ForegroundUIOverlay.shader` | `UnityCG.cginc`, `UnityUI.cginc` | Confirm whether runtime code loads it by path; if not, delete or leave as low-priority debt. |
## Third-Party And Package Hits Without Serialized Production References
These files still contain Built-in-only shader patterns, but the current GUID scan
did not find serialized production references. Treat them as package/demo cleanup,
not as urgent game-path blockers.
| Package Area | Examples | Patterns | Recommended Action |
|---|---|---|---|
| Polytope Studio characters/weapons/props | Modular NPC, armor, weapons, props shaders | `#pragma surface`, `UnityCG.cginc` | Keep runtime beast material compatibility in place; only import/replace vendor URP materials if we intentionally remove the compatibility shim. |
| Polytope Studio environment/water | Water, vegetation, rock shaders | `GrabPass`, `#pragma surface`, `UnityCG.cginc`, tessellation | Ignore unless production starts referencing these assets. Water shaders are the only remaining `GrabPass` hits. |
| RRFreelance Orc/Ogre | Ogre, armor, weapon shaders | `#pragma surface`, `UnityCG.cginc` | Current production references are handled by compatibility/material fixes; do not hand-convert unless a visible ogre regression returns. |
| TextMeshPro package shaders | TMP SDF/bitmap/surface shaders | `UnityCG.cginc`, `UnityUI.cginc`, `UNITY_MATRIX_`, surface shader variants | Prefer package updates. Avoid editing package shaders unless a concrete TMP visual regression exists. |
| Clown.fat and TileableBridgePack | Toony shaders, bridge cutout shader | `#pragma surface`, `UnityCG.cginc`, `UNITY_MATRIX_` | Leave as low priority unless a production reference appears. |
## Suggested Follow-Up PR Order
1. Convert `ProvinceMapShader` and `ProvinceWeatherMapShader` together. They share
map/clipping concerns and should be tested with the same Eagle map baselines.
2. Convert `ProvinceWeatherShader`. Test drought, flood, blizzard/rain, and popup
clipping.
3. Convert Eagle particle shaders: `ProvinceParticleShader` and
`ClipRectParticleUnlit`.
4. Investigate `maskShader` usage. Delete stale materials if unused; convert only
if still on the runtime path.
5. Convert `ShardokFireOverlay.shader` in its own PR with Shardok layering
screenshots.
6. Leave unreferenced third-party/package shaders alone until they have a visible
regression or production reference.
Each conversion PR should use `docs/URP_VISUAL_BASELINE_CHECKLIST.md` and include
the affected screenshots in an ignored local directory, not in git.
-114
View File
@@ -1,114 +0,0 @@
# URP Third-Party Asset Audit
Last refreshed: 2026-06-11
This audit scopes third-party visual packages for the URP migration. It is based on
a GUID reference scan from production Unity assets under:
- `Assets/Scenes`
- `Assets/Eagle`
- `Assets/Shardok`
- `Assets/ConnectionHandler`
- `Assets/UI`
- `Assets/common`
- `Assets/Tutorial`
- `Assets/Resources`
- `Assets/Materials`
The scan maps GUIDs from each package folder, then finds production scenes,
prefabs, materials, controllers, assets, and scripts that reference those GUIDs.
It does not prove runtime code never loads assets by path, but it catches the
serialized references that matter most for a render-pipeline migration.
## Summary
| Package | Production Use | URP Risk | Notes |
|---|---:|---|---|
| Polytope Studio | 20 refs / 18 assets | High | Used by Eagle human-type beast effects. Production refs are character prefabs, not environment/water assets. |
| GUI Pro Kit Fantasy RPG | 138 refs / 58 assets | Low | Production use is UI sprites/icons. No package shader dependency found in production refs. |
| Modern UI Pack v4.2.0 | 23 refs / 6 assets | Low | Production use is UI textures/icons. |
| RRFreelance Orc/Ogre | 2 refs / 2 assets | High | Ogre effect uses custom Built-in surface shaders. |
| DungeonMonsters2D | 12 refs / 12 assets | Medium | 2D monster prefabs for Eagle beast effects. Expected to be mostly SpriteRenderer/Animator; keep covered in beast-effect visual checks. |
| Animal pack deluxe v2 | 7 refs / 7 assets | Medium | Elephant effect and controller refs. Verify lit-material conversion. |
| Animal pack deluxe | 24 refs / 24 assets | Medium | Multiple Eagle animal beast effects. Verify lit-material conversion. |
| AfricaAnimalsPackLowPoly V2 | 10 refs / 10 assets | Medium | Eagle beast effects and controllers. Verify lit-material conversion. |
| AfricaAnimalsPackv1 | 8 refs / 8 assets | Medium | Eagle beast effects and controllers. Verify lit-material conversion. |
| AustraliaAnimalsPackv1 | 6 refs / 6 assets | Medium | Eagle beast effects and controllers. Verify lit-material conversion. |
| DinoPackLowPolyV1 | 3 refs / 3 assets | Medium | Velociraptor effect and controller. Verify lit-material conversion. |
| HEROIC FANTASY CREATURES FULL PACK Vol 2 | 12 refs / 12 assets | Medium | Hippogryph effect and controller. Verify lit-material conversion. |
| TileableBridgePack | 0 refs | Low | No production serialized refs found. Shardok bridge visuals appear to use project-owned/runtime assets instead. |
| Stylize Water Texture | 1 ref / 1 asset | Low | Eagle province map material uses one water texture, not a shader. |
| Terrain Hexes | 2 refs / 1 asset | Low | Shardok scene/container use one rock texture. |
| Hex Tiles | 0 refs | Low | No production serialized refs found. |
| 4000_Fantasy_Icons | 273 refs / 117 assets | Low | Sprite/icon assets only. |
| StrategyGameIcons | 21 refs / 12 assets | Low | Sprite/icon assets only. |
| Clown.fat | 14 refs / 10 assets | Medium | Clown effects and animation clips; also retargeted by Polytope human effects. |
| Dragon | 2 refs / 1 asset | Medium | Dragon effect mesh/animation. Verify material conversion. |
| HoneyBadger | 2 refs / 1 asset | Medium | Honey badger effect mesh/animation. Verify material conversion. |
| Raccoon | 2 refs / 1 asset | Medium | Raccoon effect mesh/animation. Verify material conversion. |
## Highest-Risk Findings
### Polytope Studio
Production assets reference Polytope character prefabs for Eagle map effects:
- `Assets/Eagle/Effects/ArcherEffect.prefab`
- `Assets/Eagle/Effects/GiantEffect.prefab`
- `Assets/Eagle/Effects/KnightEffect.prefab`
- `Assets/Eagle/Effects/MilitiaEffect.prefab`
- `Assets/Eagle/Effects/PeasantEffect.prefab`
- `Assets/Eagle/Effects/SoldierEffect.prefab`
These prefabs ultimately use `PT_NPC_Mat`, which references
`Polytope Studio/Lowpoly_Characters/Sources/Modular_NPC/Shaders/PT_Modular_NPC_Shader_PBR.shader`.
That shader uses Built-in surface shader generation and is not URP-ready as-is.
Polytope environment and water shaders still exist in the project and include
Built-in-only features such as `GrabPass`, `UnityCG.cginc`, surface shaders, and
tessellation. However, this scan found no production serialized references to the
Polytope environment or water assets. Treat them as demo/package risk, not current
runtime risk, unless a later inventory run finds production references.
### RRFreelance Orc/Ogre
Production assets reference the Orc/Ogre package from:
- `Assets/Eagle/Effects/OgreEffect.prefab`
- `Assets/Eagle/Effects/OgreMapAnims.controller`
The custom materials reference package shaders that use Built-in surface shader
generation:
- `RRFreelance-Characters/Orc-Ogre/Shaders/OgreShader.shader`
- `RRFreelance-Characters/Orc-Ogre/Shaders/ArmorShader2sided.shader`
- `RRFreelance-Characters/Orc-Ogre/Shaders/WeaponShader.shader`
This should be converted, replaced with URP/Lit-compatible materials, or swapped
for standard materials during the URP migration.
## Recommended URP Order
1. Keep the runtime beast-effect compatibility path covered by visual checks before
replacing it with vendor URP materials.
2. If the converter leaves them pink or visually broken, replace the affected
materials with URP/Lit materials before touching unused demo-only shader packs.
3. Leave Polytope water/vegetation/environment conversion until a production
reference appears. They are noisy in the shader inventory but not currently on
the game path.
4. Include Eagle beast effects in the visual baseline. They cover most third-party
3D package risk in one place.
5. Treat UI sprite packs as low pipeline risk. Their risk is texture import/render
ordering, not shader conversion.
## Vendor Version / Access Notes
Known versions from existing repo docs:
- Modern UI Pack: `v4.2.0`
Most other package versions are not recorded in repo-local metadata. Before hand
converting large third-party shader sets, check the Unity Asset Store or vendor
account for URP-compatible updates. This especially matters for Polytope Studio,
because the package contains many Built-in surface shaders even though only a
small character subset is currently used by production assets.
-60
View File
@@ -1,60 +0,0 @@
# URP Visual Baseline Checklist
Use this checklist before any URP follow-up branch changes render-pipeline settings,
custom shaders, materials, lighting, camera layering, or render order. The goal is
not exhaustive gameplay QA; it is a stable set of visual states that can be compared
by eye after rendering changes.
Save screenshots under:
`src/main/csharp/net/eagle0/clients/unity/eagle0/Temp/urp-baselines/`
That directory is ignored by git.
Use `Eagle0 > Rendering > Capture URP Baseline Screenshot` in the Unity editor to
write a timestamped Game view capture to that directory.
## Capture Setup
- Use the same Unity version as the branch under test.
- Start from `Assets/Scenes/Main.unity`.
- Use the same Game view resolution for every capture in a comparison set.
- Capture the full Game view, not cropped panels.
- Name files with a stable prefix and short state name, for example
`main_01_connection_accounts.png` and `branch_01_connection_accounts.png`.
- If a view depends on server data or an account, write a short note next to the
screenshot naming the game/account/state used.
## Required Captures
| ID | Area | State | Must Verify |
|---|---|---|---|
| 01 | Connection | Connect panel with stored accounts visible | Background color, panel layout, text contrast, profession icons |
| 02 | Connection | Running games list visible | Row icons, timestamps, buttons, selected/hover states if practical |
| 03 | Eagle map | Normal province map after joining a game | Province colors, borders, ocean animation frame, faction highlights |
| 04 | Eagle map | Province hovered/selected | On-map province tooltip, selected outline, side-panel readability |
| 05 | Eagle weather | Drought province | Heat shimmer/drought signal remains visible and does not obscure UI |
| 06 | Eagle weather | Flood/rain or blizzard province | Weather overlay color, particle ordering, map readability |
| 07 | Eagle beasts | Beast effect on map | Beast animation visible in Game view and positioned over province |
| 08 | Eagle beasts | Beast notification open | Animated beast visible in notification and not hidden behind panel art |
| 09 | Eagle UI | Command panel with generated text | Text glyphs, fallback glyphs, panel clipping, button states |
| 10 | Eagle UI | Settings panel open | Top-right settings button, Escape behavior, modal layering |
| 11 | Shardok setup | Initial placement | Terrain tiles, grid lines, unit labels/icons, placement overlays |
| 12 | Shardok battle | Unit selected with destination overlays | Overlay labels/icons draw above terrain, bridges, fires, and highlights |
| 13 | Shardok battle | Bridge and fire visible near units | Bridge/fire render order does not cover unit labels/icons |
| 14 | Shardok battle | Command buttons visible | Right-side UX, disabled/enabled button states, tooltip readability |
| 15 | Scene transition | Eagle to Shardok to Eagle | No black/blank frame persists, returning Eagle map is visually intact |
## Acceptance Notes
For each URP rendering follow-up, record:
- Unity version and branch name.
- Screenshot directory.
- Any pink/missing materials.
- Any invisible UI, labels, particle effects, bridges, fires, or weather effects.
- Any render-order differences, especially Shardok overlays and Eagle beast effects.
- Whether the difference is acceptable, needs shader work, or needs asset/material work.
Do not merge a URP rendering branch until the affected Connection, Eagle, Shardok,
or Settings baseline captures are visually acceptable.
+27 -29
View File
@@ -1,40 +1,38 @@
module github.com/nolen777/eagle0
go 1.25.0
go 1.23.0
toolchain go1.26.4
toolchain go1.25.11
require (
github.com/aws/aws-sdk-go-v2 v1.42.0
github.com/aws/aws-sdk-go-v2/config v1.32.25
github.com/aws/aws-sdk-go-v2/credentials v1.19.24
github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3
github.com/golang-jwt/jwt/v5 v5.3.1
github.com/aws/aws-sdk-go-v2 v1.32.8
github.com/aws/aws-sdk-go-v2/config v1.28.10
github.com/aws/aws-sdk-go-v2/credentials v1.17.51
github.com/aws/aws-sdk-go-v2/service/s3 v1.72.2
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/google/uuid v1.6.0
github.com/webview/webview_go v0.0.0-20240831120633-6173450d4dd6
golang.org/x/sys v0.46.0
google.golang.org/grpc v1.81.1
google.golang.org/protobuf v1.36.11
golang.org/x/sys v0.33.0
google.golang.org/grpc v1.71.0
google.golang.org/protobuf v1.36.10
)
require (
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect
github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect
github.com/aws/smithy-go v1.27.2 // indirect
golang.org/x/net v0.56.0 // indirect
golang.org/x/text v0.38.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.23 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.27 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.27 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.27 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.8 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.8 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.8 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.9 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.8 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.33.6 // indirect
github.com/aws/smithy-go v1.22.1 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/text v0.25.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
)
-118
View File
@@ -1,184 +1,66 @@
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=
github.com/aws/aws-sdk-go-v2 v1.32.8 h1:cZV+NUS/eGxKXMtmyhtYPJ7Z4YLoI/V8bkTdRZfYhGo=
github.com/aws/aws-sdk-go-v2 v1.32.8/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA=
github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls=
github.com/aws/aws-sdk-go-v2/config v1.28.10 h1:fKODZHfqQu06pCzR69KJ3GuttraRJkhlC8g80RZ0Dfg=
github.com/aws/aws-sdk-go-v2/config v1.28.10/go.mod h1:PvdxRYZ5Um9QMq9PQ0zHHNdtKK+he2NHtFCUFMXWXeg=
github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM=
github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs=
github.com/aws/aws-sdk-go-v2/credentials v1.17.51 h1:F/9Sm6Y6k4LqDesZDPJCLxQGXNNHd/ZtJiWd0lCZKRk=
github.com/aws/aws-sdk-go-v2/credentials v1.17.51/go.mod h1:TKbzCHm43AoPyA+iLGGcruXd4AFhF8tOmLex2R9jWNQ=
github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I=
github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.23 h1:IBAoD/1d8A8/1aA8g4MBVtTRHhXRiNAgwdbo/xRM2DI=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.23/go.mod h1:vfENuCM7dofkgKpYzuzf1VT1UKkA/YL3qanfBn7HCaA=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.27 h1:jSJjSBzw8VDIbWv+mmvBSP8ezsztMYJGH+eKqi9AmNs=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.27/go.mod h1:/DAhLbFRgwhmvJdOfSm+WwikZrCuUJiA4WgJG0fTNSw=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.27 h1:l+X4K77Dui85pIj5foXDhPlnqcNRG2QUyvca300lXh8=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.27/go.mod h1:KvZXSFEXm6x84yE8qffKvT3x8J5clWnVFXphpohhzJ8=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.27 h1:AmB5QxnD+fBFrg9LcqzkgF/CaYvMyU/BTlejG4t1S7Q=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.27/go.mod h1:Sai7P3xTiyv9ZUYO3IFxMnmiIP759/67iQbU4kdmkyU=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.8 h1:iwYS40JnrBeA9e9aI5S6KKN4EB2zR4iUVYN0nwVivz4=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.8/go.mod h1:Fm9Mi+ApqmFiknZtGpohVcBGvpTu542VC4XO9YudRi0=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.8 h1:cWno7lefSH6Pp+mSznagKCgfDGeZRin66UvYUqAkyeA=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.8/go.mod h1:tPD+VjU3ABTBoEJ3nctu5Nyg4P4yjqSH5bJGGkY4+XE=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.8 h1:/Mn7gTedG86nbpjT4QEKsN1D/fThiYe1qvq7WsBGNHg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.8/go.mod h1:Ae3va9LPmvjj231ukHB6UeT8nS7wTPfC3tMZSZMwNYg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw=
github.com/aws/aws-sdk-go-v2/service/s3 v1.72.2 h1:a7aQ3RW+ug4IbhoQp29NZdc7vqrzKZZfWZSaQAXOZvQ=
github.com/aws/aws-sdk-go-v2/service/s3 v1.72.2/go.mod h1:xMekrnhmJ5aqmyxtmALs7mlvXw5xRh+eYjOjvrIIFJ4=
github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 h1:JRseEu/vIDMaWis4bSw0QbXL+cvIGc1XnX076H5ZXLE=
github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU=
github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8=
github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.9 h1:YqtxripbjWb2QLyzRK9pByfEDvgg95gpC2AyDq4hFE8=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.9/go.mod h1:lV8iQpg6OLOfBnqbGMBKYjilBlf633qwHnBEiMSPoHY=
github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo=
github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.8 h1:6dBT1Lz8fK11m22R+AqfRsFn8320K0T5DTGxxOQBSMw=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.8/go.mod h1:/kiBvRQXBc6xeJTYzhSdGvJ5vm1tjaDEjH+MSeRJnlY=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.6 h1:VwhTrsTuVn52an4mXx29PqRzs2Dvu921NpGk7y43tAM=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.6/go.mod h1:+8h7PZb3yY5ftmVLD7ocEoE98hdc8PoKS0H3wfx1dlc=
github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI=
github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc=
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/aws/smithy-go v1.27.1 h1:4T340VFndXtADGF52gYa1POyL7s9E4Z1OeZ1hCscIw8=
github.com/aws/smithy-go v1.27.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk=
github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik=
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=
github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU=
github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ=
github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=
github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo=
github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs=
github.com/webview/webview_go v0.0.0-20240831120633-6173450d4dd6 h1:VQpB2SpK88C6B5lPHTuSZKb2Qee1QWwiFlC5CKY4AW0=
github.com/webview/webview_go v0.0.0-20240831120633-6173450d4dd6/go.mod h1:yE65LFCeWf4kyWD5re+h4XNvOHJEXOCOuJZ4v8l5sgk=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ=
go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8=
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw=
google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0=
google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA=
google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg=
google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+140 -118
View File
@@ -13,8 +13,10 @@
"com.google.code.gson:gson": 579810017,
"com.google.errorprone:error_prone_annotations": 950460708,
"com.google.guava:failureaccess": 1582410452,
"com.google.guava:guava": 1001533771,
"com.google.guava:guava": 582798237,
"com.google.j2objc:j2objc-annotations": 2003271689,
"com.google.protobuf:protobuf-java": -1795397632,
"com.google.protobuf:protobuf-java-util": -1033086717,
"com.google.re2j:re2j": 1525409503,
"com.google.s2a.proto.v2:s2a-proto": 898932763,
"com.google.truth:truth": 1696781452,
@@ -63,13 +65,13 @@
"org.slf4j:slf4j-simple": 1999565066,
"org.xerial:sqlite-jdbc": 1165654128,
"repositories": 514854214,
"software.amazon.awssdk:aws-core": 578934204,
"software.amazon.awssdk:http-client-spi": 1408046502,
"software.amazon.awssdk:regions": -746327146,
"software.amazon.awssdk:s3": -1435226835,
"software.amazon.awssdk:s3-transfer-manager": 1723315567,
"software.amazon.awssdk:sdk-core": -371247329,
"software.amazon.awssdk:utils": -405122936
"software.amazon.awssdk:aws-core": -101124166,
"software.amazon.awssdk:http-client-spi": 727988132,
"software.amazon.awssdk:regions": -1426385516,
"software.amazon.awssdk:s3": -2115285205,
"software.amazon.awssdk:s3-transfer-manager": 1043257197,
"software.amazon.awssdk:sdk-core": -1051305699,
"software.amazon.awssdk:utils": -1085181306
},
"__RESOLVED_ARTIFACTS_HASH": {
"com.amazonaws:aws-lambda-java-core": -56323966,
@@ -85,22 +87,23 @@
"com.google.api.grpc:proto-google-common-protos": 1506674904,
"com.google.api:api-common": 1729001290,
"com.google.auth:google-auth-library-credentials": 563614471,
"com.google.auth:google-auth-library-oauth2-http": -1252786723,
"com.google.auth:google-auth-library-oauth2-http": -1424193143,
"com.google.auto.value:auto-value": -1399392164,
"com.google.auto.value:auto-value-annotations": 1092025564,
"com.google.code.findbugs:jsr305": -1038659426,
"com.google.code.gson:gson": 592204959,
"com.google.errorprone:error_prone_annotations": 1213248887,
"com.google.guava:failureaccess": -56291903,
"com.google.guava:guava": 2119270017,
"com.google.guava:guava": 1970967483,
"com.google.guava:listenablefuture": 1588902908,
"com.google.http-client:google-http-client": 1756875461,
"com.google.http-client:google-http-client-gson": 1267916085,
"com.google.http-client:google-http-client": -136457690,
"com.google.http-client:google-http-client-gson": -1055701869,
"com.google.j2objc:j2objc-annotations": -2074422376,
"com.google.protobuf:protobuf-java": -1065767575,
"com.google.protobuf:protobuf-java-util": 675279053,
"com.google.re2j:re2j": -461460138,
"com.google.s2a.proto.v2:s2a-proto": 833783597,
"com.google.truth:truth": 1846223773,
"com.google.s2a.proto.v2:s2a-proto": 1108303781,
"com.google.truth:truth": 1427899897,
"com.lihaoyi:fansi_2.13": -224971606,
"com.lihaoyi:sourcecode_2.13": 2048976,
"com.nimbusds:nimbus-jose-jwt": -1763138105,
@@ -114,7 +117,7 @@
"com.thesamet.scalapb:protoc-bridge_3": -1984150046,
"com.thesamet.scalapb:protoc-gen_3": 1860775213,
"com.thesamet.scalapb:scalapb-json4s_3": 1579843487,
"com.thesamet.scalapb:scalapb-runtime-grpc_3": 97373115,
"com.thesamet.scalapb:scalapb-runtime-grpc_3": 580120277,
"com.thesamet.scalapb:scalapb-runtime_3": 818778125,
"com.typesafe:config": -1791448454,
"commons-codec:commons-codec": 1377992676,
@@ -133,11 +136,11 @@
"io.github.alexarchambault:concurrent-reference-hash-map": -1702289188,
"io.github.alexarchambault:is-terminal": 357931298,
"io.github.java-diff-utils:java-diff-utils": 1636095913,
"io.grpc:grpc-api": -947568169,
"io.grpc:grpc-context": -22548221,
"io.grpc:grpc-protobuf": -1259537716,
"io.grpc:grpc-protobuf-lite": -1244666196,
"io.grpc:grpc-stub": -1164705340,
"io.grpc:grpc-api": -1732683013,
"io.grpc:grpc-context": -862685412,
"io.grpc:grpc-protobuf": -793298635,
"io.grpc:grpc-protobuf-lite": -766127633,
"io.grpc:grpc-stub": -1619717353,
"io.netty:netty-buffer": -870582473,
"io.netty:netty-codec": -1546709832,
"io.netty:netty-codec-http": 1825361781,
@@ -158,9 +161,9 @@
"io.netty:netty-transport-classes-epoll": 704589083,
"io.netty:netty-transport-native-epoll:jar:linux-x86_64": -2050990961,
"io.netty:netty-transport-native-unix-common": -2090924105,
"io.opencensus:opencensus-api": -1002511030,
"io.opencensus:opencensus-contrib-grpc-metrics": -1797408624,
"io.opencensus:opencensus-contrib-http-util": -541858674,
"io.opencensus:opencensus-api": 709780868,
"io.opencensus:opencensus-contrib-grpc-metrics": 576725745,
"io.opencensus:opencensus-contrib-http-util": -1406323089,
"io.perfmark:perfmark-api": -752483303,
"io.sentry:sentry": 1564972879,
"javax.activation:javax.activation-api": -217704356,
@@ -238,43 +241,44 @@
"org.virtuslab.scala-cli:config_2.13": -113493958,
"org.virtuslab.scala-cli:specification-level_2.13": -176416420,
"org.xerial:sqlite-jdbc": 532995836,
"software.amazon.awssdk:annotations": 998747622,
"software.amazon.awssdk:apache5-client": -1074889369,
"software.amazon.awssdk:arns": -343721679,
"software.amazon.awssdk:auth": -2029384821,
"software.amazon.awssdk:aws-core": -972563193,
"software.amazon.awssdk:aws-query-protocol": -1912351735,
"software.amazon.awssdk:aws-xml-protocol": -1468671355,
"software.amazon.awssdk:checksums": 402393687,
"software.amazon.awssdk:checksums-spi": 291168436,
"software.amazon.awssdk:crt-core": -188683876,
"software.amazon.awssdk:endpoints-spi": 1744208155,
"software.amazon.awssdk:http-auth": 1606749494,
"software.amazon.awssdk:http-auth-aws": 2126373059,
"software.amazon.awssdk:http-auth-aws-eventstream": 460259189,
"software.amazon.awssdk:http-auth-spi": -453223244,
"software.amazon.awssdk:http-client-spi": 1562372132,
"software.amazon.awssdk:identity-spi": -746538651,
"software.amazon.awssdk:json-utils": 437812378,
"software.amazon.awssdk:metrics-spi": -1546848631,
"software.amazon.awssdk:netty-nio-client": -1338701602,
"software.amazon.awssdk:profiles": -182531104,
"software.amazon.awssdk:protocol-core": -1345470077,
"software.amazon.awssdk:regions": -1834663820,
"software.amazon.awssdk:retries": -1413373007,
"software.amazon.awssdk:retries-spi": 1300004784,
"software.amazon.awssdk:s3": 615621373,
"software.amazon.awssdk:s3-transfer-manager": -1895735125,
"software.amazon.awssdk:sdk-core": 463109330,
"software.amazon.awssdk:third-party-jackson-core": -957610333,
"software.amazon.awssdk:utils": -972192996,
"software.amazon.awssdk:utils-lite": 1790983243,
"software.amazon.awssdk:annotations": 265461227,
"software.amazon.awssdk:apache5-client": -35839286,
"software.amazon.awssdk:arns": 1467380022,
"software.amazon.awssdk:auth": 810405042,
"software.amazon.awssdk:aws-core": -314904404,
"software.amazon.awssdk:aws-query-protocol": -1985454850,
"software.amazon.awssdk:aws-xml-protocol": 1737917993,
"software.amazon.awssdk:checksums": 1310517997,
"software.amazon.awssdk:checksums-spi": 1399080780,
"software.amazon.awssdk:crt-core": -1945112513,
"software.amazon.awssdk:endpoints-spi": 1609685570,
"software.amazon.awssdk:http-auth": -818458676,
"software.amazon.awssdk:http-auth-aws": 1242479472,
"software.amazon.awssdk:http-auth-aws-eventstream": -1313563447,
"software.amazon.awssdk:http-auth-spi": 1886317627,
"software.amazon.awssdk:http-client-spi": -1309520306,
"software.amazon.awssdk:identity-spi": -1635986660,
"software.amazon.awssdk:json-utils": -1751579383,
"software.amazon.awssdk:metrics-spi": -873062065,
"software.amazon.awssdk:netty-nio-client": 43577390,
"software.amazon.awssdk:profiles": 99667206,
"software.amazon.awssdk:protocol-core": -1863122418,
"software.amazon.awssdk:regions": -1272622788,
"software.amazon.awssdk:retries": 1885379009,
"software.amazon.awssdk:retries-spi": -1748788271,
"software.amazon.awssdk:s3": 1927677616,
"software.amazon.awssdk:s3-transfer-manager": 1781977356,
"software.amazon.awssdk:sdk-core": -2145297823,
"software.amazon.awssdk:third-party-jackson-core": 597754902,
"software.amazon.awssdk:utils": 1158804846,
"software.amazon.awssdk:utils-lite": 1105261816,
"software.amazon.eventstream:eventstream": 1951806649
},
"conflict_resolution": {
"com.google.api.grpc:proto-google-common-protos:2.63.1": "com.google.api.grpc:proto-google-common-protos:2.64.1",
"com.google.guava:failureaccess:1.0.1": "com.google.guava:failureaccess:1.0.3",
"com.google.j2objc:j2objc-annotations:2.8": "com.google.j2objc:j2objc-annotations:3.1",
"com.google.protobuf:protobuf-java:4.27.2": "com.google.protobuf:protobuf-java:4.35.0",
"io.netty:netty-transport-native-unix-common:4.1.127.Final": "io.netty:netty-transport-native-unix-common:4.1.135.Final",
"io.opencensus:opencensus-api:0.31.0": "io.opencensus:opencensus-api:0.31.1",
"org.codehaus.mojo:animal-sniffer-annotations:1.26": "org.codehaus.mojo:animal-sniffer-annotations:1.27"
@@ -402,9 +406,9 @@
},
"com.google.guava:guava": {
"shasums": {
"jar": "dc573e1fca4fd5454f4a5fd3d7da2df03002876a4175bafc14a95980dd7713b3"
"jar": "9532ca9ba8aceb4cd2067171f981c799988b7f5844e3e274811a3bb757034bc4"
},
"version": "33.6.0-jre"
"version": "33.6.0-android"
},
"com.google.guava:listenablefuture": {
"shasums": {
@@ -436,6 +440,12 @@
},
"version": "4.35.0"
},
"com.google.protobuf:protobuf-java-util": {
"shasums": {
"jar": "a2665294d3e4675482bde593df8283f8c965f0207785e8e9b223f790644f5b08"
},
"version": "4.27.2"
},
"com.google.re2j:re2j": {
"shasums": {
"jar": "7b52c72156dd7f98b3237a5b35c1d34fba381b21048c89208913ad80a45dfbd7"
@@ -1253,189 +1263,189 @@
},
"software.amazon.awssdk:annotations": {
"shasums": {
"jar": "4d958c5c96d7e6b33c99a62f25459f42e1358e5ff1389b49f17445734b4f093e"
"jar": "0e66de12a3ed381780f586fff21a3d8cbbee34f7a750d591e6808f0eb7ff11d7"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:apache5-client": {
"shasums": {
"jar": "63e3c1c5eb9ad2810e63b518f1bb72aa50fb595ca9320ebf4557b2ac7193b7fa"
"jar": "fc2686aa92371ddce1588ae6abe5da94e85659c19d37788505e203a839a502f1"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:arns": {
"shasums": {
"jar": "5276d27bc7c3e68f73486dd99426eaba7905953dd00476dde53358d77c87b559"
"jar": "43bcdc92354d04bfbc7c0146a2142e7441da765b5a94f53cb042dcc639b41746"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:auth": {
"shasums": {
"jar": "a40a57c6bed6a549247d7a80e739547443928b84db872618bbb0625e909f3118"
"jar": "d243b7d35e9f4359379327893615493f29951e65a0f9b2877dc57ef802cb5d43"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:aws-core": {
"shasums": {
"jar": "b4648b2ca40b6a6d60224be45ff887b4859b594380d58c4d8d52f91610a9dd08"
"jar": "3a11acee17918f0748902e8ce3361cecaba3cdd7c8bd938fcf3f215f0af72b8e"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:aws-query-protocol": {
"shasums": {
"jar": "5c16146da08e5f8dd810c9606bab14b0e3a0588d89013f9c2e0a06242f7e3f86"
"jar": "13bea147a77a7ca1b401e57f1a957821fbdef21366854bfff028922272ef66b6"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:aws-xml-protocol": {
"shasums": {
"jar": "98d67746d464aa0e9b6e011746b85acaff294cbe114ed3e978e94c6bac52c0f6"
"jar": "17c45c621eb8d09bb1d3d8300ff71ab47285247d7be7f0e7f42ed1db5b59e9eb"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:checksums": {
"shasums": {
"jar": "6f94e74f1d9aba3d4b92d45e22cd231480133d0a88775bde0db09bfb9ed6b609"
"jar": "6ff01216cb086fe5d49e8e65130dacdb85ab45d0f75236b902f3c22f3b855dde"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:checksums-spi": {
"shasums": {
"jar": "9c87e9fe06653d05f487f1521958e4ea37033e150ec678bc988beab1ba4453a1"
"jar": "d3b0e2f03b42a2f243bb3b98fc5947fd91df6e4c3613eb144da9be7296c51d07"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:crt-core": {
"shasums": {
"jar": "6fef98d96273ebc24d6cc62a36c94a2994f5d146551156f32500eac0b4baed52"
"jar": "f30033d6d5e70d05baeb23bd6e02136a48a82c0bca43809345bda8cca5de1eba"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:endpoints-spi": {
"shasums": {
"jar": "00fee4c88523c977ed485ae3d4d1fec6834ed359da9223745e628cb356060b8d"
"jar": "0a182c0c57711a25894489b41a64cb6db39d9e3e238d2612028fe8e8215a0260"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:http-auth": {
"shasums": {
"jar": "c92579221cf4c3e17e189a6e64608903a68fd8368f0c65a5976a0a5286f4d3d2"
"jar": "cfb65870787413dc20585c12be24988fdf3860940e29ed4a9abbf2429c75ba70"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:http-auth-aws": {
"shasums": {
"jar": "e8e306d86d0038f07dcde68d1bcff1c1fceeb88589cbe40700471855298aeefd"
"jar": "7db13526c33499bbfff15aa4e322140cf4506b338c74443debf8b0b6f0a4e49a"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:http-auth-aws-eventstream": {
"shasums": {
"jar": "c1ddff7616b9d12658871b5caf058c12ab4f5778ac52fa57f89a97b78b460206"
"jar": "d44351439fbd6cab242f3668a717fee893432bee2e7fe847361bf101eab07290"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:http-auth-spi": {
"shasums": {
"jar": "96727d540da477fcd2025ad35cdbd5c2274adecc722633d7eaf72bba084d1fca"
"jar": "db8ce223e673f25560feae07239164521b407aae6e7813f46f0f9184611b20a5"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:http-client-spi": {
"shasums": {
"jar": "df32c5ee9e8df76393c0c870b7179bbaeb5ffda98ffb2cc3090a7a9ab2fb76d9"
"jar": "6ac595a06a587c3aa5043337622913c267b6fb6d8703ee9941b33ba956d6d9b0"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:identity-spi": {
"shasums": {
"jar": "757fa46994a020a179b5774521d273f9fecb62d30749f715a22fc4cd1609fbb6"
"jar": "04037b0af50aa081b7af15cbe6436cc5a13de38918a195447f48d9e9ff69ef6f"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:json-utils": {
"shasums": {
"jar": "473961ab15697d6aedd234d4b458014190fe48f568ffb2622d2e66c864f7f2bd"
"jar": "87cc4f9e28b6f25cb17560dab8b880dd6434697fd14eedce1b75b616c34e67a3"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:metrics-spi": {
"shasums": {
"jar": "340fb3b0e8453bedfe09e20f5207539325529c3878a8aaf7b5969aaee37db628"
"jar": "11cb8851d2606b49b247f99bced6ee1badbf0bade142a716d4b40dfb0535c437"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:netty-nio-client": {
"shasums": {
"jar": "147defd5c892787a52c40614a803b3fd44f960df82efb50d6d6f185524e29d96"
"jar": "8f631a70708510ad38655ed6c097e4ed0e5f5ee442c13c855cab8d7b54dbae0f"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:profiles": {
"shasums": {
"jar": "170bdbaa9d2221e3a36dd666d0cecf2b6ad8836154b3ec4a517ab28e4dd308a7"
"jar": "7fc1e03b890ac2196f2a9c597f8b0074710ed62b67f9e753a62897893002ffd3"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:protocol-core": {
"shasums": {
"jar": "9a66e0f6164eb196cda42219a667472a2e8e5823cba1d9a703118560cae91678"
"jar": "b83955e778376391157ffc653baacd8527694bb15c8e542e7e49333bd5cef98b"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:regions": {
"shasums": {
"jar": "67c407fe27498cf229d895b0e629793e3d3292bf9d6be3c84aabecaddd4ec838"
"jar": "b5d24f9cc4c7c8b251df9c211a9b9207f23dc93d4615a5d84edfff53149a0fae"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:retries": {
"shasums": {
"jar": "d4d74aa94eff9ee72b072277424639f08b932ff6cf87ec42477dba62b32206f9"
"jar": "40bd2c5dfeb7ec2107de09d9732d100fded1cef86501604a7b200ce4a878d7b6"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:retries-spi": {
"shasums": {
"jar": "2ab77d59f8cd38dc1c3ab90cf650712608cbcea04da5e1298691fc7e4952fab7"
"jar": "3b4d05cc05436413266b555b9a8682c2cca79ac7456912d27a37ad2123141724"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:s3": {
"shasums": {
"jar": "62b095e2911326d7b18f440ba647e7b1159c01a40393af25b0c88df7b4ace2bf"
"jar": "8621845c19a7b5f47d1c2c7c80a7c2a9385f79173930a3540c2d1b9599668cd0"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:s3-transfer-manager": {
"shasums": {
"jar": "01b5ba24b93329a5471298861e4bfbe9b42bd8dc4f7dbe6824e2ce7f9d6fcb44"
"jar": "1e0c8874a55a40573a595fc073509ea09b2a511e1e8648eb17b7fb2de307fb3e"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:sdk-core": {
"shasums": {
"jar": "3a3bb0201d1a71904aa84fd9ea51efbf721ff9b3ae10e7ae1b4e886e11148b53"
"jar": "9ce1df0c7e0c088fb5d32167a8240b5b7b7eb324128f0bedb6ad5878243d05e9"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:third-party-jackson-core": {
"shasums": {
"jar": "a8598b1ec191fa9b7478df6d56c17195ca969741110fc9f472d4f7e0209a0cdd"
"jar": "d53b00bec0af215d25c57fa05b19737fe7a6fb841ad895ac700fd998eab10e78"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:utils": {
"shasums": {
"jar": "9cfa5a97ca9d6fa3e4664d4b86139878d1976a563131e4af0aedd5b028a48154"
"jar": "b6403e4ee0640678bb228dc6340499750eea3e48918dc4c8a76ff8c26d22690e"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.awssdk:utils-lite": {
"shasums": {
"jar": "86f3a7a8b21d387567e67391914169b9a17e87a332c33ab0925690e0f6678ef2"
"jar": "b7b3ebb6a902f6f89edd2ba12b3145b8f000245b891d5b2ea21f4c005b842dd0"
},
"version": "2.46.9"
"version": "2.46.7"
},
"software.amazon.eventstream:eventstream": {
"shasums": {
@@ -1508,6 +1518,14 @@
"com.google.code.gson:gson",
"com.google.http-client:google-http-client"
],
"com.google.protobuf:protobuf-java-util": [
"com.google.code.findbugs:jsr305",
"com.google.code.gson:gson",
"com.google.errorprone:error_prone_annotations",
"com.google.guava:guava",
"com.google.j2objc:j2objc-annotations",
"com.google.protobuf:protobuf-java"
],
"com.google.s2a.proto.v2:s2a-proto": [
"io.grpc:grpc-protobuf",
"io.grpc:grpc-stub"
@@ -2421,6 +2439,9 @@
"com.google.protobuf",
"com.google.protobuf.compiler"
],
"com.google.protobuf:protobuf-java-util": [
"com.google.protobuf.util"
],
"com.google.re2j:re2j": [
"com.google.re2j"
],
@@ -4081,6 +4102,7 @@
"com.google.http-client:google-http-client-gson",
"com.google.j2objc:j2objc-annotations",
"com.google.protobuf:protobuf-java",
"com.google.protobuf:protobuf-java-util",
"com.google.re2j:re2j",
"com.google.s2a.proto.v2:s2a-proto",
"com.google.truth:truth",
-47
View File
@@ -1,47 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"dependencyDashboard": true,
"enabledManagers": [
"bazel-module",
"cargo",
"github-actions",
"gomod",
"swift"
],
"labels": [
"dependencies"
],
"packageRules": [
{
"description": "Bazel module artifact updates run in GitHub Actions so hosted Renovate does not need unsafe bazel mod deps execution",
"matchManagers": [
"bazel-module"
],
"skipArtifactsUpdate": true
},
{
"description": "Go packages import Bazel-generated protobuf packages, so Renovate's generic Go artifact updater cannot run ./...",
"matchManagers": [
"gomod"
],
"skipArtifactsUpdate": true
}
],
"lockFileMaintenance": {
"enabled": true,
"schedule": [
"before 6am on monday"
]
},
"prConcurrentLimit": 3,
"prHourlyLimit": 1,
"rebaseWhen": "behind-base-branch",
"schedule": [
"before 6am on monday"
],
"separateMajorMinor": true,
"timezone": "America/Los_Angeles"
}
-13
View File
@@ -1,13 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
bazel_cmd=(bazel)
if [ -n "${BAZEL_OUTPUT_USER_ROOT:-}" ]; then
bazel_cmd+=("--output_user_root=${BAZEL_OUTPUT_USER_ROOT}")
fi
if [ -n "${BAZEL_OUTPUT_BASE:-}" ]; then
bazel_cmd+=("--output_base=${BAZEL_OUTPUT_BASE}")
fi
"${bazel_cmd[@]}" build "$@" //src/main/scala/net/eagle0/eagle:eagle_server
-13
View File
@@ -1,13 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
bazel_cmd=(bazel)
if [ -n "${BAZEL_OUTPUT_USER_ROOT:-}" ]; then
bazel_cmd+=("--output_user_root=${BAZEL_OUTPUT_USER_ROOT}")
fi
if [ -n "${BAZEL_OUTPUT_BASE:-}" ]; then
bazel_cmd+=("--output_base=${BAZEL_OUTPUT_BASE}")
fi
"${bazel_cmd[@]}" build -c opt "$@" //src/main/cpp/net/eagle0/shardok:shardok-server
@@ -1,87 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage: $0 <warm|verify> [bazel targets...]"
echo
echo "warm: build targets normally so local results can upload to the remote cache"
echo "verify: require all target actions to be available from remote cache"
}
if [ "$#" -lt 1 ]; then
usage
exit 2
fi
mode="$1"
shift
case "$mode" in
warm | verify)
;;
*)
usage
exit 2
;;
esac
tmp_root="${RUNNER_TEMP:-/private/tmp}"
run_id="${GITHUB_RUN_ID:-local}-$$"
output_user_root="${tmp_root%/}/eagle0-bazel-user-root-${run_id}"
output_base="${tmp_root%/}/eagle0-cache-parity-${mode}-${run_id}"
echo "Mode: $mode"
echo "Output user root: $output_user_root"
echo "Output base: $output_base"
run_ci_build_script() {
local script="$1"
shift
echo "Build script: $script"
echo "Build args:"
printf ' %s\n' "$@"
BAZEL_OUTPUT_USER_ROOT="$output_user_root" BAZEL_OUTPUT_BASE="$output_base" "$script" "$@"
}
cache_check_args() {
local bazel_args=(
"--remote_download_all"
)
if [ "$mode" = "verify" ]; then
bazel_args+=(
"--remote_upload_local_results=false"
"--experimental_remote_require_cached"
"--disk_cache="
)
fi
printf '%s\n' "${bazel_args[@]}"
}
run_bazel_targets() {
bazel_args=()
while IFS= read -r arg; do
bazel_args+=("$arg")
done < <(cache_check_args)
echo "Bazel args:"
printf ' %s\n' "${bazel_args[@]}" "$@"
bazel "--output_user_root=$output_user_root" "--output_base=$output_base" build "${bazel_args[@]}" "$@"
}
if [ "$#" -gt 0 ]; then
run_bazel_targets "$@"
exit 0
fi
bazel_args=()
while IFS= read -r arg; do
bazel_args+=("$arg")
done < <(cache_check_args)
run_ci_build_script scripts/build_eagle_ci.sh "${bazel_args[@]}"
run_ci_build_script scripts/build_shardok_ci.sh "${bazel_args[@]}"
-6
View File
@@ -1,6 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
scripts/build_eagle_ci.sh
scripts/build_shardok_ci.sh
+2 -2
View File
@@ -8,12 +8,12 @@
#
# Optional environment variables:
# SPARKLE_FEED_URL - Appcast URL (default: https://assets.eagle0.net/mac/appcast.xml)
# SPARKLE_VERSION - Sparkle version to use (default: 2.9.3)
# SPARKLE_VERSION - Sparkle version to use (default: 2.6.4)
set -euxo pipefail
APP_PATH="$1"
SPARKLE_VERSION="${SPARKLE_VERSION:-2.9.3}"
SPARKLE_VERSION="${SPARKLE_VERSION:-2.6.4}"
SPARKLE_FEED_URL="${SPARKLE_FEED_URL:-https://assets.eagle0.net/mac/appcast.xml}"
SPARKLE_CACHE_DIR="/tmp/sparkle-cache"
+9 -9
View File
@@ -6,9 +6,9 @@
# Xcode version. If Xcode is upgraded in place, the DEVELOPER_DIR path stays the
# same, so Bazel can otherwise keep using stale Xcode metadata.
#
# 1. Writes .bazelrc.xcode with mactools-scoped flags:
# - action_env for Apple build remote cache key invalidation
# - DEVELOPER_DIR pointing to the active Xcode for Apple builds
# 1. Writes .bazelrc.xcode with macOS-scoped flags:
# - action_env for remote cache key invalidation
# - DEVELOPER_DIR pointing to the active Xcode
#
# 2. Runs `bazel clean --expunge` when the version actually changes, because
# local_config_apple_cc (a cached repository rule) bakes in the old version
@@ -35,7 +35,7 @@ if [ -z "$XCODE_BUILD_VERSION" ]; then
fi
BAZELRC_XCODE=".bazelrc.xcode"
EXPECTED_LINE="common:mactools --action_env=XCODE_BUILD_VERSION=${XCODE_BUILD_VERSION}"
EXPECTED_LINE="common:macos --action_env=XCODE_BUILD_VERSION=${XCODE_BUILD_VERSION}"
# Check if the file already has the right version (first line is the version marker)
if [ -f "$BAZELRC_XCODE" ]; then
@@ -45,19 +45,19 @@ if [ -f "$BAZELRC_XCODE" ]; then
fi
fi
# Xcode Bazel config changed (or first run) — expunge local cache to clear
# Xcode version changed (or first run) — expunge local cache to clear
# stale local_config_apple_cc, then write the new config
OLD_CONFIG="missing"
OLD_VERSION="unknown"
if [ -f "$BAZELRC_XCODE" ]; then
OLD_CONFIG=$(head -1 "$BAZELRC_XCODE")
OLD_VERSION=$(sed -n 's/.*XCODE_BUILD_VERSION=//p' "$BAZELRC_XCODE" | head -1)
fi
echo "Xcode Bazel config changed: ${OLD_CONFIG} -> ${EXPECTED_LINE}"
echo "Xcode build version changed: ${OLD_VERSION} -> ${XCODE_BUILD_VERSION}"
echo "Running bazel clean --expunge to clear stale toolchain config..."
bazel clean --expunge 2>/dev/null || true
cat > "$BAZELRC_XCODE" << EOF
${EXPECTED_LINE}
common:mactools --repo_env=DEVELOPER_DIR=${DEVELOPER_DIR}
common:macos --repo_env=DEVELOPER_DIR=${DEVELOPER_DIR}
EOF
if [ -n "${GITHUB_ENV:-}" ]; then
+67
View File
@@ -0,0 +1,67 @@
#!/usr/bin/env bash
echo -ne "\033[0;32m"
echo 'Updating bazel dependencies. This will take about five minutes.'
echo -ne "\033[0m"
set -e
if [ "$(uname -s)" == "Linux" ]; then
BAZEL_DEPS_URL=https://github.com/johnynek/bazel-deps/releases/download/v0.1-9/bazel-deps-linux
BAZEL_DEPS_SHA256=034ce4d8674a200d73d97aa60774786a3771c0f3871197858bf55fd930677b15
elif [ "$(uname -s)" == "Darwin" ]; then
BAZEL_DEPS_URL=https://github.com/johnynek/bazel-deps/releases/download/v0.1-9/bazel-deps-macos
BAZEL_DEPS_SHA256=97e1b932cccc60e30475fc0ef56a538c6b8a732adbdf0eaec1988f0b4f1dc5dc
else
echo "Your platform '$(uname -s)' is unsupported, sorry"
exit 1
fi
# This is some bash snippet designed to find the location of the script.
# we operate under the presumption this script is checked into the repo being operated on
# so we goto the script location, then use git to find the repo root.
SCRIPT_LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $SCRIPT_LOCATION
REPO_ROOT=$(git rev-parse --show-toplevel)
BAZEL_DEPS_DIR="$HOME/.bazel-deps-cache"
BAZEL_DEPS_PATH="${BAZEL_DEPS_DIR}/v0.1-9"
if [ ! -f ${BAZEL_DEPS_PATH} ]; then
( # Opens a subshell
set -e
echo "Fetching bazel deps."
curl -L -o /tmp/bazel-deps-bin $BAZEL_DEPS_URL
GENERATED_SHA_256=$(shasum -a 256 /tmp/bazel-deps-bin | awk '{print $1}')
if [ "$GENERATED_SHA_256" != "$BAZEL_DEPS_SHA256" ]; then
echo "Sha 256 does not match, expected: $BAZEL_DEPS_SHA256"
echo "But found $GENERATED_SHA_256"
echo "You may need to update the sha in this script, or the download was corrupted."
exit 1
fi
chmod +x /tmp/bazel-deps-bin
mkdir -p ${BAZEL_DEPS_DIR}
mv /tmp/bazel-deps-bin ${BAZEL_DEPS_PATH}
)
fi
cd $REPO_ROOT
set +e
$BAZEL_DEPS_PATH generate -r $REPO_ROOT -s 3rdparty/workspace.bzl -d dependencies.yaml --target-file 3rdparty/target_file.bzl --disable-3rdparty-in-repo
RET_CODE=$?
set -e
if [ $RET_CODE == 0 ]; then
echo "Success, going to format files"
else
echo "Failure, checking out 3rdparty/jvm"
cd $REPO_ROOT
git checkout 3rdparty/jvm 3rdparty/workspace.bzl
exit $RET_CODE
fi
$BAZEL_DEPS_PATH format-deps -d $REPO_ROOT/dependencies.yaml -o
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -11,8 +11,7 @@
#define SUPPRESS_PROTOBUF_WARNINGS \
_Pragma("GCC diagnostic ignored \"-Wpragmas\"") \
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") _Pragma( \
"GCC diagnostic ignored \"-Wsign-conversion\"") \
_Pragma("GCC diagnostic ignored \"-Wsign-conversion\"") \
_Pragma("GCC diagnostic ignored \"-Wunused-parameter\"") _Pragma( \
"GCC diagnostic ignored \"-Wdocumentation-deprecated-sync\"") \
_Pragma("GCC diagnostic ignored \"-Wdocumentation\"") _Pragma( \
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
# Abstract base class for score calculators
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_binary(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -392,6 +392,7 @@ void EagleInterfaceImpl::PopulateGameStatusResponse(
controller->ResolvedPlayerInfos(),
controller->EndGameUnits(),
response->mutable_game_over_response());
auto status = controller->GameOverStatus();
// player resolution infos
// response->mutable_game_over_response()->mutable_user_infos() ...
}
@@ -649,9 +650,7 @@ auto EagleInterfaceImpl::SubscribeToGame(
// Deserialize and restart the game from the original request
NewGameRequest newGameRequest;
if (!newGameRequest.ParseFromString(savedRequest)) {
return Status(StatusCode::INTERNAL, "Failed to parse saved tutorial battle request");
}
newGameRequest.ParseFromString(savedRequest);
StartGame(newGameRequest);
controller = gamesManager->GetController(gameId);
@@ -1,4 +1,3 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools:copts.bzl", "COPTS")
cc_library(
@@ -4,8 +4,6 @@
#include "MapLoader.hpp"
#include <stdexcept>
#include "src/main/cpp/net/eagle0/common/FilesystemUtils.hpp"
const std::string kShardokMapExtension = ".e0m";
@@ -16,18 +14,14 @@ auto LoadMap(const string& mapName) -> HexMapProto {
const byte_vector mapProtoBytes = byte_vector::FromPath(mapPath);
net::eagle0::shardok::common::HexMap mapProto{};
if (!mapProto.ParseFromArray(mapProtoBytes.data(), static_cast<int>(mapProtoBytes.size()))) {
throw std::runtime_error("Failed to parse map proto from " + mapPath);
}
mapProto.ParseFromArray(mapProtoBytes.data(), (int)mapProtoBytes.size());
return mapProto;
}
auto LoadMapFromBytes(const string& mapBytes) -> HexMapProto {
net::eagle0::shardok::common::HexMap mapProto{};
if (!mapProto.ParseFromString(mapBytes)) {
throw std::runtime_error("Failed to parse map proto from bytes");
}
mapProto.ParseFromString(mapBytes);
return mapProto;
}
@@ -61,13 +61,13 @@
<Analyzer Include="/Applications/Unity/Hub/Editor/6000.4.10f1/Unity.app/Contents/Resources/BuildPipeline/Unity.SourceGenerators/Unity.UIToolkit.SourceGenerator.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/AwaitExtensions.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/WaitForUpdate.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/IEnumeratorAwaitExtensions.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/Internal/SyncContextUtil.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/Awaiters.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/TaskExtensions.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/AwaitExtensions.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/Internal/AsyncCoroutineRunner.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/TaskExtensions.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Source/WaitForBackgroundThread.cs" />
<Compile Include="Assets/Plugins/AsyncAwaitUtil/Tests/Util/TestButtonHandler.cs" />
<Reference Include="UnityEngine">
@@ -913,9 +913,6 @@
<Reference Include="mscorlib">
<HintPath>/Applications/Unity/Hub/Editor/6000.4.10f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/mscorlib.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Core.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.2D.Common.Path.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Common.Path.Editor.dll</HintPath>
</Reference>
@@ -934,8 +931,8 @@
<Reference Include="PsdPlugin">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/PsdPlugin.dll</HintPath>
</Reference>
<Reference Include="Unity.Rendering.LightTransport.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Rendering.LightTransport.Editor.dll</HintPath>
<Reference Include="Unity.Postprocessing.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Postprocessing.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.Services.Core">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Services.Core.dll</HintPath>
@@ -943,9 +940,6 @@
<Reference Include="Unity.AI.Navigation">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.AI.Navigation.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.ShaderLibrary">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Core.ShaderLibrary.dll</HintPath>
</Reference>
<Reference Include="Unity.2D.IK.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.IK.Runtime.dll</HintPath>
</Reference>
@@ -958,11 +952,8 @@
<Reference Include="Unity.InternalAPIEditorBridge.001">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.InternalAPIEditorBridge.001.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Universal.2D.Editor.Overrides">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Universal.2D.Editor.Overrides.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Universal.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Universal.Editor.dll</HintPath>
<Reference Include="Unity.2D.Common.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Common.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.AI.Navigation.Updater">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.AI.Navigation.Updater.dll</HintPath>
@@ -970,33 +961,18 @@
<Reference Include="Unity.Timeline">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>
</Reference>
<Reference Include="Unity.2D.Common.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Common.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.AI.Navigation.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.AI.Navigation.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.Addressables">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Addressables.dll</HintPath>
</Reference>
<Reference Include="Unity.PathTracing.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.PathTracing.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.2D.Animation.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Animation.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.Runtime.Shared">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Core.Runtime.Shared.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Universal.2D.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Universal.2D.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.ScriptableBuildPipeline.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.ScriptableBuildPipeline.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.Searcher.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Searcher.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.PlasticSCM.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.PlasticSCM.Editor.dll</HintPath>
</Reference>
@@ -1009,9 +985,6 @@
<Reference Include="Unity.Services.Core.Components">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Services.Core.Components.dll</HintPath>
</Reference>
<Reference Include="Unity.UnifiedRayTracing.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.UnifiedRayTracing.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.Rider.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Rider.Editor.dll</HintPath>
</Reference>
@@ -1021,21 +994,12 @@
<Reference Include="Unity.AI.Navigation.Editor.ConversionSystem">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.AI.Navigation.Editor.ConversionSystem.dll</HintPath>
</Reference>
<Reference Include="Unity.InternalAPIEditorBridge.ShaderGraph.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.InternalAPIEditorBridge.ShaderGraph.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.2D.Psdimporter.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Psdimporter.Editor.dll</HintPath>
</Reference>
<Reference Include="Analytics">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Analytics.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Core.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll</HintPath>
</Reference>
<Reference Include="Unity.Analytics.DataPrivacy">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Analytics.DataPrivacy.dll</HintPath>
</Reference>
@@ -1054,9 +1018,6 @@
<Reference Include="Unity.2D.Tilemap.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Tilemap.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.SurfaceCache.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.SurfaceCache.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.2D.Common.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.2D.Common.Runtime.dll</HintPath>
</Reference>
@@ -1072,18 +1033,12 @@
<Reference Include="Unity.Timeline.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Timeline.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.GPUDriven.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.GPUDriven.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.Mathematics">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Mathematics.dll</HintPath>
</Reference>
<Reference Include="Cysharp.Net.Http.YetAnotherHttpHandler">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Cysharp.Net.Http.YetAnotherHttpHandler.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Universal.Shaders">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Universal.Shaders.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UI">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/UnityEngine.UI.dll</HintPath>
</Reference>
@@ -1102,36 +1057,18 @@
<Reference Include="Unity.Multiplayer.Center.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Multiplayer.Center.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.PathTracing.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.PathTracing.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Universal.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Universal.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Universal.Config.Runtime">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Universal.Config.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.InternalAPIEngineBridge.RenderPipelines.Core.Runtime.Shared">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.InternalAPIEngineBridge.RenderPipelines.Core.Runtime.Shared.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipeline.Universal.ShaderLibrary">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipeline.Universal.ShaderLibrary.dll</HintPath>
<Reference Include="Unity.Postprocessing.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Postprocessing.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.Collections.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Collections.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.Editor.Shared">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.RenderPipelines.Core.Editor.Shared.dll</HintPath>
</Reference>
<Reference Include="Unity.InputSystem">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.InputSystem.dll</HintPath>
</Reference>
<Reference Include="Unity.Addressables.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.Addressables.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.ShaderGraph.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.ShaderGraph.Editor.dll</HintPath>
</Reference>
<Reference Include="Unity.AutoGroupGenerator.Editor">
<HintPath>/Users/dancrosby/CodingProjects/github/eagle0-unity-client/src/main/csharp/net/eagle0/clients/unity/eagle0/Library/ScriptAssemblies/Unity.AutoGroupGenerator.Editor.dll</HintPath>
</Reference>
@@ -1,15 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3}
m_Name: DefaultVolumeProfile
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Runtime::UnityEngine.Rendering.VolumeProfile
components: []
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 647146733c18f46648c2162493680a2e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -133,7 +133,6 @@ namespace eagle {
foreach (var renderer in instance.GetComponentsInChildren<Renderer>()) {
renderer.sortingLayerName = BeastSortingLayerName;
renderer.sortingOrder = BeastCreatureSortingOrder;
BeastMaterialCompatibility.ConfigureRenderer(renderer);
}
foreach (var smr in instance.GetComponentsInChildren<SkinnedMeshRenderer>()) {
smr.updateWhenOffscreen = true;
@@ -1,290 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
namespace eagle {
internal static class BeastMaterialCompatibility {
private const string UniversalLitShaderName = "Universal Render Pipeline/Lit";
private const string UniversalParticleUnlitShaderName =
"Universal Render Pipeline/Particles/Unlit";
private const string BuiltInParticleStandardUnlitShaderName = "Particles/Standard Unlit";
private static readonly string[] BaseTexturePropertyNames =
{ "_MainTex", "_BaseMap", "_Albedo", "_TextureSample0" };
private static readonly Dictionary<Material, Texture2D> BakedPaletteTextures = new();
private static readonly PaletteEntry[] PolytopePaletteEntries = {
new(new Color(0.4980392f, 1f, 1f), "_FEATHERS2COLOR", "_FEATHERS2COLOR1"),
new(new Color(0.4980392f, 1f, 0.4980392f), "_FEATHERS1COLOR", "_FEATHERS1COLOR1"),
new(new Color(0f, 0f, 1f), "_CLOTH4COLOR", "_CLOTH4COLOR1"),
new(new Color(0f, 1f, 1f), "_CLOTH3COLOR", "_CLOTH3COLOR1"),
new(new Color(0f, 1f, 0f), "_CLOTH2COLOR", "_CLOTH2COLOR1"),
new(new Color(0f, 0.4980392f, 0f), "_CLOTH1COLOR", "_CLOTH1COLOR1"),
new(new Color(1f, 0.4980392f, 0.4980392f), "_LEATHER4COLOR", "_LEATHER4COLOR1"),
new(new Color(1f, 1f, 0.4980392f), "_LEATHER3COLOR", "_LEATHER3COLOR1"),
new(new Color(1f, 0f, 1f), "_LEATHER2COLOR", "_LEATHER2COLOR1"),
new(new Color(1f, 0.4980392f, 1f), "_LEATHER1COLOR", "_LEATHER1COLOR1"),
new(new Color(0.4980392f, 0.4980392f, 1f), "_METAL4COLOR", "_METAL4COLOR1"),
new(new Color(0f, 0.4980392f, 0.4980392f), "_METAL3COLOR", "_METAL3COLOR1"),
new(new Color(0f, 0f, 0.4980392f), "_METAL2COLOR", "_METAL2COLOR1"),
new(new Color(0.4980392f, 0f, 0.4980392f), "_METAL1COLOR", "_METAL1COLOR1"),
new(new Color(1f, 1f, 0f), "_OTHERCOLOR", "_OTHERCOLOR1"),
new(new Color(0.4980392f, 0.4980392f, 0f), "_LIPSCOLOR", "_LIPSCOLOR1"),
new(new Color(0.4980392f, 0.4980392f, 0.4980392f), "_SCLERACOLOR", "_SCLERACOLOR1"),
new(new Color(1f, 0f, 0f), "_EYESCOLOR", "_EYESCOLOR1"),
new(new Color(1f, 0.4980392f, 0f), "_HAIRCOLOR", "_HAIRCOLOR1"),
new(new Color(0.4980392f, 0f, 0f), "_SKINCOLOR", "_SKINCOLOR1")
};
public static void ConfigureRenderer(Renderer renderer) {
if (!IsUniversalRenderPipelineActive()) { return; }
var sourceMaterials = renderer.sharedMaterials;
var materials = renderer.materials;
var changed = false;
for (var i = 0; i < materials.Length; i++) {
if (!ShouldReplaceMaterial(materials[i])) { continue; }
var sourceMaterial = i < sourceMaterials.Length ? sourceMaterials[i] : materials[i];
materials[i] = CreateUniversalLitMaterial(sourceMaterial);
changed = true;
}
if (changed) { renderer.materials = materials; }
}
public static Material CreateParticleMaterial(Material source, Texture texture) {
if (!IsUniversalRenderPipelineActive()) {
var builtInMaterial =
source != null ? new Material(source)
: CreateMaterial(BuiltInParticleStandardUnlitShaderName);
if (builtInMaterial != null && texture != null) {
builtInMaterial.mainTexture = texture;
}
return builtInMaterial;
}
var material = CreateMaterial(UniversalParticleUnlitShaderName) ??
CreateMaterial("Universal Render Pipeline/Unlit");
if (material == null) { return source != null ? new Material(source) : null; }
CopyBaseTextureAndColor(source, material, texture);
material.SetFloat("_Surface", 1f);
material.SetFloat("_Blend", 0f);
material.SetInt("_SrcBlend", (int)BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
material.renderQueue = (int)RenderQueue.Transparent;
return material;
}
private static bool ShouldReplaceMaterial(Material material) {
if (material == null || material.shader == null) { return false; }
var shaderName = material.shader.name;
if (shaderName.StartsWith("Universal Render Pipeline/") ||
shaderName.StartsWith("Sprites/")) {
return false;
}
return true;
}
private static Material CreateUniversalLitMaterial(Material source) {
var shader = Shader.Find(UniversalLitShaderName);
if (shader == null) { return new Material(source); }
var material = new Material(shader);
if (TryCreatePolytopePaletteTexture(source, out var paletteTexture)) {
CopyBaseTextureAndColor(source, material, paletteTexture);
} else {
CopyBaseTextureAndColor(source, material, null);
}
return material;
}
private static Material CreateMaterial(string shaderName) {
var shader = Shader.Find(shaderName);
return shader != null ? new Material(shader) : null;
}
private static void
CopyBaseTextureAndColor(Material source, Material target, Texture overrideTexture) {
var texture = overrideTexture;
if (texture == null && source != null) {
texture = FindFirstTexture(source, BaseTexturePropertyNames);
}
if (texture != null) {
if (target.HasProperty("_BaseMap")) { target.SetTexture("_BaseMap", texture); }
if (target.HasProperty("_MainTex")) { target.SetTexture("_MainTex", texture); }
}
var color = Color.white;
if (source != null) {
if (source.HasProperty("_Color")) {
color = source.GetColor("_Color");
} else if (source.HasProperty("_BaseColor")) {
color = source.GetColor("_BaseColor");
}
}
if (target.HasProperty("_BaseColor")) { target.SetColor("_BaseColor", color); }
if (target.HasProperty("_Color")) { target.SetColor("_Color", color); }
}
private static Texture FindFirstTexture(Material source, string[] propertyNames) {
foreach (var propertyName in propertyNames) {
if (!source.HasProperty(propertyName)) { continue; }
var texture = source.GetTexture(propertyName);
if (texture != null) { return texture; }
}
return null;
}
private static bool TryCreatePolytopePaletteTexture(
Material source,
out Texture2D texture) {
texture = null;
if (source == null || !HasAnyProperty(source, "_SKINCOLOR", "_SKINCOLOR1")) {
return false;
}
var maskTexture =
GetTexture(source, "_TextureSample0") ?? GetTexture(source, "_TextureSample1");
var shadeTexture =
GetTexture(source, "_TextureSample2") ?? GetTexture(source, "_TextureSample3");
if (maskTexture == null || shadeTexture == null) { return false; }
if (BakedPaletteTextures.TryGetValue(source, out texture)) { return true; }
var maskPixels = ReadTexturePixels(maskTexture);
var shadePixels = ReadTexturePixels(shadeTexture);
var width = Mathf.Min(maskPixels.width, shadePixels.width);
var height = Mathf.Min(maskPixels.height, shadePixels.height);
texture = new Texture2D(width, height, TextureFormat.RGBA32, true);
texture.name = $"{source.name}_URP_BakedPalette";
texture.wrapMode = maskTexture.wrapMode;
texture.filterMode = maskTexture.filterMode;
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
var maskColor = maskPixels.texture.GetPixel(x, y);
var shadeColor = shadePixels.texture.GetPixel(x, y);
var paletteColor = ResolvePolytopePaletteColor(source, maskColor);
texture.SetPixel(x, y, Multiply(shadeColor, paletteColor));
}
}
texture.Apply(updateMipmaps: true, makeNoLongerReadable: false);
BakedPaletteTextures[source] = texture;
DestroyIfTemporary(maskPixels.texture, maskTexture);
DestroyIfTemporary(shadePixels.texture, shadeTexture);
return true;
}
private static Color ResolvePolytopePaletteColor(Material source, Color maskColor) {
var bestDistance = float.MaxValue;
var bestColor = Color.white;
foreach (var entry in PolytopePaletteEntries) {
var distance = ColorDistance(maskColor, entry.MaskColor);
if (distance >= bestDistance) { continue; }
bestDistance = distance;
bestColor = GetColor(source, entry.PropertyName, entry.AlternatePropertyName);
}
return bestDistance <= 0.12f ? bestColor : Color.white;
}
private static Color
GetColor(Material source, string propertyName, string alternatePropertyName) {
if (source.HasProperty(propertyName)) { return source.GetColor(propertyName); }
if (source.HasProperty(alternatePropertyName)) {
return source.GetColor(alternatePropertyName);
}
return Color.white;
}
private static Texture GetTexture(Material source, string propertyName) {
return source.HasProperty(propertyName) ? source.GetTexture(propertyName) : null;
}
private static bool HasAnyProperty(Material source, params string[] propertyNames) {
foreach (var propertyName in propertyNames) {
if (source.HasProperty(propertyName)) { return true; }
}
return false;
}
private static TexturePixels ReadTexturePixels(Texture source) {
var renderTexture = RenderTexture.GetTemporary(
source.width,
source.height,
0,
RenderTextureFormat.ARGB32,
RenderTextureReadWrite.Default);
var previous = RenderTexture.active;
Graphics.Blit(source, renderTexture);
RenderTexture.active = renderTexture;
var texture = new Texture2D(source.width, source.height, TextureFormat.RGBA32, false);
texture.ReadPixels(new Rect(0, 0, source.width, source.height), 0, 0);
texture.Apply();
RenderTexture.active = previous;
RenderTexture.ReleaseTemporary(renderTexture);
return new TexturePixels(texture);
}
private static Color Multiply(Color a, Color b) {
return new Color(a.r * b.r, a.g * b.g, a.b * b.b, a.a);
}
private static float ColorDistance(Color a, Color b) {
var r = a.r - b.r;
var g = a.g - b.g;
var blue = a.b - b.b;
return Mathf.Sqrt(r * r + g * g + blue * blue);
}
private static void DestroyIfTemporary(Texture2D texture, Texture original) {
if (texture != original) { Object.Destroy(texture); }
}
private static bool IsUniversalRenderPipelineActive() {
var pipeline = GraphicsSettings.currentRenderPipeline;
return pipeline != null && pipeline.GetType().Name.Contains("UniversalRenderPipeline");
}
private readonly struct PaletteEntry {
public readonly Color MaskColor;
public readonly string PropertyName;
public readonly string AlternatePropertyName;
public PaletteEntry(
Color maskColor,
string propertyName,
string alternatePropertyName) {
MaskColor = maskColor;
PropertyName = propertyName;
AlternatePropertyName = alternatePropertyName;
}
}
private readonly struct TexturePixels {
public readonly Texture2D texture;
public readonly int width;
public readonly int height;
public TexturePixels(Texture2D texture) {
this.texture = texture;
width = texture.width;
height = texture.height;
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 29170b447ee24e68818c3554d0feeb32
@@ -119,15 +119,28 @@ namespace eagle {
// Use provided material if available (ensures shader is in build)
if (birdMaterial != null) {
_materialInstance = BeastMaterialCompatibility.CreateParticleMaterial(
birdMaterial,
birdTexture);
_materialInstance = new Material(birdMaterial);
if (birdTexture != null) { _materialInstance.mainTexture = birdTexture; }
renderer.material = _materialInstance;
} else {
// Fallback for editor testing
_materialInstance =
BeastMaterialCompatibility.CreateParticleMaterial(null, birdTexture);
if (_materialInstance != null) { renderer.material = _materialInstance; }
var particleShader = Shader.Find("Particles/Standard Unlit");
if (particleShader != null) {
_materialInstance = new Material(particleShader);
_materialInstance.SetFloat("_ColorMode", 1);
_materialInstance.SetFloat("_Surface", 1);
_materialInstance.SetFloat("_Blend", 0);
_materialInstance.SetInt(
"_SrcBlend",
(int)UnityEngine.Rendering.BlendMode.SrcAlpha);
_materialInstance.SetInt(
"_DstBlend",
(int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
_materialInstance.EnableKeyword("_ALPHABLEND_ON");
_materialInstance.renderQueue = 3000;
if (birdTexture != null) { _materialInstance.mainTexture = birdTexture; }
renderer.material = _materialInstance;
}
}
renderer.sortingLayerName = BeastSortingLayerName;
renderer.sortingOrder = BeastBirdSortingOrder;
@@ -89,7 +89,6 @@ namespace eagle {
foreach (var renderer in _dragonInstance.GetComponentsInChildren<Renderer>()) {
renderer.sortingLayerName = BeastSortingLayerName;
renderer.sortingOrder = BeastCreatureSortingOrder;
BeastMaterialCompatibility.ConfigureRenderer(renderer);
}
if (clipToViewport) { RendererViewportClipper.Attach(_dragonInstance); }
@@ -3,7 +3,8 @@ using UnityEngine.UI;
namespace eagle {
/// <summary>
/// Creates a drought effect with a hot sun overlay.
/// Creates a drought effect with a hot sun and heat shimmer overlay.
/// The heat shimmer distorts the province using a shader that masks to province boundaries.
/// </summary>
[RequireComponent(typeof(RectTransform))]
public class DroughtEffect : MonoBehaviour {
@@ -20,14 +21,32 @@ namespace eagle {
public float sunWaveSpeedY =
0.6f; // Vertical wave speed (slightly different for organic feel)
[Header("Heat Shimmer Settings")]
public Material shimmerMaterial;
public float shimmerSize = 300f; // Large enough to cover province
[Header("Province Masking")]
public Texture2D provinceIdMap;
public int targetProvinceId;
public Vector4 mapBounds; // x=minX, y=minY, z=width, w=height
private GameObject _sunObject;
private Image _sunImage;
private GameObject _shimmerObject;
private RawImage _shimmerImage; // RawImage renders without sprite
private Material _shimmerMatInstance;
private Texture2D _whiteTexture;
private float _baseSunScale;
private Vector2 _baseSunPosition;
void Start() { SetupEffect(); }
private void SetupEffect() { SetupSun(); }
private void SetupEffect() {
SetupSun();
// Note: Shimmer disabled - GrabPass doesn't work well with UI Canvas
// TODO: Consider alternative shimmer approach (animated texture overlay)
// SetupShimmer();
}
private void SetupSun() {
_sunObject = new GameObject("Sun");
@@ -45,6 +64,72 @@ namespace eagle {
_baseSunScale = 1f;
}
private void SetupShimmer() {
// Try to find the shader and create material
var shader = Shader.Find("Eagle/HeatShimmer");
if (shader == null) {
Debug.LogWarning("DroughtEffect: Could not find Eagle/HeatShimmer shader");
return;
}
_shimmerObject = new GameObject("HeatShimmer");
_shimmerObject.transform.SetParent(transform, false);
// Put shimmer behind sun
_shimmerObject.transform.SetAsFirstSibling();
// Create a white texture for RawImage (required for rendering)
_whiteTexture = new Texture2D(1, 1);
_whiteTexture.SetPixel(0, 0, Color.white);
_whiteTexture.Apply();
// Use RawImage which renders without needing a sprite
_shimmerImage = _shimmerObject.AddComponent<RawImage>();
_shimmerImage.texture = _whiteTexture;
_shimmerMatInstance = new Material(shader);
_shimmerImage.material = _shimmerMatInstance;
_shimmerImage.color = Color.white;
var rectTransform = _shimmerObject.GetComponent<RectTransform>();
rectTransform.sizeDelta = new Vector2(shimmerSize, shimmerSize);
rectTransform.anchoredPosition = Vector2.zero;
// Set shader properties
if (provinceIdMap != null) {
_shimmerMatInstance.SetTexture("_ProvinceIDMap", provinceIdMap);
}
_shimmerMatInstance.SetFloat("_TargetProvinceId", targetProvinceId);
_shimmerMatInstance.SetVector("_MapBounds", mapBounds);
}
public void SetProvinceId(int provinceId) {
targetProvinceId = provinceId;
if (_shimmerMatInstance != null) {
_shimmerMatInstance.SetFloat("_TargetProvinceId", provinceId);
}
}
public void SetProvinceIdMap(Texture2D idMap) {
provinceIdMap = idMap;
if (_shimmerMatInstance != null) {
_shimmerMatInstance.SetTexture("_ProvinceIDMap", idMap);
}
}
public void SetMapBounds(Vector4 bounds) {
mapBounds = bounds;
if (_shimmerMatInstance != null) {
_shimmerMatInstance.SetVector("_MapBounds", bounds);
}
}
public void SetShimmerSize(float size) {
shimmerSize = size;
if (_shimmerObject != null) {
var rt = _shimmerObject.GetComponent<RectTransform>();
rt.sizeDelta = new Vector2(size, size);
}
}
void Update() {
if (_sunObject != null) {
// Pulse the sun size
@@ -58,5 +143,10 @@ namespace eagle {
rectTransform.anchoredPosition = _baseSunPosition + new Vector2(waveX, waveY);
}
}
void OnDestroy() {
if (_shimmerMatInstance != null) { Destroy(_shimmerMatInstance); }
if (_whiteTexture != null) { Destroy(_whiteTexture); }
}
}
}
@@ -125,21 +125,11 @@ namespace eagle {
public GameObject shardokContainer;
private KeyValuePair<ProvinceId, OneProvinceAvailableCommands>? NextActiveProvinceKeyPair {
get {
if (Model == null || Model.AvailableCommandsByProvince.Count == 0) { return null; }
if (Model.AvailableCommandsByProvince.TryGetValue(
Model.SuggestedProvinceId,
out var suggestedCommands)) {
return new KeyValuePair<ProvinceId, OneProvinceAvailableCommands>(
Model.SuggestedProvinceId,
suggestedCommands);
}
return Model.AvailableCommandsByProvince.First();
}
}
private KeyValuePair<ProvinceId, OneProvinceAvailableCommands>? NextActiveProvinceKeyPair =>
Model == null || Model.AvailableCommandsByProvince.Count == 0
? null
: Model.AvailableCommandsByProvince.First(
kvp => kvp.Key == Model.SuggestedProvinceId);
void Start() {
gameIdButton.GetComponentInChildren<Text>().text = "";
@@ -405,18 +395,11 @@ namespace eagle {
Model.AvailableCommandsByProvince.TryGetValue(pid, out opac)) {
SelectButtonIndex(opac.SuggestedCommandIndex); // probably wrong
} else {
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
}
}
private void ClearActiveCommandUi() {
commitCommandButton.gameObject.SetActive(false);
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.TargetedProvincesAsGroup = false;
commandButtonPanelController.ClearButtonContents();
}
public void SelectNextActiveProvince() {
mapController.SelectedProvinceId = NextActiveProvinceKeyPair?.Key;
}
@@ -605,18 +588,11 @@ namespace eagle {
chronicleCanvasController.Entries = _newModel.ChronicleEntries;
}
var hasExistingCommands = Model != null && Model.AvailableCommandsByProvince.Any();
var hasIncomingCommands =
_newModel != null && _newModel.AvailableCommandsByProvince.Any();
var commandTokenChanged = Model != null && _newModel != null &&
Model.CommandToken != _newModel.CommandToken;
// If we already had commands, and we still have the same command token, don't
// actually swap the model. But always update battle effects — battles can start
// or end between command updates, and skipping cleanup leaves stale animations on
// the map. Replacement command tokens must flow through so stale selectors are
// cleared and rebound to the new available commands.
if (hasExistingCommands && hasIncomingCommands && !commandTokenChanged) {
// If we already had commands, and we still have commands, don't actually swap the
// model. But always update battle effects — battles can start or end between
// command updates, and skipping cleanup leaves stale animations on the map.
if (Model != null && _newModel != null && _newModel.AvailableCommandsByProvince.Any() &&
Model.AvailableCommandsByProvince.Any()) {
mapController.UpdateBattleEffects(_newModel);
UpdateBattleProgressDisplay(_newModel);
return;
@@ -673,15 +649,15 @@ namespace eagle {
var oldProvinces = oldModel.AvailableCommandsByProvince.Keys.ToHashSet();
var newProvinces = _newModel.AvailableCommandsByProvince.Keys.ToHashSet();
if (!oldProvinces.SetEquals(newProvinces)) {
var oldNotNew = oldProvinces.Except(newProvinces).ToList();
if (oldProvinces != newProvinces) {
var oldNotNew = oldProvinces.Except(newProvinces);
if (oldNotNew.Any()) {
str += $"\nWe used to have commands for provinces {string.Join(", ", oldNotNew)} but now we don't";
str += $"\nWe used to have commands for province {oldNotNew} but now we don't";
}
var newNotOld = newProvinces.Except(oldProvinces).ToList();
var newNotOld = newProvinces.Except(oldProvinces);
if (newNotOld.Any()) {
str += $"\nWe now have commands for provinces {string.Join(", ", newNotOld)} where we didn't before";
str += $"\nWe now have commands for provinces {newNotOld} where we didn't before";
}
}
foreach (var kv in oldModel.AvailableCommandsByProvince) {
@@ -705,8 +681,7 @@ namespace eagle {
}
}
}
Debug.LogWarning(str);
ClearActiveCommandUi();
throw new InvalidOperationException(str);
}
var firstCommand = Model.AvailableCommandsByProvince.First().Value.Commands.First();
@@ -714,42 +689,48 @@ namespace eagle {
case AvailableCommand.SealedValueOneofCase.ResolveTruceOfferCommand:
resolveTruceCommandSelector.Model = Model;
resolveTruceCommandSelector.AvailableCommand = firstCommand;
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.SelectedProvinceId = null;
break;
case AvailableCommand.SealedValueOneofCase.ResolveAllianceOfferCommand:
resolveAllianceCommandSelector.Model = Model;
resolveAllianceCommandSelector.AvailableCommand = firstCommand;
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.SelectedProvinceId = null;
break;
case AvailableCommand.SealedValueOneofCase.ResolveBreakAllianceCommand:
resolveBreakAllianceCommandSelector.Model = Model;
resolveBreakAllianceCommandSelector.AvailableCommand = firstCommand;
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.SelectedProvinceId = null;
break;
case AvailableCommand.SealedValueOneofCase.ResolveInvitationCommand:
resolveInvitationCommandSelector.Model = Model;
resolveInvitationCommandSelector.AvailableCommand = firstCommand;
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.SelectedProvinceId = null;
break;
case AvailableCommand.SealedValueOneofCase.ResolveRansomOfferCommand:
resolveRansomOfferCommandSelector.Model = Model;
resolveRansomOfferCommandSelector.AvailableCommand = firstCommand;
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.SelectedProvinceId = null;
break;
case AvailableCommand.SealedValueOneofCase.PleaseRecruitMeCommand:
pleaseRecruitMeCommandSelector.Model = Model;
pleaseRecruitMeCommandSelector.AvailableCommand = firstCommand;
ClearActiveCommandUi();
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
mapController.SelectedProvinceId = null;
break;
@@ -824,7 +805,10 @@ namespace eagle {
PostCommittedCommand(
provinceId: mapController.SelectedProvinceId.GetValueOrDefault(),
_commandPanelController.SelectedCommand);
ClearActiveCommandUi();
commitCommandButton.gameObject.SetActive(false);
_commandPanelController.SetAvailableCommandAndSelector(null, null);
mapController.TargetedProvinces = new List<ProvinceId>();
commandButtonPanelController.ClearButtonContents();
freeHeroesTableController.UpdateTables();
movingArmiesTableControllerNarrow.UpdateTables();
movingArmiesTableControllerWide.UpdateTables();
@@ -54,3 +54,8 @@ MonoBehaviour:
sunColor: {r: 1, g: 0.9019608, b: 0.29803923, a: 0.68235296}
sunPulseSpeed: 1.5
sunPulseAmount: 0.1
shimmerMaterial: {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
shimmerSize: 15
provinceIdMap: {fileID: 0}
targetProvinceId: 0
mapBounds: {x: 0, y: 0, z: 0, w: 0}
@@ -54,8 +54,6 @@ MonoBehaviour:
wanderRadius: 25
moveSpeed: 15
animalScale: 15
animatorController: {fileID: 9100000, guid: ffd6a0b984e94d6f8f1ee20465c64c14,
type: 2}
minIdleDuration: 1
maxIdleDuration: 3
actionChance: 0.3
@@ -1,159 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SnakeMapAnims
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 1107000000000000001}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &1102000000000000001
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: idle
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 974b76380f4081b4d8b71e8e71866148, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &1102000000000000002
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: walk
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 3d862a4c2e7ae0040a0c5693a5486366, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &1102000000000000003
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: eat
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: a82e9ab873cf7684f976bfbbab5ea248, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &1102000000000000004
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: attack
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: ece558e9746786a4da7e6f14c27ae3e8, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &1107000000000000001
AnimatorStateMachine:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 1102000000000000001}
m_Position: {x: 300, y: 100, z: 0}
- serializedVersion: 1
m_State: {fileID: 1102000000000000002}
m_Position: {x: 300, y: 200, z: 0}
- serializedVersion: 1
m_State: {fileID: 1102000000000000003}
m_Position: {x: 300, y: 300, z: 0}
- serializedVersion: 1
m_State: {fileID: 1102000000000000004}
m_Position: {x: 300, y: 400, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 1102000000000000001}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ffd6a0b984e94d6f8f1ee20465c64c14
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:
@@ -56,7 +56,7 @@ namespace eagle {
}
private static string ReportKey(TMP_FontAsset fontAsset, uint unicode) {
return $"{fontAsset.GetEntityId()}:{unicode:X}";
return $"{fontAsset.GetInstanceID()}:{unicode:X}";
}
private static string DescribeUnicode(uint unicode) {
@@ -65,7 +65,6 @@ namespace eagle {
foreach (var renderer in instance.GetComponentsInChildren<Renderer>()) {
renderer.sortingLayerName = BeastSortingLayerName;
renderer.sortingOrder = BeastCreatureSortingOrder;
BeastMaterialCompatibility.ConfigureRenderer(renderer);
}
if (clipToViewport) { RendererViewportClipper.Attach(instance); }
@@ -28,62 +28,33 @@ namespace eagle {
if (newIndex is {} index) {
var movingArmy = MovingArmies.ElementAt(index);
if (movingArmy.UnitDetails.Any()) {
ShowDetailedPopup(movingArmy);
movingArmyPopupTable.RowCount = movingArmy.UnitDetails.Count;
for (int i = 0; i < movingArmy.UnitDetails.Count; i++) {
var details = movingArmy.UnitDetails[i];
var row = movingArmyPopupTable.ComponentAt<MovingArmyPopupRowController>(i);
row.SetHeroText(Model.Heroes[details.HeroId].NameTextId, "Hero");
var battalion = details.Battalion;
if (battalion != null) {
row.BattalionImage.texture = EagleCommonTextures.Instance.BattalionType(
details.Battalion.Type);
row.BattalionImage.gameObject.SetActive(true);
row.BattalionSize.text = details.Battalion.Size.ToString();
row.BattalionSize.gameObject.SetActive(true);
} else {
row.BattalionImage.gameObject.SetActive(false);
row.BattalionSize.gameObject.SetActive(false);
}
movingArmyPopupPanel.SetActive(true);
}
} else {
ShowSummaryPopup(movingArmy);
movingArmyPopupPanel.SetActive(false);
}
} else {
movingArmyPopupPanel.SetActive(false);
}
}
private void ShowDetailedPopup(IncomingArmyView movingArmy) {
movingArmyPopupTable.RowCount = movingArmy.UnitDetails.Count;
for (int i = 0; i < movingArmy.UnitDetails.Count; i++) {
var details = movingArmy.UnitDetails[i];
var row = movingArmyPopupTable.ComponentAt<MovingArmyPopupRowController>(i);
row.SetHeroText(Model.Heroes[details.HeroId].NameTextId, "Hero");
var battalion = details.Battalion;
if (battalion != null) {
row.BattalionImage.texture =
EagleCommonTextures.Instance.BattalionType(details.Battalion.Type);
row.BattalionImage.gameObject.SetActive(true);
row.BattalionSize.text = details.Battalion.Size.ToString();
row.BattalionSize.gameObject.SetActive(true);
} else {
row.BattalionImage.gameObject.SetActive(false);
row.BattalionSize.gameObject.SetActive(false);
}
}
movingArmyPopupPanel.SetActive(true);
}
private void ShowSummaryPopup(IncomingArmyView movingArmy) {
movingArmyPopupTable.RowCount = 1;
var row = movingArmyPopupTable.ComponentAt<MovingArmyPopupRowController>(0);
row.SetSummaryText(MovingArmySummaryText(movingArmy));
row.BattalionImage.gameObject.SetActive(false);
row.BattalionSize.gameObject.SetActive(false);
movingArmyPopupPanel.SetActive(true);
}
private static string MovingArmySummaryText(IncomingArmyView movingArmy) {
if (movingArmy.HeroCount == 0 && movingArmy.TroopCount == 0) {
var supplies = new List<string>();
if (movingArmy.Food != 0) supplies.Add($"{movingArmy.Food} food");
if (movingArmy.Gold != 0) supplies.Add($"{movingArmy.Gold} gold");
return supplies.Any() ? string.Join(", ", supplies) : "Supplies";
}
return $"{movingArmy.HeroCount} {Pluralize("hero", movingArmy.HeroCount)}, " +
$"{movingArmy.TroopCount} {Pluralize("troop", movingArmy.TroopCount)}";
}
private static string Pluralize(string noun, int count) {
return count == 1 ? noun : $"{noun}s";
}
public void MovingArmyHoverRowChanged(int? newIndex) {
if (newIndex is {} index) {
var movingArmy = MovingArmies.ElementAt(index);
@@ -173,11 +144,7 @@ namespace eagle {
});
}
void Start() {
panel.SetActive(Model != null);
PopupClipper.Ensure(movingArmyPopupPanel);
movingArmyPopupPanel.SetActive(false);
}
void Start() { panel.SetActive(Model != null); }
private bool IsHostileFaction(FactionId fid) {
if (Model.PlayerId is FactionId myFid) {
@@ -204,4 +171,4 @@ namespace eagle {
a.DestinationProvinceId != CurrentProvince.Id)
.ThenByDescending(a => a.HeroCount);
}
}
}
@@ -774,8 +774,6 @@ namespace eagle {
lock (this) {
_subscribers[subscriber.GameId] = subscriber;
toStream = subscriber;
LogFlow($"SUBSCRIBER_ADD game={subscriber.GameId} " +
$"type={subscriber.GetType().Name} total={_subscribers.Count}");
}
// Set up callback so subscriber can check for pending commands.
@@ -804,21 +802,7 @@ namespace eagle {
}
public void Unsubscribe(IClientConnectionSubscriber subscriber) {
lock (this) {
if (_subscribers.TryGetValue(subscriber.GameId, out var currentSubscriber) &&
ReferenceEquals(currentSubscriber, subscriber)) {
_subscribers.Remove(subscriber.GameId);
LogFlow($"SUBSCRIBER_REMOVE game={subscriber.GameId} " +
$"type={subscriber.GetType().Name} total={_subscribers.Count}");
} else if (currentSubscriber != null) {
LogFlow($"SUBSCRIBER_REMOVE_SKIPPED game={subscriber.GameId} " +
$"type={subscriber.GetType().Name} " +
$"currentType={currentSubscriber.GetType().Name} total={_subscribers.Count}");
} else {
LogFlow($"SUBSCRIBER_REMOVE_MISSING game={subscriber.GameId} " +
$"type={subscriber.GetType().Name} total={_subscribers.Count}");
}
}
lock (this) { _subscribers.Remove(subscriber.GameId); }
}
private async Task PostRequest(PostCommandRequest request) {

Some files were not shown because too many files have changed in this diff Show More