Compare commits

..

12 Commits

Author SHA1 Message Date
DramaticShape c4d997cb75 Merge pull request #150 from DramaticShape/dev
1.8.2
2026-08-09 00:12:36 -04:00
DramaticShape 8804bfabaf Merge pull request #147 from DramaticShape/dev
1.8.1
2026-08-08 19:59:27 -04:00
DramaticShape 13117e475b Merge pull request #144 from DramaticShape/dev
1.8.0
2026-08-08 14:35:01 -04:00
DramaticShape 377b0f60ca Merge pull request #141 from DramaticShape/dev
Fix ios Battle Hud compositing
2026-08-07 21:23:09 -04:00
DramaticShape b285201cba Merge pull request #140 from DramaticShape/dev
1.7.1
2026-08-07 21:06:18 -04:00
DramaticShape e14afd8dfa Merge pull request #131 from DramaticShape/dev
1.7.0
2026-08-06 20:43:35 -04:00
DramaticShape 6bcd4d3144 Merge pull request #118 from DramaticShape/dev
1.6.2
2026-08-06 01:17:21 -04:00
DramaticShape 790c34efff Merge pull request #115 from DramaticShape/dev
1.6.1
2026-08-05 19:11:33 -04:00
DramaticShape 43385c8bf6 Merge pull request #99 from DramaticShape/dev
1.6.0
2026-08-04 17:51:30 -04:00
DramaticShape c404c766cd Merge pull request #89 from DramaticShape/dev
1.5.5
2026-08-03 17:54:01 -04:00
DramaticShape 9700806a92 Merge pull request #72 from DramaticShape/dev
1.5.4
2026-08-02 22:44:57 -04:00
DramaticShape 6e9b787e41 Merge pull request #70 from DramaticShape/dev
ios fixes
2026-08-02 21:16:15 -04:00
7 changed files with 43 additions and 111 deletions
@@ -1,6 +1,6 @@
name: Release
# Packs the mod into an installable .zip and publishes it as a Gitea 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.
@@ -24,10 +24,10 @@ name: Release
on:
push:
branches: [master, dev]
branches: [master]
paths-ignore:
- ".gitea/**"
- "**.md"
- '.github/**'
- '**.md'
workflow_dispatch:
inputs:
version:
@@ -113,7 +113,7 @@ jobs:
- name: Refuse to clobber an existing release
env:
GITEA_TOKEN: ${{ github.token }}
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.ver.outputs.tag }}
run: |
set -euo pipefail
@@ -121,13 +121,7 @@ jobs:
echo "::error::Tag $TAG already exists. Pick a different version."
exit 1
fi
# Replaced `gh release view` with a direct HTTP check to the Gitea API
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: token $GITEA_TOKEN" \
"$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/$TAG")
if [ "$HTTP_STATUS" -eq 200 ]; then
if gh release view "$TAG" >/dev/null 2>&1; then
echo "::error::Release $TAG already exists. Pick a different version."
exit 1
fi
@@ -170,16 +164,16 @@ jobs:
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}")
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 Gitea Release
- name: Publish GitHub Release
env:
GITEA_TOKEN: ${{ github.token }}
GH_TOKEN: ${{ github.token }}
VERSION: ${{ steps.ver.outputs.version }}
TAG: ${{ steps.ver.outputs.tag }}
MOD_ID: "DRAMATIC_SHAPE"
@@ -196,34 +190,11 @@ jobs:
fi
printf 'Release notes:\n%s\n' "$notes"
# Create the release via Gitea's REST API
RESPONSE=$(curl -s -X POST "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg tag "$TAG" \
--arg target "$GITHUB_SHA" \
--arg name "$VERSION" \
--arg body "$notes" \
'{tag_name: $tag, target_commitish: $target, name: $name, body: $body}')"
)
# Extract the numeric release ID needed to upload assets
RELEASE_ID=$(echo "$RESPONSE" | jq -r '.id')
if [ "$RELEASE_ID" = "null" ] || [ -z "$RELEASE_ID" ]; then
echo "::error::Failed to create release. Gitea responded with: $RESPONSE"
exit 1
fi
# Upload the Mod .zip asset to the newly created release
curl -s -f -X POST "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets" \
-H "Authorization: token $GITEA_TOKEN" \
-F "attachment=@dist/${MOD_ID}-${VERSION}.zip"
# Upload the sha256sums.txt file
curl -s -f -X POST "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets" \
-H "Authorization: token $GITEA_TOKEN" \
-F "attachment=@dist/sha256sums.txt"
gh release create "$TAG" \
--target "$GITHUB_SHA" \
--title "$VERSION" \
--notes "$notes" \
"dist/${MOD_ID}-${VERSION}.zip" \
"dist/sha256sums.txt"
echo "Published release $TAG"
+19 -45
View File
@@ -1,33 +1,6 @@
# Changelog
## 1.8.3
### Merged PRs
- Merged [feat(VoxelGrid): add BTL-OFF rung to V-GRID setting](https://github.com/TeJota1337/DramaticShapeVoxelMod/pull/1)
```md
V-GRID now cycles OFF / ON / BTL-OFF.
ON preserves the original behaviour: the wireframe is forced on during
battles regardless of what the row is set to, because the seams are what
make the arena read as constructed rather than photographed.
BTL-OFF is an opt-out for players who prefer a cleaner battle scene:
the wireframe stays available in the overworld but is not forced during
battles. The override mechanism is unchanged -- the player's stored
setting is never written to during a fight.
Changes:
lib/VoxelGrid.lua: third rung added to the ladder; enabled()
handles "btloff" explicitly; battleForced() added; sync()
no longer coerces to boolean.
lib/BattleScene.lua: override is only set when battleForced()
returns true.
main.lua: help text updated.
README.md: controls table updated.
```
## Unreleased
### Added
@@ -650,10 +623,10 @@
STADIUM A / STADIUM B / OFF**, which is two independent choices laid out
as one ladder -- WHAT is standing there, and WHERE:
| | on the MAP | on two DISCS |
| ---------- | ---------- | ------------ |
| **pics** | 2D-3D A | 2D-3D B |
| **models** | STADIUM A | STADIUM B |
| | on the MAP | on two DISCS |
| ---------- | ----------- | ------------ |
| **pics** | 2D-3D A | 2D-3D B |
| **models** | STADIUM A | STADIUM B |
2D-3D A is what ON always was -- the fight staged on the map with the Game
Boy's own pics stood up on their tiles as quads. The STADIUM rungs keep
@@ -837,13 +810,13 @@
What it found, and what happened to each:
| finding | count | outcome |
| -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| pack cache evicted a model still on the field | 2 | **fixed** -- see above |
| animation walks the Pokemon off its tile | 65 entrances, 36 hits, 35 faints | **fixed** -- see above |
| part has no texture | 104,728 | **not a defect.** 39 primitives across 37 species, 1.6% of the set's vertices, every one with all-zero UVs: they are flat-shaded geometry in the original. The pack stores texture indices one-based, so the packer's `0xFFFF` "untextured" sentinel arrives as 65,536 and resolves to nothing, which is correct. Counted rather than reported now |
| pose flies apart | 250 | **understood, left alone.** Two species in one animation each: Farfetch'd's entrance at 6.0x its bind height and Dewgong's at 6.1x, both just over the threshold, and both because the measurement is a bounding box that includes an authored trail -- Farfetch'd's is a dedicated 30-vertex primitive on a five-bone chain. The bodies are intact and, since the anchor, in frame |
| NaN or infinite vertex, rig would not build, loopStart out of range, missing aux animation, track indexed off its end, move slot with no animation | 0 | none |
| finding | count | outcome |
| --- | --- | --- |
| pack cache evicted a model still on the field | 2 | **fixed** -- see above |
| animation walks the Pokemon off its tile | 65 entrances, 36 hits, 35 faints | **fixed** -- see above |
| part has no texture | 104,728 | **not a defect.** 39 primitives across 37 species, 1.6% of the set's vertices, every one with all-zero UVs: they are flat-shaded geometry in the original. The pack stores texture indices one-based, so the packer's `0xFFFF` "untextured" sentinel arrives as 65,536 and resolves to nothing, which is correct. Counted rather than reported now |
| pose flies apart | 250 | **understood, left alone.** Two species in one animation each: Farfetch'd's entrance at 6.0x its bind height and Dewgong's at 6.1x, both just over the threshold, and both because the measurement is a bounding box that includes an authored trail -- Farfetch'd's is a dedicated 30-vertex primitive on a five-bone chain. The bodies are intact and, since the anchor, in frame |
| NaN or infinite vertex, rig would not build, loopStart out of range, missing aux animation, track indexed off its end, move slot with no animation | 0 | none |
The three species the packer already declines (Exeggutor, Tangela, Magmar)
are skipped rather than swept: they are never posed in a game, and sweeping
@@ -2026,6 +1999,7 @@
and only the player knows what their machine can carry. No hotkey, for the
same reason: it is set once, not flicked while walking.
### Changed
- **The water surface is its own mesh, and its own pass.** A mirror cannot be
@@ -3427,12 +3401,12 @@ long as the thing throwing them is tall.
- The mod's four controls sit on adjacent keys, and the two that never had
one now have a hotkey at all:
| key | control |
| --- | ------------------------- |
| 3 | VOXEL, the camera ladder |
| 5 | V-GRID, the wireframe |
| 6 | T-SHIFT, the blur ladder |
| 7 | V-CURVE, the horizon bend |
| key | control |
| --- | --- |
| 3 | VOXEL, the camera ladder |
| 5 | V-GRID, the wireframe |
| 6 | T-SHIFT, the blur ladder |
| 7 | V-CURVE, the horizon bend |
Only 6 arrives by the documented route. `Game:keypressed` answers the
engine's own display keys first and returns -- 2 COLORS, 3 TILT, 4 ZOOM,
+1 -1
View File
@@ -15,7 +15,7 @@ menu.
| --- | --- |
| `3`, or the **VOXEL** options row | OFF → 15 → 35 → 50 → 75 → 1ST → 3RD → OFF (camera pitch) |
| `SELECT` (pad / touch) | the same step as `3` — for the machines with no number row |
| `5`, or the **V-GRID** options row | OFF / ON / BTL-OFF — a one-pixel wireframe on every voxel; BTL-OFF disables it during battles |
| `5`, or the **V-GRID** options row | OFF / ON — a one-pixel wireframe on every voxel |
| `6`, or the **T-SHIFT** options row | OFF → 1 → 2 → 3 → OFF (miniature blur) |
| `7`, or the **V-CURVE** options row | OFF → 1 → 2 → 3 → 4 → 5 — bend the world over the horizon; 5 is a half sphere |
| the **RENDER DIST** options row | FIT / WIDE / WIDER / WIDEST / OFF — how much of the map the camera bothers to draw. **FIT** is exactly the ground on screen and no more: the trapezoid a tilted camera really frames, which reaches well north of you and flares wide out there — not the square the flat game shows. A connected map falling entirely outside it is skipped before it is drawn, terrain, water, grass and shadows together, which is most of the frame's geometry at the high rungs. Below about 63° that is all the row does and the picture is untouched; at **75** the camera sees to the horizon, so something has to name a distance — FIT is the closest, the wider rungs push the world's edge out, **OFF** stops cutting. Not on **1ST** or **3RD**: you are standing in the world there, and the box opens out and away as the camera dives in. **FULL** sets it to FIT |
-4
View File
@@ -643,10 +643,6 @@ function BattleScene.render(state, arena, textures, token)
-- the world (see VoxelGrid): the arena is drawn a unit per voxel like
-- everything else, so the seams follow the one toggle and a player who
-- turned them off does not get them back for the length of a fight.
local gridWas = VoxelGrid.override
if VoxelGrid.battleForced() then
VoxelGrid.override = true
end
local out = nil
local ok, err = pcall(function()
-- its own canvas slot: this renders at the window's pixel size and the
+3 -10
View File
@@ -59,7 +59,7 @@ end
-- where it persists and the rows that cycle it (see ModSetting)
VoxelGrid.setting = ModSetting.new(VoxelGrid.KEY, VoxelGrid.LABEL,
{ false, true, "btloff" }, { "OFF", "ON", "BTL-OFF" })
{ false, true }, { "OFF", "ON" })
-- The row is the whole answer, everywhere: free-roam and the battle arena
-- alike. The battle used to force the seams on regardless -- a fight is a
@@ -68,14 +68,7 @@ VoxelGrid.setting = ModSetting.new(VoxelGrid.KEY, VoxelGrid.LABEL,
-- whole mod, and a mode that came back for every fight read as the row not
-- working rather than as a deliberate framing.
function VoxelGrid.enabled()
if VoxelGrid.override ~= nil then return VoxelGrid.override end
local v = VoxelGrid.setting:get()
if v == "btloff" then return false end
return v and true or false
end
function VoxelGrid.battleForced()
return VoxelGrid.setting:get() ~= "btloff"
return VoxelGrid.setting:get() and true or false
end
function VoxelGrid.set(enabled, game)
@@ -87,7 +80,7 @@ function VoxelGrid.toggle(game)
end
function VoxelGrid.sync(value)
VoxelGrid.setting:sync(value)
VoxelGrid.setting:sync(value and true or false)
end
function VoxelGrid.row()
+2 -2
View File
@@ -474,7 +474,7 @@ end
-- its own: 3D WORLD is exactly the rows WITHOUT it, so that whole
-- category empties out under FULL and takes itself off the menu.
local SETTINGS = {
-- ------- the top-level menu -- settings that are about the GAME
-- ------- the top-level menu -- settings that are about the GAME
--
-- SettingsMenu.ROOT as a `cat` puts a row on the DRAMATIC SHAPE screen
-- itself rather than inside one of the four categories, which is right
@@ -490,7 +490,7 @@ local SETTINGS = {
cat = SettingsMenu.ROOT, full = true },
-- ------- 3D WORLD -- the diorama's own knobs, every one of them FULL's
{ VoxelGrid.setting, "One-pixel wireframe along every voxel edge. BTL-OFF disables it during battles.",
{ VoxelGrid.setting, "One-pixel wireframe along every voxel edge.",
cat = "world" },
{ WorldCurve.setting,
"Bends the world down over the horizon, until a town sits on top of its "
+3 -5
View File
@@ -1,7 +1,7 @@
{
"id": "DRAMATIC_SHAPE",
"name": "Dramatic Shape Voxel Mod",
"version": "1.8.3",
"version": "1.8.2",
"api": 2,
"entry": "main.lua",
"profile": "content",
@@ -10,13 +10,11 @@
"priority": 100,
"dependencies": [],
"optional_dependencies": [],
"conflicts": [
"ds_fp_ceiling"
],
"conflicts": ["ds_fp_ceiling"],
"permissions": [
"engine_internals"
],
"affects_link": false,
"description": "Draws the overworld as a 3D diorama.",
"github": "DramaticShape/DramaticShapeVoxelMod"
}
}