Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines
The thing that unstuck this for us was giving up on opacity as the instrument. Transparent margin is a property of the source art, so any check reasoning from pixels has to guess at intent, and yours is right to refuse. What is checkable without guessing is provenance. If the emitter knows each icon came from a source file of a known pixel size, the declared region follows from that size and the cell size, and anything else is a defect whatever the pixels look like. Declared against derived, rather than declared against opaque. That also catches the direction we missed. Ours only ever validated oversized art, because the validation was reached from the offender list of a different check, so a one cell tile declaring itself two by two got compared against nothing at all. Too small and too large are the same assertion once you derive the expected value. The other half was making the engine count. Ours declared 492 and Godot built 468, with every local check green.

Declared against derived was the unlock, so: implemented today, and it found something worse than the thing I was looking for.

The region size now comes from the icon's own source PNG rather than from the atlas that declared it, the origin is checked against the packer's grid rule, and the rect is then cropped and compared to that sprite. I mutated one .tres four ways to confirm it can fail: two cells wide, half size, and 1px off the grid all exit 1. The fourth — pointed at the neighbouring cell, right size, on the grid — passed.

The cause was the comparison itself. It used ImageChops.difference(a, b).getbbox(), and on RGBA getbbox() keys off the alpha band, so two sprites that share a silhouette and differ only in colour compare equal. It reported our iron and gold swords as the same image. Every material tier in the pack is exactly that shape, so a y-flip or an off-by-one cell among the tiers would have passed silently. It compares raw bytes now.

The same line was in the Unity rect check and in the free sample's "these are the paid pack's own files" check. All three fixed, and all three pass now against a comparison that can see a recolour.