Skip to content

v0.5.25-dev

Choose a tag to compare

@joewcarson joewcarson released this 03 Aug 20:17

Playtest build v0.5.25-dev.

A playtest-report pass. Almost every fix here is the same shape: a system
that worked correctly while the thing telling you about it did not.

A new battlefield: Sunscar Mesa

Traced from Final Fantasy Tactics' Zeklaus Desert (map #76) at its exact
10x18 footprint — the tallest board in the catalog, and the first traced
map without a compact sibling. Same provenance rules as the Highspire and
Gatestone pairs: the footprint is exact, the layout is traced from the
top-down and four isometric renders, and the per-tile heights are interpreted
from those renders rather than extracted. Not mirrored, for the same reason.

It's deliberately a third shape of height problem. Highspire is a town —
many short climbs, height as texture. Gatestone is an assault — one gated
climb. This is erosion: a single mesa stepping 0 to 5 in sandstone strata,
ringed by flats and cut clean through the middle by a wash at height 0 that
runs the full width of the board.

The wash is the whole idea, and it inverts the usual trade. It's the fastest
line across the map and the most exposed, because everything on both sides
looks down into it — and since it's sand it also costs double to walk. High
ground here is both safer and quicker. Getting out needs the ramps at
either end; the middle drops two steps at once, so a jumper leaves wherever it
likes and everyone else walks to a ramp.

It needed no new terrain vocabulary — sandstone is stone, so the existing
height ladder carries the strata and sand carries the floor. Supports 4v4,
5v5 and 8v8, making it only the third 8v8 battlefield we have. Sunscar
Wash
(8x12, 2v2/3v3) is its compact sibling, keeping the mesa, the wash and
the long-axis approach at skirmish scale.

A second new battlefield: Gravewater Crypt

Traced from the Underground Cemetery of Limberry Castle (map #17) at 6 × 14
— by far the narrowest board in the catalog, and the first traced map that
isn't about climbing at all.

Highspire is a town of short climbs, Gatestone one gated ascent, Sunscar an
eroded massif. This is confinement. Six tiles wide, and two rows of flooded
graves pinch the middle down to a two-tile aisle. There is almost nowhere
to flank and nowhere to spread out, so the map keeps asking one question: hold
the aisle, or wade the graves at triple movement cost and spend your turn in
the open.

Height stays low — 0 to 3 — deliberately. A crypt is not a mountain, and the
pressure here comes from width instead. It exists to test what the height maps
can't ask: whether line-holding and area attacks are oppressive when nobody
can go around.

It's also the first traced map mirrored on both axes. The others are
asymmetric because real towns and forts are, but on a board this narrow an
asymmetry isn't character — it's a handicap, with no room to make up for a
worse side. That makes it the first of these fit for a ranked pool.

One caveat worth stating: the six-column width is read off the source map's
own axis labels, but the row count came from the image proportions rather than
legible labels. Fourteen is a measurement of a picture, not of the map.

Armies now face each other, whichever way they deploy

The Sunscar boards put the two sides on the north and south rims, marching
the length of the map at each other, rather than nine tiles apart across the
short axis with the board's whole length unused.

That surfaced a real bug. Both unit factories hardcoded Blue faces East, Red
faces West
— correct only because every battlefield until now deployed along
the west and east columns. On a long-axis map both armies would have opened
the match showing each other their flank, and facing is not cosmetic: it
multiplies physical damage and scales evade.

Spawn facing is derived from the enemy's centre of mass now. It returns
exactly what the constant did on every pre-existing map — that's the point, a
no-op wherever it was already right and correct where it wasn't. Both
factories were changed together, offline and the authoritative online one,
because a fix applied to only one of them is the online/offline split this
project keeps paying for.

Dressed with a new desert theme, kept separate from the wasteland one (a
scorched caldera, tinted hot). Here the contrast is sand floor against rock
shelf rather than colour temperature, which matters because that's exactly the
distinction the map plays on. No cactus — neither of our asset packs has one.

Conviction decides it

Faith and Brave have scaled damage since the first commit, but gated exactly
three abilities — everything else in the blessing, affliction and talk catalogs
simply landed. An enemy's conviction had no say in whether they were slept,
charmed, stopped, blinded or struck undead. 49 abilities now roll for it.

It is the geometric mean of the two Faiths plus half the caster's MA, capped at
95 — nothing gated on belief is ever certain. Geometric rather than arithmetic
because Faith 0 and 100 are things the game can do to a unit (atheist and
faith pin them there at the cost of a whole ability), and an average lets a
Faith-90 caster still land on an Atheist'd target more than half the time,
refunding the turn that bought the immunity. MA is halved on a measurement, not
taste: gear is not optional, so the live range is 5–29 rather than the job
table's 5–18, and at full weight a geared caster hit the ceiling against a
devout target — the gate would have been inert for exactly the classes whose
kit it governs.

Item charges

The Apothecary's whole kit and the Ninja's thrown stock cost zero MP because
they are items — which left them costing nothing at all. Three each per
battle.
Counted against the same tally the results board has kept since
v0.5.19, so charges inherit the whiff rule for free: a potion thrown at open
ground was never thrown, and a shuriken that misses is gone.

Durations that were only ever decoration

status_duration was threaded through five of the twenty-five status-applying
arms. The other twenty passed None — so a duration authored on Guard or
Protect compiled, registered, exported, rendered on a codex page and did
nothing
. All twenty honour it now. Found by putting the registry in front of
Joe as a spreadsheet and watching which column he typed in.

Spells stopped caring where you stand

Facing has never multiplied magic damage, and v0.5.18 stopped the battle log
claiming it did — but the accuracy half survived. magic_hit_chance went on
shaving the target's evade by which way they faced, so flanking a caster made
every spell in the game measurably easier to land: 88% head-on against a ninja,
100% from behind. A spell is aimed at a tile, not thrown at somebody's back.

Facing keeps its full weight on the physical side, where it multiplies damage
and strips evade, and Backstab still reads it once more on top.

Found beside it: the damage breakdown pushed the height term for magic too,
so a mage casting down a slope read "height ×1.25" in the log and the hover box
for a bonus the spell cannot collect. Same lie, same list, one line apart. It
hid because neutral terms are filtered out, so it only ever appeared on maps
built to have slopes.

Odin rides in as a skeleton warrior

odin joins lich as a real model rather than a painted plate. What a summon
does and what it holds now live in a table keyed by summon id, deliberately
not derived: nothing on an ability row distinguishes a swordsman from a caster
— both rows read MagicDamage, Dark, rare — so Odin cleaves and the Lich casts
because of what they are. Verified before the animation was written: both
KayKit skeletons ship weaponless, so a warrior given a two-handed chop and no
sword swings its bare fists.

Six eidolons arrive as themselves

Summon art has been a built-and-empty seam since v0.5.22 — every one of the
sixteen summons turned up as the same generic bloom, so Ifrit and Carbuncle
were the same apparition in different colours. Ifrit, Shiva, Bahamut,
Leviathan, Odin and Carbuncle
now have painted plates, in the house style of
the job portraits. The other ten still take the bloom, which is the table
working as designed rather than a job half finished: a missing entry costs one
illustration, never the spell.

Each plate flares mid-attack, not at rest — a creature posing is a creature
that turned up and did nothing. The attack is body language only: no breath
weapon, no beam, no glow off the hands, because the engine already draws the
magic and tints it by the ability's element. A plate drawing its own would
double it up and fix in paint a colour the palette is entitled to change.

The damage forecast was swinging an empty hand

Hovering a target quoted a swing thrown with no weapon at all — no weapon
power, no class stat, no Brave sharpening. It misleads worst where it matters
most, because a weapon class chooses which stat the swing reads: a summoner
with PA 4 holding a staff swings on its MA of 26, and the forecast said 4. In
one playtest a Rending Reel previewed at about 21, landed for 159, and
killed its caster's own Chronomancer through the gap.

The number on the hover is now the number the hit deals. The forecast also
never applied a target's innate elemental weakness, which the resolver has
always applied on the very next line.

Petrify is as good as dead until somebody breaks it

It used to be a two-turn stun wearing a dramatic name — a unit petrified on
turn 17 was swinging again on turn 21. Now it takes the unit out of the fight
entirely: no turns, and it doesn't count toward its team still standing, so
petrifying the last enemy wins. It also doesn't wear off. The way back is a
Cleanse — Esuna, Remedy, any of them — which is what makes the harshest status
in the game fair.

A charge costs the turns it takes

Committing a charge used to cost nothing but the action slot: the caster kept
taking full turns while the spell wound up, which made charging strictly better
than casting instantly — same effect, bigger numbers, and you still got to
play. A charging unit is now simply out of the turn order until its cast lands,
exactly as an airborne dragoon already was.

And a dragoon comes down where it went up. Jump spends the action slot and
left the move slot open, so a samurai could leap, stroll three tiles, and
"crash down" wherever it had walked to. You can't walk in mid-air any more.

Aiming at open ground is your mistake

A whiff no longer refunds its MP. The refund was written for a starvation bug
whose real defect was the silence around it, and that was fixed two releases
ago — what remained was the game paying for misclicks. Whiffs now announce
themselves with a popup and a battle-log line, on instant and charged casts
alike. Pointing at something an ability genuinely can't affect is still a
refusal, and still costs nothing.

The AI stops blowing up its own team

One guard was wrong in both directions. It only ever asked whether the caster
was standing too close, so allies were never considered — a Geomancer dropped a
Sinkhole two squares away, killed its own thief, wounded its own Orator and hit
itself for 51, for zero damage to the other side. That one cast decided the
match. The same guard also vetoed any enemy standing near the caster, and the
AI only ever weighed two targets to begin with, so casters routinely found
nothing to do and shuffled a tile instead of casting.

Bots now read the true blast footprint — the same one the resolver uses — and
weigh every enemy they can see.

Better gear, more often

Ultimate gear now drops at 5% instead of 1%, and rare at 10%, taken out of
common. A one-in-a-hundred ultimate meant whole evenings without ever seeing
the top of the ladder; gear is rolled fresh every battle and never owned, so a
generous top end costs no permanent power — only a better story.

A living unit lying on the ground

The client took a hit's full damage off HP, including the part a barrier had
already eaten. A Bard on 63 behind a 25-point barrier took a 70-damage hit,
dropped to zero client-side, played its death animation and hung a skull over
its head — while the engine correctly had it alive on 18. The next sync
restored the HP, so it went on taking turns while lying on the floor.

The battle log now reads "hits Bard for 70 (25 absorbed, 45 to HP)", the client
no longer decides who is dead, and a unit that is alive is stood back up
whatever else goes wrong.

The results board

Now takes three quarters of the screen instead of a fixed panel a third of its
height, with each army on its own full-width row. A 3v3 with every unit's kit,
gear and ability breakdown no longer scrolls at all.

Hover tooltips on that board were also silently broken: an apostrophe anywhere
in an item or ability description — "restore an ally's HP", "a bard's relic" —
broke the tag it lived in, printing raw markup across the row and, worse,
swallowing whole skills off the line so a unit's kit simply looked shorter than
it was. Around two dozen descriptions carry one.

The live scoreboard (Tab) gained the HEAL column the results board has had
since v0.5.15.

Install: download the zip, extract the whole folder, run shattered-crowns-windows.exe.
Keep the sc_engine folder next to the exe - the game will not start without it.