Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
9a94418
first pass at water
Aug 1, 2026
8f38aeb
water updates
Aug 1, 2026
92fef2a
update for modkit update
Aug 1, 2026
98f7419
fix water for android glsl shaders
Aug 1, 2026
22b58e2
fix android water shading
Aug 1, 2026
980383b
update battle water
Aug 1, 2026
eb231d2
Merge pull request #46 from DramaticShape/water-reflections
Aug 1, 2026
462b0fc
Add bring-your-own battle art pipeline
absol89 Aug 1, 2026
a349a31
Document exceptional battle art filenames
absol89 Aug 1, 2026
93ab245
Add static trainer battle art contracts
absol89 Aug 1, 2026
a140980
seal transparent back sprites
Aug 1, 2026
cdafcf7
Port native-resolution animated atlas decoder
absol89 Aug 1, 2026
5f4db7a
Add optional Crystal animated fronts
absol89 Aug 1, 2026
23bedfa
Organize animated art by generation
absol89 Aug 1, 2026
b546df7
Split animated front and back generation settings
absol89 Aug 1, 2026
6887f5d
updates to oak's lab
Aug 1, 2026
752653e
update oak's pc
Aug 1, 2026
47363b8
iterate version
Aug 1, 2026
c82598b
Merge pull request #51 from DramaticShape/back-sprite-transparency-fix
Aug 1, 2026
91cc2d6
bills, pewter gym, register, celadon mansion, tables, garbage cans
Aug 2, 2026
a7c9541
pokecenter machines, water occlusion
Aug 2, 2026
1a283d6
bump version
Aug 2, 2026
e6d4059
fix water again on android
Aug 2, 2026
9ef8644
add first person mode
Aug 2, 2026
3f7210b
mobile spin fix
Aug 2, 2026
b0d37cd
Merge pull request #56 from DramaticShape/back-sprite-transparency-fix
Aug 2, 2026
238cf60
Add Battle Art modes and staged battle rendering
absol89 Aug 2, 2026
67d25a4
Add Yellow SGB static back-sprite importer
absol89 Aug 2, 2026
899a687
Add Emerald animated and static back art
absol89 Aug 2, 2026
eaec79f
Add Crystal static back art importer
absol89 Aug 2, 2026
7a110b0
Clarify static trainer art filenames
absol89 Aug 2, 2026
0cfec97
Add Platinum static back art importer
absol89 Aug 2, 2026
3d07c39
Add Black White static back art importer
absol89 Aug 2, 2026
19e2a20
Remove purchase-specific art extraction tool
absol89 Aug 2, 2026
326dd65
Fix staged battle entry dimmer
absol89 Aug 2, 2026
4f01f89
Improve Emerald back sprite animation timing
absol89 Aug 2, 2026
c5a62b7
Preserve Emerald back sprite movement
absol89 Aug 2, 2026
64f2c8b
Render player battle HUD at compact integer scale
absol89 Aug 2, 2026
a65b76a
Anchor supplied OG UI back sprites by alpha bounds
absol89 Aug 2, 2026
2c8836c
Document Battle Art generation folders
absol89 Aug 2, 2026
d64309b
Fix PokemonDB source links
absol89 Aug 2, 2026
fd363d2
Document Gen 1 animated-mode front compatibility
absol89 Aug 2, 2026
bdf263a
Add Gen 1 animated-mode front collection
absol89 Aug 2, 2026
1d960f7
Add static animated-mode player portrait and compact enemy HUD
absol89 Aug 2, 2026
89340e3
Fix custom player scale and HUD spacing on OG UI
absol89 Aug 2, 2026
4cb4f8c
Keep OG UI back sprites inside canvas bounds
absol89 Aug 2, 2026
80c0727
Add clean bring-your-own-art package builder
absol89 Aug 2, 2026
68c7889
Include public tools in clean package
absol89 Aug 2, 2026
66ba7f0
Merge tag 'v1.5.1' into feature/battle-art
absol89 Aug 2, 2026
ec33147
tests: assert Battle Art options rows by label
absol89 Aug 2, 2026
e64dc5d
fix(ios): pin voxel render target scale
castdrian Aug 1, 2026
6dda3e4
fix(ios): use decal shadows on Metal
castdrian Aug 1, 2026
9c458d3
fix(ios): non-destructive backport of battle HUD fixes from upstream
absol89 Aug 3, 2026
2fd0aff
chore: bump mod version to 1.5.3
absol89 Aug 3, 2026
c5433fc
revert: restore transparent snapHUDs on iOS for battle-art fork
absol89 Aug 3, 2026
19b42a8
chore: bump version to 1.6.0
absol89 Aug 3, 2026
37c16ee
chore: point github to fork, bump version to 1.60
absol89 Aug 3, 2026
279671d
feat(player anim): add RED five-pose player intro strip
absol89 Aug 3, 2026
0c787cf
fix(trainer): set opponent trainer card scale to 1x; bump version to …
absol89 Aug 3, 2026
3cd11a9
feat(free-roam): port camera steering, 1st/3rd-person control from 7b…
absol89 Aug 4, 2026
5a890ad
chore(main): wire CamControl.install for battle-camera steering
absol89 Aug 4, 2026
2d3d319
test(free-roam): add VR-free camera shots (battle + 3rd-person)
absol89 Aug 4, 2026
fbd9b75
chore(release): bump version to 1.65
absol89 Aug 4, 2026
e10c060
fix(boot): guard Horde/HordeGun requires so missing modules don't crash
absol89 Aug 4, 2026
d39ad9c
feat(ui): sprite light UNLIT/SHADED (1.66 backplate C)
absol89 Aug 4, 2026
814a386
feat(ui): arena fill WHITE/OFF (1.66 backplate B)
absol89 Aug 4, 2026
4a44ea9
feat(ui): textbox backplate HALF/OFF (1.66 backplate A)
absol89 Aug 4, 2026
cd96d25
chore(release): bump version to 1.66
absol89 Aug 4, 2026
6bd92bd
fix(ui): invert HUD + textbox ink under ARENA FILL: WHITE
absol89 Aug 4, 2026
d2f69e1
fix(ui): black textbox fill, cover move/mimic menus, decouple arena W…
absol89 Aug 4, 2026
8fb733d
fix(ui): opaque white textbox under ARENA FILL: WHITE
absol89 Aug 4, 2026
81fc64e
fix(ui): force white box palette under ARENA FILL: WHITE
absol89 Aug 4, 2026
1959f77
Revert "fix(ui): force white box palette under ARENA FILL: WHITE"
absol89 Aug 4, 2026
500659c
fix(ui): whiten box fill at draw time under ARENA FILL: WHITE
absol89 Aug 4, 2026
5fbc1f9
fix(ui): UNLIT sprites ignore the hour/cave tint (flat full-bright)
absol89 Aug 4, 2026
628b65a
feat(ui): ARENA FILL: WHITE forces SPRITE LIGHT UNLIT
absol89 Aug 4, 2026
e80a337
fix(ui): UNLIT also strips the night tint from the animated player ba…
absol89 Aug 4, 2026
debc0b2
chore(release): bump version to 1.68
absol89 Aug 4, 2026
1f37ee5
fix(ios): restore the HUD/textarea iOS exception from upstream PR #48
absol89 Aug 6, 2026
132a089
feat(ui): add an XP bar scaled to the player HUD (ported from QoL mod)
absol89 Aug 6, 2026
99e5a54
rename(ui): XP BAR setting key -> BattleArtXpBar
absol89 Aug 6, 2026
da3a175
chore(release): bump version to 1.70
absol89 Aug 6, 2026
c6ba8e8
feat(options): set battle-art defaults to the preferred 3D profile
absol89 Aug 6, 2026
554aa94
fix(init): break ExpBar/OverworldBattle require cycle (stack overflow)
absol89 Aug 6, 2026
5f1462c
fix(init): declare ExpBar local in main.lua (nil global crash)
absol89 Aug 6, 2026
d2bba33
fix(ui): anchor EXP bar to HUD band origin; default ON
absol89 Aug 6, 2026
11526af
fix(battle): light periphery + resume saved camera (no jump)
absol89 Aug 6, 2026
eb5d1fb
chore(release): bump version to 1.71
absol89 Aug 6, 2026
ab7eba0
fix(build): name release zips <id>-<version>.zip from manifest
absol89 Aug 6, 2026
b0f527b
fix(ui): lift EXP bar above arrow; revert misdiagnosed darkness fix
absol89 Aug 6, 2026
2378162
fix(battle): force BATTLE BG to WHITE (WORLD is invalid for the diorama)
absol89 Aug 6, 2026
8dccc08
fix(camera): start 3D battles at the free-roam camera's saved position
absol89 Aug 6, 2026
ec5d221
fix: force BATTLE BG WHITE on every update tick; lift EXP bar 10 rows
absol89 Aug 6, 2026
da92838
fix(regression): restore Voxel.update in the pipeline update tick
absol89 Aug 6, 2026
f85c8ef
revert(ui): remove the EXP bar entirely
absol89 Aug 6, 2026
0fd16b7
feat(ui): add HUD SCALE option (SCALED / 1X) for external XP-bar mods
absol89 Aug 6, 2026
2b43007
fix(ui): force CENTERED uiLayout so the textbox backplate tracks the box
absol89 Aug 6, 2026
4fa84bb
chore(release): bump version to 1.72.0 (three-part semver)
absol89 Aug 6, 2026
e2b9317
fix(ui): HUD SCALE WINDOW mode follows the window scale, not 1px
absol89 Aug 6, 2026
499f5a7
fix(ui): use engine box as the textbox backplate; align player HUD or…
absol89 Aug 6, 2026
4a8c9d5
fix(camera): seed battle cam from last-known freecam offset; keep drift
absol89 Aug 6, 2026
0a4d6c0
fix(ui): TEXTBOX FILL drives the engine box backplate (tracks at all …
absol89 Aug 6, 2026
d34890e
Revert "fix(ui): force CENTERED uiLayout so the textbox backplate tra…
absol89 Aug 6, 2026
606ee16
fix(ui): HALF backplate overridden to white under ARENA FILL WHITE
absol89 Aug 6, 2026
deac6aa
chore(ui): rename HUD SCALE WINDOW -> OG
absol89 Aug 6, 2026
6952585
fix(ui): HALF backplate via the drawTextArea g.rectangle shim
absol89 Aug 6, 2026
7f0dd2b
fix(ui/camera): scope HALF to dialogue box; always seed from saved fr…
absol89 Aug 6, 2026
da81c06
fix(ui): scope HALF flip to the dialogue box only (no white-on-white)
absol89 Aug 6, 2026
a9cfa9c
refactor(ui): drop TEXTBOX FILL; battle box is always opaque white
absol89 Aug 6, 2026
d4a8d36
fix(ui): define `battle = self` in drawTextArea wrapper (nil crash)
absol89 Aug 6, 2026
98d43dc
fix(ios): port PR #119 HUD fix -- opaque-white player/opponent panels
absol89 Aug 6, 2026
6932be8
chore(release): set mod.exports.version to 1.7.2 to match manifest
absol89 Aug 6, 2026
23e97f0
fix(ios): make player/opponent HUDs transparent (PR #119), keep boxes…
absol89 Aug 6, 2026
cbff997
chore(release): bump version to 1.7.3 (iOS transparent HUD fix)
absol89 Aug 6, 2026
7f5f03e
fix(ios): correct HUD vertical-flip to flip in place (was center-mirr…
absol89 Aug 6, 2026
71c800e
fix(ios): revert snapped HUD on iOS; use engine-native in-frame HUD
absol89 Aug 6, 2026
12594a1
feat(1.7.6): ROM-fallback white-fill fix, per-slot SHINY support, gen…
absol89 Aug 6, 2026
537d6f5
Modern UI Compatiblity Patch
ArmstrongThomas Aug 9, 2026
a71c491
Expose battle presentation compatibility hook
ArmstrongThomas Aug 9, 2026
decc7e3
Expose battle presentation compatibility hook
ArmstrongThomas Aug 9, 2026
ee1bd52
Merge branch 'feature/battle-art' of https://github.com/ArmstrongThom…
ArmstrongThomas Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
200 changes: 200 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
name: Release

# Packs the mod into an installable .zip and publishes it as a GitHub Release,
# once per push to main.
#
# Archive layout: every mod file at the archive root, manifest.json included.
# That is one of the two shapes the game accepts on MODS > Import mod .zip
# (src/mods/LauncherMods.lua locateRoot: manifest at the root, or inside a
# single top-level folder). Nothing else is added, so the archive stays
# installable by hand too.
#
# Versioning, first rule that applies wins:
# 1. the "version" input of a manual run,
# 2. "[release X.Y.Z]" anywhere in the commit message,
# 3. manifest.json's own version, when it is ahead of every existing tag,
# so bumping the manifest is the normal way to cut a release,
# 4. otherwise the newest vX.Y.Z tag with its patch incremented
# (0.2.99 rolls over to 0.3.0).
# Whichever wins is written into the manifest.json inside the archive, so a
# shipped mod never reports a different version than the release it came from.
#
# Generated by: python3 tools/modkit.py add-release-workflow <mod-id>
# MOD_ID below is stamped to this mod's id when the file is copied.

on:
push:
branches: [master]
paths-ignore:
- '.github/**'
- '**.md'
workflow_dispatch:
inputs:
version:
description: "Exact version to release (e.g. 0.3.0). Leave blank to auto-resolve."
required: false
default: ""

permissions:
contents: write

concurrency:
group: release
cancel-in-progress: false

jobs:
release:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Determine version
id: ver
env:
DISPATCH_VERSION: ${{ github.event.inputs.version }}
run: |
set -euo pipefail
python3 - <<'PY' >> "$GITHUB_OUTPUT"
import json, os, re, subprocess, sys

SEMVER = re.compile(r"^(\d+)\.(\d+)\.(\d+)$")

def sh(*args):
return subprocess.run(args, capture_output=True, text=True).stdout.strip()

def parse(text):
m = SEMVER.match(text)
return tuple(int(p) for p in m.groups()) if m else None

def die(msg):
print(f"::error::{msg}", file=sys.stderr)
raise SystemExit(1)

with open("manifest.json", encoding="utf-8") as fh:
manifest_version = str(json.load(fh).get("version", ""))

released = sorted(
v for v in (parse(tag[1:]) for tag in sh("git", "tag", "-l", "v*").splitlines()) if v
)
latest = released[-1] if released else None

override = os.environ.get("DISPATCH_VERSION", "").strip()
if not override:
found = re.search(r"\[release\s+(\d+\.\d+\.\d+)\]", sh("git", "log", "-1", "--pretty=%B"))
override = found.group(1) if found else ""

manifest_ver = parse(manifest_version)
if override:
version = parse(override) or die(f"invalid version override {override!r} (expected X.Y.Z)")
source = "the override"
elif manifest_ver and (latest is None or manifest_ver > latest):
version = manifest_ver
source = "manifest.json"
elif latest:
major, minor, patch = latest
patch += 1
if patch > 99:
minor, patch = minor + 1, 0
version = (major, minor, patch)
source = "a patch bump on v%d.%d.%d" % latest
else:
die(f"manifest.json version {manifest_version!r} is not X.Y.Z "
"and there is no vX.Y.Z tag to count from")

text = "%d.%d.%d" % version
print(f"Releasing {text}, from {source}.", file=sys.stderr)
print(f"version={text}")
print(f"tag=v{text}")
PY

- name: Refuse to clobber an existing release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.ver.outputs.tag }}
run: |
set -euo pipefail
if git rev-parse -q --verify "refs/tags/$TAG" >/dev/null; then
echo "::error::Tag $TAG already exists. Pick a different version."
exit 1
fi
if gh release view "$TAG" >/dev/null 2>&1; then
echo "::error::Release $TAG already exists. Pick a different version."
exit 1
fi

- name: Build the mod .zip
env:
VERSION: ${{ steps.ver.outputs.version }}
MOD_ID: "BATTLE_ART_VOXEL_FORK"
run: |
set -euo pipefail
staging="$RUNNER_TEMP/pkg"
out="$GITHUB_WORKSPACE/dist"
rm -rf "$staging" "$out"
mkdir -p "$staging" "$out"

git archive HEAD | tar -x -C "$staging"

rm -rf "$staging/.github" "$staging/.gitattributes" \
"$staging/.gitignore" "$staging/.luarc.json"

python3 - "$staging/manifest.json" "$VERSION" <<'PY'
import json, sys
path, version = sys.argv[1], sys.argv[2]
with open(path, encoding="utf-8") as fh:
manifest = json.load(fh)
manifest["version"] = version
with open(path, "w", encoding="utf-8") as fh:
json.dump(manifest, fh, indent=2, ensure_ascii=False)
fh.write("\n")
PY

zip_path="$out/${MOD_ID}-${VERSION}.zip"
(cd "$staging" && zip -qr "$zip_path" .)
unzip -l "$zip_path"

unzip -p "$zip_path" manifest.json > "$RUNNER_TEMP/packed-manifest.json"
python3 - "$RUNNER_TEMP/packed-manifest.json" "$VERSION" <<'PY'
import json, sys
path, expected = sys.argv[1], sys.argv[2]
with open(path, encoding="utf-8") as fh:
version = json.load(fh)["version"]
if version != expected:
raise SystemExit(f"::error::packed manifest says {version}, expected {expected}")
print(f"manifest.json is at the archive root and reports {version}")
PY

(cd "$out" && sha256sum "${MOD_ID}"-*.zip > sha256sums.txt)
cat "$out/sha256sums.txt"

- name: Publish GitHub Release
env:
GH_TOKEN: ${{ github.token }}
VERSION: ${{ steps.ver.outputs.version }}
TAG: ${{ steps.ver.outputs.tag }}
MOD_ID: "BATTLE_ART_VOXEL_FORK"
run: |
set -euo pipefail

prev="$(git tag -l 'v*' --sort=-v:refname | grep -v "^${TAG}$" | head -1 || true)"
range="${prev:+${prev}..}$GITHUB_SHA"
changes="$(git log --no-merges --pretty='- %s' "$range" | head -50 || true)"

notes=$'Download the .zip and install it from the game: MODS > Import mod .zip.'
if [ -n "$changes" ]; then
notes+=$'\n\n## Changes\n\n'"$changes"
fi
printf 'Release notes:\n%s\n' "$notes"

gh release create "$TAG" \
--target "$GITHUB_SHA" \
--title "$VERSION" \
--notes "$notes" \
"dist/${MOD_ID}-${VERSION}.zip" \
"dist/sha256sums.txt"

echo "Published release $TAG"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,9 @@ __pycache__/

# agent worktrees and local scratch
.claude/

# Bring-your-own battle art. Preserve the documented example directory tree,
# but never commit locally supplied artwork, atlases, drafts, or sidecars.
assets/battle/**
!assets/battle/**/
!assets/battle/**/README.md
2 changes: 1 addition & 1 deletion .modkitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# (CONTRIBUTING-mods.md "What the PR must contain", 2).
tests/arena_pick.lua
tests/battle_shots.lua
tests/dramatic_shape_test.lua
tests/battle_art_voxel_fork_test.lua
tests/voxel_anim_probe.lua
tests/voxel_door_probe.lua
tests/voxel_mem_probe.lua
Expand Down
Loading